package org.opennaas.extensions.bod.capability.l2bod;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.resources.ActivatorException;
import org.opennaas.core.resources.action.IAction;
import org.opennaas.core.resources.action.IActionSet;
import org.opennaas.core.resources.capability.AbstractCapability;
import org.opennaas.core.resources.capability.CapabilityException;
import org.opennaas.core.resources.descriptor.CapabilityDescriptor;
import org.opennaas.core.resources.descriptor.ResourceDescriptorConstants;
import org.opennaas.extensions.network.model.NetworkModel;
import org.opennaas.extensions.network.model.NetworkModelHelper;
import org.opennaas.extensions.network.model.topology.Link;
import org.opennaas.extensions.network.model.topology.NetworkElement;
import org.opennaas.extensions.queuemanager.IQueueManagerCapability;
public class L2BoDCapability extends AbstractCapability implements IL2BoDCapability {
public static String CAPABILITY_TYPE = "l2bod";
Log log = LogFactory.getLog(L2BoDCapability.class);
private String resourceId = "";
/**
* @param descriptor
* @param resourceId
*/
public L2BoDCapability(CapabilityDescriptor descriptor, String resourceId) {
super(descriptor);
this.resourceId = resourceId;
log.debug("Built new L2BoD Capability");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.extensions.bod.capability.l2bod.IL2BoDCapability#requestConnection(org.opennaas.extensions.bod.capability.l2bod.
* RequestConnectionParameters)
*/
@Override
public void requestConnection(RequestConnectionParameters parameters) throws CapabilityException {
log.info("Start of requestConnection call. " + parameters.toString());
IAction action = createActionAndCheckParams(L2BoDActionSet.REQUEST_CONNECTION, parameters);
queueAction(action);
log.info("End of requestConnection call");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.extensions.bod.capability.l2bod.IL2BoDCapability#shutDownConnection(java.util.List)
*/
@Override
public void shutDownConnection(RequestConnectionParameters parameters) throws CapabilityException {
log.info("Start of shutDownConnection call. " + parameters.toString());
Link link = getLinkFromRequest(parameters);
IAction action = createActionAndCheckParams(L2BoDActionSet.SHUTDOWN_CONNECTION, link);
queueAction(action);
log.info("End of shutDownConnection call");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.extensions.bod.capability.l2bod.IL2BoDCapability#shutDownConnection(org.opennaas.extensions.network.model.topology.Link)
*/
@Override
public void shutDownConnection(BoDLink link) throws CapabilityException {
log.info("Start of shutDownConnection call");
List<Link> links = NetworkModelHelper.getLinks((NetworkModel) resource.getModel());
int pos = NetworkModelHelper.getNetworkElementByName(link.getName(), links);
if (pos == -1) {
throw new CapabilityException("Given link does not exist");
}
if (!(links.get(pos) instanceof BoDLink)) {
throw new CapabilityException("Given link does not exist");
}
BoDLink realLink = (BoDLink) links.get(pos);
IAction action = createActionAndCheckParams(L2BoDActionSet.SHUTDOWN_CONNECTION, realLink);
queueAction(action);
log.info("End of shutDownConnection call");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#activate()
*/
@Override
public void activate() throws CapabilityException {
registerService(Activator.getContext(), CAPABILITY_TYPE, getResourceType(), getResourceName(), IL2BoDCapability.class.getName());
super.activate();
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#deactivate()
*/
@Override
public void deactivate() throws CapabilityException {
registration.unregister();
super.deactivate();
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.ICapability#getCapabilityName()
*/
@Override
public String getCapabilityName() {
return CAPABILITY_TYPE;
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#getActionSet()
*/
@Override
public IActionSet getActionSet() throws CapabilityException {
String name = this.descriptor.getPropertyValue(ResourceDescriptorConstants.ACTION_NAME);
String version = this.descriptor.getPropertyValue(ResourceDescriptorConstants.ACTION_VERSION);
try {
return Activator.getL2BoDActionSetService(name, version);
} catch (ActivatorException e) {
throw new CapabilityException(e);
}
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#queueAction(org.opennaas.core.resources.action.IAction)
*/
@Override
public void queueAction(IAction action) throws CapabilityException {
getQueueManager(resourceId).queueAction(action);
}
/**
*
* @return QueuemanagerService this capability is associated to.
* @throws CapabilityException
* if desired queueManagerService could not be retrieved.
*/
private IQueueManagerCapability getQueueManager(String resourceId) throws CapabilityException {
try {
return Activator.getQueueManagerService(resourceId);
} catch (ActivatorException e) {
throw new CapabilityException("Failed to get QueueManagerService for resource " + resourceId, e);
}
}
private BoDLink getLinkFromRequest(RequestConnectionParameters request) {
List<Link> links = NetworkModelHelper.getLinks((NetworkModel) resource.getModel());
for (NetworkElement link : ((NetworkModel) resource.getModel()).getNetworkElements()) {
if (link instanceof BoDLink) {
if (matches(((BoDLink) link).getRequestParameters(), request)) {
return (BoDLink) link;
}
}
}
return null;
}
/**
* For the scope of this capability, two RequestConnectionParameters match if their interfaces, capacity and vlans are equal.
*
* @param one
* @param other
* @return
*/
private boolean matches(RequestConnectionParameters one, RequestConnectionParameters other) {
if (one == null || other == null)
return false;
if (one.interface1 == null) {
if (other.interface1 != null)
return false;
} else if (other.interface1 != null) {
if (one.interface1.getName() != null) {
if (!one.interface1.getName().equals(other.interface1.getName()))
return false;
}
}
if (one.interface2 == null) {
if (other.interface2 != null)
return false;
} else if (other.interface2 != null) {
if (one.interface2.getName() != null) {
if (!one.interface2.getName().equals(other.interface2.getName()))
return false;
}
}
if (one.capacity != other.capacity)
return false;
if (one.vlanid1 != other.vlanid1)
return false;
if (one.vlanid2 != other.vlanid2)
return false;
return true;
}
}