package org.opennaas.itests.bod; 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.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.opennaas.core.protocols.sessionmanager.ProtocolSessionManager; import org.opennaas.core.resources.ILifecycle.State; import org.opennaas.core.resources.IResource; import org.opennaas.core.resources.IResourceManager; import org.opennaas.core.resources.IResourceRepository; import org.opennaas.core.resources.ResourceException; import org.opennaas.core.resources.action.ActionResponse; import org.opennaas.core.resources.action.ActionResponse.STATUS; import org.opennaas.core.resources.action.IAction; import org.opennaas.core.resources.action.IActionSet; import org.opennaas.core.resources.capability.ICapability; import org.opennaas.core.resources.descriptor.CapabilityDescriptor; 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.ProtocolException; import org.opennaas.core.resources.protocol.ProtocolSessionContext; import org.opennaas.extensions.bod.capability.l2bod.BoDLink; import org.opennaas.extensions.bod.capability.l2bod.IL2BoDCapability; import org.opennaas.extensions.bod.capability.l2bod.L2BoDCapability; import org.opennaas.extensions.network.model.NetworkModel; import org.opennaas.extensions.network.model.NetworkModelHelper; import org.opennaas.extensions.network.model.topology.Interface; import org.opennaas.extensions.network.model.topology.Link; import org.opennaas.itests.helpers.AbstractKarafCommandTest; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.Configuration; import org.ops4j.pax.exam.junit.ExamReactorStrategy; import org.ops4j.pax.exam.junit.JUnit4TestRunner; import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory; import org.ops4j.pax.exam.util.Filter; import org.osgi.service.blueprint.container.BlueprintContainer; @RunWith(JUnit4TestRunner.class) @ExamReactorStrategy(EagerSingleStagedReactorFactory.class) public class L2BoDCommandsKarafTest extends AbstractKarafCommandTest { private static final String ACTION_NAME = "dummy"; private static final String VERSION = "1.0"; private static final String L2BOD_CAPABILIY_TYPE = L2BoDCapability.CAPABILITY_TYPE; private static final String QUEUE_CAPABILIY_TYPE = "queue"; private static final String CAPABILITY_URI = "mock://user:pass@host.net:2212/mocksubsystem"; private static final String RESOURCE_TYPE = "bod"; private static final String RESOURCE_URI = "user:pass@host.net:2212"; private static final String RESOURCE_INFO_NAME = "L2BoD_Test"; private static Log log = LogFactory.getLog(L2BoDCommandsKarafTest.class); @Inject private IResourceManager resourceManager; @Inject @Filter("(type=bod)") private IResourceRepository repository; @Inject private IProtocolManager protocolManager; private ProtocolSessionManager protocolSessionManager; @SuppressWarnings("unused") @Inject @Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.bod.capability.l2bod)", timeout = 20000) private BlueprintContainer bodCapabilityService; @SuppressWarnings("unused") @Inject @Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.bod.repository)", timeout = 20000) private BlueprintContainer bodRepositoryService; private IResource resource; /* * CONFIGURATION, BEFORE and AFTER */ @Configuration public static Option[] configuration() { return options(opennaasDistributionConfiguration(), includeFeatures("opennaas-bod", "opennaas-netconf", "itests-helpers"), noConsole(), keepRuntimeFolder()); } @Before public void fillRepository() throws ResourceException { Assert.assertTrue(repository.listResources().isEmpty()); // L2BoD Capability Descriptor List<CapabilityDescriptor> lCapabilityDescriptors = new ArrayList<CapabilityDescriptor>(); lCapabilityDescriptors.add(ResourceHelper.newCapabilityDescriptor(ACTION_NAME, VERSION, L2BOD_CAPABILIY_TYPE, CAPABILITY_URI)); lCapabilityDescriptors.add(ResourceHelper.newCapabilityDescriptor(ACTION_NAME, VERSION, QUEUE_CAPABILIY_TYPE, CAPABILITY_URI)); // Create BOD resource resource = resourceManager.createResource(ResourceHelper.newResourceDescriptor(lCapabilityDescriptors, RESOURCE_TYPE, RESOURCE_URI, RESOURCE_INFO_NAME)); Assert.assertTrue(repository.listResources().contains(resource)); // Start resource resourceManager.startResource(resource.getResourceIdentifier()); Assert.assertTrue(resource.getState().equals(State.ACTIVE)); Assert.assertTrue(resource.getCapabilities().size() > 0); Assert.assertFalse(repository.listResources().isEmpty()); } /** * At the end of the tests, we empty the repository */ @After public void clearRepository() throws ResourceException { log.info("Clearing resource repo"); List<IResource> toRemove = resourceManager.listResources(); for (IResource resource : toRemove) { if (resource.getState().equals(State.ACTIVE)) { resourceManager.stopResource(resource.getResourceIdentifier()); } resourceManager.removeResource(resource.getResourceIdentifier()); } Assert.assertTrue(resourceManager.listResources().isEmpty()); Assert.assertTrue(repository.listResources().isEmpty()); log.info("Resource repo cleared!"); } /* * TESTS */ /** * Test to check the request connection command */ @Test public void RequestConnectionCommandTest() throws Exception { ResourceDescriptor resourceDescriptor = resource.getResourceDescriptor(); String resourceFriendlyID = resourceDescriptor.getInformation().getType() + ":" + resourceDescriptor.getInformation().getName(); repository.stopResource(resource.getResourceDescriptor().getId()); createProtocolForResource(resource.getResourceIdentifier().getId()); repository.startResource(resource.getResourceDescriptor().getId()); NetworkModel model = (NetworkModel) resource.getModel(); model.getNetworkElements().add(createInterface("int1")); model.getNetworkElements().add(createInterface("int2")); List<String> response = executeCommand("l2bod:requestConnection --endtime 2012-04-20T18:36:00Z --capacity 10 " + resourceFriendlyID + " int1 int2"); // assert command output does not contain ERROR tag log.info(response); Assert.assertTrue(response.get(1).isEmpty()); // simulate action has been executed BoDLink link = new BoDLink(); link.setName("link1"); model.getNetworkElements().add(link); List<Link> links = NetworkModelHelper.getLinks(model.getNetworkElements()); Assert.assertFalse(links.isEmpty()); String linkName = links.get(0).getName(); response = executeCommand("l2bod:shutdownConnection " + resourceFriendlyID + " " + linkName); // assert command output does not contain ERROR tag Assert.assertTrue(response.get(1).isEmpty()); repository.stopResource(resource.getResourceIdentifier().getId()); repository.removeResource(resource.getResourceIdentifier().getId()); } @Test public void BoDResourceTest() throws Exception { // Get Capabilities List<? extends ICapability> capabilityList = resource.getCapabilities(); Assert.assertTrue(capabilityList.size() > 0); L2BoDCapability capability = (L2BoDCapability) resource.getCapabilityByInterface(IL2BoDCapability.class); IActionSet actionSet = ((L2BoDCapability) capability).getActionSet(); List<String> actionList = actionSet.getActionNames(); Assert.assertTrue(actionList.size() > 0); for (String actionName : actionList) { IAction action = actionSet.obtainAction(actionName); ActionResponse actionResponse = action.execute(protocolSessionManager); Assert.assertTrue(actionResponse.getStatus().equals(STATUS.OK)); } } /* * HELPERS */ private Interface createInterface(String name) { Interface i = new Interface(); i.setName(name); return i; } /** * Create the protocol to connect * * @param resourceId * @throws ProtocolException */ private void createProtocolForResource(String resourceId) throws ProtocolException { String uri = System.getProperty("protocol.uri"); if (uri == null || uri.equals("${protocol.uri}") || uri.isEmpty()) { uri = "mock://user:pass@host.net:2212/mocksubsystem"; } ProtocolSessionContext psContext = new ProtocolSessionContext(); psContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, uri); psContext.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); psContext.addParameter(ProtocolSessionContext.AUTH_TYPE, "password"); protocolManager.getProtocolSessionManagerWithContext(resourceId, psContext); } }