소스 검색

Make snapshots and volumes alos use metadata for labels

Nuwan Goonasekera 7 년 전
부모
커밋
fd6db4ee82
2개의 변경된 파일26개의 추가작업 그리고 44개의 파일을 삭제
  1. 8 21
      cloudbridge/cloud/providers/gce/resources.py
  2. 18 23
      cloudbridge/cloud/providers/gce/services.py

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

@@ -477,6 +477,7 @@ class GCEVMFirewall(BaseVMFirewall):
 
 
     @label.setter
     @label.setter
     def label(self, value):
     def label(self, value):
+        self.assert_valid_resource_label(value)
         tag_name = "_".join(["firewall", self.name, "label"])
         tag_name = "_".join(["firewall", self.name, "label"])
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
 
 
@@ -1059,7 +1060,8 @@ class GCEInstance(BaseInstance):
         key in metadata.
         key in metadata.
         """
         """
         try:
         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:
         except StopIteration:
             return None
             return None
 
 
@@ -1365,6 +1367,7 @@ class GCENetwork(BaseNetwork):
 
 
     @label.setter
     @label.setter
     def label(self, value):
     def label(self, value):
+        self.assert_valid_resource_label(value)
         tag_name = "_".join(["network", self.name, "label"])
         tag_name = "_".join(["network", self.name, "label"])
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
         helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
 
 
@@ -1785,30 +1788,14 @@ class GCESubnet(BaseSubnet):
 
 
     @property
     @property
     def label(self):
     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
     @label.setter
     def label(self, value):
     def label(self, value):
         self.assert_valid_resource_label(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
     @property
     def cidr_block(self):
     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'),
             'name': GCEInstance._generate_name_from_label(label, 'cb-inst'),
             'machineType': vm_type.resource_url,
             'machineType': vm_type.resource_url,
             'disks': disks,
             'disks': disks,
-            'networkInterfaces': [network_interface],
-            'labels': {'cblabel': label.replace(' ', '_').lower()}
+            'networkInterfaces': [network_interface]
         }
         }
 
 
         if vm_firewalls and isinstance(vm_firewalls, list):
         if vm_firewalls and isinstance(vm_firewalls, list):
@@ -561,7 +560,9 @@ class GCEInstanceService(BaseInstanceService):
             return None
             return None
         instance_id = operation.get('targetLink')
         instance_id = operation.get('targetLink')
         self.provider.wait_for_operation(operation, zone=zone_name)
         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):
     def get(self, instance_id):
         """
         """
@@ -715,6 +716,7 @@ class GCENetworkService(BaseNetworkService):
         False: For creating a custom mode VPC network. Subnetworks should be
         False: For creating a custom mode VPC network. Subnetworks should be
                created manually.
                created manually.
         """
         """
+        GCENetwork.assert_valid_resource_label(label)
         if create_subnetworks is not None and cidr_block is not None:
         if create_subnetworks is not None and cidr_block is not None:
             cb.log.warning('cidr_block is ignored in non-legacy networks. '
             cb.log.warning('cidr_block is ignored in non-legacy networks. '
                            'Auto mode networks use the default CIDR of '
                            '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
         Creates an auto mode VPC network with default subnets. It is possible
         to add additional subnets later.
         to add additional subnets later.
         """
         """
-        GCENetwork.assert_valid_resource_label(label)
         cb_net = self._create(label, cidr_block, False)
         cb_net = self._create(label, cidr_block, False)
         cb_net.label = label
         cb_net.label = label
         return cb_net
         return cb_net
@@ -794,14 +795,11 @@ class GCERouterService(BaseRouterService):
     def get(self, router_id):
     def get(self, router_id):
         return self._get_in_region(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):
     def list(self, limit=None, marker=None):
         region = self.provider.region_name
         region = self.provider.region_name
@@ -941,8 +939,7 @@ class GCESubnetService(BaseSubnetService):
         body = {'ipCidrRange': cidr_block,
         body = {'ipCidrRange': cidr_block,
                 'name': name,
                 'name': name,
                 'network': network.resource_url,
                 'network': network.resource_url,
-                'region': region_name,
-                'labels': {'cblabel': label.replace(' ', '_').lower()}
+                'region': region_name
                 }
                 }
         try:
         try:
             response = (self.provider
             response = (self.provider
@@ -957,7 +954,9 @@ class GCESubnetService(BaseSubnetService):
                                response['error'])
                                response['error'])
                 return None
                 return None
             self.provider.wait_for_operation(response, region=region_name)
             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:
         except googleapiclient.errors.HttpError as http_error:
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return None
             return None
@@ -1120,7 +1119,6 @@ class GCEVolumeService(BaseVolumeService):
             'type': 'zones/{0}/diskTypes/{1}'.format(zone_name, 'pd-standard'),
             'type': 'zones/{0}/diskTypes/{1}'.format(zone_name, 'pd-standard'),
             'sourceSnapshot': snapshot_id,
             'sourceSnapshot': snapshot_id,
             'description': description,
             'description': description,
-            'labels': {'cblabel': label.replace(' ', '_').lower()}
         }
         }
         operation = (self.provider
         operation = (self.provider
                          .gce_compute
                          .gce_compute
@@ -1198,8 +1196,7 @@ class GCESnapshotService(BaseSnapshotService):
         volume_name = volume.name if isinstance(volume, GCEVolume) else volume
         volume_name = volume.name if isinstance(volume, GCEVolume) else volume
         snapshot_body = {
         snapshot_body = {
             "name": name,
             "name": name,
-            "description": description,
-            "labels": {"cblabel": label}
+            "description": description
         }
         }
         operation = (self.provider
         operation = (self.provider
                          .gce_compute
                          .gce_compute
@@ -1213,11 +1210,9 @@ class GCESnapshotService(BaseSnapshotService):
             return None
             return None
         self.provider.wait_for_operation(operation,
         self.provider.wait_for_operation(operation,
                                          zone=self.provider.default_zone)
                                          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):
 class GCSBucketService(BaseBucketService):