Implant vid-app-common org.onap.vid.job (main and test)
[vid.git] / vid-app-common / src / main / java / org / onap / vid / asdc / parser / ToscaParserImpl2.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.vid.asdc.parser;
22
23 import org.apache.commons.collections.CollectionUtils;
24 import org.apache.commons.lang3.StringUtils;
25 import org.apache.commons.lang3.tuple.Pair;
26 import org.jetbrains.annotations.Nullable;
27 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
28 import org.onap.sdc.tosca.parser.enums.FilterType;
29 import org.onap.sdc.tosca.parser.enums.SdcTypes;
30 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
31 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
32 import org.onap.sdc.toscaparser.api.Group;
33 import org.onap.sdc.toscaparser.api.*;
34 import org.onap.sdc.toscaparser.api.parameters.Input;
35 import org.onap.vid.asdc.beans.Service;
36 import org.onap.vid.model.*;
37
38 import java.nio.file.Path;
39 import java.util.*;
40
41 import static java.util.stream.Collectors.toList;
42 import static java.util.stream.Collectors.toMap;
43 import static org.onap.vid.asdc.parser.ToscaParserImpl2.Constants.VF_MODULE_LABEL;
44
45 public class ToscaParserImpl2 {
46
47
48     private final VidNotionsBuilder vidNotionsBuilder;
49
50     public class Constants {
51         public static final String UUID = "UUID";
52         public static final String DESCRIPTION = "description";
53         public static final String SERVICE_TYPE = "serviceType";
54         public static final String SERVICE_ROLE = "serviceRole";
55         public static final String ECOMP_GENERATED_NAMING = "ecompGeneratedNaming";
56
57         public static final String CUSTOMIZATION_UUID = "customizationUUID";
58         public static final String VF_MODULE_MODEL_VERSION = "vfModuleModelVersion";
59         public static final String VF_MODULE_MODEL_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID";
60         public static final String VOLUME_GROUP = "volume_group";
61         public static final String VF_MODULE_MODEL_INVARIANT_UUID = "vfModuleModelInvariantUUID";
62         public static final String VF_MODULE_MODEL_UUID = "vfModuleModelUUID";
63         public static final String INVARIANT_UUID = "invariantUUID";
64         public static final String VERSION = "version";
65         public static final String NAME = "name";
66         public static final String CATEGORY = "category";
67         public static final String VF_MODULE_MODEL_NAME = "vfModuleModelName";
68         public static final String GET_INPUT = "get_input";
69         public static final String TYPE = "type";
70         public static final String QUANTITY = "quantity";
71
72         public static final String INSTANTIATION_TYPE = "instantiationType";
73         //instantiation type
74         public static final String BOTH = "Both";
75         public static final String MACRO = "Macro";
76         public static final String A_LA_CARTE = "A-La-Carte";
77         public static final String CLIENT_CONFIG = "ClientConfig";
78
79         //service role
80         public static final String GROUPING = "GROUPING";
81
82         //group properties
83         public static final String MIN_VF_MODULE_INSTANCES = "min_vf_module_instances";
84         public static final String MAX_VF_MODULE_INSTANCES = "max_vf_module_instances";
85         public static final String INITIAL_COUNT = "initial_count";
86         public static final String VF_MODULE_LABEL = "vf_module_label";
87         public static final String VF_MODULE_TYPE = "vf_module_type";
88
89         //collection resource properties
90         public static final String SUBCATEGORY = "subcategory";
91         public static final String RESOURCE_VENDOR = "resourceVendor";
92         public static final String RESOURCE_VENDOR_RELEASE = "resourceVendorRelease";
93         public static final String RESOURCE_VENDOR_MODEL_NUMBER = "resourceVendorModelNumber";
94         public static final String ORG_OPENECOMP_GROUPS_NETWORK_COLLECTION = "org.openecomp.groups.NetworkCollection";
95         public static final String NETWORK_COLLECTION_FUNCTION = "network_collection_function";
96         public static final String NETWORK_COLLECTION_DESCRIPTION = "network_collection_description";
97
98         //vfc instance group properties
99         public static final String VFC_INSTANCE_GROUP_TYPE = "org.openecomp.groups.VfcInstanceGroup";
100         public static final String VFC_PARENT_PORT_ROLE = "vfc_parent_port_role";
101         public static final String SUBINTERFACE_ROLE = "subinterface_role";
102         public static final String VFC_INSTANCE_GROUP_FUNCTION = "vfc_instance_group_function";
103
104         public static final String FABRIC_CONFIGURATION_TYPE = "org.openecomp.nodes.FabricConfiguration";
105
106         public static final String RESOURCE_GROUP_TYPE = "org.openecomp.groups.ResourceInstanceGroup";
107         public static final String RESOURCE_GROUP_CONTAINED_TYPE = "contained_resource_type";
108
109         public static final String VNF_GROUP = "VnfGroup";
110
111         public static final String VRF_NODE_TYPE = "org.openecomp.nodes.VRFEntry";
112
113         public static final String PORT_MIRRORING_CONFIGURATION_NODE_TYPE = "org.openecomp.nodes.PortMirroringConfiguration";
114
115         public static final String PORT_MIRRORING_CONFIGURATION_BY_POLICY_NODE_TYPE = "org.openecomp.nodes.PortMirroringConfigurationByPolicy";
116
117         public static final String NAMING_POLICY_TYPE = "org.openecomp.policies.External";
118
119         public static final String SCALING_POLICY_TYPE = "org.openecomp.policies.scaling.Fixed";
120
121         public static final String ECOMP_GENERATED_NAMING_PROPERTY = "ecomp_generated_naming";
122     }
123
124     public ToscaParserImpl2(VidNotionsBuilder vidNotionsBuilder) {
125         this.vidNotionsBuilder = vidNotionsBuilder;
126     }
127
128     public ServiceModel makeServiceModel(Path path, Service asdcServiceMetadata) throws SdcToscaParserException {
129         ServiceModel serviceModel = new ServiceModel();
130         ISdcCsarHelper sdcCsarHelper = getSdcCsarHelper(path);
131         List<String> policiesTargets = extractNamingPoliciesTargets(sdcCsarHelper);
132         Map<String, Integer> scalingPolicies = extractScalingPolicyOfGroup(sdcCsarHelper);
133
134         serviceModel.setService(extractServiceFromCsar(asdcServiceMetadata, sdcCsarHelper));
135         serviceModel.setVolumeGroups(extractVolumeGroups(sdcCsarHelper));
136         serviceModel.setVfModules(extractVfModuleFromCsar(sdcCsarHelper));
137         serviceModel.setVnfs(extractVnfsFromCsar(sdcCsarHelper, policiesTargets));
138         serviceModel.setConfigurations(extractPortMirroringConfigFromCsar(sdcCsarHelper, policiesTargets));
139         serviceModel.setServiceProxies(extractServiceProxyFromCsar(sdcCsarHelper, policiesTargets));
140         serviceModel.setNetworks(extractNetworksFromCsar(sdcCsarHelper, policiesTargets));
141         serviceModel.setPnfs(extractPnfsFromCsar(sdcCsarHelper, policiesTargets));
142         serviceModel.setCollectionResources(extractCRFromCsar(sdcCsarHelper, policiesTargets));
143         serviceModel.setFabricConfigurations(extractFabricConfigFromCsar(sdcCsarHelper, policiesTargets));
144         serviceModel.setVnfGroups(extractVnfGroupsFromCsar(sdcCsarHelper, policiesTargets, scalingPolicies));
145         serviceModel.setVrfs(extractVrfsFromCsar(sdcCsarHelper, policiesTargets));
146         serviceModel.getService().setVidNotions(vidNotionsBuilder.buildVidNotions(sdcCsarHelper, serviceModel));
147         return serviceModel;
148     }
149
150     public ISdcCsarHelper getSdcCsarHelper(Path path) throws SdcToscaParserException {
151         SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
152         return factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false);
153     }
154
155     private org.onap.vid.model.Service extractServiceFromCsar(Service asdcServiceMetadata, ISdcCsarHelper csarHelper) {
156         org.onap.vid.model.Service service = new org.onap.vid.model.Service();
157
158         service.setName(csarHelper.getServiceMetadata().getValue(Constants.NAME));
159         service.setCategory(csarHelper.getServiceMetadata().getValue(Constants.CATEGORY));
160         service.setInvariantUuid(csarHelper.getServiceMetadata().getValue(Constants.INVARIANT_UUID));
161         service.setUuid(csarHelper.getServiceMetadata().getValue(Constants.UUID));
162         service.setVersion(asdcServiceMetadata.getVersion());
163         service.setDescription(csarHelper.getServiceMetadata().getValue(Constants.DESCRIPTION));
164         service.setInputs(inputsListToInputsMap(csarHelper.getInputsWithAnnotations()));
165         service.setServiceEcompNaming(isUserProvidingServiceNameOptional(csarHelper));
166         service.setServiceType(csarHelper.getServiceMetadata().getValue(Constants.SERVICE_TYPE));
167         service.setServiceRole(csarHelper.getServiceMetadata().getValue(Constants.SERVICE_ROLE));
168         service.setInstantiationType(validateInstantiationType(csarHelper));
169         return service;
170     }
171
172     private String isUserProvidingServiceNameOptional(ISdcCsarHelper csarHelper) {
173         return ToscaNamingPolicy.isUserProvidingServiceNameOptional(csarHelper);
174     }
175
176     private Map<String, CR> extractCRFromCsar(ISdcCsarHelper sdcCsarHelper, List<String> policiesTargets) {
177         List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
178         Map<String, CR> collectionResourceMap = new HashMap<>();
179
180         for (NodeTemplate nodeTemplate : nodeTemplates) {
181             if ( nodeTemplate.getMetaData().getValue(Constants.TYPE).equals(SdcTypes.CR.getValue()) ) {
182                 CR cr = new CR();
183                 populateCrFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr, policiesTargets);
184                 collectionResourceMap.put(nodeTemplate.getName(), cr);
185             }
186         }
187
188         return collectionResourceMap;
189     }
190
191     private Map<String, Node> extractFabricConfigFromCsar(ISdcCsarHelper sdcCsarHelper, List<String> policiesTargets) {
192         List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
193         Map<String, Node> fabricConfiguration = new HashMap<>();
194
195         for (NodeTemplate nodeTemplate : nodeTemplates) {
196             List<NodeTemplate> nodeTemplateChildren = sdcCsarHelper.getNodeTemplateChildren(nodeTemplate);
197             for (NodeTemplate nodeTemplateChild : nodeTemplateChildren) {
198                 if ( nodeTemplateChild.getType().equals(Constants.FABRIC_CONFIGURATION_TYPE) ) {
199                     Node node = new Node();
200                     fabricConfiguration.put(nodeTemplateChild.getName(), populateNodeFromNodeTemplate(nodeTemplateChild, sdcCsarHelper, node, policiesTargets));
201                 }
202             }
203
204         }
205         return fabricConfiguration;
206     }
207
208
209     private void populateCrFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper sdcCsarHelper, CR cr, List<String> policiesTargets) {
210         populateNodeFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr, policiesTargets);
211         cr.setCustomizationUUID(nodeTemplate.getMetaData().getValue(Constants.CUSTOMIZATION_UUID));
212         cr.setCategory(nodeTemplate.getMetaData().getValue(Constants.CATEGORY));
213         cr.setSubcategory(nodeTemplate.getMetaData().getValue(Constants.SUBCATEGORY));
214         cr.setResourceVendor(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR));
215         cr.setResourceVendorRelease(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_RELEASE));
216         cr.setResourceVendorModelNumber(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_MODEL_NUMBER));
217         cr.setNetworksCollection(getNetworksCollectionMapFromGroupsList(sdcCsarHelper, nodeTemplate));
218     }
219
220     private Map<String, NetworkCollection> getNetworksCollectionMapFromGroupsList(ISdcCsarHelper sdcCsarHelper, NodeTemplate nodeTemplate) {
221         List<Group> groups = sdcCsarHelper.getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, Constants.ORG_OPENECOMP_GROUPS_NETWORK_COLLECTION);
222         Map<String, NetworkCollection> networksCollectionMap = new HashMap<>();
223         for (Group group : groups) {
224             networksCollectionMap.put(group.getName(), populateCollectionNetworkFromGroup(group, nodeTemplate));
225         }
226         return networksCollectionMap;
227     }
228
229     private NetworkCollection populateCollectionNetworkFromGroup(Group group, NodeTemplate nodeTemplate) {
230         NetworkCollection networkCollection = new NetworkCollection();
231         networkCollection.setUuid(group.getMetadata().getValue(Constants.UUID));
232         networkCollection.setInvariantUuid(group.getMetadata().getValue(Constants.INVARIANT_UUID));
233         networkCollection.setVersion(group.getMetadata().getValue(Constants.VERSION));
234         networkCollection.setName(group.getMetadata().getValue(Constants.NAME));
235         extractPropertiesOfCollectionNetworkFromCsar(group, nodeTemplate, networkCollection);
236
237         return networkCollection;
238     }
239
240     private void extractPropertiesOfCollectionNetworkFromCsar(Group group, NodeTemplate nodeTemplate, NetworkCollection networkCollection) {
241         LinkedHashMap<String, Property> properties = group.getProperties();
242         Map<String, Property> nodeTemplateProperties = nodeTemplate.getProperties();
243
244         String networkCollectionFunction = (String) ((Map) (properties.get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT);
245         String networkCollectionDescription = (String) ((Map) (properties.get(Constants.NETWORK_COLLECTION_DESCRIPTION).getValue())).get(Constants.GET_INPUT);
246
247         networkCollection.getNetworkCollectionProperties().setNetworkCollectionDescription((String) nodeTemplateProperties.get(networkCollectionDescription).getValue());
248         networkCollection.getNetworkCollectionProperties().setNetworkCollectionFunction((String) nodeTemplateProperties.get(networkCollectionFunction).getValue());
249     }
250
251
252     private Map<String, VNF> extractVnfsFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
253         List<NodeTemplate> nodeTemplates = csarHelper.getServiceVfList();
254         Map<String, VNF> vnfsMaps = new HashMap<>();
255
256         for (NodeTemplate nodeTemplate : nodeTemplates) {
257             VNF vnf = new VNF();
258             populateNodeFromNodeTemplate(nodeTemplate, csarHelper, vnf, policiesTargets);
259             vnf.setModelCustomizationName(nodeTemplate.getName());
260             vnf.setVfModules(getVfModulesFromVF(csarHelper, vnf.getCustomizationUuid()));
261             vnf.setVolumeGroups(getVolumeGroupsFromVF(csarHelper, vnf.getCustomizationUuid()));
262             vnf.setVfcInstanceGroups(getVfcInstanceGroup(csarHelper, nodeTemplate));
263             if ("true".equals(ToscaNamingPolicy.getEcompNamingValueForNode(nodeTemplate, "nf_naming"))) {
264                 setEcompNamingProperty(vnf.getProperties(), "true");
265             }
266             vnfsMaps.put(nodeTemplate.getName(), vnf);
267         }
268         return vnfsMaps;
269     }
270
271     private Map<String, VfcInstanceGroup> getVfcInstanceGroup(ISdcCsarHelper csarHelper, NodeTemplate nodeTemplate) {
272         List<Group> vfcList = csarHelper.getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, Constants.VFC_INSTANCE_GROUP_TYPE);
273         return vfcList.stream()
274                 .collect(toMap(Group::getName, group -> populateVfcInstanceGroupFromGroup(group, nodeTemplate)));
275     }
276
277     private VfcInstanceGroup populateVfcInstanceGroupFromGroup(Group group, NodeTemplate nodeTemplate) {
278         VfcInstanceGroup vfcInstanceGroup = new VfcInstanceGroup();
279         vfcInstanceGroup.setUuid(group.getMetadata().getValue(Constants.UUID));
280         vfcInstanceGroup.setInvariantUuid(group.getMetadata().getValue(Constants.INVARIANT_UUID));
281         vfcInstanceGroup.setVersion(group.getMetadata().getValue(Constants.VERSION));
282         vfcInstanceGroup.setName(group.getMetadata().getValue(Constants.NAME));
283         vfcInstanceGroup.setVfcInstanceGroupProperties(getVfcPropertiesFromGroup(nodeTemplate, group));
284
285         return vfcInstanceGroup;
286
287     }
288
289     private VfcInstanceGroupProperties getVfcPropertiesFromGroup(NodeTemplate nodeTemplate, Group group) {
290         VfcInstanceGroupProperties vfcInstanceGroupProperties = new VfcInstanceGroupProperties();
291         vfcInstanceGroupProperties.setVfcParentPortRole((String) group.getProperties().get(Constants.VFC_PARENT_PORT_ROLE).getValue());
292         vfcInstanceGroupProperties.setSubinterfaceRole((String) group.getProperties().get(Constants.SUBINTERFACE_ROLE).getValue());
293
294         String networkCollectionFunction = (String) ((Map) (group.getProperties().get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT);
295         String vfcInstanceGroupFunction = (String) ((Map) (group.getProperties().get(Constants.VFC_INSTANCE_GROUP_FUNCTION).getValue())).get(Constants.GET_INPUT);
296
297         if ( nodeTemplate.getProperties().get(networkCollectionFunction) != null )
298             vfcInstanceGroupProperties.setNetworkCollectionFunction((String) nodeTemplate.getProperties().get(networkCollectionFunction).getValue());
299         if ( nodeTemplate.getProperties().get(vfcInstanceGroupFunction) != null )
300             vfcInstanceGroupProperties.setVfcInstanceGroupFunction((String) nodeTemplate.getProperties().get(vfcInstanceGroupFunction).getValue());
301
302         return vfcInstanceGroupProperties;
303     }
304
305     private Map<String, PortMirroringConfig> extractPortMirroringConfigFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
306         List<NodeTemplate> nodeTemplates = csarHelper.getServiceNodeTemplatesByType(Constants.PORT_MIRRORING_CONFIGURATION_NODE_TYPE);
307         nodeTemplates.addAll(csarHelper.getServiceNodeTemplatesByType(Constants.PORT_MIRRORING_CONFIGURATION_BY_POLICY_NODE_TYPE));
308         Map<String, PortMirroringConfig> configMaps = new HashMap<>();
309
310         for (NodeTemplate nodeTemplate : nodeTemplates) {
311             PortMirroringConfig pmConfig = new PortMirroringConfig();
312             populateNodeFromNodeTemplate(nodeTemplate, csarHelper, pmConfig, policiesTargets);
313
314             pmConfig.setModelCustomizationName(nodeTemplate.getName());
315             pmConfig.setRequirementAssignments(nodeTemplate.getRequirements());
316             setSourceAndCollectorProxyNodes(csarHelper, pmConfig, nodeTemplate);
317
318             configMaps.put(nodeTemplate.getName(), pmConfig);
319         }
320
321         return configMaps;
322     }
323
324     private Map<String, ServiceProxy> extractServiceProxyFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
325         List<NodeTemplate> nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.SERVICE_PROXY);
326         return nodeTemplates.stream()
327                 .collect(toMap(NodeTemplate::getName, node -> getServiceProxyFromNodeTemplate(node, csarHelper, policiesTargets)));
328     }
329
330     private ServiceProxy getServiceProxyFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, List<String> policiesTargets) {
331         ServiceProxy serviceProxy = new ServiceProxy();
332         populateNodeFromNodeTemplate(nodeTemplate, csarHelper, serviceProxy, policiesTargets);
333
334         Map<String, String> metadata = nodeTemplate.getMetaData().getAllProperties();
335         serviceProxy.setSourceModelUuid(metadata.get("sourceModelUuid"));
336         serviceProxy.setSourceModelInvariant(metadata.get("sourceModelInvariant"));
337         serviceProxy.setSourceModelName(metadata.get("sourceModelName"));
338
339         return serviceProxy;
340     }
341
342     private void setSourceAndCollectorProxyNodes(ISdcCsarHelper csarHelper, PortMirroringConfig portMirroringConfig, NodeTemplate nodeTemplate) {
343         RequirementAssignments requirementAssignments = nodeTemplate.getRequirements();
344
345         List<String> sourceNodes = getRequirementsNodesNames(requirementAssignments.getRequirementsByName("source").getAll());
346         portMirroringConfig.setSourceNodes(sourceNodes);
347
348         List<String> collectorNodes = getRequirementsNodesNames(requirementAssignments.getRequirementsByName("collector").getAll());
349         if ( !collectorNodes.isEmpty() ) { // vprobe
350             portMirroringConfig.setCollectorNodes(collectorNodes);
351         } else { // pprobe - configuration by policy
352             String collectorNodeName = csarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "collector_node");
353             if ( collectorNodeName != null ) {
354                 portMirroringConfig.setCollectorNodes(Arrays.asList(collectorNodeName));
355                 portMirroringConfig.setConfigurationByPolicy(true);
356             }
357         }
358     }
359
360     private List<String> getRequirementsNodesNames(List<RequirementAssignment> requirements) {
361
362         List<String> requirementsNodes = new ArrayList<>();
363         if ( !CollectionUtils.isEmpty(requirements) ) {
364             requirementsNodes = requirements.stream().map(RequirementAssignment::getNodeTemplateName).collect(toList());
365         }
366
367         return requirementsNodes;
368     }
369
370     Map<String, VfModule> getVfModulesFromVF(ISdcCsarHelper csarHelper, String vfUuid) {
371         List<Group> vfModulesByVf = csarHelper.getVfModulesByVf(vfUuid);
372         return vfModulesByVf.stream()
373                 .collect(toMap(Group::getName, group -> populateVfModuleFromGroup(group, csarHelper)));
374     }
375
376     Map<String, VolumeGroup> getVolumeGroupsFromVF(ISdcCsarHelper csarHelper, String vfCustomizationUuid) {
377         List<Group> vfModulesByVf = csarHelper.getVfModulesByVf(vfCustomizationUuid);
378         return vfModulesByVf.stream()
379                 .filter((group -> isVolumeGroup(group)))
380                 .collect(toMap(Group::getName, group -> populateVolumeGroupFromGroup(group, csarHelper)));
381     }
382
383     private static Boolean isVolumeGroup(Group group) {
384         return Boolean.valueOf(group.getPropertyValue(Constants.VOLUME_GROUP).toString());
385     }
386
387     private Map<String, Network> extractNetworksFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
388         List<NodeTemplate> nodeTemplates = csarHelper.getServiceVlList();
389         Map<String, Network> networksMap = new HashMap<>();
390
391         for (NodeTemplate nodeTemplate : nodeTemplates) {
392             Network newNetwork = new Network();
393             populateNodeFromNodeTemplate(nodeTemplate, csarHelper, newNetwork, policiesTargets);
394             newNetwork.setModelCustomizationName(nodeTemplate.getName());
395             if ("true".equals(ToscaNamingPolicy.getEcompNamingValueForNode(nodeTemplate, "exVL_naming"))) {
396                 setEcompNamingProperty(newNetwork.getProperties(), "true");
397             }
398             networksMap.put(nodeTemplate.getName(), newNetwork);
399         }
400         return networksMap;
401     }
402
403     private Map<String, Node> extractPnfsFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
404         List<NodeTemplate> nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.PNF);
405         return this.extractNodesFromCsar(csarHelper,policiesTargets,nodeTemplates);
406     }
407
408     private Map<String, VfModule> extractVfModuleFromCsar(ISdcCsarHelper csarHelper) {
409         List<NodeTemplate> serviceVfList = csarHelper.getServiceVfList();
410         HashMap<String, VfModule> vfModuleHashMap = new HashMap<>();
411
412         for (NodeTemplate nodeTemplate : serviceVfList) {
413             Map<String, VfModule> nodeTemplateVfModule =
414                     getVfModulesFromVF(csarHelper, nodeTemplate.getMetaData().getValue(Constants.CUSTOMIZATION_UUID));
415             vfModuleHashMap.putAll(nodeTemplateVfModule);
416         }
417         return vfModuleHashMap;
418     }
419
420     private Map<String, VolumeGroup> extractVolumeGroups(ISdcCsarHelper csarHelper) {
421         HashMap<String, VolumeGroup> volumeGroupHashMap = new HashMap<>();
422         for (NodeTemplate nodeTemplate : csarHelper.getServiceVfList()) {
423             Map<String, VolumeGroup> nodeTemplateVolumeGroups =
424                     getVolumeGroupsFromVF(csarHelper, csarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
425             volumeGroupHashMap.putAll(nodeTemplateVolumeGroups);
426         }
427         return volumeGroupHashMap;
428     }
429
430     private Map<String, org.onap.vid.asdc.beans.tosca.Input> inputsListToInputsMap(List<org.onap.sdc.toscaparser.api.parameters.Input> inputList) {
431         Map<String, org.onap.vid.asdc.beans.tosca.Input> inputs = new HashMap<>();
432         for (org.onap.sdc.toscaparser.api.parameters.Input input : inputList) {
433             //Set only inputs without annotation to the service level
434             if ( input.getAnnotations() == null )
435                 inputs.put(input.getName(), convertInput(input, new org.onap.vid.asdc.beans.tosca.Input()));
436         }
437         return inputs;
438     }
439
440     private Node populateNodeFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode, List<String> policiesTargets) {
441         newNode.setCustomizationUuid(csarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
442         newNode.setDescription(nodeTemplate.getMetaData().getValue(Constants.DESCRIPTION));
443         newNode.setInvariantUuid(nodeTemplate.getMetaData().getValue(Constants.INVARIANT_UUID));
444         newNode.setUuid(nodeTemplate.getMetaData().getValue(Constants.UUID));
445         newNode.setName(nodeTemplate.getMetaData().getValue(Constants.NAME));
446         newNode.setVersion(nodeTemplate.getMetaData().getValue(Constants.VERSION));
447         newNode.setInputs(extractInputsAndCommandsForNodeTemplate(nodeTemplate, csarHelper, newNode));
448         newNode.setType(nodeTemplate.getMetaData().getValue(Constants.TYPE));
449         Map<String, String> propertiesMap = nodeTemplate.getPropertiesObjects().stream()
450                 .collect(toMap(Property::getName, p -> p.getValue().toString()));
451         setEcompNamingProperty(propertiesMap, String.valueOf(policiesTargets.contains(nodeTemplate.getName())));
452         newNode.setProperties(propertiesMap);
453         return newNode;
454     }
455
456     private VfModule populateVfModuleFromGroup(Group group, ISdcCsarHelper csarHelper) {
457         VfModule vfModule = new VfModule();
458         extractBasicPropertiesForGroup(vfModule, group, csarHelper);
459         vfModule.setVolumeGroupAllowed(isVolumeGroup(group));
460         return vfModule;
461     }
462
463     private VolumeGroup populateVolumeGroupFromGroup(Group group, ISdcCsarHelper csarHelper) {
464         VolumeGroup volumeGroup = new VolumeGroup();
465         extractBasicPropertiesForGroup(volumeGroup, group, csarHelper);
466         return volumeGroup;
467     }
468
469     private void extractBasicPropertiesForGroup(org.onap.vid.model.Group newGroup, Group group, ISdcCsarHelper csarHelper) {
470         newGroup.setDescription(group.getDescription());
471         newGroup.setVersion(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_VERSION));
472         newGroup.setCustomizationUuid(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_CUSTOMIZATION_UUID));
473         newGroup.setModelCustomizationName(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_NAME));
474         newGroup.setName(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_NAME));
475         newGroup.setUuid(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_UUID));
476         newGroup.setInvariantUuid(group.getMetadata().getValue(Constants.VF_MODULE_MODEL_INVARIANT_UUID));
477         newGroup.setProperties(extractVfModuleProperties(group, csarHelper));
478         newGroup.setInputs(extractVfInputsFromCsarByAnnotation(csarHelper, newGroup));
479     }
480
481
482     private Map<String, org.onap.vid.asdc.beans.tosca.Input> extractVfInputsFromCsarByAnnotation(ISdcCsarHelper csarHelper, org.onap.vid.model.Group group) {
483         Map<String, org.onap.vid.asdc.beans.tosca.Input> inputMap = new HashMap<>();
484         if ( group.getProperties().getVfModuleLabel() != null ) {
485             List<Input> inputsList = csarHelper.getInputsWithAnnotations();
486             for (Input input : inputsList) {
487                 extractVfModuleInput(group, inputMap, input);
488             }
489         }
490         return inputMap;
491     }
492
493     private void extractVfModuleInput(org.onap.vid.model.Group group, Map<String, org.onap.vid.asdc.beans.tosca.Input> inputMap, Input input) {
494         if ( input.getAnnotations() != null ) {
495             List<Property> annotationProperties = input.getAnnotations().get("source").getProperties();
496             if ( isInputMatchesToGroup(annotationProperties, group) ) {
497                 final org.onap.vid.asdc.beans.tosca.Input vfModuleInput = new org.onap.vid.asdc.beans.tosca.Input(input, annotationProperties);
498                 if ( vfModuleInput.getInputProperties() != null && vfModuleInput.getInputProperties().getParamName() != null ) {
499                     inputMap.put(vfModuleInput.getInputProperties().getParamName(), vfModuleInput);
500                 } else {
501                     inputMap.put(input.getName(), vfModuleInput);
502                 }
503             }
504         }
505     }
506
507
508     private boolean isInputMatchesToGroup(List<Property> annotationProperties, org.onap.vid.model.Group group) {
509         for (Property property : annotationProperties) {
510             if ( property.getName().equals(VF_MODULE_LABEL) ) {
511                 final Object values = property.getValue();
512                 final String vfModuleLabel = group.getProperties().getVfModuleLabel();
513                 if ( values instanceof List ) {
514                     if ( listContainsAsString((List) values, vfModuleLabel) ) return true;
515                 } else {
516                     return getPropertyValueAsString(property).equals(vfModuleLabel);
517                 }
518             }
519         }
520         return false;
521     }
522
523     private boolean listContainsAsString(List list, String value) {
524         for (Object v : list) {
525             if ( StringUtils.equals(v.toString(), value) ) {
526                 return true;
527             }
528         }
529         return false;
530     }
531
532     public String getPropertyValueAsString(Property property) {
533         return removeSquareBrackets(property.getValue().toString());
534     }
535
536     private String removeSquareBrackets(String stringWithSquareBrackets) {
537         return stringWithSquareBrackets.replaceAll("(^\\[|\\]$)", "");
538     }
539
540     private GroupProperties extractVfModuleProperties(Group group, ISdcCsarHelper csarHelper) {
541         GroupProperties vfModuleProperties = new GroupProperties();
542         if ( csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES) != null )
543             vfModuleProperties.setMinCountInstances((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES));
544         if ( csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES) != null )
545             vfModuleProperties.setMaxCountInstances((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES));
546         if ( csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT) != null )
547             vfModuleProperties.setInitialCount((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT));
548         if ( csarHelper.getGroupPropertyAsObject(group, VF_MODULE_LABEL) != null )
549             vfModuleProperties.setVfModuleLabel((String) csarHelper.getGroupPropertyAsObject(group, VF_MODULE_LABEL));
550         vfModuleProperties.setBaseModule(isModuleTypeIsBaseObjectSafe(csarHelper.getGroupPropertyAsObject(group, Constants.VF_MODULE_TYPE)));
551         return vfModuleProperties;
552     }
553
554
555     public static boolean isModuleTypeIsBaseObjectSafe(@Nullable Object vfModuleTypeValue) {
556         return (vfModuleTypeValue instanceof String) && (isModuleTypeIsBase((String) vfModuleTypeValue));
557     }
558
559     protected static boolean isModuleTypeIsBase(String vfModuleTypeValue) {
560         return "Base".equalsIgnoreCase(vfModuleTypeValue);
561     }
562
563
564     private Map<String, org.onap.vid.asdc.beans.tosca.Input> extractInputsAndCommandsForNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode) {
565         Map<String, org.onap.vid.asdc.beans.tosca.Input> inputMap = new HashMap<>();
566         Map<String, CommandProperty> commandPropertyMap = new HashMap<>();
567
568         List<Input> inputs = csarHelper.getServiceInputs();
569         Map<String, String> properties = csarHelper.filterNodeTemplatePropertiesByValue(nodeTemplate, FilterType.CONTAINS, Constants.GET_INPUT);
570         for (Map.Entry<String, String> property : properties.entrySet()) {
571             String inputKey = property.getValue();
572             String key = extractInputValue(inputKey);
573             for (Input input : inputs) {
574                 if ( input.getName().equals(key) ) {
575                     org.onap.vid.asdc.beans.tosca.Input localInput = new org.onap.vid.asdc.beans.tosca.Input();
576                     localInput = convertInput(input, localInput);
577                     String name = property.getKey();
578                     commandPropertyMap.put(name, extractCommands(name, key));
579                     inputMap.put(name, localInput);
580                 }
581             }
582         }
583         newNode.setCommands(commandPropertyMap);
584         return inputMap;
585     }
586
587     private String extractInputValue(String inputKey) {
588         return inputKey.substring(inputKey.indexOf(':') + 1);
589     }
590
591     private org.onap.vid.asdc.beans.tosca.Input convertInput(Input parserInput, org.onap.vid.asdc.beans.tosca.Input localInput) {
592         localInput.setDefault(parserInput.getDefault());
593         localInput.setDescription(parserInput.getDescription());
594         localInput.setRequired(parserInput.isRequired());
595         localInput.setType(parserInput.getType());
596         localInput.setConstraints(parserInput.getConstraints());
597 //        localInput.setentry_schema()
598         return localInput;
599     }
600
601     private CommandProperty extractCommands(String displayName, String inputName) {
602         CommandProperty commandProperty = new CommandProperty();
603         commandProperty.setDisplayName(displayName);
604         commandProperty.setCommand(Constants.GET_INPUT);
605         commandProperty.setInputName(inputName);
606         return commandProperty;
607     }
608
609     private void setEcompNamingProperty(Map<String, String> propertiesMap, String isUserProvidingVnfNameOptional) {
610         propertiesMap.put(Constants.ECOMP_GENERATED_NAMING_PROPERTY, isUserProvidingVnfNameOptional);
611     }
612
613     private String validateInstantiationType(ISdcCsarHelper csarHelper){
614         String instantiationType = csarHelper.getServiceMetadata().getValue(Constants.INSTANTIATION_TYPE);
615         String validatedInstantiationType = Constants.CLIENT_CONFIG;
616         if(instantiationType != null && !instantiationType.isEmpty()){
617             if(instantiationType.equalsIgnoreCase(Constants.MACRO) || instantiationType.equalsIgnoreCase(Constants.BOTH))
618                 validatedInstantiationType = Constants.MACRO;
619             else if(instantiationType.equalsIgnoreCase(Constants.A_LA_CARTE))
620                 validatedInstantiationType = Constants.A_LA_CARTE;
621         }
622         return validatedInstantiationType;
623     }
624
625     private Map<String, Node> extractVrfsFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets) {
626         List<NodeTemplate> nodeTemplates = csarHelper.getServiceNodeTemplatesByType(Constants.VRF_NODE_TYPE);
627         return this.extractNodesFromCsar(csarHelper,policiesTargets,nodeTemplates);
628     }
629
630     private Map<String, Node> extractNodesFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets, List<NodeTemplate> nodeTemplates){
631         HashMap<String, Node> nodeHashMap = new HashMap<>();
632         for (NodeTemplate nodeTemplate : nodeTemplates) {
633             Node node = new Node();
634             populateNodeFromNodeTemplate(nodeTemplate, csarHelper, node, policiesTargets);
635             nodeHashMap.put(nodeTemplate.getName(), node);
636         }
637         return nodeHashMap;
638     }
639
640     private Map<String, ResourceGroup> extractVnfGroupsFromCsar(ISdcCsarHelper csarHelper, List<String> policiesTargets, Map<String, Integer> scalingPolicies) {
641         List<Group> resourceGroups = csarHelper.getGroupsOfTopologyTemplateByToscaGroupType(Constants.RESOURCE_GROUP_TYPE);
642
643         return resourceGroups.stream()
644                 .filter(group -> group.getProperties().get(Constants.RESOURCE_GROUP_CONTAINED_TYPE).getValue().equals("VF"))
645                 .collect(toMap(Group::getName, group -> parseResourceGroup(group, csarHelper, policiesTargets, scalingPolicies)));
646     }
647
648     private ResourceGroup parseResourceGroup(Group group, ISdcCsarHelper csarHelper, List<String> policiesTargets, Map<String, Integer> scalingPolicies) {
649         return new ResourceGroup(
650                 Constants.VNF_GROUP,
651                 group.getMetadata().getValue(Constants.INVARIANT_UUID),
652                 group.getMetadata().getValue(Constants.UUID),
653                 group.getMetadata().getValue(Constants.VERSION),
654                 group.getMetadata().getValue(Constants.NAME),
655                 group.getMetadata().getValue(Constants.NAME),
656                 getPropertiesOfResourceGroup(group.getProperties(), policiesTargets.contains(group.getName()), scalingPolicies.get(group.getName())),
657                 csarHelper.getGroupMembersFromTopologyTemplate(group.getName()).stream()
658                         .collect(toMap(NodeTemplate::getName, node -> getServiceProxyFromNodeTemplate(node, csarHelper, policiesTargets)))
659         );
660     }
661
662     private Map<String, Object> getPropertiesOfResourceGroup(Map<String, Property> properties, boolean hasPolicyTarget, Integer qty) {
663         Map<String, Object> propertiesMap = properties.entrySet().stream()
664                 .collect(toMap(Map.Entry::getKey, e -> e.getValue().getValue()));
665         propertiesMap.put(Constants.ECOMP_GENERATED_NAMING_PROPERTY, String.valueOf(hasPolicyTarget));
666         if (qty != null)  {
667             propertiesMap.put(Constants.QUANTITY, qty);
668         }
669
670         return propertiesMap;
671     }
672
673     public List<String> extractNamingPoliciesTargets(ISdcCsarHelper csarHelper) {
674         List<Policy> policies = csarHelper.getPoliciesOfTopologyTemplateByToscaPolicyType(Constants.NAMING_POLICY_TYPE);
675         return policies.stream()
676                 .filter(policy -> policy.getProperties().get(Constants.TYPE) != null &&
677                         policy.getProperties().get(Constants.TYPE).getValue() != null &&
678                         StringUtils.equalsIgnoreCase(policy.getProperties().get(Constants.TYPE).getValue().toString(), "naming"))
679                 .flatMap(policy -> policy.getTargets().stream())
680                 .collect(toList());
681     }
682
683     public Map<String, Integer> extractScalingPolicyOfGroup(ISdcCsarHelper csarHelper)  {
684         return csarHelper.getPoliciesOfTopologyTemplateByToscaPolicyType(Constants.SCALING_POLICY_TYPE)
685                 .stream()
686                 .filter(policy -> policy.getProperties().containsKey(Constants.QUANTITY))
687                 .flatMap(policy -> {
688                     Integer qty = Integer.parseInt(policy.getProperties().get(Constants.QUANTITY).getValue().toString());
689                     return policy
690                             .getTargets().stream()
691                             .map(target -> Pair.of(target, qty));
692                 })
693                 .collect(toMap(Pair::getKey, Pair::getValue));
694     }
695 }