summaryrefslogtreecommitdiffstats
path: root/src/rgw/rgwam.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
commite6918187568dbd01842d8d1d2c808ce16a894239 (patch)
tree64f88b554b444a49f656b6c656111a145cbbaa28 /src/rgw/rgwam.py
parentInitial commit. (diff)
downloadceph-e6918187568dbd01842d8d1d2c808ce16a894239.tar.xz
ceph-e6918187568dbd01842d8d1d2c808ce16a894239.zip
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/rgw/rgwam.py')
-rwxr-xr-xsrc/rgw/rgwam.py240
1 files changed, 240 insertions, 0 deletions
diff --git a/src/rgw/rgwam.py b/src/rgw/rgwam.py
new file mode 100755
index 000000000..f07d2b423
--- /dev/null
+++ b/src/rgw/rgwam.py
@@ -0,0 +1,240 @@
+#!@Python3_EXECUTABLE@
+# -*- mode:python -*-
+# vim: ts=4 sw=4 smarttab expandtab
+#
+# Processed in Makefile to add python #! line and version variable
+#
+#
+
+import subprocess
+import random
+import string
+import json
+import argparse
+import sys
+import socket
+import base64
+import logging
+
+from urllib.parse import urlparse
+
+from ceph.rgw.rgwam_core import RGWAM, EnvArgs
+from ceph.rgw.types import RGWAMEnvMgr, RGWAMException
+
+class RGWAMCLIMgr(RGWAMEnvMgr):
+ def __init__(self, common_args):
+ args = []
+
+ if common_args.conf_path:
+ args += [ '-c', common_args.conf_path ]
+
+ if common_args.ceph_name:
+ args += [ '-n', common_args.ceph_name ]
+
+ if common_args.ceph_keyring:
+ args += [ '-k', common_args.ceph_keyring ]
+
+ self.args_prefix = args
+
+ def tool_exec(self, prog, args):
+ run_cmd = [ prog ] + self.args_prefix + args
+
+ result = subprocess.run(run_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ stdout = result.stdout.decode('utf-8')
+ stderr = result.stderr.decode('utf-8')
+
+ return run_cmd, result.returncode, stdout, stderr
+
+ def apply_rgw(self, svc_id, realm_name, zone_name, port = None):
+ return None
+
+ def list_daemons(self, service_name, daemon_type = None, daemon_id = None, hostname = None, refresh = True):
+ return []
+
+class RealmCommand:
+ def __init__(self, env, args):
+ self.env = env
+ self.args = args
+
+ def parse(self):
+ parser = argparse.ArgumentParser(
+ usage='''rgwam realm <subcommand>
+
+The subcommands are:
+ bootstrap Bootstrap new realm
+ new-zone-creds Create credentials for connecting new zone
+''')
+ parser.add_argument('subcommand', help='Subcommand to run')
+ # parse_args defaults to [1:] for args, but you need to
+ # exclude the rest of the args too, or validation will fail
+ args = parser.parse_args(self.args[0:1])
+
+ sub = args.subcommand.replace('-', '_')
+
+ if not hasattr(self, sub):
+ print('Unrecognized subcommand:', args.subcommand)
+ parser.print_help()
+ exit(1)
+ # use dispatch pattern to invoke method with same name
+
+ return getattr(self, sub)
+
+ def bootstrap(self):
+ parser = argparse.ArgumentParser(
+ description='Bootstrap new realm',
+ usage='rgwam realm bootstrap [<args>]')
+ parser.add_argument('--realm')
+ parser.add_argument('--zonegroup')
+ parser.add_argument('--zone')
+ parser.add_argument('--endpoints')
+ parser.add_argument('--sys-uid')
+ parser.add_argument('--uid')
+ parser.add_argument('--start-radosgw', action='store_true', dest='start_radosgw', default=True)
+ parser.add_argument('--no-start-radosgw', action='store_false', dest='start_radosgw')
+
+ args = parser.parse_args(self.args[1:])
+
+ return RGWAM(self.env).realm_bootstrap(args.realm, args.zonegroup, args.zone, args.endpoints,
+ args.sys_uid, args.uid, args.start_radosgw)
+
+ def new_zone_creds(self):
+ parser = argparse.ArgumentParser(
+ description='Bootstrap new realm',
+ usage='rgwam realm new-zone-creds [<args>]')
+ parser.add_argument('--endpoints')
+ parser.add_argument('--sys-uid')
+
+ args = parser.parse_args(self.args[1:])
+
+ return RGWAM(self.env).realm_new_zone_creds(args.endpoints, args.sys_uid)
+
+
+class ZoneCommand:
+ def __init__(self, env, args):
+ self.env = env
+ self.args = args
+
+ def parse(self):
+ parser = argparse.ArgumentParser(
+ usage='''rgwam zone <subcommand>
+
+The subcommands are:
+ run run radosgw daemon in current zone
+''')
+ parser.add_argument('subcommand', help='Subcommand to run')
+ # parse_args defaults to [1:] for args, but you need to
+ # exclude the rest of the args too, or validation will fail
+ args = parser.parse_args(self.args[0:1])
+ if not hasattr(self, args.subcommand):
+ print('Unrecognized subcommand:', args.subcommand)
+ parser.print_help()
+ exit(1)
+ # use dispatch pattern to invoke method with same name
+ return getattr(self, args.subcommand)
+
+ def run(self):
+ parser = argparse.ArgumentParser(
+ description='Run radosgw daemon',
+ usage='rgwam zone run [<args>]')
+ parser.add_argument('--port')
+ parser.add_argument('--log-file')
+ parser.add_argument('--debug-ms')
+ parser.add_argument('--debug-rgw')
+
+ args = parser.parse_args(self.args[1:])
+
+ return RGWAM(self.env).run_radosgw(port = args.port)
+
+ def create(self):
+ parser = argparse.ArgumentParser(
+ description='Create new zone to join existing realm',
+ usage='rgwam zone create [<args>]')
+ parser.add_argument('--realm-token')
+ parser.add_argument('--zone')
+ parser.add_argument('--zonegroup')
+ parser.add_argument('--endpoints')
+ parser.add_argument('--start-radosgw', action='store_true', dest='start_radosgw', default=True)
+ parser.add_argument('--no-start-radosgw', action='store_false', dest='start_radosgw')
+
+ args = parser.parse_args(self.args[1:])
+
+ return RGWAM(self.env).zone_create(args.realm_token, args.zonegroup, args.zone, args.endpoints, args.start_radosgw)
+
+class CommonArgs:
+ def __init__(self, ns):
+ self.conf_path = ns.conf_path
+ self.ceph_name = ns.ceph_name
+ self.ceph_keyring = ns.ceph_keyring
+
+class TopLevelCommand:
+
+ def _parse(self):
+ parser = argparse.ArgumentParser(
+ description='RGW assist for multisite tool',
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ epilog='''
+The commands are:
+ realm bootstrap Bootstrap new realm
+ realm new-zone-creds Create credentials to connect new zone to realm
+ zone create Create new zone and connect it to existing realm
+ zone run Run radosgw in current zone
+''')
+
+ parser.add_argument('command', help='command to run', default=None)
+ parser.add_argument('-c', help='ceph conf path', dest='conf_path')
+ parser.add_argument('-n', help='ceph user name', dest='ceph_name')
+ parser.add_argument('-k', help='ceph keyring', dest='ceph_keyring')
+
+ removed_args = []
+
+ args = sys.argv[1:]
+ if len(args) > 0:
+ if hasattr(self, args[0]):
+ # remove -h/--help if top command is not empty so that top level help
+ # doesn't override subcommand, we'll add it later
+ help_args = [ '-h', '--help' ]
+ removed_args = [arg for arg in args if arg in help_args]
+ args = [arg for arg in args if arg not in help_args]
+
+ (ns, args) = parser.parse_known_args(args)
+ if not hasattr(self, ns.command) or ns.command[0] == '_':
+ print('Unrecognized command:', ns.command)
+ parser.print_help()
+ exit(1)
+ # use dispatch pattern to invoke method with same name
+ args += removed_args
+ return (getattr(self, ns.command), CommonArgs(ns), args)
+
+ def realm(self, env, args):
+ cmd = RealmCommand(env, args).parse()
+ return cmd()
+
+ def zone(self, env, args):
+ cmd = ZoneCommand(env, args).parse()
+ return cmd()
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+
+ log = logging.getLogger(__name__)
+
+ (cmd, common_args, args)= TopLevelCommand()._parse()
+
+ env = EnvArgs(RGWAMCLIMgr(common_args))
+
+ try:
+ retval, out, err = cmd(env, args)
+ if retval != 0:
+ log.error('stdout: '+ out + '\nstderr: ' + err)
+ sys.exit(retval)
+ except RGWAMException as e:
+ print('ERROR: ' + e.message)
+
+ sys.exit(0)
+
+
+if __name__ == '__main__':
+ main()
+