1 /*******************************************************************************
\r
2 * Copyright © 2017-2018 AT&T Intellectual Property.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
15 ******************************************************************************/
\r
16 package org.onap.ccsdk.apps.ms.vlantagapi.core.service;
\r
18 import java.util.ArrayList;
\r
19 import java.util.Date;
\r
20 import java.util.List;
\r
21 import java.util.Optional;
\r
22 import java.util.UUID;
\r
24 import org.onap.ccsdk.apps.ms.vlantagapi.core.exception.VlantagApiException;
\r
25 import org.onap.ccsdk.apps.ms.vlantagapi.core.extinf.pm.model.AllowedRanges;
\r
26 import org.onap.ccsdk.apps.ms.vlantagapi.core.extinf.pm.model.Elements;
\r
27 import org.onap.ccsdk.apps.ms.vlantagapi.core.extinf.pm.model.ResourceModel;
\r
28 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.AssignVlanTagRequest;
\r
29 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.AssignVlanTagRequestInput;
\r
30 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.AssignVlanTagResponse;
\r
31 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.AssignVlanTagResponseOutput;
\r
32 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.PingResponse;
\r
33 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagRequest;
\r
34 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagRequestInput;
\r
35 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagResponse;
\r
36 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagResponseOutput;
\r
37 import org.onap.ccsdk.apps.ms.vlantagapi.core.model.VlanTag;
\r
38 import org.onap.ccsdk.apps.ms.vlantagapi.extinf.pm.PolicyManagerClient;
\r
39 import org.onap.ccsdk.sli.adaptors.ra.ResourceAllocator;
\r
40 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceEntity;
\r
41 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceRequest;
\r
42 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceResponse;
\r
43 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceTarget;
\r
44 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationStatus;
\r
45 import org.onap.ccsdk.sli.adaptors.rm.data.Range;
\r
46 import org.onap.ccsdk.sli.adaptors.rm.data.ResourceType;
\r
47 import org.onap.ccsdk.sli.adaptors.util.str.StrUtil;
\r
50 import org.slf4j.Logger;
\r
51 import org.slf4j.LoggerFactory;
\r
52 import org.springframework.beans.factory.annotation.Autowired;
\r
53 import org.springframework.stereotype.Service;
\r
56 * VlantagApiServiceImpl.java Purpose: Provide Vlantag Assignment & UnAssignment
\r
57 * APIs service implementation for VNFs
\r
59 * @author Saurav Paira
\r
63 public class VlantagApiServiceImpl implements VlantagApiService {
\r
65 private static final VlantagApiService INSTANCE = new VlantagApiServiceImpl();
\r
66 private static final Logger log = LoggerFactory.getLogger(VlantagApiServiceImpl.class);
\r
67 private static final String BEGIN_SQUAREBRACKET_RC = "#BSB#";
\r
68 private static final String END_SQUAREBRACKET_RC = "#ESB#";
\r
71 private ResourceAllocator resourceAllocator;
\r
73 private PolicyManagerClient policyClient;
\r
75 public static VlantagApiService getInstance() {
\r
80 * This is a assignVlanTag service implementation to assign Vlantags based on the
\r
81 * AssignVlanTagRequest and Policy instance.
\r
83 * @param AssignVlanTagRequest
\r
84 * @return AssignVlanTagResponse
\r
87 public AssignVlanTagResponse assignVlanTag(AssignVlanTagRequest request) throws Exception {
\r
88 List<AssignVlanTagResponseOutput> outputList = new ArrayList<>();
\r
91 validateRequest(request);
\r
92 List<AssignVlanTagRequestInput> vlanTagRequests = request.getInput();
\r
94 List<AssignVlanTagRequestInput> reservedResources = new ArrayList<>();
\r
96 for (AssignVlanTagRequestInput input : vlanTagRequests) {
\r
97 log.info("PolicyManagerClient called..for policy : {}", input.getPolicyInstanceName());
\r
99 List<ResourceModel> resourceModels = policyClient.getPolicy(input.getPolicyInstanceName());
\r
100 ResourceModel model = validate(resourceModels, input);
\r
101 List<ResourceResponse> rl = new ArrayList<>();
\r
103 for (Elements elements : model.getElements()) {
\r
105 ResourceEntity re = new ResourceEntity();
\r
106 ResourceTarget rt = new ResourceTarget();
\r
107 ResourceRequest rr = new ResourceRequest();
\r
108 List<ResourceResponse> rsList = new ArrayList<>();
\r
110 prepareResourceAllocatorObjects(input, model, elements, re, rt, rr);
\r
112 if (resourceAllocator != null) {
\r
113 AllocationStatus status = resourceAllocator.reserve(re, rt, rr, rsList);
\r
115 if (AllocationStatus.Success.equals(status))
\r
118 rollbackVlanTags(reservedResources);
\r
119 throw new VlantagApiException(
\r
120 "Failed to reserve VlanTags for Element : {}. " + elements.getVlantagName()
\r
121 + ". Rolling back vlantags for other elements (if any).");
\r
124 throw new VlantagApiException(
\r
125 "ResourceAllocator not available. Failed to Assign VlanTags for Element : "
\r
126 + elements.getVlantagName()
\r
127 + ". Rolling back vlantags for other elements (if any).");
\r
130 reservedResources.add(input);
\r
131 outputList.add(prepareVlanTagResponse(input, model, rl));
\r
134 } catch (Exception e) {
\r
135 log.error("Exception : " + e.getMessage(), e);
\r
137 AssignVlanTagResponse response = new AssignVlanTagResponse();
\r
138 response.setErrorCode(500);
\r
139 response.setErrorMessage(e.getMessage());
\r
143 AssignVlanTagResponse response = new AssignVlanTagResponse();
\r
144 response.setErrorCode(200);
\r
145 response.setErrorMessage("Success");
\r
146 response.setOutput(outputList);
\r
150 private void prepareResourceAllocatorObjects(AssignVlanTagRequestInput input, ResourceModel model, Elements element,
\r
151 ResourceEntity re, ResourceTarget rt, ResourceRequest rr) throws VlantagApiException {
\r
152 log.info("Preparing RA Objects for Vlan Type : " + input.getVlanType() + " and Element : "
\r
153 + element.getVlantagName());
\r
154 re.resourceEntityId = input.getVlanTagKey();
\r
155 re.resourceEntityType = model.getKeyType() == null ? "DEFAULT" : model.getKeyType();
\r
156 re.resourceEntityVersion = "1";
\r
158 rt.resourceTargetId = input.getScopeId();
\r
159 rt.resourceTargetType = model.getScope() == null ? "DEFAULT" : model.getScope();
\r
161 rr.resourceName = input.getVlanType();
\r
162 rr.serviceModel = input.getPolicyInstanceName();
\r
163 rr.endPointPosition = element.getVlantagName();
\r
164 rr.resourceType = ResourceType.Range;
\r
165 rr.applicationId = "SDNC";
\r
166 rr.rangeMaxOverride = -1;
\r
167 rr.rangeMinOverride = -1;
\r
169 List<Range> rangeList = new ArrayList<>();
\r
170 for (AllowedRanges allowedRange : element.getAllowedRanges()) {
\r
171 Range range = new Range();
\r
173 if (allowedRange.getMin() != null && !allowedRange.getMin().isEmpty())
\r
174 range.min = Integer.parseInt(allowedRange.getMin());
\r
176 if (allowedRange.getMax() != null && !allowedRange.getMax().isEmpty())
\r
177 range.max = Integer.parseInt(allowedRange.getMax());
\r
179 rangeList.add(range);
\r
182 rr.rangeOverrideList = rangeList;
\r
184 String resourceValue = resolveResourceElementValue(input, model, element);
\r
185 if (resourceValue != null) {
\r
186 rr.rangeRequestedNumbers = resourceValue; /* Manually provided values */
\r
189 * If the override flag is TRUE, then add the resource value also in the range,
\r
190 * so it will ignore the current range min-max in the policy. Persist in the DB
\r
191 * if available else Fail.
\r
193 if (element.getOverwrite() != null && element.getOverwrite().equalsIgnoreCase("TRUE")) {
\r
194 Range range = new Range();
\r
195 range.min = Integer.parseInt(resourceValue);
\r
196 rangeList.add(range);
\r
200 StrUtil.info(log, re);
\r
201 StrUtil.info(log, rt);
\r
202 StrUtil.info(log, rr);
\r
206 protected String resolveResourceElementValue(AssignVlanTagRequestInput input, ResourceModel model, Elements element)
\r
207 throws VlantagApiException {
\r
208 String recipe = trimBrackets(model.getResourceResolutionRecipe().trim());
\r
210 if (input.getResourceValue() != null && !input.getResourceValue().trim().isEmpty()
\r
211 && !input.getResourceValue().contains("$")) {
\r
212 log.info("Resource Value : " + input.getResourceValue());
\r
213 String resourceValue = trimBrackets(input.getResourceValue());
\r
215 String[] vlantagNames = recipe.split(",");
\r
216 String[] resourceValues = resourceValue.split(",");
\r
219 for (int i = 0; i < vlantagNames.length; i++) {
\r
220 if (vlantagNames[i].trim().equalsIgnoreCase(element.getVlantagName().trim()))
\r
221 return resourceValues[i].trim();
\r
223 } catch (IndexOutOfBoundsException e) {
\r
224 throw new VlantagApiException("No Matching Resource Value found from Recipe : \""
\r
225 + model.getResourceResolutionRecipe() + "\" for Vlantag Name : " + element.getVlantagName());
\r
232 ResourceModel validate(List<ResourceModel> resourceModels, AssignVlanTagRequestInput input)
\r
233 throws VlantagApiException {
\r
234 ResourceModel targetModel = null;
\r
235 if (resourceModels != null && !resourceModels.isEmpty()) {
\r
236 for (ResourceModel model : resourceModels) {
\r
237 if (model.getVlanType().equals(input.getVlanType())) {
\r
238 targetModel = model;
\r
242 validateModel(targetModel, input);
\r
244 throw new VlantagApiException("No Resource Models available in Policy Manager for Policy Instance Name : "
\r
245 + input.getPolicyInstanceName());
\r
246 return targetModel;
\r
249 void validateModel(ResourceModel model, AssignVlanTagRequestInput input) throws VlantagApiException {
\r
252 throw new VlantagApiException(
\r
253 "No Matching Policy Resource Model found for Vlan Type : " + input.getVlanType());
\r
255 if (model.getResourceResolutionRecipe() == null || model.getResourceResolutionRecipe().isEmpty())
\r
256 throw new VlantagApiException(
\r
257 "Resource Resolution Recipe is null in Resource Model for Vlan Type : " + input.getVlanType());
\r
259 if (model.getScope() == null || model.getScope().isEmpty())
\r
260 throw new VlantagApiException("Scope is null in Resource Model for Vlan Type : " + input.getVlanType());
\r
262 List<Elements> elements = model.getElements();
\r
263 validateElements(elements, input);
\r
268 void validateElements(List<Elements> elements, AssignVlanTagRequestInput input) throws VlantagApiException {
\r
269 if (elements != null && !elements.isEmpty()) {
\r
270 for (Elements element : elements) {
\r
271 if (element.getVlantagName() == null)
\r
272 throw new VlantagApiException(
\r
273 "Vlantag Name missing for Element in Resource Model Policy for Vlan Type : "
\r
274 + input.getVlanType());
\r
275 if (element.getAllowedRanges() == null || element.getAllowedRanges().isEmpty())
\r
276 throw new VlantagApiException(
\r
277 "Allowed Ranges missing for Element in Resource Model Policy for Vlan Type : "
\r
278 + input.getVlanType());
\r
281 throw new VlantagApiException(
\r
282 "No Vlantag Elements found in Resource Model Policy for Vlan Type : " + input.getVlanType());
\r
286 PolicyManagerClient getPolicyManagerClient() {
\r
287 return new PolicyManagerClient();
\r
290 void validateRequest(AssignVlanTagRequest request) throws VlantagApiException {
\r
291 if (request == null)
\r
292 throw new VlantagApiException("VlanTag Assign Request is null.");
\r
294 List<AssignVlanTagRequestInput> inputList = request.getInput();
\r
296 if (inputList == null || inputList.isEmpty())
\r
297 throw new VlantagApiException("VlanTag Assign Request Input is null or empty.");
\r
299 for (AssignVlanTagRequestInput input : inputList) {
\r
300 if (input.getPolicyInstanceName() == null || input.getPolicyInstanceName().isEmpty())
\r
301 throw new VlantagApiException("VlanTag Assign Request policy-instance-name is null.");
\r
303 if (input.getVlanType() == null || input.getVlanType().isEmpty())
\r
304 throw new VlantagApiException("VlanTag Assign Request vlan-type is null.");
\r
306 if (input.getScopeId() == null || input.getScopeId().isEmpty())
\r
307 throw new VlantagApiException("VlanTag Assign Request scope-id is null.");
\r
309 if (input.getVlanTagKey() == null || input.getVlanTagKey().isEmpty())
\r
310 throw new VlantagApiException("VlanTag Assign Request key is null.");
\r
315 private AssignVlanTagResponseOutput prepareVlanTagResponse(AssignVlanTagRequestInput input, ResourceModel model,
\r
316 List<ResourceResponse> rl) {
\r
317 AssignVlanTagResponseOutput ro = new AssignVlanTagResponseOutput();
\r
318 List<VlanTag> vlanTagList = new ArrayList<>();
\r
320 if (rl != null && !rl.isEmpty()) {
\r
321 ro.setResourceName(input.getResourceName());
\r
322 ro.setResourceValue(resolveRecipe(model, rl));
\r
323 ro.setResourceVlanRole(model.getResourceVlanRole());
\r
324 if (model.getDataStore() != null && !model.getDataStore().isEmpty()) {
\r
325 for (ResourceResponse rr : rl) {
\r
326 VlanTag tag = new VlanTag();
\r
327 Optional<Elements> optionalElements = model.getElements().stream()
\r
328 .filter(element -> element.getVlantagName().equalsIgnoreCase(rr.endPointPosition))
\r
330 optionalElements.ifPresent(element -> tag.setElementVlanRole(element.getElementVlanRole()));
\r
332 tag.setVlanUuid(UUID.randomUUID().toString());
\r
333 tag.setVlantagName(rr.endPointPosition);
\r
334 tag.setVlantagValue(rr.resourceAllocated);
\r
335 vlanTagList.add(tag);
\r
339 ro.setStoredElements(vlanTagList);
\r
345 protected String resolveRecipe(ResourceModel model, List<ResourceResponse> rl) {
\r
346 String recipe = model.getResourceResolutionRecipe().trim();
\r
347 String resourceValue = recipe;
\r
349 if (recipe.contains(BEGIN_SQUAREBRACKET_RC)) {
\r
350 recipe = recipe.replace(BEGIN_SQUAREBRACKET_RC, "");
\r
351 resourceValue = resourceValue.replace(BEGIN_SQUAREBRACKET_RC, "[ ");
\r
354 if (recipe.contains(END_SQUAREBRACKET_RC)) {
\r
355 recipe = recipe.replace(END_SQUAREBRACKET_RC, "");
\r
356 resourceValue = resourceValue.replace(END_SQUAREBRACKET_RC, " ]");
\r
359 String[] vlantagNames = recipe.split(",");
\r
361 for (String vlantagName : vlantagNames) {
\r
362 for (ResourceResponse rr : rl) {
\r
363 if (vlantagName.trim().equalsIgnoreCase(rr.endPointPosition)) {
\r
364 resourceValue = resourceValue.replace(vlantagName, " " + rr.resourceAllocated);
\r
370 log.info(resourceValue);
\r
372 return resourceValue;
\r
375 private void rollbackVlanTags(List<AssignVlanTagRequestInput> reservedResources) throws Exception {
\r
376 UnassignVlanTagRequest unassignRequest = new UnassignVlanTagRequest();
\r
377 List<UnassignVlanTagRequestInput> inputList = new ArrayList<>();
\r
379 if (reservedResources != null && !reservedResources.isEmpty()) {
\r
380 reservedResources.forEach(assignReqInput -> {
\r
382 UnassignVlanTagRequestInput input = new UnassignVlanTagRequestInput();
\r
383 input.setVlanType(assignReqInput.getVlanType());
\r
384 input.setVlanTagKey(assignReqInput.getVlanTagKey());
\r
385 input.setPolicyInstanceName(assignReqInput.getPolicyInstanceName());
\r
386 inputList.add(input);
\r
388 unassignRequest.setInput(inputList);
\r
389 unassignVlanTag(unassignRequest);
\r
395 * This is a unassignVlanTag service implementation to unassign Vlantags based on the
\r
396 * UnassignVlanTagRequest and Policy instance.
\r
398 * @param UnassignVlanTagRequest
\r
399 * @return UnassignVlanTagResponse
\r
402 public UnassignVlanTagResponse unassignVlanTag(UnassignVlanTagRequest request) throws Exception {
\r
403 UnassignVlanTagResponse response = new UnassignVlanTagResponse();
\r
404 List<UnassignVlanTagResponseOutput> output = new ArrayList<>();
\r
407 validateRequest(request);
\r
408 List<UnassignVlanTagRequestInput> vlanTagRequests = request.getInput();
\r
410 for (UnassignVlanTagRequestInput input : vlanTagRequests) {
\r
411 List<ResourceModel> resourceModels = policyClient.getPolicy(input.getPolicyInstanceName());
\r
412 ResourceModel model = validate(resourceModels, input);
\r
414 for (Elements elements : model.getElements()) {
\r
416 ResourceEntity re = new ResourceEntity();
\r
417 re.resourceEntityId = input.getVlanTagKey();
\r
418 re.resourceEntityType = model.getKeyType() == null ? "DEFAULT" : model.getKeyType();
\r
419 re.resourceEntityVersion = "1";
\r
421 ResourceRequest rr = new ResourceRequest();
\r
422 rr.endPointPosition = elements.getVlantagName();
\r
424 if (resourceAllocator != null) {
\r
425 AllocationStatus status = resourceAllocator.release(re, rr);
\r
427 if (AllocationStatus.Success.equals(status)) {
\r
428 UnassignVlanTagResponseOutput ro = new UnassignVlanTagResponseOutput();
\r
429 ro.setVlanTagKey(input.getVlanTagKey());
\r
430 ro.setVlanType(input.getVlanType());
\r
431 ro.setVlantagName(elements.getVlantagName());
\r
434 throw new VlantagApiException(
\r
435 "Failed to release VlanTags for Element : " + elements.getVlantagName() + ".");
\r
438 throw new VlantagApiException(
\r
439 "ResourceAllocator not available. Failed to Unassign VlanTags for Element : "
\r
440 + elements.getVlantagName()
\r
441 + ". Rolling back vlantags for other elements (if any).");
\r
444 } catch (Exception e) {
\r
445 log.error("Exception : " + e.getMessage(), e);
\r
447 response.setErrorCode(500);
\r
448 response.setErrorMessage(e.getMessage());
\r
452 response.setOutput(output);
\r
453 response.setErrorCode(200);
\r
454 response.setErrorMessage("Success");
\r
458 ResourceModel validate(List<ResourceModel> resourceModels, UnassignVlanTagRequestInput input)
\r
459 throws VlantagApiException {
\r
460 ResourceModel targetModel = null;
\r
461 if (resourceModels != null && !resourceModels.isEmpty()) {
\r
462 for (ResourceModel model : resourceModels) {
\r
463 if (model.getVlanType().equals(input.getVlanType())) {
\r
464 targetModel = model;
\r
468 validateModel(targetModel, input);
\r
470 throw new VlantagApiException("No Resource Models available in Policy Manager for Policy Instance Name : "
\r
471 + input.getPolicyInstanceName());
\r
472 return targetModel;
\r
475 void validateModel(ResourceModel model, UnassignVlanTagRequestInput input) throws VlantagApiException {
\r
477 throw new VlantagApiException(
\r
478 "No Matching Policy Resource Model found for Vlan Type : " + input.getVlanType());
\r
480 if (model.getResourceResolutionRecipe() == null || model.getResourceResolutionRecipe().isEmpty())
\r
481 throw new VlantagApiException(
\r
482 "Resource Resolution Recipe is null in Resource Model for Vlan Type : " + input.getVlanType());
\r
484 if (model.getScope() == null || model.getScope().isEmpty())
\r
485 throw new VlantagApiException("Scope is null in Resource Model for Vlan Type : " + input.getVlanType());
\r
487 List<Elements> elements = model.getElements();
\r
488 validateElements(elements, input);
\r
493 protected void validateElements(List<Elements> elements, UnassignVlanTagRequestInput input)
\r
494 throws VlantagApiException {
\r
495 if (elements != null && !elements.isEmpty()) {
\r
496 for (Elements element : elements) {
\r
497 if (element.getVlantagName() == null)
\r
498 throw new VlantagApiException(
\r
499 "Vlantag Name missing for Element in Resource Model Policy for Vlan Type : "
\r
500 + input.getVlanType());
\r
503 throw new VlantagApiException(
\r
504 "No Vlantag Elements found in Resource Model Policy for Vlan Type : " + input.getVlanType());
\r
508 protected void validateRequest(UnassignVlanTagRequest request) throws VlantagApiException {
\r
509 if (request == null)
\r
510 throw new VlantagApiException("VlanTag Unassign Request is null.");
\r
512 List<UnassignVlanTagRequestInput> inputList = request.getInput();
\r
513 if (inputList == null || inputList.isEmpty())
\r
514 throw new VlantagApiException("VlanTag Unassign Request Input is null or empty.");
\r
516 for (UnassignVlanTagRequestInput input : inputList) {
\r
517 if (input.getPolicyInstanceName() == null || input.getPolicyInstanceName().isEmpty())
\r
518 throw new VlantagApiException("VlanTag Unassign Request policy-instance-name is null.");
\r
520 if (input.getVlanType() == null || input.getVlanType().isEmpty())
\r
521 throw new VlantagApiException("VlanTag Unassign Request resource-name is null.");
\r
523 if (input.getVlanTagKey() == null || input.getVlanTagKey().isEmpty())
\r
524 throw new VlantagApiException("VlanTag Unassign Request key is null.");
\r
530 * This is a ping service implementation to check the Vlantag Api is Up and running.
\r
533 * @return PingResponse
\r
536 public PingResponse getPing(String name) {
\r
537 PingResponse ping = new PingResponse();
\r
538 ping.setMessage("Ping response : " + name + " Time : " + new Date());
\r
543 protected void setResourceAllocator(ResourceAllocator ra) {
\r
544 this.resourceAllocator = ra;
\r
547 protected String trimBrackets(String recipe) {
\r
548 if (recipe != null) {
\r
549 if (recipe.contains(BEGIN_SQUAREBRACKET_RC))
\r
550 recipe = recipe.replace(BEGIN_SQUAREBRACKET_RC, "");
\r
551 if (recipe.contains(END_SQUAREBRACKET_RC))
\r
552 recipe = recipe.replace(END_SQUAREBRACKET_RC, "");
\r
553 if (recipe.contains("["))
\r
554 recipe = recipe.replace("[", "");
\r
555 if (recipe.contains("]"))
\r
556 recipe = recipe.replace("]", "");
\r