2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * Modifications Copyright (c) 2019 Samsung
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.so.db.request.data.repository;
25 import java.sql.Timestamp;
26 import java.text.SimpleDateFormat;
27 import java.util.Arrays;
28 import java.util.Collections;
29 import java.util.Date;
30 import java.util.LinkedList;
31 import java.util.List;
33 import java.util.Map.Entry;
34 import java.util.concurrent.TimeUnit;
35 import javax.persistence.EntityManager;
36 import javax.persistence.NonUniqueResultException;
37 import javax.persistence.Query;
38 import javax.persistence.TypedQuery;
39 import javax.persistence.criteria.CriteriaBuilder;
40 import javax.persistence.criteria.CriteriaQuery;
41 import javax.persistence.criteria.Order;
42 import javax.persistence.criteria.Predicate;
43 import javax.persistence.criteria.Root;
44 import org.onap.so.db.request.beans.InfraActiveRequests;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.beans.factory.annotation.Qualifier;
49 import org.springframework.stereotype.Repository;
50 import org.springframework.transaction.annotation.Transactional;
54 @Transactional(readOnly = true)
55 public class InfraActiveRequestsRepositoryImpl implements InfraActiveRequestsRepositoryCustom {
58 @Qualifier("requestEntityManagerFactory")
60 private EntityManager entityManager;
62 protected static Logger logger = LoggerFactory.getLogger(InfraActiveRequestsRepositoryImpl.class);
64 protected static final String REQUEST_STATUS = "requestStatus";
65 protected static final String SOURCE = "source";
66 protected static final String START_TIME = "startTime";
67 protected static final String END_TIME = "endTime";
68 protected static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
69 protected static final String SERVICE_INSTANCE_NAME = "serviceInstanceName";
70 protected static final String VNF_INSTANCE_NAME = "vnfName";
71 protected static final String VNF_INSTANCE_ID = "vnfId";
72 protected static final String VOLUME_GROUP_INSTANCE_NAME = "volumeGroupName";
73 protected static final String VOLUME_GROUP_INSTANCE_ID = "volumeGroupId";
74 protected static final String VFMODULE_INSTANCE_NAME = "vfModuleName";
75 protected static final String VFMODULE_INSTANCE_ID = "vfModuleId";
76 protected static final String NETWORK_INSTANCE_NAME = "networkName";
77 protected static final String CONFIGURATION_INSTANCE_ID = "configurationId";
78 protected static final String CONFIGURATION_INSTANCE_NAME = "configurationName";
79 protected static final String OPERATIONAL_ENV_ID = "operationalEnvId";
80 protected static final String OPERATIONAL_ENV_NAME = "operationalEnvName";
81 protected static final String NETWORK_INSTANCE_ID = "networkId";
82 protected static final String GLOBAL_SUBSCRIBER_ID = "globalSubscriberId";
83 protected static final String SERVICE_NAME_VERSION_ID = "serviceNameVersionId";
84 protected static final String SERVICE_ID = "serviceId";
85 protected static final String SERVICE_VERSION = "serviceVersion";
86 protected static final String REQUEST_ID = "requestId";
87 protected static final String REQUESTOR_ID = "requestorId";
88 protected static final String OPENV = "operationalEnvironment";
90 private static final List<String> VALID_COLUMNS =
91 Arrays.asList(REQUEST_ID, SERVICE_INSTANCE_ID, SERVICE_INSTANCE_NAME, REQUEST_STATUS, VFMODULE_INSTANCE_ID,
92 VNF_INSTANCE_ID, NETWORK_INSTANCE_ID, VOLUME_GROUP_INSTANCE_ID);
98 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#healthCheck()
101 public boolean healthCheck() {
103 final Query query = entityManager.createNativeQuery(" show tables ");
105 final List<?> list = query.getResultList();
110 private List<InfraActiveRequests> executeInfraQuery(final CriteriaQuery<InfraActiveRequests> crit,
111 final List<Predicate> predicates, final Order order) {
113 logger.debug("Execute query on infra active request table");
115 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
116 crit.where(cb.and(predicates.toArray(new Predicate[0])));
119 return entityManager.createQuery(crit).getResultList();
125 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#getRequestFromInfraActive(java. lang.String)
128 public InfraActiveRequests getRequestFromInfraActive(final String requestId) {
129 logger.debug("Get request {} from InfraActiveRequests DB", requestId);
131 InfraActiveRequests ar = null;
132 final Query query = entityManager.createQuery("from InfraActiveRequests where requestId = :requestId");
133 query.setParameter(REQUEST_ID, requestId);
134 ar = this.getSingleResult(query);
141 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#checkInstanceNameDuplicate(java. util.HashMap,
142 * java.lang.String, java.lang.String)
145 public InfraActiveRequests checkInstanceNameDuplicate(final Map<String, String> instanceIdMap,
146 final String instanceName, final String requestScope) {
148 final List<Predicate> predicates = new LinkedList<>();
149 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
150 final CriteriaQuery<InfraActiveRequests> crit = cb.createQuery(InfraActiveRequests.class);
151 final Root<InfraActiveRequests> tableRoot = crit.from(InfraActiveRequests.class);
152 InfraActiveRequests infraActiveRequests = null;
154 if (instanceName != null && !instanceName.equals("")) {
156 if ("service".equals(requestScope)) {
157 predicates.add(cb.equal(tableRoot.get(SERVICE_INSTANCE_NAME), instanceName));
158 } else if ("vnf".equals(requestScope)) {
159 predicates.add(cb.equal(tableRoot.get(VNF_INSTANCE_NAME), instanceName));
160 } else if ("volumeGroup".equals(requestScope)) {
161 predicates.add(cb.equal(tableRoot.get(VOLUME_GROUP_INSTANCE_NAME), instanceName));
162 } else if ("vfModule".equals(requestScope)) {
163 predicates.add(cb.equal(tableRoot.get(VFMODULE_INSTANCE_NAME), instanceName));
164 } else if ("network".equals(requestScope)) {
165 predicates.add(cb.equal(tableRoot.get(NETWORK_INSTANCE_NAME), instanceName));
166 } else if (requestScope.equals("configuration")) {
167 predicates.add(cb.equal(tableRoot.get(CONFIGURATION_INSTANCE_NAME), instanceName));
168 } else if (requestScope.equals(OPENV)) {
169 predicates.add(cb.equal(tableRoot.get(OPERATIONAL_ENV_NAME), instanceName));
173 if (instanceIdMap != null) {
174 if ("service".equals(requestScope) && instanceIdMap.get(SERVICE_INSTANCE_ID) != null) {
176 .add(cb.equal(tableRoot.get(SERVICE_INSTANCE_ID), instanceIdMap.get("serviceInstanceId")));
179 if ("vnf".equals(requestScope) && instanceIdMap.get("vnfInstanceId") != null) {
180 predicates.add(cb.equal(tableRoot.get(VNF_INSTANCE_ID), instanceIdMap.get("vnfInstanceId")));
183 if ("vfModule".equals(requestScope) && instanceIdMap.get("vfModuleInstanceId") != null) {
185 cb.equal(tableRoot.get(VFMODULE_INSTANCE_ID), instanceIdMap.get("vfModuleInstanceId")));
188 if ("volumeGroup".equals(requestScope) && instanceIdMap.get("volumeGroupInstanceId") != null) {
189 predicates.add(cb.equal(tableRoot.get(VOLUME_GROUP_INSTANCE_ID),
190 instanceIdMap.get("volumeGroupInstanceId")));
193 if ("network".equals(requestScope) && instanceIdMap.get("networkInstanceId") != null) {
195 .add(cb.equal(tableRoot.get(NETWORK_INSTANCE_ID), instanceIdMap.get("networkInstanceId")));
198 if (requestScope.equals("configuration") && instanceIdMap.get("configurationInstanceId") != null) {
199 predicates.add(cb.equal(tableRoot.get(CONFIGURATION_INSTANCE_ID),
200 instanceIdMap.get("configurationInstanceId")));
203 if (requestScope.equals(OPENV) && instanceIdMap.get("operationalEnvironmentId") != null) {
205 cb.equal(tableRoot.get(OPERATIONAL_ENV_ID), instanceIdMap.get("operationalEnvironmentId")));
209 if (!predicates.isEmpty()) {
210 predicates.add(tableRoot.get(REQUEST_STATUS)
211 .in(Arrays.asList("PENDING", "IN_PROGRESS", "TIMEOUT", "PENDING_MANUAL_TASK")));
213 final Order order = cb.desc(tableRoot.get(START_TIME));
215 final List<InfraActiveRequests> dupList = executeInfraQuery(crit, predicates, order);
217 if (dupList != null && !dupList.isEmpty()) {
218 infraActiveRequests = dupList.get(0);
222 return infraActiveRequests;
228 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#
229 * getOrchestrationFiltersFromInfraActive(java.util.Map)
232 public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive(
233 final Map<String, List<String>> orchestrationMap) {
236 final List<Predicate> predicates = new LinkedList<>();
237 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
238 final CriteriaQuery<InfraActiveRequests> crit = cb.createQuery(InfraActiveRequests.class);
239 final Root<InfraActiveRequests> tableRoot = crit.from(InfraActiveRequests.class);
240 for (final Map.Entry<String, List<String>> entry : orchestrationMap.entrySet()) {
241 String mapKey = entry.getKey();
242 if ("serviceInstanceId".equalsIgnoreCase(mapKey)) {
243 mapKey = "serviceInstanceId";
244 } else if ("serviceInstanceName".equalsIgnoreCase(mapKey)) {
245 mapKey = "serviceInstanceName";
246 } else if ("vnfInstanceId".equalsIgnoreCase(mapKey)) {
248 } else if ("pnfName".equalsIgnoreCase(mapKey)) {
250 } else if ("vnfInstanceName".equalsIgnoreCase(mapKey)) {
252 } else if ("vfModuleInstanceId".equalsIgnoreCase(mapKey)) {
253 mapKey = "vfModuleId";
254 } else if ("vfModuleInstanceName".equalsIgnoreCase(mapKey)) {
255 mapKey = "vfModuleName";
256 } else if ("volumeGroupInstanceId".equalsIgnoreCase(mapKey)) {
257 mapKey = "volumeGroupId";
258 } else if ("volumeGroupInstanceName".equalsIgnoreCase(mapKey)) {
259 mapKey = "volumeGroupName";
260 } else if ("networkInstanceId".equalsIgnoreCase(mapKey)) {
261 mapKey = "networkId";
262 } else if ("networkInstanceName".equalsIgnoreCase(mapKey)) {
263 mapKey = "networkName";
264 } else if (mapKey.equalsIgnoreCase("configurationInstanceId")) {
265 mapKey = "configurationId";
266 } else if (mapKey.equalsIgnoreCase("configurationInstanceName")) {
267 mapKey = "configurationName";
268 } else if ("lcpCloudRegionId".equalsIgnoreCase(mapKey)) {
269 mapKey = "cloudRegion";
270 } else if ("tenantId".equalsIgnoreCase(mapKey)) {
272 } else if ("modelType".equalsIgnoreCase(mapKey)) {
273 mapKey = "requestScope";
274 } else if ("requestorId".equalsIgnoreCase(mapKey)) {
275 mapKey = "requestorId";
276 } else if ("requestExecutionDate".equalsIgnoreCase(mapKey)) {
277 mapKey = "startTime";
280 final String propertyValue = entry.getValue().get(1);
281 if ("startTime".equals(mapKey)) {
282 final SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy");
284 final Date thisDate = format.parse(propertyValue);
285 final Timestamp minTime = new Timestamp(thisDate.getTime());
286 final Timestamp maxTime = new Timestamp(thisDate.getTime() + TimeUnit.DAYS.toMillis(1));
288 if ("DOES_NOT_EQUAL".equalsIgnoreCase(entry.getValue().get(0))) {
289 predicates.add(cb.or(cb.lessThan(tableRoot.get(mapKey), minTime),
290 cb.greaterThanOrEqualTo(tableRoot.get(mapKey), maxTime)));
292 predicates.add(cb.between(tableRoot.get(mapKey), minTime, maxTime));
294 } catch (final Exception e) {
295 logger.debug("Exception in getOrchestrationFiltersFromInfraActive(): {}", e.getMessage(), e);
298 } else if ("DOES_NOT_EQUAL".equalsIgnoreCase(entry.getValue().get(0))) {
299 predicates.add(cb.notEqual(tableRoot.get(mapKey), propertyValue));
301 predicates.add(cb.equal(tableRoot.get(mapKey), propertyValue));
306 final Order order = cb.asc(tableRoot.get(START_TIME));
308 return executeInfraQuery(crit, predicates, order);
311 // Added this method for Tenant Isolation project ( 1802-295491a) to query the mso_requests DB
312 // (infra_active_requests table) for operationalEnvId and OperationalEnvName
316 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#
317 * getCloudOrchestrationFiltersFromInfraActive(java.util.Map)
320 public List<InfraActiveRequests> getCloudOrchestrationFiltersFromInfraActive(
321 final Map<String, String> orchestrationMap) {
322 final List<Predicate> predicates = new LinkedList<>();
323 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
324 final CriteriaQuery<InfraActiveRequests> crit = cb.createQuery(InfraActiveRequests.class);
325 final Root<InfraActiveRequests> tableRoot = crit.from(InfraActiveRequests.class);
327 // Add criteria on OperationalEnvironment RequestScope when requestorId is only specified in
329 // as the same requestorId can also match on different API methods
330 final String resourceType = orchestrationMap.get("resourceType");
331 if (resourceType == null) {
332 predicates.add(cb.equal(tableRoot.get("requestScope"), OPENV));
335 for (final Map.Entry<String, String> entry : orchestrationMap.entrySet()) {
336 String mapKey = entry.getKey();
337 if (mapKey.equalsIgnoreCase("requestorId")) {
338 mapKey = "requestorId";
339 } else if (mapKey.equalsIgnoreCase("requestExecutionDate")) {
340 mapKey = "startTime";
341 } else if (mapKey.equalsIgnoreCase("operationalEnvironmentId")) {
342 mapKey = "operationalEnvId";
343 } else if (mapKey.equalsIgnoreCase("operationalEnvironmentName")) {
344 mapKey = "operationalEnvName";
345 } else if (mapKey.equalsIgnoreCase("resourceType")) {
346 mapKey = "requestScope";
349 final String propertyValue = entry.getValue();
350 if (mapKey.equals("startTime")) {
351 final SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy");
353 final Date thisDate = format.parse(propertyValue);
354 final Timestamp minTime = new Timestamp(thisDate.getTime());
355 final Timestamp maxTime = new Timestamp(thisDate.getTime() + TimeUnit.DAYS.toMillis(1));
357 predicates.add(cb.between(tableRoot.get(mapKey), minTime, maxTime));
358 } catch (final Exception e) {
359 logger.debug("Exception in getCloudOrchestrationFiltersFromInfraActive(): {}", e.getMessage());
363 predicates.add(cb.equal(tableRoot.get(mapKey), propertyValue));
367 final Order order = cb.asc(tableRoot.get(START_TIME));
368 return executeInfraQuery(crit, predicates, order);
374 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#getRequestListFromInfraActive(java .lang.String,
375 * java.lang.String, java.lang.String)
378 public List<InfraActiveRequests> getRequestListFromInfraActive(final String queryAttributeName,
379 final String queryValue, final String requestType) {
380 logger.debug("Get list of infra requests from DB with {} = {}", queryAttributeName, queryValue);
384 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
385 final CriteriaQuery<InfraActiveRequests> crit = cb.createQuery(InfraActiveRequests.class);
386 final Root<InfraActiveRequests> candidateRoot = crit.from(InfraActiveRequests.class);
387 final Predicate isEqual = cb.equal(candidateRoot.get(queryAttributeName), queryValue);
388 final Order orderDesc = cb.desc(candidateRoot.get(START_TIME));
389 final Order orderAsc = cb.asc(candidateRoot.get(SOURCE));
391 final List<InfraActiveRequests> arList = entityManager.createQuery(crit).getResultList();
392 if (arList != null && !arList.isEmpty()) {
395 } catch (final Exception exception) {
396 logger.error("Unable to execute query", exception);
398 return Collections.emptyList();
405 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#getRequestFromInfraActive(java. lang.String,
409 public InfraActiveRequests getRequestFromInfraActive(final String requestId, final String requestType) {
410 logger.debug("Get infra request from DB with id {}", requestId);
412 InfraActiveRequests ar = null;
414 final Query query = entityManager
415 .createQuery("from InfraActiveRequests where requestId = :requestId and requestType = :requestType");
416 query.setParameter(REQUEST_ID, requestId);
417 ar = this.getSingleResult(query);
424 * @see org.onap.so.requestsdb.InfraActiveRequestsRepositoryCustom#checkVnfIdStatus(java.lang.String)
427 public InfraActiveRequests checkVnfIdStatus(final String operationalEnvironmentId) {
428 logger.debug("Get Infra request from DB for OperationalEnvironmentId {}", operationalEnvironmentId);
430 InfraActiveRequests ar = null;
432 final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
433 final CriteriaQuery<InfraActiveRequests> crit = cb.createQuery(InfraActiveRequests.class);
434 final Root<InfraActiveRequests> candidateRoot = crit.from(InfraActiveRequests.class);
435 final Predicate operationalEnvEq = cb.equal(candidateRoot.get("operationalEnvId"), operationalEnvironmentId);
436 final Predicate requestStatusNotEq = cb.notEqual(candidateRoot.get(REQUEST_STATUS), "COMPLETE");
437 final Order startTimeOrder = cb.desc(candidateRoot.get("startTime"));
438 crit.select(candidateRoot);
439 crit.where(cb.and(operationalEnvEq, requestStatusNotEq));
440 crit.orderBy(startTimeOrder);
441 final TypedQuery<InfraActiveRequests> query = entityManager.createQuery(crit);
442 final List<InfraActiveRequests> results = query.getResultList();
443 if (!results.isEmpty()) {
450 protected <T> T getSingleResult(final Query query) {
451 query.setMaxResults(1);
452 final List<T> list = query.getResultList();
453 if (list == null || list.isEmpty()) {
455 } else if (list.size() == 1) {
458 throw new NonUniqueResultException();
464 public List<InfraActiveRequests> getInfraActiveRequests(final Map<String, String[]> filters, final long startTime,
465 final long endTime, final Integer maxResult) {
466 if (filters == null) {
467 return Collections.emptyList();
470 final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
472 final CriteriaQuery<InfraActiveRequests> criteriaQuery =
473 criteriaBuilder.createQuery(InfraActiveRequests.class);
474 final Root<InfraActiveRequests> tableRoot = criteriaQuery.from(InfraActiveRequests.class);
475 final List<Predicate> predicates = getPredicates(filters, criteriaBuilder, tableRoot);
477 final Timestamp minTime = new Timestamp(startTime);
478 final Timestamp maxTime = new Timestamp(endTime);
479 final Predicate basePredicate = criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
480 final Predicate additionalPredicate =
481 criteriaBuilder.and(criteriaBuilder.greaterThanOrEqualTo(tableRoot.get(START_TIME), minTime),
482 criteriaBuilder.or(tableRoot.get(END_TIME).isNull(),
483 criteriaBuilder.lessThanOrEqualTo(tableRoot.get(END_TIME), maxTime)));
485 criteriaQuery.where(criteriaBuilder.and(basePredicate, additionalPredicate));
486 if (maxResult != null) {
487 return entityManager.createQuery(criteriaQuery).setMaxResults(maxResult).getResultList();
489 return entityManager.createQuery(criteriaQuery).getResultList();
490 } catch (final Exception exception) {
491 logger.error("Unable to execute query using filters: {}", filters, exception);
492 return Collections.emptyList();
496 protected List<Predicate> getPredicates(final Map<String, String[]> filters, final CriteriaBuilder criteriaBuilder,
497 final Root<InfraActiveRequests> tableRoot) {
498 final List<Predicate> predicates = new LinkedList<>();
499 for (final Entry<String, String[]> entry : filters.entrySet()) {
500 final String[] params = entry.getValue();
501 if (VALID_COLUMNS.contains(entry.getKey()) && params.length == 2) {
502 final QueryOperationType operationType = QueryOperationType.getQueryOperationType(params[0]);
503 final Predicate predicate =
504 operationType.getPredicate(criteriaBuilder, tableRoot, entry.getKey(), params[1]);
505 predicates.add(predicate);