Kaynağa Gözat

Merge branch 'azure_dev' of gvl into master

jatin 8 yıl önce
ebeveyn
işleme
023112bdf6
22 değiştirilmiş dosya ile 201 ekleme ve 404 silme
  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,
             return self.svc.create('create_bucket', Bucket=name,
                                    CreateBucketConfiguration={
                                    CreateBucketConfiguration={
                                        'LocationConstraint': loc_constraint
                                        'LocationConstraint': loc_constraint
-                                    })
+                                   })
 
 
 
 
 class AWSImageService(BaseImageService):
 class AWSImageService(BaseImageService):
@@ -567,7 +567,7 @@ class AWSRegionService(BaseRegionService):
         regions = [
         regions = [
             AWSRegion(self.provider, region) for region in
             AWSRegion(self.provider, region) for region in
             self.provider.ec2_conn.meta.client.describe_regions()
             self.provider.ec2_conn.meta.client.describe_regions()
-            .get('Regions', [])]
+                .get('Regions', [])]
         return ClientPagedResultList(self.provider, regions,
         return ClientPagedResultList(self.provider, regions,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
@@ -699,7 +699,7 @@ class AWSSubnetService(BaseSubnetService):
             # pylint:disable=protected-access
             # pylint:disable=protected-access
             for tag in sn._subnet.tags or {}:
             for tag in sn._subnet.tags or {}:
                 if (tag.get('Key') == 'Name' and
                 if (tag.get('Key') == 'Name' and
-                        tag.get('Value') == AWSSubnet.CB_DEFAULT_SUBNET_NAME):
+                            tag.get('Value') == AWSSubnet.CB_DEFAULT_SUBNET_NAME):
                     return sn
                     return sn
         # No provider-default Subnet exists, try to create it (net + subnets)
         # No provider-default Subnet exists, try to create it (net + subnets)
         default_net = self.provider.networking.networks.create(
         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
     Azure client is the wrapper on top of azure python sdk
     """
     """
+
     def __init__(self, config):
     def __init__(self, config):
         self._config = config
         self._config = config
         self.subscription_id = config.get('azure_subscription_id')
         self.subscription_id = config.get('azure_subscription_id')
@@ -351,22 +352,22 @@ class AzureClient(object):
             list(self.region_name)
             list(self.region_name)
 
 
     def list_subnets(self, network_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)
             list(self.resource_group, network_name)
 
 
     def get_subnet(self, network_name, subnet_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)
             get(self.resource_group, network_name, subnet_name)
 
 
     def create_subnet(self, network_name,
     def create_subnet(self, network_name,
                       subnet_name, params):
                       subnet_name, params):
         result_create = self.network_management_client \
         result_create = self.network_management_client \
             .subnets.create_or_update(
             .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()
         subnet_info = result_create.result()
 
 
         return subnet_info
         return subnet_info
@@ -374,10 +375,10 @@ class AzureClient(object):
     def delete_subnet(self, network_name, subnet_name):
     def delete_subnet(self, network_name, subnet_name):
         result_delete = self.network_management_client \
         result_delete = self.network_management_client \
             .subnets.delete(
             .subnets.delete(
-                self.resource_group,
-                network_name,
-                subnet_name
-            )
+            self.resource_group,
+            network_name,
+            subnet_name
+        )
         result_delete.wait()
         result_delete.wait()
 
 
     def list_vm(self):
     def list_vm(self):
@@ -440,10 +441,10 @@ class AzureClient(object):
     def create_nic(self, nic_name, params):
     def create_nic(self, nic_name, params):
         async_nic_creation = self.network_management_client. \
         async_nic_creation = self.network_management_client. \
             network_interfaces.create_or_update(
             network_interfaces.create_or_update(
-                self.resource_group,
-                nic_name,
-                params
-            )
+            self.resource_group,
+            nic_name,
+            params
+        )
         nic_info = async_nic_creation.result()
         nic_info = async_nic_creation.result()
 
 
         return nic_info
         return nic_info

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

@@ -54,11 +54,11 @@ def gen_key_pair():
                                            public_exponent=65537,
                                            public_exponent=65537,
                                            key_size=2048)
                                            key_size=2048)
 
 
-    public_key_str = private_key.public_key().\
+    public_key_str = private_key.public_key(). \
         public_bytes(serialization.Encoding.OpenSSH,
         public_bytes(serialization.Encoding.OpenSSH,
                      serialization.PublicFormat.OpenSSH).decode('utf-8')
                      serialization.PublicFormat.OpenSSH).decode('utf-8')
 
 
-    private_key_str = private_key.\
+    private_key_str = private_key. \
         private_bytes(encoding=serialization.Encoding.PEM,
         private_bytes(encoding=serialization.Encoding.PEM,
                       format=serialization.PrivateFormat.TraditionalOpenSSL,
                       format=serialization.PrivateFormat.TraditionalOpenSSL,
                       encryption_algorithm=serialization.NoEncryption()
                       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,
         provider_class = factory.get_provider_class(provider_name,
                                                     get_mock=use_mock_drivers)
                                                     get_mock=use_mock_drivers)
         config = {'default_wait_interval':
         config = {'default_wait_interval':
-                  self.get_provider_wait_interval(provider_class),
+                      self.get_provider_wait_interval(provider_class),
                   'azure_subscription_id':
                   'azure_subscription_id':
                       '7904d702-e01c-4826-8519-f5a25c866a96',
                       '7904d702-e01c-4826-8519-f5a25c866a96',
                   'azure_client_id':
                   '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.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
 class AzureIntegrationImageServiceTestCase(ProviderTestBase):
 class AzureIntegrationImageServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.images'])
     @helpers.skipIfNoService(['compute.images'])
     def test_azure_image_service(self):
     def test_azure_image_service(self):
-
         images_list = self.provider.compute.images.list()
         images_list = self.provider.compute.images.list()
         print("Images List" + str(images_list))
         print("Images List" + str(images_list))
         print("List count - " + str(len(images_list)))
         print("List count - " + str(len(images_list)))
@@ -14,7 +13,7 @@ class AzureIntegrationImageServiceTestCase(ProviderTestBase):
         print(str(images_list[0].name))
         print(str(images_list[0].name))
 
 
         if images_list.total_results > 0:
         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)
                 find(images_list[0].name)
             print("Find Images  count - {0}".
             print("Find Images  count - {0}".
                   format(str(found_images_list.total_results)))
                   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
 import uuid
 
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
@@ -21,7 +21,7 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
 
         self.assertIsNotNone(img)
         self.assertIsNotNone(img)
 
 
-        key_pair = self.provider.security.\
+        key_pair = self.provider.security. \
             key_pairs.create(key_pair_name)
             key_pairs.create(key_pair_name)
 
 
         self.assertIsNotNone(key_pair)
         self.assertIsNotNone(key_pair)
@@ -40,7 +40,7 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
 
         self.assertIsNotNone(subnet)
         self.assertIsNotNone(subnet)
 
 
-        sg = self.provider.security.security_groups.\
+        sg = self.provider.security.security_groups. \
             create(security_group_name,
             create(security_group_name,
                    'A security group used by CloudBridge', '')
                    'A security group used by CloudBridge', '')
 
 
@@ -60,14 +60,14 @@ class AzureIntegrationInstanceServiceTestCase(ProviderTestBase):
 
 
         lc = self.provider.compute.instances.create_launch_config()
         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)
             volumes.create('CbAzure-Vol-{0}'.format(uuid.uuid4().hex[:6]), 30)
 
 
         volume.wait_till_ready()
         volume.wait_till_ready()
 
 
         self.assertIsNotNone(volume)
         self.assertIsNotNone(volume)
 
 
-        snapshot = volume.\
+        snapshot = volume. \
             create_snapshot('CbAzure-Snap-{0}'.format(uuid.uuid4().hex[:6]))
             create_snapshot('CbAzure-Snap-{0}'.format(uuid.uuid4().hex[:6]))
 
 
         snapshot.wait_till_ready()
         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.integration_test import helpers
 
 
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
 class AzureIntegrationInstanceTypeServiceTestCase(ProviderTestBase):
 class AzureIntegrationInstanceTypeServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.images'])
     @helpers.skipIfNoService(['compute.images'])
     def test_azure_instance_type_service(self):
     def test_azure_instance_type_service(self):
-
         instance_type_list = self.provider.compute.instance_types.list()
         instance_type_list = self.provider.compute.instance_types.list()
         print("List Instance Types - " + str(instance_type_list))
         print("List Instance Types - " + str(instance_type_list))
         print("List Instance Type Properties - ")
         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
 import uuid
 
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
 class AzureIntegrationKeyPairServiceTestCase(ProviderTestBase):
 class AzureIntegrationKeyPairServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.key_pairs'])
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_azure_key_pair_service(self):
     def test_azure_key_pair_service(self):
-
         key_pair_name = '{0}'.format(uuid.uuid4())
         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)
             create(key_pair_name)
         print(key_pair_create.__dict__)
         print(key_pair_create.__dict__)
         self.assertIsNotNone(key_pair_create)
         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
 import uuid
 
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
@@ -11,7 +11,7 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
         name = 'intgtestnetworkservice-{0}'.format(uuid.uuid4().hex[:6])
         name = 'intgtestnetworkservice-{0}'.format(uuid.uuid4().hex[:6])
         net = self.provider.network.create(name=name)
         net = self.provider.network.create(name=name)
         with helpers.cleanup_action(
         with helpers.cleanup_action(
-            lambda:
+                lambda:
                 self.provider.network.delete(network_id=net.id)
                 self.provider.network.delete(network_id=net.id)
         ):
         ):
             # test list method
             # test list method
@@ -44,7 +44,7 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
                 self.assertFalse(
                 self.assertFalse(
                     ip.private_ip,
                     ip.private_ip,
                     "Floating IP should not have a private IP value ({0})."
                     "Floating IP should not have a private IP value ({0})."
-                    .format(ip.private_ip))
+                        .format(ip.private_ip))
                 self.assertFalse(
                 self.assertFalse(
                     ip.in_use(),
                     ip.in_use(),
                     "Newly created floating IP address should not be in use.")
                     "Newly created floating IP address should not be in use.")
@@ -60,4 +60,4 @@ class AzureIntegrationNetworkServiceTestCase(ProviderTestBase):
         self.assertEqual(
         self.assertEqual(
             len(found_net), 0,
             len(found_net), 0,
             "Network {0} should have been deleted but still exists."
             "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
 import uuid
 
 
 from cloudbridge.cloud.providers.azure.integration_test import helpers
 from cloudbridge.cloud.providers.azure.integration_test import helpers
-from cloudbridge.cloud.providers.azure.\
+from cloudbridge.cloud.providers.azure. \
     integration_test.helpers import ProviderTestBase
     integration_test.helpers import ProviderTestBase
 
 
 
 
@@ -28,7 +28,7 @@ class AzureIntegrationSecurityServiceTestCase(ProviderTestBase):
         print(str(get.rules))
         print(str(get.rules))
         self.assertEqual(get.name, sg_name)
         self.assertEqual(get.name, sg_name)
 
 
-        get_notfound = self.provider.security.\
+        get_notfound = self.provider.security. \
             security_groups.get("SecgrupDontFindMe")
             security_groups.get("SecgrupDontFindMe")
         self.assertEqual(get_notfound, None)
         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):
 class AzureIntegrationSnapshotServiceTestCase(helpers.ProviderTestBase):
-
     @helpers.skipIfNoService(['block_store'])
     @helpers.skipIfNoService(['block_store'])
     def test_azure_snapshot_service(self):
     def test_azure_snapshot_service(self):
         snapshot_name = '{0}'.format(uuid.uuid4().hex[:6])
         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')
         self.assertTrue(vol is not None, 'Volume not created')
 
 
-        snapshot = self.provider.block_store.\
+        snapshot = self.provider.block_store. \
             snapshots.create(snapshot_name, vol)
             snapshots.create(snapshot_name, vol)
         snapshot.wait_till_ready()
         snapshot.wait_till_ready()
         self.assertTrue(snapshot is not None, 'Snapshot not created')
         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, \
     import AzureBlockStoreService, AzureComputeService, \
     AzureNetworkingService, AzureObjectStoreService, AzureSecurityService
     AzureNetworkingService, AzureObjectStoreService, AzureSecurityService
 
 
-
 from msrestazure.azure_exceptions import CloudError
 from msrestazure.azure_exceptions import CloudError
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
@@ -81,7 +80,6 @@ class AzureCloudProvider(BaseCloudProvider):
     @property
     @property
     def azure_client(self):
     def azure_client(self):
         if not self._azure_client:
         if not self._azure_client:
-
             # create a dict with both optional and mandatory configuration
             # create a dict with both optional and mandatory configuration
             # values to pass to the azureclient class, rather
             # values to pass to the azureclient class, rather
             # than passing the provider object and taking a dependency.
             # 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 logging
 import time
 import time
 
 
-
 from azure.common import AzureException
 from azure.common import AzureException
 
 
 from azure.mgmt.network.models import NetworkSecurityGroup
 from azure.mgmt.network.models import NetworkSecurityGroup
 
 
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
     BaseBucket, BaseBucketObject, BaseFloatingIP, \
     BaseBucket, BaseBucketObject, BaseFloatingIP, \
-    BaseInstance, BaseInstanceType, BaseInternetGateway, \
-    BaseKeyPair, BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
+    BaseInstance, BaseInstanceType, BaseKeyPair, \
+    BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
     BasePlacementZone, BaseRegion, BaseRouter, BaseSecurityGroup, \
     BasePlacementZone, BaseRegion, BaseRouter, BaseSecurityGroup, \
     BaseSecurityGroupRule, BaseSnapshot, BaseSubnet, \
     BaseSecurityGroupRule, BaseSnapshot, BaseSubnet, \
     BaseVolume, ClientPagedResultList
     BaseVolume, ClientPagedResultList
 from cloudbridge.cloud.interfaces import InstanceState, VolumeState
 from cloudbridge.cloud.interfaces import InstanceState, VolumeState
 from cloudbridge.cloud.interfaces.resources import Instance, \
 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 cloudbridge.cloud.providers.azure import helpers as azure_helpers
 
 
 from msrestazure.azure_exceptions import CloudError
 from msrestazure.azure_exceptions import CloudError
@@ -94,7 +92,6 @@ class AzureSecurityGroup(BaseSecurityGroup):
 
 
     @name.setter
     @name.setter
     def name(self, value):
     def name(self, value):
-        self.assert_valid_resource_name(value)
         self._security_group.tags.update(Name=value)
         self._security_group.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
             update_security_group_tags(self.id,
             update_security_group_tags(self.id,
@@ -107,7 +104,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
     @description.setter
     @description.setter
     def description(self, value):
     def description(self, value):
         self._security_group.tags.update(Description=value)
         self._security_group.tags.update(Description=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_security_group_tags(self.id,
             update_security_group_tags(self.id,
                                        self._security_group.tags)
                                        self._security_group.tags)
 
 
@@ -125,26 +122,13 @@ class AzureSecurityGroup(BaseSecurityGroup):
 
 
     def delete(self):
     def delete(self):
         try:
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_security_group(self.id)
                 delete_security_group(self.id)
             return True
             return True
         except CloudError as cloudError:
         except CloudError as cloudError:
             log.exception(cloudError.message)
             log.exception(cloudError.message)
             return False
             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,
     def add_rule(self, ip_protocol=None, from_port=None, to_port=None,
                  cidr_ip=None, src_group=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)
             return self._create_rule(ip_protocol, from_port, to_port, cidr_ip)
         elif src_group:
         elif src_group:
             result = None
             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)
                   if isinstance(src_group, str) else src_group)
             for rule in sg.rules:
             for rule in sg.rules:
                 result = self._create_rule(rule.ip_protocol, rule.from_port,
                 result = self._create_rule(rule.ip_protocol, rule.from_port,
@@ -225,9 +209,9 @@ class AzureSecurityGroup(BaseSecurityGroup):
                  cidr_ip=None, src_group=None):
                  cidr_ip=None, src_group=None):
         for rule in self.rules:
         for rule in self.rules:
             if (rule.ip_protocol == ip_protocol and
             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 rule
         return None
         return None
 
 
@@ -238,7 +222,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
         js['rules'] = [json.loads(r) for r in json_rules]
         js['rules'] = [json.loads(r) for r in json_rules]
         if js.get('network_id'):
         if js.get('network_id'):
             js.pop('network_id')  # Omit for consistency across cloud providers
             js.pop('network_id')  # Omit for consistency across cloud providers
-        return js
+        return json.dumps(js, sort_keys=True)
 
 
 
 
 class AzureSecurityGroupRule(BaseSecurityGroupRule):
 class AzureSecurityGroupRule(BaseSecurityGroupRule):
@@ -387,7 +371,7 @@ class AzureBucketObject(BaseBucketObject):
         Generate a URL to this object.
         Generate a URL to this object.
         """
         """
         return self._provider.azure_client.get_blob_url(
         return self._provider.azure_client.get_blob_url(
-            self._container.name, self.name, expires_in)
+            self._container.name, self.name)
 
 
 
 
 class AzureBucket(BaseBucket):
 class AzureBucket(BaseBucket):
@@ -431,11 +415,6 @@ class AzureBucket(BaseBucket):
         return ClientPagedResultList(self._provider, objects,
         return ClientPagedResultList(self._provider, objects,
                                      limit=limit, marker=marker)
                                      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):
     def delete(self, delete_contents=True):
         """
         """
         Delete this bucket.
         Delete this bucket.
@@ -517,7 +496,6 @@ class AzureVolume(BaseVolume):
         Set the volume name.
         Set the volume name.
         """
         """
         # self._volume.name = value
         # self._volume.name = value
-        self.assert_valid_resource_name(value)
         self._volume.tags.update(Name=value)
         self._volume.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
             update_disk_tags(self.id,
             update_disk_tags(self.id,
@@ -549,7 +527,7 @@ class AzureVolume(BaseVolume):
     @property
     @property
     def source(self):
     def source(self):
         if self._volume.creation_data.source_uri:
         if self._volume.creation_data.source_uri:
-            url_params = azure_helpers.\
+            url_params = azure_helpers. \
                 parse_url(SNAPSHOT_RESOURCE_ID,
                 parse_url(SNAPSHOT_RESOURCE_ID,
                           self._volume.creation_data.source_uri)
                           self._volume.creation_data.source_uri)
             return self._provider.block_store.snapshots. \
             return self._provider.block_store.snapshots. \
@@ -705,7 +683,7 @@ class AzureSnapshot(BaseSnapshot):
         """
         """
         Set the snapshot name.
         Set the snapshot name.
         """
         """
-        self.assert_valid_resource_name(value)
+        # self._snapshot.name = value
         self._snapshot.tags.update(Name=value)
         self._snapshot.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
             update_snapshot_tags(self.id,
             update_snapshot_tags(self.id,
@@ -728,7 +706,7 @@ class AzureSnapshot(BaseSnapshot):
 
 
     @property
     @property
     def volume_id(self):
     def volume_id(self):
-        url_params = azure_helpers.\
+        url_params = azure_helpers. \
             parse_url(VOLUME_RESOURCE_ID,
             parse_url(VOLUME_RESOURCE_ID,
                       self._snapshot.creation_data.source_uri)
                       self._snapshot.creation_data.source_uri)
         return url_params.get(VOLUME_NAME)
         return url_params.get(VOLUME_NAME)
@@ -822,7 +800,6 @@ class AzureMachineImage(BaseMachineImage):
         """
         """
         Set the image name.
         Set the image name.
         """
         """
-        self.assert_valid_resource_name(value)
         self._image.tags.update(Name=value)
         self._image.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
             update_image_tags(self.id, self._image.tags)
             update_image_tags(self.id, self._image.tags)
@@ -876,7 +853,7 @@ class AzureMachineImage(BaseMachineImage):
         for its latest state.
         for its latest state.
         """
         """
         try:
         try:
-            self._image = self._provider.azure_client\
+            self._image = self._provider.azure_client \
                 .get_image(self.id)
                 .get_image(self.id)
             self._state = self._image.provisioning_state
             self._state = self._image.provisioning_state
         except CloudError as cloudError:
         except CloudError as cloudError:
@@ -921,10 +898,9 @@ class AzureNetwork(BaseNetwork):
         """
         """
         Set the network name.
         Set the network name.
         """
         """
-        self.assert_valid_resource_name(value)
         self._network.tags.update(Name=value)
         self._network.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
-            update_network_tags(self.id, self._network)
+            update_network_tags(self.id, self._network.tags)
 
 
     @property
     @property
     def external(self):
     def external(self):
@@ -945,7 +921,7 @@ class AzureNetwork(BaseNetwork):
         for its latest state.
         for its latest state.
         """
         """
         try:
         try:
-            self._network = self._provider.azure_client.\
+            self._network = self._provider.azure_client. \
                 get_network(self.id)
                 get_network(self.id)
             self._state = self._network.provisioning_state
             self._state = self._network.provisioning_state
         except (CloudError, ValueError) as cloudError:
         except (CloudError, ValueError) as cloudError:
@@ -967,20 +943,19 @@ class AzureNetwork(BaseNetwork):
         Delete an existing network.
         Delete an existing network.
         """
         """
         try:
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_network(self.id)
                 delete_network(self.id)
             return True
             return True
         except CloudError as cloudError:
         except CloudError as cloudError:
             log.exception(cloudError.message)
             log.exception(cloudError.message)
             return False
             return False
 
 
-    @property
     def subnets(self):
     def subnets(self):
         """
         """
         List all the subnets in this network
         List all the subnets in this network
         :return:
         :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):
     def create_subnet(self, cidr_block, name=None, zone=None):
         """
         """
@@ -990,12 +965,11 @@ class AzureNetwork(BaseNetwork):
         :param zone:
         :param zone:
         :return:
         :return:
         """
         """
-        return self._provider.networking.subnets. \
+        return self._provider.network.subnets. \
             create(network=self.id, cidr_block=cidr_block, name=name)
             create(network=self.id, cidr_block=cidr_block, name=name)
 
 
 
 
 class AzureFloatingIP(BaseFloatingIP):
 class AzureFloatingIP(BaseFloatingIP):
-
     def __init__(self, provider, floating_ip):
     def __init__(self, provider, floating_ip):
         super(AzureFloatingIP, self).__init__(provider)
         super(AzureFloatingIP, self).__init__(provider)
         self._ip = floating_ip
         self._ip = floating_ip
@@ -1062,6 +1036,7 @@ class AzurePlacementZone(BasePlacementZone):
     As Azure does not provide zones (limited support), we are mapping the
     As Azure does not provide zones (limited support), we are mapping the
     region information in the zones.
     region information in the zones.
     """
     """
+
     def __init__(self, provider, zone, region):
     def __init__(self, provider, zone, region):
         super(AzurePlacementZone, self).__init__(provider)
         super(AzurePlacementZone, self).__init__(provider)
         self._azure_zone = zone
         self._azure_zone = zone
@@ -1097,18 +1072,12 @@ class AzurePlacementZone(BasePlacementZone):
 
 
 
 
 class AzureSubnet(BaseSubnet):
 class AzureSubnet(BaseSubnet):
-    _SUBNET_STATE_MAP = {
-        'InProgress': SubnetState.PENDING,
-        'Succeeded': SubnetState.AVAILABLE,
-    }
-
     def __init__(self, provider, subnet):
     def __init__(self, provider, subnet):
         super(AzureSubnet, self).__init__(provider)
         super(AzureSubnet, self).__init__(provider)
         self._subnet = subnet
         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)
             .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))
             get_network(self._url_params.get(NETWORK_NAME))
 
 
     @property
     @property
@@ -1130,7 +1099,7 @@ class AzureSubnet(BaseSubnet):
 
 
     @property
     @property
     def zone(self):
     def zone(self):
-        region = self._provider.\
+        region = self._provider. \
             compute.regions.get(self._network.location)
             compute.regions.get(self._network.location)
         return region.zones[0]
         return region.zones[0]
 
 
@@ -1156,29 +1125,8 @@ class AzureSubnet(BaseSubnet):
             log.exception(cloudError.message)
             log.exception(cloudError.message)
             return False
             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):
 class AzureInstance(BaseInstance):
-
     INSTANCE_STATE_MAP = {
     INSTANCE_STATE_MAP = {
         'InProgress': InstanceState.PENDING,
         'InProgress': InstanceState.PENDING,
         'Creating': InstanceState.PENDING,
         'Creating': InstanceState.PENDING,
@@ -1217,7 +1165,7 @@ class AzureInstance(BaseInstance):
         self._public_ip_ids = []
         self._public_ip_ids = []
         self._nic_ids = []
         self._nic_ids = []
         for nic in self._vm.network_profile.network_interfaces:
         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)
                 parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic.id)
             nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
             nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
             self._nic_ids.append(nic_name)
             self._nic_ids.append(nic_name)
@@ -1226,17 +1174,17 @@ class AzureInstance(BaseInstance):
                 sg_params = azure_helpers. \
                 sg_params = azure_helpers. \
                     parse_url(SECURITY_GROUP_RESOURCE_ID,
                     parse_url(SECURITY_GROUP_RESOURCE_ID,
                               nic.network_security_group.id)
                               nic.network_security_group.id)
-                self._security_group_ids.\
+                self._security_group_ids. \
                     append(sg_params.get(SECURITY_GROUP_NAME))
                     append(sg_params.get(SECURITY_GROUP_NAME))
             if nic.ip_configurations:
             if nic.ip_configurations:
                 for ip_config in nic.ip_configurations:
                 for ip_config in nic.ip_configurations:
                     self._private_ips.append(ip_config.private_ip_address)
                     self._private_ips.append(ip_config.private_ip_address)
                     if ip_config.public_ip_address:
                     if ip_config.public_ip_address:
-                        url_params = azure_helpers.\
+                        url_params = azure_helpers. \
                             parse_url(PUBLIC_IP_RESOURCE_ID,
                             parse_url(PUBLIC_IP_RESOURCE_ID,
                                       ip_config.public_ip_address.id)
                                       ip_config.public_ip_address.id)
                         public_ip_name = url_params.get(PUBLIC_IP_NAME)
                         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)
                             get_public_ip(public_ip_name)
                         self._public_ip_ids.append(public_ip_name)
                         self._public_ip_ids.append(public_ip_name)
                         self._public_ips.append(public_ip.ip_address)
                         self._public_ips.append(public_ip.ip_address)
@@ -1267,10 +1215,9 @@ class AzureInstance(BaseInstance):
         """
         """
         Set the instance name.
         Set the instance name.
         """
         """
-        self.assert_valid_resource_name(value)
         self._vm.tags.update(Name=value)
         self._vm.tags.update(Name=value)
         self._provider.azure_client. \
         self._provider.azure_client. \
-            update_vm_tags(self.id, self._vm)
+            update_vm_tags(self.id, self._vm.tags)
 
 
     @property
     @property
     def public_ips(self):
     def public_ips(self):
@@ -1323,15 +1270,15 @@ class AzureInstance(BaseInstance):
             self._provider.azure_client.delete_public_ip(public_ip_id)
             self._provider.azure_client.delete_public_ip(public_ip_id)
         for data_disk in self._vm.storage_profile.data_disks:
         for data_disk in self._vm.storage_profile.data_disks:
             if data_disk.managed_disk:
             if data_disk.managed_disk:
-                disk_params = azure_helpers.\
+                disk_params = azure_helpers. \
                     parse_url(VOLUME_RESOURCE_ID,
                     parse_url(VOLUME_RESOURCE_ID,
                               data_disk.managed_disk.id)
                               data_disk.managed_disk.id)
-                disk = self._provider.azure_client.\
+                disk = self._provider.azure_client. \
                     get_disk(disk_params.get(VOLUME_NAME))
                     get_disk(disk_params.get(VOLUME_NAME))
                 if disk and disk.tags \
                 if disk and disk.tags \
                         and disk.tags.get('delete_on_terminate',
                         and disk.tags.get('delete_on_terminate',
                                           'False') == 'True':
                                           'False') == 'True':
-                    self._provider.azure_client.\
+                    self._provider.azure_client. \
                         delete_disk(disk_params.get(VOLUME_NAME))
                         delete_disk(disk_params.get(VOLUME_NAME))
         if self._vm.storage_profile.os_disk.managed_disk:
         if self._vm.storage_profile.os_disk.managed_disk:
             disk_params = azure_helpers. \
             disk_params = azure_helpers. \
@@ -1396,8 +1343,6 @@ class AzureInstance(BaseInstance):
         the private key file path
         the private key file path
         """
         """
 
 
-        self.assert_valid_resource_name(name)
-
         if not self._state == 'VM generalized':
         if not self._state == 'VM generalized':
             if not self._state == 'VM running':
             if not self._state == 'VM running':
                 self._provider.azure_client.start_vm(self.id)
                 self._provider.azure_client.start_vm(self.id)
@@ -1416,9 +1361,9 @@ class AzureInstance(BaseInstance):
             },
             },
             'tags': {'Name': name}
             'tags': {'Name': name}
         }
         }
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             create_image(name, create_params)
             create_image(name, create_params)
