blob: 6c1c846fbde3ebc1b6bc19a47c8c24ea98379d96 [file] [log] [blame]
Ray Milkeyb82c42b2015-06-30 09:42:20 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Ray Milkeyb82c42b2015-06-30 09:42:20 -07003 *
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 */
16package org.onosproject.codec.impl;
17
18import org.onosproject.codec.CodecContext;
19import org.onosproject.net.DeviceId;
20import org.onosproject.net.Link;
21import org.onosproject.net.intent.Constraint;
22import org.onosproject.net.intent.constraint.AnnotationConstraint;
23import org.onosproject.net.intent.constraint.BandwidthConstraint;
Ray Milkeyb82c42b2015-06-30 09:42:20 -070024import org.onosproject.net.intent.constraint.LatencyConstraint;
25import org.onosproject.net.intent.constraint.LinkTypeConstraint;
David Glantz05c6f432020-03-19 14:56:12 -050026import org.onosproject.net.intent.constraint.MeteredConstraint;
Ray Milkeyb82c42b2015-06-30 09:42:20 -070027import org.onosproject.net.intent.constraint.ObstacleConstraint;
David Glantz05c6f432020-03-19 14:56:12 -050028import org.onosproject.net.intent.constraint.TierConstraint;
Ray Milkeyb82c42b2015-06-30 09:42:20 -070029import org.onosproject.net.intent.constraint.WaypointConstraint;
30
31import com.fasterxml.jackson.databind.node.ArrayNode;
32import com.fasterxml.jackson.databind.node.ObjectNode;
33
34import static com.google.common.base.Preconditions.checkNotNull;
35
36/**
37 * Implementation of encoder for constraint JSON codec.
38 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070039public final class EncodeConstraintCodecHelper {
Ray Milkeyb82c42b2015-06-30 09:42:20 -070040
41 private final Constraint constraint;
42 private final CodecContext context;
43
44 /**
45 * Constructs a constraint encoder.
46 *
47 * @param constraint constraint to encode
48 * @param context to use for look ups
49 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070050 public EncodeConstraintCodecHelper(Constraint constraint, CodecContext context) {
Ray Milkeyb82c42b2015-06-30 09:42:20 -070051 this.constraint = constraint;
52 this.context = context;
53 }
54
55 /**
56 * Encodes a latency constraint.
57 *
58 * @return JSON ObjectNode representing the constraint
59 */
60 private ObjectNode encodeLatencyConstraint() {
61 checkNotNull(constraint, "Duration constraint cannot be null");
62 final LatencyConstraint latencyConstraint =
63 (LatencyConstraint) constraint;
64 return context.mapper().createObjectNode()
65 .put("latencyMillis", latencyConstraint.latency().toMillis());
66 }
67
68 /**
69 * Encodes an obstacle constraint.
70 *
71 * @return JSON ObjectNode representing the constraint
72 */
73 private ObjectNode encodeObstacleConstraint() {
74 checkNotNull(constraint, "Obstacle constraint cannot be null");
75 final ObstacleConstraint obstacleConstraint =
76 (ObstacleConstraint) constraint;
77
78 final ObjectNode result = context.mapper().createObjectNode();
79 final ArrayNode jsonObstacles = result.putArray("obstacles");
80
81 for (DeviceId did : obstacleConstraint.obstacles()) {
82 jsonObstacles.add(did.toString());
83 }
84
85 return result;
86 }
87
88 /**
89 * Encodes a waypoint constraint.
90 *
91 * @return JSON ObjectNode representing the constraint
92 */
93 private ObjectNode encodeWaypointConstraint() {
94 checkNotNull(constraint, "Waypoint constraint cannot be null");
95 final WaypointConstraint waypointConstraint =
96 (WaypointConstraint) constraint;
97
98 final ObjectNode result = context.mapper().createObjectNode();
99 final ArrayNode jsonWaypoints = result.putArray("waypoints");
100
101 for (DeviceId did : waypointConstraint.waypoints()) {
102 jsonWaypoints.add(did.toString());
103 }
104
105 return result;
106 }
107
108 /**
109 * Encodes a annotation constraint.
110 *
111 * @return JSON ObjectNode representing the constraint
112 */
113 private ObjectNode encodeAnnotationConstraint() {
114 checkNotNull(constraint, "Annotation constraint cannot be null");
115 final AnnotationConstraint annotationConstraint =
116 (AnnotationConstraint) constraint;
117 return context.mapper().createObjectNode()
118 .put("key", annotationConstraint.key())
119 .put("threshold", annotationConstraint.threshold());
120 }
121
122 /**
123 * Encodes a bandwidth constraint.
124 *
125 * @return JSON ObjectNode representing the constraint
126 */
127 private ObjectNode encodeBandwidthConstraint() {
128 checkNotNull(constraint, "Bandwidth constraint cannot be null");
129 final BandwidthConstraint bandwidthConstraint =
130 (BandwidthConstraint) constraint;
131 return context.mapper().createObjectNode()
Sho SHIMIZUa88db492015-11-23 13:21:04 -0800132 .put("bandwidth", bandwidthConstraint.bandwidth().bps());
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700133 }
134
135 /**
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700136 * Encodes a link type constraint.
137 *
138 * @return JSON ObjectNode representing the constraint
139 */
140 private ObjectNode encodeLinkTypeConstraint() {
141 checkNotNull(constraint, "Link type constraint cannot be null");
142
143 final LinkTypeConstraint linkTypeConstraint =
144 (LinkTypeConstraint) constraint;
145
146 final ObjectNode result = context.mapper().createObjectNode()
147 .put(ConstraintCodec.INCLUSIVE, linkTypeConstraint.isInclusive());
148
149 final ArrayNode jsonTypes = result.putArray(ConstraintCodec.TYPES);
150
151 if (linkTypeConstraint.types() != null) {
152 for (Link.Type type : linkTypeConstraint.types()) {
153 jsonTypes.add(type.name());
154 }
155 }
156
157 return result;
158 }
159
David Glantz05c6f432020-03-19 14:56:12 -0500160 private ObjectNode encodeMeteredConstraint() {
161 checkNotNull(constraint, "Metered constraint cannot be null");
162 final MeteredConstraint meteredConstraint =
163 (MeteredConstraint) constraint;
164 return context.mapper().createObjectNode()
165 .put("metered", meteredConstraint.isUseMetered());
166 }
167
168 /**
169 * Encodes a tier constraint.
170 *
171 * @return JSON ObjectNode representing the constraint
172 */
173 private ObjectNode encodeTierConstraint() {
174 checkNotNull(constraint, "Tier constraint cannot be null");
175 final TierConstraint tierConstraint = (TierConstraint) constraint;
176
177 final ObjectNode result = context.mapper().createObjectNode()
178 .put(ConstraintCodec.INCLUSIVE, tierConstraint.isInclusive())
179 .put(ConstraintCodec.COST_TYPE, tierConstraint.costType().name());
180
181 final ArrayNode jsonTiers = result.putArray(ConstraintCodec.TIERS);
182
183 if (tierConstraint.tiers() != null) {
184 for (Integer tier : tierConstraint.tiers()) {
185 jsonTiers.add(tier);
186 }
187 }
188
189 return result;
190 }
191
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700192 /**
193 * Encodes the constraint in JSON.
194 *
195 * @return JSON node
196 */
197 public ObjectNode encode() {
198 final ObjectNode result;
199 if (constraint instanceof BandwidthConstraint) {
200 result = encodeBandwidthConstraint();
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700201 } else if (constraint instanceof LinkTypeConstraint) {
202 result = encodeLinkTypeConstraint();
203 } else if (constraint instanceof AnnotationConstraint) {
204 result = encodeAnnotationConstraint();
205 } else if (constraint instanceof LatencyConstraint) {
206 result = encodeLatencyConstraint();
207 } else if (constraint instanceof ObstacleConstraint) {
208 result = encodeObstacleConstraint();
209 } else if (constraint instanceof WaypointConstraint) {
210 result = encodeWaypointConstraint();
David Glantz05c6f432020-03-19 14:56:12 -0500211 } else if (constraint instanceof MeteredConstraint) {
212 result = encodeMeteredConstraint();
213 } else if (constraint instanceof TierConstraint) {
214 result = encodeTierConstraint();
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700215 } else {
216 result = context.mapper().createObjectNode();
217 }
218
219 result.put(ConstraintCodec.TYPE, constraint.getClass().getSimpleName());
220 return result;
221 }
222}