2 * Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may
5 * not use this file except in compliance with the License. You may obtain
6 * a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 * implied. See the License for the specific language governing
14 * permissions and limitations under the License.
16 package org.akraino.validation.ui.service;
18 import java.io.IOException;
19 import java.net.DatagramSocket;
20 import java.net.InetAddress;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Random;
24 import java.util.concurrent.CompletableFuture;
25 import java.util.concurrent.ExecutorService;
27 import org.akraino.validation.ui.client.jenkins.JenkinsExecutorClient;
28 import org.akraino.validation.ui.client.jenkins.resources.Parameter;
29 import org.akraino.validation.ui.client.jenkins.resources.Parameters;
30 import org.akraino.validation.ui.conf.ExecutorServiceInitializer;
31 import org.akraino.validation.ui.dao.SubmissionDAO;
32 import org.akraino.validation.ui.data.SubmissionStatus;
33 import org.akraino.validation.ui.entity.Submission;
34 import org.akraino.validation.ui.service.utils.PrioritySupplier;
35 import org.akraino.validation.ui.service.utils.SubmissionHelper;
36 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
37 import org.onap.portalsdk.core.web.support.UserUtils;
38 import org.springframework.beans.factory.annotation.Autowired;
39 import org.springframework.context.ApplicationContext;
40 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
41 import org.springframework.stereotype.Service;
42 import org.springframework.transaction.annotation.Transactional;
44 import com.fasterxml.jackson.core.JsonParseException;
45 import com.fasterxml.jackson.databind.JsonMappingException;
49 public class DbSubmissionAdapter {
51 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(DbSubmissionAdapter.class);
52 private static final Object LOCK = new Object();
55 private SubmissionDAO submissionDAO;
58 private SubmissionHelper submissionHelper;
61 private JenkinsExecutorClient jenkinsService;
64 private DbResultAdapter dbAdapter;
67 BlueprintInstanceService bluInstService;
69 public Submission saveSubmission(Submission submission)
70 throws JsonParseException, JsonMappingException, IOException {
72 submission.setSubmissionStatus(SubmissionStatus.Submitted);
73 submissionDAO.saveOrUpdate(submission);
74 dbAdapter.associateSubmissionWithValidationResult(submission);
75 ApplicationContext context = new AnnotationConfigApplicationContext(ExecutorServiceInitializer.class);
76 ExecutorService service = (ExecutorService) context.getBean("executorService");
77 JenkinsTriggerSubmissionJob task = new JenkinsTriggerSubmissionJob(submission);
78 CompletableFuture<Submission> completableFuture = CompletableFuture
79 .supplyAsync(new PrioritySupplier<>(1, task::execute), service);
80 completableFuture.thenAcceptAsync(result -> this.callbackNotify(result));
85 public List<Submission> getSubmissions() {
87 return submissionDAO.getSubmissions();
91 public Submission getSubmission(String submissionId) {
93 return submissionDAO.getSubmission(Integer.valueOf(submissionId));
97 public void deleteSubmission(Integer submissionId) {
99 submissionDAO.deleteSubmission(submissionId);
103 public void deleteAll() {
104 synchronized (LOCK) {
105 submissionDAO.deleteAll();
109 private void callbackNotify(Submission submission) {
110 if (submission == null) {
113 submission.setSubmissionStatus(SubmissionStatus.Running);
114 submissionHelper.saveSubmission(submission);
117 private class JenkinsTriggerSubmissionJob {
119 private Submission submission;
121 public JenkinsTriggerSubmissionJob(Submission submission) {
122 this.submission = submission;
125 public Submission execute() {
126 try (final DatagramSocket socket = new DatagramSocket()) {
127 String jobName = System.getenv("JENKINS_JOB_NAME");
128 List<Parameter> listOfParameters = new ArrayList<Parameter>();
129 Parameters parameters = new Parameters();
130 Parameter parameter = new Parameter();
131 parameter.setName("SUBMISSION_ID");
132 parameter.setValue(String.valueOf(submission.getSubmissionId()));
133 listOfParameters.add(parameter);
134 parameter = new Parameter();
135 parameter.setName("BLUEPRINT");
136 parameter.setValue(submission.getValidationDbTestResult().getBlueprintInstance().getBlueprint()
137 .getBlueprintName());
138 listOfParameters.add(parameter);
139 parameter = new Parameter();
140 parameter.setName("LAYER");
141 if (submission.getValidationDbTestResult().getAllLayers()) {
142 parameter.setValue("all");
144 parameter.setValue(submission.getValidationDbTestResult().getBlueprintInstance()
145 .getBlueprintLayers().iterator().next().getLayer().toLowerCase());
147 listOfParameters.add(parameter);
148 parameter = new Parameter();
149 parameter.setName("VERSION");
150 parameter.setValue(submission.getValidationDbTestResult().getBlueprintInstance().getVersion());
151 listOfParameters.add(parameter);
152 parameter = new Parameter();
153 parameter.setName("LAB");
154 parameter.setValue(submission.getTimeslot().getLabInfo().getLab());
155 listOfParameters.add(parameter);
156 parameter = new Parameter();
157 parameter.setName("OPTIONAL");
158 parameter.setValue(String.valueOf(submission.getValidationDbTestResult().getOptional().toString()));
159 listOfParameters.add(parameter);
160 parameter = new Parameter();
161 parameter.setName("UI_IP");
162 Random random = new Random();
163 socket.connect(InetAddress.getByName(random.nextInt(256) + "." + random.nextInt(256) + "."
164 + random.nextInt(256) + "." + random.nextInt(256)), 10002);
165 String localIP = socket.getLocalAddress().getHostAddress();
166 parameter.setValue(localIP);
167 listOfParameters.add(parameter);
168 parameters.setParameter(listOfParameters);
169 jenkinsService.postJobWithQueryParams(jobName, parameters).toString();
171 } catch (Exception e) {
172 LOGGER.error(EELFLoggerDelegate.errorLogger,
173 "Error when triggering Jenkins job. " + UserUtils.getStackTrace(e));