-
Arthur Le Bars authoredaf06a5c7
docker_compose_generator.py 4.24 KiB
import os
import argparse
import logging
# import yaml
# import ruamel.yaml
# import json
"""
docker-compose.yml generator
The method "generate" works for both docker-compose architecture (old), or docker stacks (new)
This method will write a formatted docker-compose.yml for the specified organism (only requires genus and species)
Made to work in the integration streamlined script "autoload.py" but can be used as a standalone (either with a CLI
or in another python file as a module)
Dockerfiles are specific to genus-species: a same organism can have several strains and sexes integrated, but only one
set of applications are used (see metadata files for details about what strains/sexes have been integrated for
an organism)
TODO: write the whole yml dict from scratch (would allow the script to be more reusable into the future and make it
more customizable while being clearer (instead of the default yml string or input docker-compose template)
TODO: read json
API master key or galaxy: MASTER_API_KEY: XXXXXXX (alphanum, user prompt or git env variable)
"""
class DockerComposeGenerator:
def __init__(self):
self.mode = None
self.genus = None
self.species = None
self.organism_template = None
self.traefik_template = None
self.outdir = None
def generate(self):
if self.organism_template is None:
self.organism_template = str(os.getcwd() + "/templates/stack-organism.yml")
else:
with open(self.organism_template, 'r') as infile:
organism_content = list()
for line in infile:
# Replace placeholders by the genus and species
organism_content.append(line.replace("genus_species", str(self.genus.lower() + "_" + self.species)).replace("Genus species", str(self.genus + " " + self.species)).replace("Genus/species", str(self.genus + "/" + self.species)).replace("gspecies", str(self.genus.lower()[0] + self.species)))
self.write_yml(content=organism_content)
if self.traefik_template is None:
self.traefik_template = str(os.getcwd() + "/templates/stack-organism.yml")
else:
with open(self.traefik_template, 'r') as infile:
traefik_content = list()
for line in infile:
# Replace placeholders by the genus and species
traefik_content.append(line.replace("genus_species", str(self.genus.lower() + "_" + self.species)).replace("Genus species", str(self.genus + " " + self.species)).replace("Genus/species", str(self.genus + "/" + self.species)).replace("gspecies", str(self.genus.lower()[0] + self.species)))
self.write_yml(content=traefik_content)
def write_yml(self, content):
with open(self.outdir + "/docker-compose.yml", 'w') as outfile:
for line in content:
outfile.write(line)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generator of docker-compose.yml for GGA automated integration "
"following the templates available @ "
"https://gitlab.inria.fr/abretaud/genodock_demo/")
parser.add_argument("-g", "--genus", type=str, help="input genus")
parser.add_argument("-s", "--species", type=str, help="input species")
parser.add_argument("-o", "--organism-template", type=str, help="input organism template docker-compose.yml (compose or stack), optional")
parser.add_argument("-t", "--traefik-template", type=str, help="input organism template docker-compose.yml (compose or stack), optional")
parser.add_argument("-m", "--main-dir", type=str, help="where to write the output traefik docker-compose.yml (defaults to cd, autoload places it in main directory)")
parser.add_argument("-d", "--organism-dir", type=str, help="where to write the output organism docker-compose.yml (defaults to cd, autoload places it in organism directory)")
args = parser.parse_args()
dc_generator = DockerComposeGenerator()
dc_generator.genus = args.genus
dc_generator.species = args.species
if args.template:
dc_generator.template = args.template
dc_generator.outdir = args.outdir
dc_generator.generate()