blob: 88691101d8f5650eed67899f5bd9594ab50129a1 [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 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
Hesam Rahimi41208102016-12-09 17:54:03 -0500733 TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
734 teLinkFound.source().sourceNode());
735 long tenIdLong = -1;
736 if (teSupportNodeId != null) {
737 tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
738 }
739 long teSupportLinkTpId = findTeTpId(teNetworkFound,
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500740 teLinkFound.source().sourceNode(),
741 teLinkFound.source().sourceTp());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500742
Hesam Rahimi41208102016-12-09 17:54:03 -0500743 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
744 if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
745 AugmentedNwNetwork augmentTeIds =
746 (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
747 teTopologyId =
748 new org.onosproject.tetopology.management.api.TeTopologyId(
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500749 augmentTeIds.clientId().uint32(),
750 augmentTeIds.providerId().uint32(),
751 augmentTeIds.teTopologyId().string());
Hesam Rahimi41208102016-12-09 17:54:03 -0500752 }
753
754 supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
755 teTopologyId.clientId(),
756 Long.valueOf(teTopologyId
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500757 .topologyId()),
Hesam Rahimi41208102016-12-09 17:54:03 -0500758 tenIdLong, teSupportLinkTpId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500759 }
760
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500761 return supportTeLinkId;
762 }
763
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500764 /**
765 * Finds TeNodeId from a yangNetwork and yangNodeId.
766 *
767 * @param yangNetwork YANG network object
768 * @param yangNodeId YANG node Id
769 * @return teNodeId teNodeId
770 */
771 public static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500772 TeNodeId teNodeId = null;
773 for (Node node : yangNetwork.node()) {
774 if (node.nodeId().equals(yangNodeId)) {
775 if (node.yangAugmentedInfoMap() != null
776 && !node.yangAugmentedInfoMap().isEmpty()) {
777 AugmentedNwNode yangNodeAugment = (AugmentedNwNode) node
778 .yangAugmentedInfo(AugmentedNwNode.class);
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500779 if (yangNodeAugment != null
780 && yangNodeAugment.teNodeId() != null) {
781 teNodeId = yangNodeAugment.teNodeId();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500782 }
783 }
784 }
785 }
786 return teNodeId;
787 }
788
789 private static long findTeTpId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
790 long teTpId = 0;
791 for (Node node : yangNetwork.node()) {
792 if (node.nodeId().equals(yangNodeId)) {
793 if (node.yangAugmentedInfoMap() != null
794 && !node.yangAugmentedInfoMap().isEmpty()) {
795
796 AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) node
797 .yangAugmentedInfo(AugmentedNdNode.class);
798 if (yangTpNodeAugment.terminationPoint() != null) {
799 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
800 .rev20151208.ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint
801 yangTpnode : yangTpNodeAugment.terminationPoint()) {
802 if (yangTpnode.tpId().equals(yangTpId)) {
803 if (yangTpnode.yangAugmentedInfoMap() != null
804 && !yangTpnode.yangAugmentedInfoMap()
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500805 .isEmpty()) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500806 AugmentedNtTerminationPoint yangTpAugment =
807 (AugmentedNtTerminationPoint) yangTpnode
808 .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500809 if (yangTpAugment.teTpId() != null) {
810 teTpId = Long.valueOf(yangTpAugment.teTpId().toString());
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500811 }
812 }
813 }
814 }
815 }
816 }
817 }
818 }
819 return teTpId;
820 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400821 /**
822 * Link object conversion from YANG to TE Topology subsystem.
823 *
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500824 * @param yangLink YANG link
825 * @param yangNetwork YANG network
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500826 * @param yangNetworks YANG networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500827 * @return TE subsystem link
Yixiao Chen39828a62016-09-14 14:37:06 -0400828 */
829 public static org.onosproject.tetopology.management.api.link.NetworkLink
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500830 yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
831 Networks yangNetworks) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500832 NetworkId networkId = yangNetwork.networkId();
833 checkNotNull(yangLink, E_NULL_YANG_TELINK);
Yixiao Chen39828a62016-09-14 14:37:06 -0400834
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500835 KeyId linkId = KeyId.keyId(yangLink.linkId().uri().toString());
836 NodeTpKey sourceNodeTpKey = null;
837 NodeTpKey destinationNodeTpKey = null;
838 List<NetworkLinkKey> spLinkIds = null;
839 TeLink te = null;
Yixiao Chen39828a62016-09-14 14:37:06 -0400840
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500841 if (yangLink.supportingLink() != null) {
842 spLinkIds = Lists.newArrayList();
843 for (SupportingLink yangSpLink : yangLink.supportingLink()) {
844 NetworkLinkKey linkKey = new NetworkLinkKey(KeyId.keyId(yangSpLink.networkRef().uri().toString()),
845 KeyId.keyId(yangSpLink.linkRef().uri().toString()));
846 spLinkIds.add(linkKey);
847 }
848 }
849
850 if (yangLink.source() != null) {
851 TerminationPointKey source = new TerminationPointKey(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500852 KeyId.keyId(networkId.uri().toString()),
853 KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
854 KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500855 sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
856 }
857
858 if (yangLink.destination() != null) {
859 TerminationPointKey destination = new TerminationPointKey(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500860 KeyId.keyId(networkId.uri().toString()),
861 KeyId.keyId(yangLink.destination().destNode().uri().toString()),
862 KeyId.keyId(yangLink.destination().destTp().uri().toString()));
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500863 destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
864 }
865
866 if (yangLink.yangAugmentedInfoMap() != null && !yangLink.yangAugmentedInfoMap().isEmpty()) {
867
868 AugmentedNtLink yangLinkAugment =
869 (AugmentedNtLink) yangLink.yangAugmentedInfo(AugmentedNtLink.class);
870 if (yangLinkAugment != null &&
871 yangLinkAugment.te() != null &&
872 yangLinkAugment.te().config() != null) {
873 TeLinkAttributes yangLinkAtrr =
874 yangLinkAugment.te().config().teLinkAttributes();
875 if (yangLinkAtrr != null && yangLinkAtrr.linkIndex() != null) {
876 te = yang2TeLinkAttributes(yangLinkAtrr,
877 yangLinkAugment.te().state(),
878 yangLink, yangNetwork,
879 yangNetworks);
880 }
881 }
882 }
883
884 org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
885 new DefaultNetworkLink(linkId,
886 sourceNodeTpKey,
887 destinationNodeTpKey,
888 spLinkIds,
889 te);
890 return link;
Yixiao Chen39828a62016-09-14 14:37:06 -0400891 }
892
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500893 private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500894 yang2TeSubsystemUnderlayPrimaryPath(PrimaryPath yangpath,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500895 long teNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500896 org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500897
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500898 List<PathElement> pathElementList = Lists.newArrayList();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500899 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
900 .telinkunderlayattributes.primarypath.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500901 PathElement pathElementYang : yangpath.pathElement()) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500902
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500903 long nodeId = 0;
904 ElementType type = null;
905 // TODO: check more types
906 if (pathElementYang.type() instanceof UnnumberedLink) {
907 nodeId = Long.valueOf(((UnnumberedLink) pathElementYang.type()).routerId().toString());
908 type = new TeLinkId(((UnnumberedLink) pathElementYang.type()).interfaceId());
909 }
910 PathElement tePathElement = new PathElement(pathElementYang.pathElementId(),
911 nodeId,
912 type,
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500913 false); // FIXME: how to find the proper value for loose?
914 pathElementList.add(tePathElement);
915 }
916
917 teUnderlayPrimaryPath = new org.onosproject.tetopology.management.api.link.
918 UnderlayPrimaryPath(pathElementList, false); // FIXME: how to find the proper value for loose?
919
920 return teUnderlayPrimaryPath;
921 }
922
923 private static List<UnderlayBackupPath>
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500924 yang2TeSubsystemUnderlayBackupPaths(
925 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500926 rev20170110.ietftetopology.telinkunderlayattributes.
927 BackupPath> yangpaths,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500928 long teNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500929
930 List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500931 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500932 .ietftetopology.telinkunderlayattributes.
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500933 BackupPath yangConfig : yangpaths) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500934 UnderlayBackupPath ubp = null;
935 List<PathElement> backupPathElementList = Lists.newArrayList();
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500936 long nodeId = 0;
937 ElementType type = null;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500938 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
939 .telinkunderlayattributes.backuppath.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500940 PathElement backupYang : yangConfig.pathElement()) {
941 // TODO: check more types
942 if (backupYang.type() instanceof UnnumberedLink) {
943 nodeId = Long.valueOf(((UnnumberedLink) backupYang.type()).routerId().toString());
944 type = new TeLinkId(((UnnumberedLink) backupYang.type()).interfaceId());
945 }
946 PathElement tePathElementBackup = new PathElement(backupYang.pathElementId(),
947 nodeId,
948 type,
949 false);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500950 backupPathElementList.add(tePathElementBackup);
951 }
952 ubp = new UnderlayBackupPath(yangConfig.index(),
953 backupPathElementList,
954 null); // FIXME: find the proper value for loose
955 underlayBackupPathsList.add(ubp);
956 }
957
958 return underlayBackupPathsList;
959 }
960
961 /**
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500962 * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
963 *
964 * @param yangLinkAtrr YANG link Config YANG object
965 * @return teSubsystem TE underlay path object
966 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500967 private static org.onosproject.tetopology.management.api.link.UnderlayPath
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500968 yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500969
970 checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
971
972 org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath underlayPrimaryPath = null;
973 List<UnderlayBackupPath> underlayBackupPathsList = null;
974 TeTunnelId teTunnelId = new TeTunnelId(srcTeNodeId, dstTeNodeId, 0); // FIXME: how to find teTunnelId?
975
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500976 if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().primaryPath() != null) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500977 underlayPrimaryPath =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500978 yang2TeSubsystemUnderlayPrimaryPath(yangLinkAtrr.underlay().primaryPath(), srcTeNodeId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500979 }
980
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500981 if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().backupPath() != null) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500982 underlayBackupPathsList =
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500983 yang2TeSubsystemUnderlayBackupPaths(yangLinkAtrr.underlay().backupPath(), srcTeNodeId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500984 }
985
Hesam Rahimi41208102016-12-09 17:54:03 -0500986 org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay = null;
987 if (yangLinkAtrr.underlay() != null) {
988 teUnderlay = new org.onosproject.tetopology.management.api.link.
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500989 UnderlayPath(underlayPrimaryPath,
990 underlayBackupPathsList,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500991 TunnelProtectionType.of(yangLinkAtrr.underlay().protectionType()),
992 (Long) yangLinkAtrr.underlay().tunnelSrc().tunnelTpRef(), // null safe?
993 (Long) yangLinkAtrr.underlay().tunnelDes().tunnelTpRef(), // null safe?
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500994 teTunnelId);
Hesam Rahimi41208102016-12-09 17:54:03 -0500995 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500996
997 return teUnderlay;
998 }
999
1000 /**
1001 * Converts a TE Topology link event from the data format used in
1002 * the core to its corresponding YANG Object (YO) format.
1003 *
1004 * @param eventType Link event type
1005 * @param linkData TE Topology link event data
Aihua Guo0a6998c2017-02-08 18:14:18 -05001006 * @param teTopologyService TE Topology Service object
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001007 * @return YANG Object converted from linkData
1008 */
1009 public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
Aihua Guo0a6998c2017-02-08 18:14:18 -05001010 NetworkLinkEventSubject linkData,
1011 TeTopologyService teTopologyService) {
Donghee Yoonfb50d092017-04-10 15:20:59 +09001012 checkNotNull(linkData);
Henry Yu8ac364b2016-12-15 18:24:20 -05001013 TeLinkEvent.TeLinkEventBuilder teLinkEventBuilder = new DefaultTeLinkEvent.TeLinkEventBuilder();
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001014
1015 TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
Henry Yu8ac364b2016-12-15 18:24:20 -05001016 teLinkEventBuilder.eventType(yangEventType);
1017 NetworkId networkId = NetworkId.fromString(linkData.key().networkId().toString());
1018 teLinkEventBuilder.networkRef(networkId);
Hesam Rahimi41208102016-12-09 17:54:03 -05001019 LinkId linkId = LinkId.fromString(linkData.key().linkId().toString());
Henry Yu8ac364b2016-12-15 18:24:20 -05001020 teLinkEventBuilder.linkRef(linkId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001021
Henry Yu8ac364b2016-12-15 18:24:20 -05001022 if (linkData != null && linkData.networkLink() != null) {
1023 NetworkLink link = linkData.networkLink();
Aihua Guo0a6998c2017-02-08 18:14:18 -05001024 State yangTeLinkState = teLink2YangState(link.teLink(), teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001025
Henry Yu8ac364b2016-12-15 18:24:20 -05001026 teLinkEventBuilder.operStatus(yangTeLinkState.operStatus());
1027 teLinkEventBuilder.informationSource(yangTeLinkState.informationSource());
1028 teLinkEventBuilder.informationSourceEntry(yangTeLinkState.informationSourceEntry());
1029 teLinkEventBuilder.informationSourceState(yangTeLinkState.informationSourceState());
1030 teLinkEventBuilder.isTransitional(yangTeLinkState.isTransitional());
1031 teLinkEventBuilder.recovery(yangTeLinkState.recovery());
1032 teLinkEventBuilder.teLinkAttributes(yangTeLinkState.teLinkAttributes());
1033 teLinkEventBuilder.underlay(yangTeLinkState.underlay());
1034 }
1035
1036 return teLinkEventBuilder.build();
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001037 }
1038
Henry Yu05dcc212017-01-05 16:05:26 -05001039 /**
1040 * Retrieves the TE network link key from a given YANG network link
1041 * notification event.
1042 *
1043 * @param yangLinkEvent YANG network link notification
1044 * @return TE network link key
1045 */
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001046 public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
Hesam Rahimi41208102016-12-09 17:54:03 -05001047 NetworkId networkRef = NetworkId.fromString(yangLinkEvent.networkRef().toString());
1048 LinkId linkRef = LinkId.fromString(yangLinkEvent.linkRef().toString());
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001049 KeyId networkId = KeyId.keyId(networkRef.uri().toString());
1050 KeyId linkId = KeyId.keyId(linkRef.uri().toString());
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001051
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001052 NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
1053
1054 return networkLinkKey;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001055
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001056 }
1057
Henry Yu05dcc212017-01-05 16:05:26 -05001058 /**
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001059 * Converts a YANG network link notification event into a TE network link.
Henry Yu05dcc212017-01-05 16:05:26 -05001060 *
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001061 * @param yangLinkEvent YANG network link notification
Henry Yu05dcc212017-01-05 16:05:26 -05001062 * @param teTopologyService TE Topology service used to help the conversion
1063 * @return TE network link
1064 */
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001065 public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
1066 TeTopologyService teTopologyService) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001067
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001068 KeyId linkId = yangLinkEvent2NetworkLinkKey(yangLinkEvent).linkId();
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001069
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001070 org.onosproject.tetopology.management.api.
1071 Network network = teTopologyService.network(
1072 yangLinkEvent2NetworkLinkKey(yangLinkEvent).networkId());
1073 if (network == null) {
1074 return null;
1075 }
1076
1077 NetworkLink networkLink = network.link(linkId);
1078 if (networkLink == null) {
1079 return null;
1080 }
1081
1082 NodeTpKey sourceTp = networkLink.source();
Henry Yu8ac364b2016-12-15 18:24:20 -05001083 if (sourceTp == null) {
1084 return null;
1085 }
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001086 NodeTpKey destTp = networkLink.destination();
1087
1088 List<NetworkLinkKey> supportingLinkIds = networkLink.supportingLinkIds();
1089 TeLink teLink = networkLink.teLink();
1090 if (teLink == null) {
1091 return null;
1092 }
1093
1094 TeOperStatus opState = yangLinkEvent.operStatus();
1095 org.onosproject.tetopology.management.api.
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001096 TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001097
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001098 TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent,
1099 teLink, opStatus, teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001100
1101
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001102 NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001103 updatedTeLink);
1104
1105 return updatedNetworkLink;
1106 }
1107
Yixiao Chen265b3bb2017-01-13 10:17:03 -05001108 private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001109 opStatus, TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001110
1111 TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
1112
1113 TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
1114
Henry Yu8ac364b2016-12-15 18:24:20 -05001115 long teNodeIdDest = 0;
1116 long teNodeIdSrc = 0;
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001117
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001118 TeLinkTpGlobalKey supportTeLinkId = oldTeLink.supportingTeLinkId();
1119 TeLinkTpKey peerTeLinkKey = oldTeLink.peerTeLinkKey();
1120
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001121 TeTopologyKey underlayTopologyId = null;
Aihua Guo0a6998c2017-02-08 18:14:18 -05001122 KeyId networkRef = null;
1123 if (yangTeLinkAttrs.underlay() != null &&
1124 yangTeLinkAttrs.underlay().primaryPath() != null &&
1125 yangTeLinkAttrs.underlay().primaryPath().networkRef() != null) {
1126 networkRef = (KeyId) yangTeLinkAttrs.underlay().primaryPath().networkRef();
1127 }
1128
1129 if (networkRef != null && teTopologyService.network(networkRef) != null
1130 && teTopologyService.network(networkRef).teTopologyId() != null) {
1131 long clientId = teTopologyService.network(networkRef).teTopologyId().clientId();
1132 long providerId = teTopologyService.network(networkRef).teTopologyId().providerId();
1133 long topologyId = Long.valueOf(teTopologyService.network(networkRef).teTopologyId().topologyId());
1134 underlayTopologyId = new TeTopologyKey(providerId, clientId, topologyId);
1135 }
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001136
Henry Yu8ac364b2016-12-15 18:24:20 -05001137 TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeIdSrc, teNodeIdDest,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -05001138 teLinkKey,
1139 peerTeLinkKey,
1140 supportTeLinkId,
1141 underlayTopologyId);
Hesam Rahimi39bdc002016-11-10 15:01:26 -05001142
1143 return updatedTeLink;
Henry Yu4b4a7eb2016-11-09 20:07:53 -05001144 }
Yixiao Chen39828a62016-09-14 14:37:06 -04001145}