Multiple PNFs with same ModelInfo but different instance name not able to be instantiated
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / validation / UserParamsValidation.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.so.apihandlerinfra.validation;
23
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Optional;
30 import java.util.Set;
31 import org.apache.commons.lang3.StringUtils;
32 import org.onap.so.apihandlerinfra.Action;
33 import org.onap.so.apihandlerinfra.Actions;
34 import org.onap.so.exceptions.ValidationException;
35 import org.onap.so.serviceinstancebeans.ModelInfo;
36 import org.onap.so.serviceinstancebeans.Networks;
37 import org.onap.so.serviceinstancebeans.Pnfs;
38 import org.onap.so.serviceinstancebeans.Service;
39 import org.onap.so.serviceinstancebeans.VfModules;
40 import org.onap.so.serviceinstancebeans.Vnfs;
41
42 public class UserParamsValidation implements ValidationRule {
43     @Override
44     public ValidationInformation validate(ValidationInformation info) throws ValidationException {
45         Service validate = info.getUserParams();
46         if (validate.getModelInfo() == null) {
47             throw new ValidationException("modelInfo in userParams", true);
48         } else if (validate.getModelInfo().getModelType() == null) {
49             throw new ValidationException("modelType in userParams service modelInfo", true);
50         } else if (validate.getModelInfo().getModelVersionId() == null) {
51             throw new ValidationException("modelVersionId in userParams service modelInfo", true);
52         }
53         modelInfoValidation(info.getSir().getRequestDetails().getModelInfo(), validate.getModelInfo());
54         if (validate.getInstanceName() != null && info.getRequestInfo().getInstanceName() != null) {
55             instanceNameValidation(info, validate);
56         }
57
58         Actions action = info.getAction();
59         Map<String, Set<String>> vnfCustomIdToInstanceNames = new HashMap<>();
60         Map<String, Set<String>> vfModuleCustomIdToInstanceNames = new HashMap<>();
61         for (Vnfs vnf : validate.getResources().getVnfs()) {
62             if (vnf.getModelInfo() == null) {
63                 throw new ValidationException("modelInfo in userParams vnf resources", true);
64             } else if (vnf.getModelInfo().getModelCustomizationId() == null) {
65                 throw new ValidationException("modelCustomizationId in userParams vnf resources", true);
66             } else if (vnf.getModelInfo().getModelVersionId() == null) {
67                 throw new ValidationException("modelVersionId in userParams vnf resources", true);
68             }
69             if (vnf.getCloudConfiguration() == null) {
70                 throw new ValidationException("cloudConfiguration in userParams vnf resources", true);
71             }
72             if (action == Action.createInstance || action == Action.assignInstance) {
73                 if (vnf.getPlatform() == null) {
74                     throw new ValidationException("platform in userParams vnf resources", true);
75                 }
76                 if (vnf.getProductFamilyId() == null) {
77                     throw new ValidationException("productFamilyId in userParams vnf resources", true);
78                 }
79             }
80             if (vnf.getPlatform() != null && vnf.getPlatform().getPlatformName() == null) {
81                 throw new ValidationException("platformName in userParams vnf resources", true);
82             }
83
84             String vnfCustomizationId = vnf.getModelInfo().getModelCustomizationId();
85             vnfCustomIdToInstanceNames.putIfAbsent(vnfCustomizationId, new HashSet<>());
86             String vnfInstanceName = StringUtils.defaultString(vnf.getInstanceName());
87             Set<String> vnfVisitedInstanceNames = vnfCustomIdToInstanceNames.get(vnfCustomizationId);
88             if (!vnfVisitedInstanceNames.add(vnfInstanceName)) {
89                 throw new ValidationException(
90                         "instanceName: same instanceName with same modelCustomizationId in userParams vnf resources",
91                         true);
92             }
93             if (vnf.getVfModules().isEmpty()) {
94                 throw new ValidationException("vfModules in userParams vnf resources", true);
95             }
96
97             for (VfModules vfModule : vnf.getVfModules()) {
98                 if (vfModule.getModelInfo() == null) {
99                     throw new ValidationException("modelInfo in userParams vfModules resources", true);
100                 } else if (vfModule.getModelInfo().getModelCustomizationId() == null) {
101                     throw new ValidationException("modelCustomizationId in userParams vfModule resources", true);
102                 } else if (vfModule.getModelInfo().getModelVersionId() == null) {
103                     throw new ValidationException("modelVersionId in userParams vfModule resources", true);
104                 }
105
106                 String vfModulecustomizationId = vfModule.getModelInfo().getModelCustomizationId();
107                 vfModuleCustomIdToInstanceNames.putIfAbsent(vfModulecustomizationId, new HashSet<>());
108                 String vfModuleInstanceName = StringUtils.defaultString(vfModule.getInstanceName());
109                 Set<String> vfModuleVisitedInstanceNames = vfModuleCustomIdToInstanceNames.get(vfModulecustomizationId);
110                 if (!vfModuleVisitedInstanceNames.add(vfModuleInstanceName)) {
111                     throw new ValidationException(
112                             "instanceName: same instanceName with same modelCustomizationId in userParams vfModule resources",
113                             true);
114                 }
115             }
116         }
117         validateDuplicateInstanceNames(vnfCustomIdToInstanceNames, "vnf");
118         validateDuplicateInstanceNames(vfModuleCustomIdToInstanceNames, "vfModule");
119
120         Map<String, Set<String>> pnfCustomIdToInstanceNames = new HashMap<>();
121
122         for (Pnfs pnf : validate.getResources().getPnfs()) {
123             if (pnf.getModelInfo() == null) {
124                 throw new ValidationException("modelInfo in userParams pnf resources", true);
125             } else if (pnf.getModelInfo().getModelCustomizationId() == null) {
126                 throw new ValidationException("modelCustomizationId in userParams pnf resources", true);
127             } else if (pnf.getModelInfo().getModelVersionId() == null) {
128                 throw new ValidationException("modelVersionId in userParams pnf resources", true);
129             }
130             String pnfCustomizationId = pnf.getModelInfo().getModelCustomizationId();
131             pnfCustomIdToInstanceNames.putIfAbsent(pnfCustomizationId, new HashSet<>());
132             String pnfInstanceName = StringUtils.defaultString(pnf.getInstanceName());
133             Set<String> pnfVisitedInstanceNames = pnfCustomIdToInstanceNames.get(pnfCustomizationId);
134             if (!pnfVisitedInstanceNames.add(pnfInstanceName)) {
135                 throw new ValidationException(
136                         "instanceName: same instanceName with same modelCustomizationId in userParams pnf resources",
137                         true);
138             }
139         }
140
141         validateDuplicateInstanceNames(pnfCustomIdToInstanceNames, "pnf");
142
143         List<Networks> validateNetworks = new ArrayList<>();
144         validateNetworks = validate.getResources().getNetworks();
145         if (validateNetworks != null) {
146             for (Networks networks : validateNetworks) {
147                 if (networks.getModelInfo() == null) {
148                     throw new ValidationException("modelInfo in userParams network resources", true);
149                 } else if (networks.getModelInfo().getModelCustomizationId() == null) {
150                     throw new ValidationException("modelCustomizationId in userParams network resources", true);
151                 } else if (networks.getModelInfo().getModelVersionId() == null) {
152                     throw new ValidationException("modelVersionId in userParams network resources", true);
153                 }
154                 if (networks.getCloudConfiguration() == null) {
155                     throw new ValidationException("cloudConfiguration in userParams network resources", true);
156                 }
157             }
158         }
159         return info;
160     }
161
162     public void instanceNameValidation(ValidationInformation info, Service validate) throws ValidationException {
163         if (!info.getRequestInfo().getInstanceName().equals(validate.getInstanceName())) {
164             throw new ValidationException("instanceName in requestInfo", "instanceName in userParams service");
165         }
166     }
167
168     public void modelInfoValidation(ModelInfo info, ModelInfo userParamInfo) throws ValidationException {
169         if (!info.getModelType().equals(userParamInfo.getModelType())) {
170             throw new ValidationException("modelType in modelInfo", "modelType in userParams service");
171         }
172         if ((info.getModelInvariantId() != null && userParamInfo.getModelInvariantId() != null)
173                 && (!info.getModelInvariantId().equals(userParamInfo.getModelInvariantId()))) {
174             throw new ValidationException("modelInvariantId in modelInfo", "modelInvariantId in userParams service");
175         }
176         if (!info.getModelVersionId().equals(userParamInfo.getModelVersionId())) {
177             throw new ValidationException("modelVersionId in modelInfo", "modelVersionId in userParams service");
178         }
179         if ((info.getModelName() != null && userParamInfo.getModelName() != null)
180                 && (!info.getModelName().equals(userParamInfo.getModelName()))) {
181             throw new ValidationException("modelName in modelInfo", "modelName in userParams service");
182         }
183         if ((info.getModelVersion() != null && userParamInfo.getModelVersion() != null)
184                 && (!info.getModelVersion().equals(userParamInfo.getModelVersion()))) {
185             throw new ValidationException("modelVersion in modelInfo", "modelVersion in userParams service");
186         }
187         if ((info.getModelCustomizationId() != null && userParamInfo.getModelCustomizationId() != null)
188                 && (!info.getModelCustomizationId().equals(userParamInfo.getModelCustomizationId()))) {
189             throw new ValidationException("modelCustomizationId in modelInfo",
190                     "modelCustomizationId in userParams service");
191         }
192     }
193
194     private void validateDuplicateInstanceNames(Map<String, Set<String>> duplicateValidator, String type)
195             throws ValidationException {
196         Set<String> allInstanceNames = new HashSet<>();
197         for (Map.Entry<String, Set<String>> entry : duplicateValidator.entrySet()) {
198             Set<String> instanceNames = entry.getValue();
199             if (instanceNames.size() > 1 && instanceNames.contains(""))
200                 throw new ValidationException(String.format(
201                         "instanceName: instanceName is missing or empty with same modelCustomizationId in userParams %s resources",
202                         type), true);
203
204             for (String instanceName : instanceNames) {
205                 if (!instanceName.isBlank() && !allInstanceNames.add(instanceName)) {
206                     throw new ValidationException(String.format(
207                             "instanceName: same instanceName but different modelCustomizationId (instanceName should be unique)  in userParams %s resources",
208                             type), true);
209                 }
210             }
211         }
212     }
213 }