/**
 * 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.
 */

package org.apache.falcon.resource;

import org.apache.falcon.entity.v0.EntityType;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.util.Map;

/**
 * Tests for Instance operations using Falcon Native Scheduler.
 */
@Test (enabled = false)
public class InstanceSchedulerManagerJerseyIT extends AbstractSchedulerManagerJerseyIT {


    private static final String END_TIME = "2012-04-21T00:00Z";
    private static final String HELLO_WORLD_WORKFLOW = "helloworldworkflow.xml";

    @BeforeClass
    public void setup() throws Exception {
        updateStartUpProps();
        super.setup();
    }

    @Test (enabled = false)
    public void testProcessInstanceExecution() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();
        String colo = overlay.get(COLO);
        String cluster = overlay.get(CLUSTER);

        submitCluster(colo, cluster, null);
        submitFeeds(overlay);
        context.prepare(HELLO_WORLD_WORKFLOW);
        submitProcess(PROCESS_TEMPLATE_NOLATE_DATA, overlay);

        String processName = overlay.get(PROCESS_NAME);
        scheduleProcess(processName, cluster, START_INSTANCE, 1);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.SUCCEEDED);

        InstancesResult.WorkflowStatus status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.SUCCEEDED);

    }

    @Test (enabled = false)
    public void testKillAndRerunInstances() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();

        setupProcessExecution(context, overlay, 1, PROCESS_TEMPLATE);

        String processName = overlay.get(PROCESS_NAME);
        String colo = overlay.get(COLO);

        waitForStatus(EntityType.PROCESS.name(), context.processName, START_INSTANCE,
                InstancesResult.WorkflowStatus.RUNNING);

        InstancesResult result = falconUnitClient.killInstances(EntityType.PROCESS.toString(),
                processName, START_INSTANCE, END_TIME, colo, null, null, null, null);
        assertStatus(result);

        InstancesResult.WorkflowStatus status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.KILLED);

        result = falconUnitClient.rerunInstances(EntityType.PROCESS.toString(),
                processName, START_INSTANCE, END_TIME, colo, null, null, null, null, true, null);
        assertStatus(result);

        waitForStatus(EntityType.PROCESS.name(), context.processName, START_INSTANCE,
                InstancesResult.WorkflowStatus.RUNNING);
        status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.RUNNING);


    }

    @Test (enabled = false)
    public void testSuspendResumeInstances() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();

        setupProcessExecution(context, overlay, 1, PROCESS_TEMPLATE_NOLATE_DATA);

        String processName = overlay.get(PROCESS_NAME);
        String colo = overlay.get(COLO);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.RUNNING);

        falconUnitClient.suspendInstances(EntityType.PROCESS.toString(), processName, START_INSTANCE,
                END_TIME, colo, null, null, null, null);

        InstancesResult.WorkflowStatus status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.SUSPENDED);

        falconUnitClient.resumeInstances(EntityType.PROCESS.toString(), processName, START_INSTANCE,
                END_TIME, colo, null, null, null, null);
        status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.READY);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.RUNNING);
    }

    @Test (enabled = false)
    public void testListInstances() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();

        setupProcessExecution(context, overlay, 4, PROCESS_TEMPLATE);

        String processName = overlay.get(PROCESS_NAME);
        String colo = overlay.get(COLO);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.RUNNING);

        InstancesResult result = falconUnitClient.getStatusOfInstances(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, "2012-04-23T00:00Z", colo, null, null, null, null, 0, 3, null, null);
        Assert.assertEquals(result.getInstances().length, 3);
        // Ensure the latest instance is on top and oldest at the bottom
        Assert.assertEquals(result.getInstances()[0].getInstance(), "2012-04-22T00:00Z");
        Assert.assertEquals(result.getInstances()[2].getInstance(), START_INSTANCE);
    }

    @Test (enabled = false)
    public void testInstanceSummary() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();

        setupProcessExecution(context, overlay, 3, PROCESS_TEMPLATE);

        String processName = overlay.get(PROCESS_NAME);
        String colo = overlay.get(COLO);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.RUNNING);

        InstancesSummaryResult result = falconUnitClient.getSummaryOfInstances(EntityType.PROCESS.toString(),
                processName, START_INSTANCE, "2012-04-23T00:00Z", colo, null, null, null, null, null);

        Assert.assertEquals(result.getInstancesSummary().length, 1);
        Assert.assertEquals(result.getInstancesSummary()[0].getCluster(), overlay.get(CLUSTER));
        Assert.assertEquals(result.getInstancesSummary()[0].getSummaryMap().size(), 2);
        // Parallelism is 2
        Assert.assertEquals(result.getInstancesSummary()[0].getSummaryMap().get("RUNNING").longValue(), 2L);
        Assert.assertEquals(result.getInstancesSummary()[0].getSummaryMap().get("READY").longValue(), 1L);
    }

    @Test (enabled = false)
    public void testProcessWithInputs() throws Exception {
        UnitTestContext context = new UnitTestContext();
        Map<String, String> overlay = context.getUniqueOverlay();
        String colo = overlay.get(COLO);
        String cluster = overlay.get(CLUSTER);

        submitCluster(colo, cluster, null);
        submitFeeds(overlay);
        context.prepare(HELLO_WORLD_WORKFLOW);

        submitProcess(PROCESS_TEMPLATE_NOLATE_DATA, overlay);

        String processName = overlay.get(PROCESS_NAME);
        scheduleProcess(processName, cluster, START_INSTANCE, 1);

        waitForStatus(EntityType.PROCESS.toString(), processName,
                START_INSTANCE, InstancesResult.WorkflowStatus.SUCCEEDED);

        InstancesResult.WorkflowStatus status = getClient().getInstanceStatus(EntityType.PROCESS.name(),
                processName, START_INSTANCE);
        Assert.assertEquals(status, InstancesResult.WorkflowStatus.SUCCEEDED);
    }
}
