From: Michal Cmarada Date: Fri, 2 Dec 2016 07:38:56 +0000 (+0100) Subject: Fixing socket for vpp endpoint X-Git-Tag: release/carbon~44^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=groupbasedpolicy.git;a=commitdiff_plain;h=f78017afee658bcd126b07067b5af0f230a666d5 Fixing socket for vpp endpoint if hostconfig is used for VPP renderer, the socket generated for VPP endpoint is bad. this patch fixes this issue Change-Id: I136f1b0b331f7fef82c74f217f802960687a79bf Signed-off-by: Michal Cmarada --- diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/NeutronVppMapper.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/NeutronVppMapper.java index 994778564..861202f74 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/NeutronVppMapper.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/NeutronVppMapper.java @@ -23,7 +23,7 @@ public class NeutronVppMapper implements AutoCloseable { public NeutronVppMapper(String socketPath, String socketPrefix, DataBroker dataBroker) { SocketInfo socketInfo = new SocketInfo(socketPath, socketPrefix); vppNodeListener = new VppNodeListener(dataBroker, socketInfo); - neutronListener = new NeutronListener(dataBroker, socketInfo); + neutronListener = new NeutronListener(dataBroker); LOG.info("Neutron VPP started!"); } diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/hostconfigs/VppNodeListener.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/hostconfigs/VppNodeListener.java index 39b3a85d3..c79b875da 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/hostconfigs/VppNodeListener.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/hostconfigs/VppNodeListener.java @@ -72,8 +72,8 @@ public class VppNodeListener extends DataTreeChangeHandler { @Override protected void onSubtreeModified(DataObjectModification rootNode, InstanceIdentifier rootIdentifier) { - deleteData(rootNode.getDataAfter()); - writeData(rootNode.getDataBefore()); + deleteData(rootNode.getDataBefore()); + writeData(rootNode.getDataAfter()); } private void writeData(RendererNode rendererNode) { diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java index 988469baa..e4fe158c5 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java @@ -23,7 +23,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.Mod import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.SocketInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -43,14 +42,14 @@ public class NeutronListener implements ClusteredDataTreeChangeListener private final Set> dataChangeProviders = new LinkedHashSet<>(); protected ListenerRegistration registeredListener; - public NeutronListener(DataBroker dataBroker, SocketInfo socketInfo) { - registerHandlersAndListeners(dataBroker, socketInfo); + public NeutronListener(DataBroker dataBroker) { + registerHandlersAndListeners(dataBroker); registeredListener = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>( LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this); } - private void registerHandlersAndListeners(DataBroker dataBroker, SocketInfo socketInfo) { - PortHandler portHandler = new PortHandler(dataBroker, socketInfo); + private void registerHandlersAndListeners(DataBroker dataBroker) { + PortHandler portHandler = new PortHandler(dataBroker); dataChangeProviders.add(new PortAware(portHandler, dataBroker)); dataChangeProviders.add(new NetworkAware(dataBroker)); } diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java index 32fe340a7..01c2152cc 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java @@ -21,7 +21,6 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.SocketInfo; import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; @@ -64,6 +63,7 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; +import javax.annotation.Nonnull; public class PortHandler implements TransactionChainListener { private static final Logger LOG = LoggerFactory.getLogger(PortHandler.class); @@ -77,14 +77,13 @@ public class PortHandler implements TransactionChainListener { private static final String VPP_INTERFACE_NAME_PREFIX = "neutron_port_"; private static final String TAP_PORT_NAME_PREFIX = "tap"; private static final String RT_PORT_NAME_PREFIX = "qr-"; + private static final String VHOST_SOCKET_KEY = "vhostuser_socket"; private BindingTransactionChain transactionChain; private DataBroker dataBroker; - private SocketInfo socketInfo; - PortHandler(DataBroker dataBroker, SocketInfo socketInfo) { + PortHandler(DataBroker dataBroker) { this.dataBroker = dataBroker; - this.socketInfo = socketInfo; transactionChain = this.dataBroker.createTransactionChain(this); } @@ -238,9 +237,10 @@ public class PortHandler implements TransactionChainListener { .setAddressType(bebp.getAddressType()) .setVppInterfaceName(VPP_INTERFACE_NAME_PREFIX + bebp.getPortId().getValue()) .setVppNodeId(new NodeId(portBinding.getHostId())); + if (port.getDeviceOwner().contains(COMPUTE_OWNER)) { - String socket = socketInfo.getSocketPath() + socketInfo.getSocketPrefix() + bebp.getPortId().getValue(); - vppEpBuilder.setInterfaceTypeChoice(new VhostUserCaseBuilder().setSocket(socket).build()); + vppEpBuilder.setInterfaceTypeChoice( + new VhostUserCaseBuilder().setSocket(getSocketFromPortBinding(portBinding)).build()); } else if (port.getDeviceOwner().contains(DHCP_OWNER) && port.getMacAddress() != null) { TapCase tapCase = new TapCaseBuilder().setPhysicalAddress(new PhysAddress(port.getMacAddress().getValue())) .setName(createPortName(port.getUuid())) @@ -257,6 +257,17 @@ public class PortHandler implements TransactionChainListener { return vppEpBuilder.build(); } + private String getSocketFromPortBinding(@Nonnull PortBindingExtension portBindingExtension) { + List vifDetails = nullToEmpty(portBindingExtension.getVifDetails()); + + for (VifDetails detail : vifDetails) { + if (VHOST_SOCKET_KEY.equalsIgnoreCase(detail.getDetailsKey())) { + return detail.getValue(); + } + } + return null; + } + private LoopbackCase getLoopbackCase(Port port) { LoopbackCaseBuilder loopbackCase = new LoopbackCaseBuilder() .setPhysAddress(new PhysAddress(port.getMacAddress().getValue())); diff --git a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java index 0c81dfedc..1ed99947e 100644 --- a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java +++ b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java @@ -46,19 +46,18 @@ public class NeutronListenerTest extends AbstractDataBrokerTest { public void init() { port = TestUtils.createValidVppPort(); bebp = TestUtils.createBaseEndpointByPortForPort(); - socketInfo = new SocketInfo("/tmp/", "_socket"); dataBroker = getDataBroker(); - neutronListener = new NeutronListener(dataBroker, socketInfo); + neutronListener = new NeutronListener(dataBroker); neutronListener.clearDataChangeProviders(); baseEpByPortListener = Mockito.spy(new PortAware(new PortHandler( - dataBroker, socketInfo), dataBroker)); + dataBroker), dataBroker)); neutronListener.addDataChangeProvider(baseEpByPortListener); } @Test public void constructorTest() { dataBroker = Mockito.spy(dataBroker); - NeutronListener neutronListener = new NeutronListener(dataBroker, socketInfo); + NeutronListener neutronListener = new NeutronListener(dataBroker); verify(dataBroker).registerDataTreeChangeListener( eq(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class) diff --git a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandlerTest.java b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandlerTest.java index 7e2eadf2c..f94809c44 100644 --- a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandlerTest.java +++ b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandlerTest.java @@ -51,7 +51,6 @@ public class PortHandlerTest extends AbstractDataBrokerTest { private BindingTransactionChain transactionChain; private Port port; - private SocketInfo socketInfo; private BaseEndpointByPort bebp; @Rule @@ -61,11 +60,10 @@ public class PortHandlerTest extends AbstractDataBrokerTest { public void init() { port = TestUtils.createValidVppPort(); bebp = TestUtils.createBaseEndpointByPortForPort(); - socketInfo = new SocketInfo("/tmp/", "_socket"); dataBroker = Mockito.spy(getDataBroker()); transactionChain = mock(BindingTransactionChain.class); when(dataBroker.createTransactionChain(any(PortHandler.class))).thenReturn(transactionChain); - portHandler = new PortHandler(dataBroker, socketInfo); + portHandler = new PortHandler(dataBroker); when(transactionChain.newReadOnlyTransaction()).thenAnswer(new Answer() { @Override @@ -92,8 +90,7 @@ public class PortHandlerTest extends AbstractDataBrokerTest { assertTrue(vppEp.getInterfaceTypeChoice() instanceof VhostUserCase); VhostUserCase vhostUserCase = (VhostUserCase) vppEp.getInterfaceTypeChoice(); assertNotNull(vhostUserCase); - assertEquals(vhostUserCase.getSocket(), socketInfo.getSocketPath() + socketInfo.getSocketPrefix() - + bebp.getPortId().getValue()); + assertEquals(TestUtils.TEST_SOCKET, vhostUserCase.getSocket()); } @Test diff --git a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/TestUtils.java b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/TestUtils.java index 2c1f2a312..8d1140247 100644 --- a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/TestUtils.java +++ b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/TestUtils.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.Collections; import java.util.Iterator; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; @@ -32,6 +33,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_render import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder; @@ -41,10 +44,15 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; public class TestUtils { + public static String TEST_SOCKET = "/tmp/socket_testsocket"; public static Port createValidVppPort() { PortBindingExtension portBindingExt = new PortBindingExtensionBuilder().setHostId("devstack-control") .setVifType("vhostuser") + .setVifDetails(Collections.singletonList( + new VifDetailsBuilder().setKey(new VifDetailsKey("vhostuser_socket")) + .setValue(TEST_SOCKET) + .build())) .build(); return new PortBuilder().setUuid(new Uuid("00000000-1111-2222-3333-444444444444")) .setDeviceOwner("compute")