-        image = self._provider.azure_client.\
+        image = self._provider.azure_client. \
             get_image(name)
             get_image(name)
 
 
         return AzureMachineImage(self._provider, image)
         return AzureMachineImage(self._provider, image)
@@ -1427,7 +1372,7 @@ class AzureInstance(BaseInstance):
         cnopts = pysftp.CnOpts()
         cnopts = pysftp.CnOpts()
         cnopts.hostkeys = None
         cnopts.hostkeys = None
         if private_key_path:
         if private_key_path:
-            with pysftp.\
+            with pysftp. \
                     Connection(self.public_ips[0],
                     Connection(self.public_ips[0],
                                username=self._provider.vm_default_user_name,
                                username=self._provider.vm_default_user_name,
                                cnopts=cnopts,
                                cnopts=cnopts,
@@ -1493,13 +1438,13 @@ class AzureInstance(BaseInstance):
             nic.network_security_group = NetworkSecurityGroup()
             nic.network_security_group = NetworkSecurityGroup()
             nic.network_security_group.id = sg.resource_id
             nic.network_security_group.id = sg.resource_id
         else:
         else:
-            sg_url_params = azure_helpers.\
+            sg_url_params = azure_helpers. \
                 parse_url(SECURITY_GROUP_RESOURCE_ID,
                 parse_url(SECURITY_GROUP_RESOURCE_ID,
                           nic.network_security_group.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))
                 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),
                 create('{0}-{1}'.format(sg.name, existing_sg.name),
                        'Merged security groups {0} and {1}'.
                        'Merged security groups {0} and {1}'.
                        format(sg.name, existing_sg.name))
                        format(sg.name, existing_sg.name))
