blob: da4a85ccea2d7a5f08eef6b8360f107a49042901 [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.drivers.huawei;
import org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.Ipv4Address;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.DeviceKeys;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.L3VpnIfs;
import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.DefaultL3VpnIf;
import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.L3VpnIf;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.DefaultDevices;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.Device;
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.Ipv4;
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.address.subnet.PrefixLength;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
import org.onosproject.yang.model.InnerModelObject;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.model.ModelObjectId;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import static org.onosproject.drivers.huawei.DriverUtil.DEVICE_NULL;
import static org.onosproject.drivers.huawei.DriverUtil.OBJECT_NULL;
import static org.onosproject.drivers.huawei.DriverUtil.getData;
import static org.onosproject.drivers.huawei.DriverUtil.getIdFromModId;
import static org.onosproject.drivers.huawei.DriverUtil.getObjFromModData;
import static org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.Ipv4Address.fromString;
/**
* Representation of utility for interface creation and deletion.
*/
public final class IntConstructionUtil {
/**
* Error message for illegal length of mask.
*/
private static final String ILLEGAL_MASK_LENGTH = "Illegal length of mask" +
" is not allowed.";
// No instantiation.
private IntConstructionUtil() {
}
/**
* Returns the created model object data of VPN bounded interface of huawei
* device from the standard model object data.
*
* @param modObj model object data
* @return driver interface model object data
*/
static ModelObjectData getCreateInt(ModelObjectData modObj) {
boolean isModIdAvail = true;
String id = getIdFromModId(modObj.identifier());
Object obj = getObjFromModData(modObj);
if (id == null) {
isModIdAvail = false;
id = getIdFromRootObj(obj);
obj = getObjFromDevObj(obj);
}
if (obj == null) {
throw new IllegalArgumentException(OBJECT_NULL);
}
List<YangAutoPrefixInterface> intList = ((Interfaces) obj)
.yangAutoPrefixInterface();
YangAutoPrefixInterface l3Int = intList.get(0);
DefaultAugmentedIfInterface ifInt =
((DefaultYangAutoPrefixInterface) l3Int).augmentation(
DefaultAugmentedIfInterface.class);
String insName = ifInt.bindNetworkInstanceName();
L3VpnIfs l3VpnIfs = getDriverInterfaces(l3Int);
return getDriModObj(id, insName, l3VpnIfs, isModIdAvail);
}
/**
* Returns the driver model object data, according to the levels it has
* to be constructed.
*
* @param id device id
* @param insName VPN name
* @param l3VpnIfs driver VPN if object
* @param isModIdAvail model id availability
* @return driver model object data
*/
private static ModelObjectData getDriModObj(String id, String insName,
L3VpnIfs l3VpnIfs,
boolean isModIdAvail) {
List<L3VpnIf> intList = l3VpnIfs.l3VpnIf();
Iterator<L3VpnIf> it = intList.iterator();
L3VpnIf l3VpnIf = it.next();
ModelObjectData data;
ModelObjectId.Builder objId = getModIdBuilder(id, insName);
if (isModIdAvail) {
objId.addChild(DefaultL3VpnIfs.class);
data = getData(objId.build(), (InnerModelObject) l3VpnIf);
} else {
data = getData(objId.build(), (InnerModelObject) l3VpnIfs);
}
return data;
}
private static ModelObjectId.Builder getModIdBuilder(String id,
String vpnName) {
DeviceKeys key = new DeviceKeys();
key.deviceid(id);
L3VpnInstanceKeys insKey = new L3VpnInstanceKeys();
insKey.vrfName(vpnName);
return ModelObjectId.builder()
.addChild(org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225
.nel3vpnapi.DefaultDevices.class)
.addChild(org.onosproject.yang.gen.v1.ne.l3vpn.api
.rev20141225.nel3vpnapi.devices
.DefaultDevice.class, key)
.addChild(DefaultL3Vpn.class)
.addChild(DefaultL3Vpncomm.class)
.addChild(DefaultL3VpnInstances.class)
.addChild(DefaultL3VpnInstance.class, insKey);
}
/**
* Returns the driver interfaces from the standard device model interfaces.
*
* @param ifs standard device model interfaces
* @return driver interfaces
*/
private static L3VpnIfs getDriverInterfaces(YangAutoPrefixInterface ifs) {
L3VpnIfs l3VpnIfs = new DefaultL3VpnIfs();
L3VpnIf l3VpnIf = new DefaultL3VpnIf();
List<L3VpnIf> l3VpnIfList = new LinkedList<>();
l3VpnIf.ifName(ifs.name());
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
.rev20140616.ietfip.devices.device.interfaces
.yangautoprefixinterface.DefaultAugmentedIfInterface ipAug =
((DefaultYangAutoPrefixInterface) ifs).augmentation(
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
.ietf.ip.rev20140616.ietfip.devices.device
.interfaces.yangautoprefixinterface
.DefaultAugmentedIfInterface.class);
if (ipAug != null && ipAug.ipv4() != null) {
Ipv4 ipAddress = ipAug.ipv4();
for (Address add : ipAddress.address()) {
Ipv4Address v4Add = fromString(add.ip().ipv4Address()
.toString());
Ipv4Address subnet = fromString(getSubnet(
((PrefixLength) add.subnet()).prefixLength()));
l3VpnIf.ipv4Addr(v4Add);
l3VpnIf.subnetMask(subnet);
}
}
l3VpnIfList.add(l3VpnIf);
l3VpnIfs.l3VpnIf(l3VpnIfList);
return l3VpnIfs;
}
/**
* Returns the device id from the root object.
*
* @param obj root object
* @return device id
*/
private static String getIdFromRootObj(Object obj) {
Device dev = getDevFromRootObj(obj);
return dev.deviceid();
}
/**
* Returns the device from the root object.
*
* @param obj root object
* @return device object
*/
private static Device getDevFromRootObj(Object obj) {
List<Device> deviceList = ((DefaultDevices) obj).device();
Iterator<Device> it = deviceList.iterator();
if (it.hasNext()) {
return it.next();
}
throw new IllegalArgumentException(DEVICE_NULL);
}
/**
* Returns the interfaces object from the root object.
*
* @param obj root object
* @return interfaces object
*/
private static Interfaces getObjFromDevObj(Object obj) {
Device dev = getDevFromRootObj(obj);
return dev.interfaces();
}
/**
* Returns the subnet address from the mask value.
*
* @param mask mask value
* @return subnet address
*/
private static String getSubnet(short mask) {
int value = 0xffffffff << (32 - mask);
byte[] bytes = new byte[]{
(byte) (value >>> 24), (byte) (value >> 16 & 0xff),
(byte) (value >> 8 & 0xff), (byte) (value & 0xff)};
InetAddress netAdd;
try {
netAdd = InetAddress.getByAddress(bytes);
} catch (UnknownHostException e) {
throw new IllegalArgumentException(ILLEGAL_MASK_LENGTH);
}
return netAdd.getHostAddress();
}
}