Refactor script part

This commit is contained in:
jpic 2020-02-12 11:53:50 +01:00
parent 6abb061dc8
commit b08d5e1a34
4 changed files with 65 additions and 76 deletions

View File

@ -19,51 +19,18 @@ class ConsoleScript(cli2.ConsoleScript):
import inspect
from podctl.podfile import Podfile
self.podfile = Podfile.factory(os.getenv('PODFILE', 'pod.py'))
for name in self.podfile.pod.script_names():
self[name] = self.podfile.pod.script(name)
'''
ee = self.script(pod, name)
ee.__doc__ = inspect.getdoc(cb)
self[name] = cli2.Callable(name, ee)
'''
super().__call__(*args, **kwargs)
@staticmethod
def script(script_name):
async def script(*services_or_flags, **options):
flags = []
services = []
for arg in services_or_flags:
if arg.startswith('-') or arg.startswith('+'):
flags.append(arg)
else:
services.append(arg)
if services:
services = {
k: v
for k, v in console_script.pod.services.items()
if k in services
}
else:
services = console_script.pod.services
procs = []
asyncio.events.get_event_loop()
for name, service in services.items():
service.container.name = name
service.container.flags = flags
procs.append(service.container.script(script_name, flags))
for name in self.podfile.pod.scripts.keys():
self[name] = cli2.Callable(name, self.podfile.pod.script(name),)
return super().__call__(*args, **kwargs)
def call(self, command):
try:
result = await asyncio.gather(*procs)
return super().call(command)
except Mistake as e:
print(e)
sys.exit(1)
except WrongResult:
sys.exit(1)
return script
console_script = ConsoleScript(__doc__).add_module('podctl.console_script')

View File

@ -8,12 +8,4 @@ from .visitable import Visitable
class Container(Visitable):
default_scripts = dict(
build=Build(),
run=Run(),
)
def script(self, name):
script = super().script(name)
script.container = self
return script
pass

View File

@ -1,21 +1,42 @@
import asyncio
import copy
import os
from .build import Build
from .container import Container
from .run import Run
from .script import Script
from .visitable import Visitable
class Pod(Visitable):
def script_names(self):
for name in self.scripts.keys():
yield name
default_scripts = dict(
build=Build(),
run=Run(),
)
for visitor in self.visitors:
for script in visitor.scripts.keys():
yield script
@property
def containers(self):
return [i for i in self.visitors if type(i) == Container]
def script(self, name):
for script_name in self.scripts.keys():
if script_name == name:
break
script.pod = self
return script
async def cb(*args, **kwargs):
asyncio.events.get_event_loop()
script = copy.deepcopy(self.scripts[name])
if args:
containers = [c for c in self.containers if c.name in args]
else:
containers = self.containers
procs = []
for container in containers:
procs.append(script(
container,
*args,
container=container,
pod=self,
**kwargs,
))
return await asyncio.gather(*procs)
return cb

View File

@ -4,6 +4,9 @@ from .proc import Proc
class Script:
def __init__(self, name=None):
self.name = name or type(self).__name__.lower()
async def exec(self, *args, **kwargs):
"""Execute a command on the host."""
kwargs.setdefault('prefix', self.container.name)
@ -12,27 +15,33 @@ class Script:
await proc.wait()
return proc
async def __call__(self, name, loop=None):
script = copy(self.scripts[name])
script.loop = loop or asyncio.events.get_event_loop()
results = []
async def __call__(self, visitable, *args, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
visitors = visitable.visitors
results = []
async def clean():
for visitor in self.visitors:
if hasattr(visitor, 'clean_' + name):
result = getattr(visitor, 'clean_' + name)(script)
for visitor in visitable.visitors:
if hasattr(visitor, 'clean_' + self.name):
result = getattr(visitor, 'clean_' + self.name)(self)
if result:
await result
for prefix in ('init_', 'pre_', '', 'post_', 'clean_'):
method = prefix + name
for visitor in self.visitors:
method = prefix + self.name
for visitor in visitable.visitors:
if not hasattr(visitor, method):
continue
rep = {k: v if not isinstance(v, object) else type(v).__name__ for k, v in visitor.__dict__.items()}
print(self.name + ' | ', type(visitor).__name__, method, rep)
result = getattr(visitor, method)(script)
print(
visitable.name + ' | ',
type(visitor).__name__,
method,
' '.join(f'{k}={v}' for k, v in visitor.__dict__.items())
)
result = getattr(visitor, method)(self)
if result:
try:
await result