Java tutorial
/* * Copyright 2015 Collective, Inc. * * Licensed 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 com.collective.celos; import com.collective.celos.database.FileSystemStateDatabase; import com.collective.celos.server.CelosServer; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.commons.io.FileUtils; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.HttpHostConnectException; import org.apache.http.impl.client.DefaultHttpClient; import org.junit.*; import org.junit.Assert; import org.junit.Test; import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; /** * Created by akonopko on 22.12.14. */ public class CelosClientServerTest { public static final String WORKFLOWS_DIR = "workflows"; public static final String DEFAULTS_DIR = "defaults"; public static final String DB_DIR = "db"; public static final int SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW = SchedulerConfiguration.SLIDING_WINDOW_DAYS * 24; @Rule public TemporaryFolder folder = new TemporaryFolder(); private File workflowsDir; private File slotDbDir; private CelosServer celosServer; private CelosClient celosClient; @Before public void setup() throws Exception { File tmpDir = folder.newFolder(); this.workflowsDir = new File(tmpDir, WORKFLOWS_DIR); File defaultsDir = new File(tmpDir, DEFAULTS_DIR); this.slotDbDir = new File(tmpDir, DB_DIR); this.workflowsDir.mkdirs(); defaultsDir.mkdirs(); this.slotDbDir.mkdirs(); this.celosServer = new CelosServer(); FileSystemStateDatabase db = new FileSystemStateDatabase(slotDbDir); int port = celosServer.startServer(ImmutableMap.<String, String>of(), workflowsDir, defaultsDir, db); this.celosClient = new CelosClient(URI.create("http://localhost:" + port)); } @After public void tearDown() throws Exception { celosServer.stopServer(); } @Test public void testCheckStatus() throws Exception { celosClient.checkStatus(); } @Test public void testGetWorkflowListEmpty() throws Exception { Set<WorkflowID> workflowIDs = celosClient.getWorkflowList(); Assert.assertTrue(workflowIDs.isEmpty()); } @Test public void testGetWorkflowListEmptyBeforeClearCache() throws Exception { Set<WorkflowID> workflowIDs = celosClient.getWorkflowList(); Assert.assertTrue(workflowIDs.isEmpty()); File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); workflowIDs = celosClient.getWorkflowList(); Assert.assertTrue(workflowIDs.isEmpty()); celosClient.clearCache(); workflowIDs = celosClient.getWorkflowList(); Assert.assertEquals(Sets.newHashSet(workflowIDs), Sets.newHashSet(new WorkflowID("workflow-1"), new WorkflowID("workflow-2"), new WorkflowID("workflow-Itrntinliztin"), new WorkflowID("workflow-4"))); } @Test(expected = HttpHostConnectException.class) public void testServerStops() throws Exception { celosClient.getWorkflowList(); celosServer.stopServer(); celosClient.getWorkflowList(); } @Test(expected = IOException.class) public void testGetWorkflowStatusFailsNoId() throws Exception { celosClient.getWorkflowStatus(new WorkflowID("noid")); } @Test(expected = IOException.class) public void testGetWorkflowStatusFailsNoIdWithSomeData() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.getWorkflowStatus(new WorkflowID("noid")); } @Test public void testGetWorkflowStatusWaiting() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING); Assert.assertEquals(slotState.getExternalID(), null); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusCorrectOrder() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); for (int i = 0; i < slotStates.size() - 1; i++) { SlotState slotState = slotStates.get(i); SlotState nextSlotState = slotStates.get(i + 1); Assert.assertTrue(!slotState.getScheduledTime().getDateTime() .isBefore(nextSlotState.getScheduledTime().getDateTime())); } } @Test public void testGetWorkflowStatusTransitionToReady() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY); Assert.assertEquals(slotState.getExternalID(), null); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusNoInfo() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); WorkflowStatus status = celosClient.getWorkflowStatus(new WorkflowID("workflow-1")); Assert.assertNull(status.getInfo().getUrl()); Assert.assertTrue(status.getInfo().getContacts().isEmpty()); } @Test public void testGetWorkflowStatusWithInfo() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); WorkflowStatus status = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")); Assert.assertEquals(new URL("http://collective.com"), status.getInfo().getUrl()); Assert.assertEquals(1, status.getInfo().getContacts().size()); Assert.assertEquals("John Doe", status.getInfo().getContacts().get(0).getName()); Assert.assertEquals(URI.create("john.doe@collective.com"), status.getInfo().getContacts().get(0).getEmail()); } @Test public void testGetWorkflowStatusTransitionToRunningFailsWrongOozieService() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-1")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY); Assert.assertNull(slotState.getExternalID()); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusTransitionToRunning() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); List<SlotState> slotStatesOther = slotStates.subList(0, slotStates.size() - 1); SlotState slotStateLst = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.RUNNING); Assert.assertNotNull(slotStateLst.getExternalID()); Assert.assertEquals(slotStateLst.getRetryCount(), 0); for (SlotState slotState : slotStatesOther) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY); Assert.assertNull(slotState.getExternalID()); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusTransitionToSuccess() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); SlotState slotStateLst = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.SUCCESS); Assert.assertNotNull(slotStateLst.getExternalID()); Assert.assertEquals(slotStateLst.getRetryCount(), 0); slotStates = slotStates.subList(0, slotStates.size() - 1); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY); Assert.assertNull(slotState.getExternalID()); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusTransitionToSuccessRunning() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-2")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); SlotState slotStateLst = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.SUCCESS); Assert.assertNotNull(slotStateLst.getExternalID()); Assert.assertEquals(slotStateLst.getRetryCount(), 0); SlotState slotStatePreLst = slotStates.get(slotStates.size() - 2); Assert.assertEquals(slotStatePreLst.getStatus(), SlotState.Status.RUNNING); Assert.assertNotNull(slotStatePreLst.getExternalID()); Assert.assertEquals(slotStatePreLst.getRetryCount(), 0); slotStates = slotStates.subList(0, slotStates.size() - 2); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.READY); Assert.assertNull(slotState.getExternalID()); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testGetWorkflowStatusTransitionToSuccessFailure() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); List<SlotState> slotStates = celosClient .getWorkflowStatus(new WorkflowID("workflow-Itrntinliztin")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); SlotState slotStateFst = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateFst.getStatus(), SlotState.Status.FAILURE); Assert.assertNotNull(slotStateFst.getExternalID()); Assert.assertEquals(slotStateFst.getRetryCount(), 0); } @Test public void testGetWorkflowStatusInPast() throws Exception { ScheduledTime timeInPast = new ScheduledTime("2000-12-01T00:00Z"); File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); Assert.assertTrue(slotStates.get(slotStates.size() - 1).getScheduledTime().getDateTime() .isAfter(timeInPast.getDateTime().plusYears(1))); slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), timeInPast).getSlotStates(); Assert.assertEquals(slotStates.get(slotStates.size() - 1).getScheduledTime(), timeInPast.minusDays(SchedulerConfiguration.SLIDING_WINDOW_DAYS)); Assert.assertEquals(slotStates.get(0).getScheduledTime(), timeInPast.minusHours(1)); slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), timeInPast.plusSeconds(1)) .getSlotStates(); Assert.assertEquals(slotStates.get(0).getScheduledTime(), timeInPast); } @Test public void testSchedulerIteratorPast() throws Exception { ScheduledTime timeInPast = new ScheduledTime("2000-12-01T00:00Z"); File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); List<SlotState> slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4")).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); celosClient.iterateScheduler(timeInPast); ScheduledTime inclusivePeriod = timeInPast.plusSeconds(1); slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates(); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING); Assert.assertEquals(slotState.getExternalID(), null); Assert.assertEquals(slotState.getRetryCount(), 0); } celosClient.iterateScheduler(timeInPast); slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates(); for (SlotState slotState : slotStates) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING); Assert.assertEquals(slotState.getExternalID(), null); Assert.assertEquals(slotState.getRetryCount(), 0); } celosClient.iterateScheduler(inclusivePeriod); slotStates = celosClient.getWorkflowStatus(new WorkflowID("workflow-4"), inclusivePeriod).getSlotStates(); Assert.assertEquals(slotStates.get(0).getStatus(), SlotState.Status.READY); for (SlotState slotState : slotStates.subList(1, slotStates.size())) { Assert.assertEquals(slotState.getStatus(), SlotState.Status.WAITING); Assert.assertEquals(slotState.getExternalID(), null); Assert.assertEquals(slotState.getRetryCount(), 0); } } @Test public void testServerRespondsToScheduler() throws Exception { celosClient.iterateScheduler(); } @Test public void testServerRespondsToSchedulerPOST() throws IOException { HttpPost request = new HttpPost(celosClient.getAddress() + "/scheduler"); HttpResponse response = new DefaultHttpClient().execute(request); Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); } @Test public void testSchedulerNoRespondToGet() throws IOException { HttpGet request = new HttpGet(celosClient.getAddress() + "/scheduler"); HttpResponse response = new DefaultHttpClient().execute(request); Assert.assertEquals(response.getStatusLine().getStatusCode(), 405); Assert.assertEquals(response.getStatusLine().getReasonPhrase(), "HTTP method GET is not supported by this URL"); } @Test public void testGetWorkflowFailsWithNoIdParameter() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); HttpGet request = new HttpGet(celosClient.getAddress() + "/workflow"); HttpResponse response = new DefaultHttpClient().execute(request); Assert.assertEquals(response.getStatusLine().getStatusCode(), 400); Assert.assertEquals(response.getStatusLine().getReasonPhrase(), "id parameter missing."); } @Test(expected = IOException.class) public void testCantGetStatusFromDBOnly() throws Exception { File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), new ScheduledTime("2013-12-02T20:00Z")); } @Test public void testCorrectWorkflowStatesFromDbWf1() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); ScheduledTime timeStart = new ScheduledTime("2013-11-25T20:00:00.000Z"); ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z"); ScheduledTime time = waitingSlotsTimeEnd; List<SlotState> expectedSlotStates = Lists.newArrayList(); SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.RUNNING, "foo-bar", 0); time = time.minusHours(1); SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.READY, null, 14); time = time.minusHours(1); expectedSlotStates.add(slotStateRunning); expectedSlotStates.add(slotStateReady); while (!time.getDateTime().isBefore(timeStart.getDateTime())) { SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.WAITING); expectedSlotStates.add(slotState); time = time.minusHours(1); } List<SlotState> resultSlotStates = celosClient .getWorkflowStatus(new WorkflowID("workflow-1"), new ScheduledTime("2013-12-02T20:00Z")) .getSlotStates(); Assert.assertEquals(expectedSlotStates, resultSlotStates); } @Test public void testCorrectWorkflowStatesFromDbWf1Only10Hours() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); ScheduledTime timeStart = new ScheduledTime("2013-12-02T10:00:00.000Z"); ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z"); ScheduledTime time = waitingSlotsTimeEnd; List<SlotState> expectedSlotStates = Lists.newArrayList(); SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.RUNNING, "foo-bar", 0); time = time.minusHours(1); SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.READY, null, 14); time = time.minusHours(1); expectedSlotStates.add(slotStateRunning); expectedSlotStates.add(slotStateReady); while (!time.getDateTime().isBefore(timeStart.getDateTime())) { SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-1"), time), SlotState.Status.WAITING); expectedSlotStates.add(slotState); time = time.minusHours(1); } ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-02T20:00Z"); ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z"); List<SlotState> resultSlotStates = celosClient .getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd).getSlotStates(); Assert.assertEquals(expectedSlotStates, resultSlotStates); } @Test public void testWorksfor5Days() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-07T20:00Z"); ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z"); celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd); } @Test(expected = IOException.class) public void testNotWorksfor25Days() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-27T20:00Z"); ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T10:00Z"); celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd); } @Test public void testCorrectWorkflowStatesFromDbWf1StartTimeIsAfterEndTime() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); ScheduledTime reqTimeEnd = new ScheduledTime("2013-12-02T20:00Z"); ScheduledTime reqTimeStart = new ScheduledTime("2013-12-02T21:00Z"); WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(new WorkflowID("workflow-1"), reqTimeStart, reqTimeEnd); Assert.assertEquals(workflowStatus.getSlotStates().size(), 0); } @Test public void testLeavesClientOKAfterException() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); try { celosClient.getSlotState(new WorkflowID("workflow-1"), ScheduledTime.now()); } catch (Exception e) { } ScheduledTime existingSlotTime = new ScheduledTime("2013-12-02T19:00:00.000Z"); celosClient.getSlotState(new WorkflowID("workflow-1"), existingSlotTime); } @Test public void testCorrectWorkflowStatesFromDbWf2() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); ScheduledTime timeStart = new ScheduledTime("2013-11-25T20:00:00.000Z"); ScheduledTime waitingSlotsTimeEnd = new ScheduledTime("2013-12-02T19:00:00.000Z"); ScheduledTime time = waitingSlotsTimeEnd; List<SlotState> expectedSlotStates = Lists.newArrayList(); SlotState slotStateRunning = new SlotState(new SlotID(new WorkflowID("workflow-2"), time), SlotState.Status.RUNNING, "quux", 2); time = time.minusHours(1); SlotState slotStateReady = new SlotState(new SlotID(new WorkflowID("workflow-2"), time), SlotState.Status.READY); time = time.minusHours(1); expectedSlotStates.add(slotStateRunning); expectedSlotStates.add(slotStateReady); while (!time.getDateTime().isBefore(timeStart.getDateTime())) { SlotState slotState = new SlotState(new SlotID(new WorkflowID("workflow-2"), time), SlotState.Status.WAITING); expectedSlotStates.add(slotState); time = time.minusHours(1); } List<SlotState> resultSlotStates = celosClient .getWorkflowStatus(new WorkflowID("workflow-2"), new ScheduledTime("2013-12-02T20:00Z")) .getSlotStates(); Assert.assertEquals(expectedSlotStates, resultSlotStates); } @Test public void testGetSlotState() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); WorkflowID workflowID = new WorkflowID("workflow-1"); ScheduledTime scheduledTime1 = new ScheduledTime("2013-12-02T19:00Z"); ScheduledTime scheduledTime2 = new ScheduledTime("2013-12-02T18:00Z"); SlotState slotState1 = celosClient.getSlotState(workflowID, scheduledTime1); SlotState slotState2 = celosClient.getSlotState(workflowID, scheduledTime2); SlotState expectedSlotState1 = new SlotState(new SlotID(workflowID, scheduledTime1), SlotState.Status.RUNNING, "foo-bar", 0); SlotState expectedSlotState2 = new SlotState(new SlotID(workflowID, scheduledTime2), SlotState.Status.READY, null, 14); Assert.assertEquals(expectedSlotState1, slotState1); Assert.assertEquals(expectedSlotState2, slotState2); } @Test(expected = IOException.class) public void testGetSlotStateNotFound() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); WorkflowID workflowID = new WorkflowID("workflow-1"); ScheduledTime scheduledTime1 = new ScheduledTime("2000-12-02T19:00Z"); celosClient.getSlotState(workflowID, scheduledTime1); } @Test(expected = IOException.class) public void testGetSlotStateNotFoundNotExistingWF() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); File src2 = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/server/slot-db-1").toURI()); FileUtils.copyDirectory(src2, slotDbDir); WorkflowID workflowID = new WorkflowID("workflow-doesnt-exist"); ScheduledTime scheduledTime1 = new ScheduledTime("2000-12-02T19:00Z"); celosClient.getSlotState(workflowID, scheduledTime1); } @Test public void testRerunSlot() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); WorkflowID workflowID = new WorkflowID("workflow-Itrntinliztin"); List<SlotState> slotStates = celosClient.getWorkflowStatus(workflowID).getSlotStates(); Assert.assertEquals(slotStates.size(), SLOTS_IN_CELOS_SERVER_SLIDING_WINDOW); SlotState slotStateLst = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateLst.getStatus(), SlotState.Status.FAILURE); ScheduledTime scheduledTime = slotStateLst.getScheduledTime(); celosClient.rerunSlot(workflowID, scheduledTime); SlotState slotStateUpdated = celosClient.getSlotState(workflowID, scheduledTime); Assert.assertEquals(slotStateUpdated.getStatus(), SlotState.Status.WAITING); } @Test public void testRerunSlotWorksNoError() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); WorkflowID workflowID = new WorkflowID("workflow-2"); celosClient.rerunSlot(workflowID, new ScheduledTime("2013-11-20T12:00Z")); } @Test(expected = IOException.class) public void testRerunSlotFailsNoWorkflow() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); WorkflowID workflowID = new WorkflowID("unknown-workflow"); celosClient.rerunSlot(workflowID, ScheduledTime.now()); } @Test(expected = IOException.class) public void testRerunSlotFailsNoSlot() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); WorkflowID workflowID = new WorkflowID("workflow-2"); celosClient.rerunSlot(workflowID, new ScheduledTime("2013-11-20T12:34Z")); } @Test public void testPauseWorkflow() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); WorkflowID workflowID = new WorkflowID("workflow-2"); WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID); List<SlotState> slotStates = workflowStatus.getSlotStates(); SlotState slotStateLast = slotStates.get(slotStates.size() - 1); Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.WAITING); Assert.assertFalse(workflowStatus.isPaused()); celosClient.setWorkflowPaused(workflowID, true); celosClient.iterateScheduler(); celosClient.iterateScheduler(); WorkflowStatus workflowStatus2 = celosClient.getWorkflowStatus(workflowID); List<SlotState> slotStates2 = workflowStatus2.getSlotStates(); SlotState slotStateLast2 = workflowStatus2.getSlotStates().get(slotStates2.size() - 1); Assert.assertEquals(slotStateLast2.getStatus(), SlotState.Status.WAITING); Assert.assertTrue(workflowStatus2.isPaused()); celosClient.setWorkflowPaused(workflowID, false); celosClient.iterateScheduler(); celosClient.iterateScheduler(); WorkflowStatus workflowStatus3 = celosClient.getWorkflowStatus(workflowID); List<SlotState> slotStates3 = workflowStatus3.getSlotStates(); SlotState slotStateLast3 = workflowStatus3.getSlotStates().get(slotStates3.size() - 1); Assert.assertEquals(slotStateLast3.getStatus(), SlotState.Status.RUNNING); Assert.assertFalse(workflowStatus3.isPaused()); } @Test public void testKill() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); ScheduledTime endTime = ScheduledTime.now(); WorkflowID workflowID = new WorkflowID("workflow-2"); WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID, endTime); List<SlotState> slotStates = workflowStatus.getSlotStates(); SlotState slotStateLast = workflowStatus.getSlotStates().get(slotStates.size() - 1); Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.WAITING); celosClient.kill(workflowID, slotStateLast.getScheduledTime()); WorkflowStatus workflowStatus2 = celosClient.getWorkflowStatus(workflowID, endTime); List<SlotState> slotStates2 = workflowStatus2.getSlotStates(); SlotState slotStateLast2 = workflowStatus2.getSlotStates().get(slotStates2.size() - 1); Assert.assertEquals(slotStateLast2.getStatus(), SlotState.Status.KILLED); celosClient.rerunSlot(workflowID, slotStateLast.getScheduledTime()); celosClient.iterateScheduler(); celosClient.iterateScheduler(); WorkflowStatus workflowStatus3 = celosClient.getWorkflowStatus(workflowID, endTime); List<SlotState> slotStates3 = workflowStatus3.getSlotStates(); SlotState slotStateLast3 = workflowStatus3.getSlotStates().get(slotStates3.size() - 1); Assert.assertEquals(slotStateLast3.getStatus(), SlotState.Status.RUNNING); celosClient.kill(workflowID, slotStateLast3.getScheduledTime()); WorkflowStatus workflowStatus4 = celosClient.getWorkflowStatus(workflowID, endTime); List<SlotState> slotStates4 = workflowStatus4.getSlotStates(); SlotState slotStateLast4 = workflowStatus4.getSlotStates().get(slotStates4.size() - 1); Assert.assertEquals(slotStateLast4.getStatus(), SlotState.Status.KILLED); } @Test(expected = IOException.class) public void testDoesntKillSuccess() throws Exception { File src = new File(Thread.currentThread().getContextClassLoader() .getResource("com/collective/celos/client/wf-list").toURI()); FileUtils.copyDirectory(src, workflowsDir); ScheduledTime endTime = ScheduledTime.now(); WorkflowID workflowID = new WorkflowID("workflow-2"); celosClient.iterateScheduler(); celosClient.iterateScheduler(); celosClient.iterateScheduler(); WorkflowStatus workflowStatus = celosClient.getWorkflowStatus(workflowID, endTime); List<SlotState> slotStates = workflowStatus.getSlotStates(); SlotState slotStateLast = workflowStatus.getSlotStates().get(slotStates.size() - 1); Assert.assertEquals(slotStateLast.getStatus(), SlotState.Status.SUCCESS); celosClient.kill(workflowID, slotStateLast.getScheduledTime()); } @Test() public void testRegisters() throws Exception { BucketID bucket1 = new BucketID("foo-bucket-Itrntinliztin"); BucketID bucket2 = new BucketID("another-bucket-Itrntinliztin"); RegisterKey key1 = new RegisterKey("bar-key-Itrntinliztin"); RegisterKey key2 = new RegisterKey("quux-key-Itrntinliztin"); RegisterKey key3 = new RegisterKey("quux2-key-Itrntinliztin"); Assert.assertNull(celosClient.getRegister(bucket1, key1)); Assert.assertNull(celosClient.getRegister(bucket2, key2)); ObjectNode value1 = Util.MAPPER.createObjectNode(); value1.put("foo", "Itrntinliztin"); ObjectNode value2 = Util.MAPPER.createObjectNode(); value2.put("bar", "Itrntinliztin"); celosClient.putRegister(bucket1, key1, value1); Assert.assertEquals(value1, celosClient.getRegister(bucket1, key1)); Assert.assertNull(celosClient.getRegister(bucket2, key2)); celosClient.putRegister(bucket2, key2, value2); Assert.assertEquals(value1, celosClient.getRegister(bucket1, key1)); Assert.assertEquals(value2, celosClient.getRegister(bucket2, key2)); celosClient.deleteRegister(bucket1, key1); Assert.assertNull(celosClient.getRegister(bucket1, key1)); Assert.assertEquals(value2, celosClient.getRegister(bucket2, key2)); celosClient.deleteRegister(bucket2, key2); Assert.assertNull(celosClient.getRegister(bucket1, key1)); Assert.assertNull(celosClient.getRegister(bucket2, key2)); celosClient.putRegister(bucket1, key1, value1); celosClient.putRegister(bucket1, key2, value2); celosClient.putRegister(bucket1, key3, value1); celosClient.deleteRegistersWithPrefix(bucket1, "quux"); Assert.assertEquals(Arrays.asList(key1), celosClient.getRegisterKeys(bucket1)); } @Test() public void testRegisterKeys() throws Exception { BucketID bucket1 = new BucketID("foo-bucket-Itrntinliztin"); BucketID bucket2 = new BucketID("another-bucket-Itrntinliztin"); RegisterKey key1 = new RegisterKey("bar-key-Itrntinliztin"); RegisterKey key2 = new RegisterKey("quux-key-Itrntinliztin"); RegisterKey key3 = new RegisterKey("quux2-key-Itrntinliztin"); String key1Prefix = "bar"; String key23Prefix = "quux"; String prefixDoesntExist = "zxc"; ObjectNode value1 = Util.MAPPER.createObjectNode(); value1.put("foo", "Itrntinliztin"); ObjectNode value3 = Util.MAPPER.createObjectNode(); value3.put("bar", "Itrntinliztin"); ObjectNode value2 = Util.MAPPER.createObjectNode(); value2.put("bar", "Internatiolization"); celosClient.putRegister(bucket1, key1, value1); celosClient.putRegister(bucket1, key2, value2); celosClient.putRegister(bucket1, key3, value3); celosClient.putRegister(bucket2, key1, value1); celosClient.putRegister(bucket2, key2, value2); Assert.assertEquals(Lists.newArrayList(key1, key2, key3), celosClient.getRegisterKeys(bucket1)); Assert.assertEquals(Lists.newArrayList(key1, key2), celosClient.getRegisterKeys(bucket2)); Assert.assertEquals(Lists.newArrayList(key2, key3), celosClient.getRegisterKeys(bucket1, key23Prefix)); Assert.assertEquals(Lists.newArrayList(key1), celosClient.getRegisterKeys(bucket1, key1Prefix)); Assert.assertEquals(Lists.newArrayList(key2), celosClient.getRegisterKeys(bucket2, key23Prefix)); Assert.assertEquals(Lists.newArrayList(key1), celosClient.getRegisterKeys(bucket2, key1Prefix)); Assert.assertEquals(Collections.emptyList(), celosClient.getRegisterKeys(bucket1, prefixDoesntExist)); Assert.assertEquals(Collections.emptyList(), celosClient.getRegisterKeys(bucket2, prefixDoesntExist)); } @Test public void testRegisterDeleteFailsNoKeyOrPrefix() throws IOException { HttpDelete request = new HttpDelete(celosClient.getAddress() + "/register"); HttpResponse response = new DefaultHttpClient().execute(request); Assert.assertEquals(response.getStatusLine().getStatusCode(), 400); } }