/** * 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.presentation.tools; import com.francetelecom.clara.cloud.commons.BusinessException; import com.francetelecom.clara.cloud.commons.TechnicalException; import com.francetelecom.clara.cloud.core.service.ManageApplication; import com.francetelecom.clara.cloud.core.service.ManageApplicationRelease; import com.francetelecom.clara.cloud.core.service.ManageEnvironment; import com.francetelecom.clara.cloud.core.service.exception.DuplicateApplicationReleaseException; import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException; import com.francetelecom.clara.cloud.coremodel.Application; import com.francetelecom.clara.cloud.coremodel.ApplicationRelease; import com.francetelecom.clara.cloud.coremodel.PaasUser; import com.francetelecom.clara.cloud.deployment.logical.service.ManageLogicalDeployment; import com.francetelecom.clara.cloud.logicalmodel.LogicalDeployment; import com.francetelecom.clara.cloud.logicalmodel.samplecatalog.SampleAppFactory; import com.francetelecom.clara.cloud.services.dto.EnvironmentDto; import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import javax.validation.ConstraintViolationException; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import java.util.*; /** * Created by IntelliJ IDEA. User: Thomas Escalle - tawe8231 Entity : * FT/OLNC/RD/MAPS/MEP/MSE Date: 02/11/11 * * Allows user to create automatically applications / releases / logical model / * environment, invoking "populate page" * */ public class PopulateDatasService { /** * Logger */ private static final transient Logger logger = LoggerFactory.getLogger(PopulateDatasService.class); /** * @todo BVA/TES dont work on mock version !? Spring automatically injects * all known beans of type * {@link com.francetelecom.clara.cloud.logicalmodel.samplecatalog.SampleAppFactory} * . See http://static.springsource.org/spring/docs/current/spring- * framework-reference/html/beans.html#beans-annotation-config * @todo : WARN "Autowired" notation is only for test, and must be replaced * by context bean definition */ @Autowired Map<String, SampleAppFactory> sampleAppsCatalog; private ManageApplication manageApplication; private ManageApplicationRelease manageApplicationRelease; private ManageLogicalDeployment manageLogicalDeployment; private ManageEnvironment manageEnvironment; PaasUser user = null; // needed by spring public PopulateDatasService() { logger.debug("PopulateDatasService()"); } private SampleAppFactory getAppFactory(String appName) { for (Map.Entry<String, SampleAppFactory> entry : sampleAppsCatalog.entrySet()) { String beanName = entry.getKey(); SampleAppFactory appFactory = entry.getValue(); if (beanName.startsWith(appName)) { return appFactory; } } return null; } private Application createApp(String beanName, SampleAppFactory appFactory) throws BusinessException, MalformedURLException { // create app String appLabel = appFactory.getAppLabel(); String appCode = appFactory.getAppCode(); String appDescription = appFactory.getAppDescription(); String appVersionControl = appFactory.getApplicationVersionControl(); if (appLabel == null) { appLabel = beanName.substring(0, beanName.indexOf("LogicalModelCatalog")); } if (appCode == null) { appCode = appLabel.substring(0, 4) + 1; } if (appDescription == null) { appDescription = "Sample app description for " + appLabel; } if (appVersionControl == null) { appVersionControl = "http://default.version.control.url"; } String applicationUID; try { applicationUID = manageApplication.createPublicApplication(appCode, appLabel, appDescription, new URL(appVersionControl), WicketSession.get().getPaasUser().getSsoId()); return manageApplication.findApplicationByUID(applicationUID); } catch (DataIntegrityViolationException dataException) { logger.error(dataException.getMessage()); throw new BusinessException(dataException); } catch (BusinessException be) { throw be; } catch (Exception e) { Throwable rootCauseException = ExceptionUtils.getRootCause(e); if (rootCauseException instanceof ConstraintViolationException) { logger.error(rootCauseException.getMessage()); throw new BusinessException(rootCauseException); } logger.error(e.getMessage()); throw new TechnicalException(e); } } private ApplicationRelease createRelease(Application app, SampleAppFactory appFactory, String version) throws MalformedURLException, DuplicateApplicationReleaseException, ObjectNotFoundException { ApplicationRelease release; // create app String releaseDescription = appFactory.getAppReleaseDescription(); String releaseVersionControl = appFactory.getApplicationReleaseVersionControl(); if (releaseDescription == null) { releaseDescription = app.getDescription() + " and it's release " + version; } if (releaseVersionControl == null) { releaseVersionControl = "http://default.version.control.url"; } // Creates and persists release String releaseUid = manageApplicationRelease.createApplicationRelease(app.getUID(), WicketSession.get().getPaasUser().getSsoId().getValue(), version); // Find the created release release = manageApplicationRelease.findApplicationReleaseByUID(releaseUid); // Set other properties and save change release.setDescription(releaseDescription); release.setVersionControlUrl(new URL(releaseVersionControl)); // release.addPaasUser(WicketSession.get().getPaasUser(), // PaasRoleEnum.RELEASE_MANAGER); manageApplicationRelease.updateApplicationRelease(release); return release; } private void populateLogicalDeployment(SampleAppFactory appFactory, ApplicationRelease release) throws BusinessException { LogicalDeployment logicalDeploymentToUpdate = manageLogicalDeployment.findLogicalDeployment(release.getLogicalDeployment().getId()); LogicalDeployment ld = appFactory.populateLogicalDeployment(logicalDeploymentToUpdate); manageLogicalDeployment.checkOverallConsistencyAndUpdateLogicalDeployment(ld); } public List<PopulateApplicationInformation> getApplicationsList() { List<PopulateApplicationInformation> appList = new ArrayList<PopulateApplicationInformation>(); for (Map.Entry<String, SampleAppFactory> entry : sampleAppsCatalog.entrySet()) { String beanName = entry.getKey(); if ((entry.getValue()).isInstantiable()) { PopulateApplicationInformation pai = new PopulateApplicationInformation(beanName, "1", "0"); appList.add(pai); } } return appList; } public void setSampleAppsCatalog(Map<String, SampleAppFactory> sampleAppsCatalog) { logger.debug(" setSampleAppsCatalog"); this.sampleAppsCatalog = sampleAppsCatalog; } public void setManageApplication(ManageApplication manageApplication) { this.manageApplication = manageApplication; } public void setManageApplicationRelease(ManageApplicationRelease manageApplicationRelease) { this.manageApplicationRelease = manageApplicationRelease; } public void setManageLogicalDeployment(ManageLogicalDeployment manageLogicalDeployment) { this.manageLogicalDeployment = manageLogicalDeployment; } public void setManageEnvironment(ManageEnvironment manageEnvironment) { this.manageEnvironment = manageEnvironment; } public void setUser(PaasUser user) { this.user = user; } public void populateSingleApp(String appName, String nbOfReleases, String nbOfEnvironments, boolean mock) throws MalformedURLException, BusinessException { SampleAppFactory appFactory = getAppFactory(appName); String version; // Create application Application app = createApp(appName, appFactory); for (int i = 1; i <= Integer.parseInt(nbOfReleases); i++) { version = "G00R0" + i; // create release ApplicationRelease release = createRelease(app, appFactory, version); // Populate logical model. populateLogicalDeployment(appFactory, release); for (int j = 1; j <= Integer.parseInt(nbOfEnvironments); j++) { List<EnvironmentDto.EnvironmentTypeEnum> envTypeList = new ArrayList<EnvironmentDto.EnvironmentTypeEnum>(); Collections.addAll(envTypeList, EnvironmentDto.EnvironmentTypeEnum.values()); Random random = new Random(); EnvironmentDto.EnvironmentTypeEnum envType; // if mock mode activate we can select a random type of // environment if (mock) envType = envTypeList.get(random.nextInt(envTypeList.size())); // if mock mode deactivate we can only create development // environment else envType = EnvironmentDto.EnvironmentTypeEnum.DEVELOPMENT; manageEnvironment.isEnvironmentLabelUniqueForRelease(WicketSession.get().getPaasUser().getSsoId().getValue(), "my env " + j, release.getUID()); manageEnvironment.createEnvironment(release.getUID(), envType, WicketSession.get().getPaasUser().getSsoId().getValue(), "my env " + j); } } } } class PopulateApplicationInformation implements Serializable { private static final long serialVersionUID = -6378722506474391605L; String appName; String nbOfReleases; String nbOfEnvironments; PopulateApplicationInformation(String appName, String nbOfReleases, String nbOfEnvironments) { this.appName = appName; this.nbOfReleases = nbOfReleases; this.nbOfEnvironments = nbOfEnvironments; } public String getAppName() { return appName; } public String getNbOfReleases() { return nbOfReleases; } public String getNbOfEnvironments() { return nbOfEnvironments; } }