This project has retired. For details please refer to its
Attic page.
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 package org.apache.oozie.util;
019
020 import org.apache.hadoop.conf.Configuration;
021 import org.apache.oozie.CoordinatorJobBean;
022 import org.apache.oozie.client.Job;
023 import org.apache.oozie.service.SchemaService;
024 import org.apache.oozie.service.Services;
025 import org.apache.oozie.service.StatusTransitService;
026
027 public class StatusUtils {
028
029 /**
030 * This Function transforms the statuses based on the name space of the coordinator App
031 *
032 * @param coordJob This will be the coordinator job bean for which we need to get the status based on version
033 * @return Job.Status This would be the new status based on the app version.
034 */
035 public static Job.Status getStatus(CoordinatorJobBean coordJob) {
036 Job.Status newStatus = null;
037 if (coordJob != null) {
038 newStatus = coordJob.getStatus();
039 Configuration conf = Services.get().getConf();
040 boolean backwardSupportForCoordStatus = conf.getBoolean(
041 StatusTransitService.CONF_BACKWARD_SUPPORT_FOR_COORD_STATUS, false);
042 if (backwardSupportForCoordStatus) {
043 if (coordJob.getAppNamespace() != null
044 && coordJob.getAppNamespace().equals(SchemaService.COORDINATOR_NAMESPACE_URI_1)) {
045
046 if (coordJob.getStatus() == Job.Status.DONEWITHERROR) {
047 newStatus = Job.Status.SUCCEEDED;
048 }
049 else if (coordJob.getStatus() == Job.Status.PAUSED) {
050 newStatus = Job.Status.RUNNING;
051 }
052 else if (coordJob.getStatus() == Job.Status.RUNNING && coordJob.isDoneMaterialization()) {
053 newStatus = Job.Status.SUCCEEDED;
054 }
055 else if (coordJob.getStatus() == Job.Status.PREPSUSPENDED) {
056 newStatus = Job.Status.SUSPENDED;
057 }
058 else if (coordJob.getStatus() == Job.Status.PREPPAUSED) {
059 newStatus = Job.Status.PREP;
060 }
061 }
062 }
063 }
064 return newStatus;
065 }
066
067 /**
068 * This function changes back the status for coordinator rerun if the job was SUCCEEDED or SUSPENDED when rerun
069 * with backward support is true.
070 *
071 * @param coordJob This will be the coordinator job bean for which we need to get the status based on version
072 * @param prevStatus coordinator job previous status
073 * @return Job.Status This would be the new status based on the app version.
074 */
075 public static Job.Status getStatusForCoordRerun(CoordinatorJobBean coordJob, Job.Status prevStatus) {
076 Job.Status newStatus = null;
077 if (coordJob != null) {
078 newStatus = coordJob.getStatus();
079 Configuration conf = Services.get().getConf();
080 boolean backwardSupportForCoordStatus = conf.getBoolean(
081 StatusTransitService.CONF_BACKWARD_SUPPORT_FOR_COORD_STATUS, false);
082 if (backwardSupportForCoordStatus) {
083 if (coordJob.getAppNamespace() != null
084 && coordJob.getAppNamespace().equals(SchemaService.COORDINATOR_NAMESPACE_URI_1)) {
085
086 if (prevStatus == Job.Status.SUSPENDED) {
087 newStatus = Job.Status.SUSPENDED;
088 }
089 else if (coordJob.isDoneMaterialization() || prevStatus == Job.Status.SUCCEEDED) {
090 newStatus = Job.Status.SUCCEEDED;
091 coordJob.setDoneMaterialization();
092 }
093 }
094 }
095 }
096 return newStatus;
097 }
098
099 /**
100 * This function check if eligible to do action input check when running with backward support is true.
101 *
102 * @param coordJob This will be the coordinator job bean for which we need to get the status based on version
103 * @return true if eligible to do action input check
104 */
105 public static boolean getStatusForCoordActionInputCheck(CoordinatorJobBean coordJob) {
106 boolean ret = false;
107 if (coordJob != null) {
108 Configuration conf = Services.get().getConf();
109 boolean backwardSupportForCoordStatus = conf.getBoolean(
110 StatusTransitService.CONF_BACKWARD_SUPPORT_FOR_COORD_STATUS, false);
111 if (backwardSupportForCoordStatus) {
112 if (coordJob.getAppNamespace() != null
113 && coordJob.getAppNamespace().equals(SchemaService.COORDINATOR_NAMESPACE_URI_1)) {
114
115 if (coordJob.getStatus() == Job.Status.SUCCEEDED) {
116 ret = true;
117 }
118 else if (coordJob.getStatus() == Job.Status.SUSPENDED) {
119 ret = true;
120 }
121 }
122 }
123 }
124 return ret;
125 }
126
127 /**
128 * If namespace 0.1 is used and backward support is true, SUCCEEDED coord job can be killed
129 *
130 * @param coordJob the coordinator job
131 * @return true if namespace 0.1 is used and backward support is true, SUCCEEDED coord job can be killed
132 */
133 public static boolean isV1CoordjobKillable(CoordinatorJobBean coordJob) {
134 boolean ret = false;
135 if (coordJob != null) {
136 Configuration conf = Services.get().getConf();
137 boolean backwardSupportForCoordStatus = conf.getBoolean(
138 StatusTransitService.CONF_BACKWARD_SUPPORT_FOR_COORD_STATUS, false);
139 if (backwardSupportForCoordStatus) {
140 if (coordJob.getAppNamespace() != null
141 && coordJob.getAppNamespace().equals(SchemaService.COORDINATOR_NAMESPACE_URI_1)) {
142 if (coordJob.getStatus() == Job.Status.SUCCEEDED) {
143 ret = true;
144 }
145 }
146 }
147 }
148 return ret;
149 }
150 }