/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server.impl; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.cassandra.auth.IInternodeAuthenticator; import org.apache.cassandra.exceptions.ConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.coordinator.client.model.Site; import com.emc.storageos.coordinator.client.model.SiteState; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.client.service.DrUtil; /** * InternnodeAuthenticator for db/geodb in a DR environment. */ public class DrInternodeAuthenticator implements IInternodeAuthenticator { private static final Logger log = LoggerFactory.getLogger(DrInternodeAuthenticator.class); private boolean isStandbyDegraded; // default to false private boolean isStandbyPaused; // default to false private boolean isActiveDegraded; // default to false private List<InetAddress> localAddresses = new ArrayList<>(); @Override public boolean authenticate(InetAddress remoteAddress, int remotePort) { if (!(isStandbyDegraded || isStandbyPaused || isActiveDegraded) || localAddresses.contains(remoteAddress)) { log.info("Allow internode communication for {}", remoteAddress); return true; } else { log.debug("Refuse internode communication for {} since current site is degraded", remoteAddress); return false; } } /** * Called by Cassandra startup routine to initialize this instance */ @Override public void validateConfiguration() throws ConfigurationException { log.info("Initializing DrInternodeAuthenticator"); CoordinatorClient coordinatorClient = DbServiceImpl.instance.getCoordinator(); DrUtil drUtil = new DrUtil(coordinatorClient); Site localSite = drUtil.getLocalSite(); isStandbyDegraded = localSite.getState().equals(SiteState.STANDBY_DEGRADED) || localSite.getState().equals(SiteState.STANDBY_DEGRADING); isStandbyPaused = localSite.getState().equals(SiteState.STANDBY_PAUSING) || localSite.getState().equals(SiteState.STANDBY_PAUSED); isActiveDegraded = localSite.getState().equals(SiteState.ACTIVE_DEGRADED); Collection<String> nodeAddrList = localSite.getHostIPv4AddressMap().values(); if (!localSite.isUsingIpv4()) { nodeAddrList = localSite.getHostIPv6AddressMap().values(); } for (String nodeAddr : nodeAddrList) { try { localAddresses.add(InetAddress.getByName(nodeAddr)); } catch (UnknownHostException e) { log.error("Invalid IP address {}", nodeAddr); } } } }