package org.opennaas.itests.network;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
import static org.opennaas.itests.helpers.OpennaasExamOptions.includeFeatures;
import static org.opennaas.itests.helpers.OpennaasExamOptions.noConsole;
import static org.opennaas.itests.helpers.OpennaasExamOptions.opennaasDistributionConfiguration;
import static org.ops4j.pax.exam.CoreOptions.options;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennaas.core.resources.ILifecycle.State;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceManager;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.core.resources.descriptor.CapabilityDescriptor;
import org.opennaas.core.resources.descriptor.Information;
import org.opennaas.core.resources.descriptor.ResourceDescriptor;
import org.opennaas.core.resources.helpers.ResourceHelper;
import org.opennaas.core.resources.protocol.IProtocolManager;
import org.opennaas.core.resources.protocol.IProtocolSessionManager;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.protocol.ProtocolSessionContext;
import org.opennaas.extensions.network.capability.basic.INetworkBasicCapability;
import org.opennaas.extensions.network.capability.basic.NetworkBasicCapability;
import org.opennaas.extensions.network.capability.ospf.INetOSPFCapability;
import org.opennaas.extensions.network.capability.ospf.NetOSPFCapability;
import org.opennaas.extensions.network.capability.queue.IQueueCapability;
import org.opennaas.extensions.network.capability.queue.QueueCapability;
import org.opennaas.extensions.queuemanager.IQueueManagerCapability;
import org.opennaas.extensions.router.junos.actionssets.ActionConstants;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.util.Filter;
import org.osgi.service.blueprint.container.BlueprintContainer;
@RunWith(JUnit4TestRunner.class)
public class NetOSPFIntegrationTest {
protected static final String ACTION_NAME = null;
protected static final String CAPABILITY_URI = "mock://user:pass@host.net:2212/mocksubsystem";
protected static final String QUEUE_CAPABILIY_TYPE = QueueCapability.CAPABILITY_TYPE;
protected static final String OSPF_CAPABILIY_TYPE = NetOSPFCapability.CAPABILITY_TYPE;
protected static final String BASIC_CAPABILIY_TYPE = NetworkBasicCapability.CAPABILITY_TYPE;
protected static final String CAPABILIY_VERSION = null;
protected static final String RESOURCE_TYPE = "network";
protected static final String RESOURCE_INFO_NAME = "OSPF Test";
protected static final String RESOURCE_URI = "mock://user:pass@host.net:2212/mocksubsystem";
private static final Log log = LogFactory.getLog(NetOSPFIntegrationTest.class);
@Inject
private IProtocolManager protocolManager;
@Inject
private IResourceManager resourceManager;
@SuppressWarnings("unused")
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.network.repository)", timeout = 20000)
private BlueprintContainer networkRepoService;
@SuppressWarnings("unused")
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.router.repository)", timeout = 20000)
private BlueprintContainer routerRepoService;
private IResource networkResource;
/*
* CONFIGURATION, BEFORE and AFTER
*/
@Configuration
public static Option[] configuration() {
return options(opennaasDistributionConfiguration(),
includeFeatures("opennaas-network, opennaas-router", "opennaas-junos", "itests-helpers"),
noConsole(),
keepRuntimeFolder());
}
/**
* Start network resource with queue and ospf capability
*
* @throws ResourceException
* @throws ProtocolException
*/
@Before
public void startResource() throws ResourceException, ProtocolException {
List<CapabilityDescriptor> capDescriptors = new ArrayList<CapabilityDescriptor>();
capDescriptors.add(ResourceHelper.newCapabilityDescriptor(ACTION_NAME,
CAPABILIY_VERSION,
BASIC_CAPABILIY_TYPE,
CAPABILITY_URI));
capDescriptors.add(ResourceHelper.newCapabilityDescriptor(ACTION_NAME,
CAPABILIY_VERSION,
OSPF_CAPABILIY_TYPE,
CAPABILITY_URI));
capDescriptors.add(ResourceHelper.newCapabilityDescriptor(ACTION_NAME,
CAPABILIY_VERSION,
QUEUE_CAPABILIY_TYPE,
CAPABILITY_URI));
// Network Resource Descriptor
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor(capDescriptors, RESOURCE_TYPE, RESOURCE_URI,
RESOURCE_INFO_NAME);
// Create resource
networkResource = resourceManager.createResource(resourceDescriptor);
// Start resource
resourceManager.startResource(networkResource.getResourceIdentifier());
}
/**
* Stop and remove the network resource
*
* @throws ResourceException
* @throws ProtocolException
*/
@After
public void stopResource() throws ResourceException, ProtocolException {
resourceManager.stopResource(networkResource.getResourceIdentifier());
resourceManager.removeResource(networkResource.getResourceIdentifier());
// remove remaining if any
List<IResource> toRemove = resourceManager.listResources();
for (IResource resource : toRemove) {
if (resource.getState().equals(State.ACTIVE)) {
resourceManager.stopResource(resource.getResourceIdentifier());
}
resourceManager.removeResource(resource.getResourceIdentifier());
}
}
/*
* TESTS
*/
/**
* Test to check if capability is available from OSGi.
*/
@Test
public void isCapabilityAccessibleFromResourceTest()
throws ResourceException, ProtocolException
{
assertEquals(3, networkResource.getCapabilities().size());
}
@Test
public void testActivateOSPF() throws ResourceException, ProtocolException {
List<IResource> routers = new ArrayList<IResource>(2);
routers.add(startRouterResource("router1"));
routers.add(startRouterResource("router2"));
// Add routers to network
INetworkBasicCapability basicCapability = (INetworkBasicCapability) networkResource.getCapabilityByInterface(INetworkBasicCapability.class);
assertNotNull(basicCapability);
for (IResource router : routers) {
basicCapability.addResource(router);
}
// Activate OSPF
INetOSPFCapability netOSPFCapability = (INetOSPFCapability) networkResource.getCapabilityByInterface(INetOSPFCapability.class);
assertNotNull(netOSPFCapability);
netOSPFCapability.activateOSPF();
checkRoutersQueueContainsOSPFConfigActions(routers);
}
/**
* Test to check netqueue method
*
* @throws ProtocolException
* @throws ResourceException
*/
@Test
public void executeQueueTest() throws ResourceException, ProtocolException {
Information information = new Information();
information.setType(QUEUE_CAPABILIY_TYPE);
QueueCapability queueCapability = (QueueCapability) networkResource.getCapabilityByInterface(IQueueCapability.class);
queueCapability.execute();
}
/*
* HELPERS
*/
private IResource startRouterResource(String routerName) throws ResourceException, ProtocolException {
List<CapabilityDescriptor> lCapabilityDescriptors = new ArrayList<CapabilityDescriptor>();
CapabilityDescriptor ospfCapabilityDescriptor = ResourceHelper.newCapabilityDescriptor("junos", "10.10",
"ospf", CAPABILITY_URI);
lCapabilityDescriptors.add(ospfCapabilityDescriptor);
// Add Queue Capability Descriptor
CapabilityDescriptor queueCapabilityDescriptor = ResourceHelper.newQueueCapabilityDescriptor();
lCapabilityDescriptors.add(queueCapabilityDescriptor);
// Router Resource Descriptor
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor(lCapabilityDescriptors, "router", RESOURCE_URI,
routerName);
IResource routerResource = resourceManager.createResource(resourceDescriptor);
// If not exists the protocol session manager, it's created and add the session context
addSessionContext(routerResource.getResourceIdentifier().getId());
// Start resource
resourceManager.startResource(routerResource.getResourceIdentifier());
return routerResource;
}
/**
* If not exists the protocol session manager, it's created and add the session context
*
* @param resourceId
* @throws ProtocolException
*/
private IProtocolSessionManager addSessionContext(String resourceId) throws ProtocolException {
ProtocolSessionContext psc = new ProtocolSessionContext();
IProtocolSessionManager psm = protocolManager.getProtocolSessionManager(resourceId);
psc.addParameter(ProtocolSessionContext.PROTOCOL_URI, RESOURCE_URI);
psc.addParameter(ProtocolSessionContext.PROTOCOL, "netconf");
psc.addParameter(ProtocolSessionContext.AUTH_TYPE, "password");
psm.registerContext(psc);
return psm;
}
private void checkRoutersQueueContainsOSPFConfigActions(List<IResource> routers) throws ResourceException {
for (IResource router : routers) {
IQueueManagerCapability queueCapab = (IQueueManagerCapability) router.getCapabilityByInterface(IQueueManagerCapability.class);
assertEquals(4, queueCapab.getActions().size());
assertEquals(ActionConstants.OSPF_CONFIGURE, queueCapab.getActions().get(0).getActionID());
assertEquals(ActionConstants.OSPF_CONFIGURE_AREA, queueCapab.getActions().get(1).getActionID());
assertEquals(ActionConstants.OSPF_ADD_INTERFACE_IN_AREA, queueCapab.getActions().get(2).getActionID());
assertEquals(ActionConstants.OSPF_ACTIVATE + "/" + ActionConstants.OSPF_DEACTIVATE, queueCapab.getActions().get(3).getActionID());
}
}
}