001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019package org.apache.oozie.servlet;
020
021import java.io.IOException;
022
023import javax.servlet.http.HttpServletRequest;
024import javax.servlet.http.HttpServletResponse;
025
026import org.apache.hadoop.conf.Configuration;
027import org.apache.oozie.DagEngine;
028import org.apache.oozie.DagEngineException;
029import org.apache.oozie.client.rest.JsonBean;
030import org.apache.oozie.service.DagEngineService;
031import org.apache.oozie.service.Services;
032import org.json.simple.JSONObject;
033import org.apache.oozie.ErrorCode;
034
035@SuppressWarnings("serial")
036public class V0JobServlet extends BaseJobServlet {
037
038    private static final String INSTRUMENTATION_NAME = "v0job";
039
040    public V0JobServlet() {
041        super(INSTRUMENTATION_NAME);
042    }
043
044    /*
045     * v0 service method to start a job
046     */
047    @Override
048    protected void startJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
049            IOException {
050        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
051
052        String jobId = getResourceName(request);
053        try {
054            dagEngine.start(jobId);
055        }
056        catch (DagEngineException ex) {
057            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
058        }
059    }
060
061    /*
062     * v0 service method to resume a job
063     */
064    @Override
065    protected void resumeJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
066            IOException {
067        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
068
069        String jobId = getResourceName(request);
070        try {
071            dagEngine.resume(jobId);
072        }
073        catch (DagEngineException ex) {
074            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
075        }
076    }
077
078    /*
079     * v0 service method to suspend a job
080     */
081    @Override
082    protected void suspendJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
083            IOException {
084        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
085
086        String jobId = getResourceName(request);
087        try {
088            dagEngine.suspend(jobId);
089        }
090        catch (DagEngineException ex) {
091            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
092        }
093    }
094
095    /*
096     * v0 service method to kill a job
097     */
098    @Override
099    protected JSONObject killJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
100            IOException {
101        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
102
103        String jobId = getResourceName(request);
104        try {
105            dagEngine.kill(jobId);
106        }
107        catch (DagEngineException ex) {
108            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
109        }
110        return null;
111    }
112
113    /*
114     * v0 service method to change a job
115     */
116    protected void changeJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
117            IOException {
118        // This code should not be reached. But if it happens somehow, we throw
119        // bad request exception.
120        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E1014);
121    }
122
123    /*
124     * v0 service method to reRun a job
125     */
126    @Override
127    protected JSONObject reRunJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
128            throws XServletException, IOException {
129        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
130
131        String jobId = getResourceName(request);
132        try {
133            dagEngine.reRun(jobId, conf);
134        }
135        catch (DagEngineException ex) {
136            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
137        }
138        return null;
139    }
140
141    /*
142     * v0 service method to get a job in JsonBean representation
143     */
144    @Override
145    protected JsonBean getJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
146            IOException {
147        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
148
149        JsonBean jobBean = null;
150        String jobId = getResourceName(request);
151        try {
152            jobBean = (JsonBean) dagEngine.getJob(jobId);
153        }
154        catch (DagEngineException ex) {
155            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
156        }
157
158        return jobBean;
159    }
160
161    /*
162     * v0 service method to get a job definition in String format
163     */
164    @Override
165    protected String getJobDefinition(HttpServletRequest request, HttpServletResponse response)
166            throws XServletException, IOException {
167        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
168
169        String wfDefinition = null;
170        String jobId = getResourceName(request);
171        try {
172            wfDefinition = dagEngine.getDefinition(jobId);
173        }
174        catch (DagEngineException ex) {
175            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
176        }
177        return wfDefinition;
178    }
179
180    /*
181     * v0 service method to stream a job log into response object
182     */
183    @Override
184    protected void streamJobLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
185            IOException {
186        DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request));
187
188        String jobId = getResourceName(request);
189        try {
190            dagEngine.streamLog(jobId, response.getWriter(), request.getParameterMap());
191        }
192        catch (DagEngineException ex) {
193            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
194        }
195    }
196
197    @Override
198    protected void streamJobErrorLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
199            IOException {
200        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0306);
201    }
202
203    @Override
204    protected void streamJobAuditLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
205            IOException {
206        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0306);
207    }
208
209    /*
210     * Not implemented in v0
211     */
212    @Override
213    protected void streamJobGraph(HttpServletRequest request, HttpServletResponse response)
214            throws XServletException, IOException {
215        // Should this error code be NOT_IMPLEMENTED?
216        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0306);
217    }
218
219    @Override
220    protected String getJMSTopicName(HttpServletRequest request, HttpServletResponse response) throws XServletException,
221            IOException {
222        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0306);
223    }
224
225    @Override
226    protected JSONObject getJobsByParentId(HttpServletRequest request, HttpServletResponse response) throws XServletException,
227            IOException {
228        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
229    }
230
231    @Override
232    protected JSONObject updateJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
233            throws XServletException, IOException {
234        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
235    }
236
237    @Override
238    protected JSONObject ignoreJob(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
239        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
240    }
241
242    @Override
243    protected String getJobStatus(HttpServletRequest request, HttpServletResponse response) throws XServletException,
244            IOException {
245        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
246    }
247
248    @Override
249    void slaEnableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
250        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
251    }
252
253    @Override
254    void slaDisableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException,
255            IOException {
256        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
257    }
258
259    @Override
260    void slaChange(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
261        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
262    }
263}