2
0
almahmoud 7 жил өмнө
parent
commit
840a9de035

+ 28 - 0
cloudbridge/cloud/providers/gce/helpers.py

@@ -7,6 +7,8 @@ from googleapiclient.errors import HttpError
 
 import tenacity
 
+from cloudbridge.cloud.interfaces.exceptions import ProviderInternalException
+
 
 def gce_projects(provider):
     return provider.gce_compute.projects()
@@ -109,3 +111,29 @@ def get_metadata_item_value(provider, key):
         return entries[-1]
     else:
         return None
+
+
+def remove_metadata_item(provider, key):
+    def _remove_metadata_by_key(metadata):
+        items = metadata.get('items', [])
+        # No metadata to delete
+        if not items:
+            return False
+        else:
+            entries = [item for item in metadata.get('items', [])
+                       if item['key'] != key]
+
+            # Make sure only one entry is deleted
+            if len(entries) < len(items) - 1:
+                raise ProviderInternalException("Multiple metadata entries "
+                                                "found for the same key {}"
+                                                .format(key))
+            # If none is deleted indicate so by returning False
+            elif len(entries) == len(items):
+                return False
+
+            else:
+                metadata['items'] = entries
+
+    gce_metadata_save_op(provider, _remove_metadata_by_key)
+    return True

+ 1 - 15
cloudbridge/cloud/providers/gce/resources.py

@@ -1351,7 +1351,6 @@ class GCENetwork(BaseNetwork):
     def label(self):
         tag_name = "_".join(["network", self.name, "label"])
         return helpers.get_metadata_item_value(self._provider, tag_name)
-        # TODO: Add removing metadata to delete function
 
     @label.setter
     def label(self, value):
@@ -1434,20 +1433,7 @@ class GCENetwork(BaseNetwork):
         return list(self._provider.networking.subnets.iter(network=self))
 
     def delete(self):
-        try:
-            response = (self._provider
-                            .gce_compute
-                            .networks()
-                            .delete(project=self._provider.project_name,
-                                    network=self.name)
-                            .execute())
-            if 'error' in response:
-                return False
-            self._provider.wait_for_operation(response)
-        except googleapiclient.errors.HttpError as http_error:
-            cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return False
-        return True
+        self._provider.networking.networks.delete(self)
 
     def create_subnet(self, label, cidr_block, zone):
         return self._provider.networking.subnets.create(

+ 36 - 3
cloudbridge/cloud/providers/gce/services.py

@@ -679,12 +679,16 @@ class GCENetworkService(BaseNetworkService):
         return ClientPagedResultList(self._provider, list(matches))
 
     def get_by_name(self, network_name):
-        if network_name is None:
+        # Get already works with name
+        # TODO: Decide if we neet to keep this function altogether/add it
+        # everywhere?
+        if network_name:
+            return self.get(network_name)
+        else:
             return None
-        networks = self.list(filter='name eq %s' % network_name)
-        return None if len(networks) == 0 else networks[0]
 
     def list(self, limit=None, marker=None, filter=None):
+        # TODO: Decide whether we keep filter in 'list'
         networks = []
         try:
             response = (self.provider
@@ -758,6 +762,35 @@ class GCENetworkService(BaseNetworkService):
     def get_or_create_default(self):
         return self._create(GCEFirewallsDelegate.DEFAULT_NETWORK, None, True)
 
+    def delete(self, network):
+        # Accepts network object
+        if isinstance(network, GCENetwork):
+            name = network.name
+        # Accepts both name and ID
+        elif 'googleapis' in network:
+            name = network.split('/')[-1]
+        else:
+            name = network
+        try:
+            response = (self.provider
+                            .gce_compute
+                            .networks()
+                            .delete(project=self.provider.project_name,
+                                    network=name)
+                            .execute())
+            if 'error' in response:
+                return False
+            self.provider.wait_for_operation(response)
+            # Remove label
+            tag_name = "_".join(["network", name, "label"])
+            if not helpers.remove_metadata_item(self.provider, tag_name):
+                log.warning('No label was found associated with this network '
+                            '"{}" when deleted.'.format(network.name))
+        except googleapiclient.errors.HttpError as http_error:
+            log.warning('googleapiclient.errors.HttpError: %s', http_error)
+            return False
+        return True
+
 
 class GCERouterService(BaseRouterService):