Chiara Contoli
Committed by Gerrit Code Review

Adding SinglePointToMultiPointIntentCodec for support SP2MP intent over REST

Change-Id: Ic04529520ad1719f3d241b3a79d8e0602bfeac4e
...@@ -63,6 +63,7 @@ import org.onosproject.net.intent.Constraint; ...@@ -63,6 +63,7 @@ import org.onosproject.net.intent.Constraint;
63 import org.onosproject.net.intent.HostToHostIntent; 63 import org.onosproject.net.intent.HostToHostIntent;
64 import org.onosproject.net.intent.Intent; 64 import org.onosproject.net.intent.Intent;
65 import org.onosproject.net.intent.PointToPointIntent; 65 import org.onosproject.net.intent.PointToPointIntent;
66 +import org.onosproject.net.intent.SinglePointToMultiPointIntent;
66 import org.onosproject.net.key.DeviceKey; 67 import org.onosproject.net.key.DeviceKey;
67 import org.onosproject.net.mcast.McastRoute; 68 import org.onosproject.net.mcast.McastRoute;
68 import org.onosproject.net.meter.Band; 69 import org.onosproject.net.meter.Band;
...@@ -108,6 +109,7 @@ public class CodecManager implements CodecService { ...@@ -108,6 +109,7 @@ public class CodecManager implements CodecService {
108 registerCodec(HostLocation.class, new HostLocationCodec()); 109 registerCodec(HostLocation.class, new HostLocationCodec());
109 registerCodec(HostToHostIntent.class, new HostToHostIntentCodec()); 110 registerCodec(HostToHostIntent.class, new HostToHostIntentCodec());
110 registerCodec(PointToPointIntent.class, new PointToPointIntentCodec()); 111 registerCodec(PointToPointIntent.class, new PointToPointIntentCodec());
112 + registerCodec(SinglePointToMultiPointIntent.class, new SinglePointToMultiPointIntentCodec());
111 registerCodec(Intent.class, new IntentCodec()); 113 registerCodec(Intent.class, new IntentCodec());
112 registerCodec(ConnectivityIntent.class, new ConnectivityIntentCodec()); 114 registerCodec(ConnectivityIntent.class, new ConnectivityIntentCodec());
113 registerCodec(FlowEntry.class, new FlowEntryCodec()); 115 registerCodec(FlowEntry.class, new FlowEntryCodec());
......
...@@ -19,12 +19,12 @@ import org.onosproject.codec.CodecContext; ...@@ -19,12 +19,12 @@ import org.onosproject.codec.CodecContext;
19 import org.onosproject.codec.JsonCodec; 19 import org.onosproject.codec.JsonCodec;
20 import org.onosproject.core.CoreService; 20 import org.onosproject.core.CoreService;
21 import org.onosproject.net.NetworkResource; 21 import org.onosproject.net.NetworkResource;
22 -import org.onosproject.net.intent.HostToHostIntent; 22 +import org.onosproject.net.intent.PointToPointIntent;
23 import org.onosproject.net.intent.Intent; 23 import org.onosproject.net.intent.Intent;
24 import org.onosproject.net.intent.IntentService; 24 import org.onosproject.net.intent.IntentService;
25 import org.onosproject.net.intent.IntentState; 25 import org.onosproject.net.intent.IntentState;
26 -import org.onosproject.net.intent.PointToPointIntent; 26 +import org.onosproject.net.intent.HostToHostIntent;
27 - 27 +import org.onosproject.net.intent.SinglePointToMultiPointIntent;
28 import com.fasterxml.jackson.databind.JsonNode; 28 import com.fasterxml.jackson.databind.JsonNode;
29 import com.fasterxml.jackson.databind.node.ArrayNode; 29 import com.fasterxml.jackson.databind.node.ArrayNode;
30 import com.fasterxml.jackson.databind.node.ObjectNode; 30 import com.fasterxml.jackson.databind.node.ObjectNode;
...@@ -83,6 +83,8 @@ public final class IntentCodec extends JsonCodec<Intent> { ...@@ -83,6 +83,8 @@ public final class IntentCodec extends JsonCodec<Intent> {
83 return context.codec(PointToPointIntent.class).decode(json, context); 83 return context.codec(PointToPointIntent.class).decode(json, context);
84 } else if (type.equals(HostToHostIntent.class.getSimpleName())) { 84 } else if (type.equals(HostToHostIntent.class.getSimpleName())) {
85 return context.codec(HostToHostIntent.class).decode(json, context); 85 return context.codec(HostToHostIntent.class).decode(json, context);
86 + } else if (type.equals(SinglePointToMultiPointIntent.class.getSimpleName())) {
87 + return context.codec(SinglePointToMultiPointIntent.class).decode(json, context);
86 } 88 }
87 89
88 throw new IllegalArgumentException("Intent type " 90 throw new IllegalArgumentException("Intent type "
......
1 +/*
2 + * Copyright 2015-present 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.codec.impl;
17 +
18 +import com.fasterxml.jackson.databind.JsonNode;
19 +import com.fasterxml.jackson.databind.node.ArrayNode;
20 +import org.onosproject.codec.CodecContext;
21 +import org.onosproject.codec.JsonCodec;
22 +import org.onosproject.net.ConnectPoint;
23 +import org.onosproject.net.intent.ConnectivityIntent;
24 +import org.onosproject.net.intent.SinglePointToMultiPointIntent;
25 +import com.fasterxml.jackson.databind.node.ObjectNode;
26 +
27 +import java.util.HashSet;
28 +import java.util.Set;
29 +
30 +import static com.google.common.base.Preconditions.checkNotNull;
31 +import static org.onlab.util.Tools.nullIsIllegal;
32 +
33 +/**
34 + * Single Point to Multi Point intent codec.
35 + */
36 +public class SinglePointToMultiPointIntentCodec extends JsonCodec<SinglePointToMultiPointIntent> {
37 + private static final String INGRESS_POINT = "ingressPoint";
38 + private static final String EGRESS_POINT = "egressPoint";
39 + private static final String CP_POINTS = "connectPoints";
40 +
41 + @Override
42 + public ObjectNode encode(SinglePointToMultiPointIntent intent, CodecContext context) {
43 + checkNotNull(intent, "Single Point to Multi Point intent cannot be null");
44 +
45 + final JsonCodec<ConnectivityIntent> connectivityIntentCodec =
46 + context.codec(ConnectivityIntent.class);
47 + final ObjectNode result = connectivityIntentCodec.encode(intent, context);
48 +
49 + final JsonCodec<ConnectPoint> connectPointCodec =
50 + context.codec(ConnectPoint.class);
51 + final ObjectNode ingress =
52 + connectPointCodec.encode(intent.ingressPoint(), context);
53 +
54 + final ObjectNode result2 = context.mapper().createObjectNode();
55 + final ArrayNode jsonconnectPoints = result2.putArray(CP_POINTS);
56 +
57 + if (intent.egressPoints() != null) {
58 + for (final ConnectPoint cp : intent.egressPoints()) {
59 + jsonconnectPoints.add(connectPointCodec.encode(cp, context));
60 + }
61 + result.set(EGRESS_POINT, jsonconnectPoints);
62 + }
63 + result.set(INGRESS_POINT, ingress);
64 +
65 + return result;
66 + }
67 +
68 + @Override
69 + public SinglePointToMultiPointIntent decode(ObjectNode json, CodecContext context) {
70 + SinglePointToMultiPointIntent.Builder builder = SinglePointToMultiPointIntent.builder();
71 +
72 + IntentCodec.intentAttributes(json, context, builder);
73 + ConnectivityIntentCodec.intentAttributes(json, context, builder);
74 +
75 + ObjectNode ingressJson = nullIsIllegal(get(json, INGRESS_POINT),
76 + INGRESS_POINT + IntentCodec.MISSING_MEMBER_MESSAGE);
77 + ConnectPoint ingress = context.codec(ConnectPoint.class)
78 + .decode(ingressJson, context);
79 + builder.ingressPoint(ingress);
80 +
81 + ObjectNode egressJson = nullIsIllegal(get(json, EGRESS_POINT),
82 + EGRESS_POINT + IntentCodec.MISSING_MEMBER_MESSAGE);
83 + if (egressJson != null) {
84 + final JsonCodec<ConnectPoint> connectPointCodec =
85 + context.codec(ConnectPoint.class);
86 + JsonNode connectPointsJson = get(json, EGRESS_POINT).get(CP_POINTS);
87 +
88 + Set<ConnectPoint> egressCp = new HashSet<ConnectPoint>();
89 + if (connectPointsJson != null) {
90 + for (int i = 0; i < connectPointsJson.size(); i++) {
91 + egressCp.add(connectPointCodec.decode(get(connectPointsJson, i),
92 + context));
93 + }
94 + builder.egressPoints(egressCp);
95 + }
96 + }
97 +
98 + return builder.build();
99 + }
100 +}
...@@ -18,14 +18,15 @@ package org.onosproject.rest.resources; ...@@ -18,14 +18,15 @@ package org.onosproject.rest.resources;
18 import com.fasterxml.jackson.databind.node.ObjectNode; 18 import com.fasterxml.jackson.databind.node.ObjectNode;
19 import org.onosproject.core.ApplicationId; 19 import org.onosproject.core.ApplicationId;
20 import org.onosproject.core.CoreService; 20 import org.onosproject.core.CoreService;
21 +import org.onosproject.net.intent.SinglePointToMultiPointIntent;
22 +import org.onosproject.net.intent.PointToPointIntent;
21 import org.onosproject.net.intent.HostToHostIntent; 23 import org.onosproject.net.intent.HostToHostIntent;
22 import org.onosproject.net.intent.Intent; 24 import org.onosproject.net.intent.Intent;
25 +import org.onosproject.net.intent.IntentState;
23 import org.onosproject.net.intent.IntentEvent; 26 import org.onosproject.net.intent.IntentEvent;
24 import org.onosproject.net.intent.IntentListener; 27 import org.onosproject.net.intent.IntentListener;
25 import org.onosproject.net.intent.IntentService; 28 import org.onosproject.net.intent.IntentService;
26 -import org.onosproject.net.intent.IntentState;
27 import org.onosproject.net.intent.Key; 29 import org.onosproject.net.intent.Key;
28 -import org.onosproject.net.intent.PointToPointIntent;
29 import org.onosproject.rest.AbstractWebResource; 30 import org.onosproject.rest.AbstractWebResource;
30 import org.slf4j.Logger; 31 import org.slf4j.Logger;
31 32
...@@ -108,6 +109,8 @@ public class IntentsWebResource extends AbstractWebResource { ...@@ -108,6 +109,8 @@ public class IntentsWebResource extends AbstractWebResource {
108 root = codec(HostToHostIntent.class).encode((HostToHostIntent) intent, this); 109 root = codec(HostToHostIntent.class).encode((HostToHostIntent) intent, this);
109 } else if (intent instanceof PointToPointIntent) { 110 } else if (intent instanceof PointToPointIntent) {
110 root = codec(PointToPointIntent.class).encode((PointToPointIntent) intent, this); 111 root = codec(PointToPointIntent.class).encode((PointToPointIntent) intent, this);
112 + } else if (intent instanceof SinglePointToMultiPointIntent) {
113 + root = codec(SinglePointToMultiPointIntent.class).encode((SinglePointToMultiPointIntent) intent, this);
111 } else { 114 } else {
112 root = codec(Intent.class).encode(intent, this); 115 root = codec(Intent.class).encode(intent, this);
113 } 116 }
......