/** * Copyright (c) 2010 Yahoo! Inc. All rights reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. See accompanying LICENSE file. */ package org.apache.oozie.util.db; import java.util.Date; import org.apache.oozie.ErrorCode; import org.apache.oozie.SLAEventBean; import org.apache.oozie.client.SLAEvent.SlaAppType; import org.apache.oozie.client.SLAEvent.Status; import org.apache.oozie.command.CommandException; import org.apache.oozie.executor.jpa.SLAEventInsertJPAExecutor; import org.apache.oozie.service.JPAService; import org.apache.oozie.service.Services; import org.apache.oozie.util.DateUtils; import org.jdom.Element; public class SLADbXOperations { public static final String CLIENT_ID_TAG = "oozie:sla:client-id"; /** * Create SLA registration event * * @param eSla SLA xml element * @param slaId SLA Id * @param appType SLA app type * @param user user name * @param groupName group name * @throws Exception */ public static void writeSlaRegistrationEvent(Element eSla, String slaId, SlaAppType appType, String user, String groupName) throws Exception { if (eSla == null) { return; } SLAEventBean sla = new SLAEventBean(); // sla.setClientId(getTagElement( eSla, "client-id")); // sla.setClientId(getClientId()); sla.setAppName(getTagElement(eSla, "app-name")); sla.setParentClientId(getTagElement(eSla, "parent-child-id")); sla.setParentSlaId(getTagElement(eSla, "parent-sla-id")); String strNominalTime = getTagElement(eSla, "nominal-time"); if (strNominalTime == null || strNominalTime.length() == 0) { throw new CommandException(ErrorCode.E1101); } Date nominalTime = DateUtils.parseDateUTC(strNominalTime); // Setting expected start time String strRelExpectedStart = getTagElement(eSla, "should-start"); if (strRelExpectedStart == null || strRelExpectedStart.length() == 0) { throw new CommandException(ErrorCode.E1102); } int relExpectedStart = Integer.parseInt(strRelExpectedStart); if (relExpectedStart < 0) { sla.setExpectedStart(null); } else { Date expectedStart = new Date(nominalTime.getTime() + relExpectedStart * 60 * 1000); sla.setExpectedStart(expectedStart); } // Setting expected end time String strRelExpectedEnd = getTagElement(eSla, "should-end"); if (strRelExpectedEnd == null || strRelExpectedEnd.length() == 0) { throw new RuntimeException("should-end can't be empty"); } int relExpectedEnd = Integer.parseInt(strRelExpectedEnd); if (relExpectedEnd < 0) { sla.setExpectedEnd(null); } else { Date expectedEnd = new Date(nominalTime.getTime() + relExpectedEnd * 60 * 1000); sla.setExpectedEnd(expectedEnd); } sla.setNotificationMsg(getTagElement(eSla, "notification-msg")); sla.setAlertContact(getTagElement(eSla, "alert-contact")); sla.setDevContact(getTagElement(eSla, "dev-contact")); sla.setQaContact(getTagElement(eSla, "qa-contact")); sla.setSeContact(getTagElement(eSla, "se-contact")); sla.setAlertFrequency(getTagElement(eSla, "alert-frequency")); sla.setAlertPercentage(getTagElement(eSla, "alert-percentage")); sla.setUpstreamApps(getTagElement(eSla, "upstream-apps")); // Oozie defined sla.setSlaId(slaId); sla.setAppType(appType); sla.setUser(user); sla.setGroupName(groupName); sla.setJobStatus(Status.CREATED); sla.setStatusTimestamp(new Date()); JPAService jpaService = Services.get().get(JPAService.class); if (jpaService != null) { jpaService.execute(new SLAEventInsertJPAExecutor(sla)); } else { throw new CommandException(ErrorCode.E0610, "unable to write sla event."); } } /** * Create SLA status event * * @param id SLA Id * @param status SLA status * @param appType SLA app type * @throws Exception */ public static void writeSlaStatusEvent(String id, Status status, SlaAppType appType) throws Exception { SLAEventBean sla = new SLAEventBean(); sla.setSlaId(id); sla.setJobStatus(status); sla.setAppType(appType); sla.setStatusTimestamp(new Date()); JPAService jpaService = Services.get().get(JPAService.class); if (jpaService != null) { jpaService.execute(new SLAEventInsertJPAExecutor(sla)); } else { throw new CommandException(ErrorCode.E0610, "unable to write sla event."); } } /** * Create SLA status event * * @param slaXml SLA xml element * @param id SLA Id * @param stat SLA status * @param appType SLA app type * @throws CommandException */ public static void writeStausEvent(String slaXml, String id, Status stat, SlaAppType appType) throws CommandException { if (slaXml == null || slaXml.length() == 0) { return; } try { writeSlaStatusEvent(id, stat, appType); } catch (Exception e) { throw new CommandException(ErrorCode.E1007, " id " + id, e); } } /** * Return client id * * @return client id */ public static String getClientId() { Services services = Services.get(); if (services == null) { throw new RuntimeException("Services is not initialized"); } String clientId = services.getConf().get(CLIENT_ID_TAG, "oozie-default-instance"); // TODO remove default if (clientId == null) { throw new RuntimeException( "No SLA_CLIENT_ID defined in oozie-site.xml with property name " + CLIENT_ID_TAG); } return clientId; } private static String getTagElement(Element elem, String tagName) { if (elem != null && elem.getChild(tagName, elem.getNamespace("sla")) != null) { return elem.getChild(tagName, elem.getNamespace("sla")).getText() .trim(); } else { return null; } } }