]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
refactor targets
authorPere Diaz Bou <pdiazbou@redhat.com>
Mon, 29 Nov 2021 16:39:44 +0000 (17:39 +0100)
committerPere Diaz Bou <pdiazbou@redhat.com>
Wed, 15 Dec 2021 14:38:10 +0000 (15:38 +0100)
Signed-off-by: Pere Diaz Bou <pdiazbou@redhat.com>
src/cephadm/box/box.py
src/cephadm/box/host.py
src/cephadm/box/osd.py
src/cephadm/box/util.py

index f05f0e2a688d3976de02d8e666ff4c72a27668a7..96acc8b3777938e597bcf897b26d70bf0be50b67 100755 (executable)
@@ -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()
index c91058d5700989114aba3b5f853869366dd4120e..df56fb53d7e458a53b1db8035f84375ad0d2a83f 100644 (file)
@@ -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()
index 74e977d513f9ed884f043d3ccd701d255895f855..eaf520e77eb048ad309f47fbdca5ea66cf805b12 100644 (file)
@@ -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()
-    
index 3fcce5d811375e95b6cc26107fdb4e83a2d67909..01ca3dc702a93b6cb414959126141722913f6d86 100644 (file)
@@ -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':