diff --git a/composer/agent.py b/composer/agent.py index 619a1fa..d271966 100644 --- a/composer/agent.py +++ b/composer/agent.py @@ -81,6 +81,7 @@ class Composer: Attributes: docker: DockerClient instance used to interact with the compose stack + name: string of the name of the compose file services: list of Service objects defined by the stack scheduler: BackgroundScheduler for updates """ @@ -90,6 +91,7 @@ class Composer: compose_files=["store/stack/compose.yml"], compose_env_files=["store/stack/.env"] ) + name = docker.compose.config(return_json=True)["name"] def __init__(self, remote_url): @@ -124,7 +126,7 @@ class Composer: for service in self.services: self.services[service].close() services_dict = self.docker.compose.config().services - self.services = {service: Service(service, services_dict[service].labels, self) for service in services_dict} + self.services = {service: Service(service, services_dict[service], self) for service in services_dict} def start_update_job(self): @@ -190,6 +192,7 @@ class Composer: logger.critical("Failed to autheticate remote, aborting!") if current != self.repo.head.commit: self._create_services() + self.name = self.docker.compose.config(return_json=True)["name"] self.set_status("up") logger.info(f"New compose stack deployed! Commit: {self.repo.head.commit}") @@ -198,23 +201,23 @@ class Service: """Service instance meant to represent a container in a Composer stack Attributes: - labels: labels given to the service + config: config of the service name: name given to the service parent: Composer instance containing the service """ - def __init__(self, name, labels, parent): + def __init__(self, name, config, parent): """Initializes the Service instance Args: name: name given to the service - labels: labels given to the service + config: config of the service parent: Composer instance containing the service """ self.name = name - self.labels = labels + self.config = config self.parent = parent self._update_task = self.start_update_job() @@ -226,18 +229,18 @@ class Service: return None self._update_task.remove() - def get_container_info(self): + def get_status(self): - """Gets the docker container info + """Gets the status of the docker container Returns: - A docker container if it exists, if not returns None. + str specifying the status of the docker container """ container = self.parent.docker.compose.ps(services=[self.name]) if not container: - return None - return container[0] + return "down" + return container[0].state.status def start_update_job(self): @@ -250,13 +253,14 @@ class Service: """ self.update_time = self.parent.update_time - if 'composer.update' in self.labels: + labels = self.config.labels + if 'composer.update' in labels: try: - self.update_time = int(self.labels['composer.update']) + self.update_time = int(labels['composer.update']) assert self.update_time > 0 except (AssertionError, ValueError): self.update_time = self.parent.update_time - logging.warn(f"Service {self.name} has an invalid composer.update value of {self.labels['composer.update']}, defaulting to update interval of {self.update_time} minutes") + logging.warn(f"Service {self.name} has an invalid composer.update value of {labels['composer.update']}, defaulting to update interval of {self.update_time} minutes") if self.update_time != 0: return self.parent.scheduler.add_job(self.update, 'interval', minutes=self.update_time) return None diff --git a/composer/connector.py b/composer/connector.py index 1e341d3..49857d5 100644 --- a/composer/connector.py +++ b/composer/connector.py @@ -6,15 +6,26 @@ class Connector: def __init__(self, connector): self.connector = connector + def get_connector_info(self): + info = { + "name": self.connector.name, + "running": len(self.connector.docker.compose.ps()), + "stopped": len(self.connector.services) - len(self.connector.docker.compose.ps()) + } + return json.dumps(info) + def get_container_info(self, container_name): if container_name not in self.connector.services: return None - container = self.connector.services[container_name].get_container_info() - return json.loads({ - "image": container.image, - "status": container.state.status + container = self.connector.services[container_name] + return json.dumps({ + "image": container.config.image, + "status": container.get_status() }) + def set_connector_status(self, status): + self.connector.set_status(status) + def set_container_status(self, container_name, status): if container_name not in self.connector.services: return None @@ -26,6 +37,8 @@ remote = Setup.create_credential_remote() composer = Composer(remote) connector = Connector(composer) while True: + print(connector.get_connector_info()) container = input("Container: ") - status = input("Connector: ") + print(connector.get_container_info(container)) + status = input("Status: ") connector.set_container_status(container, status) \ No newline at end of file