/* * This file is part of DRBD Management Console by LINBIT HA-Solutions GmbH * written by Rasto Levrinc. * * Copyright (C) 2009, LINBIT HA-Solutions GmbH. * Copyright (C) 2011-2012, Rastislav Levrinc. * * DRBD Management Console is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * DRBD Management Console is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with drbd; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ package lcmc.crm.domain; import lcmc.common.domain.Application; import lcmc.common.domain.StringValue; import lcmc.common.domain.ResourceValue; import lcmc.logger.Logger; import lcmc.logger.LoggerFactory; /** * This class holds data of a service. */ public class Service extends ResourceValue { private static final Logger LOG = LoggerFactory.getLogger(Service.class); public static final String RES_ID_PREFIX = "res_"; public static final String STONITH_ID_PREFIX = "stonith_"; public static final String GRP_ID_PREFIX = "grp_"; public static final String CL_ID_PREFIX = "cl_"; public static final String MS_ID_PREFIX = "ms_"; private static final String CLONE_SET_NAME = Application.PM_CLONE_SET_NAME; private static final String MASTER_SLAVE_SET_NAME = Application.PM_MASTER_SLAVE_SET_NAME; private static final String GROUP_NAME = Application.PACEMAKER_GROUP_NAME; private String id = null; private String crmId = null; private boolean removed = false; private boolean removing = false; private boolean modified = false; private boolean modifying = false; private boolean orphaned = false; /** Heartbeat class: heartbeat, ocf, service (upstart, systemd). */ private String resourceClass = null; private boolean master = false; private boolean stonith = false; public Service(final String name) { super(name); } public final String getCrmId() { return crmId; } /** * Returns id of the service. This is usually heartbeat id without service * name and underscore part. */ public final String getId() { return id; } /** Sets heartbeat id and gui id without the service name part. */ public final void setCrmId(final String crmId) { this.crmId = crmId; LOG.debug1("setHeartbeatId: set crm id: " + crmId); if (GROUP_NAME.equals(getName())) { if (crmId.equals(GRP_ID_PREFIX)) { id = ""; } else if (crmId.startsWith(GRP_ID_PREFIX)) { id = crmId.substring(GRP_ID_PREFIX.length()); } else { id = crmId; } } else if (CLONE_SET_NAME.equals(getName())) { if (crmId.equals(CL_ID_PREFIX)) { id = ""; } else if (crmId.startsWith(CL_ID_PREFIX)) { id = crmId.substring(CL_ID_PREFIX.length()); } else { id = crmId; } } else if (MASTER_SLAVE_SET_NAME.equals(getName())) { if (crmId.equals(MS_ID_PREFIX)) { id = ""; } else if (crmId.startsWith(MS_ID_PREFIX)) { id = crmId.substring(MS_ID_PREFIX.length()); } else { id = crmId; } } else { if (crmId.startsWith(RES_ID_PREFIX + getName() + '_')) { id = crmId.substring((RES_ID_PREFIX + getName()).length() + 1); } else if (crmId.startsWith(STONITH_ID_PREFIX + getName() + '_')) { id = crmId.substring((STONITH_ID_PREFIX + getName()).length() + 1); } else { id = crmId; } } LOG.debug1("setHeartbeatId: set crm id: " + crmId + ", id: " + id); setValue("id", new StringValue(id)); } public final void setId(final String id) { this.id = id; LOG.debug1("setId: id: " + id); } /** Returns crm id from entered id. */ public final String getCrmIdFromId(final String id) { if (GROUP_NAME.equals(getName())) { if (id.startsWith(GRP_ID_PREFIX)) { return id; } else { return GRP_ID_PREFIX + id; } } else if (CLONE_SET_NAME.equals(getName())) { if (id.startsWith(CL_ID_PREFIX)) { return id; } else { return CL_ID_PREFIX + id; } } else if (MASTER_SLAVE_SET_NAME.equals(getName())) { if (id.startsWith(MS_ID_PREFIX)) { return id; } else { return MS_ID_PREFIX + id; } } else { if (id.startsWith(RES_ID_PREFIX + getName() + '_')) { return id; } else if (id.startsWith(STONITH_ID_PREFIX + getName() + '_')) { return id; } else if (stonith) { return STONITH_ID_PREFIX + getName() + '_' + id; } else { return RES_ID_PREFIX + getName() + '_' + id; } } } public final void setIdAndCrmId(final String id) { this.id = id; crmId = getCrmIdFromId(id); setValue("id", new StringValue(id)); } public final void setRemoved(final boolean removed) { this.removed = removed; if (removed) { removing = true; } } public final boolean isRemoved() { return removed || removing; } public final void doneRemoving() { this.removing = false; } public final void setModified(final boolean modified) { this.modified = modified; if (modified) { modifying = true; } } public final void doneModifying() { modifying = false; } /** * Makes the service available, after the status as seen in the gui was * confirmed from the heartbeat. */ public final void setAvailable() { setNew(false); modified = false; removed = false; } /** * Returns whether the service is available. It is not available if it was * just created, it was just removed or modified. */ public final boolean isAvailable() { return !isNew() && !modified && !removed && !modifying && !removing && !orphaned; } /** * Returns whether the service is available with text why it isn't, null if * it is. */ public final String isAvailableWithText() { if (isNew()) { return "it is not applied yet"; } else if (modified) { return "it is being modified"; } else if (removed) { return "it is being removed"; } else if (modifying) { return "it is being modified"; } else if (removing) { return "it is being removed"; } else if (orphaned) { return "cannot do that to an orphan"; } return null; } /** * Sets heartbeat resource class heartbeat (old style), ocf, lsb (from * init.d), service (upstart, systemd). */ public final void setResourceClass(final String resourceClass) { this.resourceClass = resourceClass; } /** Returns the heartbeat class of this service. */ public final String getResourceClass() { return resourceClass; } public void setMaster(final boolean master) { this.master = master; } public boolean isMaster() { return master; } public final void setStonith(final boolean stonith) { this.stonith = stonith; } public final boolean isOrphaned() { return orphaned; } public final void setOrphaned(final boolean orphaned) { this.orphaned = orphaned; } }