Add ability to get cloud for controller
authorCory Johns <johnsca@gmail.com>
Thu, 5 Jan 2017 21:50:10 +0000 (16:50 -0500)
committerCory Johns <johnsca@gmail.com>
Thu, 5 Jan 2017 21:50:10 +0000 (16:50 -0500)
Also use this as default when just a credential is given

juju/controller.py
juju/model.py

index 6331c12..cf7c2ce 100644 (file)
@@ -76,10 +76,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 +87,6 @@ class Controller(object):
         else:
             credential = None
 
-
         log.debug('Creating model %s', model_name)
 
         model_info = await model_facade.CreateModel(
@@ -183,6 +181,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.
 
index ecd764b..c2b23d1 100644 (file)
@@ -931,7 +931,10 @@ class Model(object):
                 storage=storage,
             )
 
-            await app_facade.Deploy([app])
+            result = await app_facade.Deploy([app])
+            errors = [r.error.message for r in result.results if r.error]
+            if errors:
+                raise JujuError('\n'.join(errors))
             return await self._wait_for_new('application', application_name)
 
     def destroy(self):