blob: f08785906828dc870d4240349204f19ee2e25790 [file] [log] [blame]
janani b35f6cbc2017-03-24 21:56:58 +05301/*
2 * Copyright 2017-present 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 */
16
17package org.onosproject.l3vpn.netl3vpn.impl;
18
19import org.onosproject.l3vpn.netl3vpn.NetL3VpnException;
20import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv4Address;
21import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv4AddressNoZone;
22import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv6Address;
23import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv6AddressNoZone;
24import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.DefaultInterfaces;
25import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
26import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.DefaultYangAutoPrefixInterface;
27import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.YangAutoPrefixInterface;
28import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.AugmentedIfInterface;
29import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
30import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv4;
31import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv6;
32import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv4;
33import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv6;
34import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.Address;
35import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.DefaultAddress;
36import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.Subnet;
37import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.subnet.DefaultPrefixLength;
38import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.ietfl3vpnsvc.siteattachmentipconnection.IpConnection;
39import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.AugmentedIpIpv4;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.DefaultAugmentedIpIpv4;
41import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.AugmentedIpIpv6;
42import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.DefaultAugmentedIpIpv6;
43import org.onosproject.yang.model.InnerModelObject;
44
45import java.util.LinkedList;
46import java.util.List;
47
48/**
49 * Representation of utility for interface creation and deletion.
50 */
51public final class IntConstructionUtil {
52
53 private static final String IP_ADD_NULL = "Vpn binding to an interface " +
54 "requires ip address.";
55
56 // No instantiation.
57 private IntConstructionUtil() {
58 }
59
60 /**
61 * Creates device model interface by building its parameters with port
62 * name, VPN name and ip connection.
63 *
64 * @param pName port name
65 * @param vpnName VPN name
66 * @param connect ip connection
67 * @return interface device model
68 */
69 public static Interfaces createInterface(String pName, String vpnName,
70 IpConnection connect) {
71 Interfaces interfaces = new DefaultInterfaces();
72 List<YangAutoPrefixInterface> intList = new LinkedList<>();
73 YangAutoPrefixInterface inter = buildInterface(vpnName, pName, connect);
74 intList.add(inter);
75 interfaces.yangAutoPrefixInterface(intList);
76 return interfaces;
77 }
78
79 /**
80 * Builds augmented info of ip address to the interface.
81 *
82 * @param vpnName VPN name
83 * @param pName port name
84 * @param connect ip connection
85 * @return interface
86 */
87 private static YangAutoPrefixInterface buildInterface(String vpnName,
88 String pName,
89 IpConnection connect) {
90 // Bind vpn name in the augmented info of interface.
91 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
92 .instance.rev20160623.ietfnetworkinstance.devices.device
93 .interfaces.yangautoprefixinterface.AugmentedIfInterface augIf =
94 new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
95 .ietf.network.instance.rev20160623.ietfnetworkinstance
96 .devices.device.interfaces.yangautoprefixinterface
97 .DefaultAugmentedIfInterface();
98 augIf.bindNetworkInstanceName(vpnName);
99
100 // Bind ip address to the interface as augmented info.
101 AugmentedIfInterface intAug = buildIpAddress(connect, vpnName);
102 YangAutoPrefixInterface inter = new DefaultYangAutoPrefixInterface();
103 inter.name(pName);
104 ((DefaultYangAutoPrefixInterface) inter).addAugmentation(
105 (InnerModelObject) augIf);
106 ((DefaultYangAutoPrefixInterface) inter).addAugmentation(
107 (InnerModelObject) intAug);
108
109 return inter;
110 }
111
112 /**
113 * Returns ipv6 address filled with attached VPN, ipv6 address and mask.
114 *
115 * @param vpnName VPN name
116 * @param mask mask
117 * @param ipv6Add ipv6 address
118 * @return device ipv6 address
119 */
120 private static Ipv6 getIpv6Aug(String vpnName, short mask, String ipv6Add) {
121 AugmentedIpIpv6 augIpv6 = new DefaultAugmentedIpIpv6();
122 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
123 .rev20140616.ietfip.devices.device.interfaces
124 .yangautoprefixinterface.augmentedifinterface.ipv6.Address add =
125 new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
126 .ip.rev20140616.ietfip.devices.device.interfaces
127 .yangautoprefixinterface.augmentedifinterface.ipv6
128 .DefaultAddress();
129 Ipv6 ipv6 = new DefaultIpv6();
130 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
131 .rev20140616.ietfip.devices.device.interfaces
132 .yangautoprefixinterface.augmentedifinterface.ipv6
133 .Address> addList = new LinkedList<>();
134 add.ip(Ipv6AddressNoZone.of(Ipv6Address.of(ipv6Add)));
135 augIpv6.bindNetworkInstanceName(vpnName);
136 add.prefixLength(mask);
137 addList.add(add);
138 ipv6.address(addList);
139 ((DefaultIpv6) ipv6).addAugmentation((DefaultAugmentedIpIpv6) augIpv6);
140 return ipv6;
141 }
142
143 /**
144 * Returns ipv4 address filled with attached VPN, ipv4 address and mask.
145 *
146 * @param vpnName VPN name
147 * @param mask mask
148 * @param ipv4Add ipv4 address
149 * @return device ipv4 address
150 */
151 private static Ipv4 getIpv4Aug(String vpnName, short mask, String ipv4Add) {
152 AugmentedIpIpv4 augIpv4 = new DefaultAugmentedIpIpv4();
153 Subnet net = new DefaultPrefixLength();
154 Address add = new DefaultAddress();
155 Ipv4 ipv4 = new DefaultIpv4();
156 List<Address> addList = new LinkedList<>();
157
158 augIpv4.bindNetworkInstanceName(vpnName);
159 ((DefaultPrefixLength) net).prefixLength(mask);
160 add.ip(Ipv4AddressNoZone.of(Ipv4Address.of(ipv4Add)));
161 add.subnet(net);
162 addList.add(add);
163 ipv4.address(addList);
164 ((DefaultIpv4) ipv4).addAugmentation((DefaultAugmentedIpIpv4) augIpv4);
165 return ipv4;
166 }
167
168 /**
169 * Builds ip address according to the existence of ip address in ip
170 * connection of device model.
171 *
172 * @param connect ip connection
173 * @param vpnName VPN name
174 * @return augmented interface
175 */
176 public static AugmentedIfInterface buildIpAddress(IpConnection connect,
177 String vpnName) {
178 if (connect == null || (connect.ipv4() == null
179 && connect.ipv6() == null)) {
180 throw new NetL3VpnException(IP_ADD_NULL);
181 }
182 AugmentedIfInterface intAug = new DefaultAugmentedIfInterface();
183 short mask;
184 if (connect.ipv4() != null) {
185 mask = connect.ipv4().addresses().mask();
186 Ipv4Address peIpv4 = connect.ipv4().addresses().providerAddress();
187 Ipv4 v4 = getIpv4Aug(vpnName, mask, peIpv4.string());
188 intAug.ipv4(v4);
189 }
190
191 if (connect.ipv6() != null) {
192 mask = connect.ipv6().addresses().mask();
193 Ipv6Address peIpv6 = connect.ipv6().addresses().providerAddress();
194 Ipv6 v6 = getIpv6Aug(vpnName, mask, peIpv6.string());
195 intAug.ipv6(v6);
196 }
197 return intAug;
198 }
199}