introduce wildcards for <instance>
This commit is contained in:
47
base.py
47
base.py
@@ -202,6 +202,15 @@ class ServiceManager:
|
||||
result.setdefault(ins, {}).setdefault(serv, []).append(p)
|
||||
return result
|
||||
|
||||
def wildcard(self, ins):
|
||||
if ins is None or ins == 'all':
|
||||
return list(self.info)
|
||||
pat = re.sub(r'(\.|\*)', '.*', ins)
|
||||
if pat == ins:
|
||||
return None
|
||||
pat = re.compile(pat)
|
||||
return [k for k in self.info if pat.match(k)]
|
||||
|
||||
def check_running(self, ins, service):
|
||||
self.get_info()
|
||||
if ins not in self.info:
|
||||
@@ -215,6 +224,9 @@ class ServiceManager:
|
||||
|
||||
def stop(self, ins, service=None):
|
||||
"""stop service (or all services) of instance <ins>"""
|
||||
ins_list = self.wildcard(ins)
|
||||
if ins_list is not None:
|
||||
return ins_list
|
||||
procs = self.get_procs()
|
||||
done = False
|
||||
services = self.services if service is None else [service]
|
||||
@@ -247,6 +259,9 @@ class ServiceManager:
|
||||
|
||||
def do_stop(self, ins, service=None, *args):
|
||||
self.get_info()
|
||||
ins_list = self.wildcard(ins)
|
||||
if ins_list is not None:
|
||||
return ins_list
|
||||
if not self.stop(ins, service):
|
||||
print('nothing to stop')
|
||||
|
||||
@@ -258,6 +273,9 @@ class ServiceManager:
|
||||
return env.get('%s_ROOT' % gr, ''), env
|
||||
|
||||
def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None):
|
||||
ins_list = self.wildcard(ins)
|
||||
if ins_list is not None:
|
||||
return ins_list
|
||||
if logger is None:
|
||||
class logger:
|
||||
@staticmethod
|
||||
@@ -349,10 +367,15 @@ class ServiceManager:
|
||||
os.chdir(wd)
|
||||
|
||||
def do_restart(self, ins, service=None, cfg=None, logger=None):
|
||||
ins_list = self.wildcard(ins)
|
||||
if ins_list is not None:
|
||||
return ins_list
|
||||
self.do_start(ins, service, cfg, True, logger=logger)
|
||||
|
||||
def do_run(self, ins, service=None, cfg=None):
|
||||
"""for tests: run and wait"""
|
||||
if self.wildcard(ins) is not None:
|
||||
raise UsageError('no wildcards allowed with %s run' % self.group)
|
||||
if not service:
|
||||
try:
|
||||
service, = self.services
|
||||
@@ -362,17 +385,22 @@ class ServiceManager:
|
||||
|
||||
def do_list(self, ins=None, *args):
|
||||
"""info about running services"""
|
||||
show_unused = ins == 'all'
|
||||
if show_unused:
|
||||
ins = None
|
||||
instances = self.wildcard(ins)
|
||||
if instances is None:
|
||||
ins_set = {ins}
|
||||
else:
|
||||
ins_set = set(instances)
|
||||
cfginfo = {}
|
||||
procs = self.get_procs(self.all, cfginfo)
|
||||
rows = []
|
||||
merged = OrderedDict()
|
||||
show_unused = ins == 'all'
|
||||
if show_unused:
|
||||
ins = None
|
||||
for group, sm in self.all.items():
|
||||
sm.get_info()
|
||||
for ins_i, info_dict in sm.info.items():
|
||||
if ins is not None and ins != ins_i:
|
||||
if ins_i not in ins_set:
|
||||
continue
|
||||
for serv, port in info_dict.items():
|
||||
if ins_i not in merged:
|
||||
@@ -417,18 +445,25 @@ class ServiceManager:
|
||||
if not callable(method):
|
||||
raise UsageError('%s is no valid action' % action)
|
||||
try:
|
||||
method(*args)
|
||||
ins_list = method(*args)
|
||||
except TypeError as e:
|
||||
errtxt = str(e)
|
||||
if 'do_%s(' % action in errtxt and 'argument' in errtxt:
|
||||
raise UsageError(errtxt)
|
||||
raise
|
||||
# treat wildcards:
|
||||
for ins in ins_list or ():
|
||||
print('\n%s %s %s:' % (action, self.group, ins))
|
||||
try:
|
||||
method(ins, *args[1:])
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
|
||||
def do_help(self, *args):
|
||||
if self.main_ins:
|
||||
usage = self.USAGE.replace(' <instance>', '').replace(' [<instance>]', '') % ''
|
||||
else:
|
||||
usage = self.USAGE % ('<instance> is one of %s' % ', '.join(self.info))
|
||||
usage = self.USAGE % ('<instance> is one of %s' % ', '.join(self.info))
|
||||
print(usage)
|
||||
|
||||
def treat_args(self, argdict, unknown=(), extra=()):
|
||||
|
||||
Reference in New Issue
Block a user