Resubmitted with source code synchronized. Added integration test for hosttracker...
[controller.git] / opendaylight / switchmanager / src / main / java / org / opendaylight / controller / switchmanager / internal / SwitchManagerImpl.java
diff --git a/opendaylight/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java b/opendaylight/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java
deleted file mode 100755 (executable)
index 8ed7e46..0000000
+++ /dev/null
@@ -1,1795 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.switchmanager.internal;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Dictionary;
-import java.util.EnumSet;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.apache.felix.dm.Component;
-import org.eclipse.osgi.framework.console.CommandInterpreter;
-import org.eclipse.osgi.framework.console.CommandProvider;
-import org.opendaylight.controller.clustering.services.CacheConfigException;
-import org.opendaylight.controller.clustering.services.CacheExistException;
-import org.opendaylight.controller.clustering.services.ICacheUpdateAware;
-import org.opendaylight.controller.clustering.services.IClusterContainerServices;
-import org.opendaylight.controller.clustering.services.IClusterServices;
-import org.opendaylight.controller.configuration.IConfigurationContainerAware;
-import org.opendaylight.controller.sal.core.Bandwidth;
-import org.opendaylight.controller.sal.core.Config;
-import org.opendaylight.controller.sal.core.Description;
-import org.opendaylight.controller.sal.core.Name;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.controller.sal.core.NodeConnector;
-import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
-import org.opendaylight.controller.sal.core.Property;
-import org.opendaylight.controller.sal.core.State;
-import org.opendaylight.controller.sal.core.Tier;
-import org.opendaylight.controller.sal.core.UpdateType;
-import org.opendaylight.controller.sal.inventory.IInventoryService;
-import org.opendaylight.controller.sal.inventory.IListenInventoryUpdates;
-import org.opendaylight.controller.sal.utils.StatusCode;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
-import org.opendaylight.controller.sal.utils.IObjectReader;
-import org.opendaylight.controller.sal.utils.NodeCreator;
-import org.opendaylight.controller.sal.utils.ObjectReader;
-import org.opendaylight.controller.sal.utils.ObjectWriter;
-import org.opendaylight.controller.sal.utils.ServiceHelper;
-import org.opendaylight.controller.sal.utils.Status;
-import org.opendaylight.controller.switchmanager.IInventoryListener;
-import org.opendaylight.controller.switchmanager.ISpanAware;
-import org.opendaylight.controller.switchmanager.ISwitchManager;
-import org.opendaylight.controller.switchmanager.ISwitchManagerAware;
-import org.opendaylight.controller.switchmanager.SpanConfig;
-import org.opendaylight.controller.switchmanager.Subnet;
-import org.opendaylight.controller.switchmanager.SubnetConfig;
-import org.opendaylight.controller.switchmanager.Switch;
-import org.opendaylight.controller.switchmanager.SwitchConfig;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * The class describes SwitchManager which is the central repository of all the
- * inventory data including nodes, node connectors, properties attached, Layer3
- * configurations, Span configurations, node configurations, network device
- * representations viewed by Controller Web applications. One SwitchManager
- * instance per container of the network. All the node/nodeConnector properties
- * are maintained in the default container only.
- */
-public class SwitchManagerImpl implements ISwitchManager,
-        IConfigurationContainerAware, IObjectReader,
-        ICacheUpdateAware<Long, String>, IListenInventoryUpdates,
-        CommandProvider {
-    private static Logger log = LoggerFactory
-            .getLogger(SwitchManagerImpl.class);
-    private static String ROOT = GlobalConstants.STARTUPHOME.toString();
-    private static final String SAVE = "Save";
-    private String subnetFileName = null, spanFileName = null,
-            switchConfigFileName = null;
-    private List<NodeConnector> spanNodeConnectors = new CopyOnWriteArrayList<NodeConnector>();
-    private ConcurrentMap<InetAddress, Subnet> subnets; // set of Subnets keyed by the InetAddress
-    private ConcurrentMap<String, SubnetConfig> subnetsConfigList;
-    private ConcurrentMap<Integer, SpanConfig> spanConfigList;
-    private ConcurrentMap<String, SwitchConfig> nodeConfigList; // manually configured parameters for the node like name and tier
-    private ConcurrentMap<Long, String> configSaveEvent;
-    private ConcurrentMap<Node, Map<String, Property>> nodeProps; // properties are maintained in global container only
-    private ConcurrentMap<NodeConnector, Map<String, Property>> nodeConnectorProps; // properties are maintained in global container only
-    private ConcurrentMap<Node, Map<String, NodeConnector>> nodeConnectorNames;
-    private IInventoryService inventoryService;
-    private Set<ISwitchManagerAware> switchManagerAware = Collections
-            .synchronizedSet(new HashSet<ISwitchManagerAware>());
-    private Set<IInventoryListener> inventoryListeners = Collections
-            .synchronizedSet(new HashSet<IInventoryListener>());
-    private Set<ISpanAware> spanAware = Collections
-            .synchronizedSet(new HashSet<ISpanAware>());
-    private byte[] MAC;
-    private static boolean hostRefresh = true;
-    private int hostRetryCount = 5;
-    private IClusterContainerServices clusterContainerService = null;
-    private String containerName = null;
-    private boolean isDefaultContainer = true;
-
-    public enum ReasonCode {
-        SUCCESS("Success"), FAILURE("Failure"), INVALID_CONF(
-                "Invalid Configuration"), EXIST("Entry Already Exist"), CONFLICT(
-                "Configuration Conflict with Existing Entry");
-
-        private String name;
-
-        private ReasonCode(String name) {
-            this.name = name;
-        }
-
-        public String toString() {
-            return name;
-        }
-    }
-
-    public void notifySubnetChange(Subnet sub, boolean add) {
-        synchronized (switchManagerAware) {
-            for (Object subAware : switchManagerAware) {
-                try {
-                    ((ISwitchManagerAware) subAware).subnetNotify(sub, add);
-                } catch (Exception e) {
-                    log.error("Failed to notify Subnet change {}",
-                            e.getMessage());
-                }
-            }
-        }
-    }
-
-    public void notifySpanPortChange(Node node, List<NodeConnector> ports,
-            boolean add) {
-        synchronized (spanAware) {
-            for (Object sa : spanAware) {
-                try {
-                    ((ISpanAware) sa).spanUpdate(node, ports, add);
-                } catch (Exception e) {
-                    log.error("Failed to notify Span Interface change {}",
-                            e.getMessage());
-                }
-            }
-        }
-    }
-
-    private void notifyModeChange(Node node, boolean proactive) {
-        synchronized (switchManagerAware) {
-            for (ISwitchManagerAware service : switchManagerAware) {
-                try {
-                    service.modeChangeNotify(node, proactive);
-                } catch (Exception e) {
-                    log.error("Failed to notify Subnet change {}",
-                            e.getMessage());
-                }
-            }
-        }
-    }
-
-    public void startUp() {
-        // Initialize configuration file names
-        subnetFileName = ROOT + "subnets" + this.getContainerName() + ".conf";
-        spanFileName = ROOT + "spanPorts_" + this.getContainerName() + ".conf";
-        switchConfigFileName = ROOT + "switchConfig_" + this.getContainerName()
-                + ".conf";
-
-        // Instantiate cluster synced variables
-        allocateCaches();
-        retrieveCaches();
-
-        /*
-         * Read startup and build database if we have not already gotten the
-         * configurations synced from another node
-         */
-        if (subnetsConfigList.isEmpty())
-            loadSubnetConfiguration();
-        if (spanConfigList.isEmpty())
-            loadSpanConfiguration();
-        if (nodeConfigList.isEmpty())
-            loadSwitchConfiguration();
-
-        MAC = getHardwareMAC();
-    }
-
-    public void shutDown() {
-        destroyCaches(this.getContainerName());
-    }
-
-    @SuppressWarnings("deprecation")
-    private void allocateCaches() {
-        if (this.clusterContainerService == null) {
-            log.warn("un-initialized clusterContainerService, can't create cache");
-            return;
-        }
-
-        try {
-            clusterContainerService.createCache(
-                    "switchmanager.subnetsConfigList",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache("switchmanager.spanConfigList",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache("switchmanager.nodeConfigList",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache("switchmanager.subnets",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache(
-                    "switchmanager.configSaveEvent",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache("switchmanager.nodeProps",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache(
-                    "switchmanager.nodeConnectorProps",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-            clusterContainerService.createCache(
-                    "switchmanager.nodeConnectorNames",
-                    EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-        } catch (CacheConfigException cce) {
-            log.error("\nCache configuration invalid - check cache mode");
-        } catch (CacheExistException ce) {
-            log.error("\nCache already exits - destroy and recreate if needed");
-        }
-    }
-
-    @SuppressWarnings({ "unchecked", "deprecation" })
-    private void retrieveCaches() {
-        if (this.clusterContainerService == null) {
-            log.info("un-initialized clusterContainerService, can't create cache");
-            return;
-        }
-
-        subnetsConfigList = (ConcurrentMap<String, SubnetConfig>) clusterContainerService
-                .getCache("switchmanager.subnetsConfigList");
-        if (subnetsConfigList == null) {
-            log.error("\nFailed to get cache for subnetsConfigList");
-        }
-
-        spanConfigList = (ConcurrentMap<Integer, SpanConfig>) clusterContainerService
-                .getCache("switchmanager.spanConfigList");
-        if (spanConfigList == null) {
-            log.error("\nFailed to get cache for spanConfigList");
-        }
-
-        nodeConfigList = (ConcurrentMap<String, SwitchConfig>) clusterContainerService
-                .getCache("switchmanager.nodeConfigList");
-        if (nodeConfigList == null) {
-            log.error("\nFailed to get cache for nodeConfigList");
-        }
-
-        subnets = (ConcurrentMap<InetAddress, Subnet>) clusterContainerService
-                .getCache("switchmanager.subnets");
-        if (subnets == null) {
-            log.error("\nFailed to get cache for subnets");
-        }
-
-        configSaveEvent = (ConcurrentMap<Long, String>) clusterContainerService
-                .getCache("switchmanager.configSaveEvent");
-        if (configSaveEvent == null) {
-            log.error("\nFailed to get cache for configSaveEvent");
-        }
-
-        nodeProps = (ConcurrentMap<Node, Map<String, Property>>) clusterContainerService
-                .getCache("switchmanager.nodeProps");
-        if (nodeProps == null) {
-            log.error("\nFailed to get cache for nodeProps");
-        }
-
-        nodeConnectorProps = (ConcurrentMap<NodeConnector, Map<String, Property>>) clusterContainerService
-                .getCache("switchmanager.nodeConnectorProps");
-        if (nodeConnectorProps == null) {
-            log.error("\nFailed to get cache for nodeConnectorProps");
-        }
-
-        nodeConnectorNames = (ConcurrentMap<Node, Map<String, NodeConnector>>) clusterContainerService
-                .getCache("switchmanager.nodeConnectorNames");
-        if (nodeConnectorNames == null) {
-            log.error("\nFailed to get cache for nodeConnectorNames");
-        }
-    }
-
-    void nonClusterObjectCreate() {
-        subnetsConfigList = new ConcurrentHashMap<String, SubnetConfig>();
-        spanConfigList = new ConcurrentHashMap<Integer, SpanConfig>();
-        nodeConfigList = new ConcurrentHashMap<String, SwitchConfig>();
-        subnets = new ConcurrentHashMap<InetAddress, Subnet>();
-        configSaveEvent = new ConcurrentHashMap<Long, String>();
-        nodeProps = new ConcurrentHashMap<Node, Map<String, Property>>();
-        nodeConnectorProps = new ConcurrentHashMap<NodeConnector, Map<String, Property>>();
-        nodeConnectorNames = new ConcurrentHashMap<Node, Map<String, NodeConnector>>();
-    }
-
-    @SuppressWarnings("deprecation")
-    private void destroyCaches(String container) {
-        if (this.clusterContainerService == null) {
-            log.info("un-initialized clusterContainerService, can't create cache");
-            return;
-        }
-
-        clusterContainerService.destroyCache("switchmanager.subnetsConfigList");
-        clusterContainerService.destroyCache("switchmanager.spanConfigList");
-        clusterContainerService.destroyCache("switchmanager.nodeConfigList");
-        clusterContainerService.destroyCache("switchmanager.subnets");
-        clusterContainerService.destroyCache("switchmanager.configSaveEvent");
-        clusterContainerService.destroyCache("switchmanager.nodeProps");
-        clusterContainerService
-                .destroyCache("switchmanager.nodeConnectorProps");
-        clusterContainerService
-                .destroyCache("switchmanager.nodeConnectorNames");
-        nonClusterObjectCreate();
-    }
-
-    public List<SubnetConfig> getSubnetsConfigList() {
-        return new ArrayList<SubnetConfig>(subnetsConfigList.values());
-    }
-
-    @Override
-    public SubnetConfig getSubnetConfig(String subnet) {
-        return subnetsConfigList.get(subnet);
-    }
-
-    private List<SpanConfig> getSpanConfigList(Node node) {
-        List<SpanConfig> confList = new ArrayList<SpanConfig>();
-        String nodeId = node.toString();
-        for (SpanConfig conf : spanConfigList.values()) {
-            if (conf.matchNode(nodeId)) {
-                confList.add(conf);
-            }
-        }
-        return confList;
-    }
-
-    public List<SwitchConfig> getNodeConfigList() {
-        return new ArrayList<SwitchConfig>(nodeConfigList.values());
-    }
-
-    public SwitchConfig getSwitchConfig(String switchId) {
-        return nodeConfigList.get(switchId);
-    }
-
-    public Switch getSwitchByNode(Node node) {
-        Switch sw = new Switch(node);
-        sw.setNode(node);
-
-        Set<NodeConnector> ncSet = getPhysicalNodeConnectors(node);
-        sw.setNodeConnectors(ncSet);
-
-        List<NodeConnector> ncList = new ArrayList<NodeConnector>();
-        for (NodeConnector nodeConnector : ncSet) {
-            if (spanNodeConnectors.contains(nodeConnector)) {
-                ncList.add(nodeConnector);
-            }
-        }
-        sw.addSpanPorts(ncList);
-
-        return sw;
-    }
-
-    public List<Switch> getNetworkDevices() {
-        Set<Node> nodeSet = getNodes();
-        List<Switch> swList = new ArrayList<Switch>();
-        if (nodeSet != null) {
-            for (Node node : nodeSet) {
-                swList.add(getSwitchByNode(node));
-            }
-        }
-
-        return swList;
-    }
-
-    private void updateConfig(SubnetConfig conf, boolean add) {
-        if (add) {
-            subnetsConfigList.put(conf.getName(), conf);
-        } else {
-            subnetsConfigList.remove(conf.getName());
-        }
-    }
-
-    private void updateDatabase(SubnetConfig conf, boolean add) {
-        Subnet subnet = subnets.get(conf.getIPnum());
-        if (add) {
-            if (subnet == null) {
-                subnet = new Subnet(conf);
-            }
-            // In case of API3 call we may receive the ports along with the
-            // subnet creation
-            if (!conf.isGlobal()) {
-                Set<NodeConnector> sp = conf.getSubnetNodeConnectors();
-                subnet.addNodeConnectors(sp);
-            }
-            subnets.put(conf.getIPnum(), subnet);
-        } else { // This is the deletion of the whole subnet
-            if (subnet == null)
-                return;
-            subnets.remove(conf.getIPnum());
-        }
-    }
-
-    private Status semanticCheck(SubnetConfig conf) {
-        Subnet newSubnet = new Subnet(conf);
-        Set<InetAddress> IPs = subnets.keySet();
-        if (IPs == null) {
-            return new Status(StatusCode.SUCCESS, null);
-        }
-        for (InetAddress i : IPs) {
-            Subnet existingSubnet = subnets.get(i);
-            if ((existingSubnet != null)
-                    && !existingSubnet.isMutualExclusive(newSubnet)) {
-                return new Status(StatusCode.CONFLICT, null);
-            }
-        }
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    private Status addRemoveSubnet(SubnetConfig conf, boolean add) {
-        // Valid config check
-        if (!conf.isValidConfig()) {
-            String msg = "Invalid Subnet configuration";
-            log.warn(msg);
-            return new Status(StatusCode.BADREQUEST, msg);
-        }
-
-        if (add) {
-            // Presence check
-            if (subnetsConfigList.containsKey(conf.getName())) {
-                return new Status(StatusCode.CONFLICT,
-                        "Same subnet config already exists");
-            }
-            // Semantyc check
-            Status rc = semanticCheck(conf);
-            if (!rc.isSuccess()) {
-                return rc;
-            }
-        }
-        // Update Configuration
-        updateConfig(conf, add);
-
-        // Update Database
-        updateDatabase(conf, add);
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    /**
-     * Adds Subnet configured in GUI or API3
-     */
-    public Status addSubnet(SubnetConfig conf) {
-        return this.addRemoveSubnet(conf, true);
-    }
-
-    @Override
-    public Status removeSubnet(SubnetConfig conf) {
-        return this.addRemoveSubnet(conf, false);
-    }
-
-    @Override
-    public Status removeSubnet(String name) {
-        SubnetConfig conf = subnetsConfigList.get(name);
-        if (conf == null) {
-            return new Status(StatusCode.SUCCESS, "Subnet not present");
-        }
-        return this.addRemoveSubnet(conf, false);
-    }
-
-    @Override
-    public Status addPortsToSubnet(String name, String switchPorts) {
-        // Update Configuration
-        SubnetConfig conf = subnetsConfigList.get(name);
-        if (conf == null) {
-            return new Status(StatusCode.NOTFOUND, "Subnet does not exist");
-        }
-        if (!conf.isValidSwitchPort(switchPorts)) {
-            return new Status(StatusCode.BADREQUEST, "Invalid switchports");
-        }
-
-        conf.addNodeConnectors(switchPorts);
-
-        // Update Database
-        Subnet sub = subnets.get(conf.getIPnum());
-        Set<NodeConnector> sp = conf.getNodeConnectors(switchPorts);
-        sub.addNodeConnectors(sp);
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    @Override
-    public Status removePortsFromSubnet(String name, String switchPorts) {
-        // Update Configuration
-        SubnetConfig conf = subnetsConfigList.get(name);
-        if (conf == null) {
-            return new Status(StatusCode.NOTFOUND, "Subnet does not exist");
-        }
-        conf.removeNodeConnectors(switchPorts);
-
-        // Update Database
-        Subnet sub = subnets.get(conf.getIPnum());
-        Set<NodeConnector> sp = conf.getNodeConnectors(switchPorts);
-        sub.deleteNodeConnectors(sp);
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    public String getContainerName() {
-        if (containerName == null) {
-            return GlobalConstants.DEFAULT.toString();
-        }
-        return containerName;
-    }
-
-    @Override
-    public Subnet getSubnetByNetworkAddress(InetAddress networkAddress) {
-        Subnet sub;
-        Set<InetAddress> indices = subnets.keySet();
-        for (InetAddress i : indices) {
-            sub = subnets.get(i);
-            if (sub.isSubnetOf(networkAddress)) {
-                return sub;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Object readObject(ObjectInputStream ois)
-            throws FileNotFoundException, IOException, ClassNotFoundException {
-        // Perform the class deserialization locally, from inside the package
-        // where the class is defined
-        return ois.readObject();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void loadSubnetConfiguration() {
-        ObjectReader objReader = new ObjectReader();
-        ConcurrentMap<Integer, SubnetConfig> confList = (ConcurrentMap<Integer, SubnetConfig>) objReader
-                .read(this, subnetFileName);
-
-        if (confList == null) {
-            return;
-        }
-
-        for (SubnetConfig conf : confList.values()) {
-            addSubnet(conf);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void loadSpanConfiguration() {
-        ObjectReader objReader = new ObjectReader();
-        ConcurrentMap<Integer, SpanConfig> confList = (ConcurrentMap<Integer, SpanConfig>) objReader
-                .read(this, spanFileName);
-
-        if (confList == null) {
-            return;
-        }
-
-        for (SpanConfig conf : confList.values()) {
-            addSpanConfig(conf);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void loadSwitchConfiguration() {
-        ObjectReader objReader = new ObjectReader();
-        ConcurrentMap<String, SwitchConfig> confList = (ConcurrentMap<String, SwitchConfig>) objReader
-                .read(this, switchConfigFileName);
-
-        if (confList == null) {
-            return;
-        }
-
-        for (SwitchConfig conf : confList.values()) {
-            updateSwitchConfig(conf);
-        }
-    }
-
-    @Override
-    public void updateSwitchConfig(SwitchConfig cfgObject) {
-        boolean modeChange = false;
-
-        SwitchConfig sc = nodeConfigList.get(cfgObject.getNodeId());
-        if ((sc == null) || !cfgObject.getMode().equals(sc.getMode())) {
-            modeChange = true;
-        }
-
-        nodeConfigList.put(cfgObject.getNodeId(), cfgObject);
-        try {
-            // update default container only
-            if (isDefaultContainer) {
-                String nodeId = cfgObject.getNodeId();
-                Node node = Node.fromString(nodeId);
-                Map<String, Property> propMap;
-                if (nodeProps.get(node) != null) {
-                    propMap = nodeProps.get(node);
-                } else {
-                    propMap = new HashMap<String, Property>();
-                }
-                Property desc = new Description(cfgObject.getNodeDescription());
-                propMap.put(desc.getName(), desc);
-                Property tier = new Tier(Integer.parseInt(cfgObject.getTier()));
-                propMap.put(tier.getName(), tier);
-                addNodeProps(node, propMap);
-
-                log.info("Set Node {}'s Mode to {}", nodeId,
-                        cfgObject.getMode());
-
-                if (modeChange) {
-                    notifyModeChange(node, cfgObject.isProactive());
-                }
-            }
-        } catch (Exception e) {
-            log.debug("updateSwitchConfig: {}", e.getMessage());
-        }
-    }
-
-    @Override
-    public Status saveSwitchConfig() {
-        // Publish the save config event to the cluster nodes
-        configSaveEvent.put(new Date().getTime(), SAVE);
-        return saveSwitchConfigInternal();
-    }
-
-    public Status saveSwitchConfigInternal() {
-        Status retS = null, retP = null;
-        ObjectWriter objWriter = new ObjectWriter();
-
-        retS = objWriter.write(new ConcurrentHashMap<String, SubnetConfig>(
-                subnetsConfigList), subnetFileName);
-        retP = objWriter.write(new ConcurrentHashMap<Integer, SpanConfig>(
-                spanConfigList), spanFileName);
-        retS = objWriter.write(new ConcurrentHashMap<String, SwitchConfig>(
-                nodeConfigList), switchConfigFileName);
-
-        if (retS.equals(retP)) {
-            if (retS.isSuccess()) {
-                return retS;
-            } else {
-                return new Status(StatusCode.INTERNALERROR, "Save failed");
-            }
-        } else {
-            return new Status(StatusCode.INTERNALERROR, "Partial save failure");
-        }
-    }
-
-    @Override
-    public List<SpanConfig> getSpanConfigList() {
-        return new ArrayList<SpanConfig>(spanConfigList.values());
-    }
-
-    @Override
-    public Status addSpanConfig(SpanConfig conf) {
-        // Valid config check
-        if (!conf.isValidConfig()) {
-            String msg = "Invalid Span configuration";
-            log.warn(msg);
-            return new Status(StatusCode.BADREQUEST, msg);
-        }
-
-        // Presence check
-        if (spanConfigList.containsKey(conf.hashCode())) {
-            return new Status(StatusCode.CONFLICT, "Same span config exists");
-        }
-
-        // Update database and notify clients
-        addSpanPorts(conf.getNode(), conf.getPortArrayList());
-
-        // Update configuration
-        spanConfigList.put(conf.hashCode(), conf);
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    @Override
-    public Status removeSpanConfig(SpanConfig conf) {
-        removeSpanPorts(conf.getNode(), conf.getPortArrayList());
-
-        // Update configuration
-        spanConfigList.remove(conf.hashCode());
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    @Override
-    public List<NodeConnector> getSpanPorts(Node node) {
-        List<NodeConnector> ncList = new ArrayList<NodeConnector>();
-
-        for (NodeConnector nodeConnector : spanNodeConnectors) {
-            if (nodeConnector.getNode().equals(node)) {
-                ncList.add(nodeConnector);
-            }
-        }
-        return ncList;
-    }
-
-    @Override
-    public void entryCreated(Long key, String cacheName, boolean local) {
-    }
-
-    @Override
-    public void entryUpdated(Long key, String new_value, String cacheName,
-            boolean originLocal) {
-        saveSwitchConfigInternal();
-    }
-
-    @Override
-    public void entryDeleted(Long key, String cacheName, boolean originLocal) {
-    }
-
-    private void addNode(Node node, Set<Property> props) {
-        log.trace("{} added", node);
-        if (nodeProps == null) {
-            return;
-        }
-
-        Map<String, Property> propMap;
-        if (nodeProps.get(node) != null) {
-            propMap = nodeProps.get(node);
-        } else {
-            propMap = new HashMap<String, Property>();
-        }
-
-        // copy node properties from plugin
-        if (props != null) {
-            for (Property prop : props) {
-                propMap.put(prop.getName(), prop);
-            }
-        }
-
-        // copy node properties from config
-        boolean proactiveForwarding = false;
-        if (nodeConfigList != null) {
-            String nodeId = node.toString();
-            for (SwitchConfig conf : nodeConfigList.values()) {
-                if (conf.getNodeId().equals(nodeId)) {
-                    Property description = new Description(
-                            conf.getNodeDescription());
-                    propMap.put(description.getName(), description);
-                    Property tier = new Tier(Integer.parseInt(conf.getTier()));
-                    propMap.put(tier.getName(), tier);
-                    proactiveForwarding = conf.isProactive();
-                    break;
-                }
-            }
-        }
-        addNodeProps(node, propMap);
-
-        // check if span ports are configed
-        addSpanPorts(node);
-
-        // notify node listeners
-        notifyNode(node, UpdateType.ADDED, propMap);
-
-        // notify proactive mode forwarding
-        if (proactiveForwarding) {
-            notifyModeChange(node, true);
-        }
-    }
-
-    private void removeNode(Node node) {
-        log.trace("{} removed", node);
-        if (nodeProps == null)
-            return;
-        nodeProps.remove(node);
-
-        // check if span ports need to be cleaned up
-        removeSpanPorts(node);
-
-        /* notify node listeners */
-        notifyNode(node, UpdateType.REMOVED, null);
-    }
-
-    private void updateNode(Node node, Set<Property> props) {
-        log.trace("{} updated", node);
-        if (nodeProps == null) {
-            return;
-        }
-
-        Map<String, Property> propMap;
-        if (nodeProps.get(node) != null) {
-            propMap = nodeProps.get(node);
-        } else {
-            propMap = new HashMap<String, Property>();
-        }
-
-        // copy node properties from plugin
-        if (props != null) {
-            for (Property prop : props) {
-                propMap.put(prop.getName(), prop);
-            }
-        }
-        addNodeProps(node, propMap);
-
-        /* notify node listeners */
-        notifyNode(node, UpdateType.CHANGED, propMap);
-    }
-
-    @Override
-    public void updateNode(Node node, UpdateType type, Set<Property> props) {
-        switch (type) {
-        case ADDED:
-            addNode(node, props);
-            break;
-        case CHANGED:
-            updateNode(node, props);
-            break;
-        case REMOVED:
-            removeNode(node);
-            break;
-        default:
-            break;
-        }
-    }
-
-    @Override
-    public void updateNodeConnector(NodeConnector nodeConnector,
-            UpdateType type, Set<Property> props) {
-        Node node = nodeConnector.getNode();
-        Map<String, Property> propMap = new HashMap<String, Property>();
-
-        log.trace("{} {}", nodeConnector, type);
-
-        if (nodeConnectorProps == null) {
-            return;
-        }
-
-        switch (type) {
-        case ADDED:
-        case CHANGED:
-            if (props != null) {
-                for (Property prop : props) {
-                    addNodeConnectorProp(nodeConnector, prop);
-                    propMap.put(prop.getName(), prop);
-                }
-            } else {
-                addNodeConnectorProp(nodeConnector, null);
-                addNodeProps(node, null);
-            }
-
-            // check if span is configed
-            addSpanPort(nodeConnector);
-            break;
-        case REMOVED:
-            removeNodeConnectorAllProps(nodeConnector);
-            removeNodeProps(node);
-
-            // clean up span config
-            removeSpanPort(nodeConnector);
-            break;
-        default:
-            break;
-        }
-
-        notifyNodeConnector(nodeConnector, type, propMap);
-    }
-
-    @Override
-    public Set<Node> getNodes() {
-        return (nodeProps != null) ? new HashSet<Node>(nodeProps.keySet())
-                : null;
-    }
-
-    /*
-     * test utility function which assumes all nodes are OF nodes
-     */
-    private Node getNode(Long id) {
-        Set<Node> nodes = getNodes();
-        if (nodes != null) {
-            for (Node node : nodes) {
-                if (id.equals((Long) node.getID())) {
-                    return node;
-                }
-            }
-        }
-        return null;
-    }
-
-    /*
-     * Returns a copy of a list of properties for a given node
-     * 
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.opendaylight.controller.switchmanager.ISwitchManager#getNodeProps
-     * (org.opendaylight.controller.sal.core.Node)
-     */
-    @Override
-    public Map<String, Property> getNodeProps(Node node) {
-        if (isDefaultContainer) {
-            Map<String, Property> rv = null;
-            if (this.nodeProps != null) {
-                rv = this.nodeProps.get(node);
-                if (rv != null) {
-                    /* make a copy of it */
-                    rv = new HashMap<String, Property>(rv);
-                }
-            }
-            return rv;
-        } else {
-            // get it from default container
-            ISwitchManager defaultSwitchManager = (ISwitchManager) ServiceHelper
-                    .getInstance(ISwitchManager.class,
-                            GlobalConstants.DEFAULT.toString(), this);
-            return defaultSwitchManager.getNodeProps(node);
-        }
-    }
-
-    @Override
-    public Property getNodeProp(Node node, String propName) {
-        Map<String, Property> propMap = getNodeProps(node);
-        return (propMap != null) ? propMap.get(propName) : null;
-    }
-
-    @Override
-    public void setNodeProp(Node node, Property prop) {
-        /* Get a copy of the property map */
-        Map<String, Property> propMap = getNodeProps(node);
-        if (propMap == null)
-            return;
-
-        propMap.put(prop.getName(), prop);
-        this.nodeProps.put(node, propMap);
-    }
-
-    @Override
-    public Status removeNodeProp(Node node, String propName) {
-        Map<String, Property> propMap = getNodeProps(node);
-        if (propMap != null) {
-            propMap.remove(propName);
-            this.nodeProps.put(node, propMap);
-        }
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    @Override
-    public Status removeNodeAllProps(Node node) {
-        this.nodeProps.remove(node);
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    @Override
-    public Set<NodeConnector> getUpNodeConnectors(Node node) {
-        if (nodeConnectorProps == null)
-            return null;
-
-        Set<NodeConnector> nodeConnectorSet = new HashSet<NodeConnector>();
-        for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) {
-            if (((Long) nodeConnector.getNode().getID()).longValue() != (Long) node
-                    .getID())
-                continue;
-            if (isNodeConnectorEnabled(nodeConnector))
-                nodeConnectorSet.add(nodeConnector);
-        }
-
-        return nodeConnectorSet;
-    }
-
-    @Override
-    public Set<NodeConnector> getNodeConnectors(Node node) {
-        if (nodeConnectorProps == null)
-            return null;
-
-        Set<NodeConnector> nodeConnectorSet = new HashSet<NodeConnector>();
-        for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) {
-            if (((Long) nodeConnector.getNode().getID()).longValue() != (Long) node
-                    .getID())
-                continue;
-            nodeConnectorSet.add(nodeConnector);
-        }
-
-        return nodeConnectorSet;
-    }
-
-    @Override
-    public Set<NodeConnector> getPhysicalNodeConnectors(Node node) {
-        if (nodeConnectorProps == null)
-            return null;
-
-        Set<NodeConnector> nodeConnectorSet = new HashSet<NodeConnector>();
-        for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) {
-            if (!nodeConnector.getNode().equals(node)
-                    || isSpecial(nodeConnector)) {
-                continue;
-            }
-            nodeConnectorSet.add(nodeConnector);
-        }
-
-        return nodeConnectorSet;
-    }
-
-    /*
-     * testing utility function which assumes we are dealing with OF Node
-     * nodeconnectors only
-     */
-    @SuppressWarnings("unused")
-    private Set<Long> getEnabledNodeConnectorIds(Node node) {
-        Set<Long> ids = new HashSet<Long>();
-        Set<NodeConnector> nodeConnectors = getUpNodeConnectors(node);
-
-        if (nodeConnectors != null) {
-            for (NodeConnector nodeConnector : nodeConnectors) {
-                ids.add((Long) nodeConnector.getID());
-            }
-        }
-
-        return ids;
-    }
-
-    @Override
-    public Map<String, Property> getNodeConnectorProps(
-            NodeConnector nodeConnector) {
-        if (isDefaultContainer) {
-            Map<String, Property> rv = null;
-            if (this.nodeConnectorProps != null) {
-                rv = this.nodeConnectorProps.get(nodeConnector);
-                if (rv != null) {
-                    rv = new HashMap<String, Property>(rv);
-                }
-            }
-            return rv;
-        } else {
-            // get it from default container
-            ISwitchManager defaultSwitchManager = (ISwitchManager) ServiceHelper
-                    .getInstance(ISwitchManager.class,
-                            GlobalConstants.DEFAULT.toString(), this);
-            return defaultSwitchManager.getNodeConnectorProps(nodeConnector);
-        }
-    }
-
-    @Override
-    public Property getNodeConnectorProp(NodeConnector nodeConnector,
-            String propName) {
-        Map<String, Property> propMap = getNodeConnectorProps(nodeConnector);
-        return (propMap != null) ? propMap.get(propName) : null;
-    }
-
-    private byte[] getHardwareMAC() {
-        Enumeration<NetworkInterface> nis;
-        try {
-            nis = NetworkInterface.getNetworkInterfaces();
-        } catch (SocketException e1) {
-            log.error("",e1);
-            return null;
-        }
-        byte[] MAC = null;
-        for (; nis.hasMoreElements();) {
-            NetworkInterface ni = nis.nextElement();
-            try {
-                MAC = ni.getHardwareAddress();
-            } catch (SocketException e) {
-                log.error("",e);
-            }
-            if (MAC != null) {
-                return MAC;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public byte[] getControllerMAC() {
-        return MAC;
-    }
-
-    @Override
-    public boolean isHostRefreshEnabled() {
-        return hostRefresh;
-    }
-
-    @Override
-    public int getHostRetryCount() {
-        return hostRetryCount;
-    }
-
-    @Override
-    public NodeConnector getNodeConnector(Node node, String nodeConnectorName) {
-        if (nodeConnectorNames == null)
-            return null;
-
-        Map<String, NodeConnector> map = nodeConnectorNames.get(node);
-        if (map == null)
-            return null;
-
-        return map.get(nodeConnectorName);
-    }
-
-    /**
-     * Adds a node connector and its property if any
-     * 
-     * @param nodeConnector
-     *            {@link org.opendaylight.controller.sal.core.NodeConnector}
-     * @param propName
-     *            name of {@link org.opendaylight.controller.sal.core.Property}
-     * @return success or failed reason
-     */
-    @Override
-    public Status addNodeConnectorProp(NodeConnector nodeConnector,
-            Property prop) {
-        Map<String, Property> propMap = getNodeConnectorProps(nodeConnector);
-
-        if (propMap == null) {
-            propMap = new HashMap<String, Property>();
-        }
-
-        // Just add the nodeConnector if prop is not available (in a non-default
-        // container)
-        if (prop == null) {
-            nodeConnectorProps.put(nodeConnector, propMap);
-            return new Status(StatusCode.SUCCESS, null);
-        }
-
-        propMap.put(prop.getName(), prop);
-        nodeConnectorProps.put(nodeConnector, propMap);
-
-        if (prop.getName().equals(Name.NamePropName)) {
-            if (nodeConnectorNames != null) {
-                Node node = nodeConnector.getNode();
-                Map<String, NodeConnector> map = nodeConnectorNames.get(node);
-                if (map == null) {
-                    map = new HashMap<String, NodeConnector>();
-                }
-
-                map.put(((Name) prop).getValue(), nodeConnector);
-                nodeConnectorNames.put(node, map);
-            }
-        }
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    /**
-     * Removes one property of a node connector
-     * 
-     * @param nodeConnector
-     *            {@link org.opendaylight.controller.sal.core.NodeConnector}
-     * @param propName
-     *            name of {@link org.opendaylight.controller.sal.core.Property}
-     * @return success or failed reason
-     */
-    @Override
-    public Status removeNodeConnectorProp(NodeConnector nodeConnector,
-            String propName) {
-        Map<String, Property> propMap = getNodeConnectorProps(nodeConnector);
-
-        if (propMap == null) {
-            /* Nothing to remove */
-            return new Status(StatusCode.SUCCESS, null);
-        }
-
-        propMap.remove(propName);
-        nodeConnectorProps.put(nodeConnector, propMap);
-
-        if (nodeConnectorNames != null) {
-            Name name = ((Name) getNodeConnectorProp(nodeConnector,
-                    Name.NamePropName));
-            if (name != null) {
-                Node node = nodeConnector.getNode();
-                Map<String, NodeConnector> map = nodeConnectorNames.get(node);
-                if (map != null) {
-                    map.remove(name.getValue());
-                    nodeConnectorNames.put(node, map);
-                }
-            }
-        }
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    /**
-     * Removes all the properties of a node connector
-     * 
-     * @param nodeConnector
-     *            {@link org.opendaylight.controller.sal.core.NodeConnector}
-     * @return success or failed reason
-     */
-    @Override
-    public Status removeNodeConnectorAllProps(NodeConnector nodeConnector) {
-        if (nodeConnectorNames != null) {
-            Name name = ((Name) getNodeConnectorProp(nodeConnector,
-                    Name.NamePropName));
-            if (name != null) {
-                Node node = nodeConnector.getNode();
-                Map<String, NodeConnector> map = nodeConnectorNames.get(node);
-                if (map != null) {
-                    map.remove(name.getValue());
-                    nodeConnectorNames.put(node, map);
-                }
-            }
-        }
-        nodeConnectorProps.remove(nodeConnector);
-
-        return new Status(StatusCode.SUCCESS, null);
-    }
-
-    /**
-     * Function called by the dependency manager when all the required
-     * dependencies are satisfied
-     * 
-     */
-    void init(Component c) {
-        Dictionary<?, ?> props = c.getServiceProperties();
-        if (props != null) {
-            this.containerName = (String) props.get("containerName");
-            log.trace("Running containerName: {}", this.containerName);
-        } else {
-            // In the Global instance case the containerName is empty
-            this.containerName = "";
-        }
-        isDefaultContainer = containerName.equals(GlobalConstants.DEFAULT
-                .toString());
-
-        startUp();
-    }
-
-    /**
-     * Function called by the dependency manager when at least one dependency
-     * become unsatisfied or when the component is shutting down because for
-     * example bundle is being stopped.
-     * 
-     */
-    void destroy() {
-        shutDown();
-    }
-
-    /**
-     * Function called by dependency manager after "init ()" is called and after
-     * the services provided by the class are registered in the service registry
-     * 
-     */
-    void start() {
-        // OSGI console
-        registerWithOSGIConsole();
-    }
-
-    /**
-     * Function called after registered the service in OSGi service registry.
-     */
-    void started() {
-        // solicit for existing inventories
-        getInventories();
-    }
-
-    /**
-     * Function called by the dependency manager before the services exported by
-     * the component are unregistered, this will be followed by a "destroy ()"
-     * calls
-     * 
-     */
-    void stop() {
-    }
-
-    public void setInventoryService(IInventoryService service) {
-        log.trace("Got inventory service set request {}", service);
-        this.inventoryService = service;
-
-        // solicit for existing inventories
-        getInventories();
-    }
-
-    public void unsetInventoryService(IInventoryService service) {
-        log.trace("Got a service UNset request");
-        this.inventoryService = null;
-
-        // clear existing inventories
-        clearInventories();
-    }
-
-    public void setSwitchManagerAware(ISwitchManagerAware service) {
-        log.trace("Got inventory service set request {}", service);
-        if (this.switchManagerAware != null) {
-            this.switchManagerAware.add(service);
-        }
-
-        // bulk update for newly joined
-        switchManagerAwareNotify(service);
-    }
-
-    public void unsetSwitchManagerAware(ISwitchManagerAware service) {
-        log.trace("Got a service UNset request");
-        if (this.switchManagerAware != null) {
-            this.switchManagerAware.remove(service);
-        }
-    }
-
-    public void setInventoryListener(IInventoryListener service) {
-        log.trace("Got inventory listener set request {}", service);
-        if (this.inventoryListeners != null) {
-            this.inventoryListeners.add(service);
-        }
-
-        // bulk update for newly joined
-        bulkUpdateService(service);
-    }
-
-    public void unsetInventoryListener(IInventoryListener service) {
-        log.trace("Got a service UNset request");
-        if (this.inventoryListeners != null) {
-            this.inventoryListeners.remove(service);
-        }
-    }
-
-    public void setSpanAware(ISpanAware service) {
-        log.trace("Got SpanAware set request {}", service);
-        if (this.spanAware != null) {
-            this.spanAware.add(service);
-        }
-
-        // bulk update for newly joined
-        spanAwareNotify(service);
-    }
-
-    public void unsetSpanAware(ISpanAware service) {
-        log.trace("Got a service UNset request");
-        if (this.spanAware != null) {
-            this.spanAware.remove(service);
-        }
-    }
-
-    void setClusterContainerService(IClusterContainerServices s) {
-        log.trace("Cluster Service set");
-        this.clusterContainerService = s;
-    }
-
-    void unsetClusterContainerService(IClusterContainerServices s) {
-        if (this.clusterContainerService == s) {
-            log.trace("Cluster Service removed!");
-            this.clusterContainerService = null;
-        }
-    }
-
-    private void getInventories() {
-        if (inventoryService == null) {
-            log.trace("inventory service not avaiable");
-            return;
-        }
-
-        nodeProps = this.inventoryService.getNodeProps();
-        Set<Node> nodeSet = nodeProps.keySet();
-        if (nodeSet != null) {
-            for (Node node : nodeSet) {
-                addNode(node, null);
-            }
-        }
-
-        nodeConnectorProps = inventoryService.getNodeConnectorProps();
-    }
-
-    private void clearInventories() {
-        nodeProps.clear();
-        nodeConnectorProps.clear();
-        nodeConnectorNames.clear();
-        spanNodeConnectors.clear();
-    }
-
-    private void notifyNode(Node node, UpdateType type,
-            Map<String, Property> propMap) {
-        synchronized (inventoryListeners) {
-            for (IInventoryListener service : inventoryListeners) {
-                service.notifyNode(node, type, propMap);
-            }
-        }
-    }
-
-    private void notifyNodeConnector(NodeConnector nodeConnector,
-            UpdateType type, Map<String, Property> propMap) {
-        synchronized (inventoryListeners) {
-            for (IInventoryListener service : inventoryListeners) {
-                service.notifyNodeConnector(nodeConnector, type, propMap);
-            }
-        }
-    }
-
-    /*
-     * For those joined late, bring them up-to-date.
-     */
-    private void switchManagerAwareNotify(ISwitchManagerAware service) {
-        for (Subnet sub : subnets.values()) {
-            service.subnetNotify(sub, true);
-        }
-
-        for (Node node : getNodes()) {
-            SwitchConfig sc = getSwitchConfig(node.toString());
-            if ((sc != null) && isDefaultContainer) {
-                service.modeChangeNotify(node, sc.isProactive());
-            }
-        }
-    }
-
-    private void bulkUpdateService(IInventoryListener service) {
-        for (Node node : getNodes()) {
-            service.notifyNode(node, UpdateType.ADDED, null);
-        }
-
-        Map<String, Property> propMap = new HashMap<String, Property>();
-        propMap.put(State.StatePropName, new State(State.EDGE_UP));
-        for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) {
-            if (isNodeConnectorEnabled(nodeConnector)) {
-                service.notifyNodeConnector(nodeConnector, UpdateType.ADDED,
-                        propMap);
-            }
-        }
-    }
-
-    private void spanAwareNotify(ISpanAware service) {
-        for (Node node : getNodes()) {
-            for (SpanConfig conf : getSpanConfigList(node)) {
-                service.spanUpdate(node, conf.getPortArrayList(), true);
-            }
-        }
-    }
-
-    private void registerWithOSGIConsole() {
-        BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass())
-                .getBundleContext();
-        bundleContext.registerService(CommandProvider.class.getName(), this,
-                null);
-    }
-
-    @Override
-    public Boolean isNodeConnectorEnabled(NodeConnector nodeConnector) {
-        if (nodeConnector == null)
-            return false;
-
-        Config config = (Config) getNodeConnectorProp(nodeConnector,
-                Config.ConfigPropName);
-        State state = (State) getNodeConnectorProp(nodeConnector,
-                State.StatePropName);
-        return ((config != null) && (config.getValue() == Config.ADMIN_UP)
-                && (state != null) && (state.getValue() == State.EDGE_UP));
-    }
-
-    @Override
-    public String getHelp() {
-        StringBuffer help = new StringBuffer();
-        help.append("---Switch Manager---\n");
-        help.append("\t pns                    - Print connected nodes\n");
-        help.append("\t pncs <node id>         - Print node connectors for a given node\n");
-        help.append("\t pencs <node id>        - Print enabled node connectors for a given node\n");
-        help.append("\t pdm <node id>          - Print switch ports in device map\n");
-        help.append("\t snt <node id> <tier>   - Set node tier number\n");
-        help.append("\t hostRefresh <on/off/?> - Enable/Disable/Query host refresh\n");
-        help.append("\t hostRetry <count>      - Set host retry count\n");
-        return help.toString();
-    }
-
-    public void _pns(CommandInterpreter ci) {
-        ci.println("           Node                       Type             Name             Tier");
-        if (nodeProps == null) {
-            return;
-        }
-        Set<Node> nodeSet = nodeProps.keySet();
-        if (nodeSet == null) {
-            return;
-        }
-        for (Node node : nodeSet) {
-            Description desc = ((Description) getNodeProp(node,
-                    Description.propertyName));
-            Tier tier = ((Tier) getNodeProp(node, Tier.TierPropName));
-            String nodeName = (desc == null) ? "" : desc.getValue();
-            int tierNum = (tier == null) ? 0 : tier.getValue();
-            ci.println(node + "            " + node.getType() + "            "
-                    + nodeName + "            " + tierNum);
-        }
-        ci.println("Total number of Nodes: " + nodeSet.size());
-    }
-
-    public void _pencs(CommandInterpreter ci) {
-        String st = ci.nextArgument();
-        if (st == null) {
-            ci.println("Please enter node id");
-            return;
-        }
-        Long id = Long.decode(st);
-
-        Node node = NodeCreator.createOFNode(id);
-        Set<NodeConnector> nodeConnectorSet = getUpNodeConnectors(node);
-        if (nodeConnectorSet == null) {
-            return;
-        }
-        for (NodeConnector nodeConnector : nodeConnectorSet) {
-            if (nodeConnector == null) {
-                continue;
-            }
-            ci.println(nodeConnector);
-        }
-        ci.println("Total number of NodeConnectors: " + nodeConnectorSet.size());
-    }
-
-    public void _pncs(CommandInterpreter ci) {
-        String st = ci.nextArgument();
-        if (st == null) {
-            ci.println("Please enter node id");
-            return;
-        }
-        Long id = Long.decode(st);
-
-        ci.println("          NodeConnector               BandWidth(Gbps)     Admin     State");
-        Node node = NodeCreator.createOFNode(id);
-        Set<NodeConnector> nodeConnectorSet = getNodeConnectors(node);
-        if (nodeConnectorSet == null) {
-            return;
-        }
-        for (NodeConnector nodeConnector : nodeConnectorSet) {
-            if (nodeConnector == null) {
-                continue;
-            }
-            Map<String, Property> propMap = getNodeConnectorProps(nodeConnector);
-            Bandwidth bw = (Bandwidth) propMap.get(Bandwidth.BandwidthPropName);
-            Config config = (Config) propMap.get(Config.ConfigPropName);
-            State state = (State) propMap.get(State.StatePropName);
-            String out = nodeConnector + "           ";
-            out += (bw != null) ? bw.getValue() / Math.pow(10, 9) : "    ";
-            out += "             ";
-            out += (config != null) ? config.getValue() : " ";
-            out += "          ";
-            out += (state != null) ? state.getValue() : " ";
-            ci.println(out);
-        }
-        ci.println("Total number of NodeConnectors: " + nodeConnectorSet.size());
-    }
-
-    public void _pdm(CommandInterpreter ci) {
-        String st = ci.nextArgument();
-        if (st == null) {
-            ci.println("Please enter node id");
-            return;
-        }
-        Object id = Long.decode(st);
-        Switch sw = getSwitchByNode(NodeCreator.createOFNode((Long) id));
-
-        ci.println("          NodeConnector                        Name");
-        if (sw == null) {
-            return;
-        }
-        Set<NodeConnector> nodeConnectorSet = sw.getNodeConnectors();
-        String nodeConnectorName;
-        if (nodeConnectorSet != null && nodeConnectorSet.size() > 0) {
-            for (NodeConnector nodeConnector : nodeConnectorSet) {
-                Map<String, Property> propMap = getNodeConnectorProps(nodeConnector);
-                nodeConnectorName = (propMap == null) ? null : ((Name) propMap
-                        .get(Name.NamePropName)).getValue();
-                if (nodeConnectorName != null) {
-                    Node node = nodeConnector.getNode();
-                    if (!node.equals(getNode((Long) id))) {
-                        log.debug("node not match {} {}", node,
-                                getNode((Long) id));
-                    }
-                    Map<String, NodeConnector> map = nodeConnectorNames
-                            .get(node);
-                    if (map != null) {
-                        NodeConnector nc = map.get(nodeConnectorName);
-                        if (nc == null) {
-                            log.debug("no nodeConnector named {}",
-                                    nodeConnectorName);
-                        } else if (!nc.equals(nodeConnector)) {
-                            log.debug("nodeConnector not match {} {}", nc,
-                                    nodeConnector);
-                        }
-                    }
-                }
-
-                ci.println(nodeConnector
-                        + "            "
-                        + ((nodeConnectorName == null) ? "" : nodeConnectorName)
-                        + "(" + nodeConnector.getID() + ")");
-            }
-            ci.println("Total number of NodeConnectors: "
-                    + nodeConnectorSet.size());
-        }
-    }
-
-    public void _snt(CommandInterpreter ci) {
-        String st = ci.nextArgument();
-        if (st == null) {
-            ci.println("Please enter node id");
-            return;
-        }
-        Long id = Long.decode(st);
-
-        Node node = NodeCreator.createOFNode(id);
-
-        st = ci.nextArgument();
-        if (st == null) {
-            ci.println("Please enter tier number");
-            return;
-        }
-        Integer tid = Integer.decode(st);
-        Tier tier = new Tier(tid);
-        setNodeProp(node, tier);
-    }
-
-    public void _hostRefresh(CommandInterpreter ci) {
-        String mode = ci.nextArgument();
-        if (mode == null) {
-            ci.println("expecting on/off/?");
-            return;
-        }
-        if (mode.toLowerCase().equals("on"))
-            hostRefresh = true;
-        else if (mode.toLowerCase().equals("off"))
-            hostRefresh = false;
-        else if (mode.equals("?")) {
-            if (hostRefresh)
-                ci.println("host refresh is ON");
-            else
-                ci.println("host refresh is OFF");
-        } else
-            ci.println("expecting on/off/?");
-        return;
-    }
-
-    public void _hostRetry(CommandInterpreter ci) {
-        String retry = ci.nextArgument();
-        if (retry == null) {
-            ci.println("Please enter a valid number. Current retry count is "
-                    + hostRetryCount);
-            return;
-        }
-        try {
-            hostRetryCount = Integer.parseInt(retry);
-        } catch (Exception e) {
-            ci.println("Please enter a valid number");
-        }
-        return;
-    }
-
-    @Override
-    public byte[] getNodeMAC(Node node) {
-        if (node.getType().equals(Node.NodeIDType.OPENFLOW)) {
-            byte[] gmac = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-            long dpid = (Long) node.getID();
-
-            for (short i = 0; i < 6; i++) {
-                gmac[5 - i] = (byte) dpid;
-                dpid >>= 8;
-            }
-            return gmac;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isSpecial(NodeConnector p) {
-        if (p.getType().equals(NodeConnectorIDType.CONTROLLER)
-                || p.getType().equals(NodeConnectorIDType.ALL)
-                || p.getType().equals(NodeConnectorIDType.SWSTACK)
-                || p.getType().equals(NodeConnectorIDType.HWPATH)) {
-            return true;
-        }
-        return false;
-    }
-
-    /*
-     * Add span configuration to local cache and notify clients
-     */
-    private void addSpanPorts(Node node, List<NodeConnector> nodeConncetors) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-
-        for (NodeConnector nodeConnector : nodeConncetors) {
-            if (!spanNodeConnectors.contains(nodeConnector)) {
-                ncLists.add(nodeConnector);
-            }
-        }
-
-        if (ncLists.size() > 0) {
-            spanNodeConnectors.addAll(ncLists);
-            notifySpanPortChange(node, ncLists, true);
-        }
-    }
-
-    private void addSpanPorts(Node node) {
-        for (SpanConfig conf : getSpanConfigList(node)) {
-            addSpanPorts(node, conf.getPortArrayList());
-        }
-    }
-
-    private void addSpanPort(NodeConnector nodeConncetor) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-        ncLists.add(nodeConncetor);
-        addSpanPorts(nodeConncetor.getNode(), ncLists);
-    }
-
-    /*
-     * Remove span configuration to local cache and notify clients
-     */
-    private void removeSpanPorts(Node node, List<NodeConnector> nodeConncetors) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-
-        for (NodeConnector nodeConnector : nodeConncetors) {
-            if (!spanNodeConnectors.contains(nodeConnector)) {
-                ncLists.add(nodeConnector);
-            }
-        }
-
-        if (ncLists.size() > 0) {
-            spanNodeConnectors.removeAll(ncLists);
-            notifySpanPortChange(node, ncLists, false);
-        }
-    }
-
-    private void removeSpanPorts(Node node) {
-        for (SpanConfig conf : getSpanConfigList(node)) {
-            addSpanPorts(node, conf.getPortArrayList());
-        }
-    }
-
-    private void removeSpanPort(NodeConnector nodeConncetor) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-        ncLists.add(nodeConncetor);
-        removeSpanPorts(nodeConncetor.getNode(), ncLists);
-    }
-
-    private void addNodeProps(Node node, Map<String, Property> propMap) {
-        if (propMap == null) {
-            propMap = new HashMap<String, Property>();
-        }
-        nodeProps.put(node, propMap);
-    }
-
-    private void removeNodeProps(Node node) {
-        if (getUpNodeConnectors(node).size() == 0) {
-            nodeProps.remove(node);
-        }
-    }
-
-    @Override
-    public Status saveConfiguration() {
-        return saveSwitchConfig();
-    }
-
-    /**
-     * Creates a Name/Tier/Bandwidth Property object based on given property
-     * name and value. Other property types are not supported yet.
-     * 
-     * @param propName
-     *            Name of the Property
-     * @param propValue
-     *            Value of the Property
-     * @return {@link org.opendaylight.controller.sal.core.Property}
-     */
-    @Override
-    public Property createProperty(String propName, String propValue) {
-        if (propName == null) {
-            log.debug("propName is null");
-            return null;
-        }
-        if (propValue == null) {
-            log.debug("propValue is null");
-            return null;
-        }
-
-        try {
-            if (propName.equalsIgnoreCase(Description.propertyName)) {
-                return new Description(propValue);
-            } else if (propName.equalsIgnoreCase(Tier.TierPropName)) {
-                int tier = Integer.parseInt(propValue);
-                return new Tier(tier);
-            } else if (propName.equalsIgnoreCase(Bandwidth.BandwidthPropName)) {
-                long bw = Long.parseLong(propValue);
-                return new Bandwidth(bw);
-            } else {
-                log.debug("Not able to create {} property", propName);
-            }
-        } catch (Exception e) {
-            log.debug("createProperty caught exception {}", e.getMessage());
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getNodeDescription(Node node) {
-        // Check first if user configured a name
-        SwitchConfig config = getSwitchConfig(node.toString());
-        if (config != null) {
-            String configuredDesc = config.getNodeDescription();
-            if (configuredDesc != null && !configuredDesc.isEmpty()) {
-                return configuredDesc;
-            }
-        }
-
-        // No name configured by user, get the node advertised name
-        Description desc = (Description) getNodeProp(node,
-                Description.propertyName);
-        return (desc == null /* || desc.getValue().equalsIgnoreCase("none") */) ? ""
-                : desc.getValue();
-    }
-}