/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.installer.controller;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import charva.awt.Component;
import charva.awt.event.ItemEvent;
import charva.awt.event.ItemListener;
import charvax.swing.JRadioButton;
import com.emc.storageos.installer.util.InstallerConstants;
import com.emc.storageos.services.util.Configuration;
import com.emc.storageos.installer.widget.SelectButtonPanel;
public class RejoinClusterController implements IConfigPanelController {
private static final Logger log = LoggerFactory.getLogger(RejoinClusterController.class);
private Configuration config;
private SelectButtonPanel panel;
private Set<Configuration> availabelClusters;
public String selectedCluster;
private Configuration selectedConfig;
public RejoinClusterController(Configuration config, SelectButtonPanel panel,
Set<Configuration> availabelClusters) {
this.config = config;
this.panel = panel;
this.availabelClusters = availabelClusters;
setupEventListener();
}
private void setupEventListener() {
panel.selectList1ItemListener(new SelectClusterListener());
}
/**
* Class listens on cluster selection
*/
class SelectClusterListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent ie) {
int statechange = ie.getStateChange();
Component source = (Component) ie.getSource();
if (statechange == ItemEvent.SELECTED) {
selectedCluster = ((JRadioButton) source).getText();
log.info("Selected cluster: {}", selectedCluster);
if (selectedCluster.contains("empty")) {
panel.getRoot().displayErrorMessage(new String[] {
"Could not find an available cluster to join.",
"Please exit installer, fix the error and re-try." });
}
}
}
}
/*
* Save contents from selected cluster to Configuration object
*/
private void saveClusterConfig() {
// get all the alive nodes from clusters, so it can be updated to configuration
// and used by node selection page to show which nodes currently available
Set<String> aliveNodes = new HashSet<String>();
for (Configuration cluster : availabelClusters) {
String selectedClusterVip = selectedCluster.split(InstallerConstants.CLUSTER_LABEL_DELIMITER)[0];
if (selectedClusterVip.equals(cluster.getNetworkVip())) {
selectedConfig = cluster;
aliveNodes.addAll(cluster.getAliveNodes());
}
}
if (selectedConfig != null) {
// save properties from selected cluster except node id, disk and net i/f
config.setNodeCount(selectedConfig.getNodeCount());
// update the list with consolidated alive nodes from all cluster
config.getAliveNodes().clear();
config.setAliveNodes(new ArrayList<String>(aliveNodes));
config.getNetworkIpv4Config().putAll(selectedConfig.getNetworkIpv4Config());
config.getNetworkIpv6Config().putAll(selectedConfig.getNetworkIpv6Config());
}
}
@Override
public String[] configurationIsCompleted() {
String err = null;
saveClusterConfig();
log.info("Saving cluster info: {}", config.toString());
return (err == null) ? null : new String[] { err };
}
}