<!--
  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:1.0" name="test-wf">
    <global>
        <launcher>
            <memory.mb>1024</memory.mb>
            <vcores>2</vcores>
            <java-opts>dummyJavaOpts</java-opts>
            <env>dummyEnv</env>
            <queue>dummyQueue</queue>
            <sharelib>a,b,c</sharelib>
            <view-acl>oozieview</view-acl>
            <modify-acl>ooziemodify</modify-acl>
        </launcher>
    </global>

    <start to="action1"/>

    <action name="action1">
        <fs>
            <mkdir path='/tmp'/>
        </fs>
        <ok to="end"/>
        <error to="kill"/>
    </action>

    <kill name="kill">
        <message>kill</message>
    </kill>

    <end name="end"/>
</workflow-app>
