a4fa6be1d8fcf6a17247db7622e06a9223879617
[sdc.git] /
1 /*
2  * Copyright © 2016-2017 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.vendorsoftwareproduct.impl;
18
19 import org.apache.commons.collections4.CollectionUtils;
20 import org.openecomp.sdc.common.errors.CoreException;
21 import org.openecomp.sdc.common.errors.ErrorCode;
22 import org.openecomp.sdc.vendorsoftwareproduct.NetworkManager;
23 import org.openecomp.sdc.vendorsoftwareproduct.NicManager;
24 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
25 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
26 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NetworkEntity;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
30 import org.openecomp.sdc.vendorsoftwareproduct.errors.DeleteNicErrorBuilder;
31 import org.openecomp.sdc.vendorsoftwareproduct.errors.DuplicateNicInComponentErrorBuilder;
32 import org.openecomp.sdc.vendorsoftwareproduct.errors.NicErrorBuilder;
33 import org.openecomp.sdc.vendorsoftwareproduct.errors.NicInternalNetworkErrorBuilder;
34 import org.openecomp.sdc.vendorsoftwareproduct.errors.NicNetworkIdNotAllowedExternalNetworkErrorBuilder;
35 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
36 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManager;
37 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.NetworkType;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.NicCompositionSchemaInput;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
47 import org.openecomp.sdc.versioning.VersioningUtil;
48 import org.openecomp.sdc.versioning.dao.types.Version;
49
50 import java.util.Collection;
51 import java.util.Map;
52 import java.util.stream.Collectors;
53
54 public class NicManagerImpl implements NicManager {
55   private final NicDao nicDao;
56   private final CompositionEntityDataManager compositionEntityDataManager;
57   private final NetworkManager networkManager;
58   private final VendorSoftwareProductInfoDao vspInfoDao;
59
60   public NicManagerImpl(NicDao nicDao,
61                         CompositionEntityDataManager compositionEntityDataManager,
62                         NetworkManager networkManager,
63                         VendorSoftwareProductInfoDao vspInfoDao) {
64     this.nicDao = nicDao;
65     this.compositionEntityDataManager = compositionEntityDataManager;
66     this.networkManager = networkManager;
67     this.vspInfoDao = vspInfoDao;
68   }
69
70   @Override
71   public Collection<NicEntity> listNics(String vspId, Version version, String componentId) {
72     Collection<NicEntity> nics = nicDao.list(new NicEntity(vspId, version, componentId, null));
73
74     if (!nics.isEmpty()) {
75       Map<String, String> networksNameById = listNetworksNameById(vspId, version);
76       nics.forEach(nicEntity -> {
77         Nic nic = nicEntity.getNicCompositionData();
78         nic.setNetworkName(networksNameById.get(nic.getNetworkId()));
79         nicEntity.setNicCompositionData(nic);
80       });
81     }
82     return nics;
83   }
84
85   private Map<String, String> listNetworksNameById(String vspId, Version version) {
86     Collection<NetworkEntity> networks = networkManager.listNetworks(vspId, version);
87     return networks.stream().collect(Collectors.toMap(NetworkEntity::getId,
88         networkEntity -> networkEntity.getNetworkCompositionData().getName()));
89   }
90
91   @Override
92   public NicEntity createNic(NicEntity nic) {
93     NicEntity createdNic;
94     if (!vspInfoDao.isManual(nic.getVspId(), nic.getVersion())) {
95       ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
96           .getAddNicNotSupportedHeatOnboardMethodErrorBuilder();
97       throw new CoreException(onboardingMethodUpdateErrorCode);
98     } else {
99       validateNic(nic);
100       createdNic = compositionEntityDataManager.createNic(nic);
101     }
102     return createdNic;
103   }
104
105
106   private void validateNic(NicEntity nic) {
107     Collection<NicEntity> listNics = listNics(nic.getVspId(), nic.getVersion(), nic
108         .getComponentId());
109     String networkId = nic.getNicCompositionData().getNetworkId();
110     NetworkType networkType = nic.getNicCompositionData().getNetworkType();
111     String networkDescription = nic.getNicCompositionData().getNetworkDescription();
112
113     if (!nic.getNicCompositionData().getName()
114             .matches(VendorSoftwareProductConstants.NAME_PATTERN)) {
115       ErrorCode errorCode = NicErrorBuilder
116               .getNicNameFormatErrorBuilder(VendorSoftwareProductConstants.NAME_PATTERN);
117       throw new CoreException(errorCode);
118     }
119
120     validateNics(nic, listNics);
121
122     if (networkType.equals(NetworkType.Internal)) {
123       validateInternalNetworkType(nic, networkId, networkDescription);
124
125     } else if (networkType.equals(NetworkType.External)
126             && !(networkId == null || networkId.isEmpty())) {
127         final ErrorCode nicNetworkIdNotAllowedExternalNetworkErrorBuilder =
128             new NicNetworkIdNotAllowedExternalNetworkErrorBuilder().build();
129         throw new CoreException(nicNetworkIdNotAllowedExternalNetworkErrorBuilder);
130     }
131   }
132
133   private void validateInternalNetworkType(NicEntity nic, String networkId,
134                                            String networkDescription) {
135     if (!(networkId == null || networkId.isEmpty())) {
136           networkManager.getNetwork(nic.getVspId(), nic.getVersion(), networkId);
137     }
138
139     if (!(networkDescription == null || networkDescription.isEmpty())) {
140       final ErrorCode nicNetworkDescriptionErrorBuilder =
141           NicInternalNetworkErrorBuilder.getNetworkDescriptionInternalNetworkErrorBuilder();
142       throw new CoreException(nicNetworkDescriptionErrorBuilder);
143     }
144   }
145
146   private void validateNics(NicEntity nic, Collection<NicEntity> listNics) {
147     listNics.forEach(nicEntity -> {
148       Nic nicdata = nicEntity.getNicCompositionData();
149       if (nic.getNicCompositionData().getName().equalsIgnoreCase(nicdata.getName())) {
150         final ErrorCode duplicateNicInComponentErrorBuilder =
151             new DuplicateNicInComponentErrorBuilder(nic.getNicCompositionData().getName(),
152                 nic.getComponentId()).build();
153         throw new CoreException(duplicateNicInComponentErrorBuilder);
154       }
155
156     });
157   }
158
159   @Override
160   public CompositionEntityResponse<Nic> getNic(String vspId, Version version, String componentId,
161                                                String nicId) {
162     NicEntity nicEntity = getValidatedNic(vspId, version, componentId, nicId);
163     Nic nic = nicEntity.getNicCompositionData();
164
165     NicCompositionSchemaInput schemaInput = new NicCompositionSchemaInput();
166     schemaInput.setManual(vspInfoDao.isManual(vspId, version));
167     schemaInput.setNic(nic);
168     Map<String, String> networksNameById = listNetworksNameById(vspId, version);
169     nic.setNetworkName(networksNameById.get(nic.getNetworkId()));
170     schemaInput.setNetworkIds(networksNameById.keySet());
171
172     CompositionEntityResponse<Nic> response = new CompositionEntityResponse<>();
173     response.setId(nicId);
174     response.setData(nic);
175     response.setSchema(getNicCompositionSchema(schemaInput));
176     return response;
177   }
178
179
180   private NicEntity getValidatedNic(String vspId, Version version, String componentId,
181                                     String nicId) {
182     NicEntity retrieved = nicDao.get(new NicEntity(vspId, version, componentId, nicId));
183     VersioningUtil
184         .validateEntityExistence(retrieved, new NicEntity(vspId, version, componentId, nicId),
185             VspDetails.ENTITY_TYPE);
186     return retrieved;
187   }
188
189   @Override
190   public void deleteNic(String vspId, Version version, String componentId, String nicId) {
191     if (!vspInfoDao.isManual(vspId, version)) {
192       final ErrorCode deleteNicErrorBuilder =
193           DeleteNicErrorBuilder.getDeleteNicForHeatOnboardedVspErrorBuilder();
194       throw new CoreException(deleteNicErrorBuilder);
195     }
196
197     NicEntity nicEntity = getValidatedNic(vspId, version, componentId, nicId);
198     nicDao.delete(nicEntity);
199   }
200
201   @Override
202   public CompositionEntityValidationData updateNic(NicEntity nic) {
203     NicEntity retrieved =
204         getValidatedNic(nic.getVspId(), nic.getVersion(), nic.getComponentId(), nic.getId());
205
206     NicCompositionSchemaInput schemaInput = new NicCompositionSchemaInput();
207     schemaInput.setManual(vspInfoDao.isManual(nic.getVspId(), nic.getVersion()));
208     schemaInput.setNic(retrieved.getNicCompositionData());
209
210     if (schemaInput.isManual() && !nic.getNicCompositionData().getName()
211             .matches(VendorSoftwareProductConstants.NAME_PATTERN)) {
212       ErrorCode errorCode = NicErrorBuilder
213               .getNicNameFormatErrorBuilder(VendorSoftwareProductConstants.NAME_PATTERN);
214       throw new CoreException(errorCode);
215     }
216
217     CompositionEntityValidationData validationData = compositionEntityDataManager
218         .validateEntity(nic, SchemaTemplateContext.composition, schemaInput);
219     if (CollectionUtils.isEmpty(validationData.getErrors())) {
220       nicDao.update(nic);
221     }
222     return validationData;
223   }
224
225   @Override
226   public QuestionnaireResponse getNicQuestionnaire(String vspId, Version version,
227                                                    String componentId, String nicId) {
228     QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
229     NicEntity nicQuestionnaire = nicDao.getQuestionnaireData(vspId, version, componentId, nicId);
230     VersioningUtil.validateEntityExistence(nicQuestionnaire,
231         new NicEntity(vspId, version, componentId, nicId), VspDetails.ENTITY_TYPE);
232
233     questionnaireResponse.setData(nicQuestionnaire.getQuestionnaireData());
234     questionnaireResponse.setSchema(getNicQuestionnaireSchema(null));
235     return questionnaireResponse;
236   }
237
238   @Override
239   public void updateNicQuestionnaire(String vspId, Version version, String componentId,
240                                      String nicId, String questionnaireData) {
241     getNic(vspId, version, componentId, nicId);
242
243     nicDao.updateQuestionnaireData(vspId, version, componentId, nicId, questionnaireData);
244   }
245
246   protected String getNicQuestionnaireSchema(SchemaTemplateInput schemaInput) {
247     return SchemaGenerator
248         .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.nic, schemaInput);
249   }
250
251   protected String getNicCompositionSchema(NicCompositionSchemaInput schemaInput) {
252     return SchemaGenerator
253         .generate(SchemaTemplateContext.composition, CompositionEntityType.nic, schemaInput);
254   }
255 }