347a23935112c39cfeb0e89c80bbf59c94ace976
[ccsdk/apps.git] / ms / neng / src / main / java / org / onap / ccsdk / apps / ms / neng / core / service / SpringServiceImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : CCSDK.apps
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
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
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=========================================================
21  */
22
23 package org.onap.ccsdk.apps.ms.neng.core.service;
24
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;
30 import java.util.Map;
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;
57
58 /**
59  * Implementation of the APIs exposed by this micro-service.
60  */
61 @Service
62 public class SpringServiceImpl implements SpringService {
63     private static Logger log = Logger.getLogger(SpringServiceImpl.class.getName());
64
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;
77
78     /**
79      * API to add a naming policy to the database cache in this micro-service.
80      */
81     @Override
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);
92     }
93
94     /**
95      * Name generation API -- generates or updates the name.
96      */
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));
102             return resp;
103         } else {
104             return genNetworkElementName(request);
105         }
106     }
107
108     /**
109      * Name generation API.
110      */
111     @Transactional(rollbackOn = Exception.class)
112     public NameGenResponse genNetworkElementName(NameGenRequest request) throws Exception {
113         try {
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<>();
119             validateRequest(request);
120             if (request.getElements() != null && !request.getElements().isEmpty()) {
121                 allElements.addAll(request.getElements());
122             }
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());
130             }
131             NameGenResponse resp = new NameGenResponse();
132             resp.setElements(generatedNames);
133             return resp;
134         } catch (Exception e) {
135             if (e instanceof NengException) {
136                 throw e;
137             } else {
138                 log.warning(e.getMessage());
139                 throw new Exception("Internal error occurred while processing the request");
140             }
141         }
142     }
143
144     /**
145      * API to return naming policy cached in this micro-service.
146      */
147     @Override
148     public PolicyDetails getPolicyDetails(String policyName) {
149         try {
150             return policyDetailsRepository.findPolicyResponseByName(policyName);
151         } catch (Exception e) {
152             log.warning(e.getMessage());
153             return new PolicyDetails();
154         }
155     }
156
157     /**
158      * Heart-beat/ping API.
159      */
160     @Override
161     public HelloWorld getQuickHello(String name) {
162         if (name == null || name.isEmpty()) {
163             name = "world";
164         }
165         String message = "Hello " + name + "!";
166         log.info(message);
167         HelloWorld hello = new HelloWorld(message);
168         log.info(hello.toString());
169         return hello;
170     }
171
172     /**
173      * Name removal API.
174      */
175     @Transactional(rollbackOn = Exception.class)
176     public NameGenResponse releaseNetworkElementName(NameGenRequest request) throws Exception {
177         NameGenResponse response = new NameGenResponse();
178         Timestamp curTime = new Timestamp(System.currentTimeMillis());
179         try {
180             for (Map<String, String> requestElement : request.getElements()) {
181                 String key = requestElement.get("external-key");
182                 List<GeneratedName> generatedNames = generatedNameRepository.findByExternalId(key);
183                 for (GeneratedName generatedName : generatedNames) {
184                     generatedName.setIsReleased("Y");
185                     generatedName.setLastUpdatedTime(curTime);
186                 }
187                 buildUnAssignResponse(generatedNames, response);
188             }
189             return response;
190         } catch (Exception e) {
191             if (e instanceof NengException) {
192                 throw e;
193             } else {
194                 log.warning(e.getMessage());
195                 throw new Exception("Internal error occurred while processing the request");
196             }
197         }
198     }
199
200     /**
201      * Name update API.
202      */
203     @Override
204     @Transactional(rollbackOn = Exception.class)
205     public List<Map<String, String>> updateNetworkElementName(NameGenRequest request) throws Exception {
206         List<Map<String, String>> responseList = new ArrayList<>();
207         for (Map<String, String> reqElement :request.getElements()) {
208             NameGenerator nameGen = new NameGenerator(null, null,null, null, aaiNameValidator, namePersister, 
209                                                       reqElement, request.getElements(),null, null, null);
210             Map<String, String> resp = nameGen.updateGenerateName();
211             responseList.add(resp);
212         }
213         return responseList;
214     }
215     
216     void buildUnAssignResponse(List<GeneratedName> generatedNames, NameGenResponse response) {
217         if (response.getElements() == null) {
218             response.setElements(new ArrayList<Map<String, String>>());
219         }
220         for (GeneratedName generatedName : generatedNames) {
221             Map<String, String> element = new HashMap<>();
222             element.put("external-key", generatedName.getExternalId());
223             element.put("resource-name", generatedName.getElementType());
224             element.put("resource-value", generatedName.getName());
225             response.getElements().add(element);
226         }
227     }
228
229     void validateRequest(NameGenRequest request) throws Exception {
230         // this method does nothing
231     }
232
233     private PolicyFinder findPolicyFinderImpl(NameGenRequest request) {
234         if (request.getUseDb() != null && !request.getUseDb()) {
235             return this.policyFinder;
236         }
237         ServiceParameter param = serviceParamRepo.findByName("use_db_policy");
238         if ((request.getUseDb() != null && request.getUseDb().booleanValue()) 
239                         || (param != null && "Y".equals(param.getValue()))) {
240             return policyFinderDbImpl;
241         }
242         return this.policyFinder;
243     }
244
245     private boolean isUpdateRequest(NameGenRequest request) throws Exception {
246         for (Map<String, String> reqElement : request.getElements()) {
247             String resourceValue = PolicyReader.value(reqElement, "resource-value");
248             if (resourceValue != null && !Pattern.matches("\\$\\{.*\\}.*", resourceValue)) {
249                 return true;
250             }
251         }
252         return false;
253     }
254 }