X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=inline;f=juju%2Fmodel.py;h=e412784b4e6dc84eb13fc5c0e31fd78bfecdc8ee;hb=b87114e40c5f095103be4a9339b38552333d0190;hp=b74a6c81430f7478407a15d1e97aea6095d33f7c;hpb=b89f2fff0ca59f55a5caed03d15e34884721c88b;p=osm%2FN2VC.git diff --git a/juju/model.py b/juju/model.py index b74a6c8..e412784 100644 --- a/juju/model.py +++ b/juju/model.py @@ -12,6 +12,7 @@ from theblues import charmstore from .client import client from .client import watcher from .client import connection +from .constraints import parse as parse_constraints from .delta import get_entity_delta from .delta import get_entity_class from .exceptions import DeadEntityException @@ -159,14 +160,12 @@ class ModelState(object): def get_entity( self, entity_type, entity_id, history_index=-1, connected=True): - """Return an object instance representing the entity created or - updated by ``delta`` + """Return an object instance for the given entity_type and id. + + By default the object state matches the most recent state from + Juju. To get an instance of the object in an older state, pass + history_index, an index into the history deque for the entity. - """ - """ - log.debug( - 'Getting %s:%s at index %s', - entity_type, entity_id, history_index) """ if history_index < 0 and history_index != -1: @@ -351,6 +350,16 @@ class Model(object): self._watch_received = asyncio.Event(loop=loop) self._charmstore = CharmStore(self.loop) + async def connect(self, *args, **kw): + """Connect to an arbitrary Juju model. + + args and kw are passed through to Connection.connect() + + """ + self.connection = await connection.Connection.connect(*args, **kw) + self._watch() + await self._watch_received.wait() + async def connect_current(self): """Connect to the current Juju model. @@ -359,6 +368,15 @@ class Model(object): self._watch() await self._watch_received.wait() + async def connect_model(self, arg): + """Connect to a specific Juju model. + :param arg: : + + """ + self.connection = await connection.Connection.connect_model(arg) + self._watch() + await self._watch_received.wait() + async def disconnect(self): """Shut down the watcher task and close websockets. @@ -567,7 +585,7 @@ class Model(object): This coroutine blocks until the new object appears in the model. """ - return await self._wait(entity_type, entity_id, predicate) + return await self._wait(entity_type, entity_id, 'add', predicate) async def wait_for_action(self, action_id): """Given an action, wait for it to complete.""" @@ -578,7 +596,7 @@ class Model(object): action_id = action_id[7:] def predicate(delta): - return delta.data['status'] in ('completed', 'error') + return delta.data['status'] in ('completed', 'failed') return await self._wait('action', action_id, 'change', predicate) @@ -1238,8 +1256,7 @@ class BundleHandler(object): await self.client_facade.AddCharm(None, entity_id) return entity_id - async def addMachines(self, series, constraints, container_type, - parent_id): + async def addMachines(self, params): """ :param series string: Series holds the optional machine OS series. @@ -1258,15 +1275,21 @@ class BundleHandler(object): case this machine is a container, in which case also ContainerType is set. """ - params = client.AddMachineParams( - series=series, - constraints=constraints, - container_type=container_type, - parent_id=self.resolve(parent_id), - ) - results = await self.client_facade.AddMachines(params) - log.debug('Added new machine %s', results[0].machine) - return results[0].machine + if 'parent_id' in params: + params['parent_id'] = self.resolve(params['parent_id']) + + params['constraints'] = parse_constraints( + params.get('constraints')) + params['jobs'] = params.get('jobs', ['JobHostUnits']) + + params = client.AddMachineParams(**params) + results = await self.client_facade.AddMachines([params]) + error = results.machines[0].error + if error: + raise ValueError("Error adding machine: %s", error.message) + machine = results.machines[0].machine + log.debug('Added new machine %s', machine) + return machine async def addRelation(self, endpoint1, endpoint2): """