blob: f08785906828dc870d4240349204f19ee2e25790 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.l3vpn.netl3vpn.impl;
import org.onosproject.l3vpn.netl3vpn.NetL3VpnException;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv4Address;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv4AddressNoZone;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv6Address;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.Ipv6AddressNoZone;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.DefaultInterfaces;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.DefaultYangAutoPrefixInterface;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.YangAutoPrefixInterface;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.AugmentedIfInterface;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv4;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.DefaultIpv6;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv4;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv6;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.Address;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.DefaultAddress;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.Subnet;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.subnet.DefaultPrefixLength;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.ietfl3vpnsvc.siteattachmentipconnection.IpConnection;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.AugmentedIpIpv4;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv4.DefaultAugmentedIpIpv4;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.AugmentedIpIpv6;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.ipv6.DefaultAugmentedIpIpv6;
import org.onosproject.yang.model.InnerModelObject;
import java.util.LinkedList;
import java.util.List;
/**
* Representation of utility for interface creation and deletion.
*/
public final class IntConstructionUtil {
private static final String IP_ADD_NULL = "Vpn binding to an interface " +
"requires ip address.";
// No instantiation.
private IntConstructionUtil() {
}
/**
* Creates device model interface by building its parameters with port
* name, VPN name and ip connection.
*
* @param pName port name
* @param vpnName VPN name
* @param connect ip connection
* @return interface device model
*/
public static Interfaces createInterface(String pName, String vpnName,
IpConnection connect) {
Interfaces interfaces = new DefaultInterfaces();
List<YangAutoPrefixInterface> intList = new LinkedList<>();
YangAutoPrefixInterface inter = buildInterface(vpnName, pName, connect);
intList.add(inter);
interfaces.yangAutoPrefixInterface(intList);
return interfaces;
}
/**
* Builds augmented info of ip address to the interface.
*
* @param vpnName VPN name
* @param pName port name
* @param connect ip connection
* @return interface
*/
private static YangAutoPrefixInterface buildInterface(String vpnName,
String pName,
IpConnection connect) {
// Bind vpn name in the augmented info of interface.
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
.instance.rev20160623.ietfnetworkinstance.devices.device
.interfaces.yangautoprefixinterface.AugmentedIfInterface augIf =
new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
.ietf.network.instance.rev20160623.ietfnetworkinstance
.devices.device.interfaces.yangautoprefixinterface
.DefaultAugmentedIfInterface();
augIf.bindNetworkInstanceName(vpnName);
// Bind ip address to the interface as augmented info.
AugmentedIfInterface intAug = buildIpAddress(connect, vpnName);
YangAutoPrefixInterface inter = new DefaultYangAutoPrefixInterface();
inter.name(pName);
((DefaultYangAutoPrefixInterface) inter).addAugmentation(
(InnerModelObject) augIf);
((DefaultYangAutoPrefixInterface) inter).addAugmentation(
(InnerModelObject) intAug);
return inter;
}
/**
* Returns ipv6 address filled with attached VPN, ipv6 address and mask.
*
* @param vpnName VPN name
* @param mask mask
* @param ipv6Add ipv6 address
* @return device ipv6 address
*/
private static Ipv6 getIpv6Aug(String vpnName, short mask, String ipv6Add) {
AugmentedIpIpv6 augIpv6 = new DefaultAugmentedIpIpv6();
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
.rev20140616.ietfip.devices.device.interfaces
.yangautoprefixinterface.augmentedifinterface.ipv6.Address add =
new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
.ip.rev20140616.ietfip.devices.device.interfaces
.yangautoprefixinterface.augmentedifinterface.ipv6
.DefaultAddress();
Ipv6 ipv6 = new DefaultIpv6();
List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
.rev20140616.ietfip.devices.device.interfaces
.yangautoprefixinterface.augmentedifinterface.ipv6
.Address> addList = new LinkedList<>();
add.ip(Ipv6AddressNoZone.of(Ipv6Address.of(ipv6Add)));
augIpv6.bindNetworkInstanceName(vpnName);
add.prefixLength(mask);
addList.add(add);
ipv6.address(addList);
((DefaultIpv6) ipv6).addAugmentation((DefaultAugmentedIpIpv6) augIpv6);
return ipv6;
}
/**
* Returns ipv4 address filled with attached VPN, ipv4 address and mask.
*
* @param vpnName VPN name
* @param mask mask
* @param ipv4Add ipv4 address
* @return device ipv4 address
*/
private static Ipv4 getIpv4Aug(String vpnName, short mask, String ipv4Add) {
AugmentedIpIpv4 augIpv4 = new DefaultAugmentedIpIpv4();
Subnet net = new DefaultPrefixLength();
Address add = new DefaultAddress();
Ipv4 ipv4 = new DefaultIpv4();
List<Address> addList = new LinkedList<>();
augIpv4.bindNetworkInstanceName(vpnName);
((DefaultPrefixLength) net).prefixLength(mask);
add.ip(Ipv4AddressNoZone.of(Ipv4Address.of(ipv4Add)));
add.subnet(net);
addList.add(add);
ipv4.address(addList);
((DefaultIpv4) ipv4).addAugmentation((DefaultAugmentedIpIpv4) augIpv4);
return ipv4;
}
/**
* Builds ip address according to the existence of ip address in ip
* connection of device model.
*
* @param connect ip connection
* @param vpnName VPN name
* @return augmented interface
*/
public static AugmentedIfInterface buildIpAddress(IpConnection connect,
String vpnName) {
if (connect == null || (connect.ipv4() == null
&& connect.ipv6() == null)) {
throw new NetL3VpnException(IP_ADD_NULL);
}
AugmentedIfInterface intAug = new DefaultAugmentedIfInterface();
short mask;
if (connect.ipv4() != null) {
mask = connect.ipv4().addresses().mask();
Ipv4Address peIpv4 = connect.ipv4().addresses().providerAddress();
Ipv4 v4 = getIpv4Aug(vpnName, mask, peIpv4.string());
intAug.ipv4(v4);
}
if (connect.ipv6() != null) {
mask = connect.ipv6().addresses().mask();
Ipv6Address peIpv6 = connect.ipv6().addresses().providerAddress();
Ipv6 v6 = getIpv6Aug(vpnName, mask, peIpv6.string());
intAug.ipv6(v6);
}
return intAug;
}
}