+ 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
+
+ """
+ model_facade = client.ModelManagerFacade()
+ model_facade.connect(self.connection)
+
+ log.debug(
+ 'Destroying model%s %s',
+ '' if len(uuids) == 1 else 's',
+ ', '.join(uuids)
+ )
+
+ await model_facade.DestroyModels([
+ client.Entity(tag.model(uuid))
+ for uuid in uuids
+ ])
+ destroy_model = destroy_models