def get_command(self) -> str: cmd_txt = xml_utils.get_tag_el_text(self.oozie_node, TAG_CMD, self.props) args = xml_utils.get_tags_el_array_from_text(self.oozie_node, TAG_ARG, self.props) if not cmd_txt: raise Exception("Missing or empty command node in SSH action {}".format(self.oozie_node)) cmd = " ".join([cmd_txt] + [shlex.quote(x) for x in args]) cmd = el_utils.convert_el_to_jinja(cmd) return cmd
def _parse_oozie_node(self): self.resource_manager = get_tag_el_text(self.oozie_node, TAG_RESOURCE, self.props) self.name_node = get_tag_el_text(self.oozie_node, TAG_NAME, self.props) cmd_txt = get_tag_el_text(self.oozie_node, TAG_CMD, self.props) args = get_tags_el_array_from_text(self.oozie_node, TAG_ARG, self.props) cmd = " ".join([cmd_txt] + [x for x in args]) self.bash_command = convert_el_to_jinja(cmd, quote=False) self.pig_command = f"sh {self.bash_command}"
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, props=self.props, quote=False) self.name_node = el_utils.replace_el_with_var(name_node_text, props=self.props, quote=False) 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) self.pig_command = f"sh {self.bash_command}"
def __init__( self, oozie_node: Element, name: str, props: PropertySet, template: str = "ssh.tpl", **kwargs ): ActionMapper.__init__(self, oozie_node=oozie_node, name=name, props=props, **kwargs) self.template = template cmd = self.get_command() self.command = el_utils.convert_el_to_jinja(cmd) host_key = self.get_host_key() # Since Airflow separates user and host, we can't use jinja templating. # We must check if it is in job_properties. user_host = host_key.split("@") self.user = user_host[0] self.host = user_host[1]
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 = cmd_node.text args = (x.text if x.text else "" for x in arg_nodes) cmd = " ".join(shlex.quote(x) for x in [cmd, *args]) 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_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_quote(self): el_function = "${hostname}" expected = "'{{ params.hostname }}'" self.assertEqual(expected, el_utils.convert_el_to_jinja(el_function, quote=True))
def test_convert_el_to_jinja_var_no_quote(self): el_function = "${hostname}" expected = "{{ params.props.merged['hostname'] }}" self.assertEqual( expected, el_utils.convert_el_to_jinja(el_function, quote=False))