/**
* 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.core.service;
import com.francetelecom.clara.cloud.TestHelper;
import com.francetelecom.clara.cloud.commons.AuthorizationException;
import com.francetelecom.clara.cloud.commons.MavenReference;
import com.francetelecom.clara.cloud.core.service.exception.EnvironmentNotFoundException;
import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException;
import com.francetelecom.clara.cloud.coremodel.*;
import com.francetelecom.clara.cloud.environment.impl.ManageEnvironmentImpl;
import com.francetelecom.clara.cloud.environment.impl.ManageEnvironmentImplUtils;
import com.francetelecom.clara.cloud.environment.log.BaseSearchURL;
import com.francetelecom.clara.cloud.environment.log.LogService;
import com.francetelecom.clara.cloud.environment.log.LogServiceSplunkImpl;
import com.francetelecom.clara.cloud.model.*;
import com.francetelecom.clara.cloud.paas.activation.ManagePaasActivation;
import com.francetelecom.clara.cloud.paas.activation.TaskStatusActivation;
import com.francetelecom.clara.cloud.paas.projection.UnsupportedProjectionException;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDetailsDto;
import com.francetelecom.clara.cloud.services.dto.LinkDto;
import com.francetelecom.clara.cloud.techmodel.cf.App;
import com.francetelecom.clara.cloud.techmodel.cf.Space;
import com.francetelecom.clara.cloud.techmodel.cf.SpaceName;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.UUID;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Test Business implementation for ManageEnvironment component
*/
@RunWith(MockitoJUnitRunner.class)
public class ManageEnvironmentImplOverallsLinksTest {
private static final PaasUser JOHN_LENNON = new PaasUser("john", "Lennon", new SSOId("john123"), "john@orange.com");
protected static Logger LOG = LoggerFactory.getLogger(ManageEnvironmentImplOverallsLinksTest.class);
public static final String SPLUNK_IP = "10.170.232.227";
public static final String SPLUNK_PORT = "8080";
@Spy
SecurityUtils securityUtils;
@Spy
SecurityContextUtilImpl securityContextUtil;
@InjectMocks
ManageEnvironmentImpl manageEnvironment;
@Mock
ManageEnvironmentImplUtils manageEnvironmentImplUtilsMock;
@Mock
ManagePaasActivation managePaasActivationMock;
@Mock
TechnicalDeploymentRepository technicalDeploymentRepository;
@Mock
EnvironmentRepository environmentRepository;
Environment environment;
private final String generatedEnvUid = "generatedEnvUid";
private final String environmentName = "environmentName";
@Before
public void setup() throws ObjectNotFoundException, MalformedURLException, UnsupportedProjectionException {
//login as admin
TestHelper.loginAsAdmin();
Application app = new Application("app", "basicat");
ApplicationRelease release = new ApplicationRelease(app, "1.1");
TechnicalDeploymentTestFactory technicalDeploymentTestFactory = new TechnicalDeploymentTestFactory();
TechnicalDeployment td = technicalDeploymentTestFactory.createWicketJpaTD("foo", "foo.groupid:foo.artifactid:foo.version");
td.setLogicalModelId("td");
TechnicalDeploymentTemplate tdt = new TechnicalDeploymentTemplate(td, DeploymentProfileEnum.DEVELOPMENT, "releaseId", MiddlewareProfile.DEFAULT_PROFILE);
TechnicalDeploymentInstance tdi = new TechnicalDeploymentInstance(tdt, td);
// create jonas
// create db
// create apache
environment = new Environment(DeploymentProfileEnum.DEVELOPMENT, "My env", release, JOHN_LENNON, tdi);
// configure mocks
when(environmentRepository.findOne(anyInt())).thenReturn(environment);
when(environmentRepository.findByUid(Mockito.matches(environment.getUID()))).thenReturn(environment);
when(manageEnvironmentImplUtilsMock.createTDI(anyString(), any(DeploymentProfileEnum.class), anyString(), anyString(), anyListOf(String.class))).thenReturn(generatedEnvUid);
when(managePaasActivationMock.activate(anyInt())).thenReturn(new TaskStatusActivation());
LogService logService = new LogServiceSplunkImpl(new BaseSearchURL(SPLUNK_IP, SPLUNK_PORT, false));
manageEnvironment.setLogService(logService);
}
@After
public void teardown() {
//logout
TestHelper.logout();
}
private Environment createEnvMock() {
TechnicalDeployment td = new TechnicalDeployment("tdTest");
Space space = new Space();
space.activate(new SpaceName("joynspace"));
td.add(space);
App joyn = new App(space, Mockito.mock(MavenReference.class), "joyn");
td.add(joyn);
joyn.activate(UUID.fromString("55dd956f-05b3-462c-aa5f-10aba84cd82d"));
TechnicalDeploymentInstance envTdiStub = new TechnicalDeploymentInstance(new TechnicalDeploymentTemplate(td, DeploymentProfileEnum.DEVELOPMENT, "releaseId", MiddlewareProfile.DEFAULT_PROFILE), td);
envTdiStub.setName(environmentName);
Environment justCreatedEnvMock = mock(Environment.class);
when(justCreatedEnvMock.getTechnicalDeploymentInstance()).thenReturn(envTdiStub);
when(justCreatedEnvMock.getUID()).thenReturn(generatedEnvUid);
when(environmentRepository.findByUid(generatedEnvUid)).thenReturn(justCreatedEnvMock);
return justCreatedEnvMock;
}
private Environment createEnvDetailedMock() {
Environment justCreatedEnvMock = createEnvMock();
Application mockedApp = mock(Application.class);
ApplicationRelease mockedAppRelease = mock(ApplicationRelease.class);
PaasUser mockedPaasUser = new PaasUser("bob", "Dylan", new SSOId("bob123"), "bob@orange.com");
when(justCreatedEnvMock.getApplicationRelease()).thenReturn(mockedAppRelease);
when(mockedAppRelease.getApplication()).thenReturn(mockedApp);
when(justCreatedEnvMock.getPaasUser()).thenReturn(mockedPaasUser);
when(justCreatedEnvMock.getType()).thenReturn(DeploymentProfileEnum.DEVELOPMENT);
when(justCreatedEnvMock.getStatus()).thenReturn(EnvironmentStatus.CREATING);
return justCreatedEnvMock;
}
@Test(expected = AuthorizationException.class)
public void non_admin_user_fails_to_see_details_of_environment_of_application_he_is_not_a_member_of() throws EnvironmentNotFoundException {
TestHelper.loginAsUser();
// Given
Environment envMock = createEnvDetailedMock();
Mockito.when(environmentRepository.findByUid(envMock.getUID())).thenReturn(envMock);
manageEnvironment.findEnvironmentDetails(envMock.getUID());
}
@Test
public void environment_details_dto_should_include_splunk_link_for_environment_overalls() throws ObjectNotFoundException {
// Given
Environment envMock = createEnvDetailedMock();
// when
EnvironmentDetailsDto environmentDetails = manageEnvironment.findEnvironmentDetails(envMock.getUID());
LinkDto overallsLinkDto = environmentDetails.getEnvironmentOverallsLinkDto();
// then
assertThat(overallsLinkDto).as("overallsLinkDto should not be null").isNotNull();
LOG.info("overallsLinkDto : {}", overallsLinkDto);
assertThat(overallsLinkDto.getUrl()).as("overallsLinkDtoUrl should not be null").isNotNull();
StringBuilder expectedSplunkOverallsSearch = new StringBuilder
("http://").append(SPLUNK_IP).append(":").append(SPLUNK_PORT)
.append("/en-US/app/elpaaso/flashtimeline?auto_pause=true&q=search%20");
expectedSplunkOverallsSearch.append("index%3D%22*%22+source%3D%22tcp%3A12345%22+appname%3D%2255dd956f-05b3-462c-aa5f-10aba84cd82d%22");
assertThat(overallsLinkDto.getUrl().toString()).isEqualTo(expectedSplunkOverallsSearch.toString());
}
@Test
public void environment_details_dto_should_include_logs_link_for_environment_overalls() throws Exception {
// Given
Environment envMock = createEnvDetailedMock();
// when
EnvironmentDetailsDto environmentDetails = manageEnvironment.findEnvironmentDetails(envMock.getUID());
URL logsURL = environmentDetails.getURLLinkFromType(LinkDto.LinkTypeEnum.LOGS_LINK);
// then
StringBuilder expectedSplunkOverallsSearch = new StringBuilder
("http://").append(SPLUNK_IP).append(":").append(SPLUNK_PORT)
.append("/en-US/app/elpaaso/flashtimeline?auto_pause=true&q=search%20");
expectedSplunkOverallsSearch.append("index%3D%22*%22+source%3D%22tcp%3A12345%22+appname%3D%2255dd956f-05b3-462c-aa5f-10aba84cd82d%22");
assertThat(logsURL.toString()).isEqualTo(expectedSplunkOverallsSearch.toString());
}
@Test
public void environment_details_dto_should_splunk_logs_links_with_ids() throws ObjectNotFoundException, MalformedURLException {
EnvironmentDetailsDto dto = manageEnvironment.findEnvironmentDetails(environment.getUID());
List<LinkDto> links = dto.getSpecificLinkDto(LinkDto.LinkTypeEnum.LOGS_LINK);
Assert.assertEquals(1, links.size());
boolean envOK = false;
for (LinkDto link : links) {
LOG.info("Log link: " + link.getTargetUser() + " -> " + link.getUrl().toString());
envOK = envOK || link.getUrl().toString().contains("appname");
}
Assert.assertTrue("At least one log link has not been found", envOK);
}
}