Enable support for software component

The group property indicates whether it is softwarecomponent or plain
softwareconfig.
If it is softwarecomponent, recognizes 'configs' section in metadata,
and choose a proper config to invoke depending on the 'deploy_action'
value.

Partially implements: blueprint action-aware-sw-config

Change-Id: I503032ed09fb5448da225c53c690543fa30d957f
This commit is contained in:
Victor HU 2014-08-27 11:22:42 +00:00 committed by Thomas Herve
parent 3f4c7da915
commit 0fd927af21
1 changed files with 88 additions and 68 deletions

View File

@ -38,78 +38,98 @@ def main(argv=sys.argv):
def invoke_hook(c, log):
# sanitise the group to get an alphanumeric hook file name
hook = "".join(
x for x in c['group'] if x == '-' or x == '_' or x.isalnum())
hook_path = os.path.join(HOOKS_DIR, hook)
# Sanitize input values (bug 1333992). Convert all String
# inputs to strings if they're not already
hot_inputs = c.get('inputs', [])
for hot_input in hot_inputs:
if hot_input.get('type', None) == 'String' and \
not isinstance(hot_input['value'], basestring):
hot_input['value'] = str(hot_input['value'])
iv = dict((i['name'], i['value']) for i in c['inputs'])
# The group property indicates whether it is softwarecomponent or
# plain softwareconfig
# If it is softwarecomponent, pick up a property config to invoke
# according to deploy_action
group = c.get('group')
if group == 'component':
found = false
action = iv.get('deploy_action')
config = c.get('config')
configs = config.get('configs')
if configs:
for cfg in configs:
if action in cfg['actions']:
c['config'] = cfg['config']
c['group'] = cfg['tool']
found = true
break
if not found:
log.warn('Skipping group %s, no valid script is defined'
' for deploy action %s' % (group, action))
return
signal_data = None
if not os.path.exists(hook_path):
log.warn('Skipping group %s with no hook script %s' % (
c['group'], hook_path))
# sanitise the group to get an alphanumeric hook file name
hook = "".join(
x for x in c['group'] if x == '-' or x == '_' or x.isalnum())
hook_path = os.path.join(HOOKS_DIR, hook)
signal_data = None
if not os.path.exists(hook_path):
log.warn('Skipping group %s with no hook script %s' % (
c['group'], hook_path))
else:
log.debug('Running %s' % hook_path)
subproc = subprocess.Popen([hook_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = subproc.communicate(input=json.dumps(c))
log.info(stdout)
log.debug(stderr)
if subproc.returncode:
log.error("Error running %s. [%s]\n" % (
hook_path, subproc.returncode))
else:
# Sanitize input values (bug 1333992). Convert all String
# inputs to strings if they're not already
hot_inputs = c.get('inputs', [])
for hot_input in hot_inputs:
if hot_input.get('type', None) == 'String' and \
not isinstance(hot_input['value'], basestring):
hot_input['value'] = str(hot_input['value'])
log.info('Completed %s' % hook_path)
log.debug('Running %s' % hook_path)
subproc = subprocess.Popen([hook_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = subproc.communicate(input=json.dumps(c))
try:
if stdout:
signal_data = json.loads(stdout)
except ValueError:
signal_data = {
'deploy_stdout': stdout,
'deploy_stderr': stderr,
'deploy_status_code': subproc.returncode,
}
log.info(stdout)
log.debug(stderr)
if subproc.returncode:
log.error("Error running %s. [%s]\n" % (
hook_path, subproc.returncode))
else:
log.info('Completed %s' % hook_path)
try:
if stdout:
signal_data = json.loads(stdout)
except ValueError:
signal_data = {
'deploy_stdout': stdout,
'deploy_stderr': stderr,
'deploy_status_code': subproc.returncode,
}
iv = dict((i['name'], i['value']) for i in c['inputs'])
if signal_data:
if 'deploy_signal_id' in iv:
sigurl = iv.get('deploy_signal_id')
signal_data = json.dumps(signal_data)
log.debug('Signalling to %s with %s' % (sigurl, signal_data))
r = requests.post(sigurl, data=signal_data,
headers={'content-type': None})
log.debug('Response %s ' % r)
if 'deploy_auth_url' in iv:
from heatclient import client as heatclient
from keystoneclient.v3 import client as ksclient
ks = ksclient.Client(
auth_url=iv['deploy_auth_url'],
user_id=iv['deploy_user_id'],
password=iv['deploy_password'],
project_id=iv['deploy_project_id'])
endpoint = ks.service_catalog.url_for(
service_type='orchestration', endpoint_type='publicURL')
log.debug('Signalling to %s' % endpoint)
heat = heatclient.Client(
'1', endpoint, token=ks.auth_token)
r = heat.resources.signal(
iv.get('deploy_stack_id'),
iv.get('deploy_resource_name'),
data=signal_data)
log.debug('Response %s ' % r)
if signal_data:
if 'deploy_signal_id' in iv:
sigurl = iv.get('deploy_signal_id')
signal_data = json.dumps(signal_data)
log.debug('Signalling to %s with %s' % (sigurl, signal_data))
r = requests.post(sigurl, data=signal_data,
headers={'content-type': None})
log.debug('Response %s ' % r)
if 'deploy_auth_url' in iv:
from heatclient import client as heatclient
from keystoneclient.v3 import client as ksclient
ks = ksclient.Client(
auth_url=iv['deploy_auth_url'],
user_id=iv['deploy_user_id'],
password=iv['deploy_password'],
project_id=iv['deploy_project_id'])
endpoint = ks.service_catalog.url_for(
service_type='orchestration', endpoint_type='publicURL')
log.debug('Signalling to %s' % endpoint)
heat = heatclient.Client(
'1', endpoint, token=ks.auth_token)
r = heat.resources.signal(
iv.get('deploy_stack_id'),
iv.get('deploy_resource_name'),
data=signal_data)
log.debug('Response %s ' % r)
if __name__ == '__main__':