package org.opennaas.extensions.vcpe.manager.templates.mp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.opennaas.core.resources.configurationadmin.ConfigurationAdminUtil;
import org.opennaas.extensions.vcpe.Activator;
import org.opennaas.extensions.vcpe.model.Domain;
import org.opennaas.extensions.vcpe.model.IPNetworkDomain;
import org.opennaas.extensions.vcpe.model.Interface;
import org.opennaas.extensions.vcpe.model.Router;
import org.opennaas.extensions.vcpe.model.VCPENetworkModel;
import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper;
public class MPTemplateDefaultValuesLoader {
private static final String CONFIGURATION_PID = "org.opennaas.extensions.vcpe.manager.templates.mp.suggestor.defaults";
/**
* Maps TemplateName to properties name.
*/
private static Map<String, String> propertiesNameMap = new HashMap<String, String>();
// initialize propertiesNameMap with values in configuration
static {
// Physical elements
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY, "vcpe.router.1.phy");
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY_IFACE_UP1, "vcpe.router.1.phy.iface.phy.up1");
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY_IFACE_UP2, "vcpe.router.1.phy.iface.phy.up2");
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY_IFACE_DOWN, "vcpe.router.1.phy.iface.phy.down");
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY_IFACE_LO, "vcpe.router.1.phy.iface.phy.lo");
propertiesNameMap.put(TemplateConstants.ROUTER_1_PHY_IFACE_LT, "vcpe.router.1.phy.iface.phy.lt");
// Logical elements
propertiesNameMap.put(TemplateConstants.WAN1, "net.wan.1");
propertiesNameMap.put(TemplateConstants.WAN1_IFACE_DOWN, "net.wan.1.iface.logical.down");
propertiesNameMap.put(TemplateConstants.WAN2, "net.wan.2");
propertiesNameMap.put(TemplateConstants.WAN2_IFACE_DOWN, "net.wan.2.iface.logical.down");
propertiesNameMap.put(TemplateConstants.LAN_CLIENT, "net.lan.client");
propertiesNameMap.put(TemplateConstants.LAN_CLIENT_IFACE_UP, "net.lan.client.iface.logical.up");
propertiesNameMap.put(TemplateConstants.LR_1_ROUTER, "vcpe.lr.1");
propertiesNameMap.put(TemplateConstants.LR_1_IFACE_UP, "vcpe.lr.1.iface.logical.up");
propertiesNameMap.put(TemplateConstants.LR_1_IFACE_DOWN, "vcpe.lr.1.iface.logical.down");
propertiesNameMap.put(TemplateConstants.LR_1_IFACE_LO, "vcpe.lr.1.iface.logical.lo");
propertiesNameMap.put(TemplateConstants.LR_2_ROUTER, "vcpe.lr.2");
propertiesNameMap.put(TemplateConstants.LR_2_IFACE_UP, "vcpe.lr.2.iface.logical.up");
propertiesNameMap.put(TemplateConstants.LR_2_IFACE_DOWN, "vcpe.lr.2.iface.logical.down");
propertiesNameMap.put(TemplateConstants.LR_2_IFACE_LO, "vcpe.lr.2.iface.logical.lo");
propertiesNameMap.put(TemplateConstants.LR_CLIENT_ROUTER, "vcpe.lr.client");
propertiesNameMap.put(TemplateConstants.LR_CLIENT_IFACE_UP1, "vcpe.lr.client.iface.logical.up1");
propertiesNameMap.put(TemplateConstants.LR_CLIENT_IFACE_UP2, "vcpe.lr.client.iface.logical.up2");
propertiesNameMap.put(TemplateConstants.LR_CLIENT_IFACE_DOWN, "vcpe.lr.client.iface.logical.down");
propertiesNameMap.put(TemplateConstants.LR_CLIENT_IFACE_LO, "vcpe.lr.client.iface.logical.lo");
}
private Properties props;
private boolean initialized;
public MPTemplateDefaultValuesLoader() {
setInitialized(false);
}
public Properties getProperties() {
return props;
}
public void setProperties(Properties props) {
this.props = props;
}
public boolean isInitialized() {
return initialized;
}
public void setInitialized(boolean initialized) {
this.initialized = initialized;
}
public void initialize() throws IOException {
initialize(loadProperties());
}
public void initialize(Properties properties) {
setProperties(properties);
setInitialized(true);
}
public VCPENetworkModel loadDefaultPhysicalModel() {
VCPENetworkModel model = MPTemplateModelBuilder.generatePhysicalElements();
return loadDefaultPhysicalModel(model);
}
/**
* @param model
* PhysicalModel containing ALL physical elements required for MPTemplate, and nothing else.
* @return given model populated with default values
*/
public VCPENetworkModel loadDefaultPhysicalModel(VCPENetworkModel model) {
for (Router router : VCPENetworkModelHelper.getRouters(model.getElements())) {
loadPhysicalRouter(router);
}
return model;
}
public VCPENetworkModel loadDefaultLogicalModel() {
VCPENetworkModel model = MPTemplateModelBuilder.generateLogicalElements();
return loadDefaultLogicalModel(model);
}
/**
* @param model
* LogicalModel containing ALL logical elements required for MPTemplate, and nothing else.
* @return given model populated with default values
*/
public VCPENetworkModel loadDefaultLogicalModel(VCPENetworkModel model) {
for (Router router : VCPENetworkModelHelper.getRouters(model.getElements())) {
loadLogicalRouter(router);
}
for (Domain ipNetDomain : VCPENetworkModelHelper.getDomains(model.getElements())) {
loadIPNetworkDomain((IPNetworkDomain) ipNetDomain);
}
return model;
}
private Properties loadProperties() throws IOException {
Properties properties = ConfigurationAdminUtil.getProperties(Activator.getContext(), CONFIGURATION_PID);
if (properties == null)
throw new IOException("Failed to initialize template suggestor." + "Unable to obtain configuration " + CONFIGURATION_PID);
return properties;
}
private void loadPhysicalRouter(Router router) {
router.setName(props.getProperty(propertiesNameMap.get(router.getTemplateName()) + ".name").trim());
for (Interface iface : router.getInterfaces()) {
loadPhysicalIface(iface);
}
}
private void loadPhysicalIface(Interface iface) {
iface.setName(props.getProperty(propertiesNameMap.get(iface.getTemplateName()) + ".name").trim());
iface.setPhysicalInterfaceName(iface.getName());
}
private void loadLogicalRouter(Router router) {
router.setName(props.getProperty(propertiesNameMap.get(router.getTemplateName()) + ".name").trim());
for (Interface iface : router.getInterfaces()) {
loadLogicalIface(iface);
}
}
private void loadIPNetworkDomain(IPNetworkDomain ipNetDomain) {
String propertiesName = propertiesNameMap.get(ipNetDomain.getTemplateName());
ipNetDomain.setName(props.getProperty(propertiesName + ".name").trim());
ipNetDomain.setASNumber(props.getProperty(propertiesName + ".asnum").trim());
int rangeCount = Integer.parseInt(props.getProperty(propertiesName + ".ipranges.num").trim());
List<String> ipRanges = new ArrayList<String>(rangeCount);
for (int i = 0; i < rangeCount; i++) {
ipRanges.add(props.getProperty(propertiesName + ".ipranges." + i).trim());
}
ipNetDomain.setIPAddressRanges(ipRanges);
for (Interface iface : ipNetDomain.getInterfaces()) {
loadLogicalIface(iface);
}
}
private void loadLogicalIface(Interface iface) {
updateInterfaceFromProperties(iface);
}
private Interface updateInterfaceFromProperties(Interface iface) {
String propertiesName = propertiesNameMap.get(iface.getTemplateName());
long vlan = 0L;
if (props.getProperty(propertiesName + ".vlan") != null)
vlan = Long.parseLong(props.getProperty(propertiesName + ".vlan").trim());
int port = 0;
if (props.getProperty(propertiesName + ".port") != null)
port = Integer.parseInt(props.getProperty(propertiesName + ".port").trim());
String ipAddress = null;
if (props.getProperty(propertiesName + ".ipaddress") != null)
ipAddress = props.getProperty(propertiesName + ".ipaddress").trim();
return VCPENetworkModelHelper.updateInterface(iface,
props.getProperty(propertiesName + ".name").trim() + "." + port,
vlan,
ipAddress,
props.getProperty(propertiesName + ".name").trim(),
port);
}
}