3 # vim: ts=4 sw=4 smarttab expandtab
5 # Processed in Makefile to add python #! line and version variable
19 from urllib
.parse
import urlparse
21 from ceph
.rgw
.rgwam_core
import RGWAM
, EnvArgs
22 from ceph
.rgw
.types
import RGWAMEnvMgr
, RGWAMException
24 class RGWAMCLIMgr(RGWAMEnvMgr
):
25 def __init__(self
, common_args
):
28 if common_args
.conf_path
:
29 args
+= [ '-c', common_args
.conf_path
]
31 if common_args
.ceph_name
:
32 args
+= [ '-n', common_args
.ceph_name
]
34 if common_args
.ceph_keyring
:
35 args
+= [ '-k', common_args
.ceph_keyring
]
37 self
.args_prefix
= args
39 def tool_exec(self
, prog
, args
):
40 run_cmd
= [ prog
] + self
.args_prefix
+ args
42 result
= subprocess
.run(run_cmd
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
)
44 stdout
= result
.stdout
.decode('utf-8')
45 stderr
= result
.stderr
.decode('utf-8')
47 return run_cmd
, result
.returncode
, stdout
, stderr
49 def apply_rgw(self
, svc_id
, realm_name
, zone_name
, port
= None):
52 def list_daemons(self
, service_name
, daemon_type
= None, daemon_id
= None, hostname
= None, refresh
= True):
56 def __init__(self
, env
, args
):
61 parser
= argparse
.ArgumentParser(
62 usage
='''rgwam realm <subcommand>
65 bootstrap Bootstrap new realm
66 new-zone-creds Create credentials for connecting new zone
68 parser
.add_argument('subcommand', help='Subcommand to run')
69 # parse_args defaults to [1:] for args, but you need to
70 # exclude the rest of the args too, or validation will fail
71 args
= parser
.parse_args(self
.args
[0:1])
73 sub
= args
.subcommand
.replace('-', '_')
75 if not hasattr(self
, sub
):
76 print('Unrecognized subcommand:', args
.subcommand
)
79 # use dispatch pattern to invoke method with same name
81 return getattr(self
, sub
)
84 parser
= argparse
.ArgumentParser(
85 description
='Bootstrap new realm',
86 usage
='rgwam realm bootstrap [<args>]')
87 parser
.add_argument('--realm')
88 parser
.add_argument('--zonegroup')
89 parser
.add_argument('--zone')
90 parser
.add_argument('--endpoints')
91 parser
.add_argument('--sys-uid')
92 parser
.add_argument('--uid')
93 parser
.add_argument('--start-radosgw', action
='store_true', dest
='start_radosgw', default
=True)
94 parser
.add_argument('--no-start-radosgw', action
='store_false', dest
='start_radosgw')
96 args
= parser
.parse_args(self
.args
[1:])
98 return RGWAM(self
.env
).realm_bootstrap(args
.realm
, args
.zonegroup
, args
.zone
, args
.endpoints
,
99 args
.sys_uid
, args
.uid
, args
.start_radosgw
)
101 def new_zone_creds(self
):
102 parser
= argparse
.ArgumentParser(
103 description
='Bootstrap new realm',
104 usage
='rgwam realm new-zone-creds [<args>]')
105 parser
.add_argument('--endpoints')
106 parser
.add_argument('--sys-uid')
108 args
= parser
.parse_args(self
.args
[1:])
110 return RGWAM(self
.env
).realm_new_zone_creds(args
.endpoints
, args
.sys_uid
)
114 def __init__(self
, env
, args
):
119 parser
= argparse
.ArgumentParser(
120 usage
='''rgwam zone <subcommand>
123 run run radosgw daemon in current zone
125 parser
.add_argument('subcommand', help='Subcommand to run')
126 # parse_args defaults to [1:] for args, but you need to
127 # exclude the rest of the args too, or validation will fail
128 args
= parser
.parse_args(self
.args
[0:1])
129 if not hasattr(self
, args
.subcommand
):
130 print('Unrecognized subcommand:', args
.subcommand
)
133 # use dispatch pattern to invoke method with same name
134 return getattr(self
, args
.subcommand
)
137 parser
= argparse
.ArgumentParser(
138 description
='Run radosgw daemon',
139 usage
='rgwam zone run [<args>]')
140 parser
.add_argument('--port')
141 parser
.add_argument('--log-file')
142 parser
.add_argument('--debug-ms')
143 parser
.add_argument('--debug-rgw')
145 args
= parser
.parse_args(self
.args
[1:])
147 return RGWAM(self
.env
).run_radosgw(port
= args
.port
)
150 parser
= argparse
.ArgumentParser(
151 description
='Create new zone to join existing realm',
152 usage
='rgwam zone create [<args>]')
153 parser
.add_argument('--realm-token')
154 parser
.add_argument('--zone')
155 parser
.add_argument('--zonegroup')
156 parser
.add_argument('--endpoints')
157 parser
.add_argument('--start-radosgw', action
='store_true', dest
='start_radosgw', default
=True)
158 parser
.add_argument('--no-start-radosgw', action
='store_false', dest
='start_radosgw')
160 args
= parser
.parse_args(self
.args
[1:])
162 return RGWAM(self
.env
).zone_create(args
.realm_token
, args
.zonegroup
, args
.zone
, args
.endpoints
, args
.start_radosgw
)
165 def __init__(self
, ns
):
166 self
.conf_path
= ns
.conf_path
167 self
.ceph_name
= ns
.ceph_name
168 self
.ceph_keyring
= ns
.ceph_keyring
170 class TopLevelCommand
:
173 parser
= argparse
.ArgumentParser(
174 description
='RGW assist for multisite tool',
175 formatter_class
=argparse
.RawDescriptionHelpFormatter
,
178 realm bootstrap Bootstrap new realm
179 realm new-zone-creds Create credentials to connect new zone to realm
180 zone create Create new zone and connect it to existing realm
181 zone run Run radosgw in current zone
184 parser
.add_argument('command', help='command to run', default
=None)
185 parser
.add_argument('-c', help='ceph conf path', dest
='conf_path')
186 parser
.add_argument('-n', help='ceph user name', dest
='ceph_name')
187 parser
.add_argument('-k', help='ceph keyring', dest
='ceph_keyring')
193 if hasattr(self
, args
[0]):
194 # remove -h/--help if top command is not empty so that top level help
195 # doesn't override subcommand, we'll add it later
196 help_args
= [ '-h', '--help' ]
197 removed_args
= [arg
for arg
in args
if arg
in help_args
]
198 args
= [arg
for arg
in args
if arg
not in help_args
]
200 (ns
, args
) = parser
.parse_known_args(args
)
201 if not hasattr(self
, ns
.command
) or ns
.command
[0] == '_':
202 print('Unrecognized command:', ns
.command
)
205 # use dispatch pattern to invoke method with same name
207 return (getattr(self
, ns
.command
), CommonArgs(ns
), args
)
209 def realm(self
, env
, args
):
210 cmd
= RealmCommand(env
, args
).parse()
213 def zone(self
, env
, args
):
214 cmd
= ZoneCommand(env
, args
).parse()
219 logging
.basicConfig(level
=logging
.INFO
)
221 log
= logging
.getLogger(__name__
)
223 (cmd
, common_args
, args
)= TopLevelCommand()._parse
()
225 env
= EnvArgs(RGWAMCLIMgr(common_args
))
228 retval
, out
, err
= cmd(env
, args
)
230 log
.error('stdout: '+ out
+ '\nstderr: ' + err
)
232 except RGWAMException
as e
:
233 print('ERROR: ' + e
.message
)
238 if __name__
== '__main__':