70955c029e9f29c52e7a97ff440a2e88d84d0fe9
[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.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;
43
44 import com.fasterxml.jackson.core.JsonParseException;
45 import com.fasterxml.jackson.databind.JsonMappingException;
46
47 @Service
48 @Transactional
49 public class DbSubmissionAdapter {
50
51     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(DbSubmissionAdapter.class);
52     private static final Object LOCK = new Object();
53
54     @Autowired
55     private SubmissionDAO submissionDAO;
56
57     @Autowired
58     private SubmissionHelper submissionHelper;
59
60     @Autowired
61     private JenkinsExecutorClient jenkinsService;
62
63     @Autowired
64     private DbResultAdapter dbAdapter;
65
66     @Autowired
67     BlueprintInstanceService bluInstService;
68
69     public Submission saveSubmission(Submission submission)
70             throws JsonParseException, JsonMappingException, IOException {
71         synchronized (LOCK) {
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));
81             return submission;
82         }
83     }
84
85     public List<Submission> getSubmissions() {
86         synchronized (LOCK) {
87             return submissionDAO.getSubmissions();
88         }
89     }
90
91     public Submission getSubmission(String submissionId) {
92         synchronized (LOCK) {
93             return submissionDAO.getSubmission(Integer.valueOf(submissionId));
94         }
95     }
96
97     public void deleteSubmission(Integer submissionId) {
98         synchronized (LOCK) {
99             submissionDAO.deleteSubmission(submissionId);
100         }
101     }
102
103     public void deleteAll() {
104         synchronized (LOCK) {
105             submissionDAO.deleteAll();
106         }
107     }
108
109     private void callbackNotify(Submission submission) {
110         if (submission == null) {
111             return;
112         }
113         submission.setSubmissionStatus(SubmissionStatus.Running);
114         submissionHelper.saveSubmission(submission);
115     }
116
117     private class JenkinsTriggerSubmissionJob {
118
119         private Submission submission;
120
121         public JenkinsTriggerSubmissionJob(Submission submission) {
122             this.submission = submission;
123         }
124
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");
143                 } else {
144                     parameter.setValue(submission.getValidationDbTestResult().getBlueprintInstance()
145                             .getBlueprintLayers().iterator().next().getLayer().toLowerCase());
146                 }
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();
170                 return submission;
171             } catch (Exception e) {
172                 LOGGER.error(EELFLoggerDelegate.errorLogger,
173                         "Error when triggering Jenkins job. " + UserUtils.getStackTrace(e));
174                 return null;
175             }
176         }
177     }
178
179 }