@@ -1527,7 +1472,7 @@ class AzureInstance(BaseInstance):
         sg = (self._provicer.security.security_groups.get(sg)
         sg = (self._provicer.security.security_groups.get(sg)
               if isinstance(sg, str) else sg)
               if isinstance(sg, str) else sg)
         if nic.network_security_group and \
         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
             nic.network_security_group = None
             self._provider.azure_client.create_nic(self._nic_ids[0], nic)
             self._provider.azure_client.create_nic(self._nic_ids[0], nic)
 
 
@@ -1573,13 +1518,11 @@ class AzureInstance(BaseInstance):
 
 
 
 
 class AzureLaunchConfig(BaseLaunchConfig):
 class AzureLaunchConfig(BaseLaunchConfig):
-
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureLaunchConfig, self).__init__(provider)
         super(AzureLaunchConfig, self).__init__(provider)
 
 
 
 
 class AzureInstanceType(BaseInstanceType):
 class AzureInstanceType(BaseInstanceType):
-
     def __init__(self, provider, instance_type):
     def __init__(self, provider, instance_type):
         super(AzureInstanceType, self).__init__(provider)
         super(AzureInstanceType, self).__init__(provider)
         self._inst_type = instance_type
         self._inst_type = instance_type
@@ -1628,13 +1571,12 @@ class AzureInstanceType(BaseInstanceType):
     @property
     @property
     def extra_data(self):
     def extra_data(self):
         return {
         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):
 class AzureKeyPair(BaseKeyPair):
