Container Management and associated Northbound APIs.
[controller.git] / opendaylight / containermanager / api / src / main / java / org / opendaylight / controller / containermanager / ContainerData.java
diff --git a/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerData.java b/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerData.java
new file mode 100644 (file)
index 0000000..5a7cdd2
--- /dev/null
@@ -0,0 +1,241 @@
+
+/*
+ * 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.containermanager;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.opendaylight.controller.sal.core.ContainerFlow;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.core.NodeConnector;
+
+
+/**
+ * This Class contains all the configurations pertained to this container
+ *
+ */
+public class ContainerData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String name;
+    private ConcurrentMap<Node, Set<NodeConnector>> swPorts;
+    private short staticVlan;
+    private List<ContainerFlow> cFlowList;
+
+    /**
+     * Default constructor
+
+     *
+     * @return constructed ContainerData
+     */
+    public ContainerData() {
+        name = null;
+        swPorts = new ConcurrentHashMap<Node, Set<NodeConnector>>();
+        staticVlan = 0;
+        cFlowList = new ArrayList<ContainerFlow>();
+    }
+
+    /**
+     * Build a ContainerData from container configuration
+     *
+     * @param conf configuration from where the ContainerData need to be extracted
+     *
+     * @return the constructed containerData
+     */
+    public ContainerData(ContainerConfig conf) {
+        /*
+         * Back-end Non-Configuration Classes store names in lower case
+         */
+        name = conf.getContainerName().toLowerCase(Locale.ENGLISH);
+        swPorts = new ConcurrentHashMap<Node, Set<NodeConnector>>();
+        cFlowList = new ArrayList<ContainerFlow>();
+        staticVlan = conf.getStaticVlanValue();
+    }
+
+    /**
+     * getter for containerName
+     *
+     *
+     * @return the container name
+     */
+    public String getContainerName() {
+        return name;
+    }
+
+    /**
+     * getter for static vlan
+     *
+     *
+     * @return attribute static vlan
+     */
+    public short getStaticVlan() {
+        return staticVlan;
+    }
+
+    /**
+     * Check if the static vlan has non-zero value in that case is
+     * assumed to be assigned
+     *
+     *
+     * @return true if static vlan non-zero
+     */
+    public boolean hasStaticVlanAssigned() {
+        return (staticVlan != 0);
+    }
+
+    /**
+     * retrieve all NodeConnectors on a given switch on the containerName
+     * used in this object
+     *
+     * @param switchId the Node for switch we want to retrieve the list of ports
+     *
+     * @return get all the ports in form of a set of nodeconnectors
+     */
+    public Set<NodeConnector> getPorts(Node switchId) {
+        Set<NodeConnector> swpinfo = swPorts.get(switchId);
+        if (swpinfo != null) {
+            return swpinfo;
+        }
+        return null;
+    }
+
+    /**
+     * Returns the DB of all the association Node -> List of
+     * NodeConnectors composing this container
+     *
+     * @return the ConcurrentMap of all the association Node -> List
+     * of NodeConnectors
+     */
+    public ConcurrentMap<Node, Set<NodeConnector>> getSwPorts() {
+        return swPorts;
+    }
+
+    /**
+     * Add to the container a NodeConnector, that implicitely means also
+     * the Node being added
+     *
+     * @param port NodeConnector corresponding to the port being added
+     * in the container
+     */
+    public void addPortToSwitch(NodeConnector port) {
+        Node switchId = port.getNode();
+        if (switchId == null) {
+            return;
+        }
+        Set<NodeConnector> portSet = swPorts.get(switchId);
+        if (portSet == null) {
+            portSet = new HashSet<NodeConnector>();
+            swPorts.put(switchId, portSet);
+        }
+        portSet.add(port);
+    }
+
+    /**
+     * Remove from the container a NodeConnector, that implicitely means also
+     * the Node being removed
+     *
+     * @param port NodeConnector corresponding to the port being removed
+     * in the container
+     */
+    public void removePortFromSwitch(NodeConnector port) {
+        Node switchId = port.getNode();
+        if (switchId == null) {
+            return;
+        }
+        Set<NodeConnector> swpinfo = swPorts.get(switchId);
+        if (swpinfo != null) {
+            swpinfo.remove(port);
+            if (swpinfo.isEmpty()) {
+                // There are no more ports lets get ride of the switch
+                swPorts.remove(switchId);
+            }
+        }
+    }
+
+    /**
+     * Existence check of a Node in a container
+     *
+     * @param switchId See if a particular node is part of the container
+     *
+     * @return true if the node is in it else false
+     */
+    public boolean isSwitchInContainer(Node switchId) {
+        if (swPorts.containsKey(switchId)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Test for existance of NodeConnectors on a Node in a container
+     *
+     * @param switchId Node we are testing for port existance
+     *
+     * @return ture if the portset is non-empty
+     */
+    public boolean portListEmpty(Node switchId) {
+        Set<NodeConnector> swpinfo = swPorts.get(switchId);
+        if (swpinfo != null) {
+            if (!swpinfo.isEmpty()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public void deleteFlowSpec(ContainerFlow cFlow) {
+        cFlowList.remove(cFlow);
+    }
+
+    public void addFlowSpec(ContainerFlow cFlow) {
+        cFlowList.add(cFlow);
+    }
+
+    public boolean isFlowSpecEmpty() {
+        return (cFlowList.isEmpty());
+
+    }
+
+    public boolean containsFlowSpec(ContainerFlow cFlow) {
+        return cFlowList.contains(cFlow);
+    }
+
+    public int getFlowSpecCount() {
+        return cFlowList.size();
+    }
+
+    public List<ContainerFlow> getContainerFlowSpecs() {
+        return cFlowList;
+    }
+
+    public boolean matchName(String name) {
+        return this.name.equalsIgnoreCase(name);
+    }
+
+    /**
+     * Returns all the node connectors part of the container
+     * @return The node connectors belonging to this container. The returning set is never null.
+     */
+    public Set<NodeConnector> getNodeConnectors() {
+        Set<NodeConnector> set = new HashSet<NodeConnector>();
+        for (Map.Entry<Node, Set<NodeConnector>> entry : swPorts.entrySet()) {
+            set.addAll(entry.getValue());
+        }
+        return set;
+    }
+}