Merge "Add DD, blueprint and template for self-serve vFW"
[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<String>();
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                 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             return new PolicyDetails();
153         }
154     }
155
156     /**
157      * Heart-beat/ping API.
158      */
159     @Override
160     public HelloWorld getQuickHello(String name) {
161         if (name == null || name.isEmpty()) {
162             name = "world";
163         }
164         String message = "Hello " + name + "!";
165         log.info(message);
166         HelloWorld hello = new HelloWorld(message);
167         log.info(hello.toString());
168         return hello;
169     }
170
171     /**
172      * Name removal API.
173      */
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());
178         try {
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);
185                 }
186                 buildUnAssignResponse(generatedNames, response);
187             }
188             return response;
189         } catch (Exception e) {
190             if (e instanceof NengException) {
191                 throw e;
192             } else {
193                 e.printStackTrace();
194                 throw new Exception("Internal error occurred while processing the request");
195             }
196         }
197     }
198
199     /**
200      * Name update API.
201      */
202     @Override
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);
211         }
212         return responseList;
213     }
214     
215     void buildUnAssignResponse(List<GeneratedName> generatedNames, NameGenResponse response) {
216         if (response.getElements() == null) {
217             response.setElements(new ArrayList<Map<String, String>>());
218         }
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);
225         }
226     }
227
228     void validateRequest(NameGenRequest request) throws Exception {
229     }
230
231     private PolicyFinder findPolicyFinderImpl(NameGenRequest request) {
232         if (request.getUseDb() != null && !request.getUseDb()) {
233             return this.policyFinder;
234         }
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;
239         }
240         return this.policyFinder;
241     }
242
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)) {
247                 return true;
248             }
249         }
250         return false;
251     }
252 }