-
     def __init__(self, provider, key_pair):
     def __init__(self, provider, key_pair):
         super(AzureKeyPair, self).__init__(provider, key_pair)
         super(AzureKeyPair, self).__init__(provider, key_pair)
         self._material = None
         self._material = None
@@ -1664,7 +1606,7 @@ class AzureKeyPair(BaseKeyPair):
 
 
     def delete(self):
     def delete(self):
         try:
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_public_key(self._key_pair)
                 delete_public_key(self._key_pair)
             return True
             return True
         except CloudError:
         except CloudError:
@@ -1672,19 +1614,24 @@ class AzureKeyPair(BaseKeyPair):
 
 
 
 
 class AzureRouter(BaseRouter):
 class AzureRouter(BaseRouter):
-    def __init__(self, provider, route_table):
+    def __init__(self, provider, router):
         super(AzureRouter, self).__init__(provider)
         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
     @property
     def id(self):
     def id(self):
-        return self._route_table.name
+        return self._name
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
-        return self._route_table.id
+        pass
 
 
     @property
     @property
     def name(self):
     def name(self):
@@ -1693,7 +1640,7 @@ class AzureRouter(BaseRouter):
 
 
         .. note:: the router must have a (case sensitive) tag ``Name``
         .. 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
     @name.setter
     # pylint:disable=arguments-differ
     # pylint:disable=arguments-differ
