package org.opennaas.itests.router;
/*
* #%L
* OpenNaaS :: iTests :: Router
* %%
* Copyright (C) 2007 - 2014 FundaciĆ³ Privada i2CAT, Internet i InnovaciĆ³ a Catalunya
* %%
* 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.
* #L%
*/
import static org.junit.Assert.assertEquals;
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.Test;
import org.junit.runner.RunWith;
import org.opennaas.core.resources.ILifecycle.State;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceIdentifier;
import org.opennaas.core.resources.IResourceManager;
import org.opennaas.core.resources.IResourceRepository;
import org.opennaas.core.resources.Resource;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.core.resources.ResourceNotFoundException;
import org.opennaas.core.resources.ResourceRepository;
import org.opennaas.core.resources.action.ActionResponse;
import org.opennaas.core.resources.action.IAction;
import org.opennaas.core.resources.capability.ICapability;
import org.opennaas.core.resources.command.Response;
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.core.resources.queue.QueueResponse;
import org.opennaas.extensions.queuemanager.IQueueManagerCapability;
import org.opennaas.extensions.router.capability.chassis.IChassisCapability;
import org.opennaas.extensions.router.junos.actionssets.ActionConstants;
import org.opennaas.extensions.router.model.ComputerSystem;
import org.opennaas.extensions.router.model.System;
import org.opennaas.itests.helpers.OpennaasExamOptions;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
import org.ops4j.pax.exam.util.Filter;
import org.osgi.framework.BundleContext;
import org.osgi.service.blueprint.container.BlueprintContainer;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class MantychoreRepositoryIntegrationTest
{
private final static Log log = LogFactory.getLog(MantychoreRepositoryIntegrationTest.class);
/**
* Make sure blueprint for specified bundle has finished its initialization
*/
@SuppressWarnings("unused")
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.router.repository)", timeout = 20000)
private BlueprintContainer repositoryBlueprintContainer;
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.router.capability.chassis)", timeout = 20000)
private BlueprintContainer chassisCapabilityBlueprintContainer;
@Inject
private IResourceManager resourceManager;
@Inject
@Filter("(type=router)")
private IResourceRepository resourceRepository;
@Inject
private BundleContext bundleContext;
@Inject
private IProtocolManager protocolManager;
@Configuration
public static Option[] configuration() {
return options(
OpennaasExamOptions.opennaasDistributionConfiguration(),
OpennaasExamOptions.includeFeatures("opennaas-router", "opennaas-router-driver-junos", "itests-helpers"),
OpennaasExamOptions.noConsole(), OpennaasExamOptions.doNotDelayShell(),
OpennaasExamOptions.keepLogConfiguration(),
OpennaasExamOptions.keepRuntimeFolder());
}
/**
* Configure the protocol to connect
*/
private ProtocolSessionContext newSessionContextNetconf() {
String uri = java.lang.System.getProperty("protocol.uri");
if (uri == null || uri.equals("${protocol.uri}") || uri.isEmpty()) {
uri = "mock://user:pass@host.net:2212/mocksubsystem";
}
ProtocolSessionContext protocolSessionContext = new ProtocolSessionContext();
protocolSessionContext.addParameter(
ProtocolSessionContext.PROTOCOL_URI, uri);
protocolSessionContext.addParameter(ProtocolSessionContext.PROTOCOL,
"netconf");
protocolSessionContext.addParameter(ProtocolSessionContext.AUTH_TYPE,
"password");
// ADDED
return protocolSessionContext;
}
public void createProtocolForResource(String resourceId) throws ProtocolException {
protocolManager.getProtocolSessionManagerWithContext(resourceId, newSessionContextNetconf());
}
@After
public void clearRepo() throws ResourceException {
log.info("Clearing resource repo");
IResource[] toRemove = new IResource[resourceManager.listResources().size()];
toRemove = resourceManager.listResources().toArray(toRemove);
for (IResource resource : toRemove) {
if (resource.getState().equals(State.ACTIVE)) {
resourceManager.stopResource(resource.getResourceIdentifier());
}
resourceManager.removeResource(resource.getResourceIdentifier());
}
log.info("Resource repo cleared!");
}
@Test
public void createAndRemoveResourceTest() throws Exception {
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor("router");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(ResourceHelper.newChassisCapabilityDescriptor());
capabilityDescriptors.add(ResourceHelper.newQueueCapabilityDescriptor());
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
IResource resource = resourceManager.createResource(resourceDescriptor);
Assert.assertFalse(resourceManager.listResources().isEmpty());
resourceManager.removeResource(resource.getResourceIdentifier());
Assert.assertTrue(resourceManager.listResources().isEmpty());
}
@Test
public void StartAndStopResourceTest() throws Exception {
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor("router");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(ResourceHelper.newChassisCapabilityDescriptor());
capabilityDescriptors.add(ResourceHelper.newQueueCapabilityDescriptor());
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
/* create resource */
Resource resource = (Resource) resourceManager.createResource(resourceDescriptor);
Assert.assertNotNull(resource.getResourceIdentifier());
Assert.assertNotNull(resource.getResourceDescriptor());
Assert.assertTrue(resource.getCapabilities().isEmpty());
Assert.assertNull(resource.getModel());
Assert.assertNull(resource.getProfile());
Assert.assertFalse(resourceManager.listResources().isEmpty());
createProtocolForResource(resource.getResourceIdentifier().getId());
/* start resource */
resourceManager.startResource(resource.getResourceIdentifier());
Assert.assertFalse(resource.getCapabilities().isEmpty());
Assert.assertNotNull(resource.getModel()); // this proves bootstrapper has been executed
// Assert.assertNotNull(resource.getProfile());
/* stop resource */
resourceManager.stopResource(resource.getResourceIdentifier());
Assert.assertNotNull(resource.getResourceIdentifier());
Assert.assertNotNull(resource.getResourceDescriptor());
Assert.assertTrue(resource.getCapabilities().isEmpty());
Assert.assertNull(resource.getModel());
// Assert.assertNull(resource.getProfile());
// Assert.assertFalse(resourceManager.listResources().isEmpty());
/* remove resource */
IResourceIdentifier resourceIdentifier = resource.getResourceIdentifier();
resourceManager.removeResource(resource.getResourceIdentifier());
Assert.assertTrue(resource.getCapabilities().isEmpty());
Assert.assertNull(resource.getModel());
Assert.assertNull(resource.getProfile());
boolean exist = true;
try {
resourceManager.getResource(resourceIdentifier);
} catch (ResourceException e) {
exist = false;
}
Assert.assertFalse(exist);
}
@Test
public void startedResourceModelHasNameTest() throws Exception {
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor("router");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(ResourceHelper.newChassisCapabilityDescriptor());
capabilityDescriptors.add(ResourceHelper.newQueueCapabilityDescriptor());
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
/* create resource */
IResource resource = resourceManager.createResource(resourceDescriptor);
Assert.assertFalse(resourceManager.listResources().isEmpty());
createProtocolForResource(resource.getResourceIdentifier().getId());
/* start resource */
resourceManager.startResource(resource.getResourceIdentifier());
Assert.assertFalse(resource.getCapabilities().isEmpty());
Assert.assertNotNull(resource.getModel()); // this proves bootstrapper has been executed
Assert.assertTrue(resource.getModel() instanceof ComputerSystem);
Assert.assertNotNull(((ComputerSystem) resource.getModel()).getName());
}
@Test
public void operationWithResourceTest() throws Exception {
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor("router");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(ResourceHelper.newChassisCapabilityDescriptor());
capabilityDescriptors.add(ResourceHelper.newQueueCapabilityDescriptor());
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
Resource resource = (Resource) resourceManager.createResource(resourceDescriptor);
resource.setModel(new ComputerSystem());
createProtocolForResource(resource.getResourceIdentifier().getId());
resourceManager.startResource(resource.getResourceIdentifier());
IChassisCapability chassisCapability = (IChassisCapability) getCapability(resource.getCapabilities(), "chassis");
if (chassisCapability == null)
Assert.fail("Capability not found");
IQueueManagerCapability queueCapability = (IQueueManagerCapability) getCapability(resource.getCapabilities(), "queue");
if (queueCapability == null)
Assert.fail("Capability not found");
chassisCapability.createLogicalRouter(getLogicalRouter("cpe1"));
QueueResponse queueResponse = (QueueResponse) queueCapability.execute();
Assert.assertTrue(queueResponse.getResponses().size() == 1);
Assert.assertTrue(queueResponse.getPrepareResponse().getStatus() == ActionResponse.STATUS.OK);
Assert.assertTrue(queueResponse.getConfirmResponse().getStatus() == ActionResponse.STATUS.OK);
Assert.assertTrue(queueResponse.getRestoreResponse().getStatus() == ActionResponse.STATUS.PENDING);
ActionResponse actionResponse = queueResponse.getResponses().get(0);
Assert.assertEquals(ActionConstants.CREATELOGICALROUTER, actionResponse.getActionID());
for (Response response : actionResponse.getResponses()) {
Assert.assertTrue(response.getStatus() == Response.Status.OK);
}
List<IAction> queue = (List<IAction>) queueCapability.getActions();
Assert.assertTrue(queue.size() == 0);
resourceManager.stopResource(resource.getResourceIdentifier());
resourceManager.removeResource(resource.getResourceIdentifier());
}
/**
* Test to check discovery functionalities. TODO It should be interesting to add some test in order to check if i want to remove resources that in
* the updated model doesn't exist
*/
@Test
public void discoveryRouterTest() throws Exception {
ResourceDescriptor resourceDescriptor = ResourceHelper.newResourceDescriptor("router");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(ResourceHelper.newChassisCapabilityDescriptor());
capabilityDescriptors.add(ResourceHelper.newQueueCapabilityDescriptor());
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
Resource resource = (Resource) resourceManager.createResource(resourceDescriptor);
resource.setModel(new ComputerSystem());
/* first test, check that the resource has created all the logical resources and they have an initialized model */
existLogicalResourcesTest(resourceManager, resource, bundleContext);
// FIXME TO TEST
if (!isMock())
checkUpdatedExistLogicalResourcesTest(resourceManager, resource, bundleContext);
}
@Test
public void testPersistedIdentifierIdDoesNotChange() throws ResourceException {
ResourceDescriptor descriptor = ResourceHelper.newResourceDescriptor("router");
IResource res1 = resourceRepository.createResource(descriptor);
if (resourceRepository instanceof ResourceRepository) {
// reset repository and load persisted resources
((ResourceRepository) resourceRepository).init();
IResource res2 = resourceRepository.getResource(res1.getResourceIdentifier().getId());
assertEquals(res1.getResourceDescriptor().getId(), res2.getResourceDescriptor().getId());
}
}
private static boolean isMock() {
String uri = java.lang.System.getProperty("protocol.uri");
return (uri == null || uri.equals("${protocol.uri}") || uri.isEmpty());
}
private void existLogicalResourcesTest(IResourceManager resourceManager, IResource resource, BundleContext context)
throws ProtocolException, ResourceException {
createProtocolForResource(resource.getResourceIdentifier().getId());
resourceManager.startResource(resource.getResourceIdentifier());
/* check all resources loaded */
List<String> nameLogicalRouters = getLogicalRoutersFromModel(resource);
/* all the resources were created correctly */
for (String nameRouter : nameLogicalRouters) {
IResourceIdentifier resourceIdentifier = null;
try {
resourceIdentifier = resourceManager.getIdentifierFromResourceName("router", nameRouter);
} catch (ResourceNotFoundException exception) {
Assert.fail("Resource " + nameRouter + " was not found");
}
// Assert.assertNotNull(resourceManager.getResource(resourceIdentifier).getModel());
}
/* Restore configuration */
resourceManager.stopResource(resource.getResourceIdentifier());
resourceManager.removeResource(resource.getResourceIdentifier());
}
private void checkUpdatedExistLogicalResourcesTest(IResourceManager resourceManager, IResource resource, BundleContext context)
throws ProtocolException, ResourceException {
addNewLogicalRouterInRouter(resource);
resourceManager.startResource(resource.getResourceIdentifier());
/* check all resources loaded */
List<String> nameLogicalRouters = getLogicalRoutersFromModel(resource);
/* all the resources were created correctly */
for (String nameRouter : nameLogicalRouters) {
IResourceIdentifier resourceIdentifier = null;
try {
resourceIdentifier = resourceManager.getIdentifierFromResourceName("router", nameRouter);
} catch (ResourceNotFoundException exception) {
Assert.fail("Resource " + nameRouter + " was not found");
}
Assert.assertNotNull(resourceManager.getResource(resourceIdentifier).getModel());
}
/* Restore configuration */
removeLogicalRouterInRouter(resource);
resourceManager.stopResource(resource.getResourceIdentifier());
resourceManager.removeResource(resource.getResourceIdentifier());
}
private void addNewLogicalRouterInRouter(IResource resource)
throws ProtocolException, ResourceException {
IChassisCapability chassisCapability = (IChassisCapability) getCapability(resource.getCapabilities(), "chassis");
if (chassisCapability == null)
Assert.fail("Capability not found");
IQueueManagerCapability queueCapability = (IQueueManagerCapability) getCapability(resource.getCapabilities(), "queue");
if (queueCapability == null)
Assert.fail("Capability not found");
chassisCapability.createLogicalRouter(getLogicalRouter("routerTestRepository"));
QueueResponse queueResponse = (QueueResponse) queueCapability.execute();
}
private void removeLogicalRouterInRouter(IResource resource)
throws ProtocolException, ResourceException {
IChassisCapability chassisCapability = (IChassisCapability) getCapability(resource.getCapabilities(), "chassis");
if (chassisCapability == null)
Assert.fail("Capability not found");
IQueueManagerCapability queueCapability = (IQueueManagerCapability) getCapability(resource.getCapabilities(), "queue");
if (queueCapability == null)
Assert.fail("Capability not found");
chassisCapability.deleteLogicalRouter(getLogicalRouter("routerTestRepository"));
QueueResponse queueResponse = (QueueResponse) queueCapability.execute();
}
private List<String> getLogicalRoutersFromModel(IResource resource) {
ComputerSystem router = (ComputerSystem) resource.getModel();
ArrayList<String> nameRouters = new ArrayList<String>();
List<System> logicalRouters = router.getSystems();
for (System logicalRouter : logicalRouters) {
nameRouters.add(logicalRouter.getName());
}
return nameRouters;
}
private ICapability getCapability(List<? extends ICapability> list, String type) {
for (ICapability capability : list) {
if (capability.getCapabilityInformation().getType().equals(type)) {
return capability;
}
}
return null;
}
private ComputerSystem getLogicalRouter(String lrName) {
ComputerSystem lrModel = new ComputerSystem();
lrModel.setName(lrName);
lrModel.setElementName(lrName);
return lrModel;
}
}