<!--
  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.
-->
<workflow-app xmlns="uri:oozie:workflow:0.1" name="test-wf">

    <start to="a"/>

    <action name="a">
        <test xmlns="uri:test">
            <signal-value>${wf:conf('signal-value')}</signal-value>
            <external-status>${wf:conf('external-status')}</external-status>
            <error>${wf:conf('error')}</error>
            <avoid-set-execution-data>${wf:conf('avoid-set-execution-data')}</avoid-set-execution-data>
            <avoid-set-end-data>${wf:conf('avoid-set-end-data')}</avoid-set-end-data>
            <running-mode>${wf:conf('running-mode')}</running-mode>
        </test>
        <ok to="end"/>
        <error to="kill"/>
    </action>

    <kill name="kill">
        <message>[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>

    <end name="end"/>

</workflow-app>
