/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.coordinator.client.model;
import java.util.HashMap;
import java.util.Map;
import com.emc.storageos.coordinator.exceptions.CoordinatorException;
import com.emc.storageos.coordinator.exceptions.DecodingException;
import com.emc.storageos.services.util.Strings;
/**
* This class stores only the hash for the vdc config for now
* The complete vdc configuration is found in the local db
* We are simply creating a target here for VdcManager to watch.
*/
public class SiteInfo implements CoordinatorSerializable {
public static final String CONFIG_KIND = "sitetargetconfig";
public static final String CONFIG_ID = "global";
public static final String IPSEC_OP_ROTATE_KEY = "ipsec_rotate_key";
public static final String IPSEC_OP_ENABLE_INIT = "ipsec_enable_init";
public static final String DR_OP_ADD_STANDBY = "dr_add_standby";
public static final String DR_OP_REMOVE_STANDBY = "dr_remove_standby";
public static final String DR_OP_PAUSE_STANDBY = "dr_pause_standby";
public static final String DR_OP_RESUME_STANDBY = "dr_resume_standby";
public static final String DR_OP_DEGRADE_STANDBY = "dr_degrade_standby";
public static final String DR_OP_REJOIN_STANDBY = "dr_rejoin_standby";
public static final String DR_OP_SWITCHOVER = "dr_switchover";
public static final String DR_OP_FAILOVER = "dr_failover";
public static final String DR_OP_FAILBACK_DEGRADE = "dr_failbackDegrade";
public static final String DR_OP_CHANGE_DATA_REVISION = "dr_change_data_revision";
public static final String DR_OP_PURGE_DATA_REVISION = "dr_purge_data_revision";
public static final String DR_OP_NODE_RECOVERY = "dr_node_recovery";
public static final String IP_OP_CHANGE = "ip_change";
public static final String GEO_OP_CONFIG_CHANGE = "geo_config_change";
public static final String NONE = "noop";
/**
* Action Scope represents if an action involves nodes of the entire VDC or just ones of local site.
*/
public enum ActionScope {
VDC,
SITE
};
public static final String DEFAULT_TARGET_VERSION="0"; // No target data revision set
private static final String ENCODING_SEPARATOR = "\0";
private final long vdcConfigVersion;
private final String actionRequired;
private final String targetDataRevision;
private final ActionScope actionScope;
private final String sourceSiteUUID;
private final String targetSiteUUID;
public SiteInfo() {
vdcConfigVersion = 0;
actionRequired = NONE;
targetDataRevision = DEFAULT_TARGET_VERSION;
actionScope = ActionScope.SITE;
sourceSiteUUID = "";
targetSiteUUID = "";
}
public SiteInfo(final long version, final String actionRequired) {
this(version, actionRequired, DEFAULT_TARGET_VERSION);
}
public SiteInfo(final long version, final String actionRequired, final String targetDataRevision) {
this(version, actionRequired, targetDataRevision, ActionScope.SITE);
}
public SiteInfo(final long version, final String actionRequired, final ActionScope vdc) {
this(version, actionRequired, DEFAULT_TARGET_VERSION, ActionScope.SITE);
}
public SiteInfo(final long version, final String actionRequired, final String targetDataRevision, final ActionScope scope) {
this(version, actionRequired, targetDataRevision, scope, "", "");
}
public SiteInfo(final long version, final String actionRequired, final String targetDataRevision, final ActionScope scope,
final String sourceSiteUUID, final String targetSiteUUID) {
this.vdcConfigVersion = version;
this.actionRequired = actionRequired;
this.targetDataRevision = targetDataRevision;
this.actionScope = scope;
this.sourceSiteUUID = sourceSiteUUID == null ? "" : sourceSiteUUID;
this.targetSiteUUID = targetSiteUUID == null ? "" : targetSiteUUID;
}
public long getVdcConfigVersion() {
return vdcConfigVersion;
}
public String getActionRequired() {
return actionRequired;
}
public String getTargetDataRevision() {
return targetDataRevision;
}
public ActionScope getActionScope() {
return actionScope;
}
public boolean isNullTargetDataRevision() {
return SiteInfo.DEFAULT_TARGET_VERSION.equals(targetDataRevision);
}
public String getSourceSiteUUID() {
return sourceSiteUUID;
}
public String getTargetSiteUUID() {
return targetSiteUUID;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("SiteInfo [vdcConfigVersion=");
builder.append(vdcConfigVersion);
builder.append(", actionRequired=");
builder.append(actionRequired);
builder.append(", targetDataRevision=");
builder.append(targetDataRevision);
builder.append(", actionScope=");
builder.append(actionScope);
builder.append(", sourceSiteUUID=");
builder.append(sourceSiteUUID);
builder.append(", targetSiteUUID=");
builder.append(targetSiteUUID);
builder.append("]");
return builder.toString();
}
@Override
public String encodeAsString() {
StringBuilder sb = new StringBuilder();
sb.append(vdcConfigVersion);
sb.append(ENCODING_SEPARATOR);
sb.append(actionRequired);
sb.append(ENCODING_SEPARATOR);
sb.append(targetDataRevision);
sb.append(ENCODING_SEPARATOR);
sb.append(actionScope);
sb.append(ENCODING_SEPARATOR);
sb.append(sourceSiteUUID);
sb.append(ENCODING_SEPARATOR);
sb.append(targetSiteUUID);
return sb.toString();
}
@Override
public SiteInfo decodeFromString(String infoStr) throws DecodingException {
if (infoStr == null) {
return null;
}
final String[] strings = infoStr.split(ENCODING_SEPARATOR);
if (strings.length < 4) {
throw CoordinatorException.fatals.decodingError("invalid site info");
}
Long hash = Long.valueOf(strings[0]);
if (strings.length == 4) {
return new SiteInfo(hash, strings[1], strings[2], ActionScope.valueOf(strings[3]));
} else {
return new SiteInfo(hash, strings[1], strings[2], ActionScope.valueOf(strings[3]), strings[4], strings[5]);
}
}
@Override
public CoordinatorClassInfo getCoordinatorClassInfo() {
return new CoordinatorClassInfo(CONFIG_ID, CONFIG_KIND, "siteInfo");
}
}