Search in sources :

Example 51 with Site

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());
}
Also used : Site(com.emc.storageos.coordinator.client.model.Site) ViPRCoreClient(com.emc.vipr.client.ViPRCoreClient) SiteRestRep(com.emc.storageos.model.dr.SiteRestRep) Configuration(com.emc.storageos.coordinator.common.Configuration) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Matchers.anyString(org.mockito.Matchers.anyString) SiteAddParam(com.emc.storageos.model.dr.SiteAddParam) PropertyInfoExt(com.emc.storageos.coordinator.client.model.PropertyInfoExt) SiteConfigRestRep(com.emc.storageos.model.dr.SiteConfigRestRep) SiteList(com.emc.storageos.model.dr.SiteList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) Test(org.junit.Test)

Example 52 with Site

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();
}
Also used : Site(com.emc.storageos.coordinator.client.model.Site) IPsecConfig(com.emc.storageos.security.ipsec.IPsecConfig) ProductName(com.emc.storageos.coordinator.client.model.ProductName) Configuration(com.emc.storageos.coordinator.common.Configuration) OperationTypeEnum(com.emc.storageos.services.OperationTypeEnum) Matchers.anyString(org.mockito.Matchers.anyString) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) CoordinatorClient(com.emc.storageos.coordinator.client.service.CoordinatorClient) TimeUnit(java.util.concurrent.TimeUnit) SiteConfigRestRep(com.emc.storageos.model.dr.SiteConfigRestRep) KeyGenerator(javax.crypto.KeyGenerator) InternalApiSignatureKeyGenerator(com.emc.storageos.security.authentication.InternalApiSignatureKeyGenerator) ConfigurationImpl(com.emc.storageos.coordinator.common.impl.ConfigurationImpl) InternalApiSignatureKeyGenerator(com.emc.storageos.security.authentication.InternalApiSignatureKeyGenerator) RepositoryInfo(com.emc.storageos.coordinator.client.model.RepositoryInfo) Constructor(java.lang.reflect.Constructor) SiteMapper(com.emc.storageos.api.mapper.SiteMapper) DrUtil(com.emc.storageos.coordinator.client.service.DrUtil) LinkedList(java.util.LinkedList) SysUtils(com.emc.storageos.services.util.SysUtils) SoftwareVersion(com.emc.storageos.coordinator.client.model.SoftwareVersion) DbClientImpl(com.emc.storageos.db.client.impl.DbClientImpl) DRNatCheckParam(com.emc.storageos.model.dr.DRNatCheckParam) CoordinatorClientInetAddressMap(com.emc.storageos.coordinator.client.service.impl.CoordinatorClientInetAddressMap) SiteNetworkState(com.emc.storageos.coordinator.client.model.SiteNetworkState) InterProcessLock(org.apache.curator.framework.recipes.locks.InterProcessLock) Before(org.junit.Before)

Example 53 with Site

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);
}
Also used : Site(com.emc.storageos.coordinator.client.model.Site) SiteList(com.emc.storageos.model.dr.SiteList) SiteInfo(com.emc.storageos.coordinator.client.model.SiteInfo) ArrayList(java.util.ArrayList) Matchers.anyString(org.mockito.Matchers.anyString) Test(org.junit.Test)

Example 54 with Site

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));
        }
    }
}
Also used : Site(com.emc.storageos.coordinator.client.model.Site) StringMap(com.emc.storageos.db.client.model.StringMap) ViPRCoreClient(com.emc.vipr.client.ViPRCoreClient) ArrayList(java.util.ArrayList) SiteConfigParam(com.emc.storageos.model.dr.SiteConfigParam) APIException(com.emc.storageos.svcs.errorhandling.resources.APIException) InternalServerErrorException(com.emc.storageos.svcs.errorhandling.resources.InternalServerErrorException) CoordinatorException(com.emc.storageos.coordinator.exceptions.CoordinatorException) RetryableCoordinatorException(com.emc.storageos.coordinator.exceptions.RetryableCoordinatorException) UnknownHostException(java.net.UnknownHostException) Date(java.util.Date) SecretKey(javax.crypto.SecretKey) InternalServerErrorException(com.emc.storageos.svcs.errorhandling.resources.InternalServerErrorException) SiteConfigRestRep(com.emc.storageos.model.dr.SiteConfigRestRep) InterProcessLock(org.apache.curator.framework.recipes.locks.InterProcessLock) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Produces(javax.ws.rs.Produces) CheckPermission(com.emc.storageos.security.authorization.CheckPermission)

Example 55 with Site

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()));
        }
    }
}
Also used : Site(com.emc.storageos.coordinator.client.model.Site) ClusterInfo(com.emc.vipr.model.sys.ClusterInfo) CoordinatorException(com.emc.storageos.coordinator.exceptions.CoordinatorException) RetryableCoordinatorException(com.emc.storageos.coordinator.exceptions.RetryableCoordinatorException)

Aggregations

Site (com.emc.storageos.coordinator.client.model.Site)79 RetryableCoordinatorException (com.emc.storageos.coordinator.exceptions.RetryableCoordinatorException)21 APIException (com.emc.storageos.svcs.errorhandling.resources.APIException)21 CoordinatorException (com.emc.storageos.coordinator.exceptions.CoordinatorException)20 UnknownHostException (java.net.UnknownHostException)18 Produces (javax.ws.rs.Produces)17 InternalServerErrorException (com.emc.storageos.svcs.errorhandling.resources.InternalServerErrorException)16 Path (javax.ws.rs.Path)15 ZkPath (com.emc.storageos.coordinator.common.impl.ZkPath)14 ArrayList (java.util.ArrayList)14 DrUtil (com.emc.storageos.coordinator.client.service.DrUtil)11 CheckPermission (com.emc.storageos.security.authorization.CheckPermission)11 InterProcessLock (org.apache.curator.framework.recipes.locks.InterProcessLock)11 SiteInfo (com.emc.storageos.coordinator.client.model.SiteInfo)10 POST (javax.ws.rs.POST)10 SiteState (com.emc.storageos.coordinator.client.model.SiteState)9 Configuration (com.emc.storageos.coordinator.common.Configuration)8 VirtualDataCenter (com.emc.storageos.db.client.model.VirtualDataCenter)8 Consumes (javax.ws.rs.Consumes)8 ClusterInfo (com.emc.vipr.model.sys.ClusterInfo)6