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