diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..0427219 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include tools/pip-requires \ No newline at end of file diff --git a/bin/conductor b/bin/conductor index 93d84fc..4be245e 100644 --- a/bin/conductor +++ b/bin/conductor @@ -15,16 +15,18 @@ # limitations under the License. import sys - +import os from conductor import config from conductor.openstack.common import log from conductor.openstack.common import service from conductor.app import ConductorWorkflowService + if __name__ == '__main__': try: config.parse_args() + os.chdir(config.CONF.data_dir) log.setup('conductor') launcher = service.ServiceLauncher() launcher.launch_service(ConductorWorkflowService()) diff --git a/conductor/cloud_formation.py b/conductor/cloud_formation.py index a7196dd..cb60b6c 100644 --- a/conductor/cloud_formation.py +++ b/conductor/cloud_formation.py @@ -27,7 +27,7 @@ def update_cf_stack(engine, context, body, template, result=None, **kwargs): def callback(result_value): if result is not None: - context[result] = result_value['Result'] + context[result] = result_value success_handler = body.find('success') if success_handler is not None: engine.evaluate_content(success_handler, context) diff --git a/conductor/commands/cloud_formation.py b/conductor/commands/cloud_formation.py index b9dcc17..aba8cef 100644 --- a/conductor/commands/cloud_formation.py +++ b/conductor/commands/cloud_formation.py @@ -171,28 +171,39 @@ class HeatExecutor(CommandBase): return {}, {} def _wait_state(self, state): - if isinstance(state, types.ListType): - states = state - else: - states = [state] + tries = 4 + delay = 1 + while tries > 0: + if isinstance(state, types.ListType): + states = state + else: + states = [state] - while True: - try: - stack_info = self._heat_client.stacks.get( - stack_id=self._stack) - status = stack_info.stack_status - except heatclient.exc.HTTPNotFound: - stack_info = None - status = '' + while True: + try: + stack_info = self._heat_client.stacks.get( + stack_id=self._stack) + status = stack_info.stack_status + tries = 4 + delay = 1 + except heatclient.exc.HTTPNotFound: + stack_info = None + status = '' + except Exception: + tries -= 1 + delay *= 2 + eventlet.sleep(delay) + break - if 'IN_PROGRESS' in status: - eventlet.sleep(1) - continue - if status not in states: - raise EnvironmentError() + if 'IN_PROGRESS' in status: + eventlet.sleep(1) + continue + if status not in states: + raise EnvironmentError() - try: - return dict([(t['output_key'], t['output_value']) - for t in stack_info.outputs]) - except Exception: - return {} + try: + return dict([(t['output_key'], t['output_value']) + for t in stack_info.outputs]) + except Exception: + return {} + return {} diff --git a/conductor/config.py b/conductor/config.py index 192387e..362833c 100644 --- a/conductor/config.py +++ b/conductor/config.py @@ -51,6 +51,8 @@ CONF.register_opts(paste_deploy_opts, group='paste_deploy') CONF.register_opts(rabbit_opts, group='rabbitmq') CONF.register_opts(heat_opts, group='heat') CONF.register_opt(cfg.StrOpt('file_server')) +CONF.register_cli_opt(cfg.StrOpt('data-dir', dest='data_dir', default='./')) + CONF.import_opt('verbose', 'conductor.openstack.common.log') CONF.import_opt('debug', 'conductor.openstack.common.log') diff --git a/conductor/openstack/common/gettextutils.py b/conductor/openstack/common/gettextutils.py index 3a81206..7537a7b 100644 --- a/conductor/openstack/common/gettextutils.py +++ b/conductor/openstack/common/gettextutils.py @@ -26,7 +26,7 @@ Usual usage in an openstack.common module: import gettext -t = gettext.translation('conductor', 'locale', fallback=True) +t = gettext.translation('openstack-common', 'locale', fallback=True) def _(msg): diff --git a/conductor/openstack/common/log.py b/conductor/openstack/common/log.py index d8cd9fa..98cec96 100644 --- a/conductor/openstack/common/log.py +++ b/conductor/openstack/common/log.py @@ -29,7 +29,6 @@ It also allows setting of formatting information through conf. """ -import ConfigParser import cStringIO import inspect import itertools @@ -88,11 +87,11 @@ logging_cli_opts = [ metavar='PATH', deprecated_name='logfile', help='(Optional) Name of log file to output to. ' - 'If no default is set, logging will go to stdout.'), + 'If not set, logging will go to stdout.'), cfg.StrOpt('log-dir', deprecated_name='logdir', - help='(Optional) The base directory used for relative ' - '--log-file paths'), + help='(Optional) The directory to keep log files in ' + '(will be prepended to --log-file)'), cfg.BoolOpt('use-syslog', default=False, help='Use syslog for logging.'), @@ -324,30 +323,10 @@ def _create_logging_excepthook(product_name): return logging_excepthook -class LogConfigError(Exception): - - message = _('Error loading logging config %(log_config)s: %(err_msg)s') - - def __init__(self, log_config, err_msg): - self.log_config = log_config - self.err_msg = err_msg - - def __str__(self): - return self.message % dict(log_config=self.log_config, - err_msg=self.err_msg) - - -def _load_log_config(log_config): - try: - logging.config.fileConfig(log_config) - except ConfigParser.Error, exc: - raise LogConfigError(log_config, str(exc)) - - def setup(product_name): """Setup logging.""" if CONF.log_config: - _load_log_config(CONF.log_config) + logging.config.fileConfig(CONF.log_config) else: _setup_logging_from_conf() sys.excepthook = _create_logging_excepthook(product_name) diff --git a/conductor/openstack/common/notifier/api.py b/conductor/openstack/common/notifier/api.py index d5629e8..99f4240 100644 --- a/conductor/openstack/common/notifier/api.py +++ b/conductor/openstack/common/notifier/api.py @@ -30,6 +30,7 @@ LOG = logging.getLogger(__name__) notifier_opts = [ cfg.MultiStrOpt('notification_driver', default=[], + deprecated_name='list_notifier_drivers', help='Driver or drivers to handle sending notifications'), cfg.StrOpt('default_notification_level', default='INFO', diff --git a/conductor/openstack/common/wsgi.py b/conductor/openstack/common/wsgi.py index 9df3188..fd9f7f4 100644 --- a/conductor/openstack/common/wsgi.py +++ b/conductor/openstack/common/wsgi.py @@ -59,10 +59,10 @@ CONF.register_opts(socket_opts) LOG = logging.getLogger(__name__) -def run_server(application, port, **kwargs): +def run_server(application, port): """Run a WSGI server with the given application.""" sock = eventlet.listen(('0.0.0.0', port)) - eventlet.wsgi.server(sock, application, **kwargs) + eventlet.wsgi.server(sock, application) class Service(service.Service): diff --git a/conductor/windows_agent.py b/conductor/windows_agent.py index 97aa8e0..4e42509 100644 --- a/conductor/windows_agent.py +++ b/conductor/windows_agent.py @@ -19,7 +19,7 @@ from openstack.common import log as logging log = logging.getLogger(__name__) -def send_command(engine, context, body, template, service, host, mappings=None, +def send_command(engine, context, body, template, service, unit, mappings=None, result=None, **kwargs): if not mappings: mappings = {} @@ -28,7 +28,7 @@ def send_command(engine, context, body, template, service, host, mappings=None, def callback(result_value): log.info( 'Received result from {2} for {0}: {1}'.format( - template, result_value, host)) + template, result_value, unit)) if result is not None: context[result] = result_value['Result'] @@ -38,7 +38,7 @@ def send_command(engine, context, body, template, service, host, mappings=None, command_dispatcher.execute( name='agent', template=template, mappings=mappings, - host=host, service=service, callback=callback) + unit=unit, service=service, callback=callback) xml_code_engine.XmlCodeEngine.register_function(send_command, "send-command") diff --git a/data/templates/agent/DeployWebApp.template b/data/templates/agent/DeployWebApp.template index dbee953..c8d3552 100644 --- a/data/templates/agent/DeployWebApp.template +++ b/data/templates/agent/DeployWebApp.template @@ -1,6 +1,6 @@ { "Scripts": [ - "DQpmdW5jdGlvbiBSZWdpc3Rlci1XZWJBcHAgew0KPCMNCi5MSU5LUw0KDQpodHRwOi8vd3d3Lmlpcy5uZXQvbGVhcm4vbWFuYWdlL3Bvd2Vyc2hlbGwvcG93ZXJzaGVsbC1zbmFwLWluLWNyZWF0aW5nLXdlYi1zaXRlcy13ZWItYXBwbGljYXRpb25zLXZpcnR1YWwtZGlyZWN0b3JpZXMtYW5kLWFwcGxpY2F0aW9uLXBvb2xzDQojPg0KCXBhcmFtICgNCgkJW1N0cmluZ10gJFNvdXJjZSwNCgkJW1N0cmluZ10gJFBhdGggPSAiQzpcaW5ldHB1Ylx3d3dyb290IiwNCgkJW1N0cmluZ10gJE5hbWUgPSAiIiwNCgkJW1N0cmluZ10gJFVzZXJuYW1lID0gIiIsDQoJCVtTdHJpbmddICRQYXNzd29yZCA9ICIiDQoJKQ0KDQoJSW1wb3J0LU1vZHVsZSBXZWJBZG1pbmlzdHJhdGlvbg0KCQ0KCWlmICgkTmFtZSAtZXEgIiIpIHsNCgkJJE5hbWUgPSBAKFtJTy5QYXRoXTo6R2V0RGlyZWN0b3J5TmFtZSgkU291cmNlKSAtc3BsaXQgJ1xcJylbLTFdDQoJCWlmICgkTmFtZSAtZXEgInd3d3Jvb3QiKSB7DQoJCQl0aHJvdygiQXBwbGljYXRpb24gcG9vbCBuYW1lIGNvdWxkbid0IGJlICd3d3dyb290Jy4iKQ0KCQl9DQoJfQ0KCWVsc2Ugew0KCQkkUGF0aCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkUGF0aCwgJE5hbWUpDQoJfQ0KDQoJQ29weS1JdGVtIC1QYXRoICRTb3VyY2UgLURlc3RpbmF0aW9uICRQYXRoIC1SZWN1cnNlIC1Gb3JjZQ0KCQ0KDQoJIyBDcmVhdGUgbmV3IGFwcGxpY2F0aW9uIHBvb2wNCiAgICAkQXBwUG9vbCA9IE5ldy1XZWJBcHBQb29sIC1OYW1lICROYW1lIC1Gb3JjZQ0KICAgICMkQXBwUG9vbCA9IEdldC1JdGVtICJJSVM6XEFwcFBvb2xzXCROYW1lIg0KICAgICRBcHBQb29sLm1hbmFnZWRSdW50aW1lVmVyc2lvbiA9ICd2NC4wJw0KICAgICRBcHBQb29sLm1hbmFnZWRQaXBlbGluZU1vZGUgPSAnQ2xhc3NpYycNCiAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwubG9hZFVzZXJQcm9maWxlID0gJHRydWUNCiAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwubG9nb25UeXBlID0gJ0xvZ29uQmF0Y2gnDQogICAgDQoJI1NldCBJZGVudGl0eSB0eXBlDQoJaWYgKCRVc2VybmFtZSAtZXEgIiIpIHsNCgkJJEFwcFBvb2wucHJvY2Vzc01vZGVsLmlkZW50aXR5VHlwZSA9ICdBcHBsaWNhdGlvblBvb2xJZGVudGl0eScNCgl9DQoJZWxzZSB7DQoJICAgICRBcHBQb29sLnByb2Nlc3NNb2RlbC5pZGVudGl0eVR5cGUgPSAnU3BlY2lmaWNVc2VyJw0KCSAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwudXNlck5hbWUgPSAkVXNlcm5hbWUNCgkgICAgJEFwcFBvb2wucHJvY2Vzc01vZGVsLnBhc3N3b3JkID0gJFBhc3N3b3JkDQoJICAgICRBcHBQb29sIHwgU2V0LUl0ZW0NCgl9DQoNCg0KICAgICMgQ3JlYXRlIFdlYnNpdGUNCiAgICAkV2ViU2l0ZSA9IE5ldy1XZWJTaXRlIC1OYW1lICROYW1lIC1Qb3J0IDgwIC1Ib3N0SGVhZGVyICROYW1lIC1QaHlzaWNhbFBhdGggJFBhdGggLUZvcmNlDQogICAgIyRXZWJTaXRlID0gR2V0LUl0ZW0gIklJUzpcU2l0ZXNcJE5hbWUiDQogICAgDQoJIyBTZXQgdGhlIEFwcGxpY2F0aW9uIFBvb2wNCiAgICBTZXQtSXRlbVByb3BlcnR5ICJJSVM6XFNpdGVzXCROYW1lIiAnQXBwbGljYXRpb25Qb29sJyAkTmFtZQ0KICAgIA0KCSNUdXJuIG9uIERpcmVjdG9yeSBCcm93c2luZw0KICAgICNTZXQtV2ViQ29uZmlndXJhdGlvblByb3BlcnR5IC1GaWx0ZXIgJy9zeXN0ZW0ud2ViU2VydmVyL2RpcmVjdG9yeUJyb3dzZScgLU5hbWUgJ2VuYWJsZWQnIC1WYWx1ZSAkdHJ1ZSAtUFNQYXRoICJJSVM6XFNpdGVzXCROYW1lIg0KICAgIA0KCSMgVXBkYXRlIEF1dGhlbnRpY2F0aW9uDQogICAgI1NldC1XZWJDb25maWd1cmF0aW9uUHJvcGVydHkgLUZpbHRlciAnL3N5c3RlbS5XZWJTZXJ2ZXIvc2VjdXJpdHkvYXV0aGVudGljYXRpb24vQW5vbnltb3VzQXV0aGVudGljYXRpb24nIC1OYW1lICdlbmFibGVkJyAtVmFsdWUgJHRydWUgLUxvY2F0aW9uICRuYW1lDQogICAgI1NldC1XZWJDb25maWd1cmF0aW9uUHJvcGVydHkgLUZpbHRlciAnL3N5c3RlbS5XZWJTZXJ2ZXIvc2VjdXJpdHkvYXV0aGVudGljYXRpb24vd2luZG93c0F1dGhlbnRpY2F0aW9uJyAtTmFtZSAnZW5hYmxlZCcgLVZhbHVlICRmYWxzZSAtTG9jYXRpb24gJE5hbWUNCiAgICAjU2V0LVdlYkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eSAtRmlsdGVyICcvc3lzdGVtLldlYlNlcnZlci9zZWN1cml0eS9hdXRoZW50aWNhdGlvbi9iYXNpY0F1dGhlbnRpY2F0aW9uJyAtTmFtZSAnZW5hYmxlZCcgLVZhbHVlICRmYWxzZSAtTG9jYXRpb24gJE5hbWUNCgkNCgkkV2ViU2l0ZS5TdGFydCgpDQp9DQoNCg0KZnVuY3Rpb24gRGVwbG95LVdlYkFwcEZyb21HaXQgew0KCXBhcmFtICgNCgkJW1N0cmluZ10gJFVSTCwNCgkJW1N0cmluZ10gJFRlbXBQYXRoID0gW0lPLlBhdGhdOjpDb21iaW5lKFtJTy5QYXRoXTo6R2V0VGVtcFBhdGgoKSwgW0lPLlBhdGhdOjpHZXRSYW5kb21GaWxlTmFtZSgpKSwNCgkJW1N0cmluZ10gJE91dHB1dFBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoW0lPLlBhdGhdOjpHZXRUZW1wUGF0aCgpLCBbSU8uUGF0aF06OkdldFJhbmRvbUZpbGVOYW1lKCkpDQoJKQ0KCVdyaXRlLUxvZyAiVGVtcFBhdGggPSAnJFRlbXBQYXRoJyINCglXcml0ZS1Mb2cgIk91dHB1dFBhdGggPSAnJE91dHB1dFBhdGgnIg0KCQ0KCQ0KCSMgRmV0Y2ggd2ViIGFwcGxpY2F0aW9uDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglXcml0ZS1Mb2cgIkZldGNoaW5nIHNvdXJjZXMgZnJvbSBHaXQgLi4uIg0KCQ0KCSRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFRlbXBQYXRoIC1JdGVtVHlwZSBDb250YWluZXINCglFeGVjIC1GaWxlUGF0aCAnZ2l0LmV4ZScgLUFyZ3VtZW50TGlzdCBAKCdjbG9uZScsICRVUkwpIC1Xb3JraW5nRGlyICRUZW1wUGF0aCAtUmVkaXJlY3RTdHJlYW1zDQoJDQoJJFBhdGggPSBAKEdldC1DaGlsZEl0ZW0gJFRlbXBQYXRoKVswXS5GdWxsTmFtZQ0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJDQoJDQoJIyBCdWlsZCB3ZWIgYXBwbGljYXRpb24NCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCVdyaXRlLUxvZyAiQnVpbGRpbmcgc291cmNlcyAuLi4iDQoJDQoJJG1zYnVpbGQgPSAiQzpcV2luZG93c1xNaWNyb3NvZnQuTkVUXEZyYW1ld29yazY0XHY0LjAuMzAzMTlcTVNCdWlsZC5leGUiDQoJDQoJJG51bGwgPSBOZXctSXRlbSAtUGF0aCAkT3V0cHV0UGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyDQoJDQoJJFNsbkZpbGVzID0gQChHZXQtQ2hpbGRJdGVtIC1QYXRoICRQYXRoIC1GaWx0ZXIgKi5zbG4gLVJlY3Vyc2UpDQoNCiAgICAjIFN0YXJ0IG5ldyBwcm9jZXNzcyB3aXRoIGFkZGl0aW9uYWwgZW52IHZhcmlhYmxlczoNCgkjKiBWaXN1YWxTdHVkaW9WZXJzaW9uID0gIjEwLjAiDQoJIyogRW5hYmxlTnVHZXRQYWNrYWdlUmVzdG9yZSAgPSAidHJ1ZSINCglFeGVjIC1GaWxlUGF0aCAkbXNidWlsZCBgDQoJCS1Bcmd1bWVudExpc3QgQCgkU2xuRmlsZXNbMF0uRnVsbE5hbWUsICIvcDpPdXRwdXRQYXRoPSRPdXRwdXRQYXRoIikgYA0KCQktRW52aXJvbm1lbnQgQHsnVmlzdWFsU3R1ZGlvVmVyc2lvbicgPSAnMTAuMCc7ICdFbmFibGVOdUdldFBhY2thZ2VSZXN0b3JlJyA9ICd0cnVlJ30gYA0KCQktUmVkaXJlY3RTdHJlYW1zDQoJDQoJJEFwcEZvbGRlciA9IEAoR2V0LUNoaWxkSXRlbSAoW0lPLlBhdGhdOjpDb21iaW5lKCRPdXRwdXRQYXRoLCAnX1B1Ymxpc2hlZFdlYnNpdGVzJykpKVswXQ0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJDQoJDQoJIyBJbnN0YWxsIHdlYiBhcHBsaWNhdGlvbg0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglSZWdpc3Rlci1XZWJBcHAgLVNvdXJjZSAkQXBwRm9sZGVyLkZ1bGxOYW1lIC1OYW1lICRBcHBGb2xkZXIuTmFtZQ0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCn0NCg==" + "DQpmdW5jdGlvbiBSZWdpc3Rlci1XZWJBcHAgew0KPCMNCi5MSU5LUw0KDQpodHRwOi8vd3d3Lmlpcy5uZXQvbGVhcm4vbWFuYWdlL3Bvd2Vyc2hlbGwvcG93ZXJzaGVsbC1zbmFwLWluLWNyZWF0aW5nLXdlYi1zaXRlcy13ZWItYXBwbGljYXRpb25zLXZpcnR1YWwtZGlyZWN0b3JpZXMtYW5kLWFwcGxpY2F0aW9uLXBvb2xzDQojPg0KCXBhcmFtICgNCgkJW1N0cmluZ10gJFNvdXJjZSwNCgkJW1N0cmluZ10gJFBhdGggPSAiQzpcaW5ldHB1Ylx3d3dyb290IiwNCgkJW1N0cmluZ10gJE5hbWUgPSAiIiwNCgkJW1N0cmluZ10gJFVzZXJuYW1lID0gIiIsDQoJCVtTdHJpbmddICRQYXNzd29yZCA9ICIiDQoJKQ0KDQoJSW1wb3J0LU1vZHVsZSBXZWJBZG1pbmlzdHJhdGlvbg0KCQ0KCWlmICgkTmFtZSAtZXEgIiIpIHsNCgkJJE5hbWUgPSBAKFtJTy5QYXRoXTo6R2V0RGlyZWN0b3J5TmFtZSgkU291cmNlKSAtc3BsaXQgJ1xcJylbLTFdDQoJCWlmICgkTmFtZSAtZXEgInd3d3Jvb3QiKSB7DQoJCQl0aHJvdygiQXBwbGljYXRpb24gcG9vbCBuYW1lIGNvdWxkbid0IGJlICd3d3dyb290Jy4iKQ0KCQl9DQoJfQ0KCWVsc2Ugew0KCQkkUGF0aCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkUGF0aCwgJE5hbWUpDQoJfQ0KDQoJQ29weS1JdGVtIC1QYXRoICRTb3VyY2UgLURlc3RpbmF0aW9uICRQYXRoIC1SZWN1cnNlIC1Gb3JjZQ0KCQ0KDQoJIyBDcmVhdGUgbmV3IGFwcGxpY2F0aW9uIHBvb2wNCiAgICAkQXBwUG9vbCA9IE5ldy1XZWJBcHBQb29sIC1OYW1lICROYW1lIC1Gb3JjZQ0KICAgICMkQXBwUG9vbCA9IEdldC1JdGVtICJJSVM6XEFwcFBvb2xzXCROYW1lIg0KICAgICRBcHBQb29sLm1hbmFnZWRSdW50aW1lVmVyc2lvbiA9ICd2NC4wJw0KICAgICRBcHBQb29sLm1hbmFnZWRQaXBlbGluZU1vZGUgPSAnQ2xhc3NpYycNCiAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwubG9hZFVzZXJQcm9maWxlID0gJHRydWUNCiAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwubG9nb25UeXBlID0gJ0xvZ29uQmF0Y2gnDQogICAgDQoJI1NldCBJZGVudGl0eSB0eXBlDQoJaWYgKCRVc2VybmFtZSAtZXEgIiIpIHsNCgkJJEFwcFBvb2wucHJvY2Vzc01vZGVsLmlkZW50aXR5VHlwZSA9ICdBcHBsaWNhdGlvblBvb2xJZGVudGl0eScNCgl9DQoJZWxzZSB7DQoJICAgICRBcHBQb29sLnByb2Nlc3NNb2RlbC5pZGVudGl0eVR5cGUgPSAnU3BlY2lmaWNVc2VyJw0KCSAgICAkQXBwUG9vbC5wcm9jZXNzTW9kZWwudXNlck5hbWUgPSAkVXNlcm5hbWUNCgkgICAgJEFwcFBvb2wucHJvY2Vzc01vZGVsLnBhc3N3b3JkID0gJFBhc3N3b3JkDQoJICAgICRBcHBQb29sIHwgU2V0LUl0ZW0NCgl9DQoNCg0KICAgICMgQ3JlYXRlIFdlYnNpdGUNCiAgICAkV2ViU2l0ZSA9IE5ldy1XZWJTaXRlIC1OYW1lICROYW1lIC1Qb3J0IDgwIC1Ib3N0SGVhZGVyICROYW1lIC1QaHlzaWNhbFBhdGggJFBhdGggLUZvcmNlDQogICAgIyRXZWJTaXRlID0gR2V0LUl0ZW0gIklJUzpcU2l0ZXNcJE5hbWUiDQogICAgDQoJIyBTZXQgdGhlIEFwcGxpY2F0aW9uIFBvb2wNCiAgICBTZXQtSXRlbVByb3BlcnR5ICJJSVM6XFNpdGVzXCROYW1lIiAnQXBwbGljYXRpb25Qb29sJyAkTmFtZQ0KICAgIA0KCSNUdXJuIG9uIERpcmVjdG9yeSBCcm93c2luZw0KICAgICNTZXQtV2ViQ29uZmlndXJhdGlvblByb3BlcnR5IC1GaWx0ZXIgJy9zeXN0ZW0ud2ViU2VydmVyL2RpcmVjdG9yeUJyb3dzZScgLU5hbWUgJ2VuYWJsZWQnIC1WYWx1ZSAkdHJ1ZSAtUFNQYXRoICJJSVM6XFNpdGVzXCROYW1lIg0KICAgIA0KCSMgVXBkYXRlIEF1dGhlbnRpY2F0aW9uDQogICAgI1NldC1XZWJDb25maWd1cmF0aW9uUHJvcGVydHkgLUZpbHRlciAnL3N5c3RlbS5XZWJTZXJ2ZXIvc2VjdXJpdHkvYXV0aGVudGljYXRpb24vQW5vbnltb3VzQXV0aGVudGljYXRpb24nIC1OYW1lICdlbmFibGVkJyAtVmFsdWUgJHRydWUgLUxvY2F0aW9uICRuYW1lDQogICAgI1NldC1XZWJDb25maWd1cmF0aW9uUHJvcGVydHkgLUZpbHRlciAnL3N5c3RlbS5XZWJTZXJ2ZXIvc2VjdXJpdHkvYXV0aGVudGljYXRpb24vd2luZG93c0F1dGhlbnRpY2F0aW9uJyAtTmFtZSAnZW5hYmxlZCcgLVZhbHVlICRmYWxzZSAtTG9jYXRpb24gJE5hbWUNCiAgICAjU2V0LVdlYkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eSAtRmlsdGVyICcvc3lzdGVtLldlYlNlcnZlci9zZWN1cml0eS9hdXRoZW50aWNhdGlvbi9iYXNpY0F1dGhlbnRpY2F0aW9uJyAtTmFtZSAnZW5hYmxlZCcgLVZhbHVlICRmYWxzZSAtTG9jYXRpb24gJE5hbWUNCgkNCgkkV2ViU2l0ZS5TdGFydCgpDQoNCglBZGQtQ29udGVudCAtUGF0aCAiQzpcV2luZG93c1xTeXN0ZW0zMlxEcml2ZXJzXGV0Y1xob3N0cyIgLVZhbHVlICIxMjcuMC4wLjEgICAkTmFtZSINCn0NCg0KDQpmdW5jdGlvbiBEZXBsb3ktV2ViQXBwRnJvbUdpdCB7DQoJcGFyYW0gKA0KCQlbU3RyaW5nXSAkVVJMLA0KCQlbU3RyaW5nXSAkVGVtcFBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoW0lPLlBhdGhdOjpHZXRUZW1wUGF0aCgpLCBbSU8uUGF0aF06OkdldFJhbmRvbUZpbGVOYW1lKCkpLA0KCQlbU3RyaW5nXSAkT3V0cHV0UGF0aCA9IFtJTy5QYXRoXTo6Q29tYmluZShbSU8uUGF0aF06OkdldFRlbXBQYXRoKCksIFtJTy5QYXRoXTo6R2V0UmFuZG9tRmlsZU5hbWUoKSkNCgkpDQoJV3JpdGUtTG9nICJUZW1wUGF0aCA9ICckVGVtcFBhdGgnIg0KCVdyaXRlLUxvZyAiT3V0cHV0UGF0aCA9ICckT3V0cHV0UGF0aCciDQoJDQoJDQoJIyBGZXRjaCB3ZWIgYXBwbGljYXRpb24NCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCVdyaXRlLUxvZyAiRmV0Y2hpbmcgc291cmNlcyBmcm9tIEdpdCAuLi4iDQoJDQoJJG51bGwgPSBOZXctSXRlbSAtUGF0aCAkVGVtcFBhdGggLUl0ZW1UeXBlIENvbnRhaW5lcg0KCUV4ZWMgLUZpbGVQYXRoICdnaXQuZXhlJyAtQXJndW1lbnRMaXN0IEAoJ2Nsb25lJywgJFVSTCkgLVdvcmtpbmdEaXIgJFRlbXBQYXRoIC1SZWRpcmVjdFN0cmVhbXMNCgkNCgkkUGF0aCA9IEAoR2V0LUNoaWxkSXRlbSAkVGVtcFBhdGgpWzBdLkZ1bGxOYW1lDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkNCgkNCgkjIEJ1aWxkIHdlYiBhcHBsaWNhdGlvbg0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJV3JpdGUtTG9nICJCdWlsZGluZyBzb3VyY2VzIC4uLiINCgkNCgkkbXNidWlsZCA9ICJDOlxXaW5kb3dzXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrNjRcdjQuMC4zMDMxOVxNU0J1aWxkLmV4ZSINCgkNCgkkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRPdXRwdXRQYXRoIC1JdGVtVHlwZSBDb250YWluZXINCgkNCgkkU2xuRmlsZXMgPSBAKEdldC1DaGlsZEl0ZW0gLVBhdGggJFBhdGggLUZpbHRlciAqLnNsbiAtUmVjdXJzZSkNCg0KICAgICMgU3RhcnQgbmV3IHByb2Nlc3NzIHdpdGggYWRkaXRpb25hbCBlbnYgdmFyaWFibGVzOg0KCSMqIFZpc3VhbFN0dWRpb1ZlcnNpb24gPSAiMTAuMCINCgkjKiBFbmFibGVOdUdldFBhY2thZ2VSZXN0b3JlICA9ICJ0cnVlIg0KCUV4ZWMgLUZpbGVQYXRoICRtc2J1aWxkIGANCgkJLUFyZ3VtZW50TGlzdCBAKCRTbG5GaWxlc1swXS5GdWxsTmFtZSwgIi9wOk91dHB1dFBhdGg9JE91dHB1dFBhdGgiKSBgDQoJCS1FbnZpcm9ubWVudCBAeydWaXN1YWxTdHVkaW9WZXJzaW9uJyA9ICcxMC4wJzsgJ0VuYWJsZU51R2V0UGFja2FnZVJlc3RvcmUnID0gJ3RydWUnfSBgDQoJCS1SZWRpcmVjdFN0cmVhbXMNCgkNCgkkQXBwRm9sZGVyID0gQChHZXQtQ2hpbGRJdGVtIChbSU8uUGF0aF06OkNvbWJpbmUoJE91dHB1dFBhdGgsICdfUHVibGlzaGVkV2Vic2l0ZXMnKSkpWzBdDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkNCgkNCgkjIEluc3RhbGwgd2ViIGFwcGxpY2F0aW9uDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCVJlZ2lzdGVyLVdlYkFwcCAtU291cmNlICRBcHBGb2xkZXIuRnVsbE5hbWUgLU5hbWUgJEFwcEZvbGRlci5OYW1lDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfQ0K" ], "Commands": [ { diff --git a/data/templates/agent/InstallIIS.template b/data/templates/agent/InstallIIS.template index f4d4a20..617bf25 100644 --- a/data/templates/agent/InstallIIS.template +++ b/data/templates/agent/InstallIIS.template @@ -1,26 +1,26 @@ -{ - "Scripts": [ +{ + "Scripts": [ "ZnVuY3Rpb24gQ29weS1QcmVyZXF1aXNpdGVzIHsNCglwYXJhbSAoDQoJCVtTdHJpbmddICRQYXRoID0gJycsDQoJCVtTdHJpbmddICREZXN0aW5hdGlvbiA9ICcnDQoJKQ0KDQoJV3JpdGUtTG9nICItLT4gQ29weS1QcmVyZXF1aXNpdGVzIg0KDQogICAgaWYgKCREZXN0aW5hdGlvbiAtZXEgJycpIHsNCiAgICAgICAgdGhyb3coIkNvcHktUHJlcmVxdWlzaXRlczogRGVzdGluYXRpb24gcGF0aCBub3Qgc3BlY2lmaWVkISIpDQogICAgfQ0KDQogICAgaWYgKCRQYXRoIC1lcSAnJykgew0KICAgICAgICAkUGF0aCA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpDQogICAgICAgIGlmICgkUGF0aCAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgIHRocm93KCJDb3B5LVByZXJlcXVpc2l0ZXM6IFVuYWJsZSB0byBkZXRlcm1pbmUgc291cmNlIHBhdGggZm9yIHByZXJlcXVpc2l0ZXMuIikNCiAgICAgICAgfQ0KICAgIH0NCg0KCVdyaXRlLUxvZyAiQ3JlYXRpbmcgbmV3IFBTRHJpdmUgLi4uIg0KCU5ldy1QU0RyaXZlIC1OYW1lICdQJyAtUFNQcm92aWRlciAnRmlsZVN5c3RlbScgLVJvb3QgJFBhdGggfCBPdXQtTnVsbA0KCVdyaXRlLUxvZyAiQ3JlYXRpbmcgZGVzdGluYXRpb24gZm9sZGVyIC4uLiINCglOZXctSXRlbSAtUGF0aCAkRGVzdGluYXRpb24gLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UgfCBPdXQtTnVsbA0KCVdyaXRlLUxvZyAiQ29weWluZyBpdGVtcyAuLi4iDQoJQ29weS1JdGVtIC1QYXRoICdQOlxQcmVyZXF1aXNpdGVzXElJUycgLURlc3RpbmF0aW9uICREZXN0aW5hdGlvbiAtUmVjdXJzZSAtRm9yY2UgfCBPdXQtTnVsbA0KCVdyaXRlLUxvZyAiUmVtb3ZpbmcgUFNEcml2ZSAuLi4iDQoJUmVtb3ZlLVBTRHJpdmUgLU5hbWUgJ1AnIC1QU1Byb3ZpZGVyICdGaWxlU3lzdGVtJyAtRm9yY2UgfCBPdXQtTnVsbA0KCQ0KCVdyaXRlLUxvZyAiPC0tIENvcHktUHJlcmVxdWlzaXRlcyINCn0NCg0KDQoNCmZ1bmN0aW9uIEluc3RhbGwtV2ViU2VydmVyIHsNCglwYXJhbSAoDQoJCVtTdHJpbmddICRQcmVyZXF1aXNpdGVzUGF0aA0KCSkNCgkNCglXcml0ZS1Mb2cgIi0tPiBJbnN0YWxsLVdlYlNlcnZlckNvbXBvbmVudHMiDQoNCgkkRmVhdHVyZUxpc3QgPSBAKA0KCQknV2ViLVNlcnZlcicsDQoJCSdXZWItTmV0LUV4dDQ1JywNCgkJJ1dlYi1BU1AnLA0KCQknV2ViLUFzcC1OZXQ0NScsDQoJCSdXZWItSVNBUEktRXh0JywNCgkJJ1dlYi1JU0FQSS1GaWx0ZXInLA0KCQknV2ViLUluY2x1ZGVzJw0KCSkNCgkNCgkkUHJlcmVxdWlzaXRlc0xpc3QgPSBAKA0KCQknQXNwTmV0TXZjNFNldHVwLmV4ZScsDQoJCSdXZWJBcHBsaWNhdGlvbnMuZXhlJw0KCSkNCiAgICANCgkkUHJlcmVxdWlzaXRlc1BhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJFByZXJlcXVpc2l0ZXNQYXRoLCAnSUlTJykNCiAgICANCglXcml0ZS1Mb2cgIlZhbGlkYXRpbmcgcHJlcmVxdWlzaXRlcyBiYXNlZCBvbiB0aGUgbGlzdCAuLi4iDQoJZm9yZWFjaCAoJEZpbGVOYW1lIGluICRQcmVyZXF1aXNpdGVzTGlzdCkgew0KCQkkRmlsZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJFByZXJlcXVpc2l0ZXNQYXRoLCAkRmlsZU5hbWUpDQoJCWlmICgtbm90IChUZXN0LVBhdGggLVBhdGggJEZpbGVQYXRoIC1QYXRoVHlwZSBMZWFmKSkgew0KCQkJdGhyb3coIlByZXJlcXVpc2l0ZSBmaWxlIG5vdCBmb3VuZDogJyRGaWxlUGF0aCciKQ0KCQl9DQoJfQ0KCQ0KCUltcG9ydC1Nb2R1bGUgU2VydmVyTWFuYWdlcg0KCQ0KCVdyaXRlLUxvZyAiSW5zdGFsbGluZyBXZWIgU2VydmVyIC4uLiINCglJbnN0YWxsLVdpbmRvd3NGZWF0dXJlICRGZWF0dXJlTGlzdCAtSW5jbHVkZU1hbmFnZW1lbnRUb29scw0KCQ0KCVdyaXRlLUxvZyAiSW5zdGFsbGluZyBBc3BOZXRNdnA0IC4uLiINCgkkRXhlYyA9IEV4ZWMgLUZpbGVQYXRoICQoW0lPLlBhdGhdOjpDb21iaW5lKCRQcmVyZXF1aXNpdGVzUGF0aCwgJ0FzcE5ldE12YzRTZXR1cC5leGUnKSkgLUFyZ3VtZW50TGlzdCAnL3EnIC1QYXNzVGhydQ0KCWlmICgkRXhlYy5FeGl0Q29kZSAtbmUgMCkgew0KCQl0aHJvdygiSW5zdGFsbGF0aW9uIG9mICdBc3BOZXRNdmM0U2V0dXAuZXhlJyBmYWlsZWQuIFByb2Nlc3MgZXhpdCBjb2RlICckKCRFeGVjLkV4aXRDb2RlKSciKQ0KCX0NCgkNCgkjIEV4dHJhY3QgV2ViQXBwbGljYXRpb25zIGZvbGRlciB3aXRoICoudGFyZ2V0IGZpbGVzIHRvDQoJIyAgIEM6XFByb2dyYW0gRmlsZXMgKHg4NilcTVNCdWlsZFxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wDQoJV3JpdGUtTG9nICJJbnN0YWxsaW5nIFdlYkFwcGxpY2F0aW9uIHRhcmdldHMgLi4uIg0KCSRXZWJBcHBsaWNhdGlvbnNUYXJnZXRzUm9vdCA9ICdDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1TQnVpbGRcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2MTAuMCcNCgkkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRXZWJBcHBsaWNhdGlvbnNUYXJnZXRzUm9vdCAtSXRlbVR5cGUgQ29udGFpbmVyDQoJJEV4ZWMgPSBFeGVjIC1GaWxlUGF0aCAkKFtJTy5QYXRoXTo6Q29tYmluZSgkUHJlcmVxdWlzaXRlc1BhdGgsICdXZWJBcHBsaWNhdGlvbnMuZXhlJykpIC1Bcmd1bWVudExpc3QgQCgiLW9gIiRXZWJBcHBsaWNhdGlvbnNUYXJnZXRzUm9vdGAiIiwgJy15JykgLVBhc3NUaHJ1DQoJaWYgKCRFeGVjLkV4aXRDb2RlIC1uZSAwKSB7DQoJCXRocm93KCJJbnN0YWxsYXRpb24gb2YgJ1dlYkFwcGxpY2F0aW9ucy5leGUnIGZhaWxlZC4gUHJvY2VzcyBleGl0IGNvZGUgJyQoJEV4ZWMuRXhpdENvZGUpJyIpDQoJfQ0KDQoJV3JpdGUtTG9nICI8LS0gSW5zdGFsbC1XZWJTZXJ2ZXJDb21wb25lbnRzIg0KfQ0KDQo=" - ], - "Commands": [ - { - "Name": "Import-Module", - "Arguments": { - "Name": "CoreFunctions" - } - }, - { - "Name": "Copy-Prerequisites", - "Arguments": { - "Destination": "C:\\Prerequisites" - } - }, - { - "Name": "Install-WebServer", - "Arguments": { - "PrerequisitesPath": "C:\\Prerequisites" - } - } - ], - "RebootOnCompletion": 0 -} + ], + "Commands": [ + { + "Name": "Import-Module", + "Arguments": { + "Name": "CoreFunctions" + } + }, + { + "Name": "Copy-Prerequisites", + "Arguments": { + "Destination": "C:\\Prerequisites" + } + }, + { + "Name": "Install-WebServerComponents", + "Arguments": { + "PrerequisitesPath": "C:\\Prerequisites" + } + } + ], + "RebootOnCompletion": 0 +} diff --git a/data/templates/cf/LoadBalancer.template b/data/templates/cf/LoadBalancer.template index 3b25afa..ad85bb4 100644 --- a/data/templates/cf/LoadBalancer.template +++ b/data/templates/cf/LoadBalancer.template @@ -3,6 +3,7 @@ "$lbName" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { + "AvailabilityZones" : { "Fn::GetAZs" : "" }, "Instances" : [{"Ref": "$instanceName"}], "Listeners" : [ { "LoadBalancerPort" : "$lbPort", diff --git a/data/templates/cf/Windows.template b/data/templates/cf/Windows.template index 7fa8850..6c16d82 100644 --- a/data/templates/cf/Windows.template +++ b/data/templates/cf/Windows.template @@ -1,57 +1,29 @@ { "AWSTemplateFormatVersion" : "2010-09-09", - "Description" : "", - "Parameters" : { "KeyName" : { - "Description" : "Name of an existing Amazon EC2 key pair for RDP access", + "Description" : "Key Pair name for Load Balancer", "Type" : "String", - "Default" : "murano-keys" + "Default" : "murano-lb-key" }, "InstanceType" : { "Description" : "Amazon EC2 instance type", "Type" : "String", - "Default" : "m1.medium", - "AllowedValues" : [ "m1.small", "m1.medium", "m1.large" ] + "Default" : "m1.medium" }, "ImageName" : { "Description" : "Image name", - "Type" : "String", - "Default" : "ws-2012-full-agent", - "AllowedValues" : [ "ws-2012-full", "ws-2012-core", "ws-2012-full-agent" ] + "Type" : "String" } }, "Resources" : { - "IAMUser" : { - "Type" : "AWS::IAM::User", - "Properties" : { - "Path": "/", - "Policies": [{ - "PolicyName": "root", - "PolicyDocument": { "Statement":[{ - "Effect": "Allow", - "Action": "CloudFormation:DescribeStackResource", - "Resource": "*" - }]} - }] - } - }, - - "IAMUserAccessKey" : { - "Type" : "AWS::IAM::AccessKey", - "Properties" : { - "UserName" : {"Ref": "IAMUser"} - } - }, - "$instanceName": { "Type" : "AWS::EC2::Instance", "Properties": { "InstanceType" : { "Ref" : "InstanceType" }, "ImageId" : { "Ref" : "ImageName" }, - "KeyName" : { "Ref" : "KeyName" }, "UserData": "$userData" } } @@ -59,4 +31,4 @@ "Outputs" : { } -} \ No newline at end of file +} diff --git a/data/workflows/AD.xml b/data/workflows/AD.xml index 5ccce21..c1bba51 100644 --- a/data/workflows/AD.xml +++ b/data/workflows/AD.xml @@ -8,7 +8,7 @@ + Creating instance ) @@ -25,7 +25,6 @@ - murano-keys m1.medium ws-2012-full @@ -35,7 +34,7 @@ - Instance ( - Creating Primary Domain Controller on unit ( - Unit + Unit has joined domain - Creating Secondary Domain Controller on unit ( - Creating instance ( created + Instance ) created @@ -52,9 +51,7 @@ - - : - Creating IIS Web Server on unit ( - IIS ( - Deploying Web App on unit on unit ) @@ -128,7 +125,7 @@ has been deployed. + WebApp (