<!-- 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. -->

<coordinator-app xmlns='uri:oozie:coordinator:0.2' name='NAME'
    frequency="1" start='2009-08-20T01:00Z' end='2009-10-10T23:59Z'
    timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
    <controls>
        <timeout>10</timeout>
        <concurrency>2</concurrency>
        <execution>LIFO</execution>
    </controls>
    <input-events>
        <data-in name="input" dataset="logs">
            <dataset name='logs' frequency='1' initial-instance='2009-06-06T00:00Z'
                timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
                <uri-template>hdfs:///tmp/workflows/${YEAR}/${MONTH}/${DAY};region=us
                </uri-template>
            </dataset>
            <start-instance>${coord:endOfMonths(-1)}
            </start-instance>
            <end-instance>${coord:current(0)}</end-instance>
        </data-in>
        <data-in name="input" dataset="test">
            <dataset name='test' frequency='1' initial-instance='2009-06-06T00:00Z'
                timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
                <uri-template>hdfs:///tmp/workflows/${YEAR}/${MONTH}/${DAY};region=us
                </uri-template>
            </dataset>
            <start-instance>${startInstance}</start-instance>
            <end-instance>${endInstance}</end-instance>
        </data-in>
    </input-events>
    <action>
        <workflow>
            <app-path>hdfs:///tmp/workflows/</app-path>
            <configuration>
            </configuration>
        </workflow>
    </action>
</coordinator-app>