def __init__(self, oozie_node, task_id, trigger_rule=TriggerRule.ALL_SUCCESS, params={}, template='ssh.tpl'): ActionMapper.__init__(self, oozie_node, task_id, trigger_rule) self.template = template cmd_node = self.oozie_node.find('command') arg_nodes = self.oozie_node.findall('args') cmd = ' '.join([cmd_node.text] + [x.text for x in arg_nodes]) self.command = el_utils.convert_el_to_jinja(cmd, quote=True) host_key = el_utils.strip_el(self.oozie_node.find('host').text) # the <user> node is formatted like [USER]@[HOST] if host_key in params: host_key = params[host_key] # Since ariflow separates user and host, we can't use jinja templating. # We must check if it is in params. user_host = host_key.split('@') self.user = user_host[0] self.host = user_host[1]
def _parse_oozie_node(self): res_man_text = self.oozie_node.find("resource-manager").text name_node_text = self.oozie_node.find("name-node").text self.resource_manager = el_utils.replace_el_with_var( res_man_text, params=self.params, quote=False) self.name_node = el_utils.replace_el_with_var(name_node_text, params=self.params, quote=False) self._parse_config() cmd_node = self.oozie_node.find("exec") arg_nodes = self.oozie_node.findall("argument") cmd = " ".join([cmd_node.text] + [x.text for x in arg_nodes]) self.bash_command = el_utils.convert_el_to_jinja(cmd, quote=False)
def parse_prepare_node(prepare_node: ET.Element): """ <prepare> <delete path="[PATH]"/> ... <mkdir path="[PATH]"/> ... </prepare> """ delete_paths = [] mkdir_paths = [] for node in prepare_node: node_path = el_utils.convert_el_to_jinja(node.attrib["path"], quote=False) if node.tag == "delete": delete_paths.append(node_path) else: mkdir_paths.append(node_path) return delete_paths, mkdir_paths
def __init__( self, oozie_node: Element, name: str, trigger_rule: str = TriggerRule.ALL_SUCCESS, params: Dict[str, str] = None, template: str = "ssh.tpl", **kwargs, ): ActionMapper.__init__(self, oozie_node=oozie_node, name=name, trigger_rule=trigger_rule, **kwargs) if params is None: params = {} self.template = template cmd_node = self.oozie_node.find("command") arg_nodes = self.oozie_node.findall("args") if cmd_node is None or not cmd_node.text: raise Exception( "Missing or empty command node in SSH action {}".format( self.oozie_node)) cmd = " ".join([cmd_node.text] + [x.text if x.text else "" for x in arg_nodes]) self.command = el_utils.convert_el_to_jinja(cmd, quote=True) host = self.oozie_node.find("host") if host is None: raise Exception("Missing host node in SSH action: {}".format( self.oozie_node)) host_key = el_utils.strip_el(host.text) # the <user> node is formatted like [USER]@[HOST] if host_key in params: host_key = params[host_key] # Since ariflow separates user and host, we can't use jinja templating. # We must check if it is in params. user_host = host_key.split("@") self.user = user_host[0] self.host = user_host[1]
def test_convert_el_to_jinja_var_no_quote(self): el_function = "${hostname}" expected = "{{ params.hostname }}" self.assertEqual( expected, el_utils.convert_el_to_jinja(el_function, quote=False))
def test_convert_el_to_jinja_no_change_quote(self): el_function = "no_el_here" expected = "'no_el_here'" self.assertEqual(expected, el_utils.convert_el_to_jinja(el_function, quote=True))
def test_convert_el_to_jinja_func_quote(self): el_function = '${concat("ab", "de")}' expected = 'concat("ab", "de")' self.assertEqual(expected, el_utils.convert_el_to_jinja(el_function, quote=True))
def test_convert_el_to_jinja_var_no_quote(self): el = '${hostname}' expected = '{{ params.hostname }}' self.assertEqual(expected, el_utils.convert_el_to_jinja(el, quote=False))
def test_convert_el_to_jinja_no_change_quote(self): el = 'no_el_here' expected = '\'no_el_here\'' self.assertEqual(expected, el_utils.convert_el_to_jinja(el, quote=True))
def test_convert_el_to_jinja_func_no_quote(self): el = '${concat("ab", "de")}' expected = 'concat("ab", "de")' self.assertEqual(expected, el_utils.convert_el_to_jinja(el, quote=False))