Преглед изворни кода

Merge branch 'azure_dev' of gvl into master

jatin пре 8 година
родитељ
комит
023112bdf6
22 измењених фајлова са 201 додато и 404 уклоњено
  1. 3 3
      cloudbridge/cloud/providers/aws/services.py
  2. 16 15
      cloudbridge/cloud/providers/azure/azure_client.py
  3. 2 2
      cloudbridge/cloud/providers/azure/helpers.py
  4. 1 1
      cloudbridge/cloud/providers/azure/integration_test/helpers.py
  5. 2 3
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_image_service.py
  6. 5 5
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_instance_service.py
  7. 1 2
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_instance_type_service.py
  8. 2 3
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_key_pair_service.py
  9. 4 4
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_network_service.py
  10. 2 2
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_security_group.py
  11. 1 2
      cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_snapshot_service.py
  12. 0 2
      cloudbridge/cloud/providers/azure/provider.py
  13. 77 181
      cloudbridge/cloud/providers/azure/resources.py
  14. 70 162
      cloudbridge/cloud/providers/azure/services.py
  15. 1 1
      cloudbridge/cloud/providers/azure/test/test_azure_instance_service.py
  16. 0 1
      cloudbridge/cloud/providers/azure/test/test_azure_instance_type_service.py
  17. 1 1
      cloudbridge/cloud/providers/azure/test/test_azure_key_pair_service.py
  18. 3 3
      cloudbridge/cloud/providers/azure/test/test_azure_subnet_service.py
  19. 1 1
      docs/topics/setup.rst
  20. 6 6
      setup.py
  21. 1 1
      test/test_image_service.py
  22. 2 3
      tox.ini

+ 3 - 3
cloudbridge/cloud/providers/aws/services.py

@@ -313,7 +313,7 @@ class AWSBucketService(BaseBucketService):
             return self.svc.create('create_bucket', Bucket=name,
                                    CreateBucketConfiguration={
                                        'LocationConstraint': loc_constraint
-                                    })
+                                   })
 
 
 class AWSImageService(BaseImageService):
@@ -567,7 +567,7 @@ class AWSRegionService(BaseRegionService):
         regions = [
             AWSRegion(self.provider, region) for region in
             self.provider.ec2_conn.meta.client.describe_regions()
-            .get('Regions', [])]
+                .get('Regions', [])]
         return ClientPagedResultList(self.provider, regions,
                                      limit=limit, marker=marker)
 
@@ -699,7 +699,7 @@ class AWSSubnetService(BaseSubnetService):
             # pylint:disable=protected-access
             for tag in sn._subnet.tags or {}:
                 if (tag.get('Key') == 'Name' and
-                        tag.get('Value') == AWSSubnet.CB_DEFAULT_SUBNET_NAME):
+                            tag.get('Value') == AWSSubnet.CB_DEFAULT_SUBNET_NAME):
                     return sn
         # No provider-default Subnet exists, try to create it (net + subnets)
         default_net = self.provider.networking.networks.create(

+ 16 - 15
cloudbridge/cloud/providers/azure/azure_client.py

@@ -19,6 +19,7 @@ class AzureClient(object):
     """
     Azure client is the wrapper on top of azure python sdk
     """
+
     def __init__(self, config):
         self._config = config
         self.subscription_id = config.get('azure_subscription_id')
@@ -351,22 +352,22 @@ class AzureClient(object):
             list(self.region_name)
 
     def list_subnets(self, network_name):
-        return self.network_management_client.subnets.\
+        return self.network_management_client.subnets. \
             list(self.resource_group, network_name)
 
     def get_subnet(self, network_name, subnet_name):
-        return self.network_management_client.subnets.\
+        return self.network_management_client.subnets. \
             get(self.resource_group, network_name, subnet_name)
 
     def create_subnet(self, network_name,
                       subnet_name, params):
         result_create = self.network_management_client \
             .subnets.create_or_update(
-                self.resource_group,
-                network_name,
-                subnet_name,
-                params
-            )
+            self.resource_group,
+            network_name,
+            subnet_name,
+            params
+        )
         subnet_info = result_create.result()
 
         return subnet_info
@@ -374,10 +375,10 @@ class AzureClient(object):
     def delete_subnet(self, network_name, subnet_name):
         result_delete = self.network_management_client \
             .subnets.delete(
-                self.resource_group,
-                network_name,
-                subnet_name
-            )
+            self.resource_group,
+            network_name,
+            subnet_name
+        )
         result_delete.wait()
 
     def list_vm(self):
@@ -440,10 +441,10 @@ class AzureClient(object):
     def create_nic(self, nic_name, params):
         async_nic_creation = self.network_management_client. \
             network_interfaces.create_or_update(
-                self.resource_group,
-                nic_name,
-                params
-            )
+            self.resource_group,
+            nic_name,
+            params
+        )
         nic_info = async_nic_creation.result()
 
         return nic_info

+ 2 - 2
cloudbridge/cloud/providers/azure/helpers.py

@@ -54,11 +54,11 @@ def gen_key_pair():
                                            public_exponent=65537,
                                            key_size=2048)
 
-    public_key_str = private_key.public_key().\
+    public_key_str = private_key.public_key(). \
         public_bytes(serialization.Encoding.OpenSSH,
                      serialization.PublicFormat.OpenSSH).decode('utf-8')
 
