Enis Afgan 7 лет назад
Родитель
Сommit
c4a579e7c9

+ 42 - 0
cloudbridge/cloud/providers/gce/resources.py

@@ -1065,6 +1065,48 @@ class GCEInstance(BaseInstance):
         except StopIteration:
             return None
 
+    @key_pair_id.setter
+    # pylint:disable=arguments-differ
+    def key_pair_id(self, value):
+        self.assert_valid_resource_label(value)
+        key_pair = None
+        if not isinstance(value, GCEKeyPair):
+            key_pair = self._provider.security.key_pairs.get(value)
+        if key_pair:
+            key_pair_name = key_pair.name
+        kp = None
+        for kpi in self._provider.security.key_pairs._iter_gce_key_pairs(
+                self._provider):
+            if kpi.email == key_pair_name:
+                kp = kpi
+                break
+        if kp:
+            kp_items = [{
+                "key": "ssh-keys",
+                # FIXME: ssh username & key format are fixed here while they
+                # should correspond to the operating system, or be customizable
+                "value": "ubuntu:ssh-rsa {0} {1}".format(kp.public_key,
+                                                         kp.email)
+            }]
+            config = {
+                "items": kp_items,
+                "fingerprint": self._gce_instance['metadata']['fingerprint']
+            }
+            try:
+                (self._provider
+                    .gce_compute
+                    .instances()
+                    .setMetadata(project=self._provider.project_name,
+                                 zone=self._provider.default_zone,
+                                 instance=self.name,
+                                 body=config)
+                    .execute())
+            except Exception as e:
+                cb.log.warning('Exception while setting instance key pair: %s',
+                               e)
+                raise e
+            self.refresh()
+
     @property
     def inet_gateway(self):
         if self._inet_gateway:

+ 2 - 0
cloudbridge/cloud/providers/gce/services.py

@@ -562,6 +562,8 @@ class GCEInstanceService(BaseInstanceService):
         self.provider.wait_for_operation(operation, zone=zone_name)
         cb_inst = self.get(instance_id)
         cb_inst.label = label
+        if key_pair:
+            cb_inst.key_pair_id = key_pair
         return cb_inst
 
     def get(self, instance_id):