2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (C) 2018 IBM.
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.ccsdk.apps.ms.neng.core.service;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import java.sql.Timestamp;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
31 import java.util.logging.Logger;
32 import java.util.regex.Pattern;
33 import javax.transaction.Transactional;
34 import org.onap.ccsdk.apps.ms.neng.core.exceptions.NengException;
35 import org.onap.ccsdk.apps.ms.neng.core.gen.NameGenerator;
36 import org.onap.ccsdk.apps.ms.neng.core.persistence.NamePersister;
37 import org.onap.ccsdk.apps.ms.neng.core.policy.PolicyFinder;
38 import org.onap.ccsdk.apps.ms.neng.core.policy.PolicyParameters;
39 import org.onap.ccsdk.apps.ms.neng.core.policy.PolicyReader;
40 import org.onap.ccsdk.apps.ms.neng.core.resource.model.HelloWorld;
41 import org.onap.ccsdk.apps.ms.neng.core.resource.model.NameGenRequest;
42 import org.onap.ccsdk.apps.ms.neng.core.resource.model.NameGenResponse;
43 import org.onap.ccsdk.apps.ms.neng.core.seq.SequenceGenerator;
44 import org.onap.ccsdk.apps.ms.neng.core.validator.AaiNameValidator;
45 import org.onap.ccsdk.apps.ms.neng.core.validator.DbNameValidator;
46 import org.onap.ccsdk.apps.ms.neng.core.validator.ExternalKeyValidator;
47 import org.onap.ccsdk.apps.ms.neng.persistence.entity.GeneratedName;
48 import org.onap.ccsdk.apps.ms.neng.persistence.entity.PolicyDetails;
49 import org.onap.ccsdk.apps.ms.neng.persistence.entity.ServiceParameter;
50 import org.onap.ccsdk.apps.ms.neng.persistence.repository.GeneratedNameRespository;
51 import org.onap.ccsdk.apps.ms.neng.persistence.repository.PolicyDetailsRepository;
52 import org.onap.ccsdk.apps.ms.neng.persistence.repository.ServiceParameterRepository;
53 import org.onap.ccsdk.apps.ms.neng.service.extinf.impl.AaiServiceImpl;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.beans.factory.annotation.Qualifier;
56 import org.springframework.stereotype.Service;
59 * Implementation of the APIs exposed by this micro-service.
62 public class SpringServiceImpl implements SpringService {
63 private static Logger log = Logger.getLogger(SpringServiceImpl.class.getName());
65 @Autowired AaiServiceImpl aaiService;
66 @Autowired ExternalKeyValidator externalKeyValidator;
67 @Autowired @Qualifier("policyFinderServiceImpl") PolicyFinder policyFinder;
68 @Autowired @Qualifier("policyFinderServiceDbImpl") PolicyFinder policyFinderDbImpl;
69 @Autowired PolicyParameters policyParameters;
70 @Autowired SequenceGenerator sequenceGenerator;
71 @Autowired DbNameValidator dbNameValidator;
72 @Autowired PolicyDetailsRepository policyDetailsRepository;
73 @Autowired AaiNameValidator aaiNameValidator;
74 @Autowired NamePersister namePersister;
75 @Autowired ServiceParameterRepository serviceParamRepo;
76 @Autowired GeneratedNameRespository generatedNameRepository;
79 * API to add a naming policy to the database cache in this micro-service.
82 public void addPolicy(Object request) throws Exception {
83 @SuppressWarnings("unchecked")
84 Map<String, Object> policyData = (Map<String, Object>)request;
85 PolicyDetails pd = new PolicyDetails();
86 String name = (String) policyData.get("policyName");
87 pd.setPolicyName(name);
88 ObjectMapper objectmapper = new ObjectMapper();
89 log.info(objectmapper.writeValueAsString(policyData.get("policyValue")));
90 pd.setPolicyResponse((String)policyData.get("policyValue"));
91 policyDetailsRepository.save(pd);
95 * Name generation API -- generates or updates the name.
97 @Transactional(rollbackOn = Exception.class)
98 public NameGenResponse generateOrUpdateName(NameGenRequest request) throws Exception {
99 if (isUpdateRequest(request)) {
100 NameGenResponse resp = new NameGenResponse();
101 resp.setElements(updateNetworkElementName(request));
104 return genNetworkElementName(request);
109 * Name generation API.
111 @Transactional(rollbackOn = Exception.class)
112 public NameGenResponse genNetworkElementName(NameGenRequest request) throws Exception {
114 Map<String, Map<String, String>> earlierNames = new HashMap<>();
115 List<Map<String, String>> allElements = new ArrayList<>();
116 Map<String, Map<String, ?>> policyCache = new HashMap<>();
117 List<Map<String, String>> generatedNames = new ArrayList<>();
118 List<String> earlierNamingTypes = new ArrayList<String>();
119 validateRequest(request);
120 if (request.getElements() != null && !request.getElements().isEmpty()) {
121 allElements.addAll(request.getElements());
123 PolicyFinder policyFinderImpl = findPolicyFinderImpl(request);
124 for (Map<String, String> requestElement : allElements) {
125 log.info("Processing " + requestElement.toString());
126 NameGenerator nameGen = new NameGenerator(policyFinderImpl, policyParameters, sequenceGenerator,
127 dbNameValidator, aaiNameValidator, namePersister, requestElement, allElements,
128 earlierNames, policyCache, earlierNamingTypes);
129 generatedNames.add(nameGen.generate());
131 NameGenResponse resp = new NameGenResponse();
132 resp.setElements(generatedNames);
134 } catch (Exception e) {
135 if (e instanceof NengException) {
139 throw new Exception("Internal error occurred while processing the request");
145 * API to return naming policy cached in this micro-service.
148 public PolicyDetails getPolicyDetails(String policyName) {
150 return policyDetailsRepository.findPolicyResponseByName(policyName);
151 } catch (Exception e) {
152 return new PolicyDetails();
157 * Heart-beat/ping API.
160 public HelloWorld getQuickHello(String name) {
161 if (name == null || name.isEmpty()) {
164 String message = "Hello " + name + "!";
166 HelloWorld hello = new HelloWorld(message);
167 log.info(hello.toString());
174 @Transactional(rollbackOn = Exception.class)
175 public NameGenResponse releaseNetworkElementName(NameGenRequest request) throws Exception {
176 NameGenResponse response = new NameGenResponse();
177 Timestamp curTime = new Timestamp(System.currentTimeMillis());
179 for (Map<String, String> requestElement : request.getElements()) {
180 String key = requestElement.get("external-key");
181 List<GeneratedName> generatedNames = generatedNameRepository.findByExternalId(key);
182 for (GeneratedName generatedName : generatedNames) {
183 generatedName.setIsReleased("Y");
184 generatedName.setLastUpdatedTime(curTime);
186 buildUnAssignResponse(generatedNames, response);
189 } catch (Exception e) {
190 if (e instanceof NengException) {
194 throw new Exception("Internal error occurred while processing the request");
203 @Transactional(rollbackOn = Exception.class)
204 public List<Map<String, String>> updateNetworkElementName(NameGenRequest request) throws Exception {
205 List<Map<String, String>> responseList = new ArrayList<>();
206 for (Map<String, String> reqElement :request.getElements()) {
207 NameGenerator nameGen = new NameGenerator(null, null,null, null, aaiNameValidator, namePersister,
208 reqElement, request.getElements(),null, null, null);
209 Map<String, String> resp = nameGen.updateGenerateName();
210 responseList.add(resp);
215 void buildUnAssignResponse(List<GeneratedName> generatedNames, NameGenResponse response) {
216 if (response.getElements() == null) {
217 response.setElements(new ArrayList<Map<String, String>>());
219 for (GeneratedName generatedName : generatedNames) {
220 Map<String, String> element = new HashMap<>();
221 element.put("external-key", generatedName.getExternalId());
222 element.put("resource-name", generatedName.getElementType());
223 element.put("resource-value", generatedName.getName());
224 response.getElements().add(element);
228 void validateRequest(NameGenRequest request) throws Exception {
231 private PolicyFinder findPolicyFinderImpl(NameGenRequest request) {
232 if (request.getUseDb() != null && !request.getUseDb()) {
233 return this.policyFinder;
235 ServiceParameter param = serviceParamRepo.findByName("use_db_policy");
236 if ((request.getUseDb() != null && request.getUseDb().booleanValue())
237 || (param != null && "Y".equals(param.getValue()))) {
238 return policyFinderDbImpl;
240 return this.policyFinder;
243 private boolean isUpdateRequest(NameGenRequest request) throws Exception {
244 for (Map<String, String> reqElement : request.getElements()) {
245 String resourceValue = PolicyReader.value(reqElement, "resource-value");
246 if (resourceValue != null && !Pattern.matches("\\$\\{.*\\}.*", resourceValue)) {