/* * * Copyright 2015 Netflix, 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.netflix.genie.client; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.fge.jsonpatch.JsonPatch; import com.google.common.collect.Lists; import com.netflix.genie.common.dto.Application; import com.netflix.genie.common.dto.ApplicationStatus; import com.netflix.genie.common.dto.Command; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; /** * Integration Tests for Application Client. * * @author amsharma */ public class ApplicationClientIntegrationTests extends GenieClientsIntegrationTestsBase { private CommandClient commandClient; private ApplicationClient applicationClient; /** * Setup for tests. * * @throws Exception If there is an error. */ @Before public void setup() throws Exception { commandClient = new CommandClient(getBaseUrl(), null, null); applicationClient = new ApplicationClient(getBaseUrl(), null, null); } /** * Delete all applications and applications between tests. * * @throws Exception If there is any problem. */ @After public void cleanUp() throws Exception { commandClient.deleteAllCommands(); applicationClient.deleteAllApplications(); } /** * Integration test to get all applications from Genie. * * @throws Exception If there is any problem. */ @Test public void testCanCreateAndGetApplication() throws Exception { final String id = UUID.randomUUID().toString(); final Application application = constructApplicationDTO(id); final String applicationId = applicationClient.createApplication(application); Assert.assertEquals(applicationId, id); // Make sure Genie Not Found Exception is not thrown for this call. final Application cmd = applicationClient.getApplication(id); // Make sure the object returned is exactly what was sent to be created Assert.assertEquals(application.getId(), cmd.getId()); Assert.assertEquals(application.getName(), cmd.getName()); Assert.assertEquals(application.getDescription(), cmd.getDescription()); Assert.assertEquals(application.getConfigs(), cmd.getConfigs()); Assert.assertEquals(application.getSetupFile(), cmd.getSetupFile()); Assert.assertEquals(cmd.getTags().contains("foo"), true); Assert.assertEquals(cmd.getTags().contains("bar"), true); Assert.assertEquals(application.getStatus(), cmd.getStatus()); } /** * Test getting the applications using the various query parameters. * * @throws Exception If there is any problem. */ @Test public void testGetApplicationsUsingParams() throws Exception { final String application1Id = UUID.randomUUID().toString(); final String application2Id = UUID.randomUUID().toString(); final Set<String> application1Tags = new HashSet<>(); application1Tags.add("foo"); application1Tags.add("pi"); final Set<String> application2Tags = new HashSet<>(); application2Tags.add("bar"); application2Tags.add("pi"); final Application application1 = new Application.Builder( "application1name", "application1user", "1.0", ApplicationStatus.ACTIVE ) .withId(application1Id) .withTags(application1Tags) .build(); final Application application2 = new Application.Builder( "application2name", "application2user", "2.0", ApplicationStatus.INACTIVE ) .withId(application2Id) .withTags(application2Tags) .build(); applicationClient.createApplication(application1); applicationClient.createApplication(application2); // Test get by tags List<Application> applicationList = applicationClient.getApplications( null, null, null, Lists.newArrayList("foo"), null ); Assert.assertEquals(1, applicationList.size()); Assert.assertEquals(application1Id, applicationList.get(0).getId().orElseThrow(IllegalArgumentException::new)); applicationList = applicationClient.getApplications( null, null, null, Lists.newArrayList("pi"), null ); Assert.assertEquals(2, applicationList.size()); Assert.assertEquals(application2Id, applicationList.get(0).getId().orElseThrow(IllegalArgumentException::new)); Assert.assertEquals(application1Id, applicationList.get(1).getId().orElseThrow(IllegalArgumentException::new)); // Test get by name applicationList = applicationClient.getApplications( "application1name", null, null, null, null ); Assert.assertEquals(1, applicationList.size()); // Test get by status applicationList = applicationClient.getApplications( null, null, Lists.newArrayList(ApplicationStatus.ACTIVE.toString()), null, null ); Assert.assertEquals(1, applicationList.size()); applicationList = applicationClient.getApplications( null, null, Arrays.asList(ApplicationStatus.ACTIVE.toString(), ApplicationStatus.INACTIVE.toString()), null, null ); Assert.assertEquals(2, applicationList.size()); } /** * Test to confirm getting an exception for non existent application. * * @throws Exception If there is a problem. */ @Test(expected = IOException.class) public void testApplicationNotExist() throws Exception { applicationClient.getApplication("foo"); } /** * Test get all applications. * * @throws Exception If there is problem. */ @Test public void testGetAllAndDeleteAllApplications() throws Exception { final List<Application> initialApplicationList = applicationClient.getApplications(); Assert.assertEquals(initialApplicationList.size(), 0); final Application application1 = constructApplicationDTO(null); final Application application2 = constructApplicationDTO(null); applicationClient.createApplication(application1); applicationClient.createApplication(application2); final List<Application> finalApplicationList = applicationClient.getApplications(); Assert.assertEquals(finalApplicationList.size(), 2); Assert.assertEquals(application1.getId(), finalApplicationList.get(1).getId()); Assert.assertEquals(application2.getId(), finalApplicationList.get(0).getId()); applicationClient.deleteAllApplications(); Assert.assertEquals(applicationClient.getApplications().size(), 0); } /** * Test whether we can delete a application in Genie. * * @throws Exception If there is any problem. */ @Test(expected = IOException.class) public void testDeleteApplication() throws Exception { final Application application1 = constructApplicationDTO(null); applicationClient.createApplication(application1); final Application application2 = applicationClient.getApplication(application1.getId().orElseThrow(IllegalArgumentException::new)); Assert.assertEquals(application2.getId(), application1.getId()); applicationClient.deleteApplication(application1.getId().orElseThrow(IllegalArgumentException::new)); applicationClient.getApplication(application1.getId().orElseThrow(IllegalArgumentException::new)); } /** * Test to verify if the update application method is working correctly. * * @throws Exception If there is any problem. */ @Test public void testUpdateApplication() throws Exception { final Application application1 = constructApplicationDTO(null); applicationClient.createApplication(application1); final Application application2 = applicationClient.getApplication(application1.getId().orElseThrow(IllegalArgumentException::new)); Assert.assertEquals(application2.getName(), application1.getName()); final Application application3 = new Application.Builder("newname", "newuser", "new version", ApplicationStatus.ACTIVE) .withId(application1.getId().orElseThrow(IllegalArgumentException::new)) .build(); applicationClient .updateApplication(application1.getId().orElseThrow(IllegalArgumentException::new), application3); final Application application4 = applicationClient.getApplication(application1.getId().orElseThrow(IllegalArgumentException::new)); Assert.assertEquals("newname", application4.getName()); Assert.assertEquals("newuser", application4.getUser()); Assert.assertEquals("new version", application4.getVersion()); Assert.assertEquals(ApplicationStatus.ACTIVE, application4.getStatus()); Assert.assertFalse(application4.getSetupFile().isPresent()); Assert.assertFalse(application4.getDescription().isPresent()); Assert.assertEquals(Collections.emptySet(), application4.getConfigs()); Assert.assertEquals(application4.getTags().contains("foo"), false); } /** * Test all the methods that manipulate tags for a application in genie. * * @throws Exception If there is any problem. */ @Test public void testApplicationTagsMethods() throws Exception { final Set<String> initialTags = new HashSet<>(); initialTags.add("foo"); initialTags.add("bar"); final Set<String> configList = new HashSet<>(); configList.add("config1"); configList.add("configs2"); final Application application = new Application.Builder("name", "user", "1.0", ApplicationStatus.ACTIVE) .withId("application1") .withDescription("client Test") .withSetupFile("path to set up file") .withTags(initialTags) .withConfigs(configList) .build(); applicationClient.createApplication(application); // Test getTags for application Set<String> tags = applicationClient.getTagsForApplication("application1"); Assert.assertEquals(4, tags.size()); Assert.assertEquals(tags.contains("foo"), true); Assert.assertEquals(tags.contains("bar"), true); // Test adding a tag for application final Set<String> moreTags = new HashSet<>(); moreTags.add("pi"); applicationClient.addTagsToApplication("application1", moreTags); tags = applicationClient.getTagsForApplication("application1"); Assert.assertEquals(5, tags.size()); Assert.assertEquals(tags.contains("foo"), true); Assert.assertEquals(tags.contains("bar"), true); Assert.assertEquals(tags.contains("pi"), true); // Test removing a tag for application applicationClient.removeTagFromApplication("application1", "bar"); tags = applicationClient.getTagsForApplication("application1"); Assert.assertEquals(4, tags.size()); Assert.assertEquals(tags.contains("foo"), true); Assert.assertEquals(tags.contains("pi"), true); // Test update tags for a application applicationClient.updateTagsForApplication("application1", initialTags); tags = applicationClient.getTagsForApplication("application1"); Assert.assertEquals(4, tags.size()); Assert.assertEquals(tags.contains("foo"), true); Assert.assertEquals(tags.contains("bar"), true); // Test delete all tags in a application applicationClient.removeAllTagsForApplication("application1"); tags = applicationClient.getTagsForApplication("application1"); Assert.assertEquals(2, tags.size()); } /** * Test all the methods that manipulate configs for a application in genie. * * @throws Exception If there is any problem. */ @Test public void testApplicationConfigsMethods() throws Exception { final Set<String> initialConfigs = new HashSet<>(); initialConfigs.add("foo"); initialConfigs.add("bar"); final Application application = new Application.Builder("name", "user", "1.0", ApplicationStatus.ACTIVE) .withId("application1") .withDescription("client Test") .withSetupFile("path to set up file") .withConfigs(initialConfigs) .build(); applicationClient.createApplication(application); // Test getConfigs for application Set<String> configs = applicationClient.getConfigsForApplication("application1"); Assert.assertEquals(2, configs.size()); Assert.assertEquals(configs.contains("foo"), true); Assert.assertEquals(configs.contains("bar"), true); // Test adding a config for application final Set<String> moreConfigs = new HashSet<>(); moreConfigs.add("pi"); applicationClient.addConfigsToApplication("application1", moreConfigs); configs = applicationClient.getConfigsForApplication("application1"); Assert.assertEquals(3, configs.size()); Assert.assertEquals(configs.contains("foo"), true); Assert.assertEquals(configs.contains("bar"), true); Assert.assertEquals(configs.contains("pi"), true); // Test update configs for a application applicationClient.updateConfigsForApplication("application1", initialConfigs); configs = applicationClient.getConfigsForApplication("application1"); Assert.assertEquals(2, configs.size()); Assert.assertEquals(configs.contains("foo"), true); Assert.assertEquals(configs.contains("bar"), true); // Test delete all configs in a application applicationClient.removeAllConfigsForApplication("application1"); configs = applicationClient.getConfigsForApplication("application1"); Assert.assertEquals(0, configs.size()); } /** * Test the application patch method. * * @throws Exception If there is any error. */ @Test public void testApplicationPatchMethod() throws Exception { final ObjectMapper mapper = new ObjectMapper(); final String newName = UUID.randomUUID().toString(); final String patchString = "[{ \"op\": \"replace\", \"path\": \"/name\", \"value\": \"" + newName + "\" }]"; final JsonPatch patch = JsonPatch.fromJson(mapper.readTree(patchString)); final Application application = constructApplicationDTO("application1"); applicationClient.createApplication(application); applicationClient.patchApplication("application1", patch); Assert.assertEquals(newName, applicationClient.getApplication("application1").getName()); } /** * Test to fetch the commands to which an application is linked. * * @throws Exception If there is any problem. */ @Test public void testCanGetCommandsForApplication() throws Exception { final Command command1 = constructCommandDTO(null); final Command command2 = constructCommandDTO(null); commandClient.createCommand(command1); commandClient.createCommand(command2); final Application application = constructApplicationDTO(null); applicationClient.createApplication(application); commandClient.addApplicationsToCommand( command1.getId().orElseThrow(IllegalArgumentException::new), Lists.newArrayList(application.getId().orElseThrow(IllegalArgumentException::new)) ); commandClient.addApplicationsToCommand( command2.getId().orElseThrow(IllegalArgumentException::new), Lists.newArrayList(application.getId().orElseThrow(IllegalArgumentException::new)) ); final List<Command> commandList = applicationClient.getCommandsForApplication( application.getId().orElseThrow(IllegalArgumentException::new) ); Assert.assertEquals(2, commandList.size()); } }