#!/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'
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):
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 = {
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()
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():
# 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'))
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()
-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:
remove_loop_img()
-class Osd:
+class Osd(Target):
_help = '''
Deploy osds and create needed block devices with loopback devices:
Actions:
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):
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()
-
-from typing import Dict, List
import argparse
-import subprocess
import os
+import subprocess
import sys
+from typing import Dict, List
+
class Config:
args = {
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():
@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':