Răsfoiți Sursa

Network labels in metadata

almahmoud 7 ani în urmă
părinte
comite
ae7126e209

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

@@ -134,3 +134,30 @@ def gce_kp_to_id(gce_kp):
     md5 = hashlib.md5()
     md5 = hashlib.md5()
     md5.update(gce_kp.public_key)
     md5.update(gce_kp.public_key)
     return md5.hexdigest()
     return md5.hexdigest()
+
+
+def modify_or_add_metadata_item(provider, key, value):
+    metadata = _get_common_metadata(provider)
+    entries = [item for item in metadata.get('items', [])
+               if item['key'] == key]
+    if entries:
+        entries[-1]['value'] = value
+    else:
+        entry = {'key': key, 'value': value}
+        if 'items' not in metadata:
+            metadata['items'] = [entry]
+        else:
+            metadata['items'].append(entry)
+    operation = gce_projects(provider).setCommonInstanceMetadata(
+        project=provider.project_name, body=metadata).execute()
+    provider.wait_for_operation(operation)
+
+
+def get_metadata_item_value(provider, key):
+    metadata = _get_common_metadata(provider)
+    entries = [item['value'] for item in metadata.get('items', [])
+               if item['key'] == key]
+    if entries:
+        return entries[-1]
+    else:
+        return None

+ 24 - 13
cloudbridge/cloud/providers/gce/resources.py

@@ -1349,22 +1349,33 @@ class GCENetwork(BaseNetwork):
 
 
     @property
     @property
     def label(self):
     def label(self):
-        return self._network.get('description')
+        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
     @label.setter
-    # pylint:disable=arguments-differ
     def label(self, value):
     def label(self, value):
-        self.assert_valid_resource_label(value)
-        body = {'description': value}
-        response = (self._provider
-                    .gce_compute
-                    .networks()
-                    .patch(project=self._provider.project_name,
-                           network=self.name,
-                           body=body)
-                    .execute())
-        self._provider.wait_for_operation(response)
-        self._network['description'] = value
+        tag_name = "_".join(["network", self.name, "label"])
+        helpers.modify_or_add_metadata_item(self._provider, tag_name, value)
+
+    # @property
+    # def label(self):
+    #     return self._network.get('description')
+
+    # @label.setter
+    # # pylint:disable=arguments-differ
+    # def label(self, value):
+    #     self.assert_valid_resource_label(value)
+    #     body = {'description': value}
+    #     response = (self._provider
+    #                 .gce_compute
+    #                 .networks()
+    #                 .patch(project=self._provider.project_name,
+    #                        network=self.name,
+    #                        body=body)
+    #                 .execute())
+    #     self._provider.wait_for_operation(response)
+    #     self._network['description'] = value
 
 
 #     @property
 #     @property
 #     def label(self):
 #     def label(self):