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 */
018package org.apache.oozie.util.db;
019
020import java.util.Date;
021
022import org.apache.oozie.ErrorCode;
023import org.apache.oozie.SLAEventBean;
024import org.apache.oozie.client.SLAEvent.SlaAppType;
025import org.apache.oozie.client.SLAEvent.Status;
026import org.apache.oozie.command.CommandException;
027import org.apache.oozie.service.Services;
028import org.apache.oozie.store.Store;
029import org.apache.oozie.util.DateUtils;
030import org.apache.oozie.util.XLog;
031import org.apache.oozie.util.XmlUtils;
032import org.jdom.Element;
033
034@Deprecated
035public class SLADbOperations {
036    public static final String CLIENT_ID_TAG = "oozie:sla:client-id";
037
038    public static SLAEventBean createSlaRegistrationEvent(Element eSla, Store store, String slaId, SlaAppType appType, String user,
039            String groupName) throws Exception {
040        if (eSla == null) {
041            return null;
042        }
043        SLAEventBean sla = new SLAEventBean();
044        sla.setAppName(getTagElement(eSla, "app-name"));
045        sla.setParentClientId(getTagElement(eSla, "parent-child-id"));
046        sla.setParentSlaId(getTagElement(eSla, "parent-sla-id"));
047        String strNominalTime = getTagElement(eSla, "nominal-time");
048        if (strNominalTime == null || strNominalTime.length() == 0) {
049            throw new RuntimeException("Nominal time is required"); // TODO:
050            // change to
051            // CommandException
052        }
053        Date nominalTime = DateUtils.parseDateOozieTZ(strNominalTime);
054        // Setting expected start time
055        String strRelExpectedStart = getTagElement(eSla, "should-start");
056        if (strRelExpectedStart != null && strRelExpectedStart.length() > 0) {
057            int relExpectedStart = Integer.parseInt(strRelExpectedStart);
058            if (relExpectedStart < 0) {
059                sla.setExpectedStart(null);
060            }
061            else {
062                Date expectedStart = new Date(nominalTime.getTime() + relExpectedStart * 60 * 1000);
063                sla.setExpectedStart(expectedStart);
064            }
065        } else {
066            sla.setExpectedStart(null);
067        }
068
069        // Setting expected end time
070        String strRelExpectedEnd = getTagElement(eSla, "should-end");
071        if (strRelExpectedEnd == null || strRelExpectedEnd.length() == 0) {
072            throw new RuntimeException("should-end can't be empty");
073        }
074        int relExpectedEnd = Integer.parseInt(strRelExpectedEnd);
075        if (relExpectedEnd < 0) {
076            sla.setExpectedEnd(null);
077        }
078        else {
079            Date expectedEnd = new Date(nominalTime.getTime() + relExpectedEnd * 60 * 1000);
080            sla.setExpectedEnd(expectedEnd);
081        }
082
083        sla.setNotificationMsg(getTagElement(eSla, "notification-msg"));
084        sla.setAlertContact(getTagElement(eSla, "alert-contact"));
085        sla.setDevContact(getTagElement(eSla, "dev-contact"));
086        sla.setQaContact(getTagElement(eSla, "qa-contact"));
087        sla.setSeContact(getTagElement(eSla, "se-contact"));
088        sla.setAlertFrequency(getTagElement(eSla, "alert-frequency"));
089        sla.setAlertPercentage(getTagElement(eSla, "alert-percentage"));
090
091        sla.setUpstreamApps(getTagElement(eSla, "upstream-apps"));
092
093        // Oozie defined
094
095        sla.setSlaId(slaId);
096        sla.setAppType(appType);
097        sla.setUser(user);
098        sla.setGroupName(groupName);
099        sla.setJobStatus(Status.CREATED);
100        sla.setStatusTimestamp(new Date());
101
102        return sla;
103    }
104
105    public static SLAEventBean createSlaRegistrationEvent(Element eSla,
106                                                 String slaId, SlaAppType appType, String user, String groupName, XLog log)
107            throws Exception {
108        if (eSla == null) {
109            return null;
110        }
111        SLAEventBean sla = new SLAEventBean();
112        sla.setAppName(getTagElement(eSla, "app-name"));
113        sla.setParentClientId(getTagElement(eSla, "parent-child-id"));
114        sla.setParentSlaId(getTagElement(eSla, "parent-sla-id"));
115        String strNominalTime = getTagElement(eSla, "nominal-time");
116        if (strNominalTime == null || strNominalTime.length() == 0) {
117            throw new RuntimeException("Nominal time is required"); // TODO:
118            // change to
119            // CommandException
120        }
121        Date nominalTime = DateUtils.parseDateOozieTZ(strNominalTime);
122        // Setting expected start time
123        String strRelExpectedStart = getTagElement(eSla, "should-start");
124        if (strRelExpectedStart != null && strRelExpectedStart.length() > 0) {
125            int relExpectedStart = Integer.parseInt(strRelExpectedStart);
126            if (relExpectedStart < 0) {
127                sla.setExpectedStart(null);
128            }
129            else {
130                Date expectedStart = new Date(nominalTime.getTime() + relExpectedStart * 60 * 1000);
131                sla.setExpectedStart(expectedStart);
132            }
133        } else {
134            sla.setExpectedStart(null);
135        }
136
137        // Setting expected end time
138        String strRelExpectedEnd = getTagElement(eSla, "should-end");
139        if (strRelExpectedEnd == null || strRelExpectedEnd.length() == 0) {
140            throw new RuntimeException("should-end can't be empty");
141        }
142        int relExpectedEnd = Integer.parseInt(strRelExpectedEnd);
143        if (relExpectedEnd < 0) {
144            sla.setExpectedEnd(null);
145        }
146        else {
147            Date expectedEnd = new Date(nominalTime.getTime() + relExpectedEnd
148                    * 60 * 1000);
149            sla.setExpectedEnd(expectedEnd);
150        }
151
152        sla.setNotificationMsg(getTagElement(eSla, "notification-msg"));
153        sla.setAlertContact(getTagElement(eSla, "alert-contact"));
154        sla.setDevContact(getTagElement(eSla, "dev-contact"));
155        sla.setQaContact(getTagElement(eSla, "qa-contact"));
156        sla.setSeContact(getTagElement(eSla, "se-contact"));
157        sla.setAlertFrequency(getTagElement(eSla, "alert-frequency"));
158        sla.setAlertPercentage(getTagElement(eSla, "alert-percentage"));
159
160        sla.setUpstreamApps(getTagElement(eSla, "upstream-apps"));
161
162        // Oozie defined
163
164        sla.setSlaId(slaId);
165        sla.setAppType(appType);
166        sla.setUser(user);
167        sla.setGroupName(groupName);
168        sla.setJobStatus(Status.CREATED);
169        sla.setStatusTimestamp(new Date());
170
171        return sla;
172    }
173
174    public static SLAEventBean createSlaStatusEvent(String id, Status status, SlaAppType appType, String appName,
175            XLog log) throws Exception {
176        SLAEventBean sla = new SLAEventBean();
177        sla.setSlaId(id);
178        sla.setJobStatus(status);
179        sla.setAppType(appType);
180        sla.setAppName(appName);
181        sla.setStatusTimestamp(new Date());
182        return sla;
183    }
184
185    public static SLAEventBean createStatusEvent(String slaXml, String id, Status stat, SlaAppType appType, XLog log)
186            throws CommandException {
187        if (slaXml == null || slaXml.length() == 0) {
188            return null;
189        }
190        try {
191            Element eSla = XmlUtils.parseXml(slaXml);
192            Element eAppName = eSla.getChild("app-name", eSla.getNamespace());
193            //stop-gap null handling till deprecated class is removed
194            String appNameStr = eAppName != null ? eAppName.getText() : null;
195            return createSlaStatusEvent(id, stat, appType, appNameStr, log);
196        }
197        catch (Exception e) {
198            throw new CommandException(ErrorCode.E1007, " id " + id, e.getMessage(), e);
199        }
200    }
201
202    public static String getClientId() {
203        Services services = Services.get();
204        if (services == null) {
205            throw new RuntimeException("Services is not initialized");
206        }
207        String clientId = services.getConf().get(CLIENT_ID_TAG,
208                                                 "oozie-default-instance"); // TODO" remove default
209        if (clientId == null) {
210            throw new RuntimeException(
211                    "No SLA_CLIENT_ID defined in oozie-site.xml with property name "
212                            + CLIENT_ID_TAG);
213        }
214        return clientId;
215    }
216
217    private static String getTagElement(Element elem, String tagName) {
218        if (elem != null
219                && elem.getChild(tagName, elem.getNamespace("sla")) != null) {
220            return elem.getChild(tagName, elem.getNamespace("sla")).getText()
221                    .trim();
222        }
223        else {
224            return null;
225        }
226    }
227
228}