977e89d1dce307f163e28657ee3752f25b259838
[validation.git] / ui / src / main / java / org / akraino / validation / ui / service / DbSubmissionAdapter.java
1 /*
2  * Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package org.akraino.validation.ui.service;
17
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;
26
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;
45
46 import com.fasterxml.jackson.core.JsonParseException;
47 import com.fasterxml.jackson.databind.JsonMappingException;
48
49 @Service
50 @Transactional
51 public class DbSubmissionAdapter {
52
53     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(DbSubmissionAdapter.class);
54
55     @Autowired
56     private SubmissionDAO submissionDAO;
57
58     @Autowired
59     private SubmissionHelper submissionHelper;
60
61     @Autowired
62     private JenkinsExecutorClient jenkinsService;
63
64     @Autowired
65     private DbResultAdapter dbAdapter;
66
67     @Autowired
68     SiloService siloService;
69
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();
81             }
82         }
83         if (siloText == null) {
84             throw new IllegalArgumentException(
85                     "Lab does not exist: " + submissionData.getTimeslot().getLab().toString());
86         }
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;
97     }
98
99     public List<Submission> getSubmissions() {
100         return submissionDAO.getSubmissions();
101     }
102
103     public List<SubmissionData> getSubmissionDatas() throws JsonParseException, JsonMappingException, IOException {
104         List<Submission> submissions = submissionDAO.getSubmissions();
105         if (submissions == null || submissions.size() < 1) {
106             return null;
107         }
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);
117         }
118         return datas;
119     }
120
121     public SubmissionData getSubmissionData(String submissionId)
122             throws JsonParseException, JsonMappingException, IOException {
123         Submission submission = submissionDAO.getSubmission(Integer.valueOf(submissionId));
124         if (submission == null) {
125             return null;
126         }
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;
133     }
134
135     public Submission getSubmission(String submissionId) {
136         return submissionDAO.getSubmission(Integer.valueOf(submissionId));
137     }
138
139     public void deleteSubmission(Integer submissionId) {
140         submissionDAO.deleteSubmission(submissionId);
141     }
142
143     public void deleteAll() {
144         submissionDAO.deleteAll();
145     }
146
147     private void callbackNotify(SubmissionData submissionData) {
148         if (submissionData == null) {
149             return;
150         }
151         Submission submission = submissionHelper.getSubmission(submissionData.getSubmissionId());
152         submission.setSubmissionStatus(SubmissionStatus.Running);
153         submissionHelper.saveSubmission(submission);
154     }
155
156     private class JenkinsTriggerSubmissionJob {
157
158         private SubmissionData submissionData;
159
160         public JenkinsTriggerSubmissionJob(SubmissionData submissionData) {
161             this.submissionData = submissionData;
162         }
163
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");
181                 } else {
182                     parameter.setValue(submissionData.getValidationNexusTestResult().getwRobotNexusTestResults().get(0)
183                             .getBlueprintLayer().name().toLowerCase());
184                 }
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");
196                 parameter.setValue(
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));
213                 return null;
214             }
215         }
216     }
217
218 }