Return affinity group endpoints as a set of Host objects with more complete information. 30/4530/1
authorSuchi Raman <suchi.raman@plexxi.com>
Tue, 21 Jan 2014 21:46:00 +0000 (16:46 -0500)
committerSuchi Raman <suchi.raman@plexxi.com>
Tue, 21 Jan 2014 21:46:00 +0000 (16:46 -0500)
Signed-off-by: Suchi Raman <suchi.raman@plexxi.com>
affinity/api/src/main/java/org/opendaylight/affinity/affinity/AffinityGroup.java
affinity/api/src/main/java/org/opendaylight/affinity/affinity/IAffinityManager.java
affinity/implementation/src/main/java/org/opendaylight/affinity/affinity/internal/AffinityManagerImpl.java
affinity/northbound/src/main/java/org/opendaylight/affinity/affinity/northbound/AffinityGroupHosts.java [new file with mode: 0644]
affinity/northbound/src/main/java/org/opendaylight/affinity/affinity/northbound/AffinityGroupList.java
affinity/northbound/src/main/java/org/opendaylight/affinity/affinity/northbound/AffinityNorthbound.java
flatl2/src/main/java/org/opendaylight/affinity/flatl2/FlatL2AffinityImpl.java
scripts/affinity.py

index 28101f072a3e5ac78daf3d851b85af91600c24e8..acf2fd47046ea462ed78669934c0b67f4f8d60c7 100644 (file)
@@ -119,6 +119,13 @@ public class AffinityGroup implements Cloneable, Serializable {
         return elements.keySet();
     }
 
