Bläddra i källkod

[oozie] Import workflow with FS action

Import workflow definition with FS action.
New testcase validating import.
abec 13 år sedan
förälder
incheckning
a5fe7eb

+ 19 - 0
apps/oozie/src/oozie/test_data/0.4/test-fs.xml

@@ -0,0 +1,19 @@
+<workflow-app name="fs-test" xmlns="uri:oozie:workflow:0.4">
+    <start to="Fs"/>
+    <action name="Fs">
+        <fs>
+              <delete path='${nameNode}${output}/testfs'/>
+              <mkdir path='${nameNode}${output}/testfs'/>
+              <mkdir path='${nameNode}${output}/testfs/source'/>
+              <move source='${nameNode}${output}/testfs/source' target='${nameNode}${output}/testfs/renamed'/>
+              <chmod path='${nameNode}${output}/testfs/renamed' permissions='700' dir-files='false'/>
+              <touchz path='${nameNode}${output}/testfs/new_file'/>
+        </fs>
+        <ok to="end"/>
+        <error to="kill"/>
+    </action>
+    <kill name="kill">
+        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
+    </kill>
+    <end name="end"/>
+</workflow-app>

+ 22 - 1
apps/oozie/src/oozie/tests.py

@@ -1238,7 +1238,7 @@ class TestEditor(OozieMockBase):
 
   def test_import_workflow_java(self):
     """
-    Validates import for job node: main_class, args.
+    Validates import for java node: main_class, args.
     """
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
@@ -1257,6 +1257,27 @@ class TestEditor(OozieMockBase):
     workflow.delete()
 
 
+  def test_import_workflow_fs(self):
+    """
+    Validates import for fs node: chmods, deletes, mkdirs, moves, touchzs.
+    """
+    workflow = Workflow.objects.new_workflow(self.user)
+    workflow.save()
+    f = open('apps/oozie/src/oozie/test_data/0.4/test-fs.xml')
+    import_workflow(workflow, f.read())
+    f.close()
+    workflow.save()
+    assert_equal(4, len(Node.objects.filter(workflow=workflow)))
+    assert_equal(3, len(Link.objects.filter(parent__workflow=workflow)))
+    node = Node.objects.get(workflow=workflow, node_type='fs').get_full_node()
+    assert_equal('[{"path":"${nameNode}${output}/testfs/renamed","permissions":"700","recursive":"false"}]', node.chmods)
+    assert_equal('["${nameNode}${output}/testfs"]', node.deletes)
+    assert_equal('["${nameNode}${output}/testfs","${nameNode}${output}/testfs/source"]', node.mkdirs)
+    assert_equal('[{"source":"${nameNode}${output}/testfs/source","destination":"${nameNode}${output}/testfs/renamed"}]', node.moves)
+    assert_equal('["${nameNode}${output}/testfs/new_file"]', node.touchzs)
+    workflow.delete()
+
+
 class TestPermissions(OozieBase):
 
   def setUp(self):

+ 2 - 1
apps/oozie/src/oozie/xslt/0.4/action.xslt

@@ -9,6 +9,7 @@
 <xsl:import href="extensions/sqoop.0.1.xslt"/>
 <xsl:import href="extensions/sqoop.0.2.xslt"/>
 <xsl:import href="extensions/ssh.0.1.xslt"/>
+<xsl:import href="nodes/fs.xslt"/>
 <xsl:import href="nodes/java.xslt"/>
 <xsl:import href="nodes/mapreduce.xslt"/>
 <xsl:import href="nodes/pig.xslt"/>
@@ -22,7 +23,7 @@
       <xsl:value-of select="@name"/>
     </field>
     <field name="node_type" type="CharField">
-      <xsl:value-of select="name(.)"/>
+      <xsl:value-of select="name(*)"/>
     </field>
 
   </object>

+ 39 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fields/chmods.xslt

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:template name="chmods">
+
+  <field name="chmods" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='chmod']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fields/deletes.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:template name="deletes">
+
+  <field name="deletes" type="TextField">
+
+      <xsl:text>[</xsl:text>
+      <xsl:for-each select="*[local-name()='delete']">
+        <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+        <xsl:if  test="position() &lt; last()">
+          <xsl:text>,</xsl:text>
+        </xsl:if>
+      </xsl:for-each>
+      <xsl:text>]</xsl:text>
+
+    </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fields/mkdirs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:template name="mkdirs">
+
+  <field name="mkdirs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='mkdir']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 35 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fields/moves.xslt

@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:template name="moves">
+
+  <field name="moves" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='move']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fields/touchzs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:template name="touchzs">
+
+  <field name="touchzs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='touchz']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.4/nodes/fs.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/chmods.xslt"/>
+<xsl:import href="fields/deletes.xslt"/>
+<xsl:import href="fields/mkdirs.xslt"/>
+<xsl:import href="fields/moves.xslt"/>
+<xsl:import href="fields/touchzs.xslt"/>
+
+<xsl:template match="workflow:fs" xmlns:workflow="uri:oozie:workflow:0.4">
+
+  <object model="oozie.fs" pk="0">
+
+    <xsl:call-template name="chmods"/>
+    <xsl:call-template name="deletes"/>
+    <xsl:call-template name="mkdirs"/>
+    <xsl:call-template name="moves"/>
+    <xsl:call-template name="touchzs"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>