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

Reverted networks to accept name instead of label

This is because generating a new network each time results in a
VPCLimitExceeded exception. The default VPC limit is just 5.
Nuwan Goonasekera 7 лет назад
Родитель
Сommit
ac71d29e85

+ 2 - 2
cloudbridge/cloud/base/resources.py

@@ -811,8 +811,8 @@ class BaseGatewayContainer(GatewayContainer, BasePageableObjectMixin):
 
 class BaseNetwork(BaseCloudResource, BaseObjectLifeCycleMixin, Network):
 
-    CB_DEFAULT_NETWORK_LABEL = os.environ.get('CB_DEFAULT_NETWORK_LABEL',
-                                              'cloudbridge-net')
+    CB_DEFAULT_NETWORK_NAME = os.environ.get('CB_DEFAULT_NETWORK_NAME',
+                                             'cloudbridge-net')
 
     def __init__(self, provider):
         super(BaseNetwork, self).__init__(provider)

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

@@ -147,7 +147,7 @@ class CloudProvider(object):
 
             networks = provider.networking.networks.list()
             network = provider.networking.networks.create(
-                           label="DevNet", cidr_block='10.0.0.0/16')
+                           name="DevNet", cidr_block='10.0.0.0/16')
 
         :rtype: :class:`.NetworkingService`
         :return:  a NetworkingService object

+ 4 - 4
cloudbridge/cloud/interfaces/services.py

@@ -628,10 +628,13 @@ class NetworkService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def create(self, cidr_block, label=None):
+    def create(self, name, cidr_block):
         """
         Create a new network.
 
+        :type name: ``str``
+        :param name: A label for the network.
+
         :type cidr_block: ``str``
         :param cidr_block: The cidr block for this network. Some providers
                            will respect this at the network level, while others
@@ -642,9 +645,6 @@ class NetworkService(PageableObjectMixin, CloudService):
                            between a /16 netmask (65,536 IP addresses) and /28
                            netmask (16 IP addresses). e.g. 10.0.0.0/16
 
-        :type label: ``str``
-        :param label: A label for the network.
-
         :rtype: ``object`` of :class:`.Network`
         :return:  A Network object
         """

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

@@ -667,16 +667,16 @@ class AWSNetworkService(BaseNetworkService):
         log.debug("Searching for AWS Network Service %s", label)
         return self.svc.find(filter_name='tag:Name', filter_value=label)
 
-    def create(self, cidr_block, label=None):
+    def create(self, name, cidr_block):
         log.debug("Creating AWS Network Service with the params "
-                  "[label: %s block: %s]", label, cidr_block)
-        AWSNetwork.assert_valid_resource_label(label)
+                  "[name: %s block: %s]", name, cidr_block)
+        AWSNetwork.assert_valid_resource_name(name)
 
         cb_net = self.svc.create('create_vpc', CidrBlock=cidr_block)
         # Wait until ready to tag instance
         cb_net.wait_till_ready()
-        if label:
-            cb_net.label = label
+        if name:
+            cb_net.label = name
         return cb_net
 
 
@@ -752,7 +752,7 @@ class AWSSubnetService(BaseSubnetService):
                     return sn
         # No provider-default Subnet exists, try to create it (net + subnets)
         default_net = self.provider.networking.networks.create(
-            label=AWSNetwork.CB_DEFAULT_NETWORK_LABEL,
+            name=AWSNetwork.CB_DEFAULT_NETWORK_NAME,
             cidr_block='10.0.0.0/16')
         # Create a subnet in each of the region's zones
         region = self.provider.compute.regions.get(self.provider.region_name)

+ 7 - 10
cloudbridge/cloud/providers/azure/services.py

@@ -894,11 +894,8 @@ class AzureNetworkService(BaseNetworkService):
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
 
-    def create(self, cidr_block, label=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._generate_name_from_label(label, 'cb-net')
-
+    def create(self, name, cidr_block):
+        AzureNetwork.assert_valid_resource_name(name)
         params = {
             'location': self.provider.azure_client.region_name,
             'address_space': {
@@ -906,10 +903,10 @@ class AzureNetworkService(BaseNetworkService):
             }
         }
 
-        if label:
-            params.update(tags={'Label': label})
+        if name:
+            params.update(tags={'Label': name})
 
-        az_network = self.provider.azure_client.create_network(network_name,
+        az_network = self.provider.azure_client.create_network(name,
                                                                params)
         cb_network = AzureNetwork(self.provider, az_network)
         return cb_network
@@ -1046,13 +1043,13 @@ class AzureSubnetService(BaseSubnetService):
 
         # No provider-default Subnet exists, try to create it (net + subnets)
         networks = self.provider.networking.networks.find(
-            label=AzureNetwork.CB_DEFAULT_NETWORK_LABEL)
+            label=AzureNetwork.CB_DEFAULT_NETWORK_NAME)
 
         if networks:
             network = networks[0]
         else:
             network = self.provider.networking.networks.create(
-                '10.0.0.0/16', label=AzureNetwork.CB_DEFAULT_NETWORK_LABEL)
+                AzureNetwork.CB_DEFAULT_NETWORK_NAME, '10.0.0.0/16')
 
         subnet = self.create(network, default_cidr,
                              prefix=AzureSubnet.CB_DEFAULT_SUBNET_LABEL)

