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