Committed by
Gerrit Code Review
Added a CODEC for the MRIB to be used by CLI and REST API
Change-Id: Ia57c2862a642f037b2098c4d143822b2d199bc07
Showing
8 changed files
with
325 additions
and
88 deletions
| ... | @@ -31,8 +31,9 @@ public final class IGMPProcessMembership { | ... | @@ -31,8 +31,9 @@ public final class IGMPProcessMembership { |
| 31 | * Process the IGMP Membership report. | 31 | * Process the IGMP Membership report. |
| 32 | * | 32 | * |
| 33 | * @param igmp the deserialized IGMP message. | 33 | * @param igmp the deserialized IGMP message. |
| 34 | + * @param receivedFrom the ConnectPoint this message came from. | ||
| 34 | */ | 35 | */ |
| 35 | - public static void processMembership(IGMP igmp, ConnectPoint recievedFrom) { | 36 | + public static void processMembership(IGMP igmp, ConnectPoint receivedFrom) { |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | } | 39 | } | ... | ... |
| ... | @@ -31,6 +31,7 @@ public final class IGMPProcessQuery { | ... | @@ -31,6 +31,7 @@ public final class IGMPProcessQuery { |
| 31 | * Process the IGMP Membership Query message. | 31 | * Process the IGMP Membership Query message. |
| 32 | * | 32 | * |
| 33 | * @param igmp The deserialzed IGMP message | 33 | * @param igmp The deserialzed IGMP message |
| 34 | + * @param receivedFrom the ConnectPoint this message came from. | ||
| 34 | */ | 35 | */ |
| 35 | public static void processQuery(IGMP igmp, ConnectPoint receivedFrom) { | 36 | public static void processQuery(IGMP igmp, ConnectPoint receivedFrom) { |
| 36 | } | 37 | } | ... | ... |
| 1 | /* | 1 | /* |
| 2 | - * Copyright 2014-2015 Open Networking Laboratory | 2 | + * Copyright 2015 Open Networking Laboratory |
| 3 | * | 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. | 5 | * you may not use this file except in compliance with the License. |
| ... | @@ -18,11 +18,10 @@ package org.onosproject.mfwd.cli; | ... | @@ -18,11 +18,10 @@ package org.onosproject.mfwd.cli; |
| 18 | import org.apache.karaf.shell.commands.Argument; | 18 | import org.apache.karaf.shell.commands.Argument; |
| 19 | import org.apache.karaf.shell.commands.Command; | 19 | import org.apache.karaf.shell.commands.Command; |
| 20 | import org.onosproject.cli.AbstractShellCommand; | 20 | import org.onosproject.cli.AbstractShellCommand; |
| 21 | - | ||
| 22 | import org.onosproject.mfwd.impl.McastRouteTable; | 21 | import org.onosproject.mfwd.impl.McastRouteTable; |
| 23 | 22 | ||
| 24 | /** | 23 | /** |
| 25 | - * Delete a multicast route. | 24 | + * Deletes a multicast route. |
| 26 | */ | 25 | */ |
| 27 | @Command(scope = "onos", name = "mcast-delete", | 26 | @Command(scope = "onos", name = "mcast-delete", |
| 28 | description = "Delete a multicast route flow") | 27 | description = "Delete a multicast route flow") |
| ... | @@ -43,5 +42,4 @@ public class McastDeleteCommand extends AbstractShellCommand { | ... | @@ -43,5 +42,4 @@ public class McastDeleteCommand extends AbstractShellCommand { |
| 43 | McastRouteTable mrib = McastRouteTable.getInstance(); | 42 | McastRouteTable mrib = McastRouteTable.getInstance(); |
| 44 | mrib.removeRoute(sAddr, gAddr); | 43 | mrib.removeRoute(sAddr, gAddr); |
| 45 | } | 44 | } |
| 46 | -} | 45 | +} |
| 47 | - | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -17,7 +17,6 @@ package org.onosproject.mfwd.cli; | ... | @@ -17,7 +17,6 @@ package org.onosproject.mfwd.cli; |
| 17 | 17 | ||
| 18 | import org.apache.karaf.shell.commands.Argument; | 18 | import org.apache.karaf.shell.commands.Argument; |
| 19 | import org.apache.karaf.shell.commands.Command; | 19 | import org.apache.karaf.shell.commands.Command; |
| 20 | -import org.onlab.packet.IpPrefix; | ||
| 21 | import org.onosproject.cli.AbstractShellCommand; | 20 | import org.onosproject.cli.AbstractShellCommand; |
| 22 | 21 | ||
| 23 | import org.onosproject.mfwd.impl.McastConnectPoint; | 22 | import org.onosproject.mfwd.impl.McastConnectPoint; |
| ... | @@ -54,24 +53,7 @@ public class McastJoinCommand extends AbstractShellCommand { | ... | @@ -54,24 +53,7 @@ public class McastJoinCommand extends AbstractShellCommand { |
| 54 | @Override | 53 | @Override |
| 55 | protected void execute() { | 54 | protected void execute() { |
| 56 | McastRouteTable mrib = McastRouteTable.getInstance(); | 55 | McastRouteTable mrib = McastRouteTable.getInstance(); |
| 57 | - IpPrefix mcast = IpPrefix.valueOf("224.0.0.0/4"); | ||
| 58 | - IpPrefix saddr = IpPrefix.valueOf(sAddr); | ||
| 59 | - if (mcast.contains(saddr)) { | ||
| 60 | - print("Error: the source address " + sAddr + " must be an IPv4 unicast address"); | ||
| 61 | - return; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - IpPrefix gaddr = IpPrefix.valueOf(gAddr); | ||
| 65 | - if (!mcast.contains(gaddr)) { | ||
| 66 | - print("Error: " + gAddr + " must be a multicast group address"); | ||
| 67 | - return; | ||
| 68 | - } | ||
| 69 | - | ||
| 70 | McastRouteBase mr = mrib.addRoute(sAddr, gAddr); | 56 | McastRouteBase mr = mrib.addRoute(sAddr, gAddr); |
| 71 | - if (mr == null) { | ||
| 72 | - print("Error: unable to save the multicast state"); | ||
| 73 | - return; | ||
| 74 | - } | ||
| 75 | 57 | ||
| 76 | // Port format "of:0000000000000023/4" | 58 | // Port format "of:0000000000000023/4" |
| 77 | if (ingressPort != null) { | 59 | if (ingressPort != null) { | ... | ... |
| ... | @@ -16,21 +16,15 @@ | ... | @@ -16,21 +16,15 @@ |
| 16 | package org.onosproject.mfwd.cli; | 16 | package org.onosproject.mfwd.cli; |
| 17 | 17 | ||
| 18 | import org.apache.karaf.shell.commands.Command; | 18 | import org.apache.karaf.shell.commands.Command; |
| 19 | -import org.onosproject.cli.AbstractShellCommand; | ||
| 20 | -import org.onosproject.net.ConnectPoint; | ||
| 21 | -import org.onlab.packet.IpPrefix; | ||
| 22 | 19 | ||
| 23 | -import java.util.Map; | 20 | +import com.fasterxml.jackson.databind.node.ObjectNode; |
| 24 | -import java.util.Set; | 21 | +import com.fasterxml.jackson.databind.JsonNode; |
| 25 | 22 | ||
| 26 | -import org.slf4j.Logger; | 23 | +import org.onosproject.cli.AbstractShellCommand; |
| 27 | import org.onosproject.mfwd.impl.McastRouteTable; | 24 | import org.onosproject.mfwd.impl.McastRouteTable; |
| 28 | -import org.onosproject.mfwd.impl.McastRouteGroup; | 25 | +import org.onosproject.mfwd.impl.MRibCodec; |
| 29 | - | ||
| 30 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 31 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 32 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 33 | 26 | ||
| 27 | +import org.slf4j.Logger; | ||
| 34 | import static org.slf4j.LoggerFactory.getLogger; | 28 | import static org.slf4j.LoggerFactory.getLogger; |
| 35 | 29 | ||
| 36 | /** | 30 | /** |
| ... | @@ -40,6 +34,7 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -40,6 +34,7 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 40 | public class McastShowCommand extends AbstractShellCommand { | 34 | public class McastShowCommand extends AbstractShellCommand { |
| 41 | 35 | ||
| 42 | private final Logger log = getLogger(getClass()); | 36 | private final Logger log = getLogger(getClass()); |
| 37 | + private static final String MCAST_GROUP = "mcastgroup"; | ||
| 43 | 38 | ||
| 44 | @Override | 39 | @Override |
| 45 | protected void execute() { | 40 | protected void execute() { |
| ... | @@ -52,43 +47,14 @@ public class McastShowCommand extends AbstractShellCommand { | ... | @@ -52,43 +47,14 @@ public class McastShowCommand extends AbstractShellCommand { |
| 52 | } | 47 | } |
| 53 | 48 | ||
| 54 | public JsonNode json(McastRouteTable mrt) { | 49 | public JsonNode json(McastRouteTable mrt) { |
| 55 | - ObjectMapper mapper = new ObjectMapper(); | 50 | + ObjectNode pushContent = new MRibCodec().encode(mrt , this); |
| 56 | - ArrayNode result = mapper.createArrayNode(); | 51 | + return pushContent; |
| 57 | - Map<IpPrefix, McastRouteGroup> mrib4 = mrt.getMrib4(); | ||
| 58 | - for (McastRouteGroup mg : mrib4.values()) { | ||
| 59 | - String sAddr = ""; | ||
| 60 | - String gAddr = ""; | ||
| 61 | - String inPort = ""; | ||
| 62 | - String outPorts = ""; | ||
| 63 | - if (mg.getSaddr() != null) { | ||
| 64 | - sAddr = mg.getSaddr().toString(); | ||
| 65 | - log.info("Multicast Source: " + sAddr); | ||
| 66 | - } | ||
| 67 | - if (mg.getGaddr() != null) { | ||
| 68 | - gAddr = mg.getGaddr().toString(); | ||
| 69 | - log.info("Multicast Group: " + gAddr); | ||
| 70 | - } | ||
| 71 | - if (mg.getIngressPoint() != null) { | ||
| 72 | - inPort = mg.getIngressPoint().toString(); | ||
| 73 | - log.info("Multicast Ingress: " + inPort); | ||
| 74 | - } | ||
| 75 | - Set<ConnectPoint> eps = mg.getEgressConnectPoints(); | ||
| 76 | - if (eps != null && !eps.isEmpty()) { | ||
| 77 | - outPorts = eps.toString(); | ||
| 78 | - } | ||
| 79 | - result.add(mapper.createObjectNode() | ||
| 80 | - .put("src", sAddr) | ||
| 81 | - .put("grp", gAddr) | ||
| 82 | - .put("inPort", inPort) | ||
| 83 | - .put("outPorts", outPorts)); | ||
| 84 | - } | ||
| 85 | - return result; | ||
| 86 | } | 52 | } |
| 87 | 53 | ||
| 88 | /** | 54 | /** |
| 89 | * Displays multicast route table entries. | 55 | * Displays multicast route table entries. |
| 90 | * | 56 | * |
| 91 | - * @param mrt route table | 57 | + * @param mrt Mutlicast Route Table |
| 92 | */ | 58 | */ |
| 93 | protected void printMrib4(McastRouteTable mrt) { | 59 | protected void printMrib4(McastRouteTable mrt) { |
| 94 | print(mrt.printMcastRouteTable()); | 60 | print(mrt.printMcastRouteTable()); | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.mfwd.impl; | ||
| 17 | + | ||
| 18 | +import org.onosproject.codec.CodecContext; | ||
| 19 | +import org.onosproject.codec.JsonCodec; | ||
| 20 | + | ||
| 21 | +import org.onlab.packet.IpPrefix; | ||
| 22 | + | ||
| 23 | +import java.util.Set; | ||
| 24 | +import java.util.Map; | ||
| 25 | +import java.util.Collection; | ||
| 26 | +import java.util.Iterator; | ||
| 27 | +import java.util.Optional; | ||
| 28 | + | ||
| 29 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 30 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 31 | +import com.fasterxml.jackson.databind.JsonNode; | ||
| 32 | +import com.fasterxml.jackson.databind.node.JsonNodeFactory; | ||
| 33 | + | ||
| 34 | +import org.slf4j.Logger; | ||
| 35 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 36 | + | ||
| 37 | +/** | ||
| 38 | + * Encode and Decode the Multicast Route Table in JSON for CLI and REST commands. | ||
| 39 | + */ | ||
| 40 | +public class MRibCodec extends JsonCodec<McastRouteTable> { | ||
| 41 | + | ||
| 42 | + private final Logger log = getLogger(getClass()); | ||
| 43 | + private static final String SOURCE_ADDRESS = "sourceAddress"; | ||
| 44 | + private static final String GROUP_ADDRESS = "groupAddress"; | ||
| 45 | + private static final String INGRESS_POINT = "ingressPoint"; | ||
| 46 | + private static final String EGRESS_POINT = "egressPoint"; | ||
| 47 | + private static final String MCASTCONNECTPOINT = "McastConnectPoint"; | ||
| 48 | + private static final String ELEMENTID = "elementId"; | ||
| 49 | + private static final String PORTNUMBER = "portNumber"; | ||
| 50 | + private static final String MCAST_GROUP = "mcastGroup"; | ||
| 51 | + | ||
| 52 | + /** | ||
| 53 | + * Encode the MRIB into json format. | ||
| 54 | + * | ||
| 55 | + * @param mcastRouteTable McastRouteTable | ||
| 56 | + * @param context CodecContext | ||
| 57 | + * @return result ObjectNode | ||
| 58 | + */ | ||
| 59 | + @Override | ||
| 60 | + public ObjectNode encode(McastRouteTable mcastRouteTable, CodecContext context) { | ||
| 61 | + | ||
| 62 | + final JsonNodeFactory nodeFactory = JsonNodeFactory.instance; | ||
| 63 | + final ObjectNode macastRouteTabNode = nodeFactory.objectNode(); | ||
| 64 | + ArrayNode mcastGroupNode = context.mapper().createArrayNode(); | ||
| 65 | + Optional<McastRouteTable> mcastRouteTabOpt = Optional.ofNullable(mcastRouteTable); | ||
| 66 | + | ||
| 67 | + //checking whether the McastRouteTable is present. | ||
| 68 | + if (mcastRouteTabOpt.isPresent()) { | ||
| 69 | + Map<IpPrefix, McastRouteGroup> mrib4 = mcastRouteTabOpt.get().getMrib4(); | ||
| 70 | + Optional<Map<IpPrefix, McastRouteGroup>> mrib4Opt = Optional.ofNullable(mrib4); | ||
| 71 | + | ||
| 72 | + //checking whether the mrib4 is present. | ||
| 73 | + if (mrib4Opt.isPresent()) { | ||
| 74 | + | ||
| 75 | + for (McastRouteGroup mg : mrib4Opt.get().values()) { | ||
| 76 | + Collection<McastRouteSource> mcastRoute = mg.getSources().values(); | ||
| 77 | + Optional<Collection<McastRouteSource>> mcastRouteOpt = Optional.ofNullable(mcastRoute); | ||
| 78 | + | ||
| 79 | + //checking whether the McastRouteSource List is present. | ||
| 80 | + if (mcastRouteOpt.isPresent()) { | ||
| 81 | + for (McastRouteSource mcastRouteSource : mcastRouteOpt.get()) { | ||
| 82 | + mcastGroupNode.add(createMcastGroupNode(mcastRouteSource, context)); | ||
| 83 | + } | ||
| 84 | + macastRouteTabNode.put(MCAST_GROUP, mcastGroupNode); | ||
| 85 | + } | ||
| 86 | + } | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + return macastRouteTabNode; | ||
| 90 | + } | ||
| 91 | + /** | ||
| 92 | + * Method for creating the McastGroup object node. | ||
| 93 | + * | ||
| 94 | + * @param mcastRouteSource McastRouteSource | ||
| 95 | + */ | ||
| 96 | + private ObjectNode createMcastGroupNode(McastRouteSource mcastRouteSource, CodecContext context) { | ||
| 97 | + | ||
| 98 | + final ObjectNode mcastGroupNode = context.mapper().createObjectNode(); | ||
| 99 | + final ObjectNode ingressNode = context.mapper().createObjectNode(); | ||
| 100 | + final ObjectNode egressNode = context.mapper().createObjectNode(); | ||
| 101 | + final ArrayNode jsonLabelIds = context.mapper().createArrayNode(); | ||
| 102 | + final String sAddr = mcastRouteSource.getSaddr().toString(); | ||
| 103 | + final String gAddr = mcastRouteSource.getGaddr().toString(); | ||
| 104 | + | ||
| 105 | + Optional<String> saddrOpt = Optional.ofNullable(sAddr); | ||
| 106 | + Optional<String> gaddrOpt = Optional.ofNullable(gAddr); | ||
| 107 | + | ||
| 108 | + //checking source address and group address are present. | ||
| 109 | + if (saddrOpt.isPresent() && gaddrOpt.isPresent()) { | ||
| 110 | + mcastGroupNode.put(SOURCE_ADDRESS, saddrOpt.get().toString()); | ||
| 111 | + mcastGroupNode.put(GROUP_ADDRESS, gaddrOpt.get().toString()); | ||
| 112 | + McastConnectPoint mcastIngCP = mcastRouteSource.getIngressPoint(); | ||
| 113 | + Optional<McastConnectPoint> mcastIngCPOpt = Optional.ofNullable(mcastIngCP); | ||
| 114 | + | ||
| 115 | + //checking whether the ingress connection point is present. | ||
| 116 | + if (mcastIngCPOpt.isPresent()) { | ||
| 117 | + ingressNode.put(MCASTCONNECTPOINT, mcastConnectPoint(mcastIngCPOpt.get(), context)); | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + mcastGroupNode.put(INGRESS_POINT , ingressNode); | ||
| 121 | + Set<McastConnectPoint> mcastEgCPSet = mcastRouteSource.getEgressPoints(); | ||
| 122 | + Optional<Set<McastConnectPoint>> mcastEgCPOpt = Optional.ofNullable(mcastEgCPSet); | ||
| 123 | + | ||
| 124 | + //checking whether the egress connection points are present. | ||
| 125 | + if (mcastEgCPOpt.isPresent()) { | ||
| 126 | + for (final McastConnectPoint mcastConnectPoint : mcastEgCPOpt.get()) { | ||
| 127 | + jsonLabelIds.add(mcastConnectPoint(mcastConnectPoint, context)); | ||
| 128 | + } | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + egressNode.put(MCASTCONNECTPOINT , jsonLabelIds); | ||
| 132 | + mcastGroupNode.put(EGRESS_POINT , egressNode); | ||
| 133 | + } | ||
| 134 | + return mcastGroupNode; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + /** | ||
| 138 | + * Method for creating the McastConnectPoint object node. | ||
| 139 | + * | ||
| 140 | + * @param mcastConnectPoint McastConnectPoint | ||
| 141 | + * @param context CodecContext | ||
| 142 | + * @return mcastCpNode ObjectNode | ||
| 143 | + */ | ||
| 144 | + private ObjectNode mcastConnectPoint(McastConnectPoint mcastConnectPoint, CodecContext context) { | ||
| 145 | + final ObjectNode mcastCpNode = context.mapper().createObjectNode(); | ||
| 146 | + mcastCpNode.put(ELEMENTID , mcastConnectPoint.getConnectPoint().elementId().toString()); | ||
| 147 | + mcastCpNode.put(PORTNUMBER , mcastConnectPoint.getConnectPoint().port().toLong()); | ||
| 148 | + return mcastCpNode; | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + /** | ||
| 152 | + * Decode json format and insert into the flow table. | ||
| 153 | + * | ||
| 154 | + * @param json ObjectNode | ||
| 155 | + * @param context CodecContext | ||
| 156 | + * @return mr McastRouteBase | ||
| 157 | + */ | ||
| 158 | + @Override | ||
| 159 | + public McastRouteTable decode(ObjectNode json, CodecContext context) { | ||
| 160 | + | ||
| 161 | + String macAddr = null; | ||
| 162 | + String portNo = null; | ||
| 163 | + String sAddr = json.path(SOURCE_ADDRESS).asText(); | ||
| 164 | + String gAddr = json.path(GROUP_ADDRESS).asText(); | ||
| 165 | + JsonNode inPntObjNode = (JsonNode) json.path(INGRESS_POINT); | ||
| 166 | + JsonNode egPntArrNode = (JsonNode) json.path(EGRESS_POINT); | ||
| 167 | + | ||
| 168 | + log.debug("sAddr :" + sAddr + " gAddr :" + gAddr + " inPntObjNode :" + inPntObjNode); | ||
| 169 | + log.debug("egPntArrNode :" + egPntArrNode.toString()); | ||
| 170 | + | ||
| 171 | + McastRouteTable mrib = McastRouteTable.getInstance(); | ||
| 172 | + McastRouteBase mr = mrib.addRoute(sAddr, gAddr); | ||
| 173 | + Optional<JsonNode> inPntOpt = Optional.ofNullable(inPntObjNode); | ||
| 174 | + | ||
| 175 | + if (inPntOpt.isPresent()) { | ||
| 176 | + | ||
| 177 | + JsonNode inMcastCP = inPntOpt.get().path(MCASTCONNECTPOINT); | ||
| 178 | + Optional<JsonNode> inCpOpt = Optional.ofNullable(inMcastCP); | ||
| 179 | + | ||
| 180 | + if (inCpOpt.isPresent()) { | ||
| 181 | + macAddr = inCpOpt.get().path(ELEMENTID).asText(); | ||
| 182 | + portNo = inCpOpt.get().path(PORTNUMBER).asText(); | ||
| 183 | + mr.addIngressPoint(macAddr + "/" + Long.parseLong(portNo)); | ||
| 184 | + } | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + Optional<JsonNode> egPntOpt = Optional.ofNullable(egPntArrNode); | ||
| 188 | + | ||
| 189 | + if (egPntOpt.isPresent()) { | ||
| 190 | + JsonNode egMcastCP = egPntOpt.get().path(MCASTCONNECTPOINT); | ||
| 191 | + Optional<JsonNode> egMcCpOpt = Optional.ofNullable(egMcastCP); | ||
| 192 | + | ||
| 193 | + if (egMcCpOpt.isPresent()) { | ||
| 194 | + Iterator<JsonNode> egCpIt = egMcCpOpt.get().elements(); | ||
| 195 | + | ||
| 196 | + while (egCpIt.hasNext()) { | ||
| 197 | + | ||
| 198 | + JsonNode egMcastCPObj = egCpIt.next(); | ||
| 199 | + Optional<JsonNode> egMcCpObOpt = Optional.ofNullable(egMcastCPObj); | ||
| 200 | + if (egMcCpObOpt.isPresent()) { | ||
| 201 | + macAddr = egMcCpObOpt.get().path(ELEMENTID).asText(); | ||
| 202 | + portNo = egMcCpObOpt.get().path(PORTNUMBER).asText(); | ||
| 203 | + log.debug("macAddr egPort : " + macAddr + " portNo egPort :" + portNo); | ||
| 204 | + mr.addEgressPoint(macAddr + "/" + Long.parseLong(portNo), McastConnectPoint.JoinSource.STATIC); | ||
| 205 | + } | ||
| 206 | + } | ||
| 207 | + } | ||
| 208 | + } | ||
| 209 | + return mrib; | ||
| 210 | + } | ||
| 211 | +} |
| ... | @@ -130,6 +130,7 @@ interface McastRoute { | ... | @@ -130,6 +130,7 @@ interface McastRoute { |
| 130 | /** | 130 | /** |
| 131 | * Find the egress connect point if it exists. | 131 | * Find the egress connect point if it exists. |
| 132 | * | 132 | * |
| 133 | + * @param cp ConnectPoint to search for | ||
| 133 | * @return the connect point when found, null otherwise. | 134 | * @return the connect point when found, null otherwise. |
| 134 | */ | 135 | */ |
| 135 | public McastConnectPoint findEgressConnectPoint(ConnectPoint cp); | 136 | public McastConnectPoint findEgressConnectPoint(ConnectPoint cp); | ... | ... |
| ... | @@ -15,58 +15,135 @@ | ... | @@ -15,58 +15,135 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.mfwd.rest; | 16 | package org.onosproject.mfwd.rest; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 20 | - | ||
| 21 | import java.io.IOException; | 18 | import java.io.IOException; |
| 22 | -import java.io.InputStream; | 19 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 23 | -import java.util.Map; | 20 | +import com.fasterxml.jackson.databind.node.ObjectNode; |
| 24 | 21 | ||
| 22 | +import javax.ws.rs.DefaultValue; | ||
| 23 | +import javax.ws.rs.QueryParam; | ||
| 25 | import javax.ws.rs.Consumes; | 24 | import javax.ws.rs.Consumes; |
| 26 | import javax.ws.rs.GET; | 25 | import javax.ws.rs.GET; |
| 27 | import javax.ws.rs.POST; | 26 | import javax.ws.rs.POST; |
| 27 | +import javax.ws.rs.DELETE; | ||
| 28 | import javax.ws.rs.Path; | 28 | import javax.ws.rs.Path; |
| 29 | import javax.ws.rs.Produces; | 29 | import javax.ws.rs.Produces; |
| 30 | import javax.ws.rs.core.MediaType; | 30 | import javax.ws.rs.core.MediaType; |
| 31 | import javax.ws.rs.core.Response; | 31 | import javax.ws.rs.core.Response; |
| 32 | 32 | ||
| 33 | -import org.onlab.packet.IpPrefix; | 33 | +import org.onosproject.mfwd.impl.McastConnectPoint; |
| 34 | -import org.onlab.rest.BaseResource; | ||
| 35 | -import org.onosproject.mfwd.impl.McastRouteGroup; | ||
| 36 | import org.onosproject.mfwd.impl.McastRouteTable; | 34 | import org.onosproject.mfwd.impl.McastRouteTable; |
| 35 | +import org.onosproject.mfwd.impl.McastRouteBase; | ||
| 36 | +import org.onosproject.mfwd.impl.MRibCodec; | ||
| 37 | +import org.onosproject.rest.AbstractWebResource; | ||
| 38 | + | ||
| 39 | +import org.slf4j.Logger; | ||
| 40 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 37 | 41 | ||
| 38 | /** | 42 | /** |
| 39 | * Rest API for Multicast Forwarding. | 43 | * Rest API for Multicast Forwarding. |
| 40 | */ | 44 | */ |
| 41 | @Path("mcast") | 45 | @Path("mcast") |
| 42 | -public class McastResource extends BaseResource { | 46 | +public class McastResource extends AbstractWebResource { |
| 47 | + | ||
| 48 | + private final Logger log = getLogger(getClass()); | ||
| 49 | + private static final String SOURCE_ADDRESS = "sourceAddress"; | ||
| 50 | + private static final String GROUP_ADDRESS = "groupAddress"; | ||
| 51 | + private static final String INGRESS_POINT = "ingressPoint"; | ||
| 52 | + private static final String EGRESS_POINT = "egressPoint"; | ||
| 53 | + private static final String MCAST_GROUP = "mcastGroup"; | ||
| 43 | 54 | ||
| 44 | /** | 55 | /** |
| 45 | * Retrieve the multicast route table. | 56 | * Retrieve the multicast route table. |
| 57 | + * | ||
| 46 | * @return the multicast route table. | 58 | * @return the multicast route table. |
| 47 | * @throws IOException if an error occurs | 59 | * @throws IOException if an error occurs |
| 48 | */ | 60 | */ |
| 61 | + @Path("show") | ||
| 49 | @GET | 62 | @GET |
| 50 | @Produces(MediaType.APPLICATION_JSON) | 63 | @Produces(MediaType.APPLICATION_JSON) |
| 51 | public Response showAll() throws IOException { | 64 | public Response showAll() throws IOException { |
| 52 | - ObjectMapper mapper = new ObjectMapper(); | 65 | + McastRouteTable mrt = McastRouteTable.getInstance(); |
| 53 | - McastRouteTable mcastRouteTable = McastRouteTable.getInstance(); | 66 | + ObjectNode pushContent = new MRibCodec().encode(mrt , this); |
| 54 | - Map<IpPrefix, McastRouteGroup> map = mcastRouteTable.getMrib4(); | 67 | + return ok(pushContent.toString()).build(); |
| 55 | - return Response.ok(mapper.createObjectNode().toString()).build(); | ||
| 56 | } | 68 | } |
| 57 | 69 | ||
| 58 | /** | 70 | /** |
| 59 | - * Static join of a multicast flow. | 71 | + * Static join a multicast flow. |
| 60 | - * @param input source, group, ingress connectPoint egress connectPoints | 72 | + * |
| 61 | - * @return status of static join | 73 | + * @param sAddr source address to join |
| 62 | - * @throws IOException if an error occurs | 74 | + * @param gAddr group address to join |
| 75 | + * @param ports ingress and egress ConnectPoints to join | ||
| 76 | + * @return the Result of the join | ||
| 77 | + * @throws IOException if something failed with the join command | ||
| 63 | */ | 78 | */ |
| 79 | + @Path("/join") | ||
| 64 | @POST | 80 | @POST |
| 65 | @Consumes(MediaType.APPLICATION_JSON) | 81 | @Consumes(MediaType.APPLICATION_JSON) |
| 66 | - @Produces(MediaType.APPLICATION_JSON) | 82 | + @Produces(MediaType.TEXT_PLAIN) |
| 67 | - public Response join(InputStream input) throws IOException { | 83 | + public Response join(@QueryParam("src") String sAddr, |
| 84 | + @QueryParam("grp") String gAddr, | ||
| 85 | + @DefaultValue("") @QueryParam("ports") String ports) | ||
| 86 | + throws IOException { | ||
| 87 | + | ||
| 68 | ObjectMapper mapper = new ObjectMapper(); | 88 | ObjectMapper mapper = new ObjectMapper(); |
| 69 | - JsonNode cfg = mapper.readTree(input); | 89 | + log.debug("Source IP Address: " + sAddr); |
| 70 | - return null; | 90 | + log.debug("Destination IP Address: " + gAddr); |
| 91 | + log.debug("Ingress and Egress ports: " + ports); | ||
| 92 | + | ||
| 93 | + String output = "Insertion Faild"; | ||
| 94 | + if (sAddr != null && gAddr != null && ports != null) { | ||
| 95 | + | ||
| 96 | + String[] portArr = ports.split(","); | ||
| 97 | + log.debug("Port Array Length: " + portArr.length); | ||
| 98 | + McastRouteTable mrt = McastRouteTable.getInstance(); | ||
| 99 | + McastRouteBase mr = mrt.addRoute(sAddr, gAddr); | ||
| 100 | + | ||
| 101 | + // Port format "of:0000000000000023/4" | ||
| 102 | + log.debug("checking inside outer if: " + portArr.length); | ||
| 103 | + | ||
| 104 | + if (mr != null && portArr != null && portArr.length > 0) { | ||
| 105 | + | ||
| 106 | + String inCP = portArr[0]; | ||
| 107 | + log.debug("Ingress port provided: " + inCP); | ||
| 108 | + mr.addIngressPoint(inCP); | ||
| 109 | + | ||
| 110 | + for (int i = 1; i < portArr.length; i++) { | ||
| 111 | + String egCP = portArr[i]; | ||
| 112 | + log.debug("Egress port provided: " + egCP); | ||
| 113 | + mr.addEgressPoint(egCP, McastConnectPoint.JoinSource.STATIC); | ||
| 114 | + } | ||
| 115 | + mrt.printMcastRouteTable(); | ||
| 116 | + output = "Successfully Inserted"; | ||
| 117 | + } | ||
| 118 | + } else { | ||
| 119 | + output = "Please Insert the rest uri correctly"; | ||
| 120 | + } | ||
| 121 | + return Response.ok(output).build(); | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + /** | ||
| 125 | + * Delete multicast state. | ||
| 126 | + * | ||
| 127 | + * @param src address to be deleted | ||
| 128 | + * @param grp address to be deleted | ||
| 129 | + * @return status of delete if successful | ||
| 130 | + */ | ||
| 131 | + @Path("/delete") | ||
| 132 | + @DELETE | ||
| 133 | + @Consumes(MediaType.TEXT_PLAIN) | ||
| 134 | + @Produces(MediaType.TEXT_PLAIN) | ||
| 135 | + public Response removeMcastFlow(@QueryParam("src") String src, | ||
| 136 | + @QueryParam("grp") String grp) { | ||
| 137 | + | ||
| 138 | + String resp = "Failed to delete"; | ||
| 139 | + log.info("Source IP Address to delete: " + src); | ||
| 140 | + log.info("Destination IP Address to delete: " + grp); | ||
| 141 | + McastRouteTable mrt = McastRouteTable.getInstance(); | ||
| 142 | + if (src != null && grp != null) { | ||
| 143 | + mrt.removeRoute(src, grp); | ||
| 144 | + resp = "Deleted flow for src " + src + " and grp " + grp; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + return Response.ok(resp).build(); | ||
| 71 | } | 148 | } |
| 72 | } | 149 | } | ... | ... |
-
Please register or login to post a comment