@@ -1701,98 +1648,47 @@ class AzureRouter(BaseRouter):
         """
         """
         Set the router name.
         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):
     def refresh(self):
-        self._route_table = self._provider.azure_client. \
-            get_route_table(self._route_table.name)
+        pass
 
 
     @property
     @property
     def state(self):
     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
     @property
     def network_id(self):
     def network_id(self):
-        return None
+        return self._network_id
 
 
     def delete(self):
     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
         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
         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
         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.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBlockStoreService, \
 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
     BaseSnapshotService, BaseSubnetService, BaseVolumeService
 from cloudbridge.cloud.interfaces import InvalidConfigurationException
 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 msrestazure.azure_exceptions import CloudError
 
 
 from .resources import AzureBucket, AzureFloatingIP, \
 from .resources import AzureBucket, AzureFloatingIP, \
-    AzureInstance, AzureInstanceType, \
-    AzureInternetGateway, AzureKeyPair, \
+    AzureInstance, AzureInstanceType, AzureKeyPair, \
     AzureLaunchConfig, AzureMachineImage, \
     AzureLaunchConfig, AzureMachineImage, \
     AzureNetwork, AzureRegion, AzureRouter, AzureSecurityGroup, \
     AzureNetwork, AzureRegion, AzureRouter, AzureSecurityGroup, \
     AzureSnapshot, AzureSubnet, AzureVolume
     AzureSnapshot, AzureSubnet, AzureVolume
