/** * Copyright (C) 2015 Orange * 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.francetelecom.clara.cloud.activation.plugin.cf.infrastructure; import com.francetelecom.clara.cloud.commons.MavenReference; import com.francetelecom.clara.cloud.techmodel.cf.*; import com.google.common.net.InternetDomainName; import org.cloudfoundry.client.lib.CloudFoundryOperations; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import static org.fest.assertions.Assertions.assertThat; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assume.assumeThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; @RunWith(org.mockito.runners.MockitoJUnitRunner.class) public class CfAdapterImplIT { private static final String SPACE = "space"; private CfAdapterImpl cfAdapter; @Mock CloudFoundryOperations cfClient; @Before public void setUp() throws MalformedURLException { URL apiUrl = new URL("http://localhost"); cfAdapter = new CfAdapterImpl("proxy", 3128, apiUrl, "email", "pwd", "org", SPACE, "cfapps.elpaaso.net", true) { @Override protected CloudFoundryOperations login(String spaceName) { return cfClient; } }; } @Test public void creates_an_http_configuration_from_configured_credentials_with_proxy() { // given cfAdapter.setUsingHttpProxy(true); // when // then assertThat(cfAdapter.httpProxyConfiguration()).isNotNull(); assertThat(cfAdapter.httpProxyConfiguration().getProxyHost()).isEqualTo("proxy"); assertThat(cfAdapter.httpProxyConfiguration().getProxyPort()).isEqualTo(3128); } @Test public void creates_an_http_configuration_from_configured_credentials_without_proxy() { // given cfAdapter.setUsingHttpProxy(false); // when // then assertThat(cfAdapter.httpProxyConfiguration()).isNull(); } @Test public void the_class_InternetDomainName_normalizes_domain_names() { assertThat(InternetDomainName.from("UPPERCASE.net").name()).isEqualTo("uppercase.net"); } @Test public void predicts_jonas_log_file_name() { Calendar calendar = new GregorianCalendar(); calendar.set(2013, 8 - 1, 28); // months start at 0 Date time = calendar.getTime(); String jonasLogFileName = cfAdapter.getJonasLogFileName(time); assertThat(jonasLogFileName).isEqualTo("singleServerName-2013-08-28.3.log"); } @Test public void registersUriAndTheirParentDomain() { // given Space space = new Space(); space.activate(new SpaceName(SPACE)); Route route = new Route(new RouteUri("webGui.CfConsummerIT.gberche-dev-box.guillaume-berche.cfapps.elpaaso.net"), "", space); // when cfAdapter.createRoute(route, SPACE); // then verify(cfClient).addRoute(Mockito.eq("webgui"), Mockito.eq("cfconsummerit.gberche-dev-box.guillaume-berche.cfapps.elpaaso.net")); // register // the // route // lower // case } /* * @Test * * @Ignore("handled at application level") public void * handles_conflicting_uri_without_duplicates_and_normalizes_uris() { * //given CfAdapter.AppConflictHandler appConflictHandler = new * CfAdapter.AppConflictHandler() { * * @Override public String getNextUriCandidate(String uri, int attempts) { * assertThat(uri).doesNotMatch("c\\d+\\-.*"); //should not be passed * previous deconflicting prefixes return "c"+ attempts + "-" + uri; } }; * * doThrow(new * org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.BAD_REQUEST, * "busy route 1")) .doThrow(new * org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.BAD_REQUEST, * "busy route 2")) .doNothing() .when(cfClient).addRoute(anyString(), * anyString()); doThrow(new * org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.BAD_REQUEST, * "busy app name 1")) .doThrow(new * org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.BAD_REQUEST, * "busy app name 2")) .doNothing() * .when(cfClient).createApplication(anyString(), any(Staging.class), * anyInt(), anyList(), anyList()); * * //when String requestedUri = * "webGui.CfConsummerIT.gberche-dev-box.guillaume-berche.cfapps.elpaaso.net" * ; String conflictFreeUri = * cfAdapter.getAndRegisterNormalizedConflictFreeUri(requestedUri, * appConflictHandler, SPACE); * * //then verify(cfClient).addDomain( * "cfconsummerit.gberche-dev-box.guillaume-berche.cfapps.elpaaso.net"); * //register parent domain assertThat(conflictFreeUri).startsWith("c"); * //no accumulated prefixes such as c1-c2- * assertThat(conflictFreeUri).endsWith * ("webgui.cfconsummerit.gberche-dev-box.guillaume-berche.cfapps.elpaaso.net" * ); //no accumulated prefixes such as c1-c2- * assertThat(InternetDomainName. * from(conflictFreeUri).name()).isEqualTo(conflictFreeUri); //uri is * normalized } * * @Test * * @Ignore("handled at application level") public void * should_register_routes_but_not_topdomain_at_env_instanciation() { * assumeThat("inconsistent domain", cfAdapter.getDomain(), * is("cfapps.elpaaso.net")); //given CfAdapter.AppConflictHandler * appConflictHandler = mock(CfAdapter.AppConflictHandler.class); * * //when String requestedUri = * "myenv-jeeprobewe-myjeeprobetestc-uat.cfapps.elpaaso.net"; String * conflictFreeUri = * cfAdapter.getAndRegisterNormalizedConflictFreeUri(requestedUri, * appConflictHandler, SPACE); * * //then verify(cfClient, never()).addDomain("cfapps.elpaaso.net"); * verify(cfClient * ).addRoute(Mockito.endsWith("myenv-jeeprobewe-myjeeprobetestc-uat"), * Mockito.eq("cfapps.elpaaso.net")); } */ @Test public void deleting_application_also_deletes_routes_domains_and_ignores_deletion_failures() { assumeThat("inconsistent domain", cfAdapter.getDomain(), is("cfapps.elpaaso.net")); Space space = new Space(); App app = new App(space, "appName", mock(MavenReference.class), "java", 512, 1); Route route1 = new Route(new RouteUri("host1.mysubdomain.cfapps.elpaaso.net"), "root1", space); Route route2 = new Route(new RouteUri("host2.mysubdomain.cfapps.elpaaso.net"), "root2", space); app.mapRoute(route1); app.mapRoute(route2); doThrow(new org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.NOT_FOUND, "simulating no such app")).when(cfClient).deleteApplication(anyString()); doThrow(new org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.NOT_FOUND, "simulating no such route")).when(cfClient).deleteRoute(anyString(), anyString()); doThrow(new org.cloudfoundry.client.lib.CloudFoundryException(HttpStatus.NOT_FOUND, "simulating no such domain")).when(cfClient).deleteDomain(anyString()); // when cfAdapter.deleteApp(app, SPACE); // then verify(cfClient).deleteApplication("appName"); verify(cfClient).deleteRoute("host1", "mysubdomain.cfapps.elpaaso.net"); verify(cfClient).deleteRoute("host2", "mysubdomain.cfapps.elpaaso.net"); verify(cfClient).deleteDomain("mysubdomain.cfapps.elpaaso.net"); } @Test public void deleting_application_should_not_delete_paas_domain_shared_by_all_apps() { assumeThat("inconsistent domain", cfAdapter.getDomain(), is("cfapps.elpaaso.net")); Space space = new Space(); App app = new App(space, "appName", mock(MavenReference.class), "java", 512, 1); Route route1 = new Route(new RouteUri("myenv-jeeprobewe-myjeeprobetestc-uat.cfapps.elpaaso.net"), "root1", space); app.mapRoute(route1); // when cfAdapter.deleteApp(app, SPACE); // then verify(cfClient).deleteRoute("myenv-jeeprobewe-myjeeprobetestc-uat", "cfapps.elpaaso.net"); verify(cfClient, never()).deleteDomain("cfapps.elpaaso.net"); } }