+ 1 - 1
cloudbridge/cloud/providers/openstack/resources.py

@@ -784,7 +784,7 @@ class OpenStackSnapshot(BaseSnapshot):
         Create a new Volume from this Snapshot.
         """
         vol_label = "from-snap-{0}".format(self.id or self.label)
-        name = self._generate_name_from_label(vol_label)
+        name = self._generate_name_from_label(vol_label, 'cb-vol')
         size = size if size else self._snapshot.size
         os_vol = self._provider.cinder.volumes.create(
             size, name=name, availability_zone=placement,

+ 8 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -810,13 +810,15 @@ class OpenStackNetworkService(BaseNetworkService):
                     .get('networks') if network]
         return ClientPagedResultList(self.provider, networks)
 
-    def create(self, cidr_block, label=None):
+    def create(self, name, cidr_block):
         log.debug("Creating OpenStack Network with the params: "
-                  "[label: %s Cinder Block: %s]", label, cidr_block)
-        OpenStackNetwork.assert_valid_resource_label(label)
-        net_info = {'name': label}
+                  "[name: %s Cinder Block: %s]", name, cidr_block)
+        OpenStackNetwork.assert_valid_resource_name(name)
+        net_info = {'name': name}
         network = self.provider.neutron.create_network({'network': net_info})
-        return OpenStackNetwork(self.provider, network.get('network'))
+        cb_net = OpenStackNetwork(self.provider, network.get('network'))
+        cb_net.label = name
+        return cb_net
 
 
 class OpenStackSubnetService(BaseSubnetService):
@@ -866,7 +868,7 @@ class OpenStackSubnetService(BaseSubnetService):
                 return sn[0]
             # No default; create one
             net = self.provider.networking.networks.create(
-                label=OpenStackNetwork.CB_DEFAULT_NETWORK_LABEL,
+                name=OpenStackNetwork.CB_DEFAULT_NETWORK_NAME,
                 cidr_block='10.0.0.0/16')
             sn = net.create_subnet(
                 label=OpenStackSubnet.CB_DEFAULT_SUBNET_LABEL,

+ 2 - 2
docs/getting_started.rst

@@ -116,8 +116,8 @@ attaching an internet gateway to the subnet via a router.
 
 .. code-block:: python
 
-    net = provider.networking.networks.create(cidr_block='10.0.0.0/16',
-                                              label='my-network')
+    net = provider.networking.networks.create(name='my-network',
+                                              cidr_block='10.0.0.0/16')
     sn = net.create_subnet(cidr_block='10.0.0.0/28', label='my-subnet')
     router = provider.networking.routers.create(network=net, label='my-router')
     router.attach_subnet(sn)

+ 1 - 1
docs/topics/contributor_guide.rst

@@ -8,7 +8,7 @@ CloudBridge Provider.
    :maxdepth: 1
 
     Design Goals <design_goals.rst>
-    Design Decisions <design-decisions.rst>
+    Design Decisions <design_decisions.rst>
     Testing <testing.rst>
     Provider Development Walkthrough <provider_development.rst>
     Release Process <release_process.rst>

+ 0 - 37
docs/topics/design-decisions.rst

@@ -1,37 +0,0 @@
-Design decisions
-~~~~~~~~~~~~~~~~
-
-This document captures outcomes and, in some cases, the through process behind
-some of the design decisions that took place while architecting CloudBridge.
-It is intended as a reference.
-
-- **Require zone parameter when creating a default subnet.**
-
-  Placement zone is required because it is an explicit application decision,
-  even though ideally *default* would not require input. Before requiring it,
-  the implementations would create a subnet in each availability zone and return
-  the first one in the list. This could potentially return different values over
-  time. Another factor influencing the decision was the example of creating a
-  volume followed by creating an instance with presumably the two needing to be
-  in the same zone. By requiring the zone across the board, it is less likely to
-  lead to a miss match. (Related to 63_.)
-
-- **Name property updates will result in cloud-dependent code.**
-
-  Some providers (e.g., GCE, Azure) do not allow names of resources to be
-  changed after a resource has been created. Similarly, AWS does not allow VM
-  firewall (i.e., security group) names to be changed. Providers seem to be
-  gravitating toward use of tags (or labels) to support arbitrary naming and
-  name changes. Yet, OpenStack for example, does not have a concept of resource
-  tags so CloudBridge cannot rely solely on tags. Further, tags do not need to
-  be unique across multiple resources, while names do (at least for some
-  resources, such as vmfirewalls within a private network). Overall, consistency
-  is challenging to achieve with resource renaming. With that, CloudBridge will
-  support resource renaming to the best extent possible and balance between the
-  use of resource name property and resource tags. However, because of the
-  inconsistency of rename functionality across the providers, using the rename
-  capabilities within CloudBridge will lead to cloud-dependent code. (Related to
-  131_.)
-
-  .. _63: https://github.com/CloudVE/cloudbridge/issues/63
-  .. _131: https://github.com/CloudVE/cloudbridge/issues/131

+ 1 - 1
setup.py

@@ -23,7 +23,7 @@ REQS_BASE = [
     'six>=1.10.0',
     'tenacity>=4.12.0'
 ]
-REQS_AWS = ['boto3']
+REQS_AWS = ['boto3<1.8.0']
 # Install azure>=3.0.0 package to find which of the azure libraries listed
 # below are compatible with each other. List individual libraries instead
 # of using the azure umbrella package to speed up installation.

+ 4 - 4
test/helpers/__init__.py

@@ -112,14 +112,14 @@ def get_provider_test_data(provider, key):
     return None
 
 
-def create_test_network(provider, label):
+def create_test_network(provider, name):
     """
     Create a network with one subnet, returning the network and subnet objects.
     """
-    net = provider.networking.networks.create(label=label,
+    net = provider.networking.networks.create(name=name,
                                               cidr_block='10.0.0.0/16')
     cidr_block = (net.cidr_block).split('/')[0] or '10.0.0.1'
-    sn = net.create_subnet(cidr_block='{0}/28'.format(cidr_block), label=label,
+    sn = net.create_subnet(cidr_block='{0}/28'.format(cidr_block), label=name,
                            zone=get_provider_test_data(provider, 'placement'))
     return net, sn
 
@@ -142,7 +142,7 @@ def get_test_gateway(provider, label):
     """
     net_label = 'cb-testgwnet-{0}'.format(get_uuid())
     net = provider.networking.networks.create(
-        label=net_label, cidr_block='10.0.0.0/16')
+        name=net_label, cidr_block='10.0.0.0/16')
     return net, net.gateways.get_or_create_inet_gateway(label=label)
 
 

+ 6 - 5
test/test_network_service.py

@@ -18,21 +18,22 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
         def create_net(label):
             return self.provider.networking.networks.create(
-                label=label, cidr_block='10.0.0.0/16')
+                name=label, cidr_block='10.0.0.0/16')
 
         def cleanup_net(net):
             if net:
                 self.provider.networking.networks.delete(network_id=net.id)
 
         sit.check_crud(self, self.provider.networking.networks, Network,
-                       "cb-crudnetwork", create_net, cleanup_net)
+                       "cb-crudnetwork", create_net, cleanup_net,
+                       supports_labels=False)
 
     @helpers.skipIfNoService(['networking.networks'])
     def test_network_properties(self):
         label = 'cb-propnetwork-{0}'.format(helpers.get_uuid())
         subnet_label = 'cb-propsubnet-{0}'.format(helpers.get_uuid())
         net = self.provider.networking.networks.create(
-            label=label, cidr_block='10.0.0.0/16')
+            name=label, cidr_block='10.0.0.0/16')
         with helpers.cleanup_action(
             lambda: net.delete()
         ):
@@ -96,7 +97,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
         net_label = 'cb-crudsubnet-{0}'.format(helpers.get_uuid())
         net = self.provider.networking.networks.create(
-            label=net_label, cidr_block='10.0.0.0/16')
+            name=net_label, cidr_block='10.0.0.0/16')
         with helpers.cleanup_action(
             lambda:
                 self.provider.networking.networks.delete(network_id=net.id)
@@ -166,7 +167,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
         gteway = None
         with helpers.cleanup_action(lambda: _cleanup(net, sn, router, gteway)):
             net = self.provider.networking.networks.create(
-                label=label, cidr_block='10.0.0.0/16')
+                name=label, cidr_block='10.0.0.0/16')
             router = self.provider.networking.routers.create(network=net,
                                                              label=label)
             cidr = '10.0.1.0/24'