| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.oozie.local; |
| |
| import org.apache.oozie.BundleEngine; |
| import org.apache.oozie.CoordinatorEngine; |
| import org.apache.oozie.DagEngine; |
| import org.apache.oozie.LocalOozieClient; |
| import org.apache.oozie.LocalOozieClientBundle; |
| import org.apache.oozie.LocalOozieClientCoord; |
| import org.apache.oozie.client.OozieClient; |
| import org.apache.oozie.service.BundleEngineService; |
| import org.apache.oozie.service.CallbackService; |
| import org.apache.oozie.service.CoordinatorEngineService; |
| import org.apache.oozie.service.DagEngineService; |
| import org.apache.oozie.service.Services; |
| import org.apache.oozie.service.XLogService; |
| import org.apache.oozie.servlet.CallbackServlet; |
| import org.apache.oozie.test.EmbeddedServletContainer; |
| import org.apache.oozie.util.ParamChecker; |
| import org.apache.oozie.util.XLog; |
| |
| /** |
| * LocalOozie runs workflows in an embedded Oozie instance . <p> LocalOozie is meant for development/debugging purposes |
| * only. |
| */ |
| public class LocalOozie { |
| private static EmbeddedServletContainer container; |
| private static boolean localOozieActive = false; |
| |
| /** |
| * Start LocalOozie. |
| * |
| * @throws Exception if LocalOozie could not be started. |
| */ |
| public synchronized static void start() throws Exception { |
| if (localOozieActive) { |
| throw new IllegalStateException("LocalOozie is already initialized"); |
| } |
| |
| String log4jFile = System.getProperty(XLogService.LOG4J_FILE, null); |
| String oozieLocalLog = System.getProperty("oozielocal.log", null); |
| if (log4jFile == null) { |
| System.setProperty(XLogService.LOG4J_FILE, "localoozie-log4j.properties"); |
| } |
| if (oozieLocalLog == null) { |
| System.setProperty("oozielocal.log", "./oozielocal.log"); |
| } |
| |
| localOozieActive = true; |
| new Services().init(); |
| |
| if (log4jFile != null) { |
| System.setProperty(XLogService.LOG4J_FILE, log4jFile); |
| } |
| else { |
| System.getProperties().remove(XLogService.LOG4J_FILE); |
| } |
| if (oozieLocalLog != null) { |
| System.setProperty("oozielocal.log", oozieLocalLog); |
| } |
| else { |
| System.getProperties().remove("oozielocal.log"); |
| } |
| |
| container = new EmbeddedServletContainer("oozie"); |
| container.addServletEndpoint("/callback", CallbackServlet.class); |
| container.start(); |
| String callbackUrl = container.getServletURL("/callback"); |
| Services.get().getConf().set(CallbackService.CONF_BASE_URL, callbackUrl); |
| XLog.getLog(LocalOozie.class).info("LocalOozie started callback set to [{0}]", callbackUrl); |
| } |
| |
| public static boolean isStarted() { |
| return localOozieActive; |
| } |
| |
| /** |
| * Stop LocalOozie. |
| */ |
| public synchronized static void stop() { |
| RuntimeException thrown = null; |
| try { |
| if (container != null) { |
| container.stop(); |
| } |
| } |
| catch (RuntimeException ex) { |
| thrown = ex; |
| } |
| container = null; |
| XLog.getLog(LocalOozie.class).info("LocalOozie stopped"); |
| try { |
| Services.get().destroy(); |
| } |
| catch (RuntimeException ex) { |
| if (thrown != null) { |
| thrown = ex; |
| } |
| } |
| localOozieActive = false; |
| if (thrown != null) { |
| throw thrown; |
| } |
| } |
| |
| /** |
| * Return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| * <p> |
| * The returned instance is configured |
| * with the user name of the JVM (the value of the system property 'user.name'). |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| */ |
| public static OozieClient getClient() { |
| return getClient(System.getProperty("user.name")); |
| } |
| |
| /** |
| * Return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| * <p> |
| * The returned instance is configured with the user name of the JVM (the |
| * value of the system property 'user.name'). |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| */ |
| public static OozieClient getCoordClient() { |
| return getClientCoord(System.getProperty("user.name")); |
| } |
| |
| /** |
| * Return a {@link org.apache.oozie.client.OozieClient} for LocalOozie configured for a given user. |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @param user user name to use in LocalOozie for running workflows. |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie configured for the given user. |
| */ |
| public static OozieClient getClient(String user) { |
| if (!localOozieActive) { |
| throw new IllegalStateException("LocalOozie is not initialized"); |
| } |
| ParamChecker.notEmpty(user, "user"); |
| DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(user); |
| return new LocalOozieClient(dagEngine); |
| } |
| |
| /** |
| * Return a {@link org.apache.oozie.client.OozieClient} for LocalOozie |
| * configured for a given user. |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @param user user name to use in LocalOozie for running coordinator. |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie |
| * configured for the given user. |
| */ |
| public static OozieClient getClientCoord(String user) { |
| if (!localOozieActive) { |
| throw new IllegalStateException("LocalOozie is not initialized"); |
| } |
| ParamChecker.notEmpty(user, "user"); |
| CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(user); |
| return new LocalOozieClientCoord(coordEngine); |
| } |
| |
| /** |
| * <p> |
| * The returned instance is configured with the user name of the JVM (the |
| * value of the system property 'user.name'). |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| */ |
| public static OozieClient getClientBundle() { |
| return getClientBundle(System.getProperty("user.name")); |
| } |
| |
| /** |
| * <p> |
| * The returned instance is configured with the user name of the JVM (the |
| * value of the system property 'user.name'). |
| * <p> |
| * The following methods of the client are NOP in the returned instance: |
| * {@link org.apache.oozie.client.OozieClient#validateWSVersion}, |
| * {@link org.apache.oozie.client.OozieClient#setHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeader}, |
| * {@link org.apache.oozie.client.OozieClient#removeHeader}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaderNames}, |
| * {@link org.apache.oozie.client.OozieClient#setSystemMode(OozieClient.SYSTEM_MODE)}, |
| * {@link org.apache.oozie.client.OozieClient#getHeaders}, |
| * {@link org.apache.oozie.client.OozieClient#getClientBuildVersion}. |
| * |
| * @param user user |
| * @return a {@link org.apache.oozie.client.OozieClient} for LocalOozie. |
| */ |
| public static OozieClient getClientBundle(String user) { |
| if (!localOozieActive) { |
| throw new IllegalStateException("LocalOozie is not initialized"); |
| } |
| ParamChecker.notEmpty(user, "user"); |
| BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(user); |
| return new LocalOozieClientBundle(bundleEngine); |
| } |
| } |