add_model() can accept just a model name
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Fri, 9 Dec 2016 15:57:30 +0000 (10:57 -0500)
committerTim Van Steenburgh <tvansteenburgh@gmail.com>
Fri, 9 Dec 2016 15:57:30 +0000 (10:57 -0500)
docs/narrative/create-model.rst
juju/controller.py
juju/tag.py

index c650f91..b0cdbe7 100644 (file)
@@ -1,6 +1,8 @@
 Creating and Destroying a Model
 ===============================
-Example of creating a new model and then destroying it.
+Example of creating a new model and then destroying it. See
+:meth:`juju.controller.Controller.add_model` and
+:meth:`juju.controller.Controller.destroy_model` for more info.
 
 .. code:: python
 
@@ -12,8 +14,6 @@ Example of creating a new model and then destroying it.
   # Create our new model
   model = await controller.add_model(
       'mymodel',  # name of your new model
-      'aws',      # name of the cloud to use
-      'aws-tim',  # name of the credential to use
   )
 
   # Do stuff with our model...
index 67409ba..6331c12 100644 (file)
@@ -55,39 +55,46 @@ class Controller(object):
             self.connection = None
 
     async def add_model(
-            self, model_name, cloud_name, credential_name,
+            self, model_name, cloud_name=None, credential_name=None,
             owner=None, config=None, region=None):
         """Add a model to this controller.
 
         :param str model_name: Name to give the new model.
         :param str cloud_name: Name of the cloud in which to create the
-            model, e.g. 'aws'.
+            model, e.g. 'aws'. Defaults to same cloud as controller.
         :param str credential_name: Name of the credential to use when
-            creating the model.
+            creating the model. Defaults to current credential. If you
+            pass a credential_name, you must also pass a cloud_name,
+            even if it's the default cloud.
         :param str owner: Username that will own the model. Defaults to
             the current user.
         :param dict config: Model configuration.
         :param str region: Region in which to create the model.
 
         """
-        # XXX: We can probably obviate the cloud_name param by getting it
-        # from the controller itself.
-
         model_facade = client.ModelManagerFacade()
         model_facade.connect(self.connection)
 
         owner = owner or self.connection.info['user-info']['identity']
 
+        # 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:
+            credential = tag.credential(
+                cloud_name,
+                tag.untag('user-', owner),
+                credential_name
+            )
+        else:
+            credential = None
+
+
         log.debug('Creating model %s', model_name)
 
         model_info = await model_facade.CreateModel(
             tag.cloud(cloud_name),
             config,
-            tag.credential(
-                cloud_name,
-                tag.untag('user-', owner),
-                credential_name
-            ),
+            credential,
             model_name,
             owner,
             region,
index f10c5ef..d36316d 100644 (file)
@@ -1,11 +1,11 @@
 def _prefix(prefix, s):
-    if not s.startswith(prefix):
+    if s and not s.startswith(prefix):
         return '{}{}'.format(prefix, s)
     return s
 
 
 def untag(prefix, s):
-    if s.startswith(prefix):
+    if s and s.startswith(prefix):
         return s[len(prefix):]
     return s