Fixing socket for vpp endpoint 25/48825/7
authorMichal Cmarada <mcmarada@cisco.com>
Fri, 2 Dec 2016 07:38:56 +0000 (08:38 +0100)
committerMichal Cmarada <mcmarada@cisco.com>
Tue, 24 Jan 2017 11:28:10 +0000 (12:28 +0100)
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 <mcmarada@cisco.com>
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/NeutronVppMapper.java
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/hostconfigs/VppNodeListener.java
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandlerTest.java
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/TestUtils.java

index 994778564c6897e8bfec8c93c7eb3c968482bac0..861202f7407d35151bee484dc13485ce3b9c2f6c 100644 (file)
@@ -23,7 +23,7 @@ public class NeutronVppMapper implements AutoCloseable {
     public NeutronVppMapper(String socketPath, String socketPrefix, DataBroker dataBroker) {\r
         SocketInfo socketInfo = new SocketInfo(socketPath, socketPrefix);\r
         vppNodeListener = new VppNodeListener(dataBroker, socketInfo);\r
-        neutronListener = new NeutronListener(dataBroker, socketInfo);\r
+        neutronListener = new NeutronListener(dataBroker);\r
         LOG.info("Neutron VPP started!");\r
     }\r
 \r
index 39b3a85d36f327713108af68c89adb90d6151c03..c79b875dafd7303bf00b4dc85865d515069c28ea 100644 (file)
@@ -72,8 +72,8 @@ public class VppNodeListener extends DataTreeChangeHandler<RendererNode> {
     @Override\r
     protected void onSubtreeModified(DataObjectModification<RendererNode> rootNode,\r
             InstanceIdentifier<RendererNode> rootIdentifier) {\r
-        deleteData(rootNode.getDataAfter());\r
-        writeData(rootNode.getDataBefore());\r
+        deleteData(rootNode.getDataBefore());\r
+        writeData(rootNode.getDataAfter());\r
     }\r
 \r
     private void writeData(RendererNode rendererNode) {\r
index 988469baaafff0fc8ca24c09f9f723c548bb3611..e4fe158c57cd8f7c669a855ffd100cab29449d2f 100644 (file)
@@ -23,7 +23,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.Mod
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.SocketInfo;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
 import org.opendaylight.yangtools.yang.binding.DataObject;\r
@@ -43,14 +42,14 @@ public class NeutronListener implements ClusteredDataTreeChangeListener<Neutron>
     private final Set<MappingProvider<? extends DataObject>> dataChangeProviders = new LinkedHashSet<>();\r
     protected ListenerRegistration<NeutronListener> registeredListener;\r
 \r
-    public NeutronListener(DataBroker dataBroker, SocketInfo socketInfo) {\r
-        registerHandlersAndListeners(dataBroker, socketInfo);\r
+    public NeutronListener(DataBroker dataBroker) {\r
+        registerHandlersAndListeners(dataBroker);\r
         registeredListener = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(\r
                 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), this);\r
     }\r
 \r
-    private void registerHandlersAndListeners(DataBroker dataBroker, SocketInfo socketInfo) {\r
-        PortHandler portHandler = new PortHandler(dataBroker, socketInfo);\r
+    private void registerHandlersAndListeners(DataBroker dataBroker) {\r
+        PortHandler portHandler = new PortHandler(dataBroker);\r
         dataChangeProviders.add(new PortAware(portHandler, dataBroker));\r
         dataChangeProviders.add(new NetworkAware(dataBroker));\r
     }\r
index 32fe340a71bdd7dc7942d1067bdecf7c73ab7035..01c2152cc0309627e18c489ee87464937916f265 100644 (file)
@@ -21,7 +21,6 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;\r
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;\r
-import org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.SocketInfo;\r
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
@@ -64,6 +63,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.VisibleForTesting;\r
 import com.google.common.base.Optional;\r
 \r
+import javax.annotation.Nonnull;\r
 public class PortHandler implements TransactionChainListener {\r
 \r
     private static final Logger LOG = LoggerFactory.getLogger(PortHandler.class);\r
@@ -77,14 +77,13 @@ public class PortHandler implements TransactionChainListener {
     private static final String VPP_INTERFACE_NAME_PREFIX = "neutron_port_";\r
     private static final String TAP_PORT_NAME_PREFIX = "tap";\r
     private static final String RT_PORT_NAME_PREFIX = "qr-";\r
+    private static final String VHOST_SOCKET_KEY = "vhostuser_socket";\r
 \r
     private BindingTransactionChain transactionChain;\r
     private DataBroker dataBroker;\r
-    private SocketInfo socketInfo;\r
 \r
-    PortHandler(DataBroker dataBroker, SocketInfo socketInfo) {\r
+    PortHandler(DataBroker dataBroker) {\r
         this.dataBroker = dataBroker;\r
-        this.socketInfo = socketInfo;\r
         transactionChain = this.dataBroker.createTransactionChain(this);\r
     }\r
 \r
@@ -238,9 +237,10 @@ public class PortHandler implements TransactionChainListener {
             .setAddressType(bebp.getAddressType())\r
             .setVppInterfaceName(VPP_INTERFACE_NAME_PREFIX + bebp.getPortId().getValue())\r
             .setVppNodeId(new NodeId(portBinding.getHostId()));\r
+\r
         if (port.getDeviceOwner().contains(COMPUTE_OWNER)) {\r
-            String socket = socketInfo.getSocketPath() + socketInfo.getSocketPrefix() + bebp.getPortId().getValue();\r
-            vppEpBuilder.setInterfaceTypeChoice(new VhostUserCaseBuilder().setSocket(socket).build());\r
+            vppEpBuilder.setInterfaceTypeChoice(\r
+                new VhostUserCaseBuilder().setSocket(getSocketFromPortBinding(portBinding)).build());\r
         } else if (port.getDeviceOwner().contains(DHCP_OWNER) && port.getMacAddress() != null) {\r
             TapCase tapCase = new TapCaseBuilder().setPhysicalAddress(new PhysAddress(port.getMacAddress().getValue()))\r
                 .setName(createPortName(port.getUuid()))\r
@@ -257,6 +257,17 @@ public class PortHandler implements TransactionChainListener {
         return vppEpBuilder.build();\r
     }\r
 \r
+    private String getSocketFromPortBinding(@Nonnull PortBindingExtension portBindingExtension) {\r
+        List<VifDetails> vifDetails = nullToEmpty(portBindingExtension.getVifDetails());\r
+\r
+        for (VifDetails detail : vifDetails) {\r
+            if (VHOST_SOCKET_KEY.equalsIgnoreCase(detail.getDetailsKey())) {\r
+                return detail.getValue();\r
+            }\r
+        }\r
+        return null;\r
+    }\r
+\r
     private LoopbackCase getLoopbackCase(Port port) {\r
         LoopbackCaseBuilder loopbackCase = new LoopbackCaseBuilder()\r
             .setPhysAddress(new PhysAddress(port.getMacAddress().getValue()));\r
index 0c81dfedc51de340543e945dd0119294c1e72aee..1ed99947e658506df20d745b1b12e4f1d35d0822 100644 (file)
@@ -46,19 +46,18 @@ public class NeutronListenerTest extends AbstractDataBrokerTest {
     public void init() {\r
         port = TestUtils.createValidVppPort();\r
         bebp = TestUtils.createBaseEndpointByPortForPort();\r
-        socketInfo = new SocketInfo("/tmp/", "_socket");\r
         dataBroker = getDataBroker();\r
-        neutronListener = new NeutronListener(dataBroker, socketInfo);\r
+        neutronListener = new NeutronListener(dataBroker);\r
         neutronListener.clearDataChangeProviders();\r
         baseEpByPortListener = Mockito.spy(new PortAware(new PortHandler(\r
-                dataBroker, socketInfo), dataBroker));\r
+                dataBroker), dataBroker));\r
         neutronListener.addDataChangeProvider(baseEpByPortListener);\r
     }\r
 \r
     @Test\r
     public void constructorTest() {\r
         dataBroker = Mockito.spy(dataBroker);\r
-        NeutronListener neutronListener = new NeutronListener(dataBroker, socketInfo);\r
+        NeutronListener neutronListener = new NeutronListener(dataBroker);\r
         verify(dataBroker).registerDataTreeChangeListener(\r
                 eq(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,\r
                         InstanceIdentifier.builder(Neutron.class)\r
index 7e2eadf2cefd01b1cb9d75f69650f9383cc9e91f..f94809c447fbc91505bd5f5ac9ec0a7ce1053c96 100644 (file)
@@ -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<ReadTransaction>() {
 
             @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
index 2c1f2a31251f08e8cb38b12e6506f8a2072c1c0a..8d114024701779618fcb776b789190751764ec77 100644 (file)
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;\r
 import static org.junit.Assert.assertTrue;\r
 \r
+import java.util.Collections;\r
 import java.util.Iterator;\r
 \r
 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils;\r
@@ -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;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;\r
@@ -41,10 +44,15 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;\r
 \r
 public class TestUtils {\r
+    public static String TEST_SOCKET = "/tmp/socket_testsocket";\r
 \r
     public static Port createValidVppPort() {\r
         PortBindingExtension portBindingExt = new PortBindingExtensionBuilder().setHostId("devstack-control")\r
             .setVifType("vhostuser")\r
+            .setVifDetails(Collections.singletonList(\r
+                new VifDetailsBuilder().setKey(new VifDetailsKey("vhostuser_socket"))\r
+                    .setValue(TEST_SOCKET)\r
+                    .build()))\r
             .build();\r
         return new PortBuilder().setUuid(new Uuid("00000000-1111-2222-3333-444444444444"))\r
             .setDeviceOwner("compute")\r