blob: 4d1c9d078855ec0bbde17c5c4d04b80e76ae4095 [file] [log] [blame]
janani b35f6cbc2017-03-24 21:56:58 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
janani b35f6cbc2017-03-24 21:56:58 +05303 *
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;
Vidyashree Rama04147ca2017-05-26 11:32:47 +053020import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.ietfinettypes.Ipv4Address;
21import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.ietfinettypes.Ipv4AddressNoZone;
22import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.ietfinettypes.Ipv6Address;
23import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.ietfinettypes.Ipv6AddressNoZone;
24import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.DefaultInterfaces;
25import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
26import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.interfaces.DefaultYangAutoPrefixInterface;
27import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.interfaces.YangAutoPrefixInterface;
28import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.AugmentedIfInterface;
29import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
30import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv4;
31import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv6;
32import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv4;
33import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv6;
34import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.Address;
35import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.DefaultAddress;
36import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.Subnet;
37import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.subnet.DefaultPrefixLength;
38import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.siteattachmentipconnection.IpConnection;
39import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.AugmentedIpIpv4;
40import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.DefaultAugmentedIpIpv4;
41import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.AugmentedIpIpv6;
42import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.DefaultAugmentedIpIpv6;
janani b35f6cbc2017-03-24 21:56:58 +053043import 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.
Vidyashree Rama04147ca2017-05-26 11:32:47 +053091 org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623
92 .ietfnetworkinstance.devices.device.interfaces
93 .yangautoprefixinterface.AugmentedIfInterface augIf = new org
94 .onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623
95 .ietfnetworkinstance.devices.device.interfaces
96 .yangautoprefixinterface.DefaultAugmentedIfInterface();
janani b35f6cbc2017-03-24 21:56:58 +053097 augIf.bindNetworkInstanceName(vpnName);
98
99 // Bind ip address to the interface as augmented info.
100 AugmentedIfInterface intAug = buildIpAddress(connect, vpnName);
101 YangAutoPrefixInterface inter = new DefaultYangAutoPrefixInterface();
102 inter.name(pName);
103 ((DefaultYangAutoPrefixInterface) inter).addAugmentation(
104 (InnerModelObject) augIf);
105 ((DefaultYangAutoPrefixInterface) inter).addAugmentation(
106 (InnerModelObject) intAug);
107
108 return inter;
109 }
110
111 /**
112 * Returns ipv6 address filled with attached VPN, ipv6 address and mask.
113 *
114 * @param vpnName VPN name
115 * @param mask mask
116 * @param ipv6Add ipv6 address
117 * @return device ipv6 address
118 */
119 private static Ipv6 getIpv6Aug(String vpnName, short mask, String ipv6Add) {
120 AugmentedIpIpv6 augIpv6 = new DefaultAugmentedIpIpv6();
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530121 org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device
122 .interfaces.yangautoprefixinterface.augmentedifinterface.ipv6
123 .Address add = new org.onosproject.yang.gen.v1.ietfip
janani b35f6cbc2017-03-24 21:56:58 +0530124 .rev20140616.ietfip.devices.device.interfaces
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530125 .yangautoprefixinterface.augmentedifinterface.ipv6
126 .DefaultAddress();
janani b35f6cbc2017-03-24 21:56:58 +0530127 Ipv6 ipv6 = new DefaultIpv6();
Vidyashree Rama04147ca2017-05-26 11:32:47 +0530128 List<org.onosproject.yang.gen.v1.ietfip
janani b35f6cbc2017-03-24 21:56:58 +0530129 .rev20140616.ietfip.devices.device.interfaces
130 .yangautoprefixinterface.augmentedifinterface.ipv6
131 .Address> addList = new LinkedList<>();
132 add.ip(Ipv6AddressNoZone.of(Ipv6Address.of(ipv6Add)));
133 augIpv6.bindNetworkInstanceName(vpnName);
134 add.prefixLength(mask);
135 addList.add(add);
136 ipv6.address(addList);
137 ((DefaultIpv6) ipv6).addAugmentation((DefaultAugmentedIpIpv6) augIpv6);
138 return ipv6;
139 }
140
141 /**
142 * Returns ipv4 address filled with attached VPN, ipv4 address and mask.
143 *
144 * @param vpnName VPN name
145 * @param mask mask
146 * @param ipv4Add ipv4 address
147 * @return device ipv4 address
148 */
149 private static Ipv4 getIpv4Aug(String vpnName, short mask, String ipv4Add) {
150 AugmentedIpIpv4 augIpv4 = new DefaultAugmentedIpIpv4();
151 Subnet net = new DefaultPrefixLength();
152 Address add = new DefaultAddress();
153 Ipv4 ipv4 = new DefaultIpv4();
154 List<Address> addList = new LinkedList<>();
155
156 augIpv4.bindNetworkInstanceName(vpnName);
157 ((DefaultPrefixLength) net).prefixLength(mask);
158 add.ip(Ipv4AddressNoZone.of(Ipv4Address.of(ipv4Add)));
159 add.subnet(net);
160 addList.add(add);
161 ipv4.address(addList);
162 ((DefaultIpv4) ipv4).addAugmentation((DefaultAugmentedIpIpv4) augIpv4);
163 return ipv4;
164 }
165
166 /**
167 * Builds ip address according to the existence of ip address in ip
168 * connection of device model.
169 *
170 * @param connect ip connection
171 * @param vpnName VPN name
172 * @return augmented interface
173 */
174 public static AugmentedIfInterface buildIpAddress(IpConnection connect,
175 String vpnName) {
176 if (connect == null || (connect.ipv4() == null
177 && connect.ipv6() == null)) {
178 throw new NetL3VpnException(IP_ADD_NULL);
179 }
180 AugmentedIfInterface intAug = new DefaultAugmentedIfInterface();
181 short mask;
182 if (connect.ipv4() != null) {
183 mask = connect.ipv4().addresses().mask();
184 Ipv4Address peIpv4 = connect.ipv4().addresses().providerAddress();
185 Ipv4 v4 = getIpv4Aug(vpnName, mask, peIpv4.string());
186 intAug.ipv4(v4);
187 }
188
189 if (connect.ipv6() != null) {
190 mask = connect.ipv6().addresses().mask();
191 Ipv6Address peIpv6 = connect.ipv6().addresses().providerAddress();
192 Ipv6 v6 = getIpv6Aug(vpnName, mask, peIpv6.string());
193 intAug.ipv6(v6);
194 }
195 return intAug;
196 }
197}