blob: 631cbc8b68d7ea44879598ebbfc67ee74114d92d [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;
89import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
90import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050091import 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 -040092import org.slf4j.Logger;
93import org.slf4j.LoggerFactory;
94
Yixiao Chen265b3bb2017-01-13 10:17:03 -050095import com.google.common.collect.Lists;
96import com.google.common.collect.Maps;
Yixiao Chen39828a62016-09-14 14:37:06 -040097
98
99/**
100 * Networks, Networks State conversion functions.
101 */
102public final class NetworkConverter {
103 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500104 E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400105 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500106 E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400107 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500108 E_NULL_TE_NETWORK = "TeSubsystem network 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_NETWORKID = "TeSubsystem networkId 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_YANG_NETWORKS = "YANG networks 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_YANG_NETWORK_LIST = "YANG network list 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_NETWORK = "YANG network 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_NETWORKID = "YANG networkId 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_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400121 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500122 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400123 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500124 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400125 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500126 E_NULL_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400127
128 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
129
130 // no instantiation
131 private NetworkConverter() {
132 }
133
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400134 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400135 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500136 case CREATE:
137 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400138
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500139 case DELETE:
140 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400141
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500142 case REMOVE:
143 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400144
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500145 case MERGE:
146 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400147
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500148 case REPLACE:
149 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400150
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500151 default:
152 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400153 }
154 }
155
156 /**
157 * Networks object conversion from TE Topology subsystem to YANG.
158 *
159 * @param teSubsystem TE Topology subsystem networks object
Hesam Rahimi41208102016-12-09 17:54:03 -0500160 * @param operation operation type
161 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400162 * @return Networks YANG object
163 */
164 public static Networks teSubsystem2YangNetworks(
165 org.onosproject.tetopology.management.api.Networks teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500166 OperationType operation,
167 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400168 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
169 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
170 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400171 DefaultNetworks.builder()
172 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400173 List<Network> networks = Lists.newArrayList();
174 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500175 networks.add(teSubsystem2YangNetwork(teNetwork, operation,
176 teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400177 }
178 builder.network(networks);
179 return builder.build();
180 }
181
Yixiao Chen39828a62016-09-14 14:37:06 -0400182 /**
183 * Network States object conversion from TE Topology subsystem to YANG.
184 *
185 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500186 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400187 * @return NetworkStates YANG object
188 */
189 public static NetworksState teSubsystem2YangNetworkStates(
190 org.onosproject.tetopology.management.api.Networks teSubsystem,
191 OperationType operation) {
192 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
193 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
194 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400195 DefaultNetworksState.builder()
196 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400197 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
198 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
199 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
200 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
201 }
202 builder.network(networks);
203 return builder.build();
204 }
205
206 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
207 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
208 NetworksState yangNetworkStates) {
209 checkNotNull(network, "YANG Network object cannot be null");
210 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
211 if (yangNetworkStates.network() == null) {
212 return null;
213 }
214
215 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
216 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
217 if (stateNetwork.networkRef().equals(network.networkId())) {
218 return stateNetwork;
219 }
220 }
221 return null;
222 }
223
224 /**
225 * Networks object conversion from YANG to TE Topology subsystem.
226 *
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500227 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400228 * @param yangNetworkStates NetworkStates YANG object
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500229 * @param deviceId the device Id
Yixiao Chen39828a62016-09-14 14:37:06 -0400230 * @return teSubsystem TE Topology subsystem networks object
231 */
232 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500233 Networks yangNetworks, NetworksState yangNetworkStates, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400234 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
235 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
236 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
237
Yixiao Chen39828a62016-09-14 14:37:06 -0400238 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
239 for (Network network : yangNetworks.network()) {
240 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
241 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500242 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400243 org.onosproject.tetopology.management.api.Network teNetwork;
244 if (stateNetwork == null) {
245 log.info("networkId {} can't be found in yangNetworkStates",
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500246 network.networkId());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500247 teNetwork = yang2TeSubsystemNetwork(network, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400248 } else {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500249 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400250 }
251 networks.add(teNetwork);
252 }
253
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500254 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
255 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400256 return defaultNetworks;
257 }
258
Yixiao Chen39828a62016-09-14 14:37:06 -0400259 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
260 List<KeyId> teSpptNetworkIds) {
261 List<SupportingNetwork> snws = Lists.newArrayList();
262 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
263 for (KeyId teSpNwKey : teSpptNetworkIds) {
264 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500265 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
266 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400267 }
268 return builder.supportingNetwork(snws);
269 }
270
271 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500272 Map<KeyId, NetworkNode> teNodes,
273 TeTopologyService teTopologyService,
274 TeTopologyKey teTopologyKey) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400275 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500276
277 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500278 nodeList.add(NodeConverter.teSubsystem2YangNode(node,
279 teTopologyService,
280 teTopologyKey));
Yixiao Chen39828a62016-09-14 14:37:06 -0400281 }
282 return builder.node(nodeList);
283 }
284
285 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500286 Map<KeyId, NetworkLink> teLinks,
287 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400288 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500289
290 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500291 linkList.add(LinkConverter.teSubsystem2YangLink(link, teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400292 }
293 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
294 ndAugment.link(linkList);
295 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
296 return builder;
297 }
298
299 private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500300 org.onosproject.tetopology.management.api.TeTopologyId
301 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400302 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
303 if (teTopologyId != null) {
304 // Set "te-topology" network type.
305 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
306 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
307 DefaultAugmentedNwNetworkTypes.builder();
308 teNwType.teTopology(teTopology.build());
309 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
310 }
311 return builder.networkTypes(nwType.build());
312 }
313
314 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500315 org.onosproject.tetopology.management.api
316 .TeTopologyId teTopologyId,
317 TeTopologyService teTopologyService,
318 KeyId networkKeyId) {
319
320 //teBuilder. //OPTIMIZATIONCRITERION for Config/State
Yixiao Chen39828a62016-09-14 14:37:06 -0400321 Te.TeBuilder teBuilder = DefaultTe.builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500322 Config.ConfigBuilder configBuilder = DefaultConfig.builder();
323 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(networkKeyId);
324 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
325 nt.teTopologyId().clientId(),
326 Long.valueOf(nt.teTopologyId().topologyId()));
327 // TODO: add code to set configBuilder.optimizationCriterion
328
329 teBuilder = teBuilder.config(configBuilder.build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400330
331 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
332 .builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500333 nwAugment.clientId(new TeGlobalId(teTopologyId.clientId()));
334 nwAugment.providerId(new TeGlobalId(teTopologyId.providerId()));
335 if (teTopologyId.topologyId() != null) {
336 nwAugment.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
337 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400338 nwAugment.te(teBuilder.build());
339 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500340 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400341 return builder;
342 }
343
344 /**
345 * Network object conversion from TE Topology subsystem to YANG.
346 *
347 * @param teSubsystem TE Topology subsystem network object
Hesam Rahimi41208102016-12-09 17:54:03 -0500348 * @param operation operation type
349 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400350 * @return Network YANG object
351 */
352 public static Network teSubsystem2YangNetwork(
353 org.onosproject.tetopology.management.api.Network teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500354 OperationType operation,
355 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400356 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
357 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
358
359 // Generate a network builder with the specific networkId.
360 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
361 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500362 .yangNetworkOpType(
363 toNetworksOperationType(operation))
364 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400365
366 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500367 if (teSubsystem.supportingNetworkIds() != null) {
368 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400369 }
370
371 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500372 if (teSubsystem.nodes() != null) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500373 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(teSubsystem.networkId());
374 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
375 nt.teTopologyId().clientId(),
376 Long.valueOf(nt.teTopologyId().topologyId()));
377 builder = te2YangNodes(builder, teSubsystem.nodes(),
378 teTopologyService,
379 teTopoKey);
Yixiao Chen39828a62016-09-14 14:37:06 -0400380 }
381
382 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500383 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400384
385 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500386 if (teSubsystem.links() != null) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500387 builder = te2YangLinks(builder, teSubsystem.links(), teTopologyService);
Yixiao Chen39828a62016-09-14 14:37:06 -0400388 }
389
390 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500391 if (teSubsystem.teTopologyId() != null) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500392 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId(),
393 teTopologyService,
394 teSubsystem.networkId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400395 }
396
397 return builder.build();
398 }
399
400 /**
401 * Network State object conversion from TE Topology subsystem to YANG.
402 *
403 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500404 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400405 * @return Network YANG object
406 */
407 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500408 .rev20151208.ietfnetwork.networksstate.Network
409 teSubsystem2YangNetworkState(
410 org.onosproject.tetopology.management.api.Network teSubsystem,
411 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400412 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
413 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
414
415 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
416 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500417 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
418 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400419
420 if (teSubsystem.networkId() != null) {
421 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
422 }
423 stateBuilder.serverProvided(teSubsystem.isServerProvided());
424
425 // Operation type may be required.
426 return stateBuilder.build();
427 }
428
429
430 /**
431 * Network conversion from YANG to TE Topology subsystem.
432 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500433 * @param yangNetwork Network YANG object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500434 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500435 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400436 * @return TE Topology subsystem defaultNetwork object
437 */
438 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500439 Network yangNetwork,
440 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
441 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
442 Network yangNetworkState,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500443 Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400444 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
445 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
446 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500447
448 KeyId networkKeyId = KeyId.keyId(networkId);
449 List<KeyId> supportingNetworkIds = null;
450 Map<KeyId, NetworkNode> teNodes = null;
451 Map<KeyId, NetworkLink> teLinks = null;
452 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
453 boolean serverProvided = false;
Yixiao Chen39828a62016-09-14 14:37:06 -0400454
455 // Supporting networks
456 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500457 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400458 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
459 supportingNetworkIds.add(
460 KeyId.keyId(supportNw.networkRef().uri().string()));
461 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400462 }
463
464 // Nodes
465 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500466 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400467 for (Node node : yangNetwork.node()) {
468 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500469 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500470 NodeConverter.yang2TeSubsystemNode(node, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400471 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400472 }
473
474 // Links
475 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
476 AugmentedNdNetwork augmentLink =
477 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500478 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400479 for (Link link : augmentLink.link()) {
480 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500481 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500482 LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400483 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400484 }
485
486 // TE Topology Ids
487 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
488 AugmentedNwNetwork augmentTeIds =
489 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500490 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400491 new org.onosproject.tetopology.management.api.TeTopologyId(
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500492 augmentTeIds.providerId().uint32(),
493 augmentTeIds.clientId().uint32(),
494 augmentTeIds.teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400495 }
496
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500497 if (yangNetworkState != null) {
498 serverProvided = yangNetworkState.serverProvided();
499 }
500
501 org.onosproject.tetopology.management.api.DefaultNetwork network =
502 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
503 teNodes, teLinks, teTopologyId,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500504 serverProvided, deviceId);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500505 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400506 }
507
508 /**
509 * Network object conversion from YANG to TE Topology subsystem.
510 *
511 * @param yangNetwork Network YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500512 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500513 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400514 * @return network TE Topology subsystem networks object
515 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500516 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500517 Networks yangNetworks,
518 DeviceId deviceId) {
519 return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400520 }
521
522 /**
523 * Network and State object conversion from YANG to TE Topology subsystem.
524 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500525 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400526 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500527 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500528 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400529 * @return teSubsystem TE Topology subsystem networks object
530 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500531 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
532 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500533 .networksstate.Network yangNetworkState, Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400534 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
535 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500536
537 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500538 yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks, deviceId);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500539
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400540 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400541 checkState(teNetwork.networkId().toString().equals(networkref),
542 E_DIFF_YANG_NETWORKID);
543
Yixiao Chen39828a62016-09-14 14:37:06 -0400544 return teNetwork;
545 }
Henry Yua4e34f82016-11-06 18:30:59 -0500546
547 /**
548 * Converts a TE Topology event from the data format used in core to its
549 * corresponding YANG Object (YO) format.
550 *
551 * @param event TE Topology event from the core
552 * @return YANG Object converted from event
553 */
554 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500555 IetfTeTopologyEvent yangEvent = null;
556 IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
557
558 IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
559 if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500560 NetworkLinkEventSubject eventData = (NetworkLinkEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500561 TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500562 TeLinkEvent yangLinkEvent = LinkConverter
563 .teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500564 eventSubject.teLinkEvent(yangLinkEvent);
565 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
566 } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500567 NetworkNodeEventSubject eventData = (NetworkNodeEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500568 TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
569 TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
570 eventSubject.teNodeEvent(yangNodeEvent);
571 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
572 }
573
574 return yangEvent;
575 }
576
577 private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
578 IetfTeTopologyEvent.Type returnType = null;
579
580 switch (type) {
581 case LINK_ADDED:
582 case LINK_REMOVED:
583 case LINK_UPDATED:
584 returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
585 break;
586 case NODE_ADDED:
587 case NODE_REMOVED:
588 case NODE_UPDATED:
589 returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
590 break;
591 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500592 log.warn("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500593 }
594
595 return returnType;
596 }
597
598 private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
599 TeTopologyEventTypeEnum returnType = null;
600
601 switch (type) {
602 case LINK_ADDED:
603 case NODE_ADDED:
604 returnType = TeTopologyEventTypeEnum.ADD;
605 break;
606 case LINK_REMOVED:
607 case NODE_REMOVED:
608 returnType = TeTopologyEventTypeEnum.REMOVE;
609 break;
610 case LINK_UPDATED:
611 case NODE_UPDATED:
612 returnType = TeTopologyEventTypeEnum.UPDATE;
613 break;
614 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500615 log.warn("teTopoEventType2YangteTopoEventType: unsupported type: {}", type);
Hesam Rahimi41208102016-12-09 17:54:03 -0500616 break;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500617 }
618
619 return returnType;
Henry Yua4e34f82016-11-06 18:30:59 -0500620 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400621}
622
623