@@ -108,7 +106,6 @@ class AzureSecurityGroupService(BaseSecurityGroupService):
         :rtype: ``object`` of :class:`.SecurityGroup`
         :rtype: ``object`` of :class:`.SecurityGroup`
         :return:  A SecurityGroup instance or ``None`` if one was not created.
         :return:  A SecurityGroup instance or ``None`` if one was not created.
         """
         """
-        AzureSecurityGroup.assert_valid_resource_name(name)
         parameters = {"location": self.provider.region_name,
         parameters = {"location": self.provider.region_name,
                       'tags': {'Name': name}}
                       'tags': {'Name': name}}
 
 
@@ -162,7 +159,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
 
     def get(self, key_pair_id):
     def get(self, key_pair_id):
         try:
         try:
-            key_pair = self.provider.azure_client.\
+            key_pair = self.provider.azure_client. \
                 get_public_key(key_pair_id)
                 get_public_key(key_pair_id)
 
 
             if key_pair:
             if key_pair:
@@ -175,7 +172,7 @@ class AzureKeyPairService(BaseKeyPairService):
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         key_pairs = [AzureKeyPair(self.provider, key_pair) for key_pair in
         key_pairs = [AzureKeyPair(self.provider, key_pair) for key_pair in
                      self.provider.azure_client.
                      self.provider.azure_client.
-                     list_public_keys(AzureKeyPairService.PARTITION_KEY)]
+                         list_public_keys(AzureKeyPairService.PARTITION_KEY)]
         return ClientPagedResultList(self.provider, key_pairs, limit, marker)
         return ClientPagedResultList(self.provider, key_pairs, limit, marker)
 
 
     def find(self, name, limit=None, marker=None):
     def find(self, name, limit=None, marker=None):
@@ -185,7 +182,6 @@ class AzureKeyPairService(BaseKeyPairService):
                                      limit, marker)
                                      limit, marker)
 
 
     def create(self, name):
     def create(self, name):
-        AzureKeyPair.assert_valid_resource_name(name)
 
 
         key_pair = self.get(name)
         key_pair = self.get(name)
 
 
@@ -196,11 +192,11 @@ class AzureKeyPairService(BaseKeyPairService):
         private_key_str, public_key_str = azure_helpers.gen_key_pair()
         private_key_str, public_key_str = azure_helpers.gen_key_pair()
 
 
         entity = {
         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)
         self.provider.azure_client.create_public_key(entity)
 
 
@@ -251,7 +247,6 @@ class AzureObjectStoreService(BaseObjectStoreService):
         """
         """
         Create a new bucket.
         Create a new bucket.
         """
         """
-        AzureBucket.assert_valid_resource_name(name)
         bucket = self.provider.azure_client.create_container(name.lower())
         bucket = self.provider.azure_client.create_container(name.lower())
         return AzureBucket(self.provider, bucket)
         return AzureBucket(self.provider, bucket)
 
 
@@ -313,7 +308,6 @@ class AzureVolumeService(BaseVolumeService):
         """
         """
         Creates a new volume.
         Creates a new volume.
         """
         """
-        AzureVolume.assert_valid_resource_name(name)
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
         snapshot = (self.provider.block_store.snapshots.get(snapshot)
         snapshot = (self.provider.block_store.snapshots.get(snapshot)
                     if snapshot and isinstance(snapshot, str) else snapshot)
                     if snapshot and isinstance(snapshot, str) else snapshot)
@@ -392,7 +386,6 @@ class AzureSnapshotService(BaseSnapshotService):
         """
         """
         Creates a new snapshot of a given volume.
         Creates a new snapshot of a given volume.
         """
         """
-        AzureSnapshot.assert_valid_resource_name(name)
         volume = (self.provider.block_store.volumes.get(volume)
         volume = (self.provider.block_store.volumes.get(volume)
                   if isinstance(volume, str) else volume)
                   if isinstance(volume, str) else volume)
 
 
@@ -453,10 +446,7 @@ class AzureInstanceService(BaseInstanceService):
                key_pair=None, security_groups=None, user_data=None,
                key_pair=None, security_groups=None, user_data=None,
                launch_config=None, **kwargs):
                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.
         # Key_pair is mandatory in azure and it should not be None.
         if key_pair:
         if key_pair:
@@ -473,9 +463,9 @@ class AzureInstanceService(BaseInstanceService):
             isinstance(instance_type, InstanceType) else instance_type
             isinstance(instance_type, InstanceType) else instance_type
 
 
         if not subnet:
         if not subnet:
-            subnet = self.provider.networking.subnets.get_or_create_default()
+            subnet = self.provider.network.subnets.get_or_create_default()
         else:
         else:
