001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.util.db;
016
017 import java.sql.Timestamp;
018 import java.util.Date;
019
020 import org.apache.oozie.ErrorCode;
021 import org.apache.oozie.SLAEventBean;
022 import org.apache.oozie.client.SLAEvent.SlaAppType;
023 import org.apache.oozie.client.SLAEvent.Status;
024 import org.apache.oozie.command.CommandException;
025 import org.apache.oozie.service.Services;
026 import org.apache.oozie.service.StoreService;
027 import org.apache.oozie.store.CoordinatorStore;
028 import org.apache.oozie.store.SLAStore;
029 import org.apache.oozie.store.Store;
030 import org.apache.oozie.util.DateUtils;
031 import org.apache.oozie.util.XmlUtils;
032 import org.jdom.Element;
033 import org.jdom.JDOMException;
034
035 public class SLADbOperations {
036 public static final String CLIENT_ID_TAG = "oozie:sla:client-id";
037
038 public static void writeSlaRegistrationEvent(Element eSla, Store store,
039 String slaId, SlaAppType appType, String user, String groupName)
040 throws Exception {
041 // System.out.println("BBBBB SLA added");
042 if (eSla == null) {
043 return;
044 }
045 //System.out.println("Writing REG AAAAA " + slaId);
046 SLAEventBean sla = new SLAEventBean();
047 // sla.setClientId(getTagElement( eSla, "client-id"));
048 // sla.setClientId(getClientId());
049 sla.setAppName(getTagElement(eSla, "app-name"));
050 sla.setParentClientId(getTagElement(eSla, "parent-child-id"));
051 sla.setParentSlaId(getTagElement(eSla, "parent-sla-id"));
052 String strNominalTime = getTagElement(eSla, "nominal-time");
053 // System.out.println("AAAAA SLA nominal time "+ strNominalTime);
054 if (strNominalTime == null || strNominalTime.length() == 0) {
055 throw new RuntimeException("Nominal time is required"); // TODO:
056 // change to
057 // CommandException
058 }
059 Date nominalTime = DateUtils.parseDateUTC(strNominalTime);
060 // Setting expected start time
061 String strRelExpectedStart = getTagElement(eSla, "should-start");
062 if (strRelExpectedStart == null || strRelExpectedStart.length() == 0) {
063 throw new RuntimeException("should-start can't be empty");
064 }
065 int relExpectedStart = Integer.parseInt(strRelExpectedStart);
066 if (relExpectedStart < 0) {
067 sla.setExpectedStart(null);
068 }
069 else {
070 Date expectedStart = new Date(nominalTime.getTime()
071 + 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
087 * 60 * 1000);
088 sla.setExpectedEnd(expectedEnd);
089 }
090
091 sla.setNotificationMsg(getTagElement(eSla, "notification-msg"));
092 sla.setAlertContact(getTagElement(eSla, "alert-contact"));
093 sla.setDevContact(getTagElement(eSla, "dev-contact"));
094 sla.setQaContact(getTagElement(eSla, "qa-contact"));
095 sla.setSeContact(getTagElement(eSla, "se-contact"));
096 sla.setAlertFrequency(getTagElement(eSla, "alert-frequency"));
097 sla.setAlertPercentage(getTagElement(eSla, "alert-percentage"));
098
099 sla.setUpstreamApps(getTagElement(eSla, "upstream-apps"));
100
101 // Oozie defined
102
103 sla.setSlaId(slaId);
104 sla.setAppType(appType);
105 sla.setUser(user);
106 sla.setGroupName(groupName);
107 sla.setJobStatus(Status.CREATED);
108 sla.setStatusTimestamp(new Date());
109
110 SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class)
111 .getStore(SLAStore.class, store);
112 slaStore.insertSLAEvent(sla);
113 }
114
115 public static void writeSlaStatusEvent(String id,
116 Status status, Store store, SlaAppType appType) throws Exception {
117 SLAEventBean sla = new SLAEventBean();
118 sla.setSlaId(id);
119 sla.setJobStatus(status);
120 sla.setAppType(appType);
121 sla.setStatusTimestamp(new Date());
122 //System.out.println("Writing STATUS AAAAA " + id);
123 SLAStore slaStore = (SLAStore) Services.get().get(StoreService.class)
124 .getStore(SLAStore.class, store);
125 slaStore.insertSLAEvent(sla);
126 }
127
128 public static void writeStausEvent(String slaXml, String id, Store store,
129 Status stat, SlaAppType appType) throws CommandException {
130 if (slaXml == null || slaXml.length() == 0) {
131 return;
132 }
133 try {
134 writeSlaStatusEvent(id, stat, store, appType);
135 }
136 catch (Exception e) {
137 throw new CommandException(ErrorCode.E1007, " id " + id, e);
138 }
139 }
140
141 public static String getClientId() {
142 Services services = Services.get();
143 if (services == null) {
144 throw new RuntimeException("Services is not initialized");
145 }
146 String clientId = services.getConf().get(CLIENT_ID_TAG,
147 "oozie-default-instance"); // TODO" remove default
148 if (clientId == null) {
149 //System.out.println("CONF "
150 // + XmlUtils.prettyPrint(services.getConf()));
151 throw new RuntimeException(
152 "No SLA_CLIENT_ID defined in oozie-site.xml with property name "
153 + CLIENT_ID_TAG);
154 }
155 return clientId;
156 }
157
158 private static String getTagElement(Element elem, String tagName) {
159 if (elem != null
160 && elem.getChild(tagName, elem.getNamespace("sla")) != null) {
161 return elem.getChild(tagName, elem.getNamespace("sla")).getText()
162 .trim();
163 }
164 else {
165 return null;
166 }
167 }
168
169 }