3772fd7169c82a525869055e37093389b84b1fd3
[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                 e.printStackTrace();
139                 log.warning(e.getMessage());
140                 throw new Exception("Internal error occurred while processing the request");
141             }
142         }
143     }
144
145     /**
146      * API to return naming policy cached in this micro-service.
147      */
148     @Override
149     public PolicyDetails getPolicyDetails(String policyName) {
150         try {
151             return policyDetailsRepository.findPolicyResponseByName(policyName);
152         } catch (Exception e) {
153             log.warning(e.getMessage());
154             return new PolicyDetails();
155         }
156     }
157
158     /**
159      * Heart-beat/ping API.
160      */
161     @Override
162     public HelloWorld getQuickHello(String name) {
163         if (name == null || name.isEmpty()) {
164             name = "world";
165         }
166         String message = "Hello " + name + "!";
167         log.info(message);
168         HelloWorld hello = new HelloWorld(message);
169         log.info(hello.toString());
170         return hello;
171     }
172
173     /**
174      * Name removal API.
175      */
176     @Transactional(rollbackOn = Exception.class)
177     public NameGenResponse releaseNetworkElementName(NameGenRequest request) throws Exception {
178         NameGenResponse response = new NameGenResponse();
179         Timestamp curTime = new Timestamp(System.currentTimeMillis());
180         try {
181             for (Map<String, String> requestElement : request.getElements()) {
182                 String key = requestElement.get("external-key");
183                 List<GeneratedName> generatedNames = generatedNameRepository.findByExternalId(key);
184                 for (GeneratedName generatedName : generatedNames) {
185                     generatedName.setIsReleased("Y");
186                     generatedName.setLastUpdatedTime(curTime);
187                 }
188                 buildUnAssignResponse(generatedNames, response);
189             }
190             return response;
191         } catch (Exception e) {
192             if (e instanceof NengException) {
193                 throw e;
194             } else {
195                 log.warning(e.getMessage());
196                 throw new Exception("Internal error occurred while processing the request");
197             }
198         }
199     }
200
201     /**
202      * Name update API.
203      */
204     @Override
205     @Transactional(rollbackOn = Exception.class)
206     public List<Map<String, String>> updateNetworkElementName(NameGenRequest request) throws Exception {
207         List<Map<String, String>> responseList = new ArrayList<>();
208         for (Map<String, String> reqElement :request.getElements()) {
209             NameGenerator nameGen = new NameGenerator(null, null,null, null, aaiNameValidator, namePersister, 
210                                                       reqElement, request.getElements(),null, null, null);
211             Map<String, String> resp = nameGen.updateGenerateName();
212             responseList.add(resp);
213         }
214         return responseList;
215     }
216     
217     void buildUnAssignResponse(List<GeneratedName> generatedNames, NameGenResponse response) {
218         if (response.getElements() == null) {
219             response.setElements(new ArrayList<Map<String, String>>());
220         }
221         for (GeneratedName generatedName : generatedNames) {
222             Map<String, String> element = new HashMap<>();
223             element.put("external-key", generatedName.getExternalId());
224             element.put("resource-name", generatedName.getElementType());
225             element.put("resource-value", generatedName.getName());
226             response.getElements().add(element);
227         }
228     }
229
230     void validateRequest(NameGenRequest request) throws Exception {
231         // this method does nothing
232     }
233
234     private PolicyFinder findPolicyFinderImpl(NameGenRequest request) {
235         if (request.getUseDb() != null && !request.getUseDb()) {
236             return this.policyFinder;
237         }
238         ServiceParameter param = serviceParamRepo.findByName("use_db_policy");
239         if ((request.getUseDb() != null && request.getUseDb().booleanValue()) 
240                         || (param != null && "Y".equals(param.getValue()))) {
241             return policyFinderDbImpl;
242         }
243         return this.policyFinder;
244     }
245
246     private boolean isUpdateRequest(NameGenRequest request) throws Exception {
247         for (Map<String, String> reqElement : request.getElements()) {
248             String resourceValue = PolicyReader.value(reqElement, "resource-value");
249             if (resourceValue != null && !Pattern.matches("\\$\\{.*\\}.*", resourceValue)) {
250                 return true;
251             }
252         }
253         return false;
254     }
255 }