Heat auto-discovery, keero-linux-keys -> keero-keys

This commit is contained in:
Stan Lagun
2013-03-28 01:11:06 +04:00
parent 600e161f6c
commit f33bd681ab
7 changed files with 357 additions and 352 deletions

View File

@@ -22,42 +22,43 @@ log = logging.getLogger(__name__)
def task_received(task, message_id): def task_received(task, message_id):
with rabbitmq.RmqClient() as rmqclient: with rabbitmq.RmqClient() as rmqclient:
log.info('Starting processing task {0}: {1}'.format( try:
message_id, anyjson.dumps(task))) log.info('Starting processing task {0}: {1}'.format(
reporter = reporting.Reporter(rmqclient, message_id, task['id']) message_id, anyjson.dumps(task)))
reporter = reporting.Reporter(rmqclient, message_id, task['id'])
command_dispatcher = CommandDispatcher( command_dispatcher = CommandDispatcher(
task['id'], rmqclient, task['token'], task['tenant_id']) task['id'], rmqclient, task['token'], task['tenant_id'])
workflows = [] workflows = []
for path in glob.glob("data/workflows/*.xml"): for path in glob.glob("data/workflows/*.xml"):
log.debug('Loading XML {0}'.format(path)) log.debug('Loading XML {0}'.format(path))
workflow = Workflow(path, task, command_dispatcher, config, workflow = Workflow(path, task, command_dispatcher, config,
reporter) reporter)
workflows.append(workflow) workflows.append(workflow)
while True: while True:
try: try:
while True: while True:
result = False result = False
for workflow in workflows: for workflow in workflows:
if workflow.execute(): if workflow.execute():
result = True result = True
if not result: if not result:
break
if not command_dispatcher.execute_pending():
break break
if not command_dispatcher.execute_pending(): except Exception as ex:
log.exception(ex)
break break
except Exception as ex:
log.exception(ex)
break
command_dispatcher.close() command_dispatcher.close()
finally:
del task['token']
result_msg = rabbitmq.Message()
result_msg.body = task
result_msg.id = message_id
del task['token'] rmqclient.send(message=result_msg, key='task-results')
result_msg = rabbitmq.Message()
result_msg.body = task
result_msg.id = message_id
rmqclient.send(message=result_msg, key='task-results')
log.info('Finished processing task {0}. Result = {1}'.format( log.info('Finished processing task {0}. Result = {1}'.format(
message_id, anyjson.dumps(task))) message_id, anyjson.dumps(task)))

View File

@@ -1,6 +1,7 @@
import anyjson import anyjson
import eventlet import eventlet
import jsonpath
from conductor.openstack.common import log as logging from conductor.openstack.common import log as logging
import conductor.helpers import conductor.helpers
from command import CommandBase from command import CommandBase
@@ -20,13 +21,18 @@ class HeatExecutor(CommandBase):
self._stack = 'e' + stack self._stack = 'e' + stack
settings = conductor.config.CONF.heat settings = conductor.config.CONF.heat
client = ksclient.Client(endpoint=settings.keystone) client = ksclient.Client(endpoint=settings.auth_url)
scoped_token = client.tokens.authenticate( auth_data = client.tokens.authenticate(
tenant_id=tenant_id, tenant_id=tenant_id,
token=token).id token=token)
self._heat_client = Client('1', settings.url, scoped_token = auth_data.id
token_only=True, token=scoped_token)
heat_url = jsonpath.jsonpath(auth_data.serviceCatalog,
"$[?(@.name == 'heat')].endpoints[0].publicURL")[0]
self._heat_client = Client('1', heat_url,
token_only=True, token=scoped_token)
def execute(self, command, callback, **kwargs): def execute(self, command, callback, **kwargs):
log.debug('Got command {0} on stack {1}'.format(command, self._stack)) log.debug('Got command {0} on stack {1}'.format(command, self._stack))

View File

@@ -46,8 +46,7 @@ rabbit_opts = [
] ]
heat_opts = [ heat_opts = [
cfg.StrOpt('url'), cfg.StrOpt('auth_url'),
cfg.StrOpt('keystone')
] ]
CONF = cfg.CONF CONF = cfg.CONF

View File

@@ -1,29 +1,29 @@
import xml_code_engine import xml_code_engine
from openstack.common import log as logging from openstack.common import log as logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def send_command(engine, context, body, template, service, host, mappings=None, def send_command(engine, context, body, template, service, host, mappings=None,
result=None, **kwargs): result=None, **kwargs):
if not mappings: if not mappings:
mappings = {} mappings = {}
command_dispatcher = context['/commandDispatcher'] command_dispatcher = context['/commandDispatcher']
def callback(result_value): def callback(result_value):
log.info( log.info(
'Received result from {3} for {0}: {1}. Body is {2}'.format( 'Received result from {2} for {0}: {1}'.format(
template, result_value, body, host)) template, result_value, host))
if result is not None: if result is not None:
context[result] = result_value['Result'] context[result] = result_value['Result']
success_handler = body.find('success') success_handler = body.find('success')
if success_handler is not None: if success_handler is not None:
engine.evaluate_content(success_handler, context) engine.evaluate_content(success_handler, context)
command_dispatcher.execute( command_dispatcher.execute(
name='agent', template=template, mappings=mappings, name='agent', template=template, mappings=mappings,
host=host, service=service, callback=callback) host=host, service=service, callback=callback)
xml_code_engine.XmlCodeEngine.register_function(send_command, "send-command") xml_code_engine.XmlCodeEngine.register_function(send_command, "send-command")

View File

@@ -1,222 +1,222 @@
<workflow> <workflow>
<rule match="$.services.activeDirectories[?(@.domain)].units[?(not @.isMaster)]"> <rule match="$.services.activeDirectories[?(@.domain)].units[?(not @.isMaster)]">
<set path="domain"> <set path="domain">
<select path="::domain"/> <select path="::domain"/>
</set> </set>
</rule> </rule>
<rule match="$.services.activeDirectories[*].units[?(@.state.hostname and not @.state.instanceName)]"> <rule match="$.services.activeDirectories[*].units[?(@.state.hostname and not @.state.instanceName)]">
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Creating instance <select path="name"/></parameter> <parameter name="text">Creating instance <select path="name"/></parameter>
</report> </report>
<update-cf-stack template="Windows"> <update-cf-stack template="Windows">
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="instanceName">AD-<select path="::id"/>-<select path="name"/></mapping> <mapping name="instanceName">AD-<select path="::id"/>-<select path="name"/></mapping>
<mapping name="userData"> <mapping name="userData">
<prepare-user-data> <prepare-user-data>
<parameter name="hostname"><select path="state.hostname"/></parameter> <parameter name="hostname"><select path="state.hostname"/></parameter>
<parameter name="unit"><select path="name"/></parameter> <parameter name="unit"><select path="name"/></parameter>
<parameter name="service"><select path="::id"/></parameter> <parameter name="service"><select path="::id"/></parameter>
</prepare-user-data> </prepare-user-data>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<parameter name="arguments"> <parameter name="arguments">
<map> <map>
<argument name="KeyName">keero-linux-keys</argument> <argument name="KeyName">keero-keys</argument>
<argument name="InstanceType">m1.medium</argument> <argument name="InstanceType">m1.medium</argument>
<argument name="ImageName">ws-2012-full</argument> <argument name="ImageName">ws-2012-full</argument>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="state.instanceName"><select path="name"/></set> <set path="state.instanceName"><select path="name"/></set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Instance <select path="name"/> created</parameter> <parameter name="text">Instance <select path="name"/> created</parameter>
</report> </report>
</success> </success>
</update-cf-stack> </update-cf-stack>
</rule> </rule>
<rule match="$.services.activeDirectories[*].units[?(@.state.instanceName and @.adminPassword and @.adminPassword != @.state.adminPassword)]"> <rule match="$.services.activeDirectories[*].units[?(@.state.instanceName and @.adminPassword and @.adminPassword != @.state.adminPassword)]">
<send-command template="SetPassword"> <send-command template="SetPassword">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="adminPassword"> <mapping name="adminPassword">
<select path="adminPassword"/> <select path="adminPassword"/>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="state.adminPassword"> <set path="state.adminPassword">
<select path="adminPassword"/> <select path="adminPassword"/>
</set> </set>
</success> </success>
</send-command> </send-command>
</rule> </rule>
<rule match="$.services.activeDirectories[?(@.adminPassword and @.adminPassword != @.state.domainAdminPassword)].units[?(@.state.instanceName and @.isMaster)]"> <rule match="$.services.activeDirectories[?(@.adminPassword and @.adminPassword != @.state.domainAdminPassword)].units[?(@.state.instanceName and @.isMaster)]">
<send-command template="SetPassword"> <send-command template="SetPassword">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="adminPassword"> <mapping name="adminPassword">
<select path="::adminPassword"/> <select path="::adminPassword"/>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="::state.domainAdminPassword"> <set path="::state.domainAdminPassword">
<select path="::adminPassword"/> <select path="::adminPassword"/>
</set> </set>
</success> </success>
</send-command> </send-command>
</rule> </rule>
<rule match="$.services.activeDirectories[?(@.state.primaryDc is None)].units[?(@.state.instanceName and @.isMaster)]"> <rule match="$.services.activeDirectories[?(@.state.primaryDc is None)].units[?(@.state.instanceName and @.isMaster)]">
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Creating Primary Domain Controller on unit <select path="name"/></parameter> <parameter name="text">Creating Primary Domain Controller on unit <select path="name"/></parameter>
</report> </report>
<send-command template="CreatePrimaryDC"> <send-command template="CreatePrimaryDC">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="domain"> <mapping name="domain">
<select path="::domain"/> <select path="::domain"/>
</mapping> </mapping>
<mapping name="recoveryPassword"> <mapping name="recoveryPassword">
<select path="recoveryPassword"/> <select path="recoveryPassword"/>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="::state.primaryDc"><select path="name"/></set> <set path="::state.primaryDc"><select path="name"/></set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Primary Domain Controller created</parameter> <parameter name="text">Primary Domain Controller created</parameter>
</report> </report>
</success> </success>
</send-command> </send-command>
</rule> </rule>
<rule match="$.services.activeDirectories[?(@.state.primaryDc and not @.state.primaryDcIp)].units[?(@.state.instanceName and @.isMaster)]"> <rule match="$.services.activeDirectories[?(@.state.primaryDc and not @.state.primaryDcIp)].units[?(@.state.instanceName and @.isMaster)]">
<send-command template="AskDnsIp" result="ip"> <send-command template="AskDnsIp" result="ip">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<success> <success>
<set path="::state.primaryDcIp"> <set path="::state.primaryDcIp">
<select source="ip" path="0.Result.0"/> <select source="ip" path="0.Result.0"/>
</set> </set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">DNS IP = <select source="ip" path="0.Result.0"/></parameter> <parameter name="text">DNS IP = <select source="ip" path="0.Result.0"/></parameter>
</report> </report>
</success> </success>
</send-command> </send-command>
</rule> </rule>
<rule match="$..units[?(@.state.instanceName and @.domain and @.domain != @.state.domain)]"> <rule match="$..units[?(@.state.instanceName and @.domain and @.domain != @.state.domain)]">
<set path="#unit"> <set path="#unit">
<select/> <select/>
</set> </set>
<set path="#service"> <set path="#service">
<select path="::"/> <select path="::"/>
</set> </set>
<rule> <rule>
<parameter name="match">/$.services.activeDirectories[?(@.domain == '<select path="domain"/>' and @.state.primaryDcIp)]</parameter> <parameter name="match">/$.services.activeDirectories[?(@.domain == '<select path="domain"/>' and @.state.primaryDcIp)]</parameter>
<send-command template="JoinDomain"> <send-command template="JoinDomain">
<parameter name="host"> <parameter name="host">
<select path="name" source="unit"/> <select path="name" source="unit"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="id" source="service"/> <select path="id" source="service"/>
</parameter> </parameter>
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="domain"> <mapping name="domain">
<select path="domain"/> <select path="domain"/>
</mapping> </mapping>
<mapping name="domainPassword"> <mapping name="domainPassword">
<select path="adminPassword"/> <select path="adminPassword"/>
</mapping> </mapping>
<mapping name="dnsIp"> <mapping name="dnsIp">
<select path="state.primaryDcIp"/> <select path="state.primaryDcIp"/>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="state.domain" target="unit"> <set path="state.domain" target="unit">
<select path="domain"/> <select path="domain"/>
</set> </set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id" source="unit"/></parameter> <parameter name="id"><select path="id" source="unit"/></parameter>
<parameter name="text">Unit <select path="name" source="unit"/> has joined domain <select path="domain"/></parameter> <parameter name="text">Unit <select path="name" source="unit"/> has joined domain <select path="domain"/></parameter>
</report> </report>
</success> </success>
</send-command> </send-command>
</rule> </rule>
</rule> </rule>
<rule match="$.services.activeDirectories[*].units[?(@.state.domain and not @.isMaster and not @.state.installed)]"> <rule match="$.services.activeDirectories[*].units[?(@.state.domain and not @.isMaster and not @.state.installed)]">
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Creating Secondary Domain Controller on unit <select path="name"/></parameter> <parameter name="text">Creating Secondary Domain Controller on unit <select path="name"/></parameter>
</report> </report>
<send-command template="CreateSecondaryDC"> <send-command template="CreateSecondaryDC">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="recoveryPassword"> <mapping name="recoveryPassword">
<select path="recoveryPassword"/> <select path="recoveryPassword"/>
</mapping> </mapping>
<mapping name="domainPassword"> <mapping name="domainPassword">
<select path="::adminPassword"/> <select path="::adminPassword"/>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="state.installed"><true/></set> <set path="state.installed"><true/></set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Secondary Domain Controller created</parameter> <parameter name="text">Secondary Domain Controller created</parameter>
</report> </report>
<report entity="service"> <report entity="service">
<parameter name="id"><select path="::id"/></parameter> <parameter name="id"><select path="::id"/></parameter>
<parameter name="text">Domain <select path="::domain"/> created</parameter> <parameter name="text">Domain <select path="::domain"/> created</parameter>
</report> </report>
</success> </success>
</send-command> </send-command>
</rule> </rule>
</workflow> </workflow>

View File

@@ -1,65 +1,65 @@
<workflow> <workflow>
<rule match="$.services.webServers[?(@.domain)].units[*]"> <rule match="$.services.webServers[?(@.domain)].units[*]">
<set path="domain"> <set path="domain">
<select path="::domain"/> <select path="::domain"/>
</set> </set>
</rule> </rule>
<rule match="$.services.webServers[*].units[?(@.state.hostname and not @.state.instanceName)]"> <rule match="$.services.webServers[*].units[?(@.state.hostname and not @.state.instanceName)]">
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Creating instance <select path="name"/></parameter> <parameter name="text">Creating instance <select path="name"/></parameter>
</report> </report>
<update-cf-stack template="Windows"> <update-cf-stack template="Windows">
<parameter name="mappings"> <parameter name="mappings">
<map> <map>
<mapping name="instanceName">WS-<select path="::id"/>-<select path="name"/></mapping> <mapping name="instanceName">WS-<select path="::id"/>-<select path="name"/></mapping>
<mapping name="userData"> <mapping name="userData">
<prepare-user-data> <prepare-user-data>
<parameter name="hostname"><select path="state.hostname"/></parameter> <parameter name="hostname"><select path="state.hostname"/></parameter>
<parameter name="unit"><select path="name"/></parameter> <parameter name="unit"><select path="name"/></parameter>
<parameter name="service"><select path="::id"/></parameter> <parameter name="service"><select path="::id"/></parameter>
</prepare-user-data> </prepare-user-data>
</mapping> </mapping>
</map> </map>
</parameter> </parameter>
<parameter name="arguments"> <parameter name="arguments">
<map> <map>
<argument name="KeyName">keero-linux-keys</argument> <argument name="KeyName">keero-keys</argument>
<argument name="InstanceType">m1.medium</argument> <argument name="InstanceType">m1.medium</argument>
<argument name="ImageName">ws-2012-full</argument> <argument name="ImageName">ws-2012-full</argument>
</map> </map>
</parameter> </parameter>
<success> <success>
<set path="state.instanceName"><select path="name"/></set> <set path="state.instanceName"><select path="name"/></set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Instance <select path="name"/> created</parameter> <parameter name="text">Instance <select path="name"/> created</parameter>
</report> </report>
</success> </success>
</update-cf-stack> </update-cf-stack>
</rule> </rule>
<rule match="$.services.webServers[*].units[?(@.state.instanceName and not @.state.iisInstalled)]"> <rule match="$.services.webServers[*].units[?(@.state.instanceName and not @.state.iisInstalled)]">
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">Creating IIS Web Server on unit <select path="name"/></parameter> <parameter name="text">Creating IIS Web Server on unit <select path="name"/></parameter>
</report> </report>
<send-command template="InstallIIS"> <send-command template="InstallIIS">
<parameter name="host"> <parameter name="host">
<select path="name"/> <select path="name"/>
</parameter> </parameter>
<parameter name="service"> <parameter name="service">
<select path="::id"/> <select path="::id"/>
</parameter> </parameter>
<success> <success>
<set path="state.iisInstalled"><true/></set> <set path="state.iisInstalled"><true/></set>
<report entity="unit"> <report entity="unit">
<parameter name="id"><select path="id"/></parameter> <parameter name="id"><select path="id"/></parameter>
<parameter name="text">IIS <select path="name"/> has started</parameter> <parameter name="text">IIS <select path="name"/> has started</parameter>
</report> </report>
</success> </success>
</send-command> </send-command>
</rule> </rule>
</workflow> </workflow>

View File

@@ -4,8 +4,7 @@ debug=True
verbose=True verbose=True
[heat] [heat]
url = http://172.18.124.101:8004/v1/16eb78cbb688459c8308d89678bcef50 auth_url = http://172.18.124.101:5000/v2.0
keystone = http://172.18.124.101:5000/v2.0
[rabbitmq] [rabbitmq]
host = 172.18.124.101 host = 172.18.124.101