-    private_key_str = private_key.\
+    private_key_str = private_key. \
         private_bytes(encoding=serialization.Encoding.PEM,
                       format=serialization.PrivateFormat.TraditionalOpenSSL,
                       encryption_algorithm=serialization.NoEncryption()

+ 1 - 1
cloudbridge/cloud/providers/azure/integration_test/helpers.py

@@ -208,7 +208,7 @@ class ProviderTestBase(unittest.TestCase):
         provider_class = factory.get_provider_class(provider_name,
                                                     get_mock=use_mock_drivers)
         config = {'default_wait_interval':
-                  self.get_provider_wait_interval(provider_class),
+                      self.get_provider_wait_interval(provider_class),
                   'azure_subscription_id':
                       '7904d702-e01c-4826-8519-f5a25c866a96',
                   'azure_client_id':

+ 2 - 3
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_image_service.py

@@ -1,12 +1,11 @@
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
 class AzureIntegrationImageServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.images'])
     def test_azure_image_service(self):
-
         images_list = self.provider.compute.images.list()
         print("Images List" + str(images_list))
         print("List count - " + str(len(images_list)))
@@ -14,7 +13,7 @@ class AzureIntegrationImageServiceTestCase(ProviderTestBase):
         print(str(images_list[0].name))
 
         if images_list.total_results > 0:
-            found_images_list = self.provider.compute.images.\
+            found_images_list = self.provider.compute.images. \
                 find(images_list[0].name)
             print("Find Images  count - {0}".
                   format(str(found_images_list.total_results)))

+ 5 - 5
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_instance_service.py

@@ -1,7 +1,7 @@
 import uuid
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
@@ -21,7 +21,7 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
         self.assertIsNotNone(img)
 
-        key_pair = self.provider.security.\
+        key_pair = self.provider.security. \
             key_pairs.create(key_pair_name)
 
         self.assertIsNotNone(key_pair)
@@ -40,7 +40,7 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
         self.assertIsNotNone(subnet)
 
-        sg = self.provider.security.security_groups.\
+        sg = self.provider.security.security_groups. \
             create(security_group_name,
                    'A security group used by CloudBridge', '')
 
@@ -60,14 +60,14 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
         lc = self.provider.compute.instances.create_launch_config()
 
-        volume = self.provider.block_store.\
+        volume = self.provider.block_store. \
             volumes.create('CbAzure-Vol-{0}'.format(uuid.uuid4().hex[:6]), 30)
 
         volume.wait_till_ready()
 
         self.assertIsNotNone(volume)
 
-        snapshot = volume.\
+        snapshot = volume. \
             create_snapshot('CbAzure-Snap-{0}'.format(uuid.uuid4().hex[:6]))
 
         snapshot.wait_till_ready()

+ 1 - 2
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_instance_type_service.py

@@ -1,13 +1,12 @@
 from cloudbridge.cloud.providers.azure.integration_test import helpers
 
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
 class AzureIntegrationInstanceTypeServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.images'])
     def test_azure_instance_type_service(self):
-
         instance_type_list = self.provider.compute.instance_types.list()
         print("List Instance Types - " + str(instance_type_list))
         print("List Instance Type Properties - ")

+ 2 - 3
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_key_pair_service.py

@@ -1,17 +1,16 @@
 import uuid
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
 class AzureIntegrationKeyPairServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_azure_key_pair_service(self):
-
         key_pair_name = '{0}'.format(uuid.uuid4())
 
-        key_pair_create = self.provider.security.key_pairs.\
+        key_pair_create = self.provider.security.key_pairs. \
             create(key_pair_name)
         print(key_pair_create.__dict__)
         self.assertIsNotNone(key_pair_create)

+ 4 - 4
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_network_service.py

@@ -1,7 +1,7 @@
 import uuid
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
@@ -11,7 +11,7 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
         name = 'intgtestnetworkservice-{0}'.format(uuid.uuid4().hex[:6])
         net = self.provider.network.create(name=name)
         with helpers.cleanup_action(
-            lambda:
+                lambda:
                 self.provider.network.delete(network_id=net.id)
         ):
             # test list method
@@ -44,7 +44,7 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
                 self.assertFalse(
                     ip.private_ip,
                     "Floating IP should not have a private IP value ({0})."
-                    .format(ip.private_ip))
+                        .format(ip.private_ip))
                 self.assertFalse(
                     ip.in_use(),
                     "Newly created floating IP address should not be in use.")
@@ -60,4 +60,4 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
         self.assertEqual(
             len(found_net), 0,
             "Network {0} should have been deleted but still exists."
-            .format(name))
+                .format(name))

+ 2 - 2
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_security_group.py

@@ -1,7 +1,7 @@
 import uuid
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
 
 
@@ -28,7 +28,7 @@ class AzureIntegrationSecurityServiceTestCase(ProviderTestBase):
         print(str(get.rules))
         self.assertEqual(get.name, sg_name)
 
-        get_notfound = self.provider.security.\
+        get_notfound = self.provider.security. \
             security_groups.get("SecgrupDontFindMe")
         self.assertEqual(get_notfound, None)
 

+ 1 - 2
cloudbridge/cloud/providers/azure/integration_test/test_integration_azure_snapshot_service.py

@@ -4,7 +4,6 @@ from cloudbridge.cloud.providers.azure.integration_test import helpers
 
 
 class AzureIntegrationSnapshotServiceTestCase(helpers.ProviderTestBase):
-
     @helpers.skipIfNoService(['block_store'])
     def test_azure_snapshot_service(self):
         snapshot_name = '{0}'.format(uuid.uuid4().hex[:6])
@@ -19,7 +18,7 @@ class AzureIntegrationSnapshotServiceTestCase(helpers.ProviderTestBase):
 
         self.assertTrue(vol is not None, 'Volume not created')
 
-        snapshot = self.provider.block_store.\
+        snapshot = self.provider.block_store. \
             snapshots.create(snapshot_name, vol)
         snapshot.wait_till_ready()
         self.assertTrue(snapshot is not None, 'Snapshot not created')

+ 0 - 2
cloudbridge/cloud/providers/azure/provider.py

@@ -7,7 +7,6 @@ from cloudbridge.cloud.providers.azure.services \
     import AzureBlockStoreService, AzureComputeService, \
     AzureNetworkingService, AzureObjectStoreService, AzureSecurityService
 
-
 from msrestazure.azure_exceptions import CloudError
 
 log = logging.getLogger(__name__)
@@ -81,7 +80,6 @@ class AzureCloudProvider(BaseCloudProvider):
     @property
     def azure_client(self):
         if not self._azure_client:
-
             # create a dict with both optional and mandatory configuration
             # values to pass to the azureclient class, rather
             # than passing the provider object and taking a dependency.

+ 77 - 181
cloudbridge/cloud/providers/azure/resources.py

@@ -6,22 +6,20 @@ import json
 import logging
 import time
 
-
 from azure.common import AzureException
 
 from azure.mgmt.network.models import NetworkSecurityGroup
 
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
     BaseBucket, BaseBucketObject, BaseFloatingIP, \
-    BaseInstance, BaseInstanceType, BaseInternetGateway, \
-    BaseKeyPair, BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
+    BaseInstance, BaseInstanceType, BaseKeyPair, \
+    BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
     BasePlacementZone, BaseRegion, BaseRouter, BaseSecurityGroup, \
     BaseSecurityGroupRule, BaseSnapshot, BaseSubnet, \
     BaseVolume, ClientPagedResultList
 from cloudbridge.cloud.interfaces import InstanceState, VolumeState
 from cloudbridge.cloud.interfaces.resources import Instance, \
-    MachineImageState, NetworkState, RouterState, \
-    SnapshotState, SubnetState
+    MachineImageState, NetworkState, RouterState, SnapshotState
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 
 from msrestazure.azure_exceptions import CloudError
@@ -94,7 +92,6 @@ class AzureSecurityGroup(BaseSecurityGroup):
 
     @name.setter
     def name(self, value):
