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.db; 019 020 import java.util.Date; 021 022 import org.apache.oozie.ErrorCode; 023 import org.apache.oozie.SLAEventBean; 024 import org.apache.oozie.client.SLAEvent.SlaAppType; 025 import org.apache.oozie.client.SLAEvent.Status; 026 import org.apache.oozie.command.CommandException; 027 import org.apache.oozie.executor.jpa.SLAEventInsertJPAExecutor; 028 import org.apache.oozie.service.JPAService; 029 import org.apache.oozie.service.Services; 030 import org.apache.oozie.service.StoreService; 031 import org.apache.oozie.store.SLAStore; 032 import org.apache.oozie.store.Store; 033 import org.apache.oozie.util.DateUtils; 034 import org.apache.oozie.util.XLog; 035 import org.jdom.Element; 036 037 public class SLADbOperations { 038 public static final String CLIENT_ID_TAG = "oozie:sla:client-id"; 039 040 public static void writeSlaRegistrationEvent(Element eSla, Store store, String slaId, SlaAppType appType, String user, 041 String groupName) throws Exception { 042 // System.out.println("BBBBB SLA added"); 043 if (eSla == null) { 044 return; 045 } 046 // System.out.println("Writing REG AAAAA " + slaId); 047 SLAEventBean sla = new SLAEventBean(); 048 // sla.setClientId(getTagElement( eSla, "client-id")); 049 // sla.setClientId(getClientId()); 050 sla.setAppName(getTagElement(eSla, "app-name")); 051 sla.setParentClientId(getTagElement(eSla, "parent-child-id")); 052 sla.setParentSlaId(getTagElement(eSla, "parent-sla-id")); 053 String strNominalTime = getTagElement(eSla, "nominal-time"); 054 // System.out.println("AAAAA SLA nominal time "+ strNominalTime); 055 if (strNominalTime == null || strNominalTime.length() == 0) { 056 throw new RuntimeException("Nominal time is required"); // TODO: 057 // change to 058 // CommandException 059 } 060 Date nominalTime = DateUtils.parseDateUTC(strNominalTime); 061 // Setting expected start time 062 String strRelExpectedStart = getTagElement(eSla, "should-start"); 063 if (strRelExpectedStart == null || strRelExpectedStart.length() == 0) { 064 throw new RuntimeException("should-start can't be empty"); 065 } 066 int relExpectedStart = Integer.parseInt(strRelExpectedStart); 067 if (relExpectedStart < 0) { 068 sla.setExpectedStart(null); 069 } 070 else { 071 Date expectedStart = new Date(nominalTime.getTime() + relExpectedStart * 60 * 1000); 072 sla.setExpectedStart(expectedStart); 073 // sla.setExpectedStart(nominalTime); 074 } 075 076 // Setting expected end time 077 String strRelExpectedEnd = getTagElement(eSla, "should-end"); 078 if (strRelExpectedEnd == null || strRelExpectedEnd.length() == 0) { 079 throw new RuntimeException("should-end can't be empty"); 080 } 081 int relExpectedEnd = Integer.parseInt(strRelExpectedEnd); 082 if (relExpectedEnd < 0) { 083 sla.setExpectedEnd(null); 084 } 085 else { 086 Date expectedEnd = new Date(nominalTime.getTime() + relExpectedEnd * 60 * 1000); 087 sla.setExpectedEnd(expectedEnd); 088 } 089 090 sla.setNotificationMsg(getTagElement(eSla, "notification-msg")); 091 sla.setAlertContact(getTagElement(eSla, "alert-contact")); 092 sla.setDevContact(getTagElement(eSla, "dev-contact")); 093 sla.setQaContact(getTagElement(eSla, "qa-contact")); 094 sla.setSeContact(getTagElement(eSla, "se-contact")); 095 sla.setAlertFrequency(getTagElement(eSla, "alert-frequency")); 096 sla.setAlertPercentage(getTagElement(eSla, "alert-percentage")); 097 098 sla.setUpstreamApps(getTagElement(eSla, "upstream-apps")); 099 100 // Oozie defined 101 102 sla.setSlaId(slaId); 103 sla.setAppType(appType); 104 sla.setUser(user); 105 sla.setGroupName(groupName); 106 sla.setJobStatus(Status.CREATED); 107 sla.setStatusTimestamp(new Date()); 108 109 SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class).getStore(SLAStore.class, store); 110 slaStore.insertSLAEvent(sla); 111 } 112 113 public static void writeSlaRegistrationEvent(Element eSla, 114 String slaId, SlaAppType appType, String user, String groupName, XLog log) 115 throws Exception { 116 // System.out.println("BBBBB SLA added"); 117 if (eSla == null) { 118 return; 119 } 120 //System.out.println("Writing REG AAAAA " + slaId); 121 SLAEventBean sla = new SLAEventBean(); 122 // sla.setClientId(getTagElement( eSla, "client-id")); 123 // sla.setClientId(getClientId()); 124 sla.setAppName(getTagElement(eSla, "app-name")); 125 sla.setParentClientId(getTagElement(eSla, "parent-child-id")); 126 sla.setParentSlaId(getTagElement(eSla, "parent-sla-id")); 127 String strNominalTime = getTagElement(eSla, "nominal-time"); 128 // System.out.println("AAAAA SLA nominal time "+ strNominalTime); 129 if (strNominalTime == null || strNominalTime.length() == 0) { 130 throw new RuntimeException("Nominal time is required"); // TODO: 131 // change to 132 // CommandException 133 } 134 Date nominalTime = DateUtils.parseDateUTC(strNominalTime); 135 // Setting expected start time 136 String strRelExpectedStart = getTagElement(eSla, "should-start"); 137 if (strRelExpectedStart == null || strRelExpectedStart.length() == 0) { 138 throw new RuntimeException("should-start can't be empty"); 139 } 140 int relExpectedStart = Integer.parseInt(strRelExpectedStart); 141 if (relExpectedStart < 0) { 142 sla.setExpectedStart(null); 143 } 144 else { 145 Date expectedStart = new Date(nominalTime.getTime() 146 + relExpectedStart * 60 * 1000); 147 sla.setExpectedStart(expectedStart); 148 // sla.setExpectedStart(nominalTime); 149 } 150 151 // Setting expected end time 152 String strRelExpectedEnd = getTagElement(eSla, "should-end"); 153 if (strRelExpectedEnd == null || strRelExpectedEnd.length() == 0) { 154 throw new RuntimeException("should-end can't be empty"); 155 } 156 int relExpectedEnd = Integer.parseInt(strRelExpectedEnd); 157 if (relExpectedEnd < 0) { 158 sla.setExpectedEnd(null); 159 } 160 else { 161 Date expectedEnd = new Date(nominalTime.getTime() + relExpectedEnd 162 * 60 * 1000); 163 sla.setExpectedEnd(expectedEnd); 164 } 165 166 sla.setNotificationMsg(getTagElement(eSla, "notification-msg")); 167 sla.setAlertContact(getTagElement(eSla, "alert-contact")); 168 sla.setDevContact(getTagElement(eSla, "dev-contact")); 169 sla.setQaContact(getTagElement(eSla, "qa-contact")); 170 sla.setSeContact(getTagElement(eSla, "se-contact")); 171 sla.setAlertFrequency(getTagElement(eSla, "alert-frequency")); 172 sla.setAlertPercentage(getTagElement(eSla, "alert-percentage")); 173 174 sla.setUpstreamApps(getTagElement(eSla, "upstream-apps")); 175 176 // Oozie defined 177 178 sla.setSlaId(slaId); 179 sla.setAppType(appType); 180 sla.setUser(user); 181 sla.setGroupName(groupName); 182 sla.setJobStatus(Status.CREATED); 183 sla.setStatusTimestamp(new Date()); 184 185 //SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class) 186 // .getStore(SLAStore.class, store); 187 //slaStore.insertSLAEvent(sla); 188 189 JPAService jpaService = Services.get().get(JPAService.class); 190 if (jpaService != null) { 191 jpaService.execute(new SLAEventInsertJPAExecutor(sla)); 192 } 193 else { 194 log.error(ErrorCode.E0610); 195 } 196 } 197 198 public static void writeSlaStatusEvent(String id, 199 Status status, Store store, SlaAppType appType) throws Exception { 200 SLAEventBean sla = new SLAEventBean(); 201 sla.setSlaId(id); 202 sla.setJobStatus(status); 203 sla.setAppType(appType); 204 sla.setStatusTimestamp(new Date()); 205 //System.out.println("Writing STATUS AAAAA " + id); 206 SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class) 207 .getStore(SLAStore.class, store); 208 slaStore.insertSLAEvent(sla); 209 } 210 211 public static void writeSlaStatusEvent(String id, Status status, SlaAppType appType, XLog log) throws Exception { 212 SLAEventBean sla = new SLAEventBean(); 213 sla.setSlaId(id); 214 sla.setJobStatus(status); 215 sla.setAppType(appType); 216 sla.setStatusTimestamp(new Date()); 217 // System.out.println("Writing STATUS AAAAA " + id); 218 //SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class).getStore(SLAStore.class, store); 219 //slaStore.insertSLAEvent(sla); 220 221 JPAService jpaService = Services.get().get(JPAService.class); 222 if (jpaService != null) { 223 jpaService.execute(new SLAEventInsertJPAExecutor(sla)); 224 } 225 else { 226 log.error(ErrorCode.E0610); 227 } 228 } 229 230 public static void writeStausEvent(String slaXml, String id, Store store, 231 Status stat, SlaAppType appType) throws CommandException { 232 if (slaXml == null || slaXml.length() == 0) { 233 return; 234 } 235 try { 236 writeSlaStatusEvent(id, stat, store, appType); 237 } 238 catch (Exception e) { 239 throw new CommandException(ErrorCode.E1007, " id " + id, e); 240 } 241 } 242 243 public static void writeStausEvent(String slaXml, String id, Status stat, SlaAppType appType, XLog log) 244 throws CommandException { 245 if (slaXml == null || slaXml.length() == 0) { 246 return; 247 } 248 try { 249 writeSlaStatusEvent(id, stat, appType, log); 250 } 251 catch (Exception e) { 252 throw new CommandException(ErrorCode.E1007, " id " + id, e); 253 } 254 } 255 256 public static String getClientId() { 257 Services services = Services.get(); 258 if (services == null) { 259 throw new RuntimeException("Services is not initialized"); 260 } 261 String clientId = services.getConf().get(CLIENT_ID_TAG, 262 "oozie-default-instance"); // TODO" remove default 263 if (clientId == null) { 264 //System.out.println("CONF " 265 // + XmlUtils.prettyPrint(services.getConf())); 266 throw new RuntimeException( 267 "No SLA_CLIENT_ID defined in oozie-site.xml with property name " 268 + CLIENT_ID_TAG); 269 } 270 return clientId; 271 } 272 273 private static String getTagElement(Element elem, String tagName) { 274 if (elem != null 275 && elem.getChild(tagName, elem.getNamespace("sla")) != null) { 276 return elem.getChild(tagName, elem.getNamespace("sla")).getText() 277 .trim(); 278 } 279 else { 280 return null; 281 } 282 } 283 284 }