|
|
|
|
@@ -1,6 +1,8 @@
|
|
|
|
|
from git import Repo
|
|
|
|
|
"""Provides setup and the core Composer class functionality to interact with a compose stack"""
|
|
|
|
|
|
|
|
|
|
from git import exc, Repo
|
|
|
|
|
import logging
|
|
|
|
|
from os import getenv
|
|
|
|
|
from os import environ, getenv
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
from python_on_whales import DockerClient
|
|
|
|
|
from python_on_whales.exceptions import DockerException
|
|
|
|
|
@@ -14,10 +16,27 @@ logger = logging.getLogger("composer-agent-logger")
|
|
|
|
|
logger.addHandler(handler)
|
|
|
|
|
logger.setLevel(logging.DEBUG) #TODO: add something to change log levles
|
|
|
|
|
|
|
|
|
|
environ['GIT_TERMINAL_PROMPT'] = '0'
|
|
|
|
|
|
|
|
|
|
class Setup:
|
|
|
|
|
|
|
|
|
|
"""Setup class ensuring appropriate files and symlinks are created for a Composer instance"""
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def create_credential_remote():
|
|
|
|
|
|
|
|
|
|
"""Creates a remote url with credentials embedded"""
|
|
|
|
|
|
|
|
|
|
username, password = getenv("GIT_USERNAME"), getenv("GIT_PASSWORD")
|
|
|
|
|
remote = getenv("REMOTE_REPO")
|
|
|
|
|
if not remote:
|
|
|
|
|
logger.critical("Remote URL not defined, aborting!")
|
|
|
|
|
raise Exception("Remote URL not defined!")
|
|
|
|
|
if username is not None and password is not None:
|
|
|
|
|
return f"https://{username}:{password}@{remote.removeprefix('https://')}"
|
|
|
|
|
else:
|
|
|
|
|
return remote
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def create_symlink():
|
|
|
|
|
|
|
|
|
|
@@ -72,10 +91,14 @@ class Composer:
|
|
|
|
|
|
|
|
|
|
if not Path("store/stack/.git").exists():
|
|
|
|
|
self.repo = Repo.init("store/stack")
|
|
|
|
|
self.repo.create_remote('origin', url)
|
|
|
|
|
self.repo.create_remote('origin', remote_url)
|
|
|
|
|
else:
|
|
|
|
|
self.repo = Repo("store/stack")
|
|
|
|
|
try:
|
|
|
|
|
self.repo.remotes.origin.pull('master')
|
|
|
|
|
except exc.GitCommandError:
|
|
|
|
|
logger.critical("Failed to autheticate remote, aborting!")
|
|
|
|
|
raise Exception("Failed to authenticate remote!")
|
|
|
|
|
if self.docker.compose.config(return_json=True)["name"] != "stack":
|
|
|
|
|
logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack")
|
|
|
|
|
self.start_update_job()
|
|
|
|
|
@@ -135,14 +158,17 @@ class Composer:
|
|
|
|
|
else:
|
|
|
|
|
logger.warn(f"Undefined status {status} - use up, down, or restart")
|
|
|
|
|
except DockerException as error:
|
|
|
|
|
logger.critical(f"Setting status of composer failed: {error}")
|
|
|
|
|
logger.error(f"Setting status of composer failed: {error}")
|
|
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
|
|
|
|
|
|
"""Updates the Composer stack based on the remote repo"""
|
|
|
|
|
|
|
|
|
|
current = self.repo.head.commit
|
|
|
|
|
try:
|
|
|
|
|
self.repo.remotes.origin.pull('master')
|
|
|
|
|
except exc.GitCommandError:
|
|
|
|
|
logger.critical("Failed to autheticate remote, aborting!")
|
|
|
|
|
if current != self.repo.head.commit:
|
|
|
|
|
self._create_services()
|
|
|
|
|
self.set_status("up")
|
|
|
|
|
@@ -238,8 +264,7 @@ class Service:
|
|
|
|
|
else:
|
|
|
|
|
logger.warn(f"Undefined status {status} - use up, down, or restart")
|
|
|
|
|
except DockerException as error:
|
|
|
|
|
logger.critical(f"Setting status for service {self.name} failed: {error}")
|
|
|
|
|
logger.critical(error)
|
|
|
|
|
logger.error(f"Setting status for service {self.name} failed: {error}")
|
|
|
|
|
|
|
|
|
|
def update(self, restart=True):
|
|
|
|
|
|
|
|
|
|
|