/** * 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.deployment.logical.service; import com.francetelecom.clara.cloud.commons.BusinessException; import com.francetelecom.clara.cloud.commons.TechnicalException; import com.francetelecom.clara.cloud.logicalmodel.LogicalDeployment; import com.francetelecom.clara.cloud.logicalmodel.LogicalNodeServiceAssociation; import com.francetelecom.clara.cloud.logicalmodel.LogicalService; import com.francetelecom.clara.cloud.logicalmodel.ProcessingNode; import java.util.ArrayList; import java.util.List; /** * */ public class LogicalDeploymentImportExport { private LogicalDeploymentClonerImpl logicalDeploymentCloner; public String exportDump(LogicalDeployment logicalDeployment) { //when I request to dump as Xml return logicalDeploymentCloner.dumpToXml(logicalDeployment); } public void importDump(LogicalDeployment originalLd, String dump) { LogicalDeployment importedLd = logicalDeploymentCloner.preprocessAndImportDump(dump); renameDuplicatesLogicalItems(originalLd, importedLd); //Note: we can't use a set since Association.equals() only care about ExecNodes and ignore services. // As a result, it'd truncate some services. //Since we're using a list, we might end up with some duplicates we'll have to handle next. List<LogicalNodeServiceAssociation> associations = new ArrayList<>(); collectAndRemoveAssociations(importedLd, associations); removeNodesAndServices(importedLd); addNodesServicesAssociations(originalLd, associations); } private void removeNodesAndServices(LogicalDeployment importedLd) { try { importedLd.removeAllLogicalService(); } catch (BusinessException e) { throw new TechnicalException("Unexpected failed to remove all services: " + e, e); } importedLd.removeAllProcessingNodes(); } private void collectAndRemoveAssociations(LogicalDeployment importedLd, List<LogicalNodeServiceAssociation> associations) { List<LogicalService> logicalServices = new ArrayList<>(importedLd.listLogicalServices()); //clone the list to be able to modify it for (LogicalService logicalService : logicalServices) { while (!logicalService.listLogicalServicesAssociations().isEmpty()) { LogicalNodeServiceAssociation association = logicalService.listLogicalServicesAssociations().get(0); associations.add(association); ProcessingNode executionNode = association.getProcessingNode(); executionNode.removeLogicalServiceUsage(association); } } } protected void addNodesServicesAssociations(LogicalDeployment originalLd, List<LogicalNodeServiceAssociation> associations) { for (LogicalNodeServiceAssociation association : associations) { ProcessingNode executionNode = association.getProcessingNode(); LogicalService service = association.getLogicalService(); try { originalLd.addExecutionNode(executionNode); } catch (Exception e) { //Ignore duplicate exec nodes } try { originalLd.addLogicalService(service); } catch (Exception e) { //Ignore duplicate services } if (!executionNode.listLogicalServices().contains(service)) { executionNode.addLogicalServiceUsage(service, association.getAccessType()); } } } public void setLogicalDeploymentCloner(LogicalDeploymentClonerImpl logicalDeploymentCloner) { this.logicalDeploymentCloner = logicalDeploymentCloner; } public void renameDuplicatesLogicalItems(LogicalDeployment original, LogicalDeployment duplicate) { for (ProcessingNode candidateExecNode : duplicate.listProcessingNodes()) { renameDuplicateExecNode(original, candidateExecNode); } for (LogicalService candidateService : duplicate.listLogicalServices()) { renameDuplicateService(original, candidateService); } } private void renameDuplicateService(LogicalDeployment original, LogicalService candidateService) { boolean isDuplicate; int suffixIndex=2; String originalLabel = candidateService.getLabel(); do { try { original.findLogicalService(candidateService.getLabel()); isDuplicate = true; candidateService.setLabel(originalLabel + "-" + suffixIndex); suffixIndex ++; } catch (IllegalArgumentException e) { isDuplicate = false; } } while(isDuplicate); } private void renameDuplicateExecNode(LogicalDeployment original, ProcessingNode candidateExecNode) { boolean isDuplicate; int suffixIndex=2; String originalLabel = candidateExecNode.getLabel(); do { try { original.findProcessingNode(candidateExecNode.getLabel()); isDuplicate = true; candidateExecNode.setLabel(originalLabel + "-" + suffixIndex); suffixIndex ++; } catch (IllegalArgumentException e) { isDuplicate = false; } } while (isDuplicate); } }