import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRefBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.LoopbackCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.LoopbackCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCaseBuilder;\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.binding.attributes.VifDetails;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRef;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;\r
import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCase;
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.rev150712.Neutron;
package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
+import java.util.concurrent.Future;
+
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+
import org.opendaylight.controller.config.yang.config.groupbasedpolicy.GroupbasedpolicyInstance;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.adapter.VppRpcServiceImpl;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.AddInterfaceToBridgeDomainInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.CreateInterfaceOnNodeInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.CreateVirtualBridgeDomainOnNodesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DelInterfaceFromBridgeDomainInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DeleteInterfaceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DeleteVirtualBridgeDomainOnNodesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.ExpandVirtualBridgeDomainOnNodesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.VppAdapterService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class GbpVppProviderInstance implements ClusterSingletonService, AutoCloseable {
+public class GbpVppProviderInstance implements ClusterSingletonService, VppAdapterService, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(GbpVppProviderInstance.class);
public ServiceGroupIdentifier getIdentifier() {
return IDENTIFIER;
}
+
+ @Override
+ public Future<RpcResult<Void>> deleteVirtualBridgeDomainOnNodes(DeleteVirtualBridgeDomainOnNodesInput input) {
+ return renderer.getVppRpcServiceImpl().deleteVirtualBridgeDomain(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> createVirtualBridgeDomainOnNodes(CreateVirtualBridgeDomainOnNodesInput input) {
+ return renderer.getVppRpcServiceImpl().createVirtualBridgeDomain(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> createInterfaceOnNode(CreateInterfaceOnNodeInput input) {
+ return renderer.getVppRpcServiceImpl().createInterfaceOnNode(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> deleteInterface(DeleteInterfaceInput input) {
+ return renderer.getVppRpcServiceImpl().deleteInterfaceOnNode(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> addInterfaceToBridgeDomain(AddInterfaceToBridgeDomainInput input) {
+ return renderer.getVppRpcServiceImpl().addInterfaceToBridgeDomain(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> delInterfaceFromBridgeDomain(DelInterfaceFromBridgeDomainInput input) {
+ return renderer.getVppRpcServiceImpl().delInterfaceFromBridgeDomain(input);
+ }
+
+ @Override
+ public Future<RpcResult<Void>> expandVirtualBridgeDomainOnNodes(ExpandVirtualBridgeDomainOnNodesInput input) {
+ return renderer.getVppRpcServiceImpl().expandVirtualBridgeDomainOnNode(input);
+ }
}
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.adapter.VppRpcServiceImpl;
import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.RendererPolicyListener;
import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppEndpointListener;
private VppNodeListener vppNodeListener;
private VppEndpointListener vppEndpointListener;
private RendererPolicyListener rendererPolicyListener;
+ private VppRpcServiceImpl vppRpcServiceImpl;
public VppRenderer(DataBroker dataBroker, BindingAwareBroker bindingAwareBroker) {
this.dataBroker = Preconditions.checkNotNull(dataBroker);
context.getSubscriber(), context.getSubscriberMethod(), exception));
interfaceManager = new InterfaceManager(mountDataProvider, dataBroker, NETCONF_WORKER);
dtoEventBus.register(interfaceManager);
- ForwardingManager fwManager = new ForwardingManager(interfaceManager, new BridgeDomainManagerImpl(dataBroker), dataBroker);
+ BridgeDomainManager bdManager = new BridgeDomainManagerImpl(dataBroker);
+ ForwardingManager fwManager = new ForwardingManager(interfaceManager, bdManager, dataBroker);
vppRendererPolicyManager = new VppRendererPolicyManager(fwManager, dataBroker);
dtoEventBus.register(vppRendererPolicyManager);
vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, dtoEventBus);
vppEndpointListener = new VppEndpointListener(dataBroker, dtoEventBus);
rendererPolicyListener = new RendererPolicyListener(dataBroker, dtoEventBus);
-
+ vppRpcServiceImpl = new VppRpcServiceImpl(dataBroker, mountDataProvider, bdManager, interfaceManager);
registerToRendererManager();
}
}
});
}
+
+ VppRpcServiceImpl getVppRpcServiceImpl() {
+ return vppRpcServiceImpl;
+ }
}
--- /dev/null
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.vpp.adapter;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.Future;\r
+import java.util.stream.Collectors;\r
+\r
+import javax.annotation.Nonnull;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.ConfigCommand;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.TapPortCommand;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand.VhostUserCommandBuilder;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.AddInterfaceToBridgeDomainInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.CreateInterfaceOnNodeInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.CreateVirtualBridgeDomainOnNodesInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DelInterfaceFromBridgeDomainInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DeleteInterfaceInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.DeleteVirtualBridgeDomainOnNodesInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.ExpandVirtualBridgeDomainOnNodesInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.bridge.domain.attributes.tunnel.type.Vlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_adapter.rev161201.bridge.domain.attributes.tunnel.type.Vxlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUserRole;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanVni;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyTypesVbridgeAugment;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugment;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vlan.rev160429.TunnelTypeVlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vlan.rev160429.network.topology.topology.tunnel.parameters.VlanNetworkParameters;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vxlan.rev160429.TunnelTypeVxlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vxlan.rev160429.network.topology.topology.tunnel.parameters.VxlanTunnelParameters;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypes;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;\r
+import org.opendaylight.yangtools.yang.common.RpcResult;\r
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.google.common.base.Optional;\r
+import com.google.common.util.concurrent.AsyncFunction;\r
+import com.google.common.util.concurrent.CheckedFuture;\r
+import com.google.common.util.concurrent.Futures;\r
+import com.google.common.util.concurrent.ListenableFuture;\r
+\r
+public class VppRpcServiceImpl {\r
+\r
+ private static final Logger LOG = LoggerFactory.getLogger(VppRpcServiceImpl.class);\r
+\r
+ private final DataBroker dataBroker;\r
+ private final BridgeDomainManager bridgeDomainManager;\r
+ private final InterfaceManager interfaceManager;\r
+ private final MountedDataBrokerProvider mountDataProvider;\r
+\r
+ public VppRpcServiceImpl(@Nonnull DataBroker dataBroker, @Nonnull MountedDataBrokerProvider mountDataProvider,\r
+ BridgeDomainManager bridgeDomainManager, InterfaceManager interfaceManager) {\r
+ this.dataBroker = dataBroker;\r
+ this.bridgeDomainManager = bridgeDomainManager;\r
+ this.interfaceManager = interfaceManager;\r
+ this.mountDataProvider = mountDataProvider;\r
+ }\r
+\r
+ public Future<RpcResult<Void>> createVirtualBridgeDomain(CreateVirtualBridgeDomainOnNodesInput input) {\r
+ if (input.getTunnelType() == null) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(ErrorType.RPC,\r
+ "Failed to create bridge domain" + input.getId() + "." + "Tunnel type not specified")\r
+ .build());\r
+ }\r
+ List<ListenableFuture<Void>> futures = new ArrayList<>();\r
+ List<NodeId> nodeIds = input.getPhysicalLocationRef()\r
+ .stream()\r
+ .map(locationRef -> locationRef.getNodeId())\r
+ .collect(Collectors.toList());\r
+ if (input.getTunnelType() instanceof Vxlan) {\r
+ Vxlan tunnelType = (Vxlan) input.getTunnelType();\r
+ VxlanVni vxlanVni = new VxlanVni(tunnelType.getVni().getValue());\r
+ nodeIds.forEach(nodeId -> {\r
+ futures.add(bridgeDomainManager.createVxlanBridgeDomainOnVppNode(input.getId(), vxlanVni, nodeId));\r
+ });\r
+ } else if (input.getTunnelType() instanceof Vlan) {\r
+ Vlan vlan = (Vlan) input.getTunnelType();\r
+ VlanId vlanId = new VlanId(vlan.getVlanId().getValue());\r
+ nodeIds.forEach(nodeId -> {\r
+ futures.add(bridgeDomainManager.createVlanBridgeDomainOnVppNode(input.getId(), vlanId, nodeId));\r
+ });\r
+ }\r
+ return Futures.transform(Futures.allAsList(futures), voidsToRpcResult());\r
+ }\r
+\r
+ public Future<RpcResult<Void>> deleteVirtualBridgeDomain(DeleteVirtualBridgeDomainOnNodesInput input) {\r
+ List<ListenableFuture<Void>> futures = new ArrayList<>();\r
+ input.getBridgeDomainNode().forEach(nodeId -> {\r
+ futures.add(bridgeDomainManager.removeBridgeDomainFromVppNode(input.getBridgeDomainId(), nodeId));\r
+ });\r
+ return Futures.transform(Futures.allAsList(futures), voidsToRpcResult());\r
+ }\r
+\r
+ public ListenableFuture<RpcResult<Void>> expandVirtualBridgeDomainOnNode(ExpandVirtualBridgeDomainOnNodesInput input) {\r
+ List<ListenableFuture<Void>> futures = new ArrayList<>();\r
+ ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+ InstanceIdentifier<Topology> topologyIid = VppIidFactory.getTopologyIid(new TopologyKey(new TopologyId(\r
+ input.getBridgeDomainId())));\r
+ return Futures.transform(rTx.read(LogicalDatastoreType.OPERATIONAL, topologyIid),\r
+ new AsyncFunction<Optional<Topology>, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(Optional<Topology> optTopology) throws Exception {\r
+ if (!optTopology.isPresent()) {\r
+\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(\r
+ ErrorType.RPC,\r
+ "Failed to expand bridge domain. Bridge domain " + input.getBridgeDomainId()\r
+ + " does not exist.")\r
+ .build());\r
+ }\r
+ TopologyTypes topologyTypes = optTopology.get().getTopologyTypes();\r
+ if (topologyTypes == null\r
+ || topologyTypes.getAugmentation(TopologyTypesVbridgeAugment.class) == null\r
+ || optTopology.get().getAugmentation(TopologyVbridgeAugment.class) == null) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(\r
+ ErrorType.RPC,\r
+ "Failed to expand bridge domain. Topology " + input.getBridgeDomainId()\r
+ + " is not bridge domain type.")\r
+ .build());\r
+ }\r
+ TopologyVbridgeAugment vBridge = optTopology.get()\r
+ .getAugmentation(TopologyVbridgeAugment.class);\r
+ if (vBridge.getTunnelParameters() instanceof TunnelTypeVxlan) {\r
+ VxlanTunnelParameters vxlanTunnelParams = (VxlanTunnelParameters) vBridge.getTunnelParameters();\r
+ VxlanVni vni = vxlanTunnelParams.getVni();\r
+ input.getBridgeDomainNode().forEach(\r
+ nodeId -> {\r
+ futures.add(bridgeDomainManager.createVxlanBridgeDomainOnVppNode(\r
+ input.getBridgeDomainId(), vni, nodeId));\r
+ });\r
+ } else if (vBridge.getTunnelParameters() instanceof TunnelTypeVlan) {\r
+ VlanNetworkParameters vlanTunnelParams = (VlanNetworkParameters) vBridge.getTunnelParameters();\r
+ VlanId vlanId = vlanTunnelParams.getVlanId();\r
+ input.getBridgeDomainNode().forEach(\r
+ nodeId -> {\r
+ futures.add(bridgeDomainManager.createVlanBridgeDomainOnVppNode(\r
+ input.getBridgeDomainId(), vlanId, nodeId));\r
+ });\r
+ }\r
+ return Futures.transform(Futures.allAsList(futures), voidsToRpcResult());\r
+ }\r
+ });\r
+ }\r
+\r
+ public ListenableFuture<RpcResult<Void>> createInterfaceOnNode(CreateInterfaceOnNodeInput input) {\r
+ InterfaceTypeChoice interfaceType = input.getInterfaceTypeChoice();\r
+ ConfigCommand ifaceCommand = null;\r
+ if (interfaceType instanceof VhostUserCase) {\r
+ VhostUserCommandBuilder vhostBuilder = VhostUserCommand.builder();\r
+ vhostBuilder.setName(input.getVppInterfaceName());\r
+ VhostUserCase vhostCase = (VhostUserCase) input.getInterfaceTypeChoice();\r
+ vhostBuilder.setSocket(vhostCase.getSocket());\r
+ vhostBuilder.setRole(VhostUserRole.Client);\r
+ vhostBuilder.setDescription(input.getDescription());\r
+ vhostBuilder.setOperation(Operations.PUT);\r
+ ifaceCommand = vhostBuilder.build();\r
+ }\r
+ if (interfaceType instanceof TapCase) {\r
+ TapPortCommand.TapPortCommandBuilder tapBuilder = TapPortCommand.builder();\r
+ TapCase tapIface = (TapCase) input.getInterfaceTypeChoice();\r
+ tapBuilder.setTapName(tapIface.getName());\r
+ tapBuilder.setPhysAddress(tapIface.getPhysicalAddress());\r
+ tapBuilder.setInterfaceName(input.getVppInterfaceName());\r
+ tapBuilder.setDescription(input.getDescription());\r
+ tapBuilder.setOperation(Operations.PUT);\r
+ ifaceCommand = tapBuilder.build();\r
+ }\r
+ Optional<DataBroker> optDataBroker = mountDataProvider.getDataBrokerForMountPoint(input.getVppNodePath());\r
+ if (!optDataBroker.isPresent()) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(ErrorType.RPC, "Cannot find data broker for mount point " + input.getVppNodePath())\r
+ .build());\r
+ }\r
+ return Futures.transform(interfaceManager.createInterfaceOnVpp(ifaceCommand, optDataBroker.get()),\r
+ voidToRpcResult());\r
+ }\r
+\r
+ public ListenableFuture<RpcResult<Void>> deleteInterfaceOnNode(DeleteInterfaceInput input) {\r
+ return Futures.transform(readInterface(input.getVppNodePath(), input.getVppInterfaceName()),\r
+ new AsyncFunction<Optional<Interface>, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(Optional<Interface> optIface) throws Exception {\r
+ InterfaceKey iKey = new InterfaceKey(input.getVppInterfaceName());\r
+ if (!optIface.isPresent()) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(\r
+ ErrorType.RPC,\r
+ "Cannot delete interface " + iKey + " on node " + input.getVppNodePath()\r
+ + ". Not found or already deleted.")\r
+ .build());\r
+ }\r
+ Optional<DataBroker> dataBroker = mountDataProvider.getDataBrokerForMountPoint(input.getVppNodePath());\r
+ WriteTransaction wTx = dataBroker.get().newWriteOnlyTransaction();\r
+ wTx.delete(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(iKey));\r
+ return Futures.transform(wTx.submit(), voidToRpcResult());\r
+ }\r
+ });\r
+ }\r
+\r
+ public ListenableFuture<RpcResult<Void>> addInterfaceToBridgeDomain(AddInterfaceToBridgeDomainInput input) {\r
+ return Futures.transform(readInterface(input.getVppNodePath(), input.getVppInterfaceName()),\r
+ new AsyncFunction<Optional<Interface>, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(Optional<Interface> optIface) throws Exception {\r
+ InterfaceKey iKey = new InterfaceKey(input.getVppInterfaceName());\r
+ if (!optIface.isPresent()) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(\r
+ ErrorType.RPC,\r
+ "Cannot add interface " + iKey + " to bridge domain on node "\r
+ + input.getVppNodePath() + ". Not found or deleted.")\r
+ .build());\r
+ }\r
+ Optional<DataBroker> dataBroker = mountDataProvider.getDataBrokerForMountPoint(input.getVppNodePath());\r
+ return Futures.transform(interfaceManager.configureInterface(dataBroker.get(), iKey,\r
+ input.getBridgeDomainId(), null), voidToRpcResult());\r
+ }\r
+ });\r
+ }\r
+\r
+ public ListenableFuture<RpcResult<Void>> delInterfaceFromBridgeDomain(DelInterfaceFromBridgeDomainInput input) {\r
+ return Futures.transform(readInterface(input.getVppNodePath(), input.getVppInterfaceName()),\r
+ new AsyncFunction<Optional<Interface>, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(Optional<Interface> optIface) throws Exception {\r
+ if (!optIface.isPresent()) {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>failed()\r
+ .withError(\r
+ ErrorType.RPC,\r
+ "Cannot remove interface " + input.getVppInterfaceName()\r
+ + " from bridge domain on node " + input.getVppNodePath()\r
+ + ". Not found or deleted.")\r
+ .build());\r
+ }\r
+ Optional<DataBroker> dataBroker = mountDataProvider.getDataBrokerForMountPoint(input.getVppNodePath());\r
+ return Futures.transform(interfaceManager.removeInterfaceFromBridgeDomain(dataBroker.get(),\r
+ optIface.get().getKey()), voidToRpcResult());\r
+ }\r
+ });\r
+ }\r
+\r
+ private CheckedFuture<Optional<Interface>, ReadFailedException> readInterface(InstanceIdentifier<?> nodeIid,\r
+ String interfaceName) {\r
+ Optional<DataBroker> optDataBroker = mountDataProvider.getDataBrokerForMountPoint(nodeIid);\r
+ if (!optDataBroker.isPresent()) {\r
+ LOG.error("Cannot find data broker for node {}", nodeIid);\r
+ return Futures.immediateCheckedFuture(Optional.absent());\r
+ }\r
+ ReadOnlyTransaction rwTx = optDataBroker.get().newReadOnlyTransaction();\r
+ InterfaceKey iKey = new InterfaceKey(interfaceName);\r
+ InstanceIdentifier<Interface> interfaceIID = VppIidFactory.getInterfaceIID(iKey);\r
+ CheckedFuture<Optional<Interface>, ReadFailedException> readInterface = rwTx.read(\r
+ LogicalDatastoreType.CONFIGURATION, interfaceIID);\r
+ rwTx.close();\r
+ return readInterface;\r
+ }\r
+\r
+ private AsyncFunction<Void, RpcResult<Void>> voidToRpcResult() {\r
+ return new AsyncFunction<Void, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(Void input) throws Exception {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());\r
+ }\r
+ };\r
+ }\r
+\r
+ private AsyncFunction<List<Void>, RpcResult<Void>> voidsToRpcResult() {\r
+ return new AsyncFunction<List<Void>, RpcResult<Void>>() {\r
+\r
+ @Override\r
+ public ListenableFuture<RpcResult<Void>> apply(List<Void> input) throws Exception {\r
+ return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());\r
+ }\r
+ };\r
+ }\r
+}\r
package org.opendaylight.groupbasedpolicy.renderer.vpp.iface;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.eventbus.Subscribe;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.LocationType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint.InterfaceTypeChoice;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.LoopbackCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUserRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
public class InterfaceManager implements AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class);
return Futures.immediateFuture(null);
}
DataBroker vppDataBroker = potentialVppDataProvider.get();
- return createInterfaceOnVpp(ifaceWithoutBdCommand, vppDataBroker, vppEndpoint, vppNodeIid);
+ return Futures.transform(createInterfaceOnVpp(ifaceWithoutBdCommand, vppDataBroker),
+ new AsyncFunction<Void, Void>() {
+
+ @Override
+ public ListenableFuture<Void> apply(@Nonnull Void input) {
+ LOG.debug("Create interface on VPP command was successful. VPP: {} Command: {}", vppNodeIid,
+ ifaceWithoutBdCommand);
+ return vppEndpointLocationProvider.createLocationForVppEndpoint(vppEndpoint);
+ }
+ }, netconfWorker);
}
- private ListenableFuture<Void> createInterfaceOnVpp(ConfigCommand createIfaceWithoutBdCommand, DataBroker vppDataBroker,
- VppEndpoint vppEndpoint, InstanceIdentifier<?> vppNodeIid) {
+ public ListenableFuture<Void> createInterfaceOnVpp(ConfigCommand createIfaceWithoutBdCommand,
+ DataBroker vppDataBroker) {
final ReadWriteTransaction rwTx = vppDataBroker.newReadWriteTransaction();
createIfaceWithoutBdCommand.execute(rwTx);
LOG.trace("Creating Interface on VPP: {}", createIfaceWithoutBdCommand);
- return Futures.transform(rwTx.submit(), new AsyncFunction<Void, Void>() {
-
- @Override
- public ListenableFuture<Void> apply(@Nonnull Void input) {
- LOG.debug("Create interface on VPP command was successful. VPP: {} Command: {}", vppNodeIid,
- createIfaceWithoutBdCommand);
- return vppEndpointLocationProvider.createLocationForVppEndpoint(vppEndpoint);
- }
- }, netconfWorker);
+ return rwTx.submit();
}
private ListenableFuture<Void> vppEndpointUpdated(@Nonnull final VppEndpoint oldVppEndpoint,
return Futures.immediateFuture(null);
}
DataBroker vppDataBroker = potentialVppDataProvider.get();
- return deleteIfaceOnVpp(ifaceWithoutBdCommand, vppDataBroker, vppEndpoint, vppNodeIid);
+ return Futures.transform(deleteIfaceOnVpp(ifaceWithoutBdCommand, vppDataBroker),
+ new AsyncFunction<Void, Void>() {
+
+ @Override
+ public ListenableFuture<Void> apply(Void input) {
+ LOG.debug("Delete interface on VPP command was successful: VPP: {} Command: {}", vppNodeIid,
+ ifaceWithoutBdCommand);
+ return vppEndpointLocationProvider.deleteLocationForVppEndpoint(vppEndpoint);
+ }
+ }, netconfWorker);
}
- private ListenableFuture<Void> deleteIfaceOnVpp(ConfigCommand deleteIfaceWithoutBdCommand,
- DataBroker vppDataBroker, VppEndpoint vppEndpoint, InstanceIdentifier<?> vppNodeIid) {
+ public ListenableFuture<Void> deleteIfaceOnVpp(ConfigCommand deleteIfaceWithoutBdCommand, DataBroker vppDataBroker) {
ReadWriteTransaction rwTx = vppDataBroker.newReadWriteTransaction();
deleteIfaceWithoutBdCommand.execute(rwTx);
LOG.trace("Deleting Interface on VPP: {}", deleteIfaceWithoutBdCommand);
-
- return Futures.transform(rwTx.submit(), new AsyncFunction<Void, Void>() {
-
- @Override
- public ListenableFuture<Void> apply(Void input) {
- LOG.debug("Delete interface on VPP command was successful: VPP: {} Command: {}", vppNodeIid,
- deleteIfaceWithoutBdCommand);
- return vppEndpointLocationProvider.deleteLocationForVppEndpoint(vppEndpoint);
- }
- }, netconfWorker);
+ return rwTx.submit();
}
@Subscribe
}
}
- private static Optional<ConfigCommand> createInterfaceWithoutBdCommand(@Nonnull VppEndpoint vppEp,
+ public static Optional<ConfigCommand> createInterfaceWithoutBdCommand(@Nonnull VppEndpoint vppEp,
@Nonnull Operations operations) {
if (!hasNodeAndInterface(vppEp)) {
LOG.debug("Interface command is not created for {}", vppEp);
new Exception("Cannot resolve interface instance-identifier for interface path" + interfacePath));
}
InstanceIdentifier<Interface> interfaceIid = optInterfaceIid.get();
-
Optional<DataBroker> potentialVppDataProvider = mountDataProvider.getDataBrokerForMountPoint(vppNodeIid);
if (!potentialVppDataProvider.isPresent()) {
return Futures.immediateFailedFuture(new Exception("Cannot get data broker for mount point " + vppNodeIid));
return Futures.immediateFailedFuture(new Exception("Interface "
+ interfaceIid.firstKeyOf(Interface.class) + " does not exist on node " + vppNodeIid));
}
-
String existingBridgeDomain = resolveBridgeDomain(optIface.get());
if (bridgeDomainName.equals(existingBridgeDomain)) {
LOG.debug("Bridge domain {} already exists on interface {}", bridgeDomainName, interfacePath);
}
return Futures.immediateFuture(null);
}
- InstanceIdentifier<L2> l2Iid =
- interfaceIid.builder().augmentation(VppInterfaceAugmentation.class).child(L2.class).build();
- final ReadWriteTransaction rwTxRead = mountpoint.newReadWriteTransaction();
- Optional<L2> optL2 = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, l2Iid, rwTxRead);
- L2Builder l2Builder = (optL2.isPresent()) ? new L2Builder(optL2.get()) : new L2Builder();
- L2 l2 = l2Builder.setInterconnection(new BridgeBasedBuilder()
- .setBridgeDomain(bridgeDomainName)
- .setBridgedVirtualInterface(enableBvi)
- .build()).build();
- final ReadWriteTransaction rwTxPut = prepareTransactionAndPutData(mountpoint, l2, l2Iid);
- LOG.debug("Adding bridge domain {} to interface {}", bridgeDomainName, interfacePath);
- return Futures.transform(rwTxPut.submit(), new AsyncFunction<Void, Void>() {
+ return Futures.transform(
+ configureInterface(mountpoint, optIface.get().getKey(), bridgeDomainName, enableBvi),
+ new AsyncFunction<Void, Void>() {
@Override
public ListenableFuture<Void> apply(@Nonnull Void input) {
}, netconfWorker);
}
+ public ListenableFuture<Void> configureInterface(DataBroker mountPoint, InterfaceKey ifaceKey, @Nullable String bridgeDomainName, @Nullable Boolean enableBvi) {
+ L2Builder l2Builder = readL2ForInterface(mountPoint, ifaceKey);
+ L2 l2 = l2Builder.setInterconnection(new BridgeBasedBuilder()
+ .setBridgeDomain(bridgeDomainName)
+ .setBridgedVirtualInterface(enableBvi)
+ .build()).build();
+ final ReadWriteTransaction rwTxPut = prepareTransactionAndPutData(mountPoint, l2, VppIidFactory.getL2ForInterfaceIid(ifaceKey));
+ LOG.debug("Adding bridge domain {} to interface {}", bridgeDomainName, VppIidFactory.getInterfaceIID(ifaceKey));
+ return rwTxPut.submit();
+ }
+
+ public ListenableFuture<Void> removeInterfaceFromBridgeDomain(DataBroker mountPoint, InterfaceKey ifaceKey) {
+ L2Builder l2Builder = readL2ForInterface(mountPoint, ifaceKey);
+ if (l2Builder.getInterconnection() == null || !(l2Builder.getInterconnection() instanceof BridgeBased)) {
+ LOG.warn("Interface already not in bridge domain {} ", ifaceKey);
+ return Futures.immediateFuture(null);
+ }
+ BridgeBased bridgeBased = new BridgeBasedBuilder((BridgeBased) l2Builder.getInterconnection()).setBridgeDomain(
+ null).build();
+ L2 l2 = l2Builder.setInterconnection(bridgeBased).build();
+ final ReadWriteTransaction rwTxPut = prepareTransactionAndPutData(mountPoint, l2,
+ VppIidFactory.getL2ForInterfaceIid(ifaceKey));
+ LOG.debug("Removing bridge domain from interface {}", VppIidFactory.getInterfaceIID(ifaceKey));
+ return rwTxPut.submit();
+ }
+
+ private L2Builder readL2ForInterface(DataBroker mountpoint, InterfaceKey ifaceKey) {
+ InstanceIdentifier<L2> l2Iid = VppIidFactory.getL2ForInterfaceIid(ifaceKey);
+ final ReadWriteTransaction rwTxRead = mountpoint.newReadWriteTransaction();
+ Optional<L2> optL2 = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, l2Iid, rwTxRead);
+ return (optL2.isPresent()) ? new L2Builder(optL2.get()) : new L2Builder();
+ }
+
/**
* Removes bridge domain (if exist) from an interface (if exist).<br>
* {@link VppEndpointLocationProvider#VPP_ENDPOINT_LOCATION_PROVIDER} will update endpoint
package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanVni;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
public class BridgeDomainManagerImpl implements BridgeDomainManager {
private static final Logger LOG = LoggerFactory.getLogger(BridgeDomainManagerImpl.class);
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpBridgeDomainKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint.InterfaceTypeChoice;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.LoopbackCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes.InterfaceTypeChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.LoopbackCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanVni;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomains;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
return InstanceIdentifier.create(Interfaces.class).child(Interface.class, interfaceKey);
}
+ public static InstanceIdentifier<L2> getL2ForInterfaceIid(InterfaceKey interfaceKey) {
+ return getInterfaceIID(interfaceKey).builder()
+ .augmentation(VppInterfaceAugmentation.class)
+ .child(L2.class)
+ .build();
+ }
+
public static InstanceIdentifier<Renderer> getRendererIID(RendererKey rendererKey) {
return InstanceIdentifier.create(Renderers.class).child(Renderer.class, rendererKey);
}
<argument ref="broker"/>
<argument ref="clusterSingletonService" />
</bean>
+
+ <odl:rpc-implementation ref="vppRenderer"/>
+
</blueprint>
\ No newline at end of file
--- /dev/null
+/*
+ * 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
+ */
+
+module vpp-adapter {
+ yang-version 1;
+
+ namespace "urn:opendaylight:groupbasedpolicy:vpp_adapter";
+ prefix "vpp-adapter";
+
+ import vpp-renderer { prefix "vpp-renderer"; }
+ import network-topology { prefix nt; revision-date 2013-10-21; }
+ import opendaylight-l2-types { prefix l2-types; revision-date "2013-08-27"; }
+ import ietf-yang-types { prefix yang-types; revision-date "2013-07-15"; }
+ import ietf-inet-types { prefix "inet-types"; }
+
+ description
+ "This module allows external plugins to use VPP renderer by calling defined RPCs.";
+
+ revision "2016-12-01" {
+ description
+ "Initial revision.";
+ }
+
+ typedef vxlan-vni-type {
+ type uint32 {
+ range "1 .. 16777214";
+ }
+ }
+
+ grouping bridge-domain-attributes {
+ uses vpp-renderer:bridge-domain-base-attributes;
+ leaf unknown-unicast-flood {
+ type boolean;
+ default "False";
+ }
+ choice tunnel-type {
+ case vxlan {
+ leaf vni {
+ type vxlan-vni-type;
+ }
+ }
+ case vlan {
+ leaf vlan-id {
+ type l2-types:vlan-id;
+ }
+ }
+ }
+ }
+
+ grouping bridge-domain-nodes {
+ uses bridge-domain-id;
+ leaf-list bridge-domain-node {
+ min-elements 1;
+ type nt:node-id;
+ }
+ }
+
+ grouping bridge-domain-id {
+ leaf bridge-domain-id {
+ mandatory true;
+ type string;
+ }
+ }
+
+ rpc create-virtual-bridge-domain-on-nodes {
+ input {
+ uses bridge-domain-attributes;
+ }
+ }
+
+ rpc expand-virtual-bridge-domain-on-nodes {
+ input {
+ uses bridge-domain-nodes;
+ }
+ }
+
+ rpc delete-virtual-bridge-domain-on-nodes {
+ input {
+ uses bridge-domain-nodes;
+ }
+ }
+
+ rpc create-interface-on-node {
+ input {
+ uses vpp-renderer:interface-attributes;
+ }
+ }
+
+ rpc delete-interface {
+ input {
+ uses vpp-renderer:interface-location;
+ }
+ }
+
+ rpc add-interface-to-bridge-domain {
+ input {
+ uses vpp-renderer:interface-location;
+ uses bridge-domain-id;
+ }
+ }
+
+ rpc del-interface-from-bridge-domain {
+ input {
+ uses vpp-renderer:interface-location;
+ }
+ }
+}
}
}
- container config {
- list vpp-endpoint {
- description "Renderer creates/removes interface on VPP node based on given parameters.";
-
- key "context-type context-id address-type address";
- uses base-ep:address-endpoint-key;
-
- leaf vpp-node-path {
- description "Path to a node representing mount-point to VPP instance.";
- mandatory true;
- type instance-identifier;
- }
- leaf vpp-interface-name {
- description "Name of interface for the endpoint on VPP";
- mandatory true;
- type string;
+ grouping bridge-domain-base-attributes {
+ leaf id {
+ description "Same as in VBD.";
+ type string;
+ }
+ leaf description {
+ type string;
+ }
+ list physical-location-ref {
+ description
+ "Refers to physical interfaces on vpp nodes through which external
+ nodes belonging to the same bridge-domain can be reached.";
+ key "node-id";
+ leaf node-id {
+ description "Refers to a VPP node.";
+ type nt:node-id;
}
- leaf description {
- description "Additional description of the vpp-endpoint";
+ leaf-list interface {
+ description "Physical interface on the VPP node.";
type string;
}
- choice interface-type-choice {
- case vhost-user-case {
- leaf socket {
- description "Identifier of a vhost user";
- type string {
- length 1..255;
- }
+ }
+ }
+
+ grouping interface-attributes {
+ uses vpp-renderer:interface-location;
+ leaf description {
+ description "Additional description of the vpp-endpoint";
+ type string;
+ }
+ choice interface-type-choice {
+ mandatory true;
+ case vhost-user-case {
+ leaf socket {
+ description "Identifier of a vhost user";
+ type string {
+ length 1..255;
}
}
- case tap-case {
- leaf name {
- description "Identifier of a tap port";
- mandatory true;
- type string {
- length 1..255;
- }
- }
- leaf physical-address {
- description "MAC address of a tap port";
- type yang-types:phys-address;
+ }
+ case tap-case {
+ leaf name {
+ description "Identifier of a tap port";
+ mandatory true;
+ type string {
+ length 1..255;
}
}
- case loopback-case {
- leaf phys-address {
- description "MAC address of a loopback interface";
- type yang-types:phys-address;
- }
- leaf ip-address {
- description "Ip address of a loopback interface";
- type inet-types:ip-address;
- }
- leaf ip-prefix {
- description "Ip address prefix of a loopback interface";
- type inet-types:ip-prefix;
- }
- leaf bvi {
- description "Enable/disable BVI for loopback interface";
- type boolean;
- }
+ leaf physical-address {
+ description "MAC address of a tap port";
+ type yang-types:phys-address;
+ }
+ }
+ case loopback-case {
+ leaf phys-address {
+ description "MAC address of a loopback interface";
+ type yang-types:phys-address;
+ }
+ leaf ip-address {
+ description "Ip address of a loopback interface";
+ type inet-types:ip-address;
+ }
+ leaf ip-prefix {
+ description "Ip address prefix of a loopback interface";
+ type inet-types:ip-prefix;
+ }
+ leaf bvi {
+ description "Enable/disable BVI for loopback interface";
+ type boolean;
}
}
}
+ }
+
+ grouping interface-location {
+ leaf vpp-node-path {
+ description "Path to a node representing mount-point to VPP instance.";
+ mandatory true;
+ type instance-identifier;
+ }
+ leaf vpp-interface-name {
+ description "Name of interface for the endpoint on VPP";
+ mandatory true;
+ type string;
+ }
+ }
+
+ container config {
+ list vpp-endpoint {
+ description "Renderer creates/removes interface on VPP node based on given parameters.";
+
+ key "context-type context-id address-type address";
+ uses base-ep:address-endpoint-key;
+
+ uses interface-attributes;
+ }
list gbp-bridge-domain {
key "id";
- leaf id {
- description "Same as in VBD.";
- type string;
- }
- leaf description {
- type string;
- }
+ uses bridge-domain-base-attributes;
leaf type {
mandatory true;
type network-type;
when "type = 'vlan-network'";
type l2-types:vlan-id;
}
- list physical-location-ref {
- description
- "Refers to physical interfaces on vpp nodes through which external
- nodes belonging to the same bridge-domain can be reached.";
- key "node-id";
- leaf node-id {
- description "Refers to a VPP node.";
- type nt:node-id;
- }
- leaf-list interface {
- description "Physical interface on the VPP node.";
- type string;
- }
- }
}
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUser;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUserRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.gbp.bridge.domain.PhysicalLocationRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.bridge.domain.base.attributes.PhysicalLocationRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanVni;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2;