improve missing arg handling
- better error messages - missing instrument is only allowed with 'list' - missing argument to be replaced with ? in error message - sea cli may now be given with 'graph' or 'sea' for service
This commit is contained in:
11
__init__.py
11
__init__.py
@ -49,7 +49,7 @@ class SewebManager(ServiceManager):
|
|||||||
|
|
||||||
|
|
||||||
all = NicosManager, FrappyManager, SeaManager, SewebManager
|
all = NicosManager, FrappyManager, SeaManager, SewebManager
|
||||||
|
KINDS = 'action', 'ins', 'service'
|
||||||
|
|
||||||
def run(group, arglist):
|
def run(group, arglist):
|
||||||
try:
|
try:
|
||||||
@ -68,7 +68,7 @@ def run(group, arglist):
|
|||||||
'service': lambda arg: arg in serv.services,
|
'service': lambda arg: arg in serv.services,
|
||||||
}
|
}
|
||||||
|
|
||||||
for kind in 'action', 'ins', 'service':
|
for kind in KINDS:
|
||||||
if arglist and arg_is[kind](arglist[0]): # arg is of expected kind
|
if arglist and arg_is[kind](arglist[0]): # arg is of expected kind
|
||||||
args[kind] = arglist.pop(0)
|
args[kind] = arglist.pop(0)
|
||||||
continue
|
continue
|
||||||
@ -91,8 +91,11 @@ def run(group, arglist):
|
|||||||
args.setdefault('ins', serv.main_ins)
|
args.setdefault('ins', serv.main_ins)
|
||||||
if guessed_args:
|
if guessed_args:
|
||||||
args.setdefault('action', 'gui')
|
args.setdefault('action', 'gui')
|
||||||
print('do you mean:\n %s %s %s %s %s' %
|
guessed = [group] + [args.get(k, '') for k in KINDS] + extra
|
||||||
(group, args.get('action', ''), args.get('ins', ''), args.get('service', ''), ' '.join(extra)))
|
while not guessed[-1]:
|
||||||
|
guessed.pop()
|
||||||
|
guessed = ' '.join(a or '?' for a in guessed)
|
||||||
|
print(f'do you mean:\n {guessed}')
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
serv.action(args['action'], *serv.treat_args(args, extra + arglist))
|
serv.action(args['action'], *serv.treat_args(args, extra + arglist))
|
||||||
|
20
base.py
20
base.py
@ -222,7 +222,7 @@ class ServiceManager:
|
|||||||
|
|
||||||
or None, when no wildcard character in ins
|
or None, when no wildcard character in ins
|
||||||
"""
|
"""
|
||||||
if ins is None or ins == 'all':
|
if not ins or ins == 'all':
|
||||||
return list(self.info)
|
return list(self.info)
|
||||||
pat = re.sub(r'(\.|\*)', '.*', ins)
|
pat = re.sub(r'(\.|\*)', '.*', ins)
|
||||||
if pat == ins:
|
if pat == ins:
|
||||||
@ -282,9 +282,9 @@ class ServiceManager:
|
|||||||
return done
|
return done
|
||||||
|
|
||||||
def do_stop(self, ins, service=None, *args):
|
def do_stop(self, ins, service=None, *args):
|
||||||
|
if not ins:
|
||||||
|
raise UsageError(f'need instrument or "all" to stop all')
|
||||||
self.get_info()
|
self.get_info()
|
||||||
if ins is None:
|
|
||||||
raise ValueError('use stop all if you really want to stop all')
|
|
||||||
ins_list = self.wildcard(ins)
|
ins_list = self.wildcard(ins)
|
||||||
if ins_list is not None:
|
if ins_list is not None:
|
||||||
return ins_list
|
return ins_list
|
||||||
@ -301,6 +301,8 @@ class ServiceManager:
|
|||||||
return env.get('%s_ROOT' % gr, ''), env
|
return env.get('%s_ROOT' % gr, ''), env
|
||||||
|
|
||||||
def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None, opts=''):
|
def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None, opts=''):
|
||||||
|
if not ins:
|
||||||
|
raise UsageError(f'need instrument or "all" to start all')
|
||||||
ins_list = self.wildcard(ins)
|
ins_list = self.wildcard(ins)
|
||||||
if ins_list is not None:
|
if ins_list is not None:
|
||||||
return ins_list
|
return ins_list
|
||||||
@ -319,10 +321,10 @@ class ServiceManager:
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
service_ports = self.get_ins_info(ins)
|
service_ports = self.get_ins_info(ins)
|
||||||
except ValueError:
|
except (KeyError, ValueError):
|
||||||
raise ValueError('do not know %r' % ins)
|
raise UsageError('do not know %r' % ins)
|
||||||
if ins in self.remote_hosts:
|
if ins in self.remote_hosts:
|
||||||
raise ValueError('can not start, %s is running on a remote host' % self.group)
|
raise UsageError('can not start, %s is running on a remote host' % self.group)
|
||||||
services = list(service_ports) if service is None else [service]
|
services = list(service_ports) if service is None else [service]
|
||||||
if restart:
|
if restart:
|
||||||
self.stop(ins, service)
|
self.stop(ins, service)
|
||||||
@ -406,8 +408,8 @@ class ServiceManager:
|
|||||||
os.chdir(wd)
|
os.chdir(wd)
|
||||||
|
|
||||||
def do_restart(self, ins, service=None, cfg=None, logger=None):
|
def do_restart(self, ins, service=None, cfg=None, logger=None):
|
||||||
if ins is None:
|
if not ins:
|
||||||
raise UsageError("need instance or 'all' or wildcard")
|
raise UsageError("need instrument or 'all' or wildcard")
|
||||||
ins_list = self.wildcard(ins)
|
ins_list = self.wildcard(ins)
|
||||||
if ins_list is not None:
|
if ins_list is not None:
|
||||||
if cfg is not None:
|
if cfg is not None:
|
||||||
@ -418,7 +420,7 @@ class ServiceManager:
|
|||||||
def do_run(self, ins, service=None, cfg=None, opts=''):
|
def do_run(self, ins, service=None, cfg=None, opts=''):
|
||||||
"""for tests: run and wait"""
|
"""for tests: run and wait"""
|
||||||
if self.wildcard(ins) is not None:
|
if self.wildcard(ins) is not None:
|
||||||
raise UsageError('no wildcards allowed with %s run' % self.group)
|
raise UsageError('need instrument and service for "%s run"' % self.group)
|
||||||
if not service:
|
if not service:
|
||||||
try:
|
try:
|
||||||
service, = self.services
|
service, = self.services
|
||||||
|
@ -68,7 +68,7 @@ class SeaManager(ServiceManager):
|
|||||||
%(legend)s
|
%(legend)s
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def do_cli(self, ins):
|
def do_cli(self, ins, service=None):
|
||||||
if self.wildcard(ins):
|
if self.wildcard(ins):
|
||||||
raise UsageError('wildcards not allowed in sea cli')
|
raise UsageError('wildcards not allowed in sea cli')
|
||||||
try:
|
try:
|
||||||
@ -78,7 +78,8 @@ class SeaManager(ServiceManager):
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
except KeyError: # running on an other machine?
|
except KeyError: # running on an other machine?
|
||||||
self.do_help()
|
self.do_help()
|
||||||
run_command('six -sea %s' % ins, wait=True)
|
service = service or 'sea'
|
||||||
|
run_command(f'six -{service} {ins}', wait=True)
|
||||||
|
|
||||||
def do_gui(self, ins='', *args):
|
def do_gui(self, ins='', *args):
|
||||||
if ins and self.wildcard(ins):
|
if ins and self.wildcard(ins):
|
||||||
@ -196,6 +197,8 @@ class SeaManager(ServiceManager):
|
|||||||
argdict['ins'] = arg
|
argdict['ins'] = arg
|
||||||
else:
|
else:
|
||||||
raise UsageError('unknown argument: %s' % arg)
|
raise UsageError('unknown argument: %s' % arg)
|
||||||
|
else:
|
||||||
|
print('env variable "InstrumentHostList" is not defined')
|
||||||
result = [argdict.pop('ins', '')]
|
result = [argdict.pop('ins', '')]
|
||||||
service = argdict.pop('service', '')
|
service = argdict.pop('service', '')
|
||||||
if service:
|
if service:
|
||||||
|
Reference in New Issue
Block a user