Committed by
Gerrit Code Review
ONOS-574 - Complete REST APIs for flows
- codecs for all objects referenced by flows - codecs for HostToHost and PointToPoint intents - standardized on context.codec() rather than direct calls to new codec() Change-Id: I94fcb6e31a9161132c6efc2793b9c46fa3cc4570
Showing
13 changed files
with
547 additions
and
18 deletions
... | @@ -20,6 +20,7 @@ import org.apache.felix.scr.annotations.Activate; | ... | @@ -20,6 +20,7 @@ import org.apache.felix.scr.annotations.Activate; |
20 | import org.apache.felix.scr.annotations.Component; | 20 | import org.apache.felix.scr.annotations.Component; |
21 | import org.apache.felix.scr.annotations.Deactivate; | 21 | import org.apache.felix.scr.annotations.Deactivate; |
22 | import org.apache.felix.scr.annotations.Service; | 22 | import org.apache.felix.scr.annotations.Service; |
23 | +import org.onlab.packet.Ethernet; | ||
23 | import org.onosproject.codec.CodecService; | 24 | import org.onosproject.codec.CodecService; |
24 | import org.onosproject.codec.JsonCodec; | 25 | import org.onosproject.codec.JsonCodec; |
25 | import org.onosproject.net.Annotations; | 26 | import org.onosproject.net.Annotations; |
... | @@ -32,7 +33,12 @@ import org.onosproject.net.Port; | ... | @@ -32,7 +33,12 @@ import org.onosproject.net.Port; |
32 | import org.onosproject.net.flow.FlowEntry; | 33 | import org.onosproject.net.flow.FlowEntry; |
33 | import org.onosproject.net.flow.TrafficSelector; | 34 | import org.onosproject.net.flow.TrafficSelector; |
34 | import org.onosproject.net.flow.TrafficTreatment; | 35 | import org.onosproject.net.flow.TrafficTreatment; |
36 | +import org.onosproject.net.flow.criteria.Criterion; | ||
37 | +import org.onosproject.net.flow.instructions.Instruction; | ||
38 | +import org.onosproject.net.intent.ConnectivityIntent; | ||
39 | +import org.onosproject.net.intent.HostToHostIntent; | ||
35 | import org.onosproject.net.intent.Intent; | 40 | import org.onosproject.net.intent.Intent; |
41 | +import org.onosproject.net.intent.PointToPointIntent; | ||
36 | import org.slf4j.Logger; | 42 | import org.slf4j.Logger; |
37 | import org.slf4j.LoggerFactory; | 43 | import org.slf4j.LoggerFactory; |
38 | 44 | ||
... | @@ -61,10 +67,16 @@ public class CodecManager implements CodecService { | ... | @@ -61,10 +67,16 @@ public class CodecManager implements CodecService { |
61 | registerCodec(Link.class, new LinkCodec()); | 67 | registerCodec(Link.class, new LinkCodec()); |
62 | registerCodec(Host.class, new HostCodec()); | 68 | registerCodec(Host.class, new HostCodec()); |
63 | registerCodec(HostLocation.class, new HostLocationCodec()); | 69 | registerCodec(HostLocation.class, new HostLocationCodec()); |
70 | + registerCodec(HostToHostIntent.class, new HostToHostIntentCodec()); | ||
71 | + registerCodec(PointToPointIntent.class, new PointToPointIntentCodec()); | ||
64 | registerCodec(Intent.class, new IntentCodec()); | 72 | registerCodec(Intent.class, new IntentCodec()); |
73 | + registerCodec(ConnectivityIntent.class, new ConnectivityIntentCodec()); | ||
65 | registerCodec(FlowEntry.class, new FlowEntryCodec()); | 74 | registerCodec(FlowEntry.class, new FlowEntryCodec()); |
66 | registerCodec(TrafficTreatment.class, new TrafficTreatmentCodec()); | 75 | registerCodec(TrafficTreatment.class, new TrafficTreatmentCodec()); |
67 | registerCodec(TrafficSelector.class, new TrafficSelectorCodec()); | 76 | registerCodec(TrafficSelector.class, new TrafficSelectorCodec()); |
77 | + registerCodec(Instruction.class, new InstructionCodec()); | ||
78 | + registerCodec(Criterion.class, new CriterionCodec()); | ||
79 | + registerCodec(Ethernet.class, new EthernetCodec()); | ||
68 | log.info("Started"); | 80 | log.info("Started"); |
69 | } | 81 | } |
70 | 82 | ... | ... |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onosproject.codec.CodecContext; | ||
19 | +import org.onosproject.codec.JsonCodec; | ||
20 | +import org.onosproject.net.flow.TrafficSelector; | ||
21 | +import org.onosproject.net.flow.TrafficTreatment; | ||
22 | +import org.onosproject.net.intent.ConnectivityIntent; | ||
23 | +import org.onosproject.net.intent.Intent; | ||
24 | + | ||
25 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
26 | + | ||
27 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
28 | + | ||
29 | +/** | ||
30 | + * Connectivity intent codec. | ||
31 | + */ | ||
32 | +public class ConnectivityIntentCodec extends JsonCodec<ConnectivityIntent> { | ||
33 | + | ||
34 | + @Override | ||
35 | + public ObjectNode encode(ConnectivityIntent intent, CodecContext context) { | ||
36 | + checkNotNull(intent, "Connectivity intent cannot be null"); | ||
37 | + | ||
38 | + final JsonCodec<Intent> intentCodec = context.codec(Intent.class); | ||
39 | + final ObjectNode result = intentCodec.encode(intent, context); | ||
40 | + | ||
41 | + if (intent.selector() != null) { | ||
42 | + final JsonCodec<TrafficSelector> selectorCodec = | ||
43 | + context.codec(TrafficSelector.class); | ||
44 | + result.set("selector", selectorCodec.encode(intent.selector(), context)); | ||
45 | + } | ||
46 | + | ||
47 | + if (intent.treatment() != null) { | ||
48 | + final JsonCodec<TrafficTreatment> treatmentCodec = | ||
49 | + context.codec(TrafficTreatment.class); | ||
50 | + result.set("treatment", treatmentCodec.encode(intent.treatment(), context)); | ||
51 | + } | ||
52 | + | ||
53 | + return result; | ||
54 | + } | ||
55 | +} |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onosproject.codec.CodecContext; | ||
19 | +import org.onosproject.codec.JsonCodec; | ||
20 | +import org.onosproject.net.flow.criteria.Criteria; | ||
21 | +import org.onosproject.net.flow.criteria.Criterion; | ||
22 | +import org.slf4j.Logger; | ||
23 | +import org.slf4j.LoggerFactory; | ||
24 | + | ||
25 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
26 | + | ||
27 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
28 | + | ||
29 | +/** | ||
30 | + * Criterion codec. | ||
31 | + */ | ||
32 | +public class CriterionCodec extends JsonCodec<Criterion> { | ||
33 | + | ||
34 | + protected static final Logger log = LoggerFactory.getLogger(CriterionCodec.class); | ||
35 | + | ||
36 | + @Override | ||
37 | + public ObjectNode encode(Criterion criterion, CodecContext context) { | ||
38 | + checkNotNull(criterion, "Criterion cannot be null"); | ||
39 | + | ||
40 | + final ObjectNode result = context.mapper().createObjectNode() | ||
41 | + .put("type", criterion.type().toString()); | ||
42 | + | ||
43 | + switch (criterion.type()) { | ||
44 | + | ||
45 | + case IN_PORT: | ||
46 | + final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion; | ||
47 | + result.put("tcpPort", portCriterion.port().toLong()); | ||
48 | + break; | ||
49 | + | ||
50 | + case ETH_SRC: | ||
51 | + case ETH_DST: | ||
52 | + final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; | ||
53 | + break; | ||
54 | + | ||
55 | + case ETH_TYPE: | ||
56 | + final Criteria.EthTypeCriterion ethTypeCriterion = | ||
57 | + (Criteria.EthTypeCriterion) criterion; | ||
58 | + result.put("ethType", ethTypeCriterion.ethType()); | ||
59 | + break; | ||
60 | + | ||
61 | + case IPV4_SRC: | ||
62 | + case IPV6_SRC: | ||
63 | + final Criteria.IPCriterion iPCriterion = (Criteria.IPCriterion) criterion; | ||
64 | + result.put("ip", iPCriterion.ip().toString()); | ||
65 | + break; | ||
66 | + | ||
67 | + case IP_PROTO: | ||
68 | + final Criteria.IPProtocolCriterion iPProtocolCriterion = | ||
69 | + (Criteria.IPProtocolCriterion) criterion; | ||
70 | + result.put("protocol", iPProtocolCriterion.protocol()); | ||
71 | + break; | ||
72 | + | ||
73 | + case VLAN_PCP: | ||
74 | + final Criteria.VlanPcpCriterion vlanPcpCriterion = | ||
75 | + (Criteria.VlanPcpCriterion) criterion; | ||
76 | + result.put("priority", vlanPcpCriterion.priority()); | ||
77 | + break; | ||
78 | + | ||
79 | + case VLAN_VID: | ||
80 | + final Criteria.VlanIdCriterion vlanIdCriterion = | ||
81 | + (Criteria.VlanIdCriterion) criterion; | ||
82 | + result.put("vlanId", vlanIdCriterion.vlanId().toShort()); | ||
83 | + break; | ||
84 | + | ||
85 | + case TCP_SRC: | ||
86 | + case TCP_DST: | ||
87 | + final Criteria.TcpPortCriterion tcpPortCriterion = | ||
88 | + (Criteria.TcpPortCriterion) criterion; | ||
89 | + result.put("tcpPort", tcpPortCriterion.tcpPort().byteValue()); | ||
90 | + break; | ||
91 | + | ||
92 | + case MPLS_LABEL: | ||
93 | + final Criteria.MplsCriterion mplsCriterion = | ||
94 | + (Criteria.MplsCriterion) criterion; | ||
95 | + result.put("label", mplsCriterion.label()); | ||
96 | + break; | ||
97 | + | ||
98 | + case OCH_SIGID: | ||
99 | + final Criteria.LambdaCriterion lambdaCriterion = | ||
100 | + (Criteria.LambdaCriterion) criterion; | ||
101 | + result.put("lambda", lambdaCriterion.lambda()); | ||
102 | + break; | ||
103 | + | ||
104 | + case OCH_SIGTYPE: | ||
105 | + final Criteria.OpticalSignalTypeCriterion opticalSignalTypeCriterion = | ||
106 | + (Criteria.OpticalSignalTypeCriterion) criterion; | ||
107 | + result.put("signalType", opticalSignalTypeCriterion.signalType()); | ||
108 | + break; | ||
109 | + | ||
110 | + default: | ||
111 | + // Don't know how to format this type | ||
112 | + log.info("Cannot convert criterion of type {} to JSON", | ||
113 | + criterion.type()); | ||
114 | + break; | ||
115 | + } | ||
116 | + | ||
117 | + return result; | ||
118 | + } | ||
119 | +} |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onlab.packet.Ethernet; | ||
19 | +import org.onosproject.codec.CodecContext; | ||
20 | +import org.onosproject.codec.JsonCodec; | ||
21 | +import org.slf4j.Logger; | ||
22 | +import org.slf4j.LoggerFactory; | ||
23 | + | ||
24 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
25 | + | ||
26 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
27 | + | ||
28 | +/** | ||
29 | + * Ethernet codec. | ||
30 | + */ | ||
31 | +public class EthernetCodec extends JsonCodec<Ethernet> { | ||
32 | + | ||
33 | + protected static final Logger log = LoggerFactory.getLogger(CriterionCodec.class); | ||
34 | + | ||
35 | + @Override | ||
36 | + public ObjectNode encode(Ethernet ethernet, CodecContext context) { | ||
37 | + checkNotNull(ethernet, "Ethernet cannot be null"); | ||
38 | + | ||
39 | + return context.mapper().createObjectNode() | ||
40 | + .put("destinationMacAddress", ethernet.getDestinationMAC().toString()) | ||
41 | + .put("sourceMacAddress", ethernet.getSourceMAC().toString()) | ||
42 | + .put("priorityCode", ethernet.getPriorityCode()) | ||
43 | + .put("vlanId", ethernet.getVlanID()) | ||
44 | + .put("etherType", ethernet.getEtherType()) | ||
45 | + .put("pad", ethernet.isPad()); | ||
46 | + } | ||
47 | + | ||
48 | +} |
... | @@ -50,13 +50,13 @@ public class FlowEntryCodec extends JsonCodec<FlowEntry> { | ... | @@ -50,13 +50,13 @@ public class FlowEntryCodec extends JsonCodec<FlowEntry> { |
50 | 50 | ||
51 | if (flowEntry.treatment() != null) { | 51 | if (flowEntry.treatment() != null) { |
52 | final JsonCodec<TrafficTreatment> treatmentCodec = | 52 | final JsonCodec<TrafficTreatment> treatmentCodec = |
53 | - new TrafficTreatmentCodec(); | 53 | + context.codec(TrafficTreatment.class); |
54 | result.set("treatment", treatmentCodec.encode(flowEntry.treatment(), context)); | 54 | result.set("treatment", treatmentCodec.encode(flowEntry.treatment(), context)); |
55 | } | 55 | } |
56 | 56 | ||
57 | if (flowEntry.selector() != null) { | 57 | if (flowEntry.selector() != null) { |
58 | final JsonCodec<TrafficSelector> selectorCodec = | 58 | final JsonCodec<TrafficSelector> selectorCodec = |
59 | - new TrafficSelectorCodec(); | 59 | + context.codec(TrafficSelector.class); |
60 | result.set("selector", selectorCodec.encode(flowEntry.selector(), context)); | 60 | result.set("selector", selectorCodec.encode(flowEntry.selector(), context)); |
61 | } | 61 | } |
62 | 62 | ... | ... |
... | @@ -34,7 +34,8 @@ public class HostCodec extends AnnotatedCodec<Host> { | ... | @@ -34,7 +34,8 @@ public class HostCodec extends AnnotatedCodec<Host> { |
34 | @Override | 34 | @Override |
35 | public ObjectNode encode(Host host, CodecContext context) { | 35 | public ObjectNode encode(Host host, CodecContext context) { |
36 | checkNotNull(host, "Host cannot be null"); | 36 | checkNotNull(host, "Host cannot be null"); |
37 | - final JsonCodec<HostLocation> locationCodec = new HostLocationCodec(); | 37 | + final JsonCodec<HostLocation> locationCodec = |
38 | + context.codec(HostLocation.class); | ||
38 | final ObjectNode result = context.mapper().createObjectNode() | 39 | final ObjectNode result = context.mapper().createObjectNode() |
39 | .put("id", host.id().toString()) | 40 | .put("id", host.id().toString()) |
40 | .put("mac", host.mac().toString()) | 41 | .put("mac", host.mac().toString()) | ... | ... |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onosproject.codec.CodecContext; | ||
19 | +import org.onosproject.codec.JsonCodec; | ||
20 | +import org.onosproject.net.intent.ConnectivityIntent; | ||
21 | +import org.onosproject.net.intent.HostToHostIntent; | ||
22 | + | ||
23 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
24 | + | ||
25 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
26 | + | ||
27 | +/** | ||
28 | + * Host to host intent codec. | ||
29 | + */ | ||
30 | +public class HostToHostIntentCodec extends JsonCodec<HostToHostIntent> { | ||
31 | + | ||
32 | + @Override | ||
33 | + public ObjectNode encode(HostToHostIntent intent, CodecContext context) { | ||
34 | + checkNotNull(intent, "Host to host intent cannot be null"); | ||
35 | + | ||
36 | + final JsonCodec<ConnectivityIntent> connectivityIntentCodec = | ||
37 | + context.codec(ConnectivityIntent.class); | ||
38 | + final ObjectNode result = connectivityIntentCodec.encode(intent, context); | ||
39 | + | ||
40 | + final String one = intent.one().toString(); | ||
41 | + final String two = intent.two().toString(); | ||
42 | + result.put("one", one); | ||
43 | + result.put("two", two); | ||
44 | + | ||
45 | + return result; | ||
46 | + } | ||
47 | +} |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onlab.packet.Ethernet; | ||
19 | +import org.onosproject.codec.CodecContext; | ||
20 | +import org.onosproject.codec.JsonCodec; | ||
21 | +import org.onosproject.net.flow.instructions.Instruction; | ||
22 | +import org.onosproject.net.flow.instructions.Instructions; | ||
23 | +import org.onosproject.net.flow.instructions.L0ModificationInstruction; | ||
24 | +import org.onosproject.net.flow.instructions.L2ModificationInstruction; | ||
25 | +import org.onosproject.net.flow.instructions.L3ModificationInstruction; | ||
26 | +import org.slf4j.Logger; | ||
27 | +import org.slf4j.LoggerFactory; | ||
28 | + | ||
29 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
30 | + | ||
31 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
32 | + | ||
33 | +/** | ||
34 | + * Instruction codec. | ||
35 | + */ | ||
36 | +public class InstructionCodec extends JsonCodec<Instruction> { | ||
37 | + | ||
38 | + protected static final Logger log = LoggerFactory.getLogger(InstructionCodec.class); | ||
39 | + | ||
40 | + /** | ||
41 | + * Encode an L0 modification instruction. | ||
42 | + * | ||
43 | + * @param result json node that the instruction attributes are added to | ||
44 | + * @param instruction The L0 instruction | ||
45 | + */ | ||
46 | + private void encodeL0(ObjectNode result, L0ModificationInstruction instruction) { | ||
47 | + result.put("subtype", instruction.subtype().name()); | ||
48 | + | ||
49 | + switch (instruction.subtype()) { | ||
50 | + case LAMBDA: | ||
51 | + final L0ModificationInstruction.ModLambdaInstruction modLambdaInstruction = | ||
52 | + (L0ModificationInstruction.ModLambdaInstruction) instruction; | ||
53 | + result.put("lambda", modLambdaInstruction.lambda()); | ||
54 | + break; | ||
55 | + | ||
56 | + default: | ||
57 | + log.info("Cannot convert L0 subtype of {}", instruction.subtype()); | ||
58 | + } | ||
59 | + } | ||
60 | + | ||
61 | + /** | ||
62 | + * Encode an L2 modification instruction. | ||
63 | + * | ||
64 | + * @param result json node that the instruction attributes are added to | ||
65 | + * @param instruction The L2 instruction | ||
66 | + * @param context context of the request | ||
67 | + */ | ||
68 | + private void encodeL2(ObjectNode result, | ||
69 | + L2ModificationInstruction instruction, | ||
70 | + CodecContext context) { | ||
71 | + result.put("subtype", instruction.subtype().name()); | ||
72 | + | ||
73 | + switch (instruction.subtype()) { | ||
74 | + case ETH_SRC: | ||
75 | + case ETH_DST: | ||
76 | + final L2ModificationInstruction.ModEtherInstruction modEtherInstruction = | ||
77 | + (L2ModificationInstruction.ModEtherInstruction) instruction; | ||
78 | + result.put("mac", modEtherInstruction.mac().toString()); | ||
79 | + break; | ||
80 | + | ||
81 | + case VLAN_ID: | ||
82 | + final L2ModificationInstruction.ModVlanIdInstruction modVlanIdInstruction = | ||
83 | + (L2ModificationInstruction.ModVlanIdInstruction) instruction; | ||
84 | + result.put("vlanId", modVlanIdInstruction.vlanId().toShort()); | ||
85 | + break; | ||
86 | + | ||
87 | + case VLAN_PCP: | ||
88 | + final L2ModificationInstruction.ModVlanPcpInstruction modVlanPcpInstruction = | ||
89 | + (L2ModificationInstruction.ModVlanPcpInstruction) instruction; | ||
90 | + result.put("vlanPcp", modVlanPcpInstruction.vlanPcp()); | ||
91 | + break; | ||
92 | + | ||
93 | + case MPLS_LABEL: | ||
94 | + final L2ModificationInstruction.ModMplsLabelInstruction modMplsLabelInstruction = | ||
95 | + (L2ModificationInstruction.ModMplsLabelInstruction) instruction; | ||
96 | + result.put("label", modMplsLabelInstruction.label()); | ||
97 | + break; | ||
98 | + | ||
99 | + case MPLS_PUSH: | ||
100 | + final L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions = | ||
101 | + (L2ModificationInstruction.PushHeaderInstructions) instruction; | ||
102 | + | ||
103 | + final JsonCodec<Ethernet> ethernetCodec = | ||
104 | + context.codec(Ethernet.class); | ||
105 | + result.set("ethernetType", | ||
106 | + ethernetCodec.encode(pushHeaderInstructions.ethernetType(), | ||
107 | + context)); | ||
108 | + break; | ||
109 | + | ||
110 | + default: | ||
111 | + log.info("Cannot convert L2 subtype of {}", instruction.subtype()); | ||
112 | + break; | ||
113 | + } | ||
114 | + } | ||
115 | + | ||
116 | + /** | ||
117 | + * Encode an L3 modification instruction. | ||
118 | + * | ||
119 | + * @param result json node that the instruction attributes are added to | ||
120 | + * @param instruction The L3 instruction | ||
121 | + */ | ||
122 | + private void encodeL3(ObjectNode result, L3ModificationInstruction instruction) { | ||
123 | + result.put("subtype", instruction.subtype().name()); | ||
124 | + switch (instruction.subtype()) { | ||
125 | + case IP_SRC: | ||
126 | + case IP_DST: | ||
127 | + final L3ModificationInstruction.ModIPInstruction modIPInstruction = | ||
128 | + (L3ModificationInstruction.ModIPInstruction) instruction; | ||
129 | + result.put("ip", modIPInstruction.ip().toString()); | ||
130 | + break; | ||
131 | + | ||
132 | + default: | ||
133 | + log.info("Cannot convert L3 subtype of {}", instruction.subtype()); | ||
134 | + break; | ||
135 | + } | ||
136 | + } | ||
137 | + | ||
138 | + @Override | ||
139 | + public ObjectNode encode(Instruction instruction, CodecContext context) { | ||
140 | + checkNotNull(instruction, "Instruction cannot be null"); | ||
141 | + | ||
142 | + final ObjectNode result = context.mapper().createObjectNode() | ||
143 | + .put("type", instruction.type().toString()); | ||
144 | + | ||
145 | + | ||
146 | + switch (instruction.type()) { | ||
147 | + case OUTPUT: | ||
148 | + final Instructions.OutputInstruction outputInstruction = | ||
149 | + (Instructions.OutputInstruction) instruction; | ||
150 | + result.put("portNumber", outputInstruction.port().toLong()); | ||
151 | + break; | ||
152 | + | ||
153 | + case DROP: | ||
154 | + break; | ||
155 | + | ||
156 | + case L0MODIFICATION: | ||
157 | + final L0ModificationInstruction l0ModificationInstruction = | ||
158 | + (L0ModificationInstruction) instruction; | ||
159 | + encodeL0(result, l0ModificationInstruction); | ||
160 | + break; | ||
161 | + | ||
162 | + case L2MODIFICATION: | ||
163 | + final L2ModificationInstruction l2ModificationInstruction = | ||
164 | + (L2ModificationInstruction) instruction; | ||
165 | + encodeL2(result, l2ModificationInstruction, context); | ||
166 | + break; | ||
167 | + | ||
168 | + case L3MODIFICATION: | ||
169 | + final L3ModificationInstruction l3ModificationInstruction = | ||
170 | + (L3ModificationInstruction) instruction; | ||
171 | + encodeL3(result, l3ModificationInstruction); | ||
172 | + | ||
173 | + default: | ||
174 | + log.info("Cannot convert instruction type of {}", instruction.type()); | ||
175 | + break; | ||
176 | + } | ||
177 | + return result; | ||
178 | + } | ||
179 | +} |
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.codec.impl; | ||
17 | + | ||
18 | +import org.onosproject.codec.CodecContext; | ||
19 | +import org.onosproject.codec.JsonCodec; | ||
20 | +import org.onosproject.net.ConnectPoint; | ||
21 | +import org.onosproject.net.intent.ConnectivityIntent; | ||
22 | +import org.onosproject.net.intent.PointToPointIntent; | ||
23 | + | ||
24 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
25 | + | ||
26 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
27 | + | ||
28 | +/** | ||
29 | + * Point to point intent codec. | ||
30 | + */ | ||
31 | +public class PointToPointIntentCodec extends JsonCodec<PointToPointIntent> { | ||
32 | + | ||
33 | + @Override | ||
34 | + public ObjectNode encode(PointToPointIntent intent, CodecContext context) { | ||
35 | + checkNotNull(intent, "Point to point intent cannot be null"); | ||
36 | + | ||
37 | + final JsonCodec<ConnectivityIntent> connectivityIntentCodec = | ||
38 | + context.codec(ConnectivityIntent.class); | ||
39 | + final ObjectNode result = connectivityIntentCodec.encode(intent, context); | ||
40 | + | ||
41 | + final JsonCodec<ConnectPoint> connectPointCodec = | ||
42 | + context.codec(ConnectPoint.class); | ||
43 | + final ObjectNode ingress = | ||
44 | + connectPointCodec.encode(intent.ingressPoint(), context); | ||
45 | + final ObjectNode egress = | ||
46 | + connectPointCodec.encode(intent.egressPoint(), context); | ||
47 | + | ||
48 | + result.set("ingressPoint", ingress); | ||
49 | + result.set("egressPoint", egress); | ||
50 | + | ||
51 | + return result; | ||
52 | + } | ||
53 | +} |
... | @@ -37,9 +37,10 @@ public class TrafficSelectorCodec extends JsonCodec<TrafficSelector> { | ... | @@ -37,9 +37,10 @@ public class TrafficSelectorCodec extends JsonCodec<TrafficSelector> { |
37 | final ArrayNode jsonCriteria = result.putArray("criteria"); | 37 | final ArrayNode jsonCriteria = result.putArray("criteria"); |
38 | 38 | ||
39 | if (selector.criteria() != null) { | 39 | if (selector.criteria() != null) { |
40 | - for (final Criterion criterion :selector.criteria()) { | 40 | + final JsonCodec<Criterion> criterionCodec = |
41 | - // TODO: would be better to have a codec that understands criteria | 41 | + context.codec(Criterion.class); |
42 | - jsonCriteria.add(criterion.toString()); | 42 | + for (final Criterion criterion : selector.criteria()) { |
43 | + jsonCriteria.add(criterionCodec.encode(criterion, context)); | ||
43 | } | 44 | } |
44 | } | 45 | } |
45 | 46 | ... | ... |
... | @@ -37,9 +37,10 @@ public class TrafficTreatmentCodec extends JsonCodec<TrafficTreatment> { | ... | @@ -37,9 +37,10 @@ public class TrafficTreatmentCodec extends JsonCodec<TrafficTreatment> { |
37 | final ArrayNode jsonInstructions = result.putArray("instructions"); | 37 | final ArrayNode jsonInstructions = result.putArray("instructions"); |
38 | 38 | ||
39 | if (treatment.instructions() != null) { | 39 | if (treatment.instructions() != null) { |
40 | + final JsonCodec<Instruction> instructionCodec = | ||
41 | + context.codec(Instruction.class); | ||
40 | for (final Instruction instruction : treatment.instructions()) { | 42 | for (final Instruction instruction : treatment.instructions()) { |
41 | - // TODO: would be better to have a codec that understands instructions | 43 | + jsonInstructions.add(instructionCodec.encode(instruction, context)); |
42 | - jsonInstructions.add(instruction.toString()); | ||
43 | } | 44 | } |
44 | } | 45 | } |
45 | 46 | ... | ... |
... | @@ -22,9 +22,11 @@ import javax.ws.rs.Produces; | ... | @@ -22,9 +22,11 @@ import javax.ws.rs.Produces; |
22 | import javax.ws.rs.core.MediaType; | 22 | import javax.ws.rs.core.MediaType; |
23 | import javax.ws.rs.core.Response; | 23 | import javax.ws.rs.core.Response; |
24 | 24 | ||
25 | +import org.onosproject.net.intent.HostToHostIntent; | ||
25 | import org.onosproject.net.intent.Intent; | 26 | import org.onosproject.net.intent.Intent; |
26 | import org.onosproject.net.intent.IntentId; | 27 | import org.onosproject.net.intent.IntentId; |
27 | import org.onosproject.net.intent.IntentService; | 28 | import org.onosproject.net.intent.IntentService; |
29 | +import org.onosproject.net.intent.PointToPointIntent; | ||
28 | 30 | ||
29 | import com.fasterxml.jackson.databind.node.ObjectNode; | 31 | import com.fasterxml.jackson.databind.node.ObjectNode; |
30 | 32 | ||
... | @@ -62,7 +64,14 @@ public class IntentsWebResource extends AbstractWebResource { | ... | @@ -62,7 +64,14 @@ public class IntentsWebResource extends AbstractWebResource { |
62 | final Intent intent = nullIsNotFound(get(IntentService.class) | 64 | final Intent intent = nullIsNotFound(get(IntentService.class) |
63 | .getIntent(IntentId.valueOf(id)), | 65 | .getIntent(IntentId.valueOf(id)), |
64 | INTENT_NOT_FOUND); | 66 | INTENT_NOT_FOUND); |
65 | - final ObjectNode root = codec(Intent.class).encode(intent, this); | 67 | + final ObjectNode root; |
68 | + if (intent instanceof HostToHostIntent) { | ||
69 | + root = codec(HostToHostIntent.class).encode((HostToHostIntent) intent, this); | ||
70 | + } else if (intent instanceof PointToPointIntent) { | ||
71 | + root = codec(PointToPointIntent.class).encode((PointToPointIntent) intent, this); | ||
72 | + } else { | ||
73 | + root = codec(Intent.class).encode(intent, this); | ||
74 | + } | ||
66 | return ok(root.toString()).build(); | 75 | return ok(root.toString()).build(); |
67 | } | 76 | } |
68 | } | 77 | } | ... | ... |
... | @@ -49,7 +49,6 @@ import org.onosproject.net.flow.instructions.L0ModificationInstruction; | ... | @@ -49,7 +49,6 @@ import org.onosproject.net.flow.instructions.L0ModificationInstruction; |
49 | 49 | ||
50 | import com.eclipsesource.json.JsonArray; | 50 | import com.eclipsesource.json.JsonArray; |
51 | import com.eclipsesource.json.JsonObject; | 51 | import com.eclipsesource.json.JsonObject; |
52 | -import com.eclipsesource.json.JsonValue; | ||
53 | import com.google.common.collect.ImmutableSet; | 52 | import com.google.common.collect.ImmutableSet; |
54 | import com.sun.jersey.api.client.UniformInterfaceException; | 53 | import com.sun.jersey.api.client.UniformInterfaceException; |
55 | import com.sun.jersey.api.client.WebResource; | 54 | import com.sun.jersey.api.client.WebResource; |
... | @@ -313,15 +312,17 @@ public class FlowsResourceTest extends JerseyTest { | ... | @@ -313,15 +312,17 @@ public class FlowsResourceTest extends JerseyTest { |
313 | } | 312 | } |
314 | for (final Instruction instruction : flow.treatment().instructions()) { | 313 | for (final Instruction instruction : flow.treatment().instructions()) { |
315 | boolean instructionFound = false; | 314 | boolean instructionFound = false; |
316 | - final String instructionString = instruction.toString(); | ||
317 | for (int instructionIndex = 0; instructionIndex < jsonInstructions.size(); instructionIndex++) { | 315 | for (int instructionIndex = 0; instructionIndex < jsonInstructions.size(); instructionIndex++) { |
318 | - final JsonValue value = jsonInstructions.get(instructionIndex); | 316 | + final String jsonType = |
319 | - if (value.asString().equals(instructionString)) { | 317 | + jsonInstructions.get(instructionIndex) |
318 | + .asObject().get("type").asString(); | ||
319 | + final String instructionType = instruction.type().name(); | ||
320 | + if (jsonType.equals(instructionType)) { | ||
320 | instructionFound = true; | 321 | instructionFound = true; |
321 | } | 322 | } |
322 | } | 323 | } |
323 | if (!instructionFound) { | 324 | if (!instructionFound) { |
324 | - reason = "instruction " + instructionString; | 325 | + reason = "instruction " + instruction.toString(); |
325 | return false; | 326 | return false; |
326 | } | 327 | } |
327 | } | 328 | } |
... | @@ -338,15 +339,18 @@ public class FlowsResourceTest extends JerseyTest { | ... | @@ -338,15 +339,18 @@ public class FlowsResourceTest extends JerseyTest { |
338 | } | 339 | } |
339 | for (final Criterion criterion : flow.selector().criteria()) { | 340 | for (final Criterion criterion : flow.selector().criteria()) { |
340 | boolean criterionFound = false; | 341 | boolean criterionFound = false; |
341 | - final String criterionString = criterion.toString(); | 342 | + |
342 | for (int criterionIndex = 0; criterionIndex < jsonCriteria.size(); criterionIndex++) { | 343 | for (int criterionIndex = 0; criterionIndex < jsonCriteria.size(); criterionIndex++) { |
343 | - final JsonValue value = jsonCriteria.get(criterionIndex); | 344 | + final String jsonType = |
344 | - if (value.asString().equals(criterionString)) { | 345 | + jsonCriteria.get(criterionIndex) |
346 | + .asObject().get("type").asString(); | ||
347 | + final String criterionType = criterion.type().name(); | ||
348 | + if (jsonType.equals(criterionType)) { | ||
345 | criterionFound = true; | 349 | criterionFound = true; |
346 | } | 350 | } |
347 | } | 351 | } |
348 | if (!criterionFound) { | 352 | if (!criterionFound) { |
349 | - reason = "criterion " + criterionString; | 353 | + reason = "criterion " + criterion.toString(); |
350 | return false; | 354 | return false; |
351 | } | 355 | } |
352 | } | 356 | } | ... | ... |
-
Please register or login to post a comment