/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.vpp.manager; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.config.yang.config.vpp_provider.impl.VppRenderer; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.MountPoint; import org.opendaylight.controller.md.sal.binding.api.MountPointService; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest; import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppNodeListener; import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import com.google.common.base.Optional; import com.google.common.eventbus.EventBus; import com.google.common.util.concurrent.CheckedFuture; /** * Test for {@link VppNodeManager} and {@link VppNodeListener}. */ @RunWith(MockitoJUnitRunner.class) public class VppManagerDataStoreTest extends VppRendererDataBrokerTest { private static final String V3PO_CAPABILITY = "(urn:opendaylight:params:xml:ns:yang:v3po?revision=2017-03-15)v3po"; private static final String INTERFACES_CAPABILITY = "(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)ietf-interfaces"; private static final String NODE_NAME = "testVpp"; private static final InstanceIdentifier<Node> NODE_IID = VppIidFactory .getNodeIid(new TopologyKey(new TopologyId("topology-netconf")), new NodeKey(new NodeId(NODE_NAME))); @Mock BindingAwareBroker.ProviderContext providerContext; @Mock MountPointService mountPointService; @Mock MountPoint mountPoint; @Mock DataBroker dataBroker2; private DataBroker dataBroker; private VppNodeListener vppNodeListener; private VppNodeManager vppNodeManager; @Before public void setUp() throws Exception { Mockito.when(providerContext.getSALService(Matchers.<Class<MountPointService>>any())) .thenReturn(mountPointService); Mockito.when(mountPointService.getMountPoint(Matchers.<InstanceIdentifier<Node>>any())) .thenReturn(Optional.of(mountPoint)); Mockito.when(mountPoint.getService(Matchers.<Class<DataBroker>>any())).thenReturn(Optional.of(dataBroker2)); dataBroker = getDataBroker(); vppNodeManager = new VppNodeManager(dataBroker, providerContext, null); vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, new EventBus()); } private Node createNode(final String name, NetconfNodeConnectionStatus.ConnectionStatus status) { Host host = new Host(new IpAddress(new Ipv4Address("192.168.255.101"))); PortNumber portNumber = new PortNumber(2830); List<AvailableCapability> avaibleCapabilitiesList = new ArrayList<>(); avaibleCapabilitiesList.add(new AvailableCapabilityBuilder().setCapability(V3PO_CAPABILITY).build()); avaibleCapabilitiesList.add(new AvailableCapabilityBuilder().setCapability(INTERFACES_CAPABILITY).build()); NetconfNode netconfNode = new NetconfNodeBuilder().setHost(host) .setPort(portNumber) .setUnavailableCapabilities(new UnavailableCapabilitiesBuilder().build()) .setAvailableCapabilities( new AvailableCapabilitiesBuilder().setAvailableCapability(avaibleCapabilitiesList).build()) .setConnectionStatus(status) .build(); return new NodeBuilder().setNodeId(new NodeId(name)).addAugmentation(NetconfNode.class, netconfNode).build(); } @Test public void connectNode() throws Exception { WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected); writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true); writeTransaction.submit().get(); ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction(); CheckedFuture<Optional<Renderer>, ReadFailedException> future = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME))); Optional<Renderer> rendererOptional = future.checkedGet(); Assert.assertTrue(rendererOptional.isPresent()); Assert.assertEquals(1, rendererOptional.get().getRendererNodes().getRendererNode().size()); Assert.assertEquals(NODE_IID, rendererOptional.get().getRendererNodes().getRendererNode().get(0).getNodePath()); } @Test public void disconnectNode() throws Exception { WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected); writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true); writeTransaction.submit().get(); ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction(); CheckedFuture<Optional<Renderer>, ReadFailedException> future = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME))); Optional<Renderer> rendererOptional = future.checkedGet(); Assert.assertTrue(rendererOptional.isPresent()); Assert.assertEquals(1, rendererOptional.get().getRendererNodes().getRendererNode().size()); Assert.assertEquals(NODE_IID, rendererOptional.get().getRendererNodes().getRendererNode().get(0).getNodePath()); WriteTransaction writeTransaction2 = dataBroker.newWriteOnlyTransaction(); Node testVppNode2 = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connecting); writeTransaction2.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode2, true); writeTransaction2.submit(); ReadOnlyTransaction readOnlyTransaction2 = dataBroker.newReadOnlyTransaction(); CheckedFuture<Optional<Renderer>, ReadFailedException> future2 = readOnlyTransaction2.read(LogicalDatastoreType.OPERATIONAL, VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME))); Optional<Renderer> rendererOptional2 = future2.checkedGet(); Assert.assertTrue(rendererOptional2.isPresent()); Assert.assertEquals(0, rendererOptional2.get().getRendererNodes().getRendererNode().size()); } @After public void cleanUp() throws Exception { vppNodeListener.close(); } }