UI initial implementation.
[validation.git] / ui / src / main / java / org / akraino / validation / ui / service / SubmissionService.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.net.DatagramSocket;
19 import java.net.InetAddress;
20 import java.net.MalformedURLException;
21 import java.net.SocketException;
22 import java.net.UnknownHostException;
23 import java.security.KeyManagementException;
24 import java.security.NoSuchAlgorithmException;
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.Random;
28 import java.util.concurrent.CompletableFuture;
29
30 import org.akraino.validation.ui.client.jenkins.JenkinsExecutorClient;
31 import org.akraino.validation.ui.client.jenkins.resources.Parameter;
32 import org.akraino.validation.ui.client.jenkins.resources.Parameters;
33 import org.akraino.validation.ui.config.AppInitializer;
34 import org.akraino.validation.ui.dao.SubmissionDAO;
35 import org.akraino.validation.ui.data.SubmissionStatus;
36 import org.akraino.validation.ui.entity.Submission;
37 import org.akraino.validation.ui.service.utils.PrioritySupplier;
38 import org.akraino.validation.ui.service.utils.SubmissionHelper;
39 import org.apache.commons.httpclient.HttpException;
40 import org.apache.log4j.Logger;
41 import org.springframework.beans.factory.annotation.Autowired;
42 import org.springframework.stereotype.Service;
43 import org.springframework.transaction.annotation.Transactional;
44
45 import com.sun.jersey.api.client.ClientHandlerException;
46 import com.sun.jersey.api.client.UniformInterfaceException;
47
48 @Service
49 @Transactional
50 public class SubmissionService {
51
52     private static final Logger LOGGER = Logger.getLogger(SubmissionService.class);
53
54     @Autowired
55     private SubmissionDAO submissionDAO;
56
57     @Autowired
58     private SubmissionHelper submissionHelper;
59
60     public Submission saveSubmission(Submission submission) {
61         submission.setSubmissionStatus(SubmissionStatus.Submitted);
62         submissionDAO.saveOrUpdate(submission);
63
64         JenkinsTriggerSubmissionJob task = new JenkinsTriggerSubmissionJob(submission);
65         CompletableFuture<Submission> completableFuture =
66                 CompletableFuture.supplyAsync(new PrioritySupplier<>(1, task::execute), AppInitializer.executorService);
67         completableFuture.thenAcceptAsync(result -> this.callbackNotify(result));
68
69         return submission;
70     }
71
72     public List<Submission> getSubmissions() {
73         return submissionDAO.getSubmissions();
74     }
75
76     public Submission getSubmission(String submissionId) {
77         return submissionDAO.getSubmission(Integer.valueOf(submissionId));
78     }
79
80     public void deleteSubmission(Integer submissionId) {
81         submissionDAO.deleteSubmission(submissionId);
82     }
83
84     public void deleteAll() {
85         submissionDAO.deleteAll();
86     }
87
88     private void callbackNotify(Submission submission) {
89         if (submission == null) {
90             return;
91         }
92         submission.setSubmissionStatus(SubmissionStatus.Running);
93         submissionHelper.saveSubmission(submission);
94     }
95
96     private class JenkinsTriggerSubmissionJob {
97
98         private Submission submission;
99
100         public JenkinsTriggerSubmissionJob(Submission submission) {
101             this.submission = submission;
102         }
103
104         public Submission execute() {
105             String url = System.getenv("jenkins_url");
106             String userName = System.getenv("jenkins_user_name");
107             String userPassword = System.getenv("jenkins_user_pwd");
108             String jobName = System.getenv("jenkins_job_name");
109             List<Parameter> listOfParameters = new ArrayList<Parameter>();
110             Parameters parameters = new Parameters();
111             Parameter parameter = new Parameter();
112             parameter.setName("SUBMISSION_ID");
113             parameter.setValue(String.valueOf(submission.getSubmissionId()));
114             listOfParameters.add(parameter);
115             parameter = new Parameter();
116             parameter.setName("BLUEPRINT");
117             parameter.setValue(submission.getBlueprintInstance().getBlueprint().getBlueprintName());
118             listOfParameters.add(parameter);
119             parameter = new Parameter();
120             parameter.setName("LAYER");
121             parameter.setValue(submission.getBlueprintInstance().getLayer().name());
122             listOfParameters.add(parameter);
123             parameter = new Parameter();
124             parameter.setName("UI_IP");
125             Random random = new Random();
126             String localIP = null;
127             try (final DatagramSocket socket = new DatagramSocket()) {
128                 socket.connect(InetAddress.getByName(random.nextInt(256) + "." + random.nextInt(256) + "."
129                         + random.nextInt(256) + "." + random.nextInt(256)), 10002);
130                 localIP = socket.getLocalAddress().getHostAddress();
131             } catch (SocketException | UnknownHostException e1) {
132                 LOGGER.error(e1);
133                 return null;
134             }
135             parameter.setValue(localIP);
136             listOfParameters.add(parameter);
137             parameters.setParameter(listOfParameters);
138             JenkinsExecutorClient client;
139             try {
140                 client = JenkinsExecutorClient.getInstance(userName, userPassword, url);
141                 submission.setJnksQueueJobItemUrl(client.postJobWithQueryParams(jobName, parameters).toString());
142             } catch (MalformedURLException | KeyManagementException | HttpException | ClientHandlerException
143                     | UniformInterfaceException | NoSuchAlgorithmException e) {
144                 LOGGER.error(e);
145                 return null;
146             }
147             return submission;
148         }
149     }
150
151 }