浏览代码

HUE-6379 [oozie] Add support for old oozie schemas in dashboard graph

krish 8 年之前
父节点
当前提交
bdbff1f

+ 1 - 1
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/action.xslt

@@ -30,7 +30,7 @@
 <xsl:import href="nodes/subworkflow.xslt"/>
 <xsl:import href="nodes/generic.xslt"/>
 
-<xsl:template match="workflow5:action | workflow4:action" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:action | workflow4:action | workflow3:action | workflow2:action | workflow1:action" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
   {
     "name": "<xsl:value-of select="@name"/>",
     "node_type": "<xsl:value-of select="name(*)"/>",

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/control.xslt

@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="nodes/fork.xslt"/>
 <xsl:import href="nodes/decision.xslt"/>
 
-<xsl:template match="workflow5:start | workflow5:end | workflow5:decision | workflow5:fork | workflow5:join | workflow5:kill | workflow4:start | workflow4:end | workflow4:decision | workflow4:fork | workflow4:join | workflow4:kill">
+<xsl:template match="workflow5:start | workflow5:end | workflow5:decision | workflow5:fork | workflow5:join | workflow5:kill | workflow4:start | workflow4:end | workflow4:decision | workflow4:fork | workflow4:join | workflow4:kill | workflow3:start | workflow3:end | workflow3:decision | workflow3:fork | workflow3:join | workflow3:kill | workflow2:start | workflow2:end | workflow2:decision | workflow2:fork | workflow2:join | workflow2:kill | workflow1:start | workflow1:end | workflow1:decision | workflow1:fork | workflow1:join | workflow1:kill">
   {
     "name": "<xsl:value-of select="@name"/>",
     "node_type": "<xsl:value-of select="name(.)"/>",

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/decision.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
-<xsl:template match="workflow5:decision | workflow4:decision" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:decision | workflow4:decision | workflow3:decision | workflow2:decision | workflow1:decision" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
   <xsl:for-each select="*[local-name()='switch']/*[local-name()='case']">
     ,"path<xsl:value-of select='position()'/>": "<xsl:value-of select='@to'/>"

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/fork.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
-<xsl:template match="workflow5:fork | workflow4:fork" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:fork | workflow4:fork | workflow3:fork | workflow2:fork | workflow1:fork" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
   <xsl:for-each select="*">
     ,"path<xsl:value-of select='position()'/>": "<xsl:value-of select="@start"/>"
   </xsl:for-each>

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/fs.xslt

@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="fields/touchzs.xslt"/>
 <xsl:import href="fields/deletes.xslt"/>
 <xsl:import href="fields/mkdirs.xslt"/>
 <xsl:import href="fields/moves.xslt"/>
 
-<xsl:template match="workflow5:fs | workflow4:fs" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:fs | workflow4:fs | workflow3:fs | workflow2:fs | workflow1:fs" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
   ,"fs": { <xsl:call-template name="touchzs"/>,
            <xsl:call-template name="deletes"/>,

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/java.xslt

@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="fields/jar_path.xslt"/>
 
-<xsl:template match="workflow5:java | workflow4:java" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:java | workflow4:java | workflow3:java | workflow2:java | workflow1:java" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
   ,"java": {
         "main-class": "<xsl:value-of select="*[local-name()='main-class']"/>"

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/mapreduce.xslt

@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="fields/job_properties.xslt"/>
 
-<xsl:template match="workflow5:map-reduce | workflow4:map-reduce" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:map-reduce | workflow4:map-reduce | workflow3:map-reduce | workflow2:map-reduce | workflow1:map-reduce" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
     <xsl:call-template name="job_properties"/>
 

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/pig.xslt

@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="fields/script_path.xslt"/>
 
-<xsl:template match="workflow5:pig | workflow4:pig" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:pig | workflow4:pig | workflow3:pig | workflow2:pig | workflow1:pig" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
   ,"pig": {<xsl:call-template name="script_path"/>}
 

+ 1 - 1
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/streaming.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:import href="fields/mapper.xslt"/>
 <xsl:import href="fields/reducer.xslt"/>

+ 2 - 2
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/nodes/subworkflow.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
-<xsl:template match="workflow5:sub-workflow | workflow4:sub-workflow" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:template match="workflow5:sub-workflow | workflow4:sub-workflow | workflow3:sub-workflow | workflow2:sub-workflow | workflow1:sub-workflow" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
   , "subworkflow": { "app-path":"<xsl:value-of select="*[local-name()='app-path']"/>" }
 </xsl:template>
 

+ 22 - 1
apps/oozie/src/oozie/importlib/xslt2/workflows/0.5/workflow.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow5="uri:oozie:workflow:0.5" xmlns:workflow4="uri:oozie:workflow:0.4" xmlns:workflow3="uri:oozie:workflow:0.3" xmlns:workflow2="uri:oozie:workflow:0.2" xmlns:workflow1="uri:oozie:workflow:0.1">
 
 <xsl:include href="action.xslt"/>
 <xsl:include href="control.xslt"/>
@@ -19,6 +19,27 @@
 
 </xsl:template>
 
+<xsl:template match="/workflow3:workflow-app">
+
+   [ <xsl:apply-templates select="workflow3:start | workflow3:end | workflow3:decision | workflow3:fork | workflow3:join | workflow3:kill"/>
+    <xsl:apply-templates select="workflow3:action"/> {}]
+
+</xsl:template>
+
+<xsl:template match="/workflow2:workflow-app">
+
+   [ <xsl:apply-templates select="workflow2:start | workflow2:end | workflow2:decision | workflow2:fork | workflow2:join | workflow2:kill"/>
+    <xsl:apply-templates select="workflow2:action"/> {}]
+
+</xsl:template>
+
+<xsl:template match="/workflow1:workflow-app">
+
+   [ <xsl:apply-templates select="workflow1:start | workflow1:end | workflow1:decision | workflow1:fork | workflow1:join | workflow1:kill"/>
+    <xsl:apply-templates select="workflow1:action"/> {}]
+
+</xsl:template>
+
 
 <xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
 </xsl:stylesheet>

+ 195 - 75
apps/oozie/src/oozie/models2_tests.py

@@ -913,99 +913,219 @@ class TestExternalWorkflowGraph(object):
     assert_equal(workflow_data['workflow']['nodes'][7]['type'], 'decision-widget')
     assert_true(len(workflow_data['workflow']['nodes'][7]['children']) == 2)
 
-  def test_gen_workflow_data_from_xml_for_oozie_schema04(self):
-    self.wf.definition = """<workflow-app xmlns="uri:oozie:workflow:0.4" name="capture-output-wf">
-      <credentials>
-        <credential name="hive2" type="hive2">
-          <property>
-            <name>hive2.jdbc.url</name>
-            <value>jdbc:hive2://huetest-1.gce.cloudera.com:10000/default</value>
-          </property>
-          <property>
-            <name>hive2.server.principal</name>
-            <value>hive/huetest-1.gce.cloudera.com@GCE.CLOUDERA.COM</value>
-          </property>
-        </credential>
-      </credentials>
-
-        <start to="fork1"/>
+  def test_gen_workflow_data_from_xml_for_oozie_old_schemas(self):
 
-        <fork name="fork1">
-            <path start="capture-shell"/>
-            <path start="hive-node"/>
+    common_wf_definition = """<workflow-app name="My Workflow" xmlns="uri:oozie:workflow:%s">
+        <start to="fork-b429"/>
+        <kill name="Kill">
+            <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
+        </kill>
+        <action name="hive-ee32" cred="hive2">
+            <hive2 xmlns="uri:oozie:hive2-action:0.1">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <jdbc-url>jdbc:hive2://nightly-unsecure-1.gce.cloudera.com:10000/default</jdbc-url>
+                <script>${wf:appPath()}/hive-ee32.sql</script>
+            </hive2>
+            <ok to="join-508b"/>
+            <error to="Kill"/>
+        </action>
+        <action name="hive-97a4" cred="hcat">
+            <hive xmlns="uri:oozie:hive-action:0.2">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                  <job-xml>test.xml</job-xml>
+                <script>test.sql</script>
+            </hive>
+            <ok to="streaming-5fab"/>
+            <error to="Kill"/>
+        </action>
+        <fork name="fork-b429">
+            <path start="hive-97a4" />
+            <path start="pig-2bcf" />
         </fork>
-        <action name="capture-shell">
+        <join name="join-508b" to="spark-017b"/>
+        <action name="hive2-d643" cred="hive2">
+            <hive2 xmlns="uri:oozie:hive2-action:0.1">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <jdbc-url>jdbc:hive2://nightly-unsecure-1.gce.cloudera.com:10000/default</jdbc-url>
+                <script>test.sql</script>
+            </hive2>
+            <ok to="decision-aac9"/>
+            <error to="Kill"/>
+        </action>
+        <action name="impala-58ee">
             <shell xmlns="uri:oozie:shell-action:0.1">
                 <job-tracker>${jobTracker}</job-tracker>
                 <name-node>${nameNode}</name-node>
-                <exec>capture-shell.sh</exec>
-                <file>capture-shell.sh#capture-shell.sh</file>
-                <capture-output/>
+                <exec>impala-58ee.sh</exec>
+                <file>impala-58ee.sh#impala-58ee.sh</file>
+                <file>test.impala#test.impala</file>
             </shell>
-            <ok to="join1"/>
-            <error to="fail"/>
+            <ok to="join-508b"/>
+            <error to="Kill"/>
         </action>
-        <action name="hive-node" cred="hive2">
-            <hive2 xmlns="uri:oozie:hive2-action:0.1">
+        <decision name="decision-aac9">
+            <switch>
+                <case to="hive-ee32">
+                  ${ 1 gt 0 }
+                </case>
+                <case to="impala-58ee">
+                  ${ 1 gt 0 }
+                </case>
+                <default to="join-508b"/>
+            </switch>
+        </decision>
+        <action name="pig-2bcf">
+            <pig>
                 <job-tracker>${jobTracker}</job-tracker>
                 <name-node>${nameNode}</name-node>
-                <jdbc-url>jdbc:hive2://huetest-1.gce.cloudera.com:10000/default</jdbc-url>
-                <script>/user/cconner/chris1.sql</script>
-            </hive2>
-            <ok to="join1"/>
-            <error to="fail"/>
+                <script>test.pig</script>
+            </pig>
+            <ok to="hive2-d643"/>
+            <error to="Kill"/>
         </action>
-
-        <join name="join1" to="email1"/>
-
-        <action name="email1">
-            <email xmlns="uri:oozie:email-action:0.1">
-                <to>oozie@admin1.sec.cloudera.com</to>
-                <subject>capture output workflow</subject>
-                <body>yay</body>
-            </email>
-            <ok to="java-decision"/>
-            <error to="fail"/>
+        <action name="spark-d71c">
+            <spark xmlns="uri:oozie:spark-action:0.2">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <master>yarn</master>
+                <mode>client</mode>
+                <name>MySpark</name>
+                <jar>/user/admin/test.jar</jar>
+                <file>test.spark#test.spark</file>
+            </spark>
+            <ok to="mapreduce-3787"/>
+            <error to="Kill"/>
         </action>
-
-        <action name='java-decision'>
-            <java>
+        <action name="spark-017b">
+            <spark xmlns="uri:oozie:spark-action:0.2">
                 <job-tracker>${jobTracker}</job-tracker>
                 <name-node>${nameNode}</name-node>
-                <configuration>
-                    <property>
-                        <name>mapred.job.queue.name</name>
-                        <value>${queueName}</value>
-                    </property>
-                </configuration>
-                <main-class>com.test.CurrentTime</main-class>
+                <master>yarn</master>
+                <mode>client</mode>
+                <name>MySpark</name>
+                <jar>/user/admin/test.jar</jar>
+                <file>test.spark#test.spark</file>
+            </spark>
+            <ok to="fork-1576"/>
+            <error to="Kill"/>
+        </action>
+        <action name="sqoop-c419">
+            <sqoop xmlns="uri:oozie:sqoop-action:0.2">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <command>import  --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir hdfs://localhost:8020/user/foo -m 1</command>
+            </sqoop>
+            <ok to="join-ebde"/>
+            <error to="Kill"/>
+        </action>
+        <action name="mapreduce-3787">
+            <map-reduce>
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+            </map-reduce>
+            <ok to="join-508b"/>
+            <error to="Kill"/>
+        </action>
+        <action name="shell-1c31">
+            <shell xmlns="uri:oozie:shell-action:0.1">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <exec>ls</exec>
+                  <capture-output/>
+            </shell>
+            <ok to="join-ebde"/>
+            <error to="Kill"/>
+        </action>
+        <fork name="fork-1576">
+            <path start="sqoop-c419" />
+            <path start="shell-1c31" />
+        </fork>
+        <join name="join-ebde" to="End"/>
+        <action name="ssh-8ab6">
+            <ssh xmlns="uri:oozie:ssh-action:0.1">
+                <host>user@host.com</host>
+                <command>ls</command>
                 <capture-output/>
-            </java>
-            <ok to="java-decision1" />
-            <error to="fail" />
+            </ssh>
+            <ok to="spark-d71c"/>
+            <error to="Kill"/>
         </action>
-        <decision name="java-decision1">
-               <switch>
-               <case to="end">${(wf:actionData('java-decision')['key1'] == "true")}</case>
-               <default to="fail" />
-               </switch>
-        </decision>
-
-        <kill name="fail">
-            <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
-        </kill>
-        <end name="end"/>
+        <action name="email-d815">
+            <email xmlns="uri:oozie:email-action:0.2">
+                <to>test</to>
+                <subject>test</subject>
+                <body>test</body>
+                <content_type>text/plain</content_type>
+            </email>
+            <ok to="ssh-8ab6"/>
+            <error to="Kill"/>
+        </action>
+        <action name="streaming-5fab">
+            <map-reduce>
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                <streaming>
+                    <mapper>test</mapper>
+                    <reducer>test</reducer>
+                </streaming>
+            </map-reduce>
+            <ok to="distcp-daa7"/>
+            <error to="Kill"/>
+        </action>
+        <action name="distcp-daa7">
+            <distcp xmlns="uri:oozie:distcp-action:0.1">
+                <job-tracker>${jobTracker}</job-tracker>
+                <name-node>${nameNode}</name-node>
+                  <arg>test</arg>
+                  <arg>test</arg>
+            </distcp>
+            <ok to="email-d815"/>
+            <error to="Kill"/>
+        </action>
+        <end name="End"/>
     </workflow-app>
     """
 
-    workflow_data = Workflow.gen_workflow_data_from_xml(self.user, self.wf)
-
-    assert_true(len(workflow_data['layout'][0]['rows']) == 10)
-    assert_true(len(workflow_data['workflow']['nodes']) == 10)
-    assert_equal(workflow_data['layout'][0]['rows'][6]['widgets'][0]['widgetType'], 'decision-widget')
-    assert_equal(workflow_data['workflow']['nodes'][7]['type'], 'decision-widget')
-    assert_true(len(workflow_data['workflow']['nodes'][7]['children']) == 2)
-
+    self.wf.definition = common_wf_definition % 0.4
+    workflow_data_04 = Workflow.gen_workflow_data_from_xml(self.user, self.wf)
+
+    self.wf.definition = common_wf_definition % 0.3
+    workflow_data_03 = Workflow.gen_workflow_data_from_xml(self.user, self.wf)
+
+    self.wf.definition = common_wf_definition % 0.2
+    workflow_data_02 = Workflow.gen_workflow_data_from_xml(self.user, self.wf)
+
+    self.wf.definition = common_wf_definition % 0.1
+    workflow_data_01 = Workflow.gen_workflow_data_from_xml(self.user, self.wf)
+
+    assert_true(len(workflow_data_01['layout'][0]['rows']) ==
+                len(workflow_data_02['layout'][0]['rows']) ==
+                len(workflow_data_03['layout'][0]['rows']) ==
+                len(workflow_data_04['layout'][0]['rows']) ==
+                10)
+    assert_true(len(workflow_data_01['workflow']['nodes']) ==
+                len(workflow_data_02['workflow']['nodes']) ==
+                len(workflow_data_03['workflow']['nodes']) ==
+                len(workflow_data_04['workflow']['nodes']) ==
+                22)
+    assert_true(workflow_data_01['layout'][0]['rows'][5]['widgets'][0]['widgetType'] ==
+                workflow_data_02['layout'][0]['rows'][5]['widgets'][0]['widgetType'] ==
+                workflow_data_03['layout'][0]['rows'][5]['widgets'][0]['widgetType'] ==
+                workflow_data_04['layout'][0]['rows'][5]['widgets'][0]['widgetType'] ==
+                'fork-widget')
+    assert_true(workflow_data_01['workflow']['nodes'][7]['type'] ==
+                workflow_data_02['workflow']['nodes'][7]['type'] ==
+                workflow_data_03['workflow']['nodes'][7]['type'] ==
+                workflow_data_04['workflow']['nodes'][7]['type'] ==
+                'hive-widget')
+    assert_true(len(workflow_data_01['workflow']['nodes'][7]['children']) ==
+                len(workflow_data_02['workflow']['nodes'][7]['children']) ==
+                len(workflow_data_03['workflow']['nodes'][7]['children']) ==
+                len(workflow_data_04['workflow']['nodes'][7]['children']) ==
+                2)
 
   def test_gen_workflow_data_from_xml_for_spark_schema02(self):
     self.wf.definition = """<workflow-app name="My_Workflow" xmlns="uri:oozie:workflow:0.5">