blob: 31ebaa33b1ff1a6b6c58c5bf47eb3f68b7fce226 [file] [log] [blame]
Yixiao Chen39828a62016-09-14 14:37:06 -04001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016 Open Networking Foundation
Yixiao Chen39828a62016-09-14 14:37:06 -04003 *
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 org.onosproject.tetopology.management.api.TeConstants.MAX_PRIORITY;
20
Yixiao Chen265b3bb2017-01-13 10:17:03 -050021import java.math.BigInteger;
22import java.util.BitSet;
23import java.util.List;
24
Hesam Rahimi39bdc002016-11-10 15:01:26 -050025import org.onlab.packet.Ip4Address;
26import org.onosproject.tetopology.management.api.KeyId;
27import org.onosproject.tetopology.management.api.TeStatus;
28import org.onosproject.tetopology.management.api.TeTopologyKey;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050029import org.onosproject.tetopology.management.api.TeTopologyService;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050030import org.onosproject.tetopology.management.api.link.CommonLinkData;
31import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
32import org.onosproject.tetopology.management.api.link.DefaultTeLink;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050033import org.onosproject.tetopology.management.api.link.ElementType;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050034import org.onosproject.tetopology.management.api.link.ExternalLink;
35import org.onosproject.tetopology.management.api.link.LinkBandwidth;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050036import org.onosproject.tetopology.management.api.link.NetworkLink;
Hesam Rahimi41208102016-12-09 17:54:03 -050037import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040038import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050039import org.onosproject.tetopology.management.api.link.PathElement;
40import org.onosproject.tetopology.management.api.link.TeLink;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050041import org.onosproject.tetopology.management.api.link.TeLinkId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050042import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
43import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
44import org.onosproject.tetopology.management.api.link.TePathAttributes;
45import org.onosproject.tetopology.management.api.link.TeTunnelId;
46import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
47import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
48import org.onosproject.tetopology.management.api.link.UnderlayPath;
49import org.onosproject.tetopology.management.api.node.NodeTpKey;
50import org.onosproject.tetopology.management.api.node.TeNode;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050051import org.onosproject.tetopology.management.api.node.TerminationPointKey;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050052import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.IpAddress;
Yixiao Chen39828a62016-09-14 14:37:06 -040053import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050054import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
55import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050057import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network.Node;
58import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
59 .ietfnetworktopology.LinkId;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
61 .ietfnetworktopology.TpId;
62import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
63import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
64 .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
65import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
66 .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
67import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
68 .ietfnetworktopology.networks.network.augmentedndnetwork.Link;
69import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
70 .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultDestination;
71import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
72 .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
73import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
74 .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSupportingLink;
75import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
76 .ietfnetworktopology.networks.network.augmentedndnetwork.link.Destination
77 .DestinationBuilder;
78import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
79 .ietfnetworktopology.networks.network.augmentedndnetwork.link.Source.SourceBuilder;
80import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
81 .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink;
82import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
83 .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
84 .SupportingLinkBuilder;
85import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.node.AugmentedNdNode;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050086import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.DefaultTeLinkEvent;
87import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeBandwidth;
88import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeLinkEvent;
89import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourceperlinkattributes.DefaultInformationSourceState;
90import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourceperlinkattributes.InformationSourceState;
91import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourceperlinkattributes.informationsourcestate.DefaultTopology;
92import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourceperlinkattributes.informationsourcestate.Topology;
93import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks.network.AugmentedNwNetwork;
94import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
Yixiao Chen265b3bb2017-01-13 10:17:03 -050095 .ietftetopology.networks.network.link.AugmentedNtLink;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050096import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
Yixiao Chen265b3bb2017-01-13 10:17:03 -050097 .ietftetopology.networks.network.link.DefaultAugmentedNtLink;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050098import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
Yixiao Chen265b3bb2017-01-13 10:17:03 -050099 .ietftetopology.networks.network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500100import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks.network.node.AugmentedNwNode;
101import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
102import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.DefaultTe;
103import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
104import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.Config;
105import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.DefaultConfig;
106import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
107import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.DefaultState;
108import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
109import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkaugment.te.State;
110import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
111import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
112import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.TeLinkAttributes;
113import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
114import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
115import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay;
116import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
117import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconfigattributes.telinkattributes.ExternalDomain;
118import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
119import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
120import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
121import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
122import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.TeSrlgs;
123import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
124import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
125import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.DefaultBackupPath;
126import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.DefaultBackupPath.BackupPathBuilder;
127import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.DefaultPrimaryPath;
128import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.DefaultPrimaryPath.PrimaryPathBuilder;
129import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.PrimaryPath;
130import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.primarypath.DefaultPathElement;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500131import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
132import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
133import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500134import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500135import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500136import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
137import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink.UnnumberedLinkBuilder;
138import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
139import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500140
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500141import com.google.common.collect.Lists;
Yixiao Chen39828a62016-09-14 14:37:06 -0400142
143/**
144 * The conversion functions.
145 */
146public final class LinkConverter {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500147 private static final String E_NULL_TELINK_UNDERLAY_PATH =
148 "TeSubsystem link underlayPath object cannot be null";
149 private static final String E_NULL_TELINK_DATA =
150 "TeSubsystem teLinkAttrBuilder data cannot be null";
151 private static final String E_NULL_TELINK =
152 "TeSubsystem teLink object cannot be null";
153 private static final String E_NULL_YANG_TELINK_CONFIG =
154 "YANG telink config object cannot be null";
155 private static final String E_NULL_YANG_TELINK =
156 "YANG Link object cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400157
158 // no instantiation
159 private LinkConverter() {
160 }
161
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500162 private static LinkProtectionTypeEnum teSubsystem2YangLinkProtectionType(TunnelProtectionType linkProtectionType) {
163 switch (linkProtectionType) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500164 case ENHANCED:
165 return LinkProtectionTypeEnum.ENHANCED;
166 case EXTRA_TRAFFIC:
167 return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
168 case SHARED:
169 return LinkProtectionTypeEnum.SHARED;
170 case UNPROTECTED:
171 return LinkProtectionTypeEnum.UNPROTECTED;
172 case ONE_FOR_ONE:
173 return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
174 case ONE_PLUS_ONE:
175 return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
176 default:
177 return null;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500178 }
179 }
180 /**
181 * TE Link Config object conversion from TE Topology subsystem to YANG.
182 *
183 * @param teLink TE link object
184 * @return TE Link Config YANG object
185 */
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500186 private static Config teLink2YangConfig(TeLink teLink, TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500187 checkNotNull(teLink, E_NULL_TELINK_DATA);
Yixiao Chen39828a62016-09-14 14:37:06 -0400188
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500189 TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
190
191 if (teLink.teLinkKey() != null) {
192 // what is link index? for now I used teLinkTpId
193 attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
194 }
195
196 if (teLink.adminStatus() != null) {
197 attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
198 }
199
200 if (teLink.tunnelProtectionType() != null) {
201 attrBuilder = attrBuilder
202 .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500203 .tunnelProtectionType()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500204 }
205
206 attrBuilder = attrBuilder.teDefaultMetric(teLink.cost());
207
208 if (teLink.srlgs() != null) {
209 TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
210 for (Long srlgLongVal : teLink.srlgs()) {
211 teSrlgsBuilder = teSrlgsBuilder.addToValue(new Srlg(srlgLongVal));
212 }
213 attrBuilder = attrBuilder.teSrlgs(teSrlgsBuilder.build());
214 }
215 attrBuilder = attrBuilder.isAbstract(teLink.flags().get(TeNode.BIT_ABSTRACT));
216
217 if (teLink.externalLink() != null) {
218 ExternalDomainBuilder edBuilder =
219 DefaultExternalDomain.builder();
220 if (teLink.externalLink().plugId() != null) {
221 edBuilder.plugId(teLink.externalLink().plugId());
222 }
223 if (teLink.externalLink().externalLinkKey() != null) {
224 edBuilder = edBuilder
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500225 .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500226 .externalLink()
227 .externalLinkKey()
228 .teLinkTpId())))
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500229 .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500230 .externalLink()
231 .externalLinkKey()
232 .teNodeId())));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500233 }
234 attrBuilder = attrBuilder.externalDomain(edBuilder.build());
235 }
236
237 if (teLink.availBandwidth() != null) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500238 for (short i = 0; i < teLink.availBandwidth().length; i++) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500239 UnreservedBandwidthBuilder urBuilder =
240 DefaultUnreservedBandwidth.builder()
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500241 .bandwidth(TeBandwidth.fromString(String
242 .valueOf(teLink.availBandwidth()[i])))
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500243 .priority(i);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500244 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
245 }
246 }
247
248 if (teLink.maxBandwidth() != null) {
249 // maxBandwidth is an array of float[], but in yang is just a big decimal
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500250 attrBuilder = attrBuilder.maxLinkBandwidth(TeBandwidth
251 .fromString(String.valueOf(teLink.maxBandwidth()[0])));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500252 }
253 // FIXME: how to retrieve maxResvLinkBandwidth from teLink
254// if (teLink.maxResvLinkBandwidth() != null) {
255// attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
256// }
257
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500258 if (teLink.primaryPath() != null || teLink.backupPaths() != null) {
259 UnderlayBuilder builder = DefaultUnderlay.builder();
260 if (teLink.primaryPath() != null) {
261 // TODO: what is underlayProtectionType in tePath?
262 // builder =
263 // builder.underlayProtectionType(tePath.protectionType());
264 builder = te2YangConfigUnderlayPrimaryPath(builder, teLink,
265 teTopologyService);
266 }
267
268 if (teLink.backupPaths() != null) {
269 builder = te2YangConfigUnderlayBackupPaths(builder, teLink,
270 teTopologyService);
271 }
272
273 attrBuilder = attrBuilder.underlay(builder.build());
274 }
275
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500276
277 ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500278 .teLinkAttributes(attrBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500279 return yangConfigBuilder.build();
280 }
281
282 /**
283 * TE Link State object conversion from TE Topology subsystem to YANG.
284 *
285 * @param teLink TE link object
Aihua Guo0a6998c2017-02-08 18:14:18 -0500286 * @param teTopologyService TE Topology Service object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500287 * @return TE Link State YANG object
288 */
Aihua Guo0a6998c2017-02-08 18:14:18 -0500289 private static State teLink2YangState(TeLink teLink, TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500290 TeLinkAttributes
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500291 .TeLinkAttributesBuilder attrBuilder =
292 DefaultTeLinkAttributes
293 .builder()
294 .teDefaultMetric(teLink.cost())
295 .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500296 if (teLink.teLinkKey() != null) {
297 // what is link index? for now I used teLinkTpId
298 attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
299 }
300
301 if (teLink.adminStatus() != null) {
302 attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
303 }
304 if (teLink.tunnelProtectionType() != null) {
305 attrBuilder = attrBuilder
306 .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500307 .tunnelProtectionType()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500308 }
Hesam Rahimi41208102016-12-09 17:54:03 -0500309 if (teLink.maxBandwidth() != null) {
310 // maxBandwidth is an array of float[], but in yang is just a big decimal
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500311 attrBuilder = attrBuilder.maxLinkBandwidth(TeBandwidth
312 .fromString(String.valueOf(teLink.maxBandwidth()[0])));
Hesam Rahimi41208102016-12-09 17:54:03 -0500313 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500314// if (teLink.maxResvLinkBandwidth() != null) {
315// attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
316// }
317 if (teLink.srlgs() != null) {
318 TeSrlgs.TeSrlgsBuilder srlgsBuilder = DefaultTeSrlgs.builder();
319 for (Long srlgLongVal : teLink.srlgs()) {
320 srlgsBuilder = srlgsBuilder.addToValue(new Srlg(srlgLongVal));
321 }
322 attrBuilder = attrBuilder.teSrlgs(srlgsBuilder.build());
323 }
324
325 if (teLink.externalLink() != null) {
326 ExternalDomain.ExternalDomainBuilder edBuilder = DefaultExternalDomain
327 .builder();
328 if (teLink.externalLink().plugId() != null) {
329 edBuilder = edBuilder.plugId(teLink.externalLink().plugId());
330 }
331 if (teLink.externalLink().externalLinkKey() != null) {
332 edBuilder = edBuilder
333 .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500334 .externalLink()
335 .externalLinkKey()
336 .teLinkTpId())))
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500337 .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500338 .externalLink()
339 .externalLinkKey()
340 .teNodeId())));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500341 }
342 attrBuilder = attrBuilder.externalDomain(edBuilder.build());
343
344 }
345
346 if (teLink.availBandwidth() != null) {
347 short i = 0;
348 for (float f : teLink.availBandwidth()) {
349 UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder = DefaultUnreservedBandwidth
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500350 .builder()
351 .bandwidth(TeBandwidth.fromString(String.valueOf(f)))
352 .priority(i);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500353 i++;
354 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
355 }
356 }
357
358 StateBuilder yangStateBuilder = DefaultState.builder()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500359 .teLinkAttributes(attrBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500360 if (teLink.opStatus() != null) {
361 yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500362 .teSubsystem2YangOperStatus(teLink.opStatus()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500363 }
364
365 if (teLink.sourceTeLinkId() != null) {
366 InformationSourceState.InformationSourceStateBuilder issBuilder = DefaultInformationSourceState.builder();
367
368 Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
Aihua Guo0a6998c2017-02-08 18:14:18 -0500369 topologyBuilder = topologyBuilder
370 .linkRef(teTopologyService.linkKey(teLink.sourceTeLinkId())
371 .linkId())
372 .networkRef(teTopologyService
373 .linkKey(teLink.sourceTeLinkId()).networkId());
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500374
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500375 issBuilder = issBuilder.topology(topologyBuilder.build());
376 yangStateBuilder.informationSourceState(issBuilder.build());
377 }
378
379 // Once stateDerived underlay is available in yang and core TE Topology
380 // object model, set the value properly
381 // stateDerivedUnderlay = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500382 // .rev20170110.ietftetopology.telinkstatederived.Underlay
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500383 //yangStateBuilder = yangStateBuilder.underlay(stateDerivedUnderlay);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500384
385 return yangStateBuilder.build();
386 }
387
388 /**
389 * Link object conversion from TE Topology subsystem to YANG.
390 *
391 * @param teSubsNetworkLink TE subsystem link object
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500392 * @param teTopologyService TE Topology Service object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500393 * @return YANG link object
394 */
395 public static Link teSubsystem2YangLink(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500396 org.onosproject.tetopology.management.api.link.NetworkLink teSubsNetworkLink,
397 TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500398 checkNotNull(teSubsNetworkLink, E_NULL_TELINK);
399
400 LinkId linkId = LinkId.fromString(teSubsNetworkLink.linkId().toString());
401 LinkBuilder builder = DefaultLink.builder().linkId(linkId);
402 if (teSubsNetworkLink.supportingLinkIds() != null) {
403 List<SupportingLink> slinks = Lists.newArrayList();
404 SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
405 for (NetworkLinkKey linkKey : teSubsNetworkLink.supportingLinkIds()) {
406 slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500407 linkKey.networkId().toString()))
408 .linkRef(LinkId.fromString(
409 linkKey.linkId().toString()))
410 .build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500411 }
412 builder = builder.supportingLink(slinks);
413 }
414 if (teSubsNetworkLink.source() != null) {
415 SourceBuilder sourceBuilder = DefaultSource
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500416 .builder()
417 .sourceNode(NodeId.fromString(
418 teSubsNetworkLink.source().nodeId().toString()))
419 .sourceTp(TpId.fromString(
420 teSubsNetworkLink.source().tpId().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500421 builder = builder.source(sourceBuilder.build());
422 }
423 if (teSubsNetworkLink.destination() != null) {
424 DestinationBuilder destBuilder = DefaultDestination
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500425 .builder()
426 .destNode(NodeId.fromString(
427 teSubsNetworkLink.destination().nodeId().toString()))
428 .destTp(TpId.fromString(
429 teSubsNetworkLink.destination().tpId().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500430 builder = builder.destination(destBuilder.build());
431 }
432
433 if (teSubsNetworkLink.teLink() != null) {
434 TeLink teData = teSubsNetworkLink.teLink();
435 TeBuilder yangTeBuilder = DefaultTe.builder()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500436 .config(teLink2YangConfig(teData, teTopologyService))
Aihua Guo0a6998c2017-02-08 18:14:18 -0500437 .state(teLink2YangState(teData, teTopologyService));
438
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500439 AugmentedNtLinkBuilder linkAugmentBuilder =
440 DefaultAugmentedNtLink.builder()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500441 .te(yangTeBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500442 builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
443 }
444
445 return builder.build();
446 }
447
448 private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
449 UnderlayBuilder yangBuilder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500450 TeLink teLink, TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500451
452 org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
453
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500454 PrimaryPathBuilder pathBuilder = DefaultPrimaryPath.builder();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500455 if (tePath.pathElements() != null) {
456 for (PathElement pathElementTe : tePath.pathElements()) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500457 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
458 .ietftetopology.telinkunderlayattributes.primarypath.PathElement
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500459 .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500460
461 pathElementYangBuilder = pathElementYangBuilder.pathElementId(pathElementTe.pathElementId());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500462 //TODO: check more types here
463 if (pathElementTe.type() instanceof TeLinkId) {
464 UnnumberedLinkBuilder unmBuilder = DefaultUnnumberedLink.builder()
465 .routerId(IpAddress.fromString(
466 Ip4Address.valueOf((int) pathElementTe.teNodeId()).toString()))
467 .interfaceId(((TeLinkId) pathElementTe.type()).value());
468 pathElementYangBuilder = pathElementYangBuilder.type(unmBuilder.build());
469 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500470
471 pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
472 }
473 }
474
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500475 pathBuilder = pathBuilder.networkRef(teTopologyService
476 .networkId(teLink.underlayTeTopologyId()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500477
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500478 return yangBuilder.primaryPath(pathBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500479 }
480
481 private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(UnderlayBuilder yangBuilder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500482 TeLink teLink,
483 TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500484 List<UnderlayBackupPath> tePaths = teLink.backupPaths();
485
486 for (UnderlayBackupPath tePath : tePaths) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500487 BackupPathBuilder pathBuilder = DefaultBackupPath
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500488 .builder();
489 pathBuilder = pathBuilder.index(tePath.index());
Hesam Rahimi41208102016-12-09 17:54:03 -0500490
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500491 pathBuilder = pathBuilder.networkRef(teTopologyService
492 .networkId(teLink.underlayTeTopologyId()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500493
494 for (PathElement backupPathElementTe : tePath.pathElements()) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500495 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
496 .ietftetopology.telinkunderlayattributes.backuppath.PathElement
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500497 .PathElementBuilder elementBuilder =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500498 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
499 .ietftetopology.telinkunderlayattributes.backuppath.DefaultPathElement
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500500 .builder();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500501
502 elementBuilder = elementBuilder.pathElementId(backupPathElementTe.pathElementId());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500503 //TODO: check more types here
504 if (backupPathElementTe.type() instanceof TeLinkId) {
505 UnnumberedLinkBuilder unmBuilder = DefaultUnnumberedLink.builder()
506 .routerId(IpAddress.fromString(
507 Ip4Address.valueOf((int) backupPathElementTe.teNodeId()).toString()))
508 .interfaceId(((TeLinkId) backupPathElementTe.type()).value());
509 elementBuilder = elementBuilder.type(unmBuilder.build());
510 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500511
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500512 pathBuilder = pathBuilder.addToPathElement(elementBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500513 }
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500514 yangBuilder = yangBuilder.addToBackupPath(pathBuilder.build());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500515 }
516
517 return yangBuilder;
518 }
519
520 private static TeLink yang2TeLinkAttributes(TeLinkAttributes yangLinkAttr,
521 State opState, Link yangLink,
522 Network yangNetwork,
523 Networks yangNetworks) {
524 TeNodeId teNodeId = findTeNodeId(yangNetwork,
Hesam Rahimi41208102016-12-09 17:54:03 -0500525 yangLink.source().sourceNode());
526 long teNodeIdLong = -1;
527 if (teNodeId != null && teNodeId.dottedQuad() != null) {
528 teNodeIdLong = Ip4Address.valueOf(teNodeId.dottedQuad().string())
529 .toInt();
530 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500531
532 TeLinkTpKey teLinkKey = new TeLinkTpKey(teNodeIdLong,
533 findTeTpId(yangNetwork,
534 yangLink.source().sourceNode(),
535 yangLink.source().sourceTp()));
536
Hesam Rahimi41208102016-12-09 17:54:03 -0500537 TeNodeId teNodeIdDest = null;
538 if (yangLink.destination() != null) {
539 teNodeIdDest = findTeNodeId(yangNetwork,
540 yangLink.destination().destNode());
541 }
542 long teNodeIdDestLong = -1;
543 if (teNodeIdDest != null && teNodeIdDest.dottedQuad() != null) {
544 teNodeIdDestLong = Ip4Address.valueOf(teNodeIdDest.dottedQuad().string()).toInt();
545 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500546
Hesam Rahimi41208102016-12-09 17:54:03 -0500547 TeLinkTpKey peerTeLinkKey = null;
548 if (yangLink.destination() != null) {
549 peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500550 findTeTpId(yangNetwork,
551 yangLink.destination().destNode(),
552 yangLink.destination().destTp()));
Hesam Rahimi41208102016-12-09 17:54:03 -0500553 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500554
555 TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
556
557 org.onosproject.tetopology.management.api.TeStatus opStatus = null;
558 if (opState != null && opState.operStatus() != null) {
559 opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState.operStatus());
560 }
561
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500562 TeTopologyKey underlayTopologyId = null;
563 if (yangLinkAttr != null && yangLinkAttr.underlay() != null && yangLinkAttr.underlay().primaryPath() != null) {
564 underlayTopologyId = findTopologyId(yangNetworks, yangLinkAttr.underlay().primaryPath().networkRef());
565 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500566
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500567 TeLink teLink = yangLinkAttr2TeLinkAttributes(yangLinkAttr, opStatus,
568 teNodeIdLong,
569 teNodeIdDestLong,
570 teLinkKey,
571 peerTeLinkKey,
572 supportTeLinkId,
573 underlayTopologyId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500574
575 return teLink;
576 }
577
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500578 /**
579 * Finds the TE TopologyKey from yangNetworks and a networkRef.
580 *
581 * @param yangNetworks YANG networks object
582 * @param networkRef YANG network reference
583 * @return TeTopologyKey the TE TopologyKey
584 */
585 public static TeTopologyKey findTopologyId(Networks yangNetworks, Object networkRef) {
Aihua Guo0a6998c2017-02-08 18:14:18 -0500586 if (networkRef == null) {
587 return null;
588 }
589 NetworkId networkId = NetworkId.fromString((String) networkRef);
590
591 TeTopologyKey topologyId = null;
592 Network targetTeNetwork = null;
593 if (yangNetworks.network() != null
594 && !yangNetworks.network().isEmpty() && networkId != null) {
595 for (Network ynetItem : yangNetworks.network()) {
596 if (ynetItem.networkId() != null) {
597 if (ynetItem.networkId().equals(networkId)) {
598 targetTeNetwork = ynetItem;
599 break;
600 }
601 }
602 }
603 }
604 if (targetTeNetwork != null && targetTeNetwork
605 .yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
606 AugmentedNwNetwork augmentTeIds = (AugmentedNwNetwork) targetTeNetwork
607 .yangAugmentedInfo(AugmentedNwNetwork.class);
608 topologyId = new TeTopologyKey(augmentTeIds.providerId().uint32(),
609 augmentTeIds.clientId().uint32(),
610 Long.valueOf(augmentTeIds.teTopologyId().string()));
611 }
612 return topologyId;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500613 }
614
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500615 private static TeLink yangLinkAttr2TeLinkAttributes(TeLinkAttributes yangLinkAtrr,
616 org.onosproject.tetopology.management.api.TeStatus opStatus,
617 long teNodeIdLong,
618 long teNodeIdDestLong,
619 TeLinkTpKey teLinkKey,
620 TeLinkTpKey peerTeLinkKey,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500621 TeLinkTpGlobalKey supportTeLinkId,
622 TeTopologyKey underlayTopologyId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500623 org.onosproject.tetopology.management.api.TeStatus adminStatus = null;
624
625 TeLinkTpGlobalKey sourceTeLinkId = null; // from yang to core, we can ignore sourceTeLinkId
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500626
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500627 CommonLinkData teData = null;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500628
629 if (yangLinkAtrr.adminStatus() != null) {
630 adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangLinkAtrr.adminStatus());
631 }
632
633 BitSet flags = new BitSet();
634 if (yangLinkAtrr.isAbstract()) {
635 flags.set(TeLink.BIT_ABSTRACT);
636 }
637
Hesam Rahimi41208102016-12-09 17:54:03 -0500638 ExternalLink externalLink = null;
639 if (yangLinkAtrr != null && yangLinkAtrr.externalDomain() != null) {
640 externalLink = new ExternalLink(null, yangLinkAtrr.externalDomain().plugId());
641 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500642
643 UnderlayPath underlayPath = null;
644 underlayPath = yang2TeSubsystemUnderlayPath(yangLinkAtrr, teNodeIdLong,
645 teNodeIdDestLong);
Hesam Rahimi41208102016-12-09 17:54:03 -0500646 Long adminGroup = null;
647 if (yangLinkAtrr != null && yangLinkAtrr.administrativeGroup() != null) {
648 adminGroup = Long.valueOf(yangLinkAtrr.administrativeGroup().toString());
649 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500650 List<Long> interLayerLocks = null; // FIXME: how to find interLayerLocks?
651
652 List<UnreservedBandwidth> listOfUnreservedBandwidth = yangLinkAtrr.unreservedBandwidth();
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500653 float[] availBandwidth = new float[MAX_PRIORITY + 1];
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500654 for (UnreservedBandwidth urbw : listOfUnreservedBandwidth) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500655 availBandwidth[urbw.priority()] = Float.valueOf(urbw.bandwidth().string());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500656 }
657
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500658 float[] maxBandwidth = new float[MAX_PRIORITY + 1];
Hesam Rahimi41208102016-12-09 17:54:03 -0500659 if (yangLinkAtrr.maxLinkBandwidth() != null) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500660 // Core TE has an array, but YANG is an integer
661 for (short p = 0; p <= MAX_PRIORITY; p++) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500662 maxBandwidth[p] = Float.valueOf(yangLinkAtrr.maxLinkBandwidth().string());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500663 }
Hesam Rahimi41208102016-12-09 17:54:03 -0500664 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500665
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500666 float[] maxAvailLspBandwidth = availBandwidth; // FIXME: how to find this?
667 float[] minAvailLspBandwidth = availBandwidth; // FIXME: how to find this?
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500668 LinkBandwidth bandwidth = new LinkBandwidth(
669 maxBandwidth,
670 availBandwidth,
671 maxAvailLspBandwidth,
672 minAvailLspBandwidth,
673 null); // FIXME: how to find odu resource?
674 List<Long> srlgs = Lists.newArrayList();
Hesam Rahimi41208102016-12-09 17:54:03 -0500675 if (yangLinkAtrr.teSrlgs() != null
676 && yangLinkAtrr.teSrlgs().value() != null
677 && !yangLinkAtrr.teSrlgs().value().isEmpty()) {
678 for (Srlg srlg : yangLinkAtrr.teSrlgs().value()) {
679 srlgs.add(srlg.uint32());
680 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500681 }
682 TePathAttributes teAttributes =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500683 new TePathAttributes(yangLinkAtrr.teDefaultMetric(), yangLinkAtrr.teDelayMetric(),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500684 srlgs);
685 teData = new CommonLinkData(adminStatus,
686 opStatus,
687 flags,
688 null, // switchingLayer
689 null, // encodingLayer
690 externalLink,
691 underlayPath,
692 teAttributes,
693 adminGroup,
694 interLayerLocks,
695 bandwidth);
696
697 TeLink te = new DefaultTeLink(teLinkKey, peerTeLinkKey,
698 underlayTopologyId, supportTeLinkId,
699 sourceTeLinkId, teData);
700 return te;
701 }
702
703 private static TeLinkTpGlobalKey findSupportTeLinkId(Networks yangNetworks,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500704 Link yangLink) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500705 Network teNetworkFound = null;
706 LinkId teLinkIdFound = null;
Hesam Rahimi41208102016-12-09 17:54:03 -0500707 TeLinkTpGlobalKey supportTeLinkId = null;
708
709 if (yangLink != null && yangLink.supportingLink() != null && !yangLink.supportingLink().isEmpty()) {
710 if (yangNetworks.network() != null && !yangNetworks.network().isEmpty()) {
711 for (Network ynetItem : yangNetworks.network()) {
712 if (ynetItem.networkId() != null) {
713 if (ynetItem.networkId().equals(yangLink.supportingLink().get(0).networkRef())) {
714 teNetworkFound = ynetItem;
715 teLinkIdFound = yangLink.supportingLink().get(0).linkRef();
716 break;
717 }
718 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500719 }
720 }
Hesam Rahimi41208102016-12-09 17:54:03 -0500721 Link teLinkFound = null;
722 if (teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
723 AugmentedNdNetwork augmentLink =
724 (AugmentedNdNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class);
725 for (Link link : augmentLink.link()) {
726 if (link.linkId().equals(teLinkIdFound)) {
727 teLinkFound = link;
728 break;
729 }
730 }
731 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500732
rohitsharanf553ac42017-04-13 17:39:25 +0530733 if (teLinkFound != null) {
734 TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
Hesam Rahimi41208102016-12-09 17:54:03 -0500735 teLinkFound.source().sourceNode());
rohitsharanf553ac42017-04-13 17:39:25 +0530736 long tenIdLong = -1;
737 if (teSupportNodeId != null) {
738 tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
739 }
740 long teSupportLinkTpId = findTeTpId(teNetworkFound,
741 teLinkFound.source().sourceNode(),
742 teLinkFound.source().sourceTp());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500743
rohitsharanf553ac42017-04-13 17:39:25 +0530744 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
745 if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
746 AugmentedNwNetwork augmentTeIds =
747 (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
748 teTopologyId =
749 new org.onosproject.tetopology.management.api.TeTopologyId(
750 augmentTeIds.clientId().uint32(),
751 augmentTeIds.providerId().uint32(),
752 augmentTeIds.teTopologyId().string());
753 }
Hesam Rahimi41208102016-12-09 17:54:03 -0500754
rohitsharanf553ac42017-04-13 17:39:25 +0530755 supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
756 teTopologyId.clientId(),
757 Long.valueOf(teTopologyId
758 .topologyId()),
759 tenIdLong, teSupportLinkTpId);
760 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500761 }
762
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500763 return supportTeLinkId;
764 }
765
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500766 /**
767 * Finds TeNodeId from a yangNetwork and yangNodeId.
768 *
769 * @param yangNetwork YANG network object
770 * @param yangNodeId YANG node Id
771 * @return teNodeId teNodeId
772 */
773 public static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500774 TeNodeId teNodeId = null;
775 for (Node node : yangNetwork.node()) {
776 if (node.nodeId().equals(yangNodeId)) {
777 if (node.yangAugmentedInfoMap() != null
778 && !node.yangAugmentedInfoMap().isEmpty()) {
779 AugmentedNwNode yangNodeAugment = (AugmentedNwNode) node
780 .yangAugmentedInfo(AugmentedNwNode.class);
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500781 if (yangNodeAugment != null
782 && yangNodeAugment.teNodeId() != null) {
783 teNodeId = yangNodeAugment.teNodeId();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500784 }
785 }
786 }
787 }
788 return teNodeId;
789 }
790
791 private static long findTeTpId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
792 long teTpId = 0;
793 for (Node node : yangNetwork.node()) {
794 if (node.nodeId().equals(yangNodeId)) {
795 if (node.yangAugmentedInfoMap() != null
796 && !node.yangAugmentedInfoMap().isEmpty()) {
797
798 AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) node
799 .yangAugmentedInfo(AugmentedNdNode.class);
800 if (yangTpNodeAugment.terminationPoint() != null) {
801 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
802 .rev20151208.ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint
803 yangTpnode : yangTpNodeAugment.terminationPoint()) {
804 if (yangTpnode.tpId().equals(yangTpId)) {
805 if (yangTpnode.yangAugmentedInfoMap() != null
806 && !yangTpnode.yangAugmentedInfoMap()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500807 .isEmpty()) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500808 AugmentedNtTerminationPoint yangTpAugment =
809 (AugmentedNtTerminationPoint) yangTpnode
810 .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500811 if (yangTpAugment.teTpId() != null) {
812 teTpId = Long.valueOf(yangTpAugment.teTpId().toString());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500813 }
814 }
815 }
816 }
817 }
818 }
819 }
820 }
821 return teTpId;
822 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400823 /**
824 * Link object conversion from YANG to TE Topology subsystem.
825 *
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500826 * @param yangLink YANG link
827 * @param yangNetwork YANG network
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500828 * @param yangNetworks YANG networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500829 * @return TE subsystem link
Yixiao Chen39828a62016-09-14 14:37:06 -0400830 */
831 public static org.onosproject.tetopology.management.api.link.NetworkLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500832 yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
833 Networks yangNetworks) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500834 NetworkId networkId = yangNetwork.networkId();
835 checkNotNull(yangLink, E_NULL_YANG_TELINK);
Yixiao Chen39828a62016-09-14 14:37:06 -0400836
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500837 KeyId linkId = KeyId.keyId(yangLink.linkId().uri().toString());
838 NodeTpKey sourceNodeTpKey = null;
839 NodeTpKey destinationNodeTpKey = null;
840 List<NetworkLinkKey> spLinkIds = null;
841 TeLink te = null;
Yixiao Chen39828a62016-09-14 14:37:06 -0400842
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500843 if (yangLink.supportingLink() != null) {
844 spLinkIds = Lists.newArrayList();
845 for (SupportingLink yangSpLink : yangLink.supportingLink()) {
846 NetworkLinkKey linkKey = new NetworkLinkKey(KeyId.keyId(yangSpLink.networkRef().uri().toString()),
847 KeyId.keyId(yangSpLink.linkRef().uri().toString()));
848 spLinkIds.add(linkKey);
849 }
850 }
851
852 if (yangLink.source() != null) {
853 TerminationPointKey source = new TerminationPointKey(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500854 KeyId.keyId(networkId.uri().toString()),
855 KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
856 KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500857 sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
858 }
859
860 if (yangLink.destination() != null) {
861 TerminationPointKey destination = new TerminationPointKey(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500862 KeyId.keyId(networkId.uri().toString()),
863 KeyId.keyId(yangLink.destination().destNode().uri().toString()),
864 KeyId.keyId(yangLink.destination().destTp().uri().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500865 destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
866 }
867
868 if (yangLink.yangAugmentedInfoMap() != null && !yangLink.yangAugmentedInfoMap().isEmpty()) {
869
870 AugmentedNtLink yangLinkAugment =
871 (AugmentedNtLink) yangLink.yangAugmentedInfo(AugmentedNtLink.class);
872 if (yangLinkAugment != null &&
873 yangLinkAugment.te() != null &&
874 yangLinkAugment.te().config() != null) {
875 TeLinkAttributes yangLinkAtrr =
876 yangLinkAugment.te().config().teLinkAttributes();
877 if (yangLinkAtrr != null && yangLinkAtrr.linkIndex() != null) {
878 te = yang2TeLinkAttributes(yangLinkAtrr,
879 yangLinkAugment.te().state(),
880 yangLink, yangNetwork,
881 yangNetworks);
882 }
883 }
884 }
885
886 org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
887 new DefaultNetworkLink(linkId,
888 sourceNodeTpKey,
889 destinationNodeTpKey,
890 spLinkIds,
891 te);
892 return link;
Yixiao Chen39828a62016-09-14 14:37:06 -0400893 }
894
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500895 private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500896 yang2TeSubsystemUnderlayPrimaryPath(PrimaryPath yangpath,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500897 long teNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500898 org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500899
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500900 List<PathElement> pathElementList = Lists.newArrayList();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500901 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
902 .telinkunderlayattributes.primarypath.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500903 PathElement pathElementYang : yangpath.pathElement()) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500904
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500905 long nodeId = 0;
906 ElementType type = null;
907 // TODO: check more types
908 if (pathElementYang.type() instanceof UnnumberedLink) {
909 nodeId = Long.valueOf(((UnnumberedLink) pathElementYang.type()).routerId().toString());
910 type = new TeLinkId(((UnnumberedLink) pathElementYang.type()).interfaceId());
911 }
912 PathElement tePathElement = new PathElement(pathElementYang.pathElementId(),
913 nodeId,
914 type,
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500915 false); // FIXME: how to find the proper value for loose?
916 pathElementList.add(tePathElement);
917 }
918
919 teUnderlayPrimaryPath = new org.onosproject.tetopology.management.api.link.
920 UnderlayPrimaryPath(pathElementList, false); // FIXME: how to find the proper value for loose?
921
922 return teUnderlayPrimaryPath;
923 }
924
925 private static List<UnderlayBackupPath>
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500926 yang2TeSubsystemUnderlayBackupPaths(
927 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500928 rev20170110.ietftetopology.telinkunderlayattributes.
929 BackupPath> yangpaths,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500930 long teNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500931
932 List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500933 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500934 .ietftetopology.telinkunderlayattributes.
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500935 BackupPath yangConfig : yangpaths) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500936 UnderlayBackupPath ubp = null;
937 List<PathElement> backupPathElementList = Lists.newArrayList();
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500938 long nodeId = 0;
939 ElementType type = null;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500940 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
941 .telinkunderlayattributes.backuppath.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500942 PathElement backupYang : yangConfig.pathElement()) {
943 // TODO: check more types
944 if (backupYang.type() instanceof UnnumberedLink) {
945 nodeId = Long.valueOf(((UnnumberedLink) backupYang.type()).routerId().toString());
946 type = new TeLinkId(((UnnumberedLink) backupYang.type()).interfaceId());
947 }
948 PathElement tePathElementBackup = new PathElement(backupYang.pathElementId(),
949 nodeId,
950 type,
951 false);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500952 backupPathElementList.add(tePathElementBackup);
953 }
954 ubp = new UnderlayBackupPath(yangConfig.index(),
955 backupPathElementList,
956 null); // FIXME: find the proper value for loose
957 underlayBackupPathsList.add(ubp);
958 }
959
960 return underlayBackupPathsList;
961 }
962
963 /**
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500964 * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
965 *
966 * @param yangLinkAtrr YANG link Config YANG object
967 * @return teSubsystem TE underlay path object
968 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500969 private static org.onosproject.tetopology.management.api.link.UnderlayPath
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500970 yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500971
972 checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
973
974 org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath underlayPrimaryPath = null;
975 List<UnderlayBackupPath> underlayBackupPathsList = null;
976 TeTunnelId teTunnelId = new TeTunnelId(srcTeNodeId, dstTeNodeId, 0); // FIXME: how to find teTunnelId?
977
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500978 if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().primaryPath() != null) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500979 underlayPrimaryPath =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500980 yang2TeSubsystemUnderlayPrimaryPath(yangLinkAtrr.underlay().primaryPath(), srcTeNodeId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500981 }
982
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500983 if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().backupPath() != null) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500984 underlayBackupPathsList =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500985 yang2TeSubsystemUnderlayBackupPaths(yangLinkAtrr.underlay().backupPath(), srcTeNodeId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500986 }
987
Hesam Rahimi41208102016-12-09 17:54:03 -0500988 org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay = null;
989 if (yangLinkAtrr.underlay() != null) {
990 teUnderlay = new org.onosproject.tetopology.management.api.link.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500991 UnderlayPath(underlayPrimaryPath,
992 underlayBackupPathsList,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500993 TunnelProtectionType.of(yangLinkAtrr.underlay().protectionType()),
994 (Long) yangLinkAtrr.underlay().tunnelSrc().tunnelTpRef(), // null safe?
995 (Long) yangLinkAtrr.underlay().tunnelDes().tunnelTpRef(), // null safe?
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500996 teTunnelId);
Hesam Rahimi41208102016-12-09 17:54:03 -0500997 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500998
999 return teUnderlay;
1000 }
1001
1002 /**
1003 * Converts a TE Topology link event from the data format used in
1004 * the core to its corresponding YANG Object (YO) format.
1005 *
1006 * @param eventType Link event type
1007 * @param linkData TE Topology link event data
Aihua Guo0a6998c2017-02-08 18:14:18 -05001008 * @param teTopologyService TE Topology Service object
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001009 * @return YANG Object converted from linkData
1010 */
1011 public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
Aihua Guo0a6998c2017-02-08 18:14:18 -05001012 NetworkLinkEventSubject linkData,
1013 TeTopologyService teTopologyService) {
Donghee Yoonfb50d092017-04-10 15:20:59 +09001014 checkNotNull(linkData);
Henry Yu8ac364b2016-12-15 18:24:20 -05001015 TeLinkEvent.TeLinkEventBuilder teLinkEventBuilder = new DefaultTeLinkEvent.TeLinkEventBuilder();
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001016
1017 TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
Henry Yu8ac364b2016-12-15 18:24:20 -05001018 teLinkEventBuilder.eventType(yangEventType);
1019 NetworkId networkId = NetworkId.fromString(linkData.key().networkId().toString());
1020 teLinkEventBuilder.networkRef(networkId);
Hesam Rahimi41208102016-12-09 17:54:03 -05001021 LinkId linkId = LinkId.fromString(linkData.key().linkId().toString());
Henry Yu8ac364b2016-12-15 18:24:20 -05001022 teLinkEventBuilder.linkRef(linkId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001023
Henry Yu8ac364b2016-12-15 18:24:20 -05001024 if (linkData != null && linkData.networkLink() != null) {
1025 NetworkLink link = linkData.networkLink();
Aihua Guo0a6998c2017-02-08 18:14:18 -05001026 State yangTeLinkState = teLink2YangState(link.teLink(), teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001027
Henry Yu8ac364b2016-12-15 18:24:20 -05001028 teLinkEventBuilder.operStatus(yangTeLinkState.operStatus());
1029 teLinkEventBuilder.informationSource(yangTeLinkState.informationSource());
1030 teLinkEventBuilder.informationSourceEntry(yangTeLinkState.informationSourceEntry());
1031 teLinkEventBuilder.informationSourceState(yangTeLinkState.informationSourceState());
1032 teLinkEventBuilder.isTransitional(yangTeLinkState.isTransitional());
1033 teLinkEventBuilder.recovery(yangTeLinkState.recovery());
1034 teLinkEventBuilder.teLinkAttributes(yangTeLinkState.teLinkAttributes());
1035 teLinkEventBuilder.underlay(yangTeLinkState.underlay());
1036 }
1037
1038 return teLinkEventBuilder.build();
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001039 }
1040
Henry Yu05dcc212017-01-05 16:05:26 -05001041 /**
1042 * Retrieves the TE network link key from a given YANG network link
1043 * notification event.
1044 *
1045 * @param yangLinkEvent YANG network link notification
1046 * @return TE network link key
1047 */
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001048 public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
Hesam Rahimi41208102016-12-09 17:54:03 -05001049 NetworkId networkRef = NetworkId.fromString(yangLinkEvent.networkRef().toString());
1050 LinkId linkRef = LinkId.fromString(yangLinkEvent.linkRef().toString());
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001051 KeyId networkId = KeyId.keyId(networkRef.uri().toString());
1052 KeyId linkId = KeyId.keyId(linkRef.uri().toString());
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001053
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001054 NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
1055
1056 return networkLinkKey;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001057
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001058 }
1059
Henry Yu05dcc212017-01-05 16:05:26 -05001060 /**
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001061 * Converts a YANG network link notification event into a TE network link.
Henry Yu05dcc212017-01-05 16:05:26 -05001062 *
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001063 * @param yangLinkEvent YANG network link notification
Henry Yu05dcc212017-01-05 16:05:26 -05001064 * @param teTopologyService TE Topology service used to help the conversion
1065 * @return TE network link
1066 */
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001067 public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
1068 TeTopologyService teTopologyService) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001069
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001070 KeyId linkId = yangLinkEvent2NetworkLinkKey(yangLinkEvent).linkId();
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001071
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001072 org.onosproject.tetopology.management.api.
1073 Network network = teTopologyService.network(
1074 yangLinkEvent2NetworkLinkKey(yangLinkEvent).networkId());
1075 if (network == null) {
1076 return null;
1077 }
1078
1079 NetworkLink networkLink = network.link(linkId);
1080 if (networkLink == null) {
1081 return null;
1082 }
1083
1084 NodeTpKey sourceTp = networkLink.source();
Henry Yu8ac364b2016-12-15 18:24:20 -05001085 if (sourceTp == null) {
1086 return null;
1087 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001088 NodeTpKey destTp = networkLink.destination();
1089
1090 List<NetworkLinkKey> supportingLinkIds = networkLink.supportingLinkIds();
1091 TeLink teLink = networkLink.teLink();
1092 if (teLink == null) {
1093 return null;
1094 }
1095
1096 TeOperStatus opState = yangLinkEvent.operStatus();
1097 org.onosproject.tetopology.management.api.
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001098 TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001099
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001100 TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent,
1101 teLink, opStatus, teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001102
1103
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001104 NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001105 updatedTeLink);
1106
1107 return updatedNetworkLink;
1108 }
1109
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001110 private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001111 opStatus, TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001112
1113 TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
1114
1115 TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
1116
Henry Yu8ac364b2016-12-15 18:24:20 -05001117 long teNodeIdDest = 0;
1118 long teNodeIdSrc = 0;
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001119
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001120 TeLinkTpGlobalKey supportTeLinkId = oldTeLink.supportingTeLinkId();
1121 TeLinkTpKey peerTeLinkKey = oldTeLink.peerTeLinkKey();
1122
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001123 TeTopologyKey underlayTopologyId = null;
Aihua Guo0a6998c2017-02-08 18:14:18 -05001124 KeyId networkRef = null;
1125 if (yangTeLinkAttrs.underlay() != null &&
1126 yangTeLinkAttrs.underlay().primaryPath() != null &&
1127 yangTeLinkAttrs.underlay().primaryPath().networkRef() != null) {
1128 networkRef = (KeyId) yangTeLinkAttrs.underlay().primaryPath().networkRef();
1129 }
1130
1131 if (networkRef != null && teTopologyService.network(networkRef) != null
1132 && teTopologyService.network(networkRef).teTopologyId() != null) {
1133 long clientId = teTopologyService.network(networkRef).teTopologyId().clientId();
1134 long providerId = teTopologyService.network(networkRef).teTopologyId().providerId();
1135 long topologyId = Long.valueOf(teTopologyService.network(networkRef).teTopologyId().topologyId());
1136 underlayTopologyId = new TeTopologyKey(providerId, clientId, topologyId);
1137 }
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001138
Henry Yu8ac364b2016-12-15 18:24:20 -05001139 TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeIdSrc, teNodeIdDest,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001140 teLinkKey,
1141 peerTeLinkKey,
1142 supportTeLinkId,
1143 underlayTopologyId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001144
1145 return updatedTeLink;
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001146 }
Yixiao Chen39828a62016-09-14 14:37:06 -04001147}