+ :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'. Defaults to same cloud as controller.
+ :param str credential_name: Name of the credential to use when
+ 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.
+
+ """
+ model_facade = client.ModelManagerFacade()
+ model_facade.connect(self.connection)
+
+ owner = owner or self.connection.info['user-info']['identity']
+ cloud_name = cloud_name or await self.get_cloud()
+
+ if credential_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,
+ credential,
+ model_name,
+ owner,
+ region,
+ )
+
+ # Add our ssh key to the model, to work around
+ # https://bugs.launchpad.net/juju/+bug/1643076
+ try:
+ ssh_key = await utils.read_ssh_key(loop=self.loop)
+ await utils.execute_process(
+ 'juju', 'add-ssh-key', '-m', model_name, ssh_key, log=log,
+ loop=self.loop)
+ except Exception:
+ log.exception(
+ "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,
+ model_info.uuid,
+ self.connection.username,
+ self.connection.password,
+ self.connection.cacert,
+ self.connection.macaroons,
+ loop=self.loop,
+ )
+
+ return model
+
+ async def destroy_models(self, *uuids):
+ """Destroy one or more models.
+
+ :param str \*uuids: UUIDs of models to destroy