-        self.assert_valid_resource_name(value)
         self._security_group.tags.update(Name=value)
         self._provider.azure_client. \
             update_security_group_tags(self.id,
@@ -107,7 +104,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
     @description.setter
     def description(self, value):
         self._security_group.tags.update(Description=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_security_group_tags(self.id,
                                        self._security_group.tags)
 
@@ -125,26 +122,13 @@ class AzureSecurityGroup(BaseSecurityGroup):
 
     def delete(self):
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_security_group(self.id)
             return True
         except CloudError as cloudError:
             log.exception(cloudError.message)
             return False
 
-    def refresh(self):
-        """
-        Refreshes the security group with tags if required.
-        """
-        try:
-            self._security_group = self._provider.azure_client. \
-                get_security_group(self.id)
-            if not self._security_group.tags:
-                self._security_group.tags = {}
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
-            # The security group no longer exists and cannot be refreshed.
-
     def add_rule(self, ip_protocol=None, from_port=None, to_port=None,
                  cidr_ip=None, src_group=None):
         """
@@ -177,7 +161,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
             return self._create_rule(ip_protocol, from_port, to_port, cidr_ip)
         elif src_group:
             result = None
-            sg = (self._provider.security.security_groups.get(src_group)
+            sg = (self._provicer.security.security_groups.get(src_group)
                   if isinstance(src_group, str) else src_group)
             for rule in sg.rules:
                 result = self._create_rule(rule.ip_protocol, rule.from_port,
@@ -225,9 +209,9 @@ class AzureSecurityGroup(BaseSecurityGroup):
                  cidr_ip=None, src_group=None):
         for rule in self.rules:
             if (rule.ip_protocol == ip_protocol and
-                rule.from_port == str(from_port) and
-                rule.to_port == str(to_port) and
-                    rule.cidr_ip == cidr_ip):
+                        rule.from_port == str(from_port) and
+                        rule.to_port == str(to_port) and
+                        rule.cidr_ip == cidr_ip):
                 return rule
         return None
 
@@ -238,7 +222,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
         js['rules'] = [json.loads(r) for r in json_rules]
         if js.get('network_id'):
             js.pop('network_id')  # Omit for consistency across cloud providers
-        return js
+        return json.dumps(js, sort_keys=True)
 
 
 class AzureSecurityGroupRule(BaseSecurityGroupRule):
@@ -387,7 +371,7 @@ class AzureBucketObject(BaseBucketObject):
         Generate a URL to this object.
         """
         return self._provider.azure_client.get_blob_url(
-            self._container.name, self.name, expires_in)
+            self._container.name, self.name)
 
 
 class AzureBucket(BaseBucket):
@@ -431,11 +415,6 @@ class AzureBucket(BaseBucket):
         return ClientPagedResultList(self._provider, objects,
                                      limit=limit, marker=marker)
 
-    def find(self, name, limit=None, marker=None):
-        objects = [obj for obj in self if obj.name == name]
-        return ClientPagedResultList(self._provider, objects,
-                                     limit=limit, marker=marker)
-
     def delete(self, delete_contents=True):
         """
         Delete this bucket.
@@ -517,7 +496,6 @@ class AzureVolume(BaseVolume):
         Set the volume name.
         """
         # self._volume.name = value
-        self.assert_valid_resource_name(value)
         self._volume.tags.update(Name=value)
         self._provider.azure_client. \
             update_disk_tags(self.id,
@@ -549,7 +527,7 @@ class AzureVolume(BaseVolume):
     @property
     def source(self):
         if self._volume.creation_data.source_uri:
-            url_params = azure_helpers.\
+            url_params = azure_helpers. \
                 parse_url(SNAPSHOT_RESOURCE_ID,
                           self._volume.creation_data.source_uri)
             return self._provider.block_store.snapshots. \
@@ -705,7 +683,7 @@ class AzureSnapshot(BaseSnapshot):
         """
         Set the snapshot name.
         """
-        self.assert_valid_resource_name(value)
+        # self._snapshot.name = value
         self._snapshot.tags.update(Name=value)
         self._provider.azure_client. \
             update_snapshot_tags(self.id,
@@ -728,7 +706,7 @@ class AzureSnapshot(BaseSnapshot):
 
     @property
     def volume_id(self):
-        url_params = azure_helpers.\
+        url_params = azure_helpers. \
             parse_url(VOLUME_RESOURCE_ID,
                       self._snapshot.creation_data.source_uri)
         return url_params.get(VOLUME_NAME)
@@ -822,7 +800,6 @@ class AzureMachineImage(BaseMachineImage):
         """
         Set the image name.
         """
-        self.assert_valid_resource_name(value)
         self._image.tags.update(Name=value)
         self._provider.azure_client. \
             update_image_tags(self.id, self._image.tags)
@@ -876,7 +853,7 @@ class AzureMachineImage(BaseMachineImage):
         for its latest state.
         """
         try:
-            self._image = self._provider.azure_client\
+            self._image = self._provider.azure_client \
                 .get_image(self.id)
             self._state = self._image.provisioning_state
         except CloudError as cloudError:
@@ -921,10 +898,9 @@ class AzureNetwork(BaseNetwork):
         """
         Set the network name.
         """
-        self.assert_valid_resource_name(value)
         self._network.tags.update(Name=value)
         self._provider.azure_client. \
-            update_network_tags(self.id, self._network)
+            update_network_tags(self.id, self._network.tags)
 
     @property
     def external(self):
@@ -945,7 +921,7 @@ class AzureNetwork(BaseNetwork):
         for its latest state.
         """
         try:
-            self._network = self._provider.azure_client.\
+            self._network = self._provider.azure_client. \
                 get_network(self.id)
             self._state = self._network.provisioning_state
         except (CloudError, ValueError) as cloudError:
@@ -967,20 +943,19 @@ class AzureNetwork(BaseNetwork):
         Delete an existing network.
         """
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_network(self.id)
             return True
         except CloudError as cloudError:
             log.exception(cloudError.message)
             return False
 
-    @property
     def subnets(self):
         """
         List all the subnets in this network
         :return:
         """
-        return self._provider.networking.subnets.list(network=self.id)
+        return self._provider.network.subnets.list(network=self.id)
 
     def create_subnet(self, cidr_block, name=None, zone=None):
         """
@@ -990,12 +965,11 @@ class AzureNetwork(BaseNetwork):
         :param zone:
         :return:
         """
-        return self._provider.networking.subnets. \
+        return self._provider.network.subnets. \
             create(network=self.id, cidr_block=cidr_block, name=name)
 
 
 class AzureFloatingIP(BaseFloatingIP):
-
     def __init__(self, provider, floating_ip):
         super(AzureFloatingIP, self).__init__(provider)
         self._ip = floating_ip
@@ -1062,6 +1036,7 @@ class AzurePlacementZone(BasePlacementZone):
     As Azure does not provide zones (limited support), we are mapping the
     region information in the zones.
     """
+
     def __init__(self, provider, zone, region):
         super(AzurePlacementZone, self).__init__(provider)
         self._azure_zone = zone
@@ -1097,18 +1072,12 @@ class AzurePlacementZone(BasePlacementZone):
 
 
 class AzureSubnet(BaseSubnet):
-    _SUBNET_STATE_MAP = {
-        'InProgress': SubnetState.PENDING,
-        'Succeeded': SubnetState.AVAILABLE,
-    }
-
     def __init__(self, provider, subnet):
         super(AzureSubnet, self).__init__(provider)
         self._subnet = subnet
-        self._state = self._subnet.provisioning_state
-        self._url_params = azure_helpers\
+        self._url_params = azure_helpers \
             .parse_url(SUBNET_RESOURCE_ID, subnet.id)
-        self._network = self._provider.azure_client.\
+        self._network = self._provider.azure_client. \
             get_network(self._url_params.get(NETWORK_NAME))
 
     @property
@@ -1130,7 +1099,7 @@ class AzureSubnet(BaseSubnet):
 
     @property
     def zone(self):
-        region = self._provider.\
+        region = self._provider. \
             compute.regions.get(self._network.location)
         return region.zones[0]
 
@@ -1156,29 +1125,8 @@ class AzureSubnet(BaseSubnet):
             log.exception(cloudError.message)
             return False
 
-    @property
-    def state(self):
-        return self._SUBNET_STATE_MAP.get(
-            self._state, NetworkState.UNKNOWN)
-
-    def refresh(self):
-        """
-        Refreshes the state of this network by re-querying the cloud provider
-        for its latest state.
-        """
-        try:
-            self._network = self._provider.azure_client. \
-                get_network(self.id)
-            self._state = self._network.provisioning_state
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
-            # The network no longer exists and cannot be refreshed.
-            # set the state to unknown
-            self._state = 'unknown'
-
 
 class AzureInstance(BaseInstance):
-
     INSTANCE_STATE_MAP = {
         'InProgress': InstanceState.PENDING,
         'Creating': InstanceState.PENDING,
@@ -1217,7 +1165,7 @@ class AzureInstance(BaseInstance):
         self._public_ip_ids = []
         self._nic_ids = []
         for nic in self._vm.network_profile.network_interfaces:
-            nic_params = azure_helpers.\
+            nic_params = azure_helpers. \
                 parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic.id)
             nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
             self._nic_ids.append(nic_name)
@@ -1226,17 +1174,17 @@ class AzureInstance(BaseInstance):
                 sg_params = azure_helpers. \
                     parse_url(SECURITY_GROUP_RESOURCE_ID,
                               nic.network_security_group.id)
-                self._security_group_ids.\
+                self._security_group_ids. \
                     append(sg_params.get(SECURITY_GROUP_NAME))
             if nic.ip_configurations:
                 for ip_config in nic.ip_configurations:
                     self._private_ips.append(ip_config.private_ip_address)
                     if ip_config.public_ip_address:
-                        url_params = azure_helpers.\
+                        url_params = azure_helpers. \
                             parse_url(PUBLIC_IP_RESOURCE_ID,
                                       ip_config.public_ip_address.id)
                         public_ip_name = url_params.get(PUBLIC_IP_NAME)
-                        public_ip = self._provider.azure_client.\
+                        public_ip = self._provider.azure_client. \
                             get_public_ip(public_ip_name)
                         self._public_ip_ids.append(public_ip_name)
                         self._public_ips.append(public_ip.ip_address)
@@ -1267,10 +1215,9 @@ class AzureInstance(BaseInstance):
         """
         Set the instance name.
         """
-        self.assert_valid_resource_name(value)
         self._vm.tags.update(Name=value)
         self._provider.azure_client. \
-            update_vm_tags(self.id, self._vm)
+            update_vm_tags(self.id, self._vm.tags)
 
     @property
     def public_ips(self):
@@ -1323,15 +1270,15 @@ class AzureInstance(BaseInstance):
             self._provider.azure_client.delete_public_ip(public_ip_id)
         for data_disk in self._vm.storage_profile.data_disks:
             if data_disk.managed_disk:
-                disk_params = azure_helpers.\
+                disk_params = azure_helpers. \
                     parse_url(VOLUME_RESOURCE_ID,
                               data_disk.managed_disk.id)
-                disk = self._provider.azure_client.\
+                disk = self._provider.azure_client. \
                     get_disk(disk_params.get(VOLUME_NAME))
                 if disk and disk.tags \
                         and disk.tags.get('delete_on_terminate',
                                           'False') == 'True':
-                    self._provider.azure_client.\
+                    self._provider.azure_client. \
                         delete_disk(disk_params.get(VOLUME_NAME))
         if self._vm.storage_profile.os_disk.managed_disk:
             disk_params = azure_helpers. \
@@ -1396,8 +1343,6 @@ class AzureInstance(BaseInstance):
         the private key file path
         """
 
-        self.assert_valid_resource_name(name)
-
         if not self._state == 'VM generalized':
             if not self._state == 'VM running':
                 self._provider.azure_client.start_vm(self.id)
@@ -1416,9 +1361,9 @@ class AzureInstance(BaseInstance):
             },
             'tags': {'Name': name}
         }
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             create_image(name, create_params)
-        image = self._provider.azure_client.\
+        image = self._provider.azure_client. \
             get_image(name)
 
         return AzureMachineImage(self._provider, image)
@@ -1427,7 +1372,7 @@ class AzureInstance(BaseInstance):
         cnopts = pysftp.CnOpts()
         cnopts.hostkeys = None
         if private_key_path:
-            with pysftp.\
+            with pysftp. \
                     Connection(self.public_ips[0],
                                username=self._provider.vm_default_user_name,
                                cnopts=cnopts,
@@ -1493,13 +1438,13 @@ class AzureInstance(BaseInstance):
             nic.network_security_group = NetworkSecurityGroup()
             nic.network_security_group.id = sg.resource_id
         else:
-            sg_url_params = azure_helpers.\
+            sg_url_params = azure_helpers. \
                 parse_url(SECURITY_GROUP_RESOURCE_ID,
                           nic.network_security_group.id)
-            existing_sg = self._provider.security.\
+            existing_sg = self._provider.security. \
                 security_groups.get(sg_url_params.get(SECURITY_GROUP_NAME))
 
-            new_sg = self._provider.security.security_groups.\
+            new_sg = self._provider.security.security_groups. \
                 create('{0}-{1}'.format(sg.name, existing_sg.name),
                        'Merged security groups {0} and {1}'.
                        format(sg.name, existing_sg.name))
@@ -1527,7 +1472,7 @@ class AzureInstance(BaseInstance):
         sg = (self._provicer.security.security_groups.get(sg)
               if isinstance(sg, str) else sg)
         if nic.network_security_group and \
-                nic.network_security_group.id == sg.resource_id:
+                        nic.network_security_group.id == sg.resource_id:
             nic.network_security_group = None
             self._provider.azure_client.create_nic(self._nic_ids[0], nic)
 
@@ -1573,13 +1518,11 @@ class AzureInstance(BaseInstance):
 
 
 class AzureLaunchConfig(BaseLaunchConfig):
-
     def __init__(self, provider):
         super(AzureLaunchConfig, self).__init__(provider)
 
 
 class AzureInstanceType(BaseInstanceType):
-
     def __init__(self, provider, instance_type):
         super(AzureInstanceType, self).__init__(provider)
         self._inst_type = instance_type
@@ -1628,13 +1571,12 @@ class AzureInstanceType(BaseInstanceType):
     @property
     def extra_data(self):
         return {
-                    'max_data_disk_count':
-                    self._inst_type.max_data_disk_count
-               }
+            'max_data_disk_count':
+                self._inst_type.max_data_disk_count
+        }
 
 
 class AzureKeyPair(BaseKeyPair):
-
     def __init__(self, provider, key_pair):
         super(AzureKeyPair, self).__init__(provider, key_pair)
         self._material = None
@@ -1664,7 +1606,7 @@ class AzureKeyPair(BaseKeyPair):
 
     def delete(self):
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_public_key(self._key_pair)
             return True
         except CloudError:
@@ -1672,19 +1614,24 @@ class AzureKeyPair(BaseKeyPair):
 
 
 class AzureRouter(BaseRouter):
-    def __init__(self, provider, route_table):
+    def __init__(self, provider, router):
         super(AzureRouter, self).__init__(provider)
-        self._route_table = route_table
-        if not self._route_table.tags:
-            self._route_table.tags = {}
+        self._router = router
+        self._ROUTE_CIDR = '0.0.0.0/0'
+        self._name = None
+        self._network_id = None
+        self._state = RouterState.DETACHED
+
+    def _route_table(self, subnet_id):
+        pass
 
     @property
     def id(self):
-        return self._route_table.name
+        return self._name
 
     @property
     def resource_id(self):
-        return self._route_table.id
+        pass
 
     @property
     def name(self):
@@ -1693,7 +1640,7 @@ class AzureRouter(BaseRouter):
 
         .. note:: the router must have a (case sensitive) tag ``Name``
         """
-        return self._route_table.tags.get('Name', self._route_table.name)
+        return self._name
 
     @name.setter
     # pylint:disable=arguments-differ
@@ -1701,98 +1648,47 @@ class AzureRouter(BaseRouter):
         """
         Set the router name.
         """
-        self.assert_valid_resource_name(value)
-        self._route_table.tags.update(Name=value)
-        self._provider.azure_client. \
-            update_route_table_tags(self._route_table.name,
-                                    self._route_table)
+        self._name = value
 
     def refresh(self):
-        self._route_table = self._provider.azure_client. \
-            get_route_table(self._route_table.name)
+        pass
 
     @property
     def state(self):
-        self.refresh()  # Explicitly refresh the local object
-        if self._route_table.subnets:
-            return RouterState.ATTACHED
-        return RouterState.DETACHED
+        return self._state
 
     @property
     def network_id(self):
-        return None
+        return self._network_id
 
     def delete(self):
-        self._provider.azure_client. \
-            delete_route_table(self.name)
-
-    def attach_subnet(self, subnet):
-        subnet_id_parts = subnet.id.split('|$|')
-        if (len(subnet_id_parts) != 2):
-            pass
-        self._provider.azure_client. \
-            attach_subnet_to_route_table(subnet_id_parts[0],
-                                         subnet_id_parts[1],
-                                         self.resource_id)
-        self.refresh()
-
-    def detach_subnet(self, subnet):
-        subnet_id_parts = subnet.id.split('|$|')
-        if (len(subnet_id_parts) != 2):
-            pass
-        self._provider.azure_client. \
-            detach_subnet_to_route_table(subnet_id_parts[0],
-                                         subnet_id_parts[1],
-                                         self.resource_id)
-        self.refresh()
-
-    def attach_gateway(self, gateway):
-        pass
-
-    def detach_gateway(self, gateway):
         pass
 
+    def attach_network(self, network_id):
+        self._network_id = network_id
+        self._state = RouterState.ATTACHED
 
-class AzureInternetGateway(BaseInternetGateway):
-    def __init__(self, provider, gateway):
-        super(AzureInternetGateway, self).__init__(provider)
-        self._gateway = gateway
-        self._name = None
-        self._network_id = None
-        self._state = ''
-
-    @property
-    def id(self):
-        return self._name
+    def detach_network(self):
+        pass
 
-    @property
-    def name(self):
+    def add_route(self, subnet_id):
         """
-        Get the gateway name.
+        Add a default route to this router.
 
-        .. note:: the gateway must have a (case sensitive) tag ``Name``
-        """
-        return self._name
+        For Azure, routes are added to a route table. A route table is assoc.
+        with a network vs. a subnet so we retrieve the network via the subnet.
+        Note that the subnet must belong to the same network as the router
+        is attached to.
 
-    @name.setter
-    # pylint:disable=arguments-differ
-    def name(self, value):
+        Further, only a single route can be added, targeting the Internet
+        (i.e., destination CIDR block ``0.0.0.0/0``).
         """
-        Set the router name.
-        """
-        self.assert_valid_resource_name(value)
-        self._name = value
-
-    def refresh(self):
         pass
 
-    @property
-    def state(self):
-        return self._state
-
-    @property
-    def network_id(self):
-        return None
+    def remove_route(self, subnet_id):
+        """
+        Remove the default Internet route from this router.
 
-    def delete(self):
+        .. seealso:: ``add_route`` method
+        """
         pass

+ 70 - 162
cloudbridge/cloud/providers/azure/services.py

@@ -6,11 +6,10 @@ from azure.common import AzureException
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBlockStoreService, \
-    BaseComputeService, BaseGatewayService, BaseImageService, \
-    BaseInstanceService, BaseInstanceTypesService, \
-    BaseKeyPairService, BaseNetworkService, BaseNetworkingService, \
-    BaseObjectStoreService, BaseRegionService, BaseRouterService, \
-    BaseSecurityGroupService, BaseSecurityService, \
+    BaseComputeService, BaseImageService, BaseInstanceService, \
+    BaseInstanceTypesService, BaseKeyPairService, \
+    BaseNetworkService, BaseObjectStoreService, \
+    BaseRegionService, BaseSecurityGroupService, BaseSecurityService, \
     BaseSnapshotService, BaseSubnetService, BaseVolumeService
 from cloudbridge.cloud.interfaces import InvalidConfigurationException
 
@@ -23,8 +22,7 @@ from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 from msrestazure.azure_exceptions import CloudError
 
 from .resources import AzureBucket, AzureFloatingIP, \
-    AzureInstance, AzureInstanceType, \
-    AzureInternetGateway, AzureKeyPair, \
+    AzureInstance, AzureInstanceType, AzureKeyPair, \
     AzureLaunchConfig, AzureMachineImage, \
     AzureNetwork, AzureRegion, AzureRouter, AzureSecurityGroup, \
     AzureSnapshot, AzureSubnet, AzureVolume
@@ -108,7 +106,6 @@ class AzureSecurityGroupService(BaseSecurityGroupService):
         :rtype: ``object`` of :class:`.SecurityGroup`
         :return:  A SecurityGroup instance or ``None`` if one was not created.
         """
-        AzureSecurityGroup.assert_valid_resource_name(name)
         parameters = {"location": self.provider.region_name,
                       'tags': {'Name': name}}
 
@@ -162,7 +159,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     def get(self, key_pair_id):
         try:
-            key_pair = self.provider.azure_client.\
+            key_pair = self.provider.azure_client. \
                 get_public_key(key_pair_id)
 
             if key_pair:
@@ -175,7 +172,7 @@ class AzureKeyPairService(BaseKeyPairService):
     def list(self, limit=None, marker=None):
         key_pairs = [AzureKeyPair(self.provider, key_pair) for key_pair in
                      self.provider.azure_client.
-                     list_public_keys(AzureKeyPairService.PARTITION_KEY)]
+                         list_public_keys(AzureKeyPairService.PARTITION_KEY)]
         return ClientPagedResultList(self.provider, key_pairs, limit, marker)
 
     def find(self, name, limit=None, marker=None):
@@ -185,7 +182,6 @@ class AzureKeyPairService(BaseKeyPairService):
                                      limit, marker)
 
     def create(self, name):
-        AzureKeyPair.assert_valid_resource_name(name)
 
         key_pair = self.get(name)
 
@@ -196,11 +192,11 @@ class AzureKeyPairService(BaseKeyPairService):
         private_key_str, public_key_str = azure_helpers.gen_key_pair()
 
         entity = {
-                  'PartitionKey': AzureKeyPairService.PARTITION_KEY,
-                  'RowKey': str(uuid.uuid4()),
-                  'Name': name,
-                  'Key': public_key_str
-                 }
+            'PartitionKey': AzureKeyPairService.PARTITION_KEY,
+            'RowKey': str(uuid.uuid4()),
+            'Name': name,
+            'Key': public_key_str
+        }
 
         self.provider.azure_client.create_public_key(entity)
 
@@ -251,7 +247,6 @@ class AzureObjectStoreService(BaseObjectStoreService):
         """
         Create a new bucket.
         """
-        AzureBucket.assert_valid_resource_name(name)
         bucket = self.provider.azure_client.create_container(name.lower())
         return AzureBucket(self.provider, bucket)
 
@@ -313,7 +308,6 @@ class AzureVolumeService(BaseVolumeService):
         """
         Creates a new volume.
         """
-        AzureVolume.assert_valid_resource_name(name)
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
         snapshot = (self.provider.block_store.snapshots.get(snapshot)
                     if snapshot and isinstance(snapshot, str) else snapshot)
@@ -392,7 +386,6 @@ class AzureSnapshotService(BaseSnapshotService):
         """
         Creates a new snapshot of a given volume.
         """
-        AzureSnapshot.assert_valid_resource_name(name)
         volume = (self.provider.block_store.volumes.get(volume)
                   if isinstance(volume, str) else volume)
 
@@ -453,10 +446,7 @@ class AzureInstanceService(BaseInstanceService):
                key_pair=None, security_groups=None, user_data=None,
                launch_config=None, **kwargs):
 
-        instance_name = name.replace("_", "-") if name \
-            else "{0} - {1}".format("cb", uuid.uuid4())
-
-        AzureInstance.assert_valid_resource_name(instance_name)
+        instance_name = "{0}-{1}".format(name, uuid.uuid4().hex[:6])
 
         # Key_pair is mandatory in azure and it should not be None.
         if key_pair:
@@ -473,9 +463,9 @@ class AzureInstanceService(BaseInstanceService):
             isinstance(instance_type, InstanceType) else instance_type
 
         if not subnet:
-            subnet = self.provider.networking.subnets.get_or_create_default()
+            subnet = self.provider.network.subnets.get_or_create_default()
         else:
-            subnet = (self.provider.networking.subnets.get(subnet)
+            subnet = (self.provider.network.subnets.get(subnet)
                       if isinstance(subnet, str) else subnet)
 
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -493,15 +483,15 @@ class AzureInstanceService(BaseInstanceService):
             root_disk_size = None
 
         nic_params = {
-                'location': self._provider.region_name,
-                'ip_configurations': [{
-                    'name': instance_name + '_ip_config',
-                    'private_ip_allocation_method': 'Dynamic',
-                    'subnet': {
-                        'id': subnet_id
-                    }
-                }]
-            }
+            'location': self._provider.region_name,
+            'ip_configurations': [{
+                'name': instance_name + '_ip_config',
+                'private_ip_allocation_method': 'Dynamic',
+                'subnet': {
+                    'id': subnet_id
+                }
+            }]
+        }
 
         if security_group_id:
             nic_params['network_security_group'] = {
@@ -513,8 +503,8 @@ class AzureInstanceService(BaseInstanceService):
         )
         # #! indicates shell script
         ud = '#cloud-config\n' + user_data \
-            if user_data and not user_data.startswith('#!')\
-            and not user_data.startswith('#cloud-config') else user_data
+            if user_data and not user_data.startswith('#!') \
+               and not user_data.startswith('#cloud-config') else user_data
 
         params = {
             'location': zone_id or self._provider.region_name,
@@ -522,16 +512,16 @@ class AzureInstanceService(BaseInstanceService):
                 'admin_username': self.provider.vm_default_user_name,
                 'computer_name': instance_name,
                 'linux_configuration': {
-                             "disable_password_authentication": True,
-                             "ssh": {
-                                 "public_keys": [{
-                                      "path":
-                                      "/home/{}/.ssh/authorized_keys".format(
-                                          self.provider.vm_default_user_name),
-                                      "key_data": key_pair._key_pair.Key
-                                     }]
-                                   }
-                           }
+                    "disable_password_authentication": True,
+                    "ssh": {
+                        "public_keys": [{
+                            "path":
+                                "/home/{}/.ssh/authorized_keys".format(
+                                    self.provider.vm_default_user_name),
+                            "key_data": key_pair._key_pair.Key
+                        }]
+                    }
+                }
             },
             'hardware_profile': {
                 'vm_size': instance_size
@@ -603,12 +593,12 @@ class AzureInstanceService(BaseInstanceService):
                 security_group_id = security_groups[0].resource_id
             else:
                 security_groups_ids = security_groups
-                seuciry_group = self.provider.security.\
+                seuciry_group = self.provider.security. \
                     security_groups.get(security_groups[0])
                 security_group_id = seuciry_group.resource_id
 
             if len(security_groups) > 1:
-                new_sg = self.provider.security.security_groups.\
+                new_sg = self.provider.security.security_groups. \
                     create('{0}-sg'.format(name), 'Merge security groups {0}'.
                            format(','.join(security_groups_ids)))
 
@@ -647,7 +637,7 @@ class AzureInstanceService(BaseInstanceService):
             # This method uses the azure tags functionality to store
             # the  delete_on_terminate option when the virtual machine
             # is deleted, we parse the tags and delete accordingly
-            self.provider.azure_client.\
+            self.provider.azure_client. \
                 update_disk_tags(volume.id, volume.tags)
 
         for device in launch_config.block_devices:
@@ -773,7 +763,6 @@ class AzureImageService(BaseImageService):
 
 
 class AzureInstanceTypesService(BaseInstanceTypesService):
-
     def __init__(self, provider):
         super(AzureInstanceTypesService, self).__init__(provider)
 
@@ -792,34 +781,10 @@ class AzureInstanceTypesService(BaseInstanceTypesService):
                                      limit=limit, marker=marker)
 
 
-class AzureNetworkingService(BaseNetworkingService):
-    def __init__(self, provider):
-        super(AzureNetworkingService, self).__init__(provider)
-        self._network_service = AzureNetworkService(self.provider)
-        self._subnet_service = AzureSubnetService(self.provider)
-        self._router_service = AzureRouterService(self.provider)
-        self._gateway_service = AzureGatewayService(self.provider)
-
-    @property
-    def networks(self):
-        return self._network_service
-
-    @property
-    def subnets(self):
-        return self._subnet_service
-
-    @property
-    def routers(self):
-        return self._router_service
-
-    @property
-    def gateways(self):
-        return self._gateway_service
-
-
 class AzureNetworkService(BaseNetworkService):
     def __init__(self, provider):
         super(AzureNetworkService, self).__init__(provider)
+        self._subnet_svc = AzureSubnetService(self.provider)
 
     def get(self, network_id):
         try:
@@ -840,33 +805,25 @@ class AzureNetworkService(BaseNetworkService):
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
 
-    def find(self, name, limit=None, marker=None):
-        filters = {'Name': name}
-        networks = [AzureNetwork(self.provider, network)
-                    for network in azure_helpers.filter(
-                self.provider.azure_client.list_networks(), filters)]
-        return ClientPagedResultList(self.provider, networks,
-                                     limit=limit, marker=marker)
-
-    def create(self, name, cidr_block):
+    def create(self, name=None):
         # Azure requires CIDR block to be specified when creating a network
         # so set a default one and use the largest allowed netmask.
         network_name = AzureNetwork.CB_DEFAULT_NETWORK_NAME
         if name:
             network_name = "{0}-{1}".format(name, uuid.uuid4().hex[:6])
 
-        AzureNetwork.assert_valid_resource_name(network_name)
-
         params = {
             'location': self.provider.azure_client.region_name,
             'address_space': {
-                'address_prefixes': [cidr_block]
+                'address_prefixes': ['10.0.0.0/16']
             },
             'tags': {'Name': name or AzureNetwork.CB_DEFAULT_NETWORK_NAME}
         }
+
         self.provider.azure_client.create_network(network_name, params)
         network = self.provider.azure_client.get_network(network_name)
         cb_network = AzureNetwork(self.provider, network)
+
         return cb_network
 
     def create_floating_ip(self):
@@ -877,20 +834,32 @@ class AzureNetworkService(BaseNetworkService):
             'public_ip_allocation_method': 'Static'
         }
 
-        floating_ip = self.provider.azure_client.\
+        floating_ip = self.provider.azure_client. \
             create_floating_ip(public_ip_address_name, public_ip_parameters)
         return AzureFloatingIP(self.provider, floating_ip)
 
     @property
+    def subnets(self):
+        return self._subnet_svc
+
     def floating_ips(self, network_id=None):
         """
                List all floating ips.
         """
         floating_ips = [AzureFloatingIP(self.provider, floating_ip)
                         for floating_ip in self.provider.azure_client.
-                        list_floating_ips()]
+                            list_floating_ips()]
+
         return ClientPagedResultList(self.provider, floating_ips)
 
+    def routers(self):
+        return ClientPagedResultList(self.provider, [])
+
+    def create_router(self, name=None):
+        ar = AzureRouter(self.provider, None)
+        ar.name = name
+        return ar
+
     def delete(self, network_id):
         """
                 Delete an existing network.
@@ -928,7 +897,6 @@ class AzureRegionService(BaseRegionService):
 
 
 class AzureSubnetService(BaseSubnetService):
-
     def __init__(self, provider):
         super(AzureSubnetService, self).__init__(provider)
 
@@ -944,9 +912,7 @@ class AzureSubnetService(BaseSubnetService):
         """
         try:
             subnet_id_parts = subnet_id.split('|$|')
-            if (len(subnet_id_parts) != 2):
-                return None
-            azure_subnet = self.provider.azure_client.\
+            azure_subnet = self.provider.azure_client. \
                 get_subnet(subnet_id_parts[0], subnet_id_parts[1])
             return AzureSubnet(self.provider,
                                azure_subnet) if azure_subnet else None
@@ -983,7 +949,6 @@ class AzureSubnetService(BaseSubnetService):
         """
         Create subnet
         """
-        AzureSubnet.assert_valid_resource_name(name)
         network_id = network.id \
             if isinstance(network, Network) else network
 
@@ -992,14 +957,14 @@ class AzureSubnetService(BaseSubnetService):
         else:
             subnet_name = name
 
-        subnet_info = self.provider.azure_client\
+        subnet_info = self.provider.azure_client \
             .create_subnet(
-                            network_id,
-                            subnet_name,
-                            {
-                                'address_prefix': cidr_block
-                            }
-                          )
+            network_id,
+            subnet_name,
+            {
+                'address_prefix': cidr_block
+            }
+        )
 
         return AzureSubnet(self.provider, subnet_info)
 
@@ -1022,20 +987,18 @@ class AzureSubnetService(BaseSubnetService):
             return AzureSubnet(self.provider, subnet)
 
         # No provider-default Subnet exists, try to create it (net + subnets)
-        default_net_name = AzureNetwork.CB_DEFAULT_NETWORK_NAME
         try:
             network = self.provider.azure_client \
-                .get_network(default_net_name)
+                .get_network(AzureNetwork.CB_DEFAULT_NETWORK_NAME)
         except CloudError:
             # Azure raises the cloud error if the resource not available
             pass
 
         if not network:
-            network = self.provider.networking.networks.create(
-                name=default_net_name, cidr_block='10.0.0.0/16')
+            self.provider.network.create()
 
         subnet = self.provider.azure_client.create_subnet(
-            network.id,
+            AzureNetwork.CB_DEFAULT_NETWORK_NAME,
             AzureSubnet.CB_DEFAULT_SUBNET_NAME,
             {'address_prefix': default_cdir}
         )
@@ -1050,65 +1013,10 @@ class AzureSubnetService(BaseSubnetService):
 
             subnet_id = subnet.id if isinstance(subnet, Subnet) else subnet
             subnet_id_parts = subnet_id.split('|$|')
-            self.provider.azure_client.\
+            self.provider.azure_client. \
                 delete_subnet(subnet_id_parts[0], subnet_id_parts[1])
             return True
         except CloudError as cloudError:
             # Azure raises the cloud error if the resource not available
             log.exception(cloudError.message)
             return False
-
-
-class AzureRouterService(BaseRouterService):
-    def __init__(self, provider):
-        super(AzureRouterService, self).__init__(provider)
-
-    def get(self, router_id):
-        try:
-            route = self.provider.azure_client.get_route_table(router_id)
-            return AzureRouter(self.provider, route)
-
-        except CloudError as cloudError:
-            # Azure raises the cloud error if the resource not available
-            log.exception(cloudError.message)
-            return None
-
-    def find(self, name, limit=None, marker=None):
-        filters = {'Name': name}
-        routes = [AzureRouter(self.provider, route)
-                  for route in azure_helpers.filter(
-                self.provider.azure_client.list_route_tables(), filters)]
-
-        return ClientPagedResultList(self.provider, routes,
-                                     limit=limit, marker=marker)
-
-    def list(self, limit=None, marker=None):
-        routes = [AzureRouter(self.provider, route)
-                  for route in
-                  self.provider.azure_client.list_route_tables()]
-        return ClientPagedResultList(self.provider,
-                                     routes,
-                                     limit=limit, marker=marker)
-
-    def create(self, name, network):
-        AzureRouter.assert_valid_resource_name(name)
-        parameters = {"location": self.provider.region_name,
-                      'tags': {'Name': name}}
-        route = self.provider.azure_client. \
-            create_route_table(name, parameters)
-        return AzureRouter(self.provider, route)
-
-
-class AzureGatewayService(BaseGatewayService):
-    def __init__(self, provider):
-        super(AzureGatewayService, self).__init__(provider)
-
-    def get_or_create_inet_gateway(self, name):
-        AzureInternetGateway.assert_valid_resource_name(name)
-
-        gateway = AzureInternetGateway(self.provider, None)
-        gateway.name = name
-        return gateway
-
-    def delete(self, gateway):
-        pass

+ 1 - 1
cloudbridge/cloud/providers/azure/test/test_azure_instance_service.py

@@ -43,7 +43,7 @@ class AzureInstanceServiceTestCase(ProviderTestBase):
         inst_type = [t for t in self.provider.compute.instance_types.list()
                      if t.name == 'Standard_DS1_v2'][0]
         sg_id = 'sg2'
-        sg = self.provider.security.\
+        sg = self.provider.security. \
             security_groups.get(sg_id)
 
         subnet = self.provider.network.subnets.list()[0]

+ 0 - 1
cloudbridge/cloud/providers/azure/test/test_azure_instance_type_service.py

@@ -3,7 +3,6 @@ from cloudbridge.cloud.providers.azure.test.helpers import ProviderTestBase
 
 
 class AzureInstanceTypeServiceTestCase(ProviderTestBase):
-
     @helpers.skipIfNoService(['compute.instance_types'])
     def test_azure_instance_type_list(self):
         instance_type_list = self.provider.compute.instance_types.list()

+ 1 - 1
cloudbridge/cloud/providers/azure/test/test_azure_key_pair_service.py

@@ -36,7 +36,7 @@ class AzureKeyPairServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_azure_keypair_get_notExist(self):
         keypair_id = 'KeyPairNotExist'
-        keypair_get_not_exist = self.provider.security.\
+        keypair_get_not_exist = self.provider.security. \
             key_pairs.get(keypair_id)
         print("Get Key Pair Not Exist - " + str(keypair_get_not_exist))
         self.assertIsNone(keypair_get_not_exist)

+ 3 - 3
cloudbridge/cloud/providers/azure/test/test_azure_subnet_service.py

@@ -50,7 +50,7 @@ class AzureSubnetServiceTestCase(ProviderTestBase):
 
     def test_azure_create_and_delete_from_resource_subnet(self):
         network_id = 'CloudBridgeNet4'
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.create(network=network_id,
                            cidr_block='10.0.0.0/24')
         self.assertIsNotNone(subnet.zone)
@@ -62,7 +62,7 @@ class AzureSubnetServiceTestCase(ProviderTestBase):
 
     def test_azure_create_and_delete_from_service_subnet(self):
         network_id = 'CloudBridgeNet4'
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.create(network=network_id,
                            name='test', cidr_block='10.0.0.0/24')
         self.assertIsNotNone(subnet)
@@ -72,7 +72,7 @@ class AzureSubnetServiceTestCase(ProviderTestBase):
         self.assertFalse(deleted)
 
     def test_azure_create_or_get_default_subnet(self):
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.get_or_create_default()
         self.assertIsNotNone(subnet)
         subnet = self.provider.network. \

+ 1 - 1
docs/topics/setup.rst

@@ -41,7 +41,7 @@ Mandatory variables     Optional Variables
 AZURE_SUBSCRIPTION_ID   AZURE_REGION_NAME
 AZURE_CLIENT_ID		    AZURE_RESOURCE_GROUP
 AZURE_SECRET		    AZURE_STORAGE_ACCOUNT_NAME
-AZURE_TENANT                
+AZURE_TENANT
 ======================  ==================
 
 

+ 6 - 6
setup.py

@@ -42,12 +42,12 @@ REQS_OPENSTACK = [
 REQS_FULL = REQS_BASE + REQS_AWS + REQS_AZURE + REQS_OPENSTACK
 # httpretty is required with/for moto 1.0.0 or AWS tests fail
 REQS_DEV = ([
-    'tox>=2.1.1',
-    'moto>=1.1.11',
-    'sphinx>=1.3.1',
-    'flake8>=3.3.0',
-    'flake8-import-order>=0.12'] + REQS_FULL
-)
+                'tox>=2.1.1',
+                'moto>=1.1.11',
+                'sphinx>=1.3.1',
+                'flake8>=3.3.0',
+                'flake8-import-order>=0.12'] + REQS_FULL
+            )
 
 setup(
     name='cloudbridge',

+ 1 - 1
test/test_image_service.py

@@ -35,7 +35,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
             # check image size
             img.refresh()
             self.assertGreater(img.min_disk, 0, "Minimum disk"
-                               " size required by image is invalid")
+                                                " size required by image is invalid")
 
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
                 test_instance, net)):

+ 2 - 3
tox.ini

@@ -15,9 +15,8 @@
 envlist = {py27,py36,pypy}-{aws,azure,openstack}
 
 [testenv]
-commands =
-#flake8 cloudbridge test setup.py
-    {envpython} -m coverage run --branch --source=cloudbridge --omit=cloudbridge/cloud/interfaces/* setup.py test {posargs}
+commands = flake8 cloudbridge test setup.py
+           {envpython} -m coverage run --branch --source=cloudbridge --omit=cloudbridge/cloud/interfaces/* setup.py test {posargs}
 setenv =
     aws: CB_TEST_PROVIDER=aws
     azure: CB_TEST_PROVIDER=azure