blob: 9437d4a1e9d44f62183d6660cc28ff85a465e9b8 [file] [log] [blame]
Yixiao Chen39828a62016-09-14 14:37:06 -04001/*
2 * Copyright 2016 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 */
16package org.onosproject.teyang.utils.topology;
17
Yixiao Chen265b3bb2017-01-13 10:17:03 -050018import static com.google.common.base.Preconditions.checkNotNull;
19import static com.google.common.base.Preconditions.checkState;
20
21import java.util.List;
22import java.util.Map;
23
Henry Yu4b4a7eb2016-11-09 20:07:53 -050024import org.onosproject.net.DeviceId;
Yixiao Chen39828a62016-09-14 14:37:06 -040025import org.onosproject.tetopology.management.api.KeyId;
Henry Yua4e34f82016-11-06 18:30:59 -050026import org.onosproject.tetopology.management.api.TeTopologyEvent;
Hesam Rahimi41208102016-12-09 17:54:03 -050027import org.onosproject.tetopology.management.api.TeTopologyKey;
28import org.onosproject.tetopology.management.api.TeTopologyService;
Yixiao Chen39828a62016-09-14 14:37:06 -040029import org.onosproject.tetopology.management.api.link.NetworkLink;
Hesam Rahimi41208102016-12-09 17:54:03 -050030import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040031import org.onosproject.tetopology.management.api.node.NetworkNode;
Hesam Rahimi41208102016-12-09 17:54:03 -050032import org.onosproject.tetopology.management.api.node.NetworkNodeEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040033import org.onosproject.teyang.api.OperationType;
Hesam Rahimie96d0be2016-10-19 15:51:11 -040034import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050035import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.DefaultNetworks;
36import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
37 .DefaultNetworksState;
38import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
39import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
41import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks
42 .DefaultNetwork;
43import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
44import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network
45 .NetworkBuilder;
46import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
47 .DefaultNetworkTypes;
48import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
49 .DefaultSupportingNetwork;
50import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
51 .DefaultSupportingNetwork.SupportingNetworkBuilder;
52import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
53 .NetworkTypes;
54import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
55 .Node;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
57 .SupportingNetwork;
58import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
59 .networks.network.AugmentedNdNetwork;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
61 .networks.network.DefaultAugmentedNdNetwork;
62import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
63 .networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
64import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
65 .networks.network.augmentedndnetwork.Link;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050066import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050067 .IetfTeTopologyEvent;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050068import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.IetfTeTopologyEventSubject;
69import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeLinkEvent;
70import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeNodeEvent;
71import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050072 .network.AugmentedNwNetwork;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050073import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050074 .network.DefaultAugmentedNwNetwork;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050075import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050076 .network.networktypes.AugmentedNwNetworkTypes;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050077import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050078 .network.networktypes.DefaultAugmentedNwNetworkTypes;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050079import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050080 .tetopologyaugment.DefaultTe;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050081import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050082 .tetopologyaugment.Te;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050083import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tetopologyaugment.te.Config;
84import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tetopologyaugment.te.DefaultConfig;
85import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050086 .tetopologytype.DefaultTeTopology;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050087import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050088 .tetopologytype.TeTopology;
Aihua Guo0a6998c2017-02-08 18:14:18 -050089import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Cost;
90import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Delay;
91import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.NotOptimized;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050092import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
Aihua Guo0a6998c2017-02-08 18:14:18 -050093import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOptimizationCriterion;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050094import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050095import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
Yixiao Chen39828a62016-09-14 14:37:06 -040096import org.slf4j.Logger;
97import org.slf4j.LoggerFactory;
98
Yixiao Chen265b3bb2017-01-13 10:17:03 -050099import com.google.common.collect.Lists;
100import com.google.common.collect.Maps;
Yixiao Chen39828a62016-09-14 14:37:06 -0400101
102
103/**
104 * Networks, Networks State conversion functions.
105 */
106public final class NetworkConverter {
107 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500108 E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400109 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500110 E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400111 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500112 E_NULL_TE_NETWORK = "TeSubsystem network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400113 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500114 E_NULL_TE_NETWORKID = "TeSubsystem networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400115 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500116 E_NULL_YANG_NETWORKS = "YANG networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400117 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500118 E_NULL_YANG_NETWORK_LIST = "YANG network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400119 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500120 E_NULL_YANG_NETWORK = "YANG network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400121 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500122 E_NULL_YANG_NETWORKID = "YANG networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400123 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500124 E_NULL_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400125 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500126 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400127 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500128 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400129 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500130 E_NULL_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400131
132 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
133
134 // no instantiation
135 private NetworkConverter() {
136 }
137
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400138 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400139 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500140 case CREATE:
141 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400142
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500143 case DELETE:
144 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400145
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500146 case REMOVE:
147 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400148
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500149 case MERGE:
150 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400151
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500152 case REPLACE:
153 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400154
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500155 default:
156 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400157 }
158 }
159
160 /**
161 * Networks object conversion from TE Topology subsystem to YANG.
162 *
163 * @param teSubsystem TE Topology subsystem networks object
Hesam Rahimi41208102016-12-09 17:54:03 -0500164 * @param operation operation type
165 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400166 * @return Networks YANG object
167 */
168 public static Networks teSubsystem2YangNetworks(
169 org.onosproject.tetopology.management.api.Networks teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500170 OperationType operation,
171 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400172 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
173 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
174 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400175 DefaultNetworks.builder()
176 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400177 List<Network> networks = Lists.newArrayList();
178 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500179 networks.add(teSubsystem2YangNetwork(teNetwork, operation,
180 teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400181 }
182 builder.network(networks);
183 return builder.build();
184 }
185
Yixiao Chen39828a62016-09-14 14:37:06 -0400186 /**
187 * Network States object conversion from TE Topology subsystem to YANG.
188 *
189 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500190 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400191 * @return NetworkStates YANG object
192 */
193 public static NetworksState teSubsystem2YangNetworkStates(
194 org.onosproject.tetopology.management.api.Networks teSubsystem,
195 OperationType operation) {
196 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
197 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
198 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400199 DefaultNetworksState.builder()
200 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400201 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
202 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
203 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
204 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
205 }
206 builder.network(networks);
207 return builder.build();
208 }
209
210 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
211 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
212 NetworksState yangNetworkStates) {
213 checkNotNull(network, "YANG Network object cannot be null");
214 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
215 if (yangNetworkStates.network() == null) {
216 return null;
217 }
218
219 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
220 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
221 if (stateNetwork.networkRef().equals(network.networkId())) {
222 return stateNetwork;
223 }
224 }
225 return null;
226 }
227
228 /**
229 * Networks object conversion from YANG to TE Topology subsystem.
230 *
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500231 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400232 * @param yangNetworkStates NetworkStates YANG object
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500233 * @param deviceId the device Id
Yixiao Chen39828a62016-09-14 14:37:06 -0400234 * @return teSubsystem TE Topology subsystem networks object
235 */
236 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500237 Networks yangNetworks, NetworksState yangNetworkStates, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400238 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
239 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
240 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
241
Yixiao Chen39828a62016-09-14 14:37:06 -0400242 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
243 for (Network network : yangNetworks.network()) {
244 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
245 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500246 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400247 org.onosproject.tetopology.management.api.Network teNetwork;
248 if (stateNetwork == null) {
249 log.info("networkId {} can't be found in yangNetworkStates",
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500250 network.networkId());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500251 teNetwork = yang2TeSubsystemNetwork(network, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400252 } else {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500253 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400254 }
255 networks.add(teNetwork);
256 }
257
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500258 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
259 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400260 return defaultNetworks;
261 }
262
Yixiao Chen39828a62016-09-14 14:37:06 -0400263 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
264 List<KeyId> teSpptNetworkIds) {
265 List<SupportingNetwork> snws = Lists.newArrayList();
266 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
267 for (KeyId teSpNwKey : teSpptNetworkIds) {
268 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500269 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
270 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400271 }
272 return builder.supportingNetwork(snws);
273 }
274
275 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500276 Map<KeyId, NetworkNode> teNodes,
277 TeTopologyService teTopologyService,
278 TeTopologyKey teTopologyKey) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400279 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500280
281 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500282 nodeList.add(NodeConverter.teSubsystem2YangNode(node,
283 teTopologyService,
284 teTopologyKey));
Yixiao Chen39828a62016-09-14 14:37:06 -0400285 }
286 return builder.node(nodeList);
287 }
288
289 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500290 Map<KeyId, NetworkLink> teLinks,
291 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400292 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500293
294 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500295 linkList.add(LinkConverter.teSubsystem2YangLink(link, teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400296 }
297 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
298 ndAugment.link(linkList);
299 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
300 return builder;
301 }
302
303 private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500304 org.onosproject.tetopology.management.api.TeTopologyId
305 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400306 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
307 if (teTopologyId != null) {
308 // Set "te-topology" network type.
309 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
310 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
311 DefaultAugmentedNwNetworkTypes.builder();
312 teNwType.teTopology(teTopology.build());
313 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
314 }
315 return builder.networkTypes(nwType.build());
316 }
317
318 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500319 org.onosproject.tetopology.management.api
320 .TeTopologyId teTopologyId,
321 TeTopologyService teTopologyService,
322 KeyId networkKeyId) {
323
324 //teBuilder. //OPTIMIZATIONCRITERION for Config/State
Yixiao Chen39828a62016-09-14 14:37:06 -0400325 Te.TeBuilder teBuilder = DefaultTe.builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500326 Config.ConfigBuilder configBuilder = DefaultConfig.builder();
327 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(networkKeyId);
328 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
329 nt.teTopologyId().clientId(),
330 Long.valueOf(nt.teTopologyId().topologyId()));
Aihua Guo0a6998c2017-02-08 18:14:18 -0500331 switch (teTopologyService.teTopology(teTopoKey).optimization()) {
332 case LEAST_COST:
333 configBuilder = configBuilder.optimizationCriterion(Cost.class);
334 break;
335 case SHORTEST_DELAY:
336 configBuilder = configBuilder.optimizationCriterion(Delay.class);
337 break;
338 case NOT_OPTIMIZED:
339 configBuilder = configBuilder.optimizationCriterion(NotOptimized.class);
340 break;
341 default:
342 configBuilder = configBuilder.optimizationCriterion(TeOptimizationCriterion.class);
343 break;
344 }
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500345
346 teBuilder = teBuilder.config(configBuilder.build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400347
348 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
349 .builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500350 nwAugment.clientId(new TeGlobalId(teTopologyId.clientId()));
351 nwAugment.providerId(new TeGlobalId(teTopologyId.providerId()));
352 if (teTopologyId.topologyId() != null) {
353 nwAugment.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
354 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400355 nwAugment.te(teBuilder.build());
356 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500357 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400358 return builder;
359 }
360
361 /**
362 * Network object conversion from TE Topology subsystem to YANG.
363 *
364 * @param teSubsystem TE Topology subsystem network object
Hesam Rahimi41208102016-12-09 17:54:03 -0500365 * @param operation operation type
366 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400367 * @return Network YANG object
368 */
369 public static Network teSubsystem2YangNetwork(
370 org.onosproject.tetopology.management.api.Network teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500371 OperationType operation,
372 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400373 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
374 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
375
376 // Generate a network builder with the specific networkId.
377 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
378 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500379 .yangNetworkOpType(
380 toNetworksOperationType(operation))
381 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400382
383 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500384 if (teSubsystem.supportingNetworkIds() != null) {
385 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400386 }
387
388 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500389 if (teSubsystem.nodes() != null) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500390 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(teSubsystem.networkId());
391 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
392 nt.teTopologyId().clientId(),
393 Long.valueOf(nt.teTopologyId().topologyId()));
394 builder = te2YangNodes(builder, teSubsystem.nodes(),
395 teTopologyService,
396 teTopoKey);
Yixiao Chen39828a62016-09-14 14:37:06 -0400397 }
398
399 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500400 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400401
402 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500403 if (teSubsystem.links() != null) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500404 builder = te2YangLinks(builder, teSubsystem.links(), teTopologyService);
Yixiao Chen39828a62016-09-14 14:37:06 -0400405 }
406
407 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500408 if (teSubsystem.teTopologyId() != null) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500409 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId(),
410 teTopologyService,
411 teSubsystem.networkId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400412 }
413
414 return builder.build();
415 }
416
417 /**
418 * Network State object conversion from TE Topology subsystem to YANG.
419 *
420 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500421 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400422 * @return Network YANG object
423 */
424 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500425 .rev20151208.ietfnetwork.networksstate.Network
426 teSubsystem2YangNetworkState(
427 org.onosproject.tetopology.management.api.Network teSubsystem,
428 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400429 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
430 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
431
432 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
433 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500434 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
435 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400436
437 if (teSubsystem.networkId() != null) {
438 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
439 }
440 stateBuilder.serverProvided(teSubsystem.isServerProvided());
441
442 // Operation type may be required.
443 return stateBuilder.build();
444 }
445
446
447 /**
448 * Network conversion from YANG to TE Topology subsystem.
449 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500450 * @param yangNetwork Network YANG object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500451 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500452 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400453 * @return TE Topology subsystem defaultNetwork object
454 */
455 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500456 Network yangNetwork,
457 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
458 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
459 Network yangNetworkState,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500460 Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400461 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
462 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
463 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500464
465 KeyId networkKeyId = KeyId.keyId(networkId);
466 List<KeyId> supportingNetworkIds = null;
467 Map<KeyId, NetworkNode> teNodes = null;
468 Map<KeyId, NetworkLink> teLinks = null;
469 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
470 boolean serverProvided = false;
Yixiao Chen39828a62016-09-14 14:37:06 -0400471
472 // Supporting networks
473 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500474 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400475 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
476 supportingNetworkIds.add(
477 KeyId.keyId(supportNw.networkRef().uri().string()));
478 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400479 }
480
481 // Nodes
482 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500483 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400484 for (Node node : yangNetwork.node()) {
485 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500486 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500487 NodeConverter.yang2TeSubsystemNode(node, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400488 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400489 }
490
491 // Links
492 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
493 AugmentedNdNetwork augmentLink =
494 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500495 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400496 for (Link link : augmentLink.link()) {
497 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500498 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500499 LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400500 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400501 }
502
503 // TE Topology Ids
504 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
505 AugmentedNwNetwork augmentTeIds =
506 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500507 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400508 new org.onosproject.tetopology.management.api.TeTopologyId(
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500509 augmentTeIds.providerId().uint32(),
510 augmentTeIds.clientId().uint32(),
511 augmentTeIds.teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400512 }
513
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500514 if (yangNetworkState != null) {
515 serverProvided = yangNetworkState.serverProvided();
516 }
517
518 org.onosproject.tetopology.management.api.DefaultNetwork network =
519 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
520 teNodes, teLinks, teTopologyId,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500521 serverProvided, deviceId);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500522 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400523 }
524
525 /**
526 * Network object conversion from YANG to TE Topology subsystem.
527 *
528 * @param yangNetwork Network YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500529 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500530 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400531 * @return network TE Topology subsystem networks object
532 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500533 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500534 Networks yangNetworks,
535 DeviceId deviceId) {
536 return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400537 }
538
539 /**
540 * Network and State object conversion from YANG to TE Topology subsystem.
541 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500542 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400543 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500544 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500545 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400546 * @return teSubsystem TE Topology subsystem networks object
547 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500548 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
549 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500550 .networksstate.Network yangNetworkState, Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400551 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
552 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500553
554 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500555 yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks, deviceId);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500556
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400557 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400558 checkState(teNetwork.networkId().toString().equals(networkref),
559 E_DIFF_YANG_NETWORKID);
560
Yixiao Chen39828a62016-09-14 14:37:06 -0400561 return teNetwork;
562 }
Henry Yua4e34f82016-11-06 18:30:59 -0500563
564 /**
565 * Converts a TE Topology event from the data format used in core to its
566 * corresponding YANG Object (YO) format.
567 *
568 * @param event TE Topology event from the core
Aihua Guo0a6998c2017-02-08 18:14:18 -0500569 * @param teTopologyService TE Topology Service object
Henry Yua4e34f82016-11-06 18:30:59 -0500570 * @return YANG Object converted from event
571 */
Aihua Guo0a6998c2017-02-08 18:14:18 -0500572 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event,
573 TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500574 IetfTeTopologyEvent yangEvent = null;
575 IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
576
577 IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
578 if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500579 NetworkLinkEventSubject eventData = (NetworkLinkEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500580 TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500581 TeLinkEvent yangLinkEvent = LinkConverter
Aihua Guo0a6998c2017-02-08 18:14:18 -0500582 .teNetworkLink2yangTeLinkEvent(linkEventType, eventData, teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500583 eventSubject.teLinkEvent(yangLinkEvent);
584 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
585 } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500586 NetworkNodeEventSubject eventData = (NetworkNodeEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500587 TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
588 TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
589 eventSubject.teNodeEvent(yangNodeEvent);
590 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
591 }
592
593 return yangEvent;
594 }
595
596 private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
597 IetfTeTopologyEvent.Type returnType = null;
598
599 switch (type) {
600 case LINK_ADDED:
601 case LINK_REMOVED:
602 case LINK_UPDATED:
603 returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
604 break;
605 case NODE_ADDED:
606 case NODE_REMOVED:
607 case NODE_UPDATED:
608 returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
609 break;
610 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500611 log.warn("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500612 }
613
614 return returnType;
615 }
616
617 private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
618 TeTopologyEventTypeEnum returnType = null;
619
620 switch (type) {
621 case LINK_ADDED:
622 case NODE_ADDED:
623 returnType = TeTopologyEventTypeEnum.ADD;
624 break;
625 case LINK_REMOVED:
626 case NODE_REMOVED:
627 returnType = TeTopologyEventTypeEnum.REMOVE;
628 break;
629 case LINK_UPDATED:
630 case NODE_UPDATED:
631 returnType = TeTopologyEventTypeEnum.UPDATE;
632 break;
633 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500634 log.warn("teTopoEventType2YangteTopoEventType: unsupported type: {}", type);
Hesam Rahimi41208102016-12-09 17:54:03 -0500635 break;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500636 }
637
638 return returnType;
Henry Yua4e34f82016-11-06 18:30:59 -0500639 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400640}
641
642