X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fcontainermanager%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcontainermanager%2FContainerFlowConfig.java;h=6abd1acd404956db9f3c0819109154ac85b1717d;hp=9740a9259833c0ef9d60ad821eaea1e0ee723aef;hb=642eb8ecef35197915cd766dd60439812122b0c5;hpb=d6e3e28bf86638685e55289d6cd9cb749838a75e diff --git a/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerFlowConfig.java b/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerFlowConfig.java index 9740a92598..6abd1acd40 100644 --- a/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerFlowConfig.java +++ b/opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerFlowConfig.java @@ -15,13 +15,16 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.controller.sal.packet.BitBufferHelper; @@ -42,15 +45,12 @@ import org.slf4j.LoggerFactory; */ @XmlRootElement (name = "flow-spec-config") @XmlAccessorType(XmlAccessType.NONE) -public class ContainerFlowConfig implements Serializable { +public class ContainerFlowConfig extends ConfigurationObject implements Serializable { private static Logger log = LoggerFactory.getLogger(ContainerFlowConfig.class); /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; - /** The Constant regexName. */ - private static final String regexName = "^[\\w-+.@]+$"; - /** Flow Spec name. */ @XmlElement private String name; @@ -308,9 +308,10 @@ public class ContainerFlowConfig implements Serializable { } /** - * Match Source IP Address. + * Match the set of these vlans with that of flowSpec's vlans. * - * @param flowSpec Flow Specification + * @param flowSpec + * Flow Specification * @return true, if successful */ private boolean matchDlVlan(ContainerFlowConfig flowSpec) { @@ -320,7 +321,8 @@ public class ContainerFlowConfig implements Serializable { if (dlVlan == null || flowSpec.dlVlan == null) { return false; } - return dlVlan.equals(flowSpec.dlVlan); + + return this.getVlanList().equals(flowSpec.getVlanList()); } /** @@ -404,18 +406,34 @@ public class ContainerFlowConfig implements Serializable { } /** - * Returns the vlan id number + * Returns the vlan id number for all vlans specified * - * @return the vlan id number + * @return the vlan id number for all vlans specified */ - public Short getVlanId() { - Short vlan = 0; + public Set getVlanList() { + /* + * example: Vlan = "1,3,5-12" + * elemArray = ["1" "3" "5-12"] + * elem[2] = "5-12" --> limits = ["5" "12"] + * vlanList = [1 3 5 6 7 8 9 10 11 12] + */ + Set vlanList = new HashSet(); try { - vlan = Short.parseShort(dlVlan); + String[] elemArray = dlVlan.split(","); + for (String elem : elemArray) { + if (elem.contains("-")) { + String[] limits = elem.split("-"); + for (short j = Short.valueOf(limits[0]); j <= Short.valueOf(limits[1]); j++) { + vlanList.add(Short.valueOf(j)); + } + } else { + vlanList.add(Short.valueOf(elem)); + } + } } catch (NumberFormatException e) { } - return vlan; + return vlanList; } /** @@ -576,7 +594,7 @@ public class ContainerFlowConfig implements Serializable { * @return true, if is valid */ public Status validate() { - if (!hasValidName()) { + if (!isValidResourceName(name)) { return new Status(StatusCode.BADREQUEST, "Invalid name"); } Status status = validateVlan(); @@ -599,15 +617,6 @@ public class ContainerFlowConfig implements Serializable { return new Status(StatusCode.SUCCESS); } - /** - * Checks if this flow specification configuration has a valid name. - * - * @return true, if successful - */ - private boolean hasValidName() { - return (name != null && !name.isEmpty() && name.matches(regexName)); - } - /** * Validates the vlan number * @@ -617,13 +626,25 @@ public class ContainerFlowConfig implements Serializable { if (dlVlan != null) { short vlanId = 0; try { - vlanId = Short.parseShort(dlVlan); + String[] elemArray = dlVlan.split(","); + for (String elem : elemArray) { + if (elem.contains("-")) { + String[] limits = elem.split("-"); + if (Short.parseShort(limits[0]) < 0 + || Short.parseShort(limits[0]) >= Short.parseShort(limits[1]) + || Short.parseShort(limits[1]) > 0xfff) { + return new Status(StatusCode.BADREQUEST, "Invalid vlan id"); + } + } else { + vlanId = Short.parseShort(elem); + if (vlanId < 0 || vlanId > 0xfff) { + return new Status(StatusCode.BADREQUEST, "Invalid vlan id"); + } + } + } } catch (NumberFormatException e) { return new Status(StatusCode.BADREQUEST, "Invalid vlan id"); } - if (vlanId < 0 || vlanId > 0xfff) { - return new Status(StatusCode.BADREQUEST, "Invalid vlan id"); - } } return new Status(StatusCode.SUCCESS); } @@ -706,20 +727,46 @@ public class ContainerFlowConfig implements Serializable { /** * Returns the matches. - * If unidirectional flag is set, there will be only one match in the list - * If unidirectional flag is unset there will be two matches in the list, + * If unidirectional flag is set, there will be only one match per vlan in the list + * If unidirectional flag is unset there will be two matches per vlan in the list, * only if the specified flow has an intrinsic direction. * For Ex. if the cFlow only has the protocol field configured, no matter - * if unidirectional flag is set or not, only one match will be returned + * if unidirectional flag is set or not, only one match per vlan will be returned * The client just has to iterate over the returned list * @return the matches */ public List getMatches() { List matches = new ArrayList(); - Match match = new Match(); if (this.dlVlan != null && !this.dlVlan.isEmpty()) { - match.setField(MatchType.DL_VLAN, this.getVlanId()); + for(Short vlan:getVlanList()){ + Match match = getMatch(vlan); + matches.add(match); + } + } + else{ + Match match = getMatch(null); + matches.add(match); + } + + if (!ContainerFlowConfig.unidirectional) { + List forwardMatches = new ArrayList(matches); + for (Match match : forwardMatches) { + Match reverse = match.reverse(); + if (!match.equals(reverse)) { + matches.add(reverse); + } + } + } + + return matches; + } + + private Match getMatch(Short vlan){ + Match match = new Match(); + + if (vlan != null) { + match.setField(MatchType.DL_VLAN, vlan); } if (this.nwSrc != null && !this.nwSrc.trim().isEmpty()) { String parts[] = this.nwSrc.split("/"); @@ -756,15 +803,7 @@ public class ContainerFlowConfig implements Serializable { if (this.tpDst != null && !this.tpDst.trim().isEmpty()) { match.setField(MatchType.TP_DST, Integer.valueOf(tpDst).shortValue()); } - - matches.add(match); - if(!ContainerFlowConfig.unidirectional) { - Match reverse = match.reverse(); - if (!match.equals(reverse)) { - matches.add(reverse); - } - } - return matches; + return match; } /*