-            subnet = (self.provider.networking.subnets.get(subnet)
+            subnet = (self.provider.network.subnets.get(subnet)
                       if isinstance(subnet, str) else subnet)
                       if isinstance(subnet, str) else subnet)
 
 
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -493,15 +483,15 @@ class AzureInstanceService(BaseInstanceService):
             root_disk_size = None
             root_disk_size = None
 
 
         nic_params = {
         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:
         if security_group_id:
             nic_params['network_security_group'] = {
             nic_params['network_security_group'] = {
@@ -513,8 +503,8 @@ class AzureInstanceService(BaseInstanceService):
         )
         )
         # #! indicates shell script
         # #! indicates shell script
         ud = '#cloud-config\n' + user_data \
         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 = {
         params = {
             'location': zone_id or self._provider.region_name,
             'location': zone_id or self._provider.region_name,
@@ -522,16 +512,16 @@ class AzureInstanceService(BaseInstanceService):
                 'admin_username': self.provider.vm_default_user_name,
                 'admin_username': self.provider.vm_default_user_name,
                 'computer_name': instance_name,
                 'computer_name': instance_name,
                 'linux_configuration': {
                 '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': {
             'hardware_profile': {
                 'vm_size': instance_size
                 'vm_size': instance_size
@@ -603,12 +593,12 @@ class AzureInstanceService(BaseInstanceService):
                 security_group_id = security_groups[0].resource_id
                 security_group_id = security_groups[0].resource_id
             else:
             else:
                 security_groups_ids = security_groups
                 security_groups_ids = security_groups
-                seuciry_group = self.provider.security.\
+                seuciry_group = self.provider.security. \
                     security_groups.get(security_groups[0])
                     security_groups.get(security_groups[0])
                 security_group_id = seuciry_group.resource_id
                 security_group_id = seuciry_group.resource_id
 
 
             if len(security_groups) > 1:
             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}'.
                     create('{0}-sg'.format(name), 'Merge security groups {0}'.
                            format(','.join(security_groups_ids)))
                            format(','.join(security_groups_ids)))
 
 
@@ -647,7 +637,7 @@ class AzureInstanceService(BaseInstanceService):
             # This method uses the azure tags functionality to store
             # This method uses the azure tags functionality to store
             # the  delete_on_terminate option when the virtual machine
             # the  delete_on_terminate option when the virtual machine
             # is deleted, we parse the tags and delete accordingly
             # is deleted, we parse the tags and delete accordingly
-            self.provider.azure_client.\
+            self.provider.azure_client. \
                 update_disk_tags(volume.id, volume.tags)
                 update_disk_tags(volume.id, volume.tags)
 
 
         for device in launch_config.block_devices:
         for device in launch_config.block_devices:
@@ -773,7 +763,6 @@ class AzureImageService(BaseImageService):
 
 
 
 
 class AzureInstanceTypesService(BaseInstanceTypesService):
 class AzureInstanceTypesService(BaseInstanceTypesService):
-
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureInstanceTypesService, self).__init__(provider)
         super(AzureInstanceTypesService, self).__init__(provider)
 
 
@@ -792,34 +781,10 @@ class AzureInstanceTypesService(BaseInstanceTypesService):
                                      limit=limit, marker=marker)
                                      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):
 class AzureNetworkService(BaseNetworkService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureNetworkService, self).__init__(provider)
         super(AzureNetworkService, self).__init__(provider)
+        self._subnet_svc = AzureSubnetService(self.provider)
 
 
     def get(self, network_id):
     def get(self, network_id):
         try:
         try:
@@ -840,33 +805,25 @@ class AzureNetworkService(BaseNetworkService):
         return ClientPagedResultList(self.provider, networks,
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
                                      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
         # Azure requires CIDR block to be specified when creating a network
         # so set a default one and use the largest allowed netmask.
         # so set a default one and use the largest allowed netmask.
         network_name = AzureNetwork.CB_DEFAULT_NETWORK_NAME
         network_name = AzureNetwork.CB_DEFAULT_NETWORK_NAME
         if name:
         if name:
             network_name = "{0}-{1}".format(name, uuid.uuid4().hex[:6])
             network_name = "{0}-{1}".format(name, uuid.uuid4().hex[:6])
 
 
-        AzureNetwork.assert_valid_resource_name(network_name)
-
         params = {
         params = {
             'location': self.provider.azure_client.region_name,
             'location': self.provider.azure_client.region_name,
             'address_space': {
             'address_space': {
-                'address_prefixes': [cidr_block]
+                'address_prefixes': ['10.0.0.0/16']
             },
             },
             'tags': {'Name': name or AzureNetwork.CB_DEFAULT_NETWORK_NAME}
             'tags': {'Name': name or AzureNetwork.CB_DEFAULT_NETWORK_NAME}
         }
         }
+
         self.provider.azure_client.create_network(network_name, params)
         self.provider.azure_client.create_network(network_name, params)
         network = self.provider.azure_client.get_network(network_name)
         network = self.provider.azure_client.get_network(network_name)
         cb_network = AzureNetwork(self.provider, network)
         cb_network = AzureNetwork(self.provider, network)
+
         return cb_network
         return cb_network
 
 
     def create_floating_ip(self):
     def create_floating_ip(self):
@@ -877,20 +834,32 @@ class AzureNetworkService(BaseNetworkService):
             'public_ip_allocation_method': 'Static'
             '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)
             create_floating_ip(public_ip_address_name, public_ip_parameters)
         return AzureFloatingIP(self.provider, floating_ip)
         return AzureFloatingIP(self.provider, floating_ip)
 
 
     @property
     @property
+    def subnets(self):
+        return self._subnet_svc
+
     def floating_ips(self, network_id=None):
     def floating_ips(self, network_id=None):
         """
         """
                List all floating ips.
                List all floating ips.
         """
         """
         floating_ips = [AzureFloatingIP(self.provider, floating_ip)
         floating_ips = [AzureFloatingIP(self.provider, floating_ip)
                         for floating_ip in self.provider.azure_client.
                         for floating_ip in self.provider.azure_client.
-                        list_floating_ips()]
+                            list_floating_ips()]
+
         return ClientPagedResultList(self.provider, 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):
     def delete(self, network_id):
         """
         """
                 Delete an existing network.
                 Delete an existing network.
@@ -928,7 +897,6 @@ class AzureRegionService(BaseRegionService):
 
 
 
 
 class AzureSubnetService(BaseSubnetService):
 class AzureSubnetService(BaseSubnetService):
-
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureSubnetService, self).__init__(provider)
         super(AzureSubnetService, self).__init__(provider)
 
 
@@ -944,9 +912,7 @@ class AzureSubnetService(BaseSubnetService):
         """
         """
         try:
         try:
             subnet_id_parts = subnet_id.split('|$|')
             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])
                 get_subnet(subnet_id_parts[0], subnet_id_parts[1])
             return AzureSubnet(self.provider,
             return AzureSubnet(self.provider,
                                azure_subnet) if azure_subnet else None
                                azure_subnet) if azure_subnet else None
@@ -983,7 +949,6 @@ class AzureSubnetService(BaseSubnetService):
         """
         """
         Create subnet
         Create subnet
         """
         """
-        AzureSubnet.assert_valid_resource_name(name)
         network_id = network.id \
         network_id = network.id \
             if isinstance(network, Network) else network
             if isinstance(network, Network) else network
 
 
@@ -992,14 +957,14 @@ class AzureSubnetService(BaseSubnetService):
         else:
         else:
             subnet_name = name
             subnet_name = name
 
 
-        subnet_info = self.provider.azure_client\
+        subnet_info = self.provider.azure_client \
             .create_subnet(
             .create_subnet(
-                            network_id,
-                            subnet_name,
-                            {
-                                'address_prefix': cidr_block
-                            }
-                          )
+            network_id,
+            subnet_name,
+            {
+                'address_prefix': cidr_block
+            }
+        )
 
 
         return AzureSubnet(self.provider, subnet_info)
         return AzureSubnet(self.provider, subnet_info)
 
 
@@ -1022,20 +987,18 @@ class AzureSubnetService(BaseSubnetService):
             return AzureSubnet(self.provider, subnet)
             return AzureSubnet(self.provider, subnet)
 
 
         # No provider-default Subnet exists, try to create it (net + subnets)
         # No provider-default Subnet exists, try to create it (net + subnets)
-        default_net_name = AzureNetwork.CB_DEFAULT_NETWORK_NAME
         try:
         try:
             network = self.provider.azure_client \
             network = self.provider.azure_client \
-                .get_network(default_net_name)
+                .get_network(AzureNetwork.CB_DEFAULT_NETWORK_NAME)
         except CloudError:
         except CloudError:
             # Azure raises the cloud error if the resource not available
             # Azure raises the cloud error if the resource not available
             pass
             pass
 
 
         if not network:
         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(
         subnet = self.provider.azure_client.create_subnet(
-            network.id,
+            AzureNetwork.CB_DEFAULT_NETWORK_NAME,
             AzureSubnet.CB_DEFAULT_SUBNET_NAME,
             AzureSubnet.CB_DEFAULT_SUBNET_NAME,
             {'address_prefix': default_cdir}
             {'address_prefix': default_cdir}
         )
         )
@@ -1050,65 +1013,10 @@ class AzureSubnetService(BaseSubnetService):
 
 
             subnet_id = subnet.id if isinstance(subnet, Subnet) else subnet
             subnet_id = subnet.id if isinstance(subnet, Subnet) else subnet
             subnet_id_parts = subnet_id.split('|$|')
             subnet_id_parts = subnet_id.split('|$|')
-            self.provider.azure_client.\
+            self.provider.azure_client. \
                 delete_subnet(subnet_id_parts[0], subnet_id_parts[1])
                 delete_subnet(subnet_id_parts[0], subnet_id_parts[1])
             return True
             return True
         except CloudError as cloudError:
         except CloudError as cloudError:
             # Azure raises the cloud error if the resource not available
             # Azure raises the cloud error if the resource not available
             log.exception(cloudError.message)
             log.exception(cloudError.message)
             return False
             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()
         inst_type = [t for t in self.provider.compute.instance_types.list()
                      if t.name == 'Standard_DS1_v2'][0]
                      if t.name == 'Standard_DS1_v2'][0]
         sg_id = 'sg2'
         sg_id = 'sg2'
-        sg = self.provider.security.\
+        sg = self.provider.security. \
             security_groups.get(sg_id)
             security_groups.get(sg_id)
 
 
         subnet = self.provider.network.subnets.list()[0]
         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):
 class AzureInstanceTypeServiceTestCase(ProviderTestBase):
-
     @helpers.skipIfNoService(['compute.instance_types'])
     @helpers.skipIfNoService(['compute.instance_types'])
     def test_azure_instance_type_list(self):
     def test_azure_instance_type_list(self):
         instance_type_list = self.provider.compute.instance_types.list()
         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'])
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_azure_keypair_get_notExist(self):
     def test_azure_keypair_get_notExist(self):
         keypair_id = 'KeyPairNotExist'
         keypair_id = 'KeyPairNotExist'
-        keypair_get_not_exist = self.provider.security.\
+        keypair_get_not_exist = self.provider.security. \
             key_pairs.get(keypair_id)
             key_pairs.get(keypair_id)
         print("Get Key Pair Not Exist - " + str(keypair_get_not_exist))
         print("Get Key Pair Not Exist - " + str(keypair_get_not_exist))
         self.assertIsNone(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):
     def test_azure_create_and_delete_from_resource_subnet(self):
         network_id = 'CloudBridgeNet4'
         network_id = 'CloudBridgeNet4'
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.create(network=network_id,
             subnets.create(network=network_id,
                            cidr_block='10.0.0.0/24')
                            cidr_block='10.0.0.0/24')
         self.assertIsNotNone(subnet.zone)
         self.assertIsNotNone(subnet.zone)
@@ -62,7 +62,7 @@ class AzureSubnetServiceTestCase(ProviderTestBase):
 
 
     def test_azure_create_and_delete_from_service_subnet(self):
     def test_azure_create_and_delete_from_service_subnet(self):
         network_id = 'CloudBridgeNet4'
         network_id = 'CloudBridgeNet4'
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.create(network=network_id,
             subnets.create(network=network_id,
                            name='test', cidr_block='10.0.0.0/24')
                            name='test', cidr_block='10.0.0.0/24')
         self.assertIsNotNone(subnet)
         self.assertIsNotNone(subnet)
@@ -72,7 +72,7 @@ class AzureSubnetServiceTestCase(ProviderTestBase):
         self.assertFalse(deleted)
         self.assertFalse(deleted)
 
 
     def test_azure_create_or_get_default_subnet(self):
     def test_azure_create_or_get_default_subnet(self):
-        subnet = self.provider.network.\
+        subnet = self.provider.network. \
             subnets.get_or_create_default()
             subnets.get_or_create_default()
         self.assertIsNotNone(subnet)
         self.assertIsNotNone(subnet)
         subnet = self.provider.network. \
         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_SUBSCRIPTION_ID   AZURE_REGION_NAME
 AZURE_CLIENT_ID		    AZURE_RESOURCE_GROUP
 AZURE_CLIENT_ID		    AZURE_RESOURCE_GROUP
 AZURE_SECRET		    AZURE_STORAGE_ACCOUNT_NAME
 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
 REQS_FULL = REQS_BASE + REQS_AWS + REQS_AZURE + REQS_OPENSTACK
 # httpretty is required with/for moto 1.0.0 or AWS tests fail
 # httpretty is required with/for moto 1.0.0 or AWS tests fail
 REQS_DEV = ([
 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(
 setup(
     name='cloudbridge',
     name='cloudbridge',

+ 1 - 1
test/test_image_service.py

@@ -35,7 +35,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
             # check image size
             # check image size
             img.refresh()
             img.refresh()
             self.assertGreater(img.min_disk, 0, "Minimum disk"
             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(
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
                 test_instance, net)):
                 test_instance, net)):

+ 2 - 3
tox.ini

@@ -15,9 +15,8 @@
 envlist = {py27,py36,pypy}-{aws,azure,openstack}
 envlist = {py27,py36,pypy}-{aws,azure,openstack}
 
 
 [testenv]
 [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 =
 setenv =
     aws: CB_TEST_PROVIDER=aws
     aws: CB_TEST_PROVIDER=aws
     azure: CB_TEST_PROVIDER=azure
     azure: CB_TEST_PROVIDER=azure