diff --git a/.github/workflows/build_containers.yaml b/.github/workflows/build_containers.yaml new file mode 100644 index 00000000..689ddd17 --- /dev/null +++ b/.github/workflows/build_containers.yaml @@ -0,0 +1,28 @@ +name: Build Image +on: [push, workflow_dispatch] +jobs: + test: + name: Build image + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python: ['3.9'] + extra: [full, openstack, aws, gcp, azure] + steps: + - uses: actions/checkout@v2 + - run: docker build . -t cloudve/cloudbridge:${{matrix.python}}-${{matrix.extra}} --build-arg EXTRA=${{matrix.extra}} --build-arg PYTHON=${{matrix.python}} + - name: Login to docker hub + uses: actions-hub/docker/login@master + env: + DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Push to docker hub + uses: actions-hub/docker@master + with: + args: push cloudve/cloudbridge:${{matrix.python}}-${{matrix.extra}} + - run: docker build . -t cloudve/cloudbridge:dev-${{matrix.python}}-${{matrix.extra}} -f Dockerfile.dev --build-arg EXTRA=${{matrix.extra}} --build-arg PYTHON=${{matrix.python}} + - name: Push to docker hub + uses: actions-hub/docker@master + with: + args: push cloudve/cloudbridge:dev-${{matrix.python}}-${{matrix.extra}} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f4026960 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +ARG EXTRA=full +ARG PYTHON=3.9 + +FROM python:$PYTHON-slim +RUN pip install --no-cache-dir cloudbridge[$EXTRA] + +COPY scripts/ cloudbridge_scripts/ diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 00000000..973a6dc7 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,11 @@ +ARG EXTRA=full +ARG PYTHON=latest +FROM python:$PYTHON + +RUN apt-get update \ + && apt-get --force-yes install -y curl vim git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN pip install --no-cache-dir pep8 flake8 pyflakes pyyaml ipython cloudbridge[$EXTRA] + +COPY scripts/ cloudbridge_scripts/ diff --git a/scripts/bucket_upload.py b/scripts/bucket_upload.py new file mode 100644 index 00000000..02e1c5a5 --- /dev/null +++ b/scripts/bucket_upload.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +import sys +import argparse + +from cloudbridge.factory import CloudProviderFactory +from cloudbridge.factory import ProviderList +from cloudbridge.interfaces.exceptions import DuplicateResourceException + +def main(arguments): + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('filepath', help="File to upload", type=str) + parser.add_argument('destination', help="Destination in bucket", type=str) + parser.add_argument('-b', '--bucket', help="Name of destination bucket", type=str) + parser.add_argument('-p', '--provider', + choices=[ProviderList.__dict__[p] for p in ProviderList.__dict__.keys() if all(x not in p for x in ['_', 'MOCK'])], + help='Name of provider to use') + parser.add_argument('-r', '--retries', help="Maximum number of retries. Default = 5", type=int, default=5) + args = parser.parse_args(arguments) + provider = CloudProviderFactory().create_provider(args.provider, {}) + try: + bucket = provider.storage.buckets.create(args.bucket) + except DuplicateResourceException: + bucket = provider.storage.buckets.get(args.bucket) + ob = bucket.objects.create(args.destination) + uploaded = False + count = 0 + while not uploaded: + print(f'Trying for the {count}th time') + uploaded = ob.upload_from_file(args.filepath) + count += 1 + print(f'Uploaded: {args.filepath} to bucket {args.bucket} at location {args.destination}') + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) \ No newline at end of file