def connect(env_name): juju_home = os.path.expanduser(os.environ.get("JUJU_HOME", "~/.juju")) juju_conf = os.path.join(juju_home, "environments", "%s.jenv" % env_name) conf = _config_from_env(juju_conf) env = Environment(conf['uri']) env.login(conf['secret']) return env
class JujuCommunication: """ Manage the communication with the Juju controller """ def __init__(self, creds): """ Constructor, initializes the connection to the Juju Controller :param creds: information to get a connection to the Juju Controller :exception JujuError: raised if connection to Juju can't be done """ self.logger = logging.getLogger(__name__) self._creds = creds self.client = None def connect(self): self.logger.info("Connection with the JUJU Controller") self.logger.debug("Server (%s:%s)", self._creds['address'], self._creds['port']) self.logger.debug("Token (%s)", self._creds['token']) if not self.client: try: try: self.client = Environment("wss://{}:{}".format(self._creds['address'], self._creds['port'])) self.client.login(self._creds['token']) except socket.error as err: if not err.errno in (errno.ETIMEDOUT, errno.ECONNREFUSED, errno.ECONNRESET): raise JujuError("Cannot reach endpoint provided (%s:%s)" % (self._creds['address'], self._creds['port']), err.message) except EnvError, e: raise JujuError("Communication with Juju can't be performed", e.message) self.logger.info("Connection successfully established")
class Environment: def __init__(self, options): env_path = os.path.expanduser( "~/.juju/environments/%s.jenv" % self.name) if not os.path.exists(env_path): raise Exception("Not found specified environment: %s" % self.name) with open(env_path) as fd: loaded = yaml.load(fd.read()) for k, v in loaded.items(): setattr(self, k.replace("-", "_"), v) self._env = GoEnvironment("wss://{}".format(self.state_servers[0])) self._env.login(self.password) self.options = options try: provider_type = self.bootstrap_config.get('type') klass = "{0}Provider".format(provider_type.capitalize()) self.provider = getattr(providers, klass)(self) except AttributeError: raise Exception("Provider type: %s , not supported yet" % provider_type) except: raise @property def name(self): if hasattr(self, '_name'): return self._name name = os.environ.get("JUJU_ENV", None) if name: self._name = name else: self._name = yaml.load( subprocess.check_output(["juju", "get-environment"]))['name'] return self._name @property def status(self): return self._env.status() @property def machines(self): return self.status.get('Machines').items() def suspend(self): return self.provider.suspend() def resume(self): return self.provider.resume()
def get_env(cls, name=None, user=None, password=None): # A hook env will have this set api_addresses = os.environ.get('JUJU_API_ADDRESSES') if not api_addresses: # use the local option/connect which # parses local jenv info env = Environment.connect(name) else: env = Environment(api_addresses.split()[0]) env.login(user=user, password=password) return env
""" self.logger.info("Destroying the machine (%s)", machine_numbers) return self.client.destroy_machines(machine_numbers, force=True) def status(self): """ Get the status of Juju :return: status of Juju as a JSON file """ self.logger.info("Get the status of the system") return self.client.status() def getserviceconfiguration(self, service_name): return self.client.get_service(service_name) def info(self): return self.client.info() if __name__ == '__main__': address = "10.0.3.1" port = 17070 token = "d36784462a74d471e34176613652cb15" print "env login" environment = Environment("wss://" + address + ":" + str(port)) environment.login(token) print "env logged" # print environment.add_local_charm("/home/ubuntu/charms/trusty/torquepbs2.zip", "trusty") print environment.deploy("apache2", "local:trusty/torquepbs-1")