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
@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
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
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
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
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
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
.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
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
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
private BindingTransactionChain transactionChain;
private Port port;
- private SocketInfo socketInfo;
private BaseEndpointByPort bebp;
@Rule
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
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
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
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
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