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.SubmissionData;
33 import org.akraino.validation.ui.data.SubmissionStatus;
34 import org.akraino.validation.ui.entity.LabSilo;
35 import org.akraino.validation.ui.entity.Submission;
36 import org.akraino.validation.ui.service.utils.PrioritySupplier;
37 import org.akraino.validation.ui.service.utils.SubmissionHelper;
38 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
39 import org.onap.portalsdk.core.web.support.UserUtils;
40 import org.springframework.beans.factory.annotation.Autowired;
41 import org.springframework.context.ApplicationContext;
42 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
43 import org.springframework.stereotype.Service;
44 import org.springframework.transaction.annotation.Transactional;
46 import com.fasterxml.jackson.core.JsonParseException;
47 import com.fasterxml.jackson.databind.JsonMappingException;
51 public class DbSubmissionAdapter {
53 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(DbSubmissionAdapter.class);
56 private SubmissionDAO submissionDAO;
59 private SubmissionHelper submissionHelper;
62 private JenkinsExecutorClient jenkinsService;
65 private DbResultAdapter dbAdapter;
68 SiloService siloService;
70 public SubmissionData saveSubmission(SubmissionData submissionData)
71 throws JsonParseException, JsonMappingException, IOException {
72 Submission submission = new Submission();
73 submission.setSubmissionStatus(SubmissionStatus.Submitted);
74 submission.setTimeslot(submissionData.getTimeslot());
75 submissionDAO.saveOrUpdate(submission);
76 submissionData.setSubmissionId(submission.getSubmissionId());
77 String siloText = null;
78 for (LabSilo silo : siloService.getSilos()) {
79 if (silo.getLab().getLab().equals(submissionData.getTimeslot().getLab().getLab())) {
80 siloText = silo.getSilo();
83 if (siloText == null) {
84 throw new IllegalArgumentException(
85 "Lab does not exist: " + submissionData.getTimeslot().getLab().toString());
87 submissionData.getValidationNexusTestResult().setSilo(siloText);
88 dbAdapter.associateSubmissionWithValidationResult(submissionData);
89 ApplicationContext context = new AnnotationConfigApplicationContext(ExecutorServiceInitializer.class);
90 ExecutorService service = (ExecutorService) context.getBean("executorService");
91 JenkinsTriggerSubmissionJob task = new JenkinsTriggerSubmissionJob(submissionData);
92 CompletableFuture<SubmissionData> completableFuture = CompletableFuture
93 .supplyAsync(new PrioritySupplier<>(1, task::execute), service);
94 completableFuture.thenAcceptAsync(result -> this.callbackNotify(result));
95 submissionData.setSubmissionId(submission.getSubmissionId());
96 return submissionData;
99 public List<Submission> getSubmissions() {
100 return submissionDAO.getSubmissions();
103 public List<SubmissionData> getSubmissionDatas() throws JsonParseException, JsonMappingException, IOException {
104 List<Submission> submissions = submissionDAO.getSubmissions();
105 if (submissions == null || submissions.size() < 1) {
108 List<SubmissionData> datas = new ArrayList<SubmissionData>();
109 for (Submission submission : submissions) {
110 SubmissionData submissionData = new SubmissionData();
111 submissionData.setStatus(submission.getSubmissionStatus());
112 submissionData.setSubmissionId(submission.getSubmissionId());
113 submissionData.setTimeslot(submission.getTimeslot());
114 submissionData.setValidationNexusTestResult(
115 dbAdapter.readResultFromDb(String.valueOf(submission.getSubmissionId())));
116 datas.add(submissionData);
121 public SubmissionData getSubmissionData(String submissionId)
122 throws JsonParseException, JsonMappingException, IOException {
123 Submission submission = submissionDAO.getSubmission(Integer.valueOf(submissionId));
124 if (submission == null) {
127 SubmissionData submissionData = new SubmissionData();
128 submissionData.setStatus(submission.getSubmissionStatus());
129 submissionData.setSubmissionId(submission.getSubmissionId());
130 submissionData.setTimeslot(submission.getTimeslot());
131 submissionData.setValidationNexusTestResult(dbAdapter.readResultFromDb(submissionId));
132 return submissionData;
135 public Submission getSubmission(String submissionId) {
136 return submissionDAO.getSubmission(Integer.valueOf(submissionId));
139 public void deleteSubmission(Integer submissionId) {
140 submissionDAO.deleteSubmission(submissionId);
143 public void deleteAll() {
144 submissionDAO.deleteAll();
147 private void callbackNotify(SubmissionData submissionData) {
148 if (submissionData == null) {
151 Submission submission = submissionHelper.getSubmission(submissionData.getSubmissionId());
152 submission.setSubmissionStatus(SubmissionStatus.Running);
153 submissionHelper.saveSubmission(submission);
156 private class JenkinsTriggerSubmissionJob {
158 private SubmissionData submissionData;
160 public JenkinsTriggerSubmissionJob(SubmissionData submissionData) {
161 this.submissionData = submissionData;
164 public SubmissionData execute() {
165 try (final DatagramSocket socket = new DatagramSocket()) {
166 String jobName = System.getenv("JENKINS_JOB_NAME");
167 List<Parameter> listOfParameters = new ArrayList<Parameter>();
168 Parameters parameters = new Parameters();
169 Parameter parameter = new Parameter();
170 parameter.setName("SUBMISSION_ID");
171 parameter.setValue(String.valueOf(submissionData.getSubmissionId()));
172 listOfParameters.add(parameter);
173 parameter = new Parameter();
174 parameter.setName("BLUEPRINT");
175 parameter.setValue(submissionData.getValidationNexusTestResult().getBlueprintName());
176 listOfParameters.add(parameter);
177 parameter = new Parameter();
178 parameter.setName("LAYER");
179 if (submissionData.getValidationNexusTestResult().getAllLayers()) {
180 parameter.setValue("all");
182 parameter.setValue(submissionData.getValidationNexusTestResult().getwRobotNexusTestResults().get(0)
183 .getBlueprintLayer().name().toLowerCase());
185 listOfParameters.add(parameter);
186 parameter = new Parameter();
187 parameter.setName("VERSION");
188 parameter.setValue(submissionData.getValidationNexusTestResult().getVersion());
189 listOfParameters.add(parameter);
190 parameter = new Parameter();
191 parameter.setName("LAB");
192 parameter.setValue(submissionData.getTimeslot().getLab().getLab().name());
193 listOfParameters.add(parameter);
194 parameter = new Parameter();
195 parameter.setName("OPTIONAL");
197 String.valueOf(submissionData.getValidationNexusTestResult().getOptional().toString()));
198 listOfParameters.add(parameter);
199 parameter = new Parameter();
200 parameter.setName("UI_IP");
201 Random random = new Random();
202 socket.connect(InetAddress.getByName(random.nextInt(256) + "." + random.nextInt(256) + "."
203 + random.nextInt(256) + "." + random.nextInt(256)), 10002);
204 String localIP = socket.getLocalAddress().getHostAddress();
205 parameter.setValue(localIP);
206 listOfParameters.add(parameter);
207 parameters.setParameter(listOfParameters);
208 jenkinsService.postJobWithQueryParams(jobName, parameters).toString();
209 return submissionData;
210 } catch (Exception e) {
211 LOGGER.error(EELFLoggerDelegate.errorLogger,
212 "Error when triggering Jenkins job. " + UserUtils.getStackTrace(e));