[
https://issues.apache.org/jira/browse/ARIA-46?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15829840#comment-15829840
]
ASF GitHub Bot commented on ARIA-46:
------------------------------------
Github user dankilman commented on a diff in the pull request:
https://github.com/apache/incubator-ariatosca/pull/50#discussion_r96822704
--- Diff: aria/orchestrator/execution_plugin/common.py ---
@@ -0,0 +1,145 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import os
+import tempfile
+
+import requests
+
+from . import constants
+from . import exceptions
+
+
+def is_windows():
+ return os.name == 'nt'
+
+
+def download_script(ctx, script_path):
+ split = script_path.split('://')
+ schema = split[0]
+ suffix = script_path.split('/')[-1]
+ file_descriptor, dest_script_path =
tempfile.mkstemp(suffix='-{0}'.format(suffix))
+ os.close(file_descriptor)
+ try:
+ if schema in ['http', 'https']:
+ response = requests.get(script_path)
+ if response.status_code == 404:
+ ctx.task.abort('Failed to download script: {0} (status
code: {1})'
+ .format(script_path, response.status_code))
+ content = response.text
+ with open(dest_script_path, 'wb') as f:
+ f.write(content)
+ else:
+ ctx.download_resource(destination=dest_script_path,
path=script_path)
+ except:
+ os.remove(dest_script_path)
+ raise
+ return dest_script_path
+
+
+def create_process_config(script_path, process, operation_kwargs,
quote_json_env_vars=False):
+ """
+ update a process with it's environment variables, and return it.
+
+ Get a dict representing a process and a dict representing the
environment
+ variables. Convert each environment variable to a format of
+ <string representing the name of the variable> :
+ <json formatted string representing the value of the variable>.
+ Finally, update the process with the newly formatted environment
variables,
+ and return the process.
+
+ :param process: a dict representing a process
+ :type process: dict
+ :param operation_kwargs: a dict representing environment variables that
+ should exist in the process' running environment.
+ :type operation_kwargs: dict
+ :return: the process updated with its environment variables.
+ :rtype: dict
+ """
+ process = process or {}
+ env_vars = operation_kwargs.copy()
+ if 'ctx' in env_vars:
+ del env_vars['ctx']
+ env_vars.update(process.get('env', {}))
+ for k, v in env_vars.items():
+ if isinstance(v, (dict, list, tuple, bool, int, float)):
+ env_var_value = json.dumps(v)
+ if is_windows():
+ # These <k,v> environment variables will subsequently
+ # be used in a subprocess.Popen() call, as the `env`
parameter.
+ # In some windows python versions, if an environment
variable
+ # name is not of type str (e.g. unicode), the Popen call
will
+ # fail.
+ k = str(k)
+ # The windows shell removes all double quotes - escape them
+ # to still be able to pass JSON in env vars to the shell.
+ env_var_value = env_var_value.replace('"', '\\"')
+ if quote_json_env_vars:
+ env_var_value = "'{0}'".format(env_var_value)
+ env_vars[k] = env_var_value
+ process['env'] = env_vars
+ args = process.get('args')
+ command = script_path
+ command_prefix = process.get('command_prefix')
+ if command_prefix:
+ command = '{0} {1}'.format(command_prefix, command)
+ if args:
+ command = ' '.join([command] + [str(a) for a in args])
+ process['command'] = command
+ return process
+
+
+def patch_ctx(ctx):
+ ctx._error = None
+ task = ctx.task
+ task._original_abort = task.abort
+ task._original_retry = task.retry
+
+ def _validate_legal_action():
+ if ctx._error is not None:
+ ctx._error =
RuntimeError(constants.ILLEGAL_CTX_OPERATION_MESSAGE)
+ raise ctx._error
+
+ def abort_operation(message=None):
+ _validate_legal_action()
+ ctx._error = exceptions.ScriptException(message=message,
retry=False)
+ return ctx._error
+ task.abort = abort_operation
+
+ def retry_operation(message=None, retry_interval=None):
+ _validate_legal_action()
+ ctx._error = exceptions.ScriptException(message=message,
+ retry=True,
+
retry_interval=retry_interval)
+ return ctx._error
+ task.retry = retry_operation
+
+
+def check_error(ctx, error_check_func=None, reraise=False):
+ _error = ctx._error
+ # this happens when more than 1 ctx return action is invoked
--- End diff --
retrun?
doc!
> Execution plugin in ARIA
> ------------------------
>
> Key: ARIA-46
> URL: https://issues.apache.org/jira/browse/ARIA-46
> Project: AriaTosca
> Issue Type: Story
> Reporter: Ran Ziv
> Assignee: Dan Kilman
> Priority: Critical
>
> Migrate the execution plugin to ARIA, and make it part of the core code
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)