Operations: fix updating of resource data with stage/commit
This commit is contained in:
parent
d1b1c31db9
commit
3a520dd544
@ -20,6 +20,6 @@ pip install -r solar/requirements.txt --download-cache=/tmp/$JOB_NAME
|
|||||||
|
|
||||||
pushd solar/solar
|
pushd solar/solar
|
||||||
|
|
||||||
PYTHONPATH=$WORKSPACE/solar CONFIG_FILE=$CONFIG_FILE py.test test/
|
PYTHONPATH=$WORKSPACE/solar CONFIG_FILE=$CONFIG_FILE py.test -s test/
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
@ -3,7 +3,7 @@ import handlers
|
|||||||
|
|
||||||
|
|
||||||
def resource_action(resource, action):
|
def resource_action(resource, action):
|
||||||
handler = resource.metadata['handler']
|
handler = resource.metadata.get('handler', 'none')
|
||||||
with handlers.get(handler)([resource]) as h:
|
with handlers.get(handler)([resource]) as h:
|
||||||
return h.action(resource, action)
|
return h.action(resource, action)
|
||||||
|
|
||||||
|
@ -67,6 +67,8 @@ class Resource(object):
|
|||||||
'Argument {} not implemented for resource {}'.format(k, self)
|
'Argument {} not implemented for resource {}'.format(k, self)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if isinstance(v, dict) and 'value' in v:
|
||||||
|
v = v['value']
|
||||||
self.metadata['input'][k]['value'] = v
|
self.metadata['input'][k]['value'] = v
|
||||||
|
|
||||||
db.save(self.name, self.metadata, collection=db.COLLECTIONS.resource)
|
db.save(self.name, self.metadata, collection=db.COLLECTIONS.resource)
|
||||||
@ -168,6 +170,15 @@ def wrap_resource(raw_resource):
|
|||||||
return Resource(name, raw_resource, args, tags=tags, virtual_resource=virtual_resource)
|
return Resource(name, raw_resource, args, tags=tags, virtual_resource=virtual_resource)
|
||||||
|
|
||||||
|
|
||||||
|
def wrap_resource_no_value(raw_resource):
|
||||||
|
name = raw_resource['id']
|
||||||
|
args = {k: v for k, v in raw_resource['input'].items()}
|
||||||
|
tags = raw_resource.get('tags', [])
|
||||||
|
virtual_resource = raw_resource.get('virtual_resource', [])
|
||||||
|
|
||||||
|
return Resource(name, raw_resource, args, tags=tags, virtual_resource=virtual_resource)
|
||||||
|
|
||||||
|
|
||||||
def load(resource_name):
|
def load(resource_name):
|
||||||
raw_resource = db.read(resource_name, collection=db.COLLECTIONS.resource)
|
raw_resource = db.read(resource_name, collection=db.COLLECTIONS.resource)
|
||||||
|
|
||||||
|
@ -116,6 +116,8 @@ def commit(li, resources, commited, history):
|
|||||||
commited[li.res]['metadata'])
|
commited[li.res]['metadata'])
|
||||||
result_state = execute(commited_res, 'remove')
|
result_state = execute(commited_res, 'remove')
|
||||||
|
|
||||||
|
staged_res.set_args_from_dict(staged_data['input'])
|
||||||
|
|
||||||
if result_state is state.STATES.success:
|
if result_state is state.STATES.success:
|
||||||
result_state = execute(staged_res, 'run')
|
result_state = execute(staged_res, 'run')
|
||||||
else:
|
else:
|
||||||
|
@ -4,7 +4,7 @@ import tempfile
|
|||||||
import unittest
|
import unittest
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from solar.core import resource as xr
|
from solar.core import virtual_resource as vr
|
||||||
from solar.core import signals as xs
|
from solar.core import signals as xs
|
||||||
from solar.interfaces.db import get_db
|
from solar.interfaces.db import get_db
|
||||||
|
|
||||||
@ -31,4 +31,4 @@ class BaseResourceTest(unittest.TestCase):
|
|||||||
return path
|
return path
|
||||||
|
|
||||||
def create_resource(self, name, src, args):
|
def create_resource(self, name, src, args):
|
||||||
return xr.create(name, src, args)
|
return vr.create(name, src, args)[0]
|
||||||
|
@ -15,7 +15,8 @@ def default_resources():
|
|||||||
{'id': 'node1',
|
{'id': 'node1',
|
||||||
'input': {'ip': {'value':'10.0.0.3'}}})
|
'input': {'ip': {'value':'10.0.0.3'}}})
|
||||||
rabbitmq_service1 = resource.wrap_resource(
|
rabbitmq_service1 = resource.wrap_resource(
|
||||||
{'id':'rabbitmq', 'input': {
|
{'id':'rabbitmq',
|
||||||
|
'input': {
|
||||||
'ip' : {'value': ''},
|
'ip' : {'value': ''},
|
||||||
'image': {'value': 'rabbitmq:3-management'}}})
|
'image': {'value': 'rabbitmq:3-management'}}})
|
||||||
signals.connect(node1, rabbitmq_service1)
|
signals.connect(node1, rabbitmq_service1)
|
||||||
|
@ -11,7 +11,8 @@ def resources():
|
|||||||
{'id': 'node1',
|
{'id': 'node1',
|
||||||
'input': {'ip': {'value': '10.0.0.3'}}})
|
'input': {'ip': {'value': '10.0.0.3'}}})
|
||||||
mariadb_service1 = resource.wrap_resource(
|
mariadb_service1 = resource.wrap_resource(
|
||||||
{'id': 'mariadb', 'input': {
|
{'id': 'mariadb',
|
||||||
|
'input': {
|
||||||
'port' : {'value': 3306},
|
'port' : {'value': 3306},
|
||||||
'ip': {'value': ''}}})
|
'ip': {'value': ''}}})
|
||||||
keystone_db = resource.wrap_resource(
|
keystone_db = resource.wrap_resource(
|
||||||
@ -50,29 +51,85 @@ def test_update_port_on_mariadb(resources):
|
|||||||
('change', u'metadata.input.login_port.value', (3306, 4400))]
|
('change', u'metadata.input.login_port.value', (3306, 4400))]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def simple_input():
|
||||||
|
res1 = resource.wrap_resource(
|
||||||
|
{'id': 'res1',
|
||||||
|
'input': {'ip': {'value': '10.10.0.2'}}})
|
||||||
|
res2 = resource.wrap_resource(
|
||||||
|
{'id': 'res2',
|
||||||
|
'input': {'ip': {'value': '10.10.0.3'}}})
|
||||||
|
|
||||||
|
signals.connect(res1, res2)
|
||||||
|
return resource.load_all()
|
||||||
|
|
||||||
|
|
||||||
|
def test_update_simple_resource(simple_input):
|
||||||
|
operations.stage_changes()
|
||||||
|
operations.commit_changes()
|
||||||
|
|
||||||
|
res1 = simple_input['res1']
|
||||||
|
res1.update({'ip': '10.0.0.3'})
|
||||||
|
|
||||||
|
log = operations.stage_changes()
|
||||||
|
|
||||||
|
assert len(log) == 2
|
||||||
|
|
||||||
|
assert log.items[0].diff == [
|
||||||
|
('change', u'input.ip.value', ('10.10.0.2', '10.0.0.3')),
|
||||||
|
('change', 'metadata.input.ip.value', ('10.10.0.2', '10.0.0.3')),
|
||||||
|
]
|
||||||
|
assert log.items[1].diff == [
|
||||||
|
('change', u'input.ip.value', ('10.10.0.2', '10.0.0.3')),
|
||||||
|
('change', 'metadata.input.ip.value', ('10.10.0.2', '10.0.0.3')),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations.commit_changes()
|
||||||
|
assert simple_input['res1'].args_dict() == {
|
||||||
|
'ip': '10.0.0.3',
|
||||||
|
}
|
||||||
|
assert simple_input['res2'].args_dict() == {
|
||||||
|
'ip': '10.0.0.3',
|
||||||
|
}
|
||||||
|
|
||||||
|
log_item = operations.rollback_last()
|
||||||
|
assert log_item.diff == [
|
||||||
|
('change', u'input.ip.value', (u'10.0.0.3', u'10.10.0.2')),
|
||||||
|
('change', 'metadata.input.ip.value', ('10.0.0.3', '10.10.0.2')),
|
||||||
|
]
|
||||||
|
|
||||||
|
res2 = resource.load('res2')
|
||||||
|
assert res2.args_dict() == {
|
||||||
|
'ip': '10.10.0.2',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def list_input():
|
def list_input():
|
||||||
res1 = resource.wrap_resource(
|
res1 = resource.wrap_resource(
|
||||||
{'id': 'res1', 'input': {'ip': {'value': '10.10.0.2'}}})
|
{'id': 'res1',
|
||||||
|
'input': {'ip': {'value': '10.10.0.2'}}})
|
||||||
res2 = resource.wrap_resource(
|
res2 = resource.wrap_resource(
|
||||||
{'id': 'res2', 'input': {'ip': {'value': '10.10.0.3'}}})
|
{'id': 'res2',
|
||||||
|
'input': {'ip': {'value': '10.10.0.3'}}})
|
||||||
consumer = resource.wrap_resource(
|
consumer = resource.wrap_resource(
|
||||||
{'id': 'consumer', 'input':
|
{'id': 'consumer',
|
||||||
{'ips': {'value': [],
|
'input':
|
||||||
'schema': ['str']}}})
|
{'ips': {'value': [],
|
||||||
|
'schema': ['str']}}})
|
||||||
|
|
||||||
signals.connect(res1, consumer, {'ip': 'ips'})
|
signals.connect(res1, consumer, {'ip': 'ips'})
|
||||||
signals.connect(res2, consumer, {'ip': 'ips'})
|
signals.connect(res2, consumer, {'ip': 'ips'})
|
||||||
return resource.load_all()
|
return resource.load_all()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail
|
|
||||||
def test_update_list_resource(list_input):
|
def test_update_list_resource(list_input):
|
||||||
operations.stage_changes()
|
operations.stage_changes()
|
||||||
operations.commit_changes()
|
operations.commit_changes()
|
||||||
|
|
||||||
res3 = resource.wrap_resource(
|
res3 = resource.wrap_resource(
|
||||||
{'id': 'res3', 'input': {'ip': {'value': '10.10.0.4'}}})
|
{'id': 'res3',
|
||||||
|
'input': {'ip': {'value': '10.10.0.4'}}})
|
||||||
signals.connect(res3, list_input['consumer'], {'ip': 'ips'})
|
signals.connect(res3, list_input['consumer'], {'ip': 'ips'})
|
||||||
|
|
||||||
log = operations.stage_changes()
|
log = operations.stage_changes()
|
||||||
@ -110,5 +167,3 @@ def test_update_list_resource(list_input):
|
|||||||
{u'emitter': u'ip',
|
{u'emitter': u'ip',
|
||||||
u'emitter_attached_to': u'res2',
|
u'emitter_attached_to': u'res2',
|
||||||
u'value': u'10.10.0.3'}]}
|
u'value': u'10.10.0.3'}]}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user