From 857017ac826eaee2b49ab6ef7f8f7be867b16afe Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Mon, 29 Nov 2021 17:39:44 +0100 Subject: [PATCH] refactor targets Signed-off-by: Pere Diaz Bou --- src/cephadm/box/box.py | 58 ++++++++++++++++------------------------- src/cephadm/box/host.py | 31 +++++++--------------- src/cephadm/box/osd.py | 41 ++++++++++------------------- src/cephadm/box/util.py | 31 +++++++++++++++++++--- 4 files changed, 74 insertions(+), 87 deletions(-) diff --git a/src/cephadm/box/box.py b/src/cephadm/box/box.py index f05f0e2a688d3..96acc8b377793 100755 --- a/src/cephadm/box/box.py +++ b/src/cephadm/box/box.py @@ -1,16 +1,15 @@ #!/bin/python3 -import sys import argparse import os import stat +import sys + import host import osd - -from util import Config, run_shell_command, run_cephadm_shell_command, \ - ensure_inside_container, ensure_outside_container, get_boxes_container_info, \ - inside_container, get_host_ips, run_dc_shell_command - - +from util import (Config, Target, ensure_inside_container, + ensure_outside_container, get_boxes_container_info, + get_host_ips, inside_container, run_cephadm_shell_command, + run_dc_shell_command, run_shell_command) CEPH_IMAGE = 'quay.ceph.io/ceph-ci/ceph:master' BOX_IMAGE = 'cephadm-box:latest' @@ -52,27 +51,18 @@ def get_box_image(): print('Box image added') - -class Cluster: +class Cluster(Target): _help = 'Manage docker cephadm boxes' actions = ['bootstrap', 'start', 'down', 'list', 'sh', 'setup', 'cleanup'] - parser = None - - @staticmethod - def add_parser(subparsers): - assert not Cluster.parser - Cluster.parser = subparsers.add_parser('cluster', help=Cluster._help) - parser = Cluster.parser - parser.add_argument('action', choices=Cluster.actions, help='Action to perform on the box') - parser.add_argument('--osds', type=int, default=1, help='Number of osds') - parser.add_argument('--hosts', type=int, default=1, help='Number of hosts') - parser.add_argument('--skip_deploy_osds', action='store_true', help='skip deploy osd') - parser.add_argument('--skip_create_loop', action='store_true', help='skip create loopback device') - parser.add_argument('--skip_monitoring_stack', action='store_true', help='skip monitoring stack') - parser.add_argument('--skip_dashboard', action='store_true', help='skip dashboard') - - def __init__(self, argv): - self.argv = argv + + def set_args(self): + self.parser.add_argument('action', choices=Cluster.actions, help='Action to perform on the box') + self.parser.add_argument('--osds', type=int, default=1, help='Number of osds') + self.parser.add_argument('--hosts', type=int, default=1, help='Number of hosts') + self.parser.add_argument('--skip_deploy_osds', action='store_true', help='skip deploy osd') + self.parser.add_argument('--skip_create_loop', action='store_true', help='skip create loopback device' ) + self.parser.add_argument('--skip_monitoring_stack', action='store_true', help='skip monitoring stack') + self.parser.add_argument('--skip_dashboard', action='store_true', help='skip dashboard') @ensure_outside_container def setup(self): @@ -238,12 +228,7 @@ class Cluster: print('Seed bash') run_shell_command('docker-compose exec seed bash') - def main(self): - parser = Cluster.parser - args = parser.parse_args(self.argv) - Config.add_args(vars(args)) - function = getattr(self, args.action) - function() + targets = { @@ -257,13 +242,16 @@ def main(): parser.add_argument('-v', action='store_true', dest='verbose', help='be more verbose') subparsers = parser.add_subparsers() - for _, target in targets.items(): - target.add_parser(subparsers) + target_instances = {} + for name, target in targets.items(): + target_instances[name] = target(None, subparsers) for count, arg in enumerate(sys.argv, 1): if arg in targets: - instance = targets[arg](sys.argv[count:]) + instance = target_instances[arg] if hasattr(instance, 'main'): + instance.argv = sys.argv[count:] + instance.set_args() args = parser.parse_args() Config.add_args(vars(args)) instance.main() diff --git a/src/cephadm/box/host.py b/src/cephadm/box/host.py index c91058d570098..df56fb53d7e45 100644 --- a/src/cephadm/box/host.py +++ b/src/cephadm/box/host.py @@ -1,7 +1,10 @@ import argparse import os from typing import List -from util import inside_container, run_shell_command, run_dc_shell_command, Config + +from util import (Config, Target, inside_container, run_dc_shell_command, + run_shell_command) + def _setup_ssh(container_index): if inside_container(): @@ -37,22 +40,14 @@ def _copy_cluster_ssh_key(ips: List[str]): # assume we only have one seed run_dc_shell_command(f'/cephadm/box/box.py {verbose} host copy_cluster_ssh_key 1 --ips {ips}', 1, 'seed') -class Host: +class Host(Target): _help = 'Run seed/host related commands' actions = ['setup_ssh', 'copy_cluster_ssh_key'] - parser = None - - def __init__(self, argv): - self.argv = argv - @staticmethod - def add_parser(subparsers): - assert not Host.parser - Host.parser = subparsers.add_parser('host', help=Host._help) - parser = Host.parser - parser.add_argument('action', choices=Host.actions) - parser.add_argument('host_container_index', type=str, help='box_host_{index}') - parser.add_argument('--ips', nargs='*', help='List of host ips') + def set_args(self): + self.parser.add_argument('action', choices=Host.actions) + self.parser.add_argument('host_container_index', type=str, help='box_host_{index}') + self.parser.add_argument('--ips', nargs='*', help='List of host ips') def setup_ssh(self): _setup_ssh(Config.get('host_container_index')) @@ -63,11 +58,3 @@ class Host: if not ips: ips = get_host_ips() _copy_cluster_ssh_key(ips) - - - def main(self): - parser = Host.parser - args = parser.parse_args(self.argv) - Config.add_args(vars(args)) - function = getattr(self, args.action) - function() diff --git a/src/cephadm/box/osd.py b/src/cephadm/box/osd.py index 74e977d513f9e..eaf520e77eb04 100644 --- a/src/cephadm/box/osd.py +++ b/src/cephadm/box/osd.py @@ -1,9 +1,11 @@ -from typing import Dict -import os import argparse import json -from util import ensure_inside_container, ensure_outside_container, run_shell_command, \ - run_cephadm_shell_command, Config +import os +from typing import Dict + +from util import (Config, Target, ensure_inside_container, + ensure_outside_container, run_cephadm_shell_command, + run_shell_command) def remove_loop_img() -> None: @@ -87,7 +89,7 @@ def cleanup() -> None: remove_loop_img() -class Osd: +class Osd(Target): _help = ''' Deploy osds and create needed block devices with loopback devices: Actions: @@ -96,21 +98,13 @@ class Osd: for a number of osds. ''' actions = ['deploy', 'create_loop'] - parser = None - - def __init__(self, argv): - self.argv = argv - - @staticmethod - def add_parser(subparsers): - assert not Osd.parser - Osd.parser = subparsers.add_parser('osd', help=Osd._help) - parser = Osd.parser - parser.add_argument('action', choices=Osd.actions) - parser.add_argument('--data', type=str, help='path to a block device') - parser.add_argument('--hostname', type=str, help='host to deploy osd') - parser.add_argument('--osds', type=int, default=0, help='number of osds') - parser.add_argument('--vg', type=str, help='Deploy with all lv from virtual group') + + def set_args(self): + self.parser.add_argument('action', choices=Osd.actions) + self.parser.add_argument('--data', type=str, help='path to a block device') + self.parser.add_argument('--hostname', type=str, help='host to deploy osd') + self.parser.add_argument('--osds', type=int, default=0, help='number of osds') + self.parser.add_argument('--vg', type=str, help='Deploy with all lv from virtual group') @ensure_inside_container def deploy(self): @@ -135,10 +129,3 @@ class Osd: create_loopback_devices(osds) print('Successfully added logical volumes in loopback devices') - def main(self): - parser = Osd.parser - args = parser.parse_args(self.argv) - Config.add_args(vars(args)) - function = getattr(self, args.action) - function() - diff --git a/src/cephadm/box/util.py b/src/cephadm/box/util.py index 3fcce5d811375..01ca3dc702a93 100644 --- a/src/cephadm/box/util.py +++ b/src/cephadm/box/util.py @@ -1,8 +1,9 @@ -from typing import Dict, List import argparse -import subprocess import os +import subprocess import sys +from typing import Dict, List + class Config: args = { @@ -26,6 +27,29 @@ class Config: def add_args(args: Dict[str, str]) -> argparse.ArgumentParser: Config.args.update(args) +class Target: + def __init__(self, argv, subparsers): + self.argv = argv + self.parser = subparsers.add_parser(self.__class__.__name__.lower(), + help=self.__class__._help) + + def set_args(self): + """ + adding the required arguments of the target should go here, example: + self.parser.add_argument(..) + """ + raise NotImplementedError() + + def main(self): + """ + A target will be setup by first calling this main function + where the parser is initialized. + """ + args = self.parser.parse_args(self.argv) + Config.add_args(vars(args)) + function = getattr(self, args.action) + function() + def ensure_outside_container(func) -> bool: def wrapper(*args, **kwargs): if not inside_container(): @@ -90,7 +114,8 @@ def inside_container() -> bool: @ensure_outside_container def get_host_ips() -> List[List[str]]: containers_info = get_boxes_container_info() - print(containers_info) + if Config.get('verbose'): + print(containers_info) ips = [] for container in containers_info: if container[1][:len('box_hosts')] == 'box_hosts': -- 2.39.5