X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=juju%2Fapplication.py;h=6b1f8ab4bb2bf3583053c0b7d0c65918e091ca74;hb=d23810d57aa7f0fa67070781645f4898e20db0ed;hp=42dae71c44df1d0b881f3c5edbbb56dac545fdaa;hpb=55ae2c120ce031f57ac210f3d7bd203db739f1e9;p=osm%2FN2VC.git diff --git a/juju/application.py b/juju/application.py index 42dae71..6b1f8ab 100644 --- a/juju/application.py +++ b/juju/application.py @@ -3,6 +3,7 @@ import logging from . import model from .client import client +from .placement import parse as parse_placement log = logging.getLogger(__name__) @@ -40,14 +41,18 @@ class Application(model.ModelEntity): """Get the application status, as set by the charm's leader. """ - return self.data['status']['current'] + return self.safe_data['status']['current'] @property def status_message(self): """Get the application status message, as set by the charm's leader. """ - return self.data['status']['message'] + return self.safe_data['status']['message'] + + @property + def tag(self): + return 'application-%s' % self.name async def add_relation(self, local_relation, remote_relation): """Add a relation to another application. @@ -83,7 +88,7 @@ class Application(model.ModelEntity): result = await app_facade.AddUnits( application=self.name, - placement=to, + placement=parse_placement(to) if to else None, num_units=count, ) @@ -101,7 +106,7 @@ class Application(model.ModelEntity): :param int value: Budget limit """ - pass + raise NotImplementedError() def attach(self, resource_name, file_path): """Upload a file as a resource for this application. @@ -110,13 +115,13 @@ class Application(model.ModelEntity): :param str file_path: Path to the file to upload """ - pass + raise NotImplementedError() def collect_metrics(self): """Collect metrics on this application. """ - pass + raise NotImplementedError() async def destroy_relation(self, local_relation, remote_relation): """Remove a relation to another application. @@ -193,7 +198,8 @@ class Application(model.ModelEntity): log.debug( 'Getting constraints for %s', self.name) - return vars((await app_facade.Get(self.name)).constraints) + result = (await app_facade.Get(self.name)).constraints + return vars(result) if result else result def get_actions(self, schema=False): """Get actions defined for this application. @@ -201,7 +207,7 @@ class Application(model.ModelEntity): :param bool schema: Return the full action schema """ - pass + raise NotImplementedError() def get_resources(self, details=False): """Return resources for this application. @@ -210,16 +216,29 @@ class Application(model.ModelEntity): unit """ - pass + raise NotImplementedError() - def run(self, command, timeout=None): + async def run(self, command, timeout=None): """Run command on all units for this application. :param str command: The command to run :param int timeout: Time to wait before command is considered failed """ - pass + action = client.ActionFacade() + action.connect(self.connection) + + log.debug( + 'Running `%s` on all units of %s', command, self.name) + + # TODO this should return a list of Actions + return await action.Run( + [self.name], + command, + [], + timeout, + [], + ) async def set_annotations(self, annotations): """Set annotations on this application. @@ -234,27 +253,39 @@ class Application(model.ModelEntity): self.ann_facade.connect(self.connection) ann = client.EntityAnnotations( - entity=self.name, + entity=self.tag, annotations=annotations, ) return await self.ann_facade.Set([ann]) - def set_config(self, to_default=False, **config): + async def set_config(self, config, to_default=False): """Set configuration options for this application. + :param config: Dict of configuration to set :param bool to_default: Set application options to default values - :param \*\*config: Config key/values """ - pass + app_facade = client.ApplicationFacade() + app_facade.connect(self.connection) + + log.debug( + 'Setting config for %s: %s', self.name, config) + + return await app_facade.Set(self.name, config) - def set_constraints(self, constraints): + async def set_constraints(self, constraints): """Set machine constraints for this application. - :param :class:`juju.Constraints` constraints: Machine constraints + :param dict constraints: Dict of machine constraints """ - pass + app_facade = client.ApplicationFacade() + app_facade.connect(self.connection) + + log.debug( + 'Setting constraints for %s: %s', self.name, constraints) + + return await app_facade.SetConstraints(self.name, constraints) def set_meter_status(self, status, info=None): """Set the meter status on this status. @@ -263,7 +294,7 @@ class Application(model.ModelEntity): :param str info: Extra info message """ - pass + raise NotImplementedError() def set_plan(self, plan_name): """Set the plan for this application, effective immediately. @@ -271,7 +302,7 @@ class Application(model.ModelEntity): :param str plan_name: Name of plan """ - pass + raise NotImplementedError() async def unexpose(self): """Remove public availability over the network for this application. @@ -291,7 +322,7 @@ class Application(model.ModelEntity): :param int allocation: The allocation to set """ - pass + raise NotImplementedError() def upgrade_charm( self, channel=None, force_series=False, force_units=False, @@ -310,4 +341,12 @@ class Application(model.ModelEntity): :param str switch: Crossgrade charm url """ - pass + raise NotImplementedError() + + async def get_metrics(self): + """Get metrics for this application's units. + + :return: Dictionary of unit_name:metrics + + """ + return await self.model.get_metrics(self.tag)