/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
import java.util.List;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.coordinator.client.model.Constants;
import com.emc.storageos.coordinator.client.model.Site;
import com.emc.storageos.coordinator.client.model.SiteInfo;
import com.emc.storageos.coordinator.client.model.SiteState;
import com.emc.storageos.coordinator.common.impl.ConfigurationImpl;
import com.emc.storageos.coordinator.common.impl.ZkPath;
import com.emc.storageos.db.client.model.VirtualDataCenter;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
/**
* Cleanup db config from pre-yoda release
*/
public class VdcConfigMigration extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory.getLogger(
VdcConfigMigration.class);
@Override
public void process() throws MigrationCallbackException {
cleanupStaleDbConfig();
migrateVdcConfigToZk();
}
/**
* We store dbconfig/geodbconfig in under /config znode in pre-yoda versions. Since yoda, we move it
* to site specific area /site/<site uuid>/config. So after yoda upgrade is done, remove those stale config
* entries in zk
*/
private void cleanupStaleDbConfig() {
coordinatorClient.deletePath(String.format("%s/%s", ZkPath.CONFIG, Constants.DB_CONFIG));
coordinatorClient.deletePath(String.format("%s/%s", ZkPath.CONFIG, Constants.GEODB_CONFIG));
log.info("Removed dbconfig and geodbconfig in zk global area successfully");
}
/**
* We store vdc ip addresses in local db(VirtualDataCenter CF) in pre-yoda. Since yoda, we move it
* to zookeeper. We move all vdcs config to zk
*/
private void migrateVdcConfigToZk() {
List<URI> vdcIds = dbClient.queryByType(VirtualDataCenter.class, true);
for(URI vdcId : vdcIds) {
VirtualDataCenter vdc = dbClient.queryObject(VirtualDataCenter.class, vdcId);
if (vdc.getLocal()) {
continue;
}
// Insert vdc info
ConfigurationImpl vdcConfig = new ConfigurationImpl();
vdcConfig.setKind(Site.CONFIG_KIND);
vdcConfig.setId(vdc.getShortId());
coordinatorClient.persistServiceConfiguration(vdcConfig);
// insert DR active site info to ZK
Site site = new Site();
// TODO - we have no way to know site uuid in remote vdc during upgrade
// no harm for now. We don't care site uuid in remote vdc at all
site.setUuid(UUID.randomUUID().toString());
site.setName("Default Active Site");
site.setVdcShortId(vdc.getShortId());
site.setSiteShortId(Constants.CONFIG_DR_FIRST_SITE_SHORT_ID);
site.setHostIPv4AddressMap(vdc.getHostIPv4AddressesMap());
site.setHostIPv6AddressMap(vdc.getHostIPv6AddressesMap());
site.setState(SiteState.ACTIVE);
site.setCreationTime(System.currentTimeMillis());
site.setVip(vdc.getApiEndpoint());
site.setNodeCount(vdc.getHostCount());
coordinatorClient.persistServiceConfiguration(site.toConfiguration());
// update Site version in ZK
SiteInfo siteInfo = new SiteInfo(System.currentTimeMillis(), SiteInfo.NONE);
coordinatorClient.setTargetInfo(siteInfo);
}
log.info("Migrated vdc config from db to zk");
}
}