Просмотр исходного кода

Merge branch 'master' of https://github.com/CloudVE/cloudbridge

almahmoud 7 лет назад
Родитель
Сommit
5c43a12cb5

+ 1 - 1
cloudbridge/cloud/interfaces/resources.py

@@ -1101,7 +1101,7 @@ class FloatingIPContainer(PageableObjectMixin):
         """
         """
         Searches for a FloatingIP by a given list of attributes.
         Searches for a FloatingIP by a given list of attributes.
 
 
-        Supported attributes: label, public_ip
+        Supported attributes: name, public_ip
 
 
         Example:
         Example:
 
 

+ 5 - 3
cloudbridge/cloud/providers/gce/provider.py

@@ -348,9 +348,11 @@ class GCECloudProvider(BaseCloudProvider):
         try:
         try:
             return resource_url.get_resource()
             return resource_url.get_resource()
         except googleapiclient.errors.HttpError as http_error:
         except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning(
-                "googleapiclient.errors.HttpError: {0}".format(http_error))
-            return None
+            if http_error.resp.status in [404]:
+                # 404 = not found
+                return None
+            else:
+                raise
 
 
     def authenticate(self):
     def authenticate(self):
         try:
         try:

+ 58 - 85
cloudbridge/cloud/providers/gce/resources.py

@@ -305,9 +305,6 @@ class GCEFirewallsDelegate(object):
                             .execute())
                             .execute())
             self._provider.wait_for_operation(response)
             self._provider.wait_for_operation(response)
             # TODO: process the response and handle errors.
             # TODO: process the response and handle errors.
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return False
         finally:
         finally:
             self._update_list_response()
             self._update_list_response()
         return True
         return True
@@ -405,17 +402,13 @@ class GCEFirewallsDelegate(object):
         Delete a given firewall.
         Delete a given firewall.
         """
         """
         project_name = self._provider.project_name
         project_name = self._provider.project_name
-        try:
-            response = (self._provider
-                            .gce_compute
-                            .firewalls()
-                            .delete(project=project_name,
-                                    firewall=firewall['name'])
-                            .execute())
-            self._provider.wait_for_operation(response)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return False
+        response = (self._provider
+                        .gce_compute
+                        .firewalls()
+                        .delete(project=project_name,
+                                firewall=firewall['name'])
+                        .execute())
+        self._provider.wait_for_operation(response)
         # TODO: process the response and handle errors.
         # TODO: process the response and handle errors.
         return True
         return True
 
 
@@ -1535,45 +1528,37 @@ class GCEFloatingIPContainer(BaseFloatingIPContainer):
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         max_result = limit if limit is not None and limit < 500 else 500
         max_result = limit if limit is not None and limit < 500 else 500
-        try:
-            response = (self._provider
-                            .gce_compute
-                            .addresses()
-                            .list(project=self._provider.project_name,
-                                  region=self._provider.region_name,
-                                  maxResults=max_result,
-                                  pageToken=marker)
-                            .execute())
-            ips = [GCEFloatingIP(self._provider, self.gateway, ip)
-                   for ip in response.get('items', [])]
-            if len(ips) > max_result:
-                cb.log.warning('Expected at most %d results; got %d',
-                               max_result, len(ips))
-            return ServerPagedResultList('nextPageToken' in response,
-                                         response.get('nextPageToken'),
-                                         False, data=ips)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return None
+        response = (self._provider
+                        .gce_compute
+                        .addresses()
+                        .list(project=self._provider.project_name,
+                              region=self._provider.region_name,
+                              maxResults=max_result,
+                              pageToken=marker)
+                        .execute())
+        ips = [GCEFloatingIP(self._provider, self.gateway, ip)
+               for ip in response.get('items', [])]
+        if len(ips) > max_result:
+            cb.log.warning('Expected at most %d results; got %d',
+                           max_result, len(ips))
+        return ServerPagedResultList('nextPageToken' in response,
+                                     response.get('nextPageToken'),
+                                     False, data=ips)
 
 
     def create(self):
     def create(self):
         region_name = self._provider.region_name
         region_name = self._provider.region_name
         ip_name = 'ip-{0}'.format(uuid.uuid4())
         ip_name = 'ip-{0}'.format(uuid.uuid4())
-        try:
-            response = (self._provider
-                            .gce_compute
-                            .addresses()
-                            .insert(project=self._provider.project_name,
-                                    region=region_name,
-                                    body={'name': ip_name})
-                            .execute())
-            if 'error' in response:
-                return None
-            self._provider.wait_for_operation(response, region=region_name)
-            return self.get(ip_name)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
+        response = (self._provider
+                        .gce_compute
+                        .addresses()
+                        .insert(project=self._provider.project_name,
+                                region=region_name,
+                                body={'name': ip_name})
+                        .execute())
+        if 'error' in response:
             return None
             return None
+        self._provider.wait_for_operation(response, region=region_name)
+        return self.get(ip_name)
 
 
 
 
 class GCEFloatingIP(BaseFloatingIP):
 class GCEFloatingIP(BaseFloatingIP):
@@ -2381,29 +2366,23 @@ class GCSBucketContainer(BaseBucketContainer):
         List all objects within this bucket.
         List all objects within this bucket.
         """
         """
         max_result = limit if limit is not None and limit < 500 else 500
         max_result = limit if limit is not None and limit < 500 else 500
-        try:
-            response = (self._provider
-                            .gcs_storage
-                            .objects()
-                            .list(bucket=self.bucket.name,
-                                  prefix=prefix if prefix else '',
-                                  maxResults=max_result,
-                                  pageToken=marker)
-                            .execute())
-            if 'error' in response:
-                return ServerPagedResultList(False, None, False, data=[])
-            objects = []
-            for obj in response.get('items', []):
-                objects.append(GCSObject(self._provider, self.bucket, obj))
-            if len(objects) > max_result:
-                cb.log.warning('Expected at most %d results; got %d',
-                               max_result, len(objects))
-            return ServerPagedResultList('nextPageToken' in response,
-                                         response.get('nextPageToken'),
-                                         False, data=objects)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return ServerPagedResultList(False, None, False, data=[])
+        response = (self._provider
+                        .gcs_storage
+                        .objects()
+                        .list(bucket=self.bucket.name,
+                              prefix=prefix if prefix else '',
+                              maxResults=max_result,
+                              pageToken=marker)
+                        .execute())
+        objects = []
+        for obj in response.get('items', []):
+            objects.append(GCSObject(self._provider, self.bucket, obj))
+        if len(objects) > max_result:
+            cb.log.warning('Expected at most %d results; got %d',
+                           max_result, len(objects))
+        return ServerPagedResultList('nextPageToken' in response,
+                                     response.get('nextPageToken'),
+                                     False, data=objects)
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         obj_list = self.list()
         obj_list = self.list()
@@ -2463,20 +2442,14 @@ class GCSBucket(BaseBucket):
         return GCSObject(self._provider, self, response) if response else None
         return GCSObject(self._provider, self, response) if response else None
 
 
     def create_object_with_media_body(self, name, media_body):
     def create_object_with_media_body(self, name, media_body):
-        try:
-            response = (self._provider
-                            .gcs_storage
-                            .objects()
-                            .insert(bucket=self.name,
-                                    body={'name': name},
-                                    media_body=media_body)
-                            .execute())
-            if 'error' in response:
-                return None
-            return response
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return None
+        response = (self._provider
+                        .gcs_storage
+                        .objects()
+                        .insert(bucket=self.name,
+                                body={'name': name},
+                                media_body=media_body)
+                        .execute())
+        return response
 
 
 
 
 class GCELaunchConfig(BaseLaunchConfig):
 class GCELaunchConfig(BaseLaunchConfig):

+ 91 - 145
cloudbridge/cloud/providers/gce/services.py

@@ -360,15 +360,11 @@ class GCEImageService(BaseImageService):
         if self._public_images is not None:
         if self._public_images is not None:
             return
             return
         self._public_images = []
         self._public_images = []
-        try:
-            for project in GCEImageService._PUBLIC_IMAGE_PROJECTS:
-                for image in helpers.iter_all(
-                        self.provider.gce_compute.images(), project=project):
-                    self._public_images.append(
-                        GCEMachineImage(self.provider, image))
-        except googleapiclient.errors.HttpError as http_error:
-                cb.log.warning("googleapiclient.errors.HttpError: {0}".format(
-                    http_error))
+        for project in GCEImageService._PUBLIC_IMAGE_PROJECTS:
+            for image in helpers.iter_all(
+                    self.provider.gce_compute.images(), project=project):
+                self._public_images.append(
+                    GCEMachineImage(self.provider, image))
 
 
     def get(self, image_id):
     def get(self, image_id):
         """
         """
@@ -401,14 +397,10 @@ class GCEImageService(BaseImageService):
         images = []
         images = []
         if (self.provider.project_name not in
         if (self.provider.project_name not in
                 GCEImageService._PUBLIC_IMAGE_PROJECTS):
                 GCEImageService._PUBLIC_IMAGE_PROJECTS):
-            try:
-                for image in helpers.iter_all(
-                        self.provider.gce_compute.images(),
-                        project=self.provider.project_name):
-                    images.append(GCEMachineImage(self.provider, image))
-            except googleapiclient.errors.HttpError as http_error:
-                cb.log.warning(
-                    "googleapiclient.errors.HttpError: {0}".format(http_error))
+            for image in helpers.iter_all(
+                    self.provider.gce_compute.images(),
+                    project=self.provider.project_name):
+                images.append(GCEMachineImage(self.provider, image))
         images.extend(self._public_images)
         images.extend(self._public_images)
         return ClientPagedResultList(self.provider, images,
         return ClientPagedResultList(self.provider, images,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
@@ -529,19 +521,13 @@ class GCEInstanceService(BaseInstanceService):
             if len(vm_firewall_names) > 0:
             if len(vm_firewall_names) > 0:
                 config['tags'] = {}
                 config['tags'] = {}
                 config['tags']['items'] = vm_firewall_names
                 config['tags']['items'] = vm_firewall_names
-        try:
-            operation = (self.provider
-                             .gce_compute.instances()
-                             .insert(project=self.provider.project_name,
-                                     zone=zone_name,
-                                     body=config)
-                             .execute())
-        except googleapiclient.errors.HttpError as http_error:
-            # If the operation request fails, the API will raise
-            # googleapiclient.errors.HttpError.
-            cb.log.warning(
-                "googleapiclient.errors.HttpError: {0}".format(http_error))
-            return None
+
+        operation = (self.provider
+                         .gce_compute.instances()
+                         .insert(project=self.provider.project_name,
+                                 zone=zone_name,
+                                 body=config)
+                         .execute())
         instance_id = operation.get('targetLink')
         instance_id = operation.get('targetLink')
         self.provider.wait_for_operation(operation, zone=zone_name)
         self.provider.wait_for_operation(operation, zone=zone_name)
         cb_inst = self.get(instance_id)
         cb_inst = self.get(instance_id)
@@ -678,17 +664,14 @@ class GCENetworkService(BaseNetworkService):
     def list(self, limit=None, marker=None, filter=None):
     def list(self, limit=None, marker=None, filter=None):
         # TODO: Decide whether we keep filter in 'list'
         # TODO: Decide whether we keep filter in 'list'
         networks = []
         networks = []
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .networks()
-                            .list(project=self.provider.project_name,
-                                  filter=filter)
-                            .execute())
-            for network in response.get('items', []):
-                networks.append(GCENetwork(self.provider, network))
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
+        response = (self.provider
+                        .gce_compute
+                        .networks()
+                        .list(project=self.provider.project_name,
+                              filter=filter)
+                        .execute())
+        for network in response.get('items', []):
+            networks.append(GCENetwork(self.provider, network))
         return ClientPagedResultList(self.provider, networks,
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
@@ -716,20 +699,14 @@ class GCENetworkService(BaseNetworkService):
             body['IPv4Range'] = cidr_block
             body['IPv4Range'] = cidr_block
         else:
         else:
             body['autoCreateSubnetworks'] = create_subnetworks
             body['autoCreateSubnetworks'] = create_subnetworks
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .networks()
-                            .insert(project=self.provider.project_name,
-                                    body=body)
-                            .execute())
-            if 'error' in response:
-                return None
-            self.provider.wait_for_operation(response)
-            return self.get(name)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return None
+        response = (self.provider
+                        .gce_compute
+                        .networks()
+                        .insert(project=self.provider.project_name,
+                                body=body)
+                        .execute())
+        self.provider.wait_for_operation(response)
+        return self.get(name)
 
 
     def create(self, label, cidr_block):
     def create(self, label, cidr_block):
         """
         """
@@ -752,24 +729,18 @@ class GCENetworkService(BaseNetworkService):
             name = network.split('/')[-1]
             name = network.split('/')[-1]
         else:
         else:
             name = network
             name = network
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .networks()
-                            .delete(project=self.provider.project_name,
-                                    network=name)
-                            .execute())
-            if 'error' in response:
-                return False
-            self.provider.wait_for_operation(response)
-            # Remove label
-            tag_name = "_".join(["network", name, "label"])
-            if not helpers.remove_metadata_item(self.provider, tag_name):
-                log.warning('No label was found associated with this network '
-                            '"{}" when deleted.'.format(network.name))
-        except googleapiclient.errors.HttpError as http_error:
-            log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return False
+        response = (self.provider
+                        .gce_compute
+                        .networks()
+                        .delete(project=self.provider.project_name,
+                                network=name)
+                        .execute())
+        self.provider.wait_for_operation(response)
+        # Remove label
+        tag_name = "_".join(["network", name, "label"])
+        if not helpers.remove_metadata_item(self.provider, tag_name):
+            log.warning('No label was found associated with this network '
+                        '"{}" when deleted.'.format(network.name))
         return True
         return True
 
 
 
 
@@ -818,23 +789,17 @@ class GCERouterService(BaseRouterService):
             network = self.provider.networking.networks.get(network)
             network = self.provider.networking.networks.get(network)
         network_url = network.resource_url
         network_url = network.resource_url
         region_name = self.provider.region_name
         region_name = self.provider.region_name
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .routers()
-                            .insert(project=self.provider.project_name,
-                                    region=region_name,
-                                    body={'name': name,
-                                          'network': network_url,
-                                          'description': label})
-                            .execute())
-            if 'error' in response:
-                return None
-            self.provider.wait_for_operation(response, region=region_name)
-            return self._get_in_region(name, region_name)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return None
+        response = (self.provider
+                        .gce_compute
+                        .routers()
+                        .insert(project=self.provider.project_name,
+                                region=region_name,
+                                body={'name': name,
+                                      'network': network_url,
+                                      'description': label})
+                        .execute())
+        self.provider.wait_for_operation(response, region=region_name)
+        return self._get_in_region(name, region_name)
 
 
     def delete(self, router):
     def delete(self, router):
         region_name = self.provider.region_name
         region_name = self.provider.region_name
@@ -927,25 +892,17 @@ class GCESubnetService(BaseSubnetService):
                 'network': network.resource_url,
                 'network': network.resource_url,
                 'region': region_name
                 'region': region_name
                 }
                 }
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .subnetworks()
-                            .insert(project=self.provider.project_name,
-                                    region=region_name,
-                                    body=body)
-                            .execute())
-            if 'error' in response:
-                cb.log.warning('Error while creating a subnet: %s',
-                               response['error'])
-                return None
-            self.provider.wait_for_operation(response, region=region_name)
-            cb_subnet = self.get(name)
-            cb_subnet.label = label
-            return cb_subnet
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return None
+        response = (self.provider
+                        .gce_compute
+                        .subnetworks()
+                        .insert(project=self.provider.project_name,
+                                region=region_name,
+                                body=body)
+                        .execute())
+        self.provider.wait_for_operation(response, region=region_name)
+        cb_subnet = self.get(name)
+        cb_subnet.label = label
+        return cb_subnet
 
 
     def get_or_create_default(self, zone=None):
     def get_or_create_default(self, zone=None):
         """
         """
@@ -965,18 +922,15 @@ class GCESubnetService(BaseSubnetService):
         return None
         return None
 
 
     def delete(self, subnet):
     def delete(self, subnet):
-        try:
-            response = (self.provider
-                            .gce_compute
-                            .subnetworks()
-                            .delete(project=self.provider.project_name,
-                                    region=subnet.region_name,
-                                    subnetwork=subnet.name)
-                            .execute())
-            self._provider.wait_for_operation(
-                response, region=subnet.region_name)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
+        response = (self.provider
+                        .gce_compute
+                        .subnetworks()
+                        .delete(project=self.provider.project_name,
+                                region=subnet.region_name,
+                                subnetwork=subnet.name)
+                        .execute())
+        self._provider.wait_for_operation(
+            response, region=subnet.region_name)
 
 
     def _zone_to_region_name(self, zone):
     def _zone_to_region_name(self, zone):
         if zone:
         if zone:
@@ -1230,28 +1184,22 @@ class GCSBucketService(BaseBucketService):
         List all containers.
         List all containers.
         """
         """
         max_result = limit if limit is not None and limit < 500 else 500
         max_result = limit if limit is not None and limit < 500 else 500
-        try:
-            response = (self.provider
-                            .gcs_storage
-                            .buckets()
-                            .list(project=self.provider.project_name,
-                                  maxResults=max_result,
-                                  pageToken=marker)
-                            .execute())
-            if 'error' in response:
-                return ServerPagedResultList(False, None, False, data=[])
-            buckets = []
-            for bucket in response.get('items', []):
-                buckets.append(GCSBucket(self.provider, bucket))
-            if len(buckets) > max_result:
-                cb.log.warning('Expected at most %d results; got %d',
-                               max_result, len(buckets))
-            return ServerPagedResultList('nextPageToken' in response,
-                                         response.get('nextPageToken'),
-                                         False, data=buckets)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return ServerPagedResultList(False, None, False, data=[])
+        response = (self.provider
+                        .gcs_storage
+                        .buckets()
+                        .list(project=self.provider.project_name,
+                              maxResults=max_result,
+                              pageToken=marker)
+                        .execute())
+        buckets = []
+        for bucket in response.get('items', []):
+            buckets.append(GCSBucket(self.provider, bucket))
+        if len(buckets) > max_result:
+            cb.log.warning('Expected at most %d results; got %d',
+                           max_result, len(buckets))
+        return ServerPagedResultList('nextPageToken' in response,
+                                     response.get('nextPageToken'),
+                                     False, data=buckets)
 
 
     def create(self, name, location=None):
     def create(self, name, location=None):
         """
         """
@@ -1268,8 +1216,6 @@ class GCSBucketService(BaseBucketService):
                             .insert(project=self.provider.project_name,
                             .insert(project=self.provider.project_name,
                                     body=body)
                                     body=body)
                             .execute())
                             .execute())
-            if 'error' in response:
-                return None
             # GCS has a rate limit of 1 operation per 2 seconds for bucket
             # GCS has a rate limit of 1 operation per 2 seconds for bucket
             # creation/deletion: https://cloud.google.com/storage/quotas.
             # creation/deletion: https://cloud.google.com/storage/quotas.
             # Throttle here to avoid future failures.
             # Throttle here to avoid future failures.

+ 6 - 6
docs/topics/launch.rst

@@ -49,7 +49,7 @@ Once we have all the desired pieces, we'll use them to launch an instance:
 .. code-block:: python
 .. code-block:: python
 
 
     inst = provider.compute.instances.create(
     inst = provider.compute.instances.create(
-        name='cloudbridge-vpc', image=img, vm_type=vm_type,
+        label='cloudbridge-vpc', image=img, vm_type=vm_type,
         subnet=subnet, zone=zone, key_pair=kp, vm_firewalls=[fw])
         subnet=subnet, zone=zone, key_pair=kp, vm_firewalls=[fw])
 
 
 Private networking
 Private networking
@@ -63,16 +63,16 @@ that subnet.
 .. code-block:: python
 .. code-block:: python
 
 
     net = self.provider.networking.networks.create(
     net = self.provider.networking.networks.create(
-        name='my-network', cidr_block='10.0.0.0/16')
-    sn = net.create_subnet(name='my-subnet', cidr_block='10.0.0.0/28')
+        label='my-network', cidr_block='10.0.0.0/16')
+    sn = net.create_subnet(label='my-subnet', cidr_block='10.0.0.0/28')
     # make sure subnet has internet access
     # make sure subnet has internet access
-    router = self.provider.networking.routers.create(network=net, name='my-router')
+    router = self.provider.networking.routers.create(label='my-router', network=net)
     router.attach_subnet(sn)
     router.attach_subnet(sn)
     gateway = net.gateways.get_or_create_inet_gateway()
     gateway = net.gateways.get_or_create_inet_gateway()
     router.attach_gateway(gateway)
     router.attach_gateway(gateway)
 
 
     inst = provider.compute.instances.create(
     inst = provider.compute.instances.create(
-        name='cloudbridge-vpc', image=img, vm_type=vm_type,
+        label='cloudbridge-vpc', image=img, vm_type=vm_type,
         subnet=sn, zone=zone, key_pair=kp, vm_firewalls=[fw])
         subnet=sn, zone=zone, key_pair=kp, vm_firewalls=[fw])
 
 
 For more information on how to create and setup a private network, take a look
 For more information on how to create and setup a private network, take a look
@@ -94,7 +94,7 @@ refer to :class:`.LaunchConfig`.
     lc = provider.compute.instances.create_launch_config()
     lc = provider.compute.instances.create_launch_config()
     lc.add_volume_device(source=img, size=11, is_root=True)
     lc.add_volume_device(source=img, size=11, is_root=True)
     inst = provider.compute.instances.create(
     inst = provider.compute.instances.create(
-        name='cloudbridge-bdm', image=img,  vm_type=vm_type,
+        label='cloudbridge-bdm', image=img,  vm_type=vm_type,
         launch_config=lc, key_pair=kp, vm_firewalls=[fw],
         launch_config=lc, key_pair=kp, vm_firewalls=[fw],
         subnet=subnet, zone=zone)
         subnet=subnet, zone=zone)
 
 

+ 22 - 23
docs/topics/networking.rst

@@ -8,11 +8,11 @@ All CloudBridge deployed VMs must be deployed into a particular subnet.
 If you do not explicitly specify a private network to use when launching an
 If you do not explicitly specify a private network to use when launching an
 instance, CloudBridge will attempt to use a default one. A 'default' network is
 instance, CloudBridge will attempt to use a default one. A 'default' network is
 one tagged as such by the native API. If such tag or functionality does not
 one tagged as such by the native API. If such tag or functionality does not
-exist, CloudBridge will look for one with a predefined name (by default, called
-'CloudBridgeNet', which can be overridden with environment variable
-``CB_DEFAULT_NETWORK_NAME``).
+exist, CloudBridge will look for one with a predefined label (by default,
+called 'cloudbridge-net', which can be overridden with environment variable
+``CB_DEFAULT_NETWORK_LABEL``).
 
 
-Once a VM is deployed, cloudbridge's networking capabilities must address
+Once a VM is deployed, CloudBridge's networking capabilities must address
 several common scenarios.
 several common scenarios.
 
 
 1. Allowing internet access from a launched VM
 1. Allowing internet access from a launched VM
@@ -25,7 +25,7 @@ several common scenarios.
 
 
    Alternatively, the user may want to allow the instance to be contactable
    Alternatively, the user may want to allow the instance to be contactable
    from the internet. In a more complex scenario, a user may want to deploy
    from the internet. In a more complex scenario, a user may want to deploy
-   VMS into several subnets, and deploy a gateway, jump host or bastion host
+   VMs into several subnets, and deploy a gateway, jump host, or bastion host
    to access other VMs which are not directly connected to the internet. In
    to access other VMs which are not directly connected to the internet. In
    the latter scenario, the gateway/jump host/bastion host will need to be
    the latter scenario, the gateway/jump host/bastion host will need to be
    contactable over the internet.
    contactable over the internet.
@@ -37,19 +37,18 @@ several common scenarios.
    subnets depending on their tier. For example, consider the following
    subnets depending on their tier. For example, consider the following
    scenario:
    scenario:
 
 
-   - Tier 1/Subnet 1 - Web Server Needs to be externally accessible over the
+   - Tier 1/Subnet 1 - Web Server needs to be externally accessible over the
      internet. However, in this particular scenario, the web server itself does
      internet. However, in this particular scenario, the web server itself does
      not need access to the internet.
      not need access to the internet.
 
 
-   - Tier 2/Subnet 2 - Application Server The Application server must only be
-     able to communicate with the database server in Subnet 3, and receive
-     communication from the Web Server in Subnet 1. However, we assume a
-     special case here where the application server needs to access the
-     internet.
+   - Tier 2/Subnet 2 - Application Server must only be able to communicate with
+     the database server in Subnet 3, and receive communication from the Web
+     Server in Subnet 1. However, we assume a special case here where the
+     application server needs to access the internet.
 
 
-   - Tier 3/Subnet 3 - Database Server The database server must only be able to
-     receive incoming traffic from Tier 2, but must not be able to make
-     outgoing traffic outside of its subnet.
+   - Tier 3/Subnet 3 - Database Server must only be able to receive incoming
+     traffic from Tier 2, but must not be able to make outgoing traffic outside
+     of its subnet.
 
 
    At present, CloudBridge does not provide support for this scenario,
    At present, CloudBridge does not provide support for this scenario,
    primarily because OpenStack's FwaaS (Firewall-as-a-Service) is not widely
    primarily because OpenStack's FwaaS (Firewall-as-a-Service) is not widely
@@ -58,10 +57,10 @@ several common scenarios.
 1. Allowing internet access from a launched VM
 1. Allowing internet access from a launched VM
 ----------------------------------------------
 ----------------------------------------------
 Creating a private network is a simple, one-line command but appropriately
 Creating a private network is a simple, one-line command but appropriately
-connecting it so that it has uniform Internet access across all providers
+connecting it so that it has uniform internet access across all providers
 is a multi-step process:
 is a multi-step process:
 (1) create a network; (2) create a subnet within this network; (3) create a
 (1) create a network; (2) create a subnet within this network; (3) create a
-router; (4) attach the router to the subnet and (5) attach the router to the
+router; (4) attach the router to the subnet; and (5) attach the router to the
 internet gateway.
 internet gateway.
 
 
 When creating a network, we need to set an address pool. Any subsequent
 When creating a network, we need to set an address pool. Any subsequent
@@ -74,9 +73,9 @@ subnet (``/28``).
 .. code-block:: python
 .. code-block:: python
 
 
     net = provider.networking.networks.create(
     net = provider.networking.networks.create(
-        name='my-network', cidr_block='10.0.0.0/16')
-    sn = net.create_subnet(name='my-subnet', cidr_block='10.0.0.0/28', zone=zone)
-    router = provider.networking.routers.create(network=net, name='my-router')
+        label='my-network', cidr_block='10.0.0.0/16')
+    sn = net.create_subnet(label='my-subnet', cidr_block='10.0.0.0/28', zone=zone)
+    router = provider.networking.routers.create(label='my-router', network=net)
     router.attach_subnet(sn)
     router.attach_subnet(sn)
     gateway = net.gateways.get_or_create_inet_gateway()
     gateway = net.gateways.get_or_create_inet_gateway()
     router.attach_gateway(gateway)
     router.attach_gateway(gateway)
@@ -89,12 +88,12 @@ The additional step that's required here is to assign a floating IP to the VM:
 .. code-block:: python
 .. code-block:: python
 
 
     net = provider.networking.networks.create(
     net = provider.networking.networks.create(
-        name='my-network', cidr_block='10.0.0.0/16')
-    sn = net.create_subnet(name='my-subnet', cidr_block='10.0.0.0/28', zone=zone)
+        label='my-network', cidr_block='10.0.0.0/16')
+    sn = net.create_subnet(label='my-subnet', cidr_block='10.0.0.0/28', zone=zone)
 
 
-    vm = provider.compute.instances.create('my-inst', subnet=sn, zone=zone, ...)
+    vm = provider.compute.instances.create(label='my-inst', subnet=sn, zone=zone, ...)
 
 
-    router = provider.networking.routers.create(network=net, name='my-router')
+    router = provider.networking.routers.create(label='my-router', network=net)
     router.attach_subnet(sn)
     router.attach_subnet(sn)
     gateway = net.gateways.get_or_create_inet_gateway()
     gateway = net.gateways.get_or_create_inet_gateway()
     router.attach_gateway(gateway)
     router.attach_gateway(gateway)

+ 3 - 18
test/test_block_store_service.py

@@ -21,10 +21,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.volumes'])
     @helpers.skipIfNoService(['storage.volumes'])
     def test_crud_volume(self):
     def test_crud_volume(self):
-        """
-        Create a new volume, check whether the expected values are set,
-        and delete it
-        """
         def create_vol(label):
         def create_vol(label):
             return self.provider.storage.volumes.create(
             return self.provider.storage.volumes.create(
                 label, 1,
                 label, 1,
@@ -47,9 +43,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.volumes'])
     @helpers.skipIfNoService(['storage.volumes'])
     def test_attach_detach_volume(self):
     def test_attach_detach_volume(self):
-        """
-        Create a new volume, and attempt to attach it to an instance
-        """
         label = "cb-attachvol-{0}".format(helpers.get_uuid())
         label = "cb-attachvol-{0}".format(helpers.get_uuid())
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -76,9 +69,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.volumes'])
     @helpers.skipIfNoService(['storage.volumes'])
     def test_volume_properties(self):
     def test_volume_properties(self):
-        """
-        Test volume properties
-        """
         label = "cb-volprops-{0}".format(helpers.get_uuid())
         label = "cb-volprops-{0}".format(helpers.get_uuid())
         vol_desc = 'newvoldesc1'
         vol_desc = 'newvoldesc1'
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
@@ -137,11 +127,9 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.snapshots'])
     @helpers.skipIfNoService(['storage.snapshots'])
     def test_crud_snapshot(self):
     def test_crud_snapshot(self):
-        """
-        Create a new volume, create a snapshot of the volume, and check
-        whether list_snapshots properly detects the new snapshot.
-        Delete everything afterwards.
-        """
+        # Create a new volume, create a snapshot of the volume, and check
+        # whether list_snapshots properly detects the new snapshot.
+        # Delete everything afterwards.
         label = "cb-crudsnap-{0}".format(helpers.get_uuid())
         label = "cb-crudsnap-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
         test_vol = self.provider.storage.volumes.create(
             label, 1,
             label, 1,
@@ -181,9 +169,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.snapshots'])
     @helpers.skipIfNoService(['storage.snapshots'])
     def test_snapshot_properties(self):
     def test_snapshot_properties(self):
-        """
-        Test snapshot properties
-        """
         label = "cb-snapprop-{0}".format(helpers.get_uuid())
         label = "cb-snapprop-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
         test_vol = self.provider.storage.volumes.create(
             label, 1,
             label, 1,

+ 17 - 35
test/test_cloud_factory.py

@@ -16,28 +16,22 @@ class CloudFactoryTestCase(unittest.TestCase):
     _multiprocess_can_split_ = True
     _multiprocess_can_split_ = True
 
 
     def test_create_provider_valid(self):
     def test_create_provider_valid(self):
-        """
-        Creating a provider with a known name should return
-        a valid implementation
-        """
+        # Creating a provider with a known name should return
+        # a valid implementation
         self.assertIsInstance(CloudProviderFactory().create_provider(
         self.assertIsInstance(CloudProviderFactory().create_provider(
             factory.ProviderList.AWS, {}),
             factory.ProviderList.AWS, {}),
             interfaces.CloudProvider,
             interfaces.CloudProvider,
             "create_provider did not return a valid VM type")
             "create_provider did not return a valid VM type")
 
 
     def test_create_provider_invalid(self):
     def test_create_provider_invalid(self):
-        """
-        Creating a provider with an invalid name should raise a
-        NotImplementedError
-        """
+        # Creating a provider with an invalid name should raise a
+        # NotImplementedError
         with self.assertRaises(NotImplementedError):
         with self.assertRaises(NotImplementedError):
             CloudProviderFactory().create_provider("ec23", {})
             CloudProviderFactory().create_provider("ec23", {})
 
 
     def test_find_provider_mock_valid(self):
     def test_find_provider_mock_valid(self):
-        """
-        Searching for a provider with a known mock driver should return
-        an implementation implementing helpers.TestMockHelperMixin
-        """
+        # Searching for a provider with a known mock driver should return
+        # an implementation implementing helpers.TestMockHelperMixin
         mock = CloudProviderFactory().get_provider_class(
         mock = CloudProviderFactory().get_provider_class(
             factory.ProviderList.AWS, get_mock=True)
             factory.ProviderList.AWS, get_mock=True)
         self.assertTrue(
         self.assertTrue(
@@ -55,24 +49,18 @@ class CloudFactoryTestCase(unittest.TestCase):
                 cls)
                 cls)
 
 
     def test_get_provider_class_valid(self):
     def test_get_provider_class_valid(self):
-        """
-        Searching for a provider class with a known name should return a valid
-        class
-        """
+        # Searching for a provider class with a known name should return a
+        # valid class
         self.assertEqual(CloudProviderFactory().get_provider_class(
         self.assertEqual(CloudProviderFactory().get_provider_class(
             factory.ProviderList.AWS), AWSCloudProvider)
             factory.ProviderList.AWS), AWSCloudProvider)
 
 
     def test_get_provider_class_invalid(self):
     def test_get_provider_class_invalid(self):
-        """
-        Searching for a provider class with an invalid name should
-        return None
-        """
+        # Searching for a provider class with an invalid name should
+        # return None
         self.assertIsNone(CloudProviderFactory().get_provider_class("aws1"))
         self.assertIsNone(CloudProviderFactory().get_provider_class("aws1"))
 
 
     def test_register_provider_class_invalid(self):
     def test_register_provider_class_invalid(self):
-        """
-        Attempting to register an invalid test class should be ignored
-        """
+        # Attempting to register an invalid test class should be ignored
         class DummyClass(object):
         class DummyClass(object):
             PROVIDER_ID = 'aws'
             PROVIDER_ID = 'aws'
 
 
@@ -82,10 +70,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=False))
                         factory.get_all_provider_classes(get_mock=False))
 
 
     def test_register_provider_class_double(self):
     def test_register_provider_class_double(self):
-        """
-        Attempting to register the same class twice should register second
-        instance
-        """
+        # Attempting to register the same class twice should register second
+        # instance
         class DummyClass(CloudProvider):
         class DummyClass(CloudProvider):
             PROVIDER_ID = 'aws'
             PROVIDER_ID = 'aws'
 
 
@@ -98,10 +84,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=False))
                         factory.get_all_provider_classes(get_mock=False))
 
 
     def test_register_mock_provider_class_double(self):
     def test_register_mock_provider_class_double(self):
-        """
-        Attempting to register the same mock provider twice should register
-        only the second instance
-        """
+        # Attempting to register the same mock provider twice should register
+        # only the second instance
         class DummyClass(CloudProvider, TestMockHelperMixin):
         class DummyClass(CloudProvider, TestMockHelperMixin):
             PROVIDER_ID = 'aws'
             PROVIDER_ID = 'aws'
 
 
@@ -114,10 +98,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=True))
                         factory.get_all_provider_classes(get_mock=True))
 
 
     def test_register_provider_class_without_id(self):
     def test_register_provider_class_without_id(self):
-        """
-        Attempting to register a class without a PROVIDER_ID attribute
-        should be ignored.
-        """
+        # Attempting to register a class without a PROVIDER_ID attribute
+        # should be ignored.
         class DummyClass(CloudProvider):
         class DummyClass(CloudProvider):
             pass
             pass
 
 

+ 1 - 3
test/test_cloud_helpers.py

@@ -80,9 +80,7 @@ class CloudHelpersTestCase(ProviderTestBase):
             results.data
             results.data
 
 
     def test_type_validation(self):
     def test_type_validation(self):
-        """
-        Make sure internal type checking implementation properly sets types.
-        """
+        # Make sure internal type checking implementation properly sets types.
         self.provider.config['text_type_check'] = 'test-text'
         self.provider.config['text_type_check'] = 'test-text'
         config_value = self.provider._get_config_value('text_type_check', None)
         config_value = self.provider._get_config_value('text_type_check', None)
         self.assertIsInstance(config_value, six.string_types)
         self.assertIsInstance(config_value, six.string_types)

+ 0 - 5
test/test_image_service.py

@@ -14,11 +14,6 @@ class CloudImageServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.images', 'networking.networks',
     @helpers.skipIfNoService(['compute.images', 'networking.networks',
                               'compute.instances'])
                               'compute.instances'])
     def test_create_and_list_image(self):
     def test_create_and_list_image(self):
-        """
-        Create a new image and check whether that image can be listed.
-        This covers waiting till the image is ready, checking that the image
-        label is the expected one and whether list_images is functional.
-        """
         instance_label = "cb-crudimage-{0}".format(helpers.get_uuid())
         instance_label = "cb-crudimage-{0}".format(helpers.get_uuid())
         img_inst_label = "cb-crudimage-{0}".format(helpers.get_uuid())
         img_inst_label = "cb-crudimage-{0}".format(helpers.get_uuid())
 
 

+ 5 - 13
test/test_interface.py

@@ -14,32 +14,24 @@ class CloudInterfaceTestCase(ProviderTestBase):
     _multiprocess_can_split_ = True
     _multiprocess_can_split_ = True
 
 
     def test_name_property(self):
     def test_name_property(self):
-        """
-        Name should always return a value and should not raise an exception
-        """
+        # Name should always return a value and should not raise an exception
         assert self.provider.name
         assert self.provider.name
 
 
     def test_has_service_valid_service_type(self):
     def test_has_service_valid_service_type(self):
-        """
-        has_service with a valid service type should return
-        a boolean and raise no exceptions
-        """
+        # has_service with a valid service type should return
+        # a boolean and raise no exceptions
         for key, value in interfaces.CloudServiceType.__dict__.items():
         for key, value in interfaces.CloudServiceType.__dict__.items():
             if not key.startswith("__"):
             if not key.startswith("__"):
                 self.provider.has_service(value)
                 self.provider.has_service(value)
 
 
     def test_has_service_invalid_service_type(self):
     def test_has_service_invalid_service_type(self):
-        """
-        has_service with an invalid service type should return False
-        """
+        # has_service with an invalid service type should return False
         self.assertFalse(
         self.assertFalse(
             self.provider.has_service("NON_EXISTENT_SERVICE"),
             self.provider.has_service("NON_EXISTENT_SERVICE"),
             "has_service should not return True for a non-existent service")
             "has_service should not return True for a non-existent service")
 
 
     def test_library_version(self):
     def test_library_version(self):
-        """
-        Check that the library version can be retrieved.
-        """
+        # Check that the library version can be retrieved.
         self.assertIsNotNone(cloudbridge.get_version(),
         self.assertIsNotNone(cloudbridge.get_version(),
                              "Did not get library version.")
                              "Did not get library version.")
 
 

+ 1 - 3
test/test_object_life_cycle.py

@@ -11,9 +11,7 @@ class CloudObjectLifeCycleTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.volumes'])
     @helpers.skipIfNoService(['storage.volumes'])
     def test_object_life_cycle(self):
     def test_object_life_cycle(self):
-        """
-        Test object life cycle methods by using a volume.
-        """
+        # Test object life cycle methods by using a volume.
         label = "cb-objlifecycle-{0}".format(helpers.get_uuid())
         label = "cb-objlifecycle-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
         test_vol = self.provider.storage.volumes.create(
             label, 1,
             label, 1,

+ 6 - 14
test/test_object_store_service.py

@@ -23,10 +23,6 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.buckets'])
     @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket(self):
     def test_crud_bucket(self):
-        """
-        Create a new bucket, check whether the expected values are set,
-        and delete it.
-        """
 
 
         def create_bucket(name):
         def create_bucket(name):
             return self.provider.storage.buckets.create(name)
             return self.provider.storage.buckets.create(name)
@@ -71,11 +67,9 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.buckets'])
     @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket_object_properties(self):
     def test_crud_bucket_object_properties(self):
-        """
-        Create a new bucket, upload some contents into the bucket, and
-        check whether list properly detects the new content.
-        Delete everything afterwards.
-        """
+        # Create a new bucket, upload some contents into the bucket, and
+        # check whether list properly detects the new content.
+        # Delete everything afterwards.
         name = "cbtestbucketobjs-{0}".format(helpers.get_uuid())
         name = "cbtestbucketobjs-{0}".format(helpers.get_uuid())
         test_bucket = self.provider.storage.buckets.create(name)
         test_bucket = self.provider.storage.buckets.create(name)
 
 
@@ -198,11 +192,9 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
     @skip("Skip unless you want to test swift objects bigger than 5 Gig")
     @skip("Skip unless you want to test swift objects bigger than 5 Gig")
     @helpers.skipIfNoService(['storage.buckets'])
     @helpers.skipIfNoService(['storage.buckets'])
     def test_upload_download_bucket_content_with_large_file(self):
     def test_upload_download_bucket_content_with_large_file(self):
-        """
-        Creates a 6 Gig file in the temp directory, then uploads it to
-        Swift. Once uploaded, then downloads to a new file in the temp
-        directory and compares the two files to see if they match.
-        """
+        # Creates a 6 Gig file in the temp directory, then uploads it to
+        # Swift. Once uploaded, then downloads to a new file in the temp
+        # directory and compares the two files to see if they match.
         temp_dir = tempfile.gettempdir()
         temp_dir = tempfile.gettempdir()
         file_name = '6GigTest.tmp'
         file_name = '6GigTest.tmp'
         six_gig_file = os.path.join(temp_dir, file_name)
         six_gig_file = os.path.join(temp_dir, file_name)

+ 0 - 13
test/test_region_service.py

@@ -13,10 +13,6 @@ class CloudRegionServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['compute.regions'])
     @helpers.skipIfNoService(['compute.regions'])
     def test_get_and_list_regions(self):
     def test_get_and_list_regions(self):
-        """
-        Test whether the region listing methods work,
-        and whether zones are returned appropriately.
-        """
         regions = list(self.provider.compute.regions)
         regions = list(self.provider.compute.regions)
         sit.check_standard_behaviour(
         sit.check_standard_behaviour(
             self, self.provider.compute.regions, regions[-1])
             self, self.provider.compute.regions, regions[-1])
@@ -32,27 +28,18 @@ class CloudRegionServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['compute.regions'])
     @helpers.skipIfNoService(['compute.regions'])
     def test_regions_unique(self):
     def test_regions_unique(self):
-        """
-        Regions should not return duplicate items
-        """
         regions = self.provider.compute.regions.list()
         regions = self.provider.compute.regions.list()
         unique_regions = set([region.id for region in regions])
         unique_regions = set([region.id for region in regions])
         self.assertTrue(len(regions) == len(list(unique_regions)))
         self.assertTrue(len(regions) == len(list(unique_regions)))
 
 
     @helpers.skipIfNoService(['compute.regions'])
     @helpers.skipIfNoService(['compute.regions'])
     def test_current_region(self):
     def test_current_region(self):
-        """
-        RegionService.current should return a valid region
-        """
         current_region = self.provider.compute.regions.current
         current_region = self.provider.compute.regions.current
         self.assertIsInstance(current_region, Region)
         self.assertIsInstance(current_region, Region)
         self.assertTrue(current_region in self.provider.compute.regions)
         self.assertTrue(current_region in self.provider.compute.regions)
 
 
     @helpers.skipIfNoService(['compute.regions'])
     @helpers.skipIfNoService(['compute.regions'])
     def test_zones(self):
     def test_zones(self):
-        """
-        Test whether regions return the correct zone information
-        """
         zone_find_count = 0
         zone_find_count = 0
         test_zone = helpers.get_provider_test_data(self.provider, "placement")
         test_zone = helpers.get_provider_test_data(self.provider, "placement")
         for region in self.provider.compute.regions:
         for region in self.provider.compute.regions:

+ 3 - 5
test/test_vm_types_service.py

@@ -63,11 +63,9 @@ class CloudVMTypeServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['compute.vm_types'])
     @helpers.skipIfNoService(['compute.vm_types'])
     def test_vm_types_standard(self):
     def test_vm_types_standard(self):
-        """
-        Searching for an instance by name should return an
-        VMType object and searching for a non-existent
-        object should return an empty iterator
-        """
+        # Searching for an instance by name should return an
+        # VMType object and searching for a non-existent
+        # object should return an empty iterator
         vm_type_name = helpers.get_provider_test_data(
         vm_type_name = helpers.get_provider_test_data(
             self.provider,
             self.provider,
             "vm_type")
             "vm_type")