Dropped in fixes for juju ssh.
[osm/N2VC.git] / juju / controller.py
index 6331c12..e3234f8 100644 (file)
@@ -2,6 +2,7 @@ import asyncio
 import logging
 
 from . import tag
+from . import utils
 from .client import client
 from .client import connection
 from .client import watcher
@@ -76,10 +77,9 @@ class Controller(object):
         model_facade.connect(self.connection)
 
         owner = owner or self.connection.info['user-info']['identity']
+        cloud_name = cloud_name or await self.get_cloud()
 
-        # XXX: We should be able to accept a credential_name without
-        # a cloud_name, and just get the cloud_name from the controller.
-        if credential_name and cloud_name:
+        if credential_name:
             credential = tag.credential(
                 cloud_name,
                 tag.untag('user-', owner),
@@ -88,7 +88,6 @@ class Controller(object):
         else:
             credential = None
 
-
         log.debug('Creating model %s', model_name)
 
         model_info = await model_facade.CreateModel(
@@ -100,6 +99,19 @@ class Controller(object):
             region,
         )
 
+        # Add our ssh key to the model, to work around
+        # https://bugs.launchpad.net/juju/+bug/1643076
+        try:
+            ssh_key = utils.read_ssh_key()
+            await utils.execute_process(
+                'juju', 'add-ssh-key', '-m', model_name, ssh_key, log=log)
+        except Exception as e:
+            log.warning(
+                "Could not add ssh key to model. You will not be able "
+                "to ssh into machines in this model. "
+                "Manually running `juju add-ssh-key <key>` in the cli "
+                "may fix this problem.")
+
         model = Model()
         await model.connect(
             self.connection.endpoint,
@@ -183,6 +195,17 @@ class Controller(object):
         """
         pass
 
+    async def get_cloud(self):
+        """
+        Get the name of the cloud that this controller lives on.
+        """
+        cloud_facade = client.CloudFacade()
+        cloud_facade.connect(self.connection)
+
+        result = await cloud_facade.Clouds()
+        cloud = list(result.clouds.keys())[0]  # only lives on one cloud
+        return tag.untag('cloud-', cloud)
+
     def get_models(self, all_=False, username=None):
         """Return list of available models on this controller.