Create resource from node and connect it to resource during the assignment

This commit is contained in:
Evgeniy L 2015-05-28 12:10:08 +02:00
parent 5a362c262a
commit d1596dbd6e
3 changed files with 41 additions and 11 deletions

View File

@ -128,3 +128,7 @@ class Cmd(object):
def main(): def main():
api = Cmd() api = Cmd()
api.parse(sys.argv[1:]) api.parse(sys.argv[1:])
if __name__ == '__main__':
main()

View File

@ -1,4 +1,4 @@
# -*- coding: UTF-8 -*- # -*- coding: utf-8 -*-
RESOURCE_DB = {} RESOURCE_DB = {}

View File

@ -8,6 +8,8 @@ from copy import deepcopy
import yaml import yaml
import solar
from solar.core import actions from solar.core import actions
from solar.core import db from solar.core import db
from solar.core import observer from solar.core import observer
@ -125,6 +127,11 @@ def create(name, base_path, dest_path, args, connections={}):
raise Exception('Dest path is not a directory: {0}'.format(dest_path)) raise Exception('Dest path is not a directory: {0}'.format(dest_path))
dest_path = os.path.abspath(os.path.join(dest_path, name)) dest_path = os.path.abspath(os.path.join(dest_path, name))
if os.path.exists(dest_path):
print 'Skip creation of resource {0} because is already exists'.format(dest_path)
return db.get_resource(name) or get_resource_from_db(name)
base_meta_file = os.path.join(base_path, 'meta.yaml') base_meta_file = os.path.join(base_path, 'meta.yaml')
actions_path = os.path.join(base_path, 'actions') actions_path = os.path.join(base_path, 'actions')
@ -175,20 +182,39 @@ def load_all(dest_path):
return ret return ret
def get_resource_from_db(uid):
resource_path = os.path.join(solar.utils.read_config()['resource-instances-path'], uid)
return load(resource_path)
def assign_resources_to_nodes(resources, nodes, dst_dir): def assign_resources_to_nodes(resources, nodes, dst_dir):
for node in nodes: for node in nodes:
for resource in resources: for resource in resources:
merged = deepcopy(resource) res = deepcopy(resource)
# Node specific setting should override resource's res['tags'] = list(set(node.get('tags', [])) |
merged.update(deepcopy(node)) set(resource.get('tags', [])))
merged['tags'] = list(set(node.get('tags', [])) | resource_uuid = solar.utils.generate_uuid()
set(resource.get('tags', []))) # We should not generate here any uuid's, because
# a single node should be represented with a single
# resource
node_uuid = node['id']
create( node_resource_template = solar.utils.read_config()['node_resource_template']
format('{0}-{1}'.format(node['id'], resource['id'])), created_resource = create(resource_uuid, resource['dir_path'], dst_dir, res)
resource['dir_path'], created_node = create(node_uuid, node_resource_template, dst_dir, make_resource_from_node(node))
dst_dir,
merged) signals.connect(created_node, created_resource)
def make_resource_from_node(node):
node_resource_template = os.path.join(solar.utils.read_config()['node_resource_template'], 'meta.yaml')
template = yaml.load(open(node_resource_template).read())
template['input']['ip'] = node['ip']
template['input']['ssh_key'] = node['ssh_private_key_path']
template['input']['ssh_user'] = node['ssh_user']
template['tags'] = node['tags']
return template
def connect_resources(profile): def connect_resources(profile):