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

Make snapshots and volumes alos use metadata for labels

Nuwan Goonasekera 7 лет назад
Родитель
Сommit
fd6db4ee82

+ 8 - 21
cloudbridge/cloud/providers/gce/resources.py

@@ -477,6 +477,7 @@ class GCEVMFirewall(BaseVMFirewall):
 
     @label.setter
     def label(self, value):
+        self.assert_valid_resource_label(value)
         tag_name = "_".join(["firewall", self.name, "label"])
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
 
@@ -1059,7 +1060,8 @@ class GCEInstance(BaseInstance):
         key in metadata.
         """
         try:
-            return next(iter(self._provider.security.key_pairs))
+            kp = next(iter(self._provider.security.key_pairs))
+            return kp.id if kp else None
         except StopIteration:
             return None
 
@@ -1365,6 +1367,7 @@ class GCENetwork(BaseNetwork):
 
     @label.setter
     def label(self, value):
+        self.assert_valid_resource_label(value)
         tag_name = "_".join(["network", self.name, "label"])
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
 
@@ -1785,30 +1788,14 @@ class GCESubnet(BaseSubnet):
 
     @property
     def label(self):
-        return self._subnet.get('description')
+        tag_name = "_".join(["subnet", self.name, "label"])
+        return helpers.get_metadata_item_value(self._provider, tag_name)
 
     @label.setter
     def label(self, value):
         self.assert_valid_resource_label(value)
-        request_body = {
-            'description': value.replace(' ', '_').lower(),
-            'fingerprint': self._subnet.get('fingerprint')
-        }
-        try:
-            (self._provider
-                 .gce_compute
-                 .subnetworks()
-                 .patch(project=self._provider.project_name,
-                        region=self.region_name,
-                        subnetwork=self.name,
-                        body=request_body)
-                 .execute())
-        except Exception as e:
-            cb.log.warning('Exception while setting subnet label: %s. '
-                           'Check for invalid characters in label. '
-                           'Should conform to RFC1035.', e)
-            raise e
-        self.refresh()
+        tag_name = "_".join(["subnet", self.name, "label"])
+        helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
 
     @property
     def cidr_block(self):

+ 18 - 23
cloudbridge/cloud/providers/gce/services.py

@@ -533,8 +533,7 @@ class GCEInstanceService(BaseInstanceService):
             'name': GCEInstance._generate_name_from_label(label, 'cb-inst'),
             'machineType': vm_type.resource_url,
             'disks': disks,
-            'networkInterfaces': [network_interface],
-            'labels': {'cblabel': label.replace(' ', '_').lower()}
+            'networkInterfaces': [network_interface]
         }
 
         if vm_firewalls and isinstance(vm_firewalls, list):
@@ -561,7 +560,9 @@ class GCEInstanceService(BaseInstanceService):
             return None
         instance_id = operation.get('targetLink')
         self.provider.wait_for_operation(operation, zone=zone_name)
-        return self.get(instance_id)
+        cb_inst = self.get(instance_id)
+        cb_inst.label = label
+        return cb_inst
 
     def get(self, instance_id):
         """
@@ -715,6 +716,7 @@ class GCENetworkService(BaseNetworkService):
         False: For creating a custom mode VPC network. Subnetworks should be
                created manually.
         """
+        GCENetwork.assert_valid_resource_label(label)
         if create_subnetworks is not None and cidr_block is not None:
             cb.log.warning('cidr_block is ignored in non-legacy networks. '
                            'Auto mode networks use the default CIDR of '
@@ -748,7 +750,6 @@ class GCENetworkService(BaseNetworkService):
         Creates an auto mode VPC network with default subnets. It is possible
         to add additional subnets later.
         """
-        GCENetwork.assert_valid_resource_label(label)
         cb_net = self._create(label, cidr_block, False)
         cb_net.label = label
         return cb_net
@@ -794,14 +795,11 @@ class GCERouterService(BaseRouterService):
     def get(self, router_id):
         return self._get_in_region(router_id)
 
-    def find(self, name, limit=None, marker=None):
-        routers = []
-        for region in self.provider.compute.regions.list():
-            router = self._get_in_region(name, region.name)
-            if router:
-                routers.append(router)
-        return ClientPagedResultList(self.provider, routers, limit=limit,
-                                     marker=marker)
+    def find(self, **kwargs):
+        obj_list = self
+        filters = ['name', 'label']
+        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
+        return ClientPagedResultList(self._provider, list(matches))
 
     def list(self, limit=None, marker=None):
         region = self.provider.region_name
@@ -941,8 +939,7 @@ class GCESubnetService(BaseSubnetService):
         body = {'ipCidrRange': cidr_block,
                 'name': name,
                 'network': network.resource_url,
-                'region': region_name,
-                'labels': {'cblabel': label.replace(' ', '_').lower()}
+                'region': region_name
                 }
         try:
             response = (self.provider
@@ -957,7 +954,9 @@ class GCESubnetService(BaseSubnetService):
                                response['error'])
                 return None
             self.provider.wait_for_operation(response, region=region_name)
-            return self.get(name)
+            cb_subnet = self.get(name)
+            cb_subnet.label = label
+            return cb_subnet
         except googleapiclient.errors.HttpError as http_error:
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return None
@@ -1120,7 +1119,6 @@ class GCEVolumeService(BaseVolumeService):
             'type': 'zones/{0}/diskTypes/{1}'.format(zone_name, 'pd-standard'),
             'sourceSnapshot': snapshot_id,
             'description': description,
-            'labels': {'cblabel': label.replace(' ', '_').lower()}
         }
         operation = (self.provider
                          .gce_compute
@@ -1198,8 +1196,7 @@ class GCESnapshotService(BaseSnapshotService):
         volume_name = volume.name if isinstance(volume, GCEVolume) else volume
         snapshot_body = {
             "name": name,
-            "description": description,
-            "labels": {"cblabel": label}
+            "description": description
         }
         operation = (self.provider
                          .gce_compute
@@ -1213,11 +1210,9 @@ class GCESnapshotService(BaseSnapshotService):
             return None
         self.provider.wait_for_operation(operation,
                                          zone=self.provider.default_zone)
-        snapshots = self.provider.storage.snapshots.find(label=label)
-        if snapshots:
-            return snapshots[0]
-        else:
-            return None
+        cb_snap = self.get(name)
+        cb_snap.label = label
+        return cb_snap
 
 
 class GCSBucketService(BaseBucketService):