diff --git a/building_manager.py b/building_manager.py index 7a95710e09c44a445b55b66f73fc7d17c2599da1..caad62bba952691fd289d26346335a21feaabfb0 100755 --- a/building_manager.py +++ b/building_manager.py @@ -9,6 +9,9 @@ CONFIG_DIRS = [ 'influxdb', 'mosquitto', 'nodered', 'ssh', 'treafik', 'volumerize' ] +#Default Swarm port +SWARM_PORT = 2377 + # ****************************** # Config file functions {{{ @@ -75,6 +78,55 @@ def get_machine_env(machine_name): return machine_envs +def get_machine_ip(machine_name): + """Asks for the ip of the docker machine + + :machine_name: Name of the machine to use for init + """ + from subprocess import run + machine_result = run(['docker-machine', 'ip', machine_name], + text=True, + capture_output=True) + return machine_result.stdout + + +def init_swarm_machine(machine_name): + """Creates a new swarm with the specified machine as leader + + :machine_name: Name of the machine to use for init + """ + from subprocess import run + machine_ip = get_machine_ip(machine_name) + init_command = 'docker swarm init --advertise-addr ' + machine_ip + machine_result = run(['docker-machine', 'ssh', machine_name, init_command], + text=True, + capture_output=True) + return machine_result.stdout + + +def join_swarm_machine(machine_name, leader_name): + """Joins the swarm of the specified leader + + :machine_name: Name of the machine to join a swarm + :leader_name: Name of the swarm leader machine + """ + from subprocess import run + token_command = 'docker swarm join-token manager -q' + token_result = run(['docker-machine', 'ssh', leader_name, token_command], + text=True, + capture_output=True) + token = token_result.stdout + leader_ip = get_machine_ip(leader_name) + + join_command = 'docker swarm join --token {} {}{}'.format( + token, leader_ip, SWARM_PORT) + join_result = run(['docker-machine', 'ssh', machine_name, join_command], + text=True, + capture_output=True) + + return join_result.stdout + + # }}} @@ -246,16 +298,31 @@ def init_menu(): 'type': 'checkbox', 'name': 'machines', 'message': 'What docker machines will be used?', - 'choices': [{ - 'name': m - } for m in get_machine_list()] + 'choices': generate_checkbox_choices(get_machine_list()) }, ] answers = prompt(questions) + leader = None + + for machine in answers['machines']: + # init swarm with first machine + if leader is None: + leader = machine + print(init_swarm_machine(leader)) + else: + print(join_swarm_machine(machine, leader)) print(answers) +def generate_checkbox_choices(list): + """Generates checkbox entries for lists of strings + + :returns: A list of dicts with name keys + """ + return [{'name': m} for m in list] + + # }}} # ******************************