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

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.
 
-        Supported attributes: label, public_ip
+        Supported attributes: name, public_ip
 
         Example:
 

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

@@ -348,9 +348,11 @@ class GCECloudProvider(BaseCloudProvider):
         try:
             return resource_url.get_resource()
         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):
         try:

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

@@ -305,9 +305,6 @@ class GCEFirewallsDelegate(object):
                             .execute())
             self._provider.wait_for_operation(response)
             # 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:
             self._update_list_response()
         return True
@@ -405,17 +402,13 @@ class GCEFirewallsDelegate(object):
         Delete a given firewall.
         """
         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.
         return True
 
@@ -1535,45 +1528,37 @@ class GCEFloatingIPContainer(BaseFloatingIPContainer):
 
     def list(self, limit=None, marker=None):
         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):
         region_name = self._provider.region_name
         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
+        self._provider.wait_for_operation(response, region=region_name)
+        return self.get(ip_name)
 
 
 class GCEFloatingIP(BaseFloatingIP):
@@ -2381,29 +2366,23 @@ class GCSBucketContainer(BaseBucketContainer):
         List all objects within this bucket.
         """
         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):
         obj_list = self.list()
@@ -2463,20 +2442,14 @@ class GCSBucket(BaseBucket):
         return GCSObject(self._provider, self, response) if response else None
 
     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):

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

@@ -360,15 +360,11 @@ class GCEImageService(BaseImageService):
         if self._public_images is not None:
             return
         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):
         """
@@ -401,14 +397,10 @@ class GCEImageService(BaseImageService):
         images = []
         if (self.provider.project_name not in
                 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)
         return ClientPagedResultList(self.provider, images,
                                      limit=limit, marker=marker)
@@ -529,19 +521,13 @@ class GCEInstanceService(BaseInstanceService):
             if len(vm_firewall_names) > 0:
                 config['tags'] = {}
                 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')
         self.provider.wait_for_operation(operation, zone=zone_name)
         cb_inst = self.get(instance_id)
@@ -678,17 +664,14 @@ class GCENetworkService(BaseNetworkService):
     def list(self, limit=None, marker=None, filter=None):
         # TODO: Decide whether we keep filter in 'list'
         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,
                                      limit=limit, marker=marker)
 
@@ -716,20 +699,14 @@ class GCENetworkService(BaseNetworkService):
             body['IPv4Range'] = cidr_block
         else:
             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):
         """
@@ -752,24 +729,18 @@ class GCENetworkService(BaseNetworkService):
             name = network.split('/')[-1]
         else:
             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
 
 
@@ -818,23 +789,17 @@ class GCERouterService(BaseRouterService):
             network = self.provider.networking.networks.get(network)
         network_url = network.resource_url
         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):
         region_name = self.provider.region_name
@@ -927,25 +892,17 @@ class GCESubnetService(BaseSubnetService):
                 'network': network.resource_url,
                 '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):
         """
@@ -965,18 +922,15 @@ class GCESubnetService(BaseSubnetService):
         return None
 
     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):
         if zone:
@@ -1230,28 +1184,22 @@ class GCSBucketService(BaseBucketService):
         List all containers.
         """
         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):
         """
@@ -1268,8 +1216,6 @@ class GCSBucketService(BaseBucketService):
                             .insert(project=self.provider.project_name,
                                     body=body)
                             .execute())
-            if 'error' in response:
-                return None
             # GCS has a rate limit of 1 operation per 2 seconds for bucket
             # creation/deletion: https://cloud.google.com/storage/quotas.
             # 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
 
     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])
 
 Private networking
@@ -63,16 +63,16 @@ that subnet.
 .. code-block:: python
 
     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
-    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)
     gateway = net.gateways.get_or_create_inet_gateway()
     router.attach_gateway(gateway)
 
     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])
 
 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.add_volume_device(source=img, size=11, is_root=True)
     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],
         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
 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
-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.
 
 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
    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
    the latter scenario, the gateway/jump host/bastion host will need to be
    contactable over the internet.
@@ -37,19 +37,18 @@ several common scenarios.
    subnets depending on their tier. For example, consider the following
    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
      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,
    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
 ----------------------------------------------
 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:
 (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.
 
 When creating a network, we need to set an address pool. Any subsequent
@@ -74,9 +73,9 @@ subnet (``/28``).
 .. code-block:: python
 
     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)
     gateway = net.gateways.get_or_create_inet_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
 
     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)
     gateway = net.gateways.get_or_create_inet_gateway()
     router.attach_gateway(gateway)

+ 3 - 18
test/test_block_store_service.py

@@ -21,10 +21,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.volumes'])
     def test_crud_volume(self):
-        """
-        Create a new volume, check whether the expected values are set,
-        and delete it
-        """
         def create_vol(label):
             return self.provider.storage.volumes.create(
                 label, 1,
@@ -47,9 +43,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.volumes'])
     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())
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
@@ -76,9 +69,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.volumes'])
     def test_volume_properties(self):
-        """
-        Test volume properties
-        """
         label = "cb-volprops-{0}".format(helpers.get_uuid())
         vol_desc = 'newvoldesc1'
         # Declare these variables and late binding will allow
@@ -137,11 +127,9 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.snapshots'])
     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())
         test_vol = self.provider.storage.volumes.create(
             label, 1,
@@ -181,9 +169,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.snapshots'])
     def test_snapshot_properties(self):
-        """
-        Test snapshot properties
-        """
         label = "cb-snapprop-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
             label, 1,

+ 17 - 35
test/test_cloud_factory.py

@@ -16,28 +16,22 @@ class CloudFactoryTestCase(unittest.TestCase):
     _multiprocess_can_split_ = True
 
     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(
             factory.ProviderList.AWS, {}),
             interfaces.CloudProvider,
             "create_provider did not return a valid VM type")
 
     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):
             CloudProviderFactory().create_provider("ec23", {})
 
     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(
             factory.ProviderList.AWS, get_mock=True)
         self.assertTrue(
@@ -55,24 +49,18 @@ class CloudFactoryTestCase(unittest.TestCase):
                 cls)
 
     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(
             factory.ProviderList.AWS), AWSCloudProvider)
 
     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"))
 
     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):
             PROVIDER_ID = 'aws'
 
@@ -82,10 +70,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=False))
 
     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):
             PROVIDER_ID = 'aws'
 
@@ -98,10 +84,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=False))
 
     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):
             PROVIDER_ID = 'aws'
 
@@ -114,10 +98,8 @@ class CloudFactoryTestCase(unittest.TestCase):
                         factory.get_all_provider_classes(get_mock=True))
 
     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):
             pass
 

+ 1 - 3
test/test_cloud_helpers.py

@@ -80,9 +80,7 @@ class CloudHelpersTestCase(ProviderTestBase):
             results.data
 
     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'
         config_value = self.provider._get_config_value('text_type_check', None)
         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',
                               'compute.instances'])
     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())
         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
 
     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
 
     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():
             if not key.startswith("__"):
                 self.provider.has_service(value)
 
     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.provider.has_service("NON_EXISTENT_SERVICE"),
             "has_service should not return True for a non-existent service")
 
     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(),
                              "Did not get library version.")
 

+ 1 - 3
test/test_object_life_cycle.py

@@ -11,9 +11,7 @@ class CloudObjectLifeCycleTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.volumes'])
     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())
         test_vol = self.provider.storage.volumes.create(
             label, 1,

+ 6 - 14
test/test_object_store_service.py

@@ -23,10 +23,6 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket(self):
-        """
-        Create a new bucket, check whether the expected values are set,
-        and delete it.
-        """
 
         def create_bucket(name):
             return self.provider.storage.buckets.create(name)
@@ -71,11 +67,9 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['storage.buckets'])
     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())
         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")
     @helpers.skipIfNoService(['storage.buckets'])
     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()
         file_name = '6GigTest.tmp'
         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'])
     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)
         sit.check_standard_behaviour(
             self, self.provider.compute.regions, regions[-1])
@@ -32,27 +28,18 @@ class CloudRegionServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['compute.regions'])
     def test_regions_unique(self):
-        """
-        Regions should not return duplicate items
-        """
         regions = self.provider.compute.regions.list()
         unique_regions = set([region.id for region in regions])
         self.assertTrue(len(regions) == len(list(unique_regions)))
 
     @helpers.skipIfNoService(['compute.regions'])
     def test_current_region(self):
-        """
-        RegionService.current should return a valid region
-        """
         current_region = self.provider.compute.regions.current
         self.assertIsInstance(current_region, Region)
         self.assertTrue(current_region in self.provider.compute.regions)
 
     @helpers.skipIfNoService(['compute.regions'])
     def test_zones(self):
-        """
-        Test whether regions return the correct zone information
-        """
         zone_find_count = 0
         test_zone = helpers.get_provider_test_data(self.provider, "placement")
         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'])
     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(
             self.provider,
             "vm_type")