Refactor script part
This commit is contained in:
parent
6abb061dc8
commit
b08d5e1a34
@ -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)
|
||||
'''
|
||||
for name in self.podfile.pod.scripts.keys():
|
||||
self[name] = cli2.Callable(name, self.podfile.pod.script(name),)
|
||||
return super().__call__(*args, **kwargs)
|
||||
|
||||
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))
|
||||
|
||||
try:
|
||||
result = await asyncio.gather(*procs)
|
||||
except Mistake as e:
|
||||
print(e)
|
||||
sys.exit(1)
|
||||
except WrongResult:
|
||||
sys.exit(1)
|
||||
return script
|
||||
def call(self, command):
|
||||
try:
|
||||
return super().call(command)
|
||||
except Mistake as e:
|
||||
print(e)
|
||||
sys.exit(1)
|
||||
except WrongResult:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
console_script = ConsoleScript(__doc__).add_module('podctl.console_script')
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user