Add naive manager mechanism and prefetch command

This commit is contained in:
Dmitry Shulyak 2015-11-10 11:12:07 +02:00
parent aa76fbb49f
commit 742d699386
6 changed files with 52 additions and 1 deletions

View File

@ -0,0 +1,10 @@
#!/usr/bin/env python
import sys
import json
data = json.loads(sys.stdin.read())
rst = {'val_x_val': int(data['val'])**2}
sys.stdout.write(json.dumps(rst))

View File

@ -0,0 +1,11 @@
id: managed
handler: none
version: 1.0.0
manager: managers/manager.py
input:
val:
schema: int!
value: 2
val_x_val:
schema: int
value:

View File

@ -261,3 +261,17 @@ def remove(name, tag, f):
else:
msg = 'Resource %s will be removed after commiting changes.' % res.name # NOQA
click.echo(msg)
@resource.command()
@click.option('--name', '-n')
@click.option('--tag', '-t', multiple=True)
def prefetch(name, tag):
if name:
resources = [sresource.load(name)]
elif tag:
resources = sresource.load_by_tags(set(tag))
for res in resources:
res.prefetch()
click.echo(res.color_repr())

View File

@ -89,7 +89,8 @@ class Resource(object):
'version': metadata.get('version', ''),
'meta_inputs': inputs,
'tags': tags,
'state': RESOURCE_STATE.created.name
'state': RESOURCE_STATE.created.name,
'manager': metadata.get('manager')
})
self.create_inputs(args)
@ -285,6 +286,15 @@ class Resource(object):
receiver.db_obj.save_lazy()
self.db_obj.save_lazy()
def prefetch(self):
if not self.db_obj.manager:
return
manager_path = os.path.join(
self.db_obj.base_path, self.db_obj.manager)
data = json.dumps(self.args)
rst = utils.communicate([manager_path], data)
self.update(json.loads(rst))
def load(name):
r = DBResource.get(name)

View File

@ -715,6 +715,7 @@ class Resource(Model):
meta_inputs = Field(dict, default=dict)
state = Field(str) # on_set/on_get would be useful
events = Field(list, default=list)
manager = Field(str)
inputs = InputsField(default=dict)
tags = TagsField(default=list)

View File

@ -18,6 +18,7 @@ import json
import logging
import os
import uuid
from subprocess import Popen, PIPE, STDOUT
from jinja2 import Environment
import yaml
@ -34,6 +35,10 @@ def to_pretty_json(data):
return json.dumps(data, indent=4)
def communicate(command, data):
popen = Popen(command, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
return popen.communicate(input=data)[0]
# Configure jinja2 filters
jinja_env_with_filters = Environment()
jinja_env_with_filters.filters['to_json'] = to_json