/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.geo.service.impl.resource; import com.emc.storageos.coordinator.client.model.Site; import com.emc.storageos.coordinator.client.model.SiteInfo; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.client.service.DrUtil; import com.emc.storageos.geomodel.VdcIpsecPropertiesResponse; import com.emc.storageos.model.ipsec.IpsecParam; import com.emc.storageos.security.geo.GeoServiceClient; import com.emc.storageos.security.ipsec.IPsecConfig; import com.emc.storageos.security.ipsec.IpUtils; import com.emc.storageos.systemservices.impl.upgrade.LocalRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import java.util.Map; import static com.emc.storageos.coordinator.client.model.Constants.IPSEC_KEY; import static com.emc.storageos.coordinator.client.model.Constants.IPSEC_STATUS; import static com.emc.storageos.coordinator.client.model.Constants.VDC_CONFIG_VERSION; @Path(value = GeoServiceClient.INTERVDC_IPSEC_SERVICE) public class IpsecService { private final static Logger log = LoggerFactory.getLogger(IpsecService.class); @Autowired private CoordinatorClient coordinator; @Autowired private IPsecConfig ipsecConfig; @POST @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public void changeIpsecStatus(@QueryParam("status") String status, @QueryParam("vdc_config_version") String vdcConfigVersion) { log.info("Processing a request for changing ipsec status: status=" + status + ", vdc_config_version=" + vdcConfigVersion); ipsecConfig.setIpsecStatus(status); log.info("Saved the ipsec status to ZK"); updateTargetSiteInfo(Long.parseLong(vdcConfigVersion)); } @POST @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Path("/key") public void rotateKey(IpsecParam ipsecParam) { log.info("Getting a request for ipsec key rotation"); ipsecConfig.setPreSharedKey(ipsecParam.getIpsecKey()); log.info("Saved the ipsec key to ZK"); updateTargetSiteInfo(ipsecParam.getVdcConfigVersion()); } @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Path("/properties") public VdcIpsecPropertiesResponse getIpsecProperties() { log.info("in getIpsecProperties()"); VdcIpsecPropertiesResponse response = new VdcIpsecPropertiesResponse(); try { String localIP = IpUtils.getLocalIPAddress(); Map<String, String> localIpsecProp = LocalRepository.getInstance().getIpsecProperties(localIP); response.setIpsecKey(localIpsecProp.get(IPSEC_KEY)); response.setIpsecStatus(localIpsecProp.get(IPSEC_STATUS)); response.setVdcConfigVersion(localIpsecProp.get(VDC_CONFIG_VERSION)); } catch (Exception e) { log.error("retrieve local ipsec properties error: " + e.getMessage()); } return response; } private void updateTargetSiteInfo(long vdcConfigVersion) { DrUtil drUtil = new DrUtil(coordinator); for (Site site : drUtil.listSites()) { SiteInfo siteInfo; String siteId = site.getUuid(); SiteInfo currentSiteInfo = coordinator.getTargetInfo(siteId, SiteInfo.class); if (currentSiteInfo != null) { siteInfo = new SiteInfo(vdcConfigVersion, SiteInfo.IPSEC_OP_ROTATE_KEY, currentSiteInfo.getTargetDataRevision(), SiteInfo.ActionScope.VDC); } else { siteInfo = new SiteInfo(vdcConfigVersion, SiteInfo.IPSEC_OP_ROTATE_KEY, SiteInfo.ActionScope.VDC); } coordinator.setTargetInfo(siteId, siteInfo); log.info("VDC target version updated to {} for site {}", siteInfo.getVdcConfigVersion(), siteId); } } }