use of com.emc.storageos.coordinator.client.model.Site in project coprhd-controller by CoprHD.
the class DisasterRecoveryServiceTest method testAddStandby.
@Test
public void testAddStandby() {
// prepare parameters for adding standby
String name = "new-added-standby";
String desc = "standby-site-1-description";
String vip = "10.247.101.112";
String username = "root";
String password = "password";
String uuid = "new-added-standby-site-1";
String version = "vipr-2.4.0.0.100";
HashMap<String, String> hostIPv4AddressMap = new HashMap<String, String>();
hostIPv4AddressMap.put("vipr1", "10.247.101.111");
SiteConfigRestRep config = new SiteConfigRestRep();
config.setUuid(uuid);
config.setVip(vip);
config.setHostIPv4AddressMap(hostIPv4AddressMap);
config.setHostIPv6AddressMap(new HashMap<String, String>());
com.emc.vipr.client.core.Site site = mock(com.emc.vipr.client.core.Site.class);
doReturn(config).when(site).getStandbyConfig();
// mock a ViPRCoreClient with specific UUID
ViPRCoreClient mockViPRCoreClient = mock(ViPRCoreClient.class);
doReturn(mockViPRCoreClient).when(drService).createViPRCoreClient(vip, username, password);
doReturn(site).when(mockViPRCoreClient).site();
// mock a ViPRSystemClient with specific UUID
doReturn(mockViPRSystemClient(version)).when(drService).createViPRSystemClient(vip, username, password);
// mock a local VDC
List<Configuration> allConfigs = new ArrayList<>();
allConfigs.add(standbySite1.toConfiguration());
allConfigs.add(standbySite2.toConfiguration());
allConfigs.add(primarySite.toConfiguration());
doReturn(allConfigs).when(coordinator).queryAllConfiguration(String.format("%s/vdc1", Site.CONFIG_KIND));
doReturn(standbySite1.toConfiguration()).when(coordinator).queryConfiguration(String.format("%s/vdc1", Site.CONFIG_KIND), standbySite1.getUuid());
doReturn(standbySite2.toConfiguration()).when(coordinator).queryConfiguration(String.format("%s/vdc1", Site.CONFIG_KIND), standbySite2.getUuid());
// mock new added site
Site newAdded = new Site();
newAdded.setUuid(uuid);
newAdded.setVip(vip);
newAdded.getHostIPv4AddressMap().put("vipr1", "1.1.1.1");
newAdded.setState(SiteState.ACTIVE);
doReturn(newAdded.toConfiguration()).when(coordinator).queryConfiguration(String.format("%s/vdc1", Site.CONFIG_KIND), newAdded.getUuid());
doReturn(new PropertyInfoExt()).when(coordinator).getTargetInfo(PropertyInfoExt.class);
// mock checking and validating methods
doNothing().when(drService).precheckForSiteNumber();
doNothing().when(drService).precheckForStandbyAdd(any(SiteConfigRestRep.class), any(ViPRCoreClient.class));
doNothing().when(drService).validateAddParam(any(SiteAddParam.class), any(List.class));
doReturn(standbySite1).when(drUtil).getActiveSite();
doReturn(secretKey).when(apiSignatureGeneratorMock).getSignatureKey(SignatureKeyType.INTERVDC_API);
// assemble parameters, add standby
SiteAddParam params = new SiteAddParam();
params.setName(name);
params.setDescription(desc);
params.setVip(vip);
params.setUsername(username);
params.setPassword(password);
SiteRestRep rep = drService.addStandby(params);
// verify the REST response
assertEquals(name, rep.getName());
assertEquals(desc, rep.getDescription());
assertEquals(vip, rep.getVipEndpoint());
}
use of com.emc.storageos.coordinator.client.model.Site in project coprhd-controller by CoprHD.
the class DisasterRecoveryServiceTest method setUp.
@Before
public void setUp() throws Exception {
Constructor constructor = ProductName.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
ProductName productName = (ProductName) constructor.newInstance();
productName.setName("vipr");
SoftwareVersion version = new SoftwareVersion("vipr-2.4.0.0.100");
LinkedList<SoftwareVersion> available = new LinkedList<SoftwareVersion>();
available.add(version);
RepositoryInfo repositoryInfo = new RepositoryInfo(new SoftwareVersion("vipr-2.4.0.0.100"), available);
standby = new SiteConfigRestRep();
standby.setClusterStable(true);
standby.setFreshInstallation(true);
standby.setDbSchemaVersion("2.4");
standby.setSoftwareVersion("vipr-2.4.0.0.150");
standby.setHostIPv4AddressMap(new HashMap<String, String>());
standby.getHostIPv4AddressMap().put("vipr1", "10.247.101.100");
// setup standby site
standbySite1 = new Site();
standbySite1.setUuid("site-uuid-1");
standbySite1.setVip("10.247.101.110");
standbySite1.getHostIPv4AddressMap().put("vipr1", "10.247.101.111");
standbySite1.getHostIPv4AddressMap().put("vipr2", "10.247.101.112");
standbySite1.getHostIPv4AddressMap().put("vipr3", "10.247.101.113");
standbySite1.setState(SiteState.STANDBY_PAUSED);
standbySite1.setVdcShortId("vdc1");
standbySite1.setNodeCount(1);
standbySite2 = new Site();
standbySite2.setUuid("site-uuid-2");
standbySite2.setState(SiteState.STANDBY_SYNCED);
standbySite2.setVdcShortId("vdc1");
standbySite2.setVip("10.247.101.158");
standbySite2.setNodeCount(1);
standbySite3 = new Site();
standbySite3.setUuid("site-uuid-3");
standbySite3.setVdcShortId("fake-vdc-id");
standbySite3.setState(SiteState.ACTIVE);
standbySite3.setVdcShortId("vdc1");
standbySite3.setNodeCount(1);
primarySite = new Site();
primarySite.setUuid("primary-site-uuid");
primarySite.setVip("127.0.0.1");
primarySite.setHostIPv4AddressMap(standbySite1.getHostIPv4AddressMap());
primarySite.setHostIPv6AddressMap(standbySite1.getHostIPv6AddressMap());
primarySite.setVdcShortId("vdc1");
primarySite.setState(SiteState.ACTIVE);
primarySite.setNodeCount(3);
// mock DBClient
dbClientMock = mock(DbClientImpl.class);
// mock coordinator client
coordinator = mock(CoordinatorClient.class);
// mock ipsecconfig
IPsecConfig ipsecConfig = mock(IPsecConfig.class);
doReturn("ipsec-preshared-key").when(ipsecConfig).getPreSharedKey();
drUtil = mock(DrUtil.class);
natCheckParam = new DRNatCheckParam();
apiSignatureGeneratorMock = mock(InternalApiSignatureKeyGenerator.class);
try {
KeyGenerator keyGenerator = null;
keyGenerator = KeyGenerator.getInstance("HmacSHA256");
secretKey = keyGenerator.generateKey();
} catch (NoSuchAlgorithmException e) {
fail("generate key fail");
}
drService = spy(new DisasterRecoveryService());
drService.setDbClient(dbClientMock);
drService.setCoordinator(coordinator);
drService.setDrUtil(drUtil);
drService.setSiteMapper(new SiteMapper());
drService.setSysUtils(new SysUtils());
drService.setIpsecConfig(ipsecConfig);
drService.setApiSignatureGenerator(apiSignatureGeneratorMock);
standbyConfig = new Site();
standbyConfig.setUuid("standby-site-uuid-1");
standbyConfig.setVip(standbySite1.getVip());
standbyConfig.setHostIPv4AddressMap(standbySite1.getHostIPv4AddressMap());
standbyConfig.setHostIPv6AddressMap(standbySite1.getHostIPv6AddressMap());
standbyConfig.setNodeCount(3);
doReturn(standbyConfig.getUuid()).when(coordinator).getSiteId();
Configuration config = new ConfigurationImpl();
config.setConfig(Constants.CONFIG_DR_ACTIVE_SITEID, primarySite.getUuid());
doReturn(config).when(coordinator).queryConfiguration(Constants.CONFIG_DR_ACTIVE_KIND, Constants.CONFIG_DR_ACTIVE_ID);
doReturn("2.4").when(coordinator).getCurrentDbSchemaVersion();
doReturn(primarySite.getUuid()).when(coordinator).getSiteId();
doReturn(ClusterInfo.ClusterState.STABLE).when(coordinator).getControlNodesState();
// Don't need to record audit log in UT
doNothing().when(drService).auditDisasterRecoveryOps(any(OperationTypeEnum.class), anyString(), anyString(), anyVararg());
doReturn(repositoryInfo).when(coordinator).getTargetInfo(RepositoryInfo.class);
doReturn(standbySite1).when(drUtil).getSiteFromLocalVdc(standbySite1.getUuid());
doReturn(standbySite2).when(drUtil).getSiteFromLocalVdc(standbySite2.getUuid());
doThrow(CoordinatorException.retryables.cannotFindSite(NONEXISTENT_ID)).when(drUtil).getSiteFromLocalVdc(NONEXISTENT_ID);
doReturn(primarySite).when(drUtil).getSiteFromLocalVdc(primarySite.getUuid());
SiteNetworkState siteNetworkState = new SiteNetworkState();
siteNetworkState.setNetworkHealth(SiteNetworkState.NetworkHealth.GOOD);
doReturn(siteNetworkState).when(drUtil).getSiteNetworkState(any(String.class));
CoordinatorClientInetAddressMap addressMap = new CoordinatorClientInetAddressMap();
addressMap.setDualInetAddress(DualInetAddress.fromAddresses("10.247.101.110", ""));
doReturn(addressMap).when(coordinator).getInetAddessLookupMap();
InterProcessLock lock = mock(InterProcessLock.class);
doReturn(lock).when(coordinator).getLock(anyString());
doReturn(true).when(lock).acquire(anyInt(), any(TimeUnit.class));
doNothing().when(lock).release();
}
use of com.emc.storageos.coordinator.client.model.Site in project coprhd-controller by CoprHD.
the class DisasterRecoveryServiceTest method testGetAllStandby.
@Test
public void testGetAllStandby() throws Exception {
List<Site> sites = new ArrayList<>();
sites.add(standbySite1);
sites.add(standbySite2);
sites.add(standbySite3);
doReturn(sites).when(drUtil).listSites();
doReturn(new SiteInfo()).when(coordinator).getTargetInfo(any(String.class), eq(SiteInfo.class));
SiteList responseList = drService.getSites();
assertNotNull(responseList.getSites());
assertEquals(3, responseList.getSites().size());
compareSiteResponse(responseList.getSites().get(0), standbySite1);
compareSiteResponse(responseList.getSites().get(1), standbySite2);
}
use of com.emc.storageos.coordinator.client.model.Site in project coprhd-controller by CoprHD.
the class DisasterRecoveryService method addStandby.
/**
* Attach one fresh install site to this active site as standby
* Or attach a active site for the local standby site when it's first being added.
*
* @param param site detail information
* @brief Add standby site
* @return site response information
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SECURITY_ADMIN, Role.RESTRICTED_SECURITY_ADMIN }, blockProxies = true)
public SiteRestRep addStandby(SiteAddParam param) {
log.info("Adding standby site: {}", param.getVip());
precheckForSiteNumber();
precheckForGeo();
List<Site> existingSites = drUtil.listStandbySites();
// parameter validation and precheck
validateAddParam(param, existingSites);
// check the version before using the ViPR client, otherwise there might be compatibility issues.
precheckStandbyVersion(param);
ViPRCoreClient viprCoreClient;
SiteConfigRestRep standbyConfig;
try {
viprCoreClient = createViPRCoreClient(param.getVip(), param.getUsername(), param.getPassword());
standbyConfig = viprCoreClient.site().getStandbyConfig();
} catch (Exception e) {
log.error("Unexpected error when retrieving standby config", e);
throw APIException.internalServerErrors.addStandbyPrecheckFailed("Cannot retrieve config from standby site");
}
String siteId = standbyConfig.getUuid();
precheckForStandbyAdd(standbyConfig, viprCoreClient);
InterProcessLock lock = drUtil.getDROperationLock();
Site standbySite = null;
try {
standbySite = new Site();
standbySite.setCreationTime((new Date()).getTime());
standbySite.setName(param.getName());
standbySite.setVdcShortId(drUtil.getLocalVdcShortId());
standbySite.setVip(standbyConfig.getVip());
standbySite.setVip6(standbyConfig.getVip6());
standbySite.getHostIPv4AddressMap().putAll(new StringMap(standbyConfig.getHostIPv4AddressMap()));
standbySite.getHostIPv6AddressMap().putAll(new StringMap(standbyConfig.getHostIPv6AddressMap()));
standbySite.setNodeCount(standbyConfig.getNodeCount());
standbySite.setUuid(standbyConfig.getUuid());
String shortId = generateShortId(drUtil.listSites());
standbySite.setSiteShortId(shortId);
standbySite.setDescription(param.getDescription());
standbySite.setState(SiteState.STANDBY_ADDING);
if (log.isDebugEnabled()) {
log.debug(standbySite.toString());
}
// Do this before tx get started which might write key to zk.
SecretKey secretKey = apiSignatureGenerator.getSignatureKey(SignatureKeyType.INTERVDC_API);
coordinator.startTransaction();
coordinator.addSite(standbyConfig.getUuid());
log.info("Persist standby site to ZK {}", shortId);
// coordinator.setTargetInfo(standbySite);
coordinator.persistServiceConfiguration(standbySite.toConfiguration());
drUtil.recordDrOperationStatus(standbySite.getUuid(), InterState.ADDING_STANDBY);
// wake up syssvc to regenerate configurations
long vdcConfigVersion = DrUtil.newVdcConfigVersion();
drUtil.updateVdcTargetVersion(coordinator.getSiteId(), SiteInfo.DR_OP_ADD_STANDBY, vdcConfigVersion);
for (Site site : existingSites) {
drUtil.updateVdcTargetVersion(site.getUuid(), SiteInfo.DR_OP_ADD_STANDBY, vdcConfigVersion);
}
// sync site related info with to be added standby site
long dataRevision = vdcConfigVersion;
List<Site> allStandbySites = new ArrayList<>();
allStandbySites.add(standbySite);
allStandbySites.addAll(existingSites);
SiteConfigParam configParam = prepareSiteConfigParam(allStandbySites, ipsecConfig.getPreSharedKey(), standbyConfig.getUuid(), dataRevision, vdcConfigVersion, secretKey);
viprCoreClient.site().syncSite(standbyConfig.getUuid(), configParam);
drUtil.updateVdcTargetVersion(siteId, SiteInfo.DR_OP_CHANGE_DATA_REVISION, vdcConfigVersion, dataRevision);
coordinator.commitTransaction();
auditDisasterRecoveryOps(OperationTypeEnum.ADD_STANDBY, AuditLogManager.AUDITLOG_SUCCESS, AuditLogManager.AUDITOP_BEGIN, standbySite.toBriefString());
return siteMapper.map(standbySite);
} catch (Exception e) {
log.error("Internal error for updating coordinator on standby", e);
coordinator.discardTransaction();
auditDisasterRecoveryOps(OperationTypeEnum.ADD_STANDBY, AuditLogManager.AUDITLOG_FAILURE, null, standbySite.toBriefString());
InternalServerErrorException addStandbyFailedException = APIException.internalServerErrors.addStandbyFailed(e.getMessage());
throw addStandbyFailedException;
} finally {
try {
lock.release();
} catch (Exception ignore) {
log.error(String.format("Lock release failed when adding standby %s", siteId));
}
}
}
use of com.emc.storageos.coordinator.client.model.Site in project coprhd-controller by CoprHD.
the class DisasterRecoveryService method precheckForSwitchover.
/*
* Internal method to check whether failover from active to standby is allowed
*/
protected void precheckForSwitchover(String standbyUuid) {
Site standby = null;
if (drUtil.isStandby()) {
throw APIException.badRequests.operationOnlyAllowedOnActiveSite();
}
try {
standby = drUtil.getSiteFromLocalVdc(standbyUuid);
} catch (CoordinatorException e) {
throw APIException.internalServerErrors.switchoverPrecheckFailed(standby.getUuid(), "Standby uuid is not valid, can't find it");
}
if (standbyUuid.equals(drUtil.getActiveSite().getUuid())) {
throw APIException.internalServerErrors.switchoverPrecheckFailed(standby.getName(), "Can't switchover to an active site");
}
if (!drUtil.isSiteUp(standbyUuid)) {
throw APIException.internalServerErrors.switchoverPrecheckFailed(standby.getName(), "Standby site is not up");
}
if (standby.getState() != SiteState.STANDBY_SYNCED) {
throw APIException.internalServerErrors.switchoverPrecheckFailed(standby.getName(), "Standby site is not fully synced");
}
List<Site> existingSites = drUtil.listSites();
for (Site site : existingSites) {
ClusterInfo.ClusterState state = coordinator.getControlNodesState(site.getUuid());
if (state != ClusterInfo.ClusterState.STABLE) {
log.info("Site {} is not stable {}", site.getUuid(), state);
throw APIException.internalServerErrors.switchoverPrecheckFailed(standby.getName(), String.format("Site %s is not stable", site.getName()));
}
}
}
Aggregations