Naming conventions changed
This commit is contained in:
parent
ad0e834457
commit
7be1f27f0b
@ -9,6 +9,9 @@ from config import Config
|
|||||||
import reporting
|
import reporting
|
||||||
import rabbitmq
|
import rabbitmq
|
||||||
|
|
||||||
|
import windows_agent
|
||||||
|
import cloud_formation
|
||||||
|
|
||||||
config = Config(sys.argv[1] if len(sys.argv) > 1 else None)
|
config = Config(sys.argv[1] if len(sys.argv) > 1 else None)
|
||||||
|
|
||||||
|
|
||||||
@ -18,7 +21,7 @@ def task_received(task, message_id):
|
|||||||
reporter = reporting.Reporter(rmqclient, message_id, task['id'])
|
reporter = reporting.Reporter(rmqclient, message_id, task['id'])
|
||||||
|
|
||||||
command_dispatcher = CommandDispatcher(
|
command_dispatcher = CommandDispatcher(
|
||||||
task['name'], rmqclient, task['token'])
|
task['id'], rmqclient, task['token'])
|
||||||
workflows = []
|
workflows = []
|
||||||
for path in glob.glob("data/workflows/*.xml"):
|
for path in glob.glob("data/workflows/*.xml"):
|
||||||
print "loading", path
|
print "loading", path
|
||||||
@ -28,14 +31,21 @@ def task_received(task, message_id):
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
|
while True:
|
||||||
|
result = False
|
||||||
for workflow in workflows:
|
for workflow in workflows:
|
||||||
workflow.execute()
|
if workflow.execute():
|
||||||
|
result = True
|
||||||
|
if not result:
|
||||||
|
break
|
||||||
if not command_dispatcher.execute_pending():
|
if not command_dispatcher.execute_pending():
|
||||||
break
|
break
|
||||||
except Exception:
|
except Exception:
|
||||||
break
|
break
|
||||||
|
|
||||||
command_dispatcher.close()
|
command_dispatcher.close()
|
||||||
|
|
||||||
|
del task['token']
|
||||||
result_msg = rabbitmq.Message()
|
result_msg = rabbitmq.Message()
|
||||||
result_msg.body = task
|
result_msg.body = task
|
||||||
result_msg.id = message_id
|
result_msg.id = message_id
|
||||||
@ -59,9 +69,9 @@ class ConductorWorkflowService(service.Service):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
with rabbitmq.RmqClient() as rmq:
|
with rabbitmq.RmqClient() as rmq:
|
||||||
rmq.declare('tasks', 'tasks')
|
rmq.declare('tasks2', 'tasks2')
|
||||||
rmq.declare('task-results', 'tasks')
|
rmq.declare('task-results', 'tasks2')
|
||||||
with rmq.open('tasks') as subscription:
|
with rmq.open('tasks2') as subscription:
|
||||||
while True:
|
while True:
|
||||||
msg = subscription.get_message()
|
msg = subscription.get_message()
|
||||||
self.tg.add_thread(
|
self.tg.add_thread(
|
||||||
|
@ -2,6 +2,8 @@ import base64
|
|||||||
|
|
||||||
import xml_code_engine
|
import xml_code_engine
|
||||||
import config
|
import config
|
||||||
|
from random import choice
|
||||||
|
import time
|
||||||
|
|
||||||
def update_cf_stack(engine, context, body, template,
|
def update_cf_stack(engine, context, body, template,
|
||||||
mappings, arguments, **kwargs):
|
mappings, arguments, **kwargs):
|
||||||
@ -16,7 +18,7 @@ def update_cf_stack(engine, context, body, template,
|
|||||||
arguments=arguments, callback=callback)
|
arguments=arguments, callback=callback)
|
||||||
|
|
||||||
|
|
||||||
def prepare_user_data(context, template='Default', **kwargs):
|
def prepare_user_data(context, hostname, service, unit, template='Default', **kwargs):
|
||||||
settings = config.CONF.rabbitmq
|
settings = config.CONF.rabbitmq
|
||||||
|
|
||||||
with open('data/init.ps1') as init_script_file:
|
with open('data/init.ps1') as init_script_file:
|
||||||
@ -26,17 +28,36 @@ def prepare_user_data(context, template='Default', **kwargs):
|
|||||||
template_data = template_file.read()
|
template_data = template_file.read()
|
||||||
template_data = template_data.replace(
|
template_data = template_data.replace(
|
||||||
'%RABBITMQ_HOST%', settings.host)
|
'%RABBITMQ_HOST%', settings.host)
|
||||||
|
template_data = template_data.replace(
|
||||||
|
'%RABBITMQ_INPUT_QUEUE%',
|
||||||
|
'-'.join([str(context['/dataSource']['id']),
|
||||||
|
str(service), str(unit)])
|
||||||
|
)
|
||||||
template_data = template_data.replace(
|
template_data = template_data.replace(
|
||||||
'%RESULT_QUEUE%',
|
'%RESULT_QUEUE%',
|
||||||
'-execution-results-%s' % str(context['/dataSource']['name']))
|
'-execution-results-%s' % str(context['/dataSource']['id']))
|
||||||
|
|
||||||
return init_script.replace(
|
init_script = init_script.replace(
|
||||||
'%WINDOWS_AGENT_CONFIG_BASE64%',
|
'%WINDOWS_AGENT_CONFIG_BASE64%',
|
||||||
base64.b64encode(template_data))
|
base64.b64encode(template_data))
|
||||||
|
|
||||||
|
init_script = init_script.replace('%INTERNAL_HOSTNAME%', hostname)
|
||||||
|
|
||||||
|
return init_script
|
||||||
|
|
||||||
|
def generate_hostname(**kwargs):
|
||||||
|
chars = 'abcdefghijklmnopqrstuvwxyz'
|
||||||
|
prefix = ''.join(choice(chars) for _ in range(4))
|
||||||
|
return prefix + str(int(time.time() * 10))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
xml_code_engine.XmlCodeEngine.register_function(
|
xml_code_engine.XmlCodeEngine.register_function(
|
||||||
update_cf_stack, "update-cf-stack")
|
update_cf_stack, "update-cf-stack")
|
||||||
|
|
||||||
xml_code_engine.XmlCodeEngine.register_function(
|
xml_code_engine.XmlCodeEngine.register_function(
|
||||||
prepare_user_data, "prepare_user_data")
|
prepare_user_data, "prepare-user-data")
|
||||||
|
|
||||||
|
xml_code_engine.XmlCodeEngine.register_function(
|
||||||
|
generate_hostname, "generate-hostname")
|
||||||
|
@ -67,18 +67,24 @@ class HeatExecutor(CommandBase):
|
|||||||
# ])
|
# ])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
print 'try update'
|
||||||
self._heat_client.stacks.update(
|
self._heat_client.stacks.update(
|
||||||
stack_id=self._stack,
|
stack_id=self._stack,
|
||||||
parameters=arguments,
|
parameters=arguments,
|
||||||
template=template)
|
template=template)
|
||||||
|
print 'wait update'
|
||||||
self._wait_state('UPDATE_COMPLETE')
|
self._wait_state('UPDATE_COMPLETE')
|
||||||
except heatclient.exc.HTTPNotFound:
|
except heatclient.exc.HTTPNotFound:
|
||||||
|
print 'try create'
|
||||||
|
|
||||||
self._heat_client.stacks.create(
|
self._heat_client.stacks.create(
|
||||||
stack_name=self._stack,
|
stack_name=self._stack,
|
||||||
parameters=arguments,
|
parameters=arguments,
|
||||||
template=template)
|
template=template)
|
||||||
|
print 'wait create'
|
||||||
self._wait_state('CREATE_COMPLETE')
|
self._wait_state('CREATE_COMPLETE')
|
||||||
|
|
||||||
|
|
||||||
pending_list = self._pending_list
|
pending_list = self._pending_list
|
||||||
self._pending_list = []
|
self._pending_list = []
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ class CommandDispatcher(command.CommandBase):
|
|||||||
self._command_map = {
|
self._command_map = {
|
||||||
'cf': cloud_formation.HeatExecutor(environment_id, token),
|
'cf': cloud_formation.HeatExecutor(environment_id, token),
|
||||||
'agent': windows_agent.WindowsAgentExecutor(
|
'agent': windows_agent.WindowsAgentExecutor(
|
||||||
environment_id, rmqclient, environment_id)
|
environment_id, rmqclient)
|
||||||
}
|
}
|
||||||
|
|
||||||
def execute(self, name, **kwargs):
|
def execute(self, name, **kwargs):
|
||||||
|
@ -7,14 +7,14 @@ from command import CommandBase
|
|||||||
|
|
||||||
|
|
||||||
class WindowsAgentExecutor(CommandBase):
|
class WindowsAgentExecutor(CommandBase):
|
||||||
def __init__(self, stack, rmqclient, environment):
|
def __init__(self, stack, rmqclient):
|
||||||
self._stack = stack
|
self._stack = stack
|
||||||
self._rmqclient = rmqclient
|
self._rmqclient = rmqclient
|
||||||
self._pending_list = []
|
self._pending_list = []
|
||||||
self._results_queue = '-execution-results-%s' % str(environment)
|
self._results_queue = '-execution-results-%s' % str(stack)
|
||||||
rmqclient.declare(self._results_queue)
|
rmqclient.declare(self._results_queue)
|
||||||
|
|
||||||
def execute(self, template, mappings, host, callback):
|
def execute(self, template, mappings, host, service, callback):
|
||||||
with open('data/templates/agent/%s.template' %
|
with open('data/templates/agent/%s.template' %
|
||||||
template) as template_file:
|
template) as template_file:
|
||||||
template_data = template_file.read()
|
template_data = template_file.read()
|
||||||
@ -23,7 +23,7 @@ class WindowsAgentExecutor(CommandBase):
|
|||||||
json.loads(template_data), mappings)
|
json.loads(template_data), mappings)
|
||||||
|
|
||||||
id = str(uuid.uuid4()).lower()
|
id = str(uuid.uuid4()).lower()
|
||||||
host = ('%s-%s' % (self._stack, host)).lower().replace(' ', '-')
|
host = ('%s-%s-%s' % (self._stack, service, host)).lower()
|
||||||
self._pending_list.append({
|
self._pending_list.append({
|
||||||
'id': id,
|
'id': id,
|
||||||
'callback': callback
|
'callback': callback
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import types
|
import types
|
||||||
|
|
||||||
|
|
||||||
def transform_json(json, mappings):
|
def transform_json(json, mappings):
|
||||||
if isinstance(json, types.ListType):
|
if isinstance(json, types.ListType):
|
||||||
return [transform_json(t, mappings) for t in json]
|
return [transform_json(t, mappings) for t in json]
|
||||||
@ -47,3 +46,7 @@ def find(f, seq):
|
|||||||
return item, index
|
return item, index
|
||||||
index += 1
|
index += 1
|
||||||
return None, -1
|
return None, -1
|
||||||
|
|
||||||
|
|
||||||
|
def generate(length):
|
||||||
|
return ''.join(choice(chars) for _ in range(length))
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import xml_code_engine
|
import xml_code_engine
|
||||||
|
|
||||||
|
|
||||||
def send_command(engine, context, body, template, host, mappings=None,
|
def send_command(engine, context, body, template, service, host, mappings=None,
|
||||||
result=None, **kwargs):
|
result=None, **kwargs):
|
||||||
if not mappings: mappings = {}
|
if not mappings: mappings = {}
|
||||||
command_dispatcher = context['/commandDispatcher']
|
command_dispatcher = context['/commandDispatcher']
|
||||||
@ -18,7 +18,7 @@ def send_command(engine, context, body, template, host, mappings=None,
|
|||||||
|
|
||||||
command_dispatcher.execute(name='agent',
|
command_dispatcher.execute(name='agent',
|
||||||
template=template, mappings=mappings,
|
template=template, mappings=mappings,
|
||||||
host=host, 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")
|
@ -17,14 +17,12 @@ class Workflow(object):
|
|||||||
self._reporter = reporter
|
self._reporter = reporter
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
while True:
|
|
||||||
context = function_context.Context()
|
context = function_context.Context()
|
||||||
context['/dataSource'] = self._data
|
context['/dataSource'] = self._data
|
||||||
context['/commandDispatcher'] = self._command_dispatcher
|
context['/commandDispatcher'] = self._command_dispatcher
|
||||||
context['/config'] = self._config
|
context['/config'] = self._config
|
||||||
context['/reporter'] = self._reporter
|
context['/reporter'] = self._reporter
|
||||||
if not self._engine.execute(context):
|
return self._engine.execute(context)
|
||||||
break
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_path(obj, path, create_non_existing=False):
|
def _get_path(obj, path, create_non_existing=False):
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
<add key="rabbitmq.user" value="keero"/>
|
<add key="rabbitmq.user" value="keero"/>
|
||||||
<add key="rabbitmq.password" value="keero"/>
|
<add key="rabbitmq.password" value="keero"/>
|
||||||
<add key="rabbitmq.vhost" value="keero"/>
|
<add key="rabbitmq.vhost" value="keero"/>
|
||||||
|
<add key="rabbitmq.inputQueue" value="%RABBITMQ_INPUT_QUEUE%"/>
|
||||||
<add key="rabbitmq.resultExchange" value=""/>
|
<add key="rabbitmq.resultExchange" value=""/>
|
||||||
<add key="rabbitmq.resultRoutingKey" value="%RESULT_QUEUE%"/>
|
<add key="rabbitmq.resultRoutingKey" value="%RESULT_QUEUE%"/>
|
||||||
<add key="rabbitmq.durableMessages" value="true"/>
|
<add key="rabbitmq.durableMessages" value="true"/>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
</set>
|
</set>
|
||||||
</rule>
|
</rule>
|
||||||
|
|
||||||
<rule match="$.services.activeDirectories[*].units[?(@.state.instanceName is None)]">
|
<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>
|
||||||
@ -13,11 +13,13 @@
|
|||||||
<update-cf-stack template="Windows">
|
<update-cf-stack template="Windows">
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="instanceName">
|
<mapping name="instanceName">AD-<select path="::id"/>-<select path="name"/></mapping>
|
||||||
<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="unit"><select path="name"/></parameter>
|
||||||
|
<parameter name="service"><select path="::id"/></parameter>
|
||||||
|
</prepare-user-data>
|
||||||
</mapping>
|
</mapping>
|
||||||
</map>
|
</map>
|
||||||
</parameter>
|
</parameter>
|
||||||
@ -44,6 +46,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="adminPassword">
|
<mapping name="adminPassword">
|
||||||
@ -64,6 +69,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="adminPassword">
|
<mapping name="adminPassword">
|
||||||
@ -88,6 +96,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="domain">
|
<mapping name="domain">
|
||||||
@ -113,6 +124,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</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"/>
|
||||||
@ -136,6 +150,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name" source="unit"/>
|
<select path="name" source="unit"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="domain">
|
<mapping name="domain">
|
||||||
@ -173,6 +190,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="recoveryPassword">
|
<mapping name="recoveryPassword">
|
||||||
|
7
conductor/data/workflows/Common.xml
Normal file
7
conductor/data/workflows/Common.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<workflow>
|
||||||
|
|
||||||
|
<rule match="$..units[?(@.state.hostname is None)]">
|
||||||
|
<set path="state.hostname"><generate-hostname/></set>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
</workflow>
|
@ -5,7 +5,7 @@
|
|||||||
</set>
|
</set>
|
||||||
</rule>
|
</rule>
|
||||||
|
|
||||||
<rule match="$.services.webServers[*].units[?(@.state.instanceName is None)]">
|
<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>
|
||||||
@ -13,11 +13,13 @@
|
|||||||
<update-cf-stack template="Windows">
|
<update-cf-stack template="Windows">
|
||||||
<parameter name="mappings">
|
<parameter name="mappings">
|
||||||
<map>
|
<map>
|
||||||
<mapping name="instanceName">
|
<mapping name="instanceName">WS-<select path="::id"/>-<select path="name"/></mapping>
|
||||||
<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="unit"><select path="name"/></parameter>
|
||||||
|
<parameter name="service"><select path="::id"/></parameter>
|
||||||
|
</prepare-user-data>
|
||||||
</mapping>
|
</mapping>
|
||||||
</map>
|
</map>
|
||||||
</parameter>
|
</parameter>
|
||||||
@ -48,6 +50,9 @@
|
|||||||
<parameter name="host">
|
<parameter name="host">
|
||||||
<select path="name"/>
|
<select path="name"/>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="service">
|
||||||
|
<select path="::id"/>
|
||||||
|
</parameter>
|
||||||
<success>
|
<success>
|
||||||
<set path="state.iisInstalled"><true/></set>
|
<set path="state.iisInstalled"><true/></set>
|
||||||
<report entity="unit">
|
<report entity="unit">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user