/**
* 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.coremodel;
import com.francetelecom.clara.cloud.commons.DateHelper;
import com.francetelecom.clara.cloud.model.*;
import org.apache.commons.lang3.time.DateUtils;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static org.fest.assertions.Assertions.assertThat;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/com/francetelecom/clara/cloud/coremodel/application-context.xml" })
@DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_CLASS)
public class EnvironmentRepositoryPurgeTest {
private static final Logger LOG = LoggerFactory.getLogger(EnvironmentRepositoryPurgeTest.class);
@Autowired
private EnvironmentRepository environmentRepository;
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private ApplicationReleaseRepository applicationReleaseRepository;
@Autowired
private TechnicalDeploymentTemplateRepository technicalDeploymentTemplateRepository;
@Autowired
private PaasUserRepository paasUserRepository;
private ApplicationRelease release;
private TechnicalDeploymentInstance technicalDeploymentInstance;
private PaasUser bob;
/*
* @Autowired DataSource dataSource;
*/
@Before
@Transactional
public void setup() throws Exception {
Assert.assertNotNull(environmentRepository);
// given paas user with ssoId aSsoId exists
bob = new PaasUser("bob", "Dylan", new SSOId("bob123"), "bob@orange.com");
paasUserRepository.save(bob);
paasUserRepository.flush();
// given application with label aLabel and code aCode exists
Application application = new Application("aLabel", "aCode");
applicationRepository.save(application);
applicationRepository.flush();
// given release with version aVersion exists
release = new ApplicationRelease(application, "aVersion");
applicationReleaseRepository.save(release);
applicationReleaseRepository.flush();
// given td exists
TechnicalDeployment technicalDeployment = new TechnicalDeployment("foo");
// given tdt exists
TechnicalDeploymentTemplate technicalDeploymentTemplate = new TechnicalDeploymentTemplate(technicalDeployment, DeploymentProfileEnum.DEVELOPMENT, "releaseId", MiddlewareProfile.DEFAULT_PROFILE);
technicalDeploymentTemplateRepository.save(technicalDeploymentTemplate);
// given tdi exists
technicalDeploymentInstance = new TechnicalDeploymentInstance(technicalDeploymentTemplate, technicalDeployment);
}
@Test
@Transactional
public void should_find_older_removed_environments() {
// GIVEN
int fiveDay = 5;
Date jMinusFourDayAndTwentyThreeHours = DateHelper.getDateDeltaDay(-4);
jMinusFourDayAndTwentyThreeHours = DateUtils.addHours(jMinusFourDayAndTwentyThreeHours, -23);
Date jMinusFiveDayAndOneSecond = DateHelper.getDateDeltaDay(-5);
jMinusFiveDayAndOneSecond = DateUtils.addSeconds(jMinusFiveDayAndOneSecond, -1);
Date jMinusHeight = DateHelper.getDateDeltaDay(-8);
// default environment
Environment environment = new Environment(DeploymentProfileEnum.PRODUCTION, "default", release, bob,technicalDeploymentInstance);
environmentRepository.save(environment);
LOG.info("test env {}", environment);
// default old environment
DateHelper.setNowDate(jMinusFiveDayAndOneSecond);
Environment environmentOld = new Environment(DeploymentProfileEnum.PRODUCTION, "old", release, bob,technicalDeploymentInstance);
Assume.assumeTrue(environmentOld.getCreationDate().equals(jMinusFiveDayAndOneSecond));
DateHelper.resetNow();
environmentRepository.save(environmentOld);
LOG.info("test env {}", environmentOld);
// given default removed environment
DateHelper.setNowDate(jMinusFourDayAndTwentyThreeHours);
Environment removed = new Environment(DeploymentProfileEnum.PRODUCTION, "defaultRemoved", release, bob,technicalDeploymentInstance);
removed.setStatus(EnvironmentStatus.REMOVED);
DateHelper.resetNow();
environmentRepository.save(removed);
LOG.info("test env {}", removed);
// given older removed environment A (j-6)
DateHelper.setNowDate(jMinusFiveDayAndOneSecond);
Environment oldRemovedA = new Environment(DeploymentProfileEnum.PRODUCTION, "oldRemovedA", release, bob,technicalDeploymentInstance);
oldRemovedA.setStatus(EnvironmentStatus.REMOVED);
DateHelper.resetNow();
Assume.assumeTrue(oldRemovedA.getDeletionDate().equals(jMinusFiveDayAndOneSecond));
environmentRepository.save(oldRemovedA);
LOG.info("test env {}", oldRemovedA);
// given older removed environment B (j-8)
DateHelper.setNowDate(jMinusHeight);
Environment oldRemovedB = new Environment(DeploymentProfileEnum.PRODUCTION, "oldRemovedB", release, bob,technicalDeploymentInstance);
oldRemovedB.setStatus(EnvironmentStatus.REMOVED);
DateHelper.resetNow();
Assume.assumeTrue(oldRemovedB.getDeletionDate().equals(jMinusHeight));
environmentRepository.save(oldRemovedB);
LOG.info("test env {}", oldRemovedA);
// WHEN
List<Environment> results = environmentRepository.findRemovedOlderThanNDays(DateHelper.getDateDeltaDay(-fiveDay));
// THEN
assertThat(results).containsExactly(oldRemovedA, oldRemovedB);
}
@Test
@Transactional
public void retention_delay_should_prevent_to_find_older_environments_recently_removed() {
// GIVEN
int retentionDelayIsFiveDay = 5;
Date jMinusFiveDayAndOneSecond = DateHelper.getDateDeltaDay(-5);
jMinusFiveDayAndOneSecond = DateUtils.addSeconds(jMinusFiveDayAndOneSecond, -1);
// oldEnv but recently removed
DateHelper.setNowDate(jMinusFiveDayAndOneSecond);
Environment oldEnv = new Environment(DeploymentProfileEnum.PRODUCTION, "default", release, bob,technicalDeploymentInstance);
Assume.assumeTrue(oldEnv.getCreationDate().equals(jMinusFiveDayAndOneSecond));
DateHelper.resetNow();
Date removedDate = new Date();
DateHelper.setNowDate(removedDate );
oldEnv.setStatus(EnvironmentStatus.REMOVED);
DateHelper.resetNow();
Assume.assumeTrue(oldEnv.getDeletionDate().equals(removedDate));
environmentRepository.save(oldEnv);
LOG.info("test env {}", oldEnv);
// WHEN
List<Environment> results = environmentRepository.findRemovedOlderThanNDays(DateHelper.getDateDeltaDay(-retentionDelayIsFiveDay));
// THEN
assertThat(results).isEmpty();
}
@Test
@Transactional
public void should_purge_environments() {
// GIVEN
// default environment
Environment environment = new Environment(DeploymentProfileEnum.PRODUCTION, "default", release, bob,technicalDeploymentInstance);
environmentRepository.save(environment);
// removed environment
Environment removedEnvironment = new Environment(DeploymentProfileEnum.PRODUCTION, "removedEnvironment", release, bob,technicalDeploymentInstance);
removedEnvironment.setStatus(EnvironmentStatus.REMOVED);
environmentRepository.save(removedEnvironment);
List <Environment> environmentsToPurge = Arrays.asList(environment, removedEnvironment);
int envCount = environmentsToPurge.size();
// WHEN
LOG.info("purge {} environment(s)", envCount);
environmentRepository.delete(environmentsToPurge);
// THEN
// env that should be retrieved by id
assertThat(environmentRepository.findOne(environment.getId()))
.as("not removed env should should exist").isEqualTo(null);
// env that should not be retrieved by id
assertThat(environmentRepository.findOne(removedEnvironment.getId()))
.as("removed env should not exist").isNull();
// assert database state (using findAll)
List<Environment> keepedEnvironment = environmentRepository.findAll();
LOG.info("after purge env count: {}", keepedEnvironment.size());
assertThat(keepedEnvironment).isEmpty();
// method return
environmentRepository.flush();
}
}