+    // TODO: This should not exist.  It's a replacement for a more
+    // robust "is host h a member of this affinity group".
+    @XmlElement(name="endpoints")
+    public Set<String> getMacs() {
+        return elements.keySet();
+    }
+
     @JsonIgnore
     public ArrayList<AffinityIdentifier> getAllElements() {
         ArrayList<AffinityIdentifier> retvalues = new ArrayList<AffinityIdentifier>(elements.values());
index 56eff0699abb1cec8ade0c4e45c4595835a94727..d86e499f29d25a29438c2f56ac0052ce53942acc 100644 (file)
@@ -36,6 +36,7 @@ public interface IAffinityManager {
     public Status removeAffinityGroup(String name);
     
     public AffinityGroup getAffinityGroup(String name);
+    public List<Host> getAffinityGroupHosts(String groupName);
     public List<AffinityGroup> getAllAffinityGroups();
 
     public Status addAffinityLink(AffinityLink al);
index 6acb48d9afde31ce8d300f75e805dba596d61460..01ff46be908a8546a746a9770d26b9d7b06ee030 100644 (file)
@@ -317,6 +317,13 @@ public class AffinityManagerImpl implements IAffinityManager,
         return affinityGroupList.get(groupName);
     }
 
+    @Override
+    public List<Host> getAffinityGroupHosts(String groupName) {
+        log.debug("getAffinityGroupHosts" + groupName);
+        AffinityGroup ag = affinityGroupList.get(groupName);        
+        return getAllElementsByHost(ag);
+    }
+
     @Override
     public List<AffinityGroup> getAllAffinityGroups() {
         return new ArrayList<AffinityGroup>(affinityGroupList.values());
diff --git a/affinity/northbound/src/main/java/org/opendaylight/affinity/affinity/northbound/AffinityGroupHosts.java b/affinity/northbound/src/main/java/org/opendaylight/affinity/affinity/northbound/AffinityGroupHosts.java
new file mode 100644 (file)
index 0000000..cc887df
--- /dev/null
@@ -0,0 +1,83 @@
+package org.opendaylight.affinity.affinity.northbound;
+
+import org.opendaylight.controller.sal.utils.NetUtils;
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Collection;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.controller.sal.utils.Status;
+import org.opendaylight.controller.sal.utils.StatusCode;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
+
+import org.codehaus.enunciate.jaxrs.ResponseCode;
+import org.codehaus.enunciate.jaxrs.StatusCodes;
+import org.codehaus.enunciate.jaxrs.TypeHint;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.opendaylight.controller.sal.core.Host;
+
+
+/** 
+ * AffinityGroupHosts class to return identifiers by MAC
+ * address. This is created and populated by the northbound and
+ * manager classes.
+ */
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
+public class AffinityGroupHosts implements Cloneable, Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @XmlAttribute
+    private String name;
+
+    @XmlElement
+    private final List<Host> hostlist;
+
+    public AffinityGroupHosts() {
+        hostlist = new ArrayList<Host>();
+    }
+
+    public AffinityGroupHosts(String name, List<Host> hostlist) {
+       this.name = name;
+       this.hostlist = hostlist;
+    }
+    @Override
+    public String toString() {
+        String output = this.name;
+        return output;
+    }
+
+    public String getName() {
+       return name;
+    }
+
+    public List<Host> getHosts() {
+        return hostlist;
+    }
+}
+
index c2df47cb6cb3c3ae7b41749b353ad93825cfc6b3..223347b40b026b069b2b5a9277a9ccd23af860ac 100644 (file)
@@ -28,10 +28,10 @@ public class AffinityGroupList {
     public AffinityGroupList (List<AffinityGroup> aff) {
         this.affinityGroupList = aff;
     }
-    public List<AffinityGroup> getAffinityList() {
+    public List<AffinityGroup> getAffinityGroupList() {
         return affinityGroupList;
     }
-    public void setAffinityList(List<AffinityGroup> aff) {
+    public void setAffinityGroupList(List<AffinityGroup> aff) {
         this.affinityGroupList = aff;
     }
 }
index 23fb4c3fe0c1ad73c4e4524cc8868f9b2aea4572..326196aae906995ee460b641d43293a51d787233 100644 (file)
@@ -69,6 +69,7 @@ public class AffinityNorthbound {
         return username;
     }
 
+
     private IAffinityManager getIfAffinityManagerService(String containerName) {
         log.debug("In getIfAffinityManager");
 
@@ -186,6 +187,48 @@ public class AffinityNorthbound {
         }
     }
 
+
+    /**
+     * Return AG endpoints as hosts. 
+     *
+     * @param containerName
+     *            Name of the Container. The Container name for the base
+     *            controller is "default".
+     * @param affinityGroupName
+     *            Name of the affinity group being retrieved.
+     * @return affinity group as a Hosts object.
+     */
+    @Path("/{containerName}/hosts/{affinityGroupName}")
+    @GET
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @TypeHint(AffinityGroupHosts.class)
+    @StatusCodes({
+            @ResponseCode(code = 200, condition = "Operation successful"),
+            @ResponseCode(code = 404, condition = "The containerName is not found"),
+            @ResponseCode(code = 415, condition = "Affinity name is not found"),
+            @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
+    public AffinityGroupHosts getAffinityGroupHosts(@PathParam("containerName") String containerName,
+                                       @PathParam("affinityGroupName") String affinityGroupName) {
+        if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
+            throw new UnauthorizedException("User is not authorized to perform this operation on container "
+                                            + containerName);
+        }
+        IAffinityManager affinityManager = getIfAffinityManagerService(containerName);
+        if (affinityManager == null) {
+            throw new ServiceUnavailableException("Affinity "
+                                                  + RestMessages.SERVICEUNAVAILABLE.toString());
+        }
+        
+        log.info("Get affinity group details" + affinityGroupName);
+        AffinityGroupHosts hosts = new AffinityGroupHosts(affinityGroupName, affinityManager.getAffinityGroupHosts(affinityGroupName));
+        
+        if (hosts == null) {
+            throw new ResourceNotFoundException(RestMessages.SERVICEUNAVAILABLE.toString());
+        } else {
+            return hosts;
+        }
+    }
+
     /**
      * Add an affinity link with one "from" and one "to" affinity group. 
      *
index 6642cbc511a1a0dbe17cb59c640279211097bcea..68ef82df43b226beb5a7e7bff1f37882dccdf129 100644 (file)
@@ -121,9 +121,7 @@ public class FlatL2AffinityImpl implements IfNewHostNotify {
     HashMap<String, HashMap<AffinityAttributeType, AffinityAttribute>> attribs;
 
     Set<Node> nodelist;
-
-    private static short REDIRECT_IPSWITCH_PRIORITY = 3;
-
+    
     public enum ReasonCode {
         SUCCESS("Success"), FAILURE("Failure"), INVALID_CONF(
                 "Invalid Configuration"), EXIST("Entry Already Exist"), CONFLICT(
index af77a179255a2319e32c416dee308472fee31d5d..aee20d646be61969051975159cd5d5d3ebbb0733 100644 (file)
@@ -30,7 +30,7 @@ def list_all_hosts():
     print "list inactive hosts"
     get_url = 'http://localhost:8080/controller/nb/v2/hosttracker/default/hosts/inactive'
     rest_method(get_url, "GET")
-    content = rest_method(put_url, "GET")
+    content = rest_method(get_url, "GET")
     hostCfg = json.loads(content)
     for host in hostCfg['hostConfig']:
         print host
@@ -38,7 +38,8 @@ def list_all_hosts():
 def get_all_affinity_groups(): 
     print "get all affinity groups"
     get_url = 'http://localhost:8080/affinity/nb/v2/affinity/default/affinity-groups'
-    rest_method(get_url, "GET")
+    content = rest_method(get_url, "GET")
+    print content
 
 # Tbd
 def get_all_affinity_links(): 
@@ -54,6 +55,11 @@ def get_affinity_group(groupname):
     get_url = 'http://localhost:8080/affinity/nb/v2/affinity/default/group/' + groupname
     rest_method(get_url, "GET")
 
+def get_affinity_hosts(groupname): 
+    get_url = 'http://localhost:8080/affinity/nb/v2/affinity/default/hosts/' + groupname
+    content = rest_method(get_url, "GET")
+    print content
+
 def get_affinity_link(linkname):
     get_url = 'http://localhost:8080/affinity/nb/v2/affinity/default/link/' + linkname
     content = rest_method(get_url, "GET")