import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInputBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHop;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocator;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.LocatorType;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.Ip;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.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.ios.rev160308.Native;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServicePath;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServicePathBuilder;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServicePathKey;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.Local;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.LocalBuilder;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfNameBuilder;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfNameKey;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.path.ConfigServiceChainPathModeBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.security.cert.PKIXRevocationChecker;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
return reversedRenderedPath;
}
- /**
- * Method checks up, whether a {@link Local} Service Function Forwarder is present on device or not.
- *
- * @param mountpoint used to access specific device
- * @return true if Local Forwarder is present, false otherwise
- */
- private static boolean checkLocalForwarderPresence(DataBroker mountpoint) {
- InstanceIdentifier<Local> localSffIid = InstanceIdentifier.builder(Native.class)
- .child(ServiceChain.class)
- .child(org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.ServiceFunctionForwarder.class)
- .child(Local.class).build();
- try {
- java.util.Optional<ReadOnlyTransaction> optionalTransaction =
- NetconfTransactionCreator.netconfReadOnlyTransaction(mountpoint);
- if (!optionalTransaction.isPresent()) {
- LOG.warn("Failed to create transaction, mountpoint: {}", mountpoint);
- return false;
- }
- ReadOnlyTransaction transaction = optionalTransaction.get();
- CheckedFuture<Optional<Local>, ReadFailedException> submitFuture =
- transaction.read(LogicalDatastoreType.CONFIGURATION,
- localSffIid);
- Optional<Local> optionalLocalSff = submitFuture.checkedGet();
- transaction.close(); // Release lock
- return optionalLocalSff.isPresent();
- } catch (ReadFailedException e) {
- LOG.warn("Read transaction failed to {} ", e);
- } catch (Exception e) {
- LOG.error("Failed to .. {}", e.getMessage());
- }
- return false;
- }
-
/**
* Method checks up, if some {@link ServicePath} is present on device.
*
static boolean setSfcPart(final ServiceFunctionPath serviceFunctionPath, final RenderedServicePath renderedServicePath,
final RenderedServicePath reversedRenderedServicePath, PolicyWriter policyWriter) {
- if (!checkLocalForwarderPresence(policyWriter.getCurrentMountpoint())) {
- appendLocalSff(policyWriter);
- } else {
- LOG.info("Local forwarder for node {} is already created", policyWriter.getCurrentNodeId());
- }
boolean outcome = true;
// Direct path
final java.util.Optional<RenderedServicePath> renderedServicePathSafe = java.util.Optional.ofNullable(renderedServicePath);
if (!resolveRenderedServicePath(renderedServicePath, policyWriter)) {
outcome = false;
}
- }
- else {
+ } else {
LOG.warn("Rendered service path {} does not contain any hop",
renderedServicePathSafe.map(RenderedServicePath::getName).map(RspName::getValue).orElse("n/a"));
outcome = false;
}
- }
- else {
+ } else {
LOG.warn("Rendered service path is null");
outcome = false;
}
// forwarder (Remote case)
final java.util.Optional<ServiceFunctionForwarder> serviceFunctionForwarder = java.util.Optional.ofNullable(
- SfcProviderServiceForwarderAPI.readServiceFunctionForwarder(sffName));
- return serviceFunctionForwarder.map(sff -> java.util.Optional.ofNullable(IetfModelCodec.ipAddress2010(sff.getIpMgmtAddress()))
- .map(IpAddress::getIpv4Address)
- .map((ipv4Address) -> ipv4Address.getValue())
+ SfcProviderServiceForwarderAPI.readServiceFunctionForwarder(sffName));
+ if (!serviceFunctionForwarder.isPresent()) {
+ LOG.warn("Service function forwarder {} does not exist", sffName.getValue());
+ return false;
+ }
+ final ServiceFunctionForwarder forwarder = serviceFunctionForwarder.get();
+ if (forwarder.getSffDataPlaneLocator() == null || forwarder.getSffDataPlaneLocator().isEmpty()) {
+ LOG.warn("Service function forwarder {} does not contain data plane locator", sffName.getValue());
+ return false;
+ }
+ // TODO only first dpl resolved
+ final SffDataPlaneLocator sffDataPlaneLocator = forwarder.getSffDataPlaneLocator().get(0);
+ final DataPlaneLocator dataPlaneLocator = sffDataPlaneLocator.getDataPlaneLocator();
+ final LocatorType locatorType = dataPlaneLocator.getLocatorType();
+ if (locatorType != null && locatorType instanceof Ip) {
+ final IpAddress remoteForwarderIpAddress = IetfModelCodec.ipAddress2010(((Ip) locatorType).getIp());
+ if (remoteForwarderIpAddress == null || remoteForwarderIpAddress.getIpv4Address() == null) {
+ LOG.warn("Service function forwarder {} data plane locator does not contain ip address", sffName.getValue());
+ return false;
+ }
+ final String remoteForwarderStringIp = remoteForwarderIpAddress.getIpv4Address().getValue();
+ return serviceFunctionForwarder.map(sff -> java.util.Optional.ofNullable(sff.getIpMgmtAddress())
+ .map(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress::getIpv4Address)
+ .map(Ipv4Address::getValue)
.map(addressValue -> {
// Set up choice. If remote, this choice is overwritten
final ServiceTypeChoice serviceTypeChoice;
final ServiceFfNameBuilder remoteSffBuilder = new ServiceFfNameBuilder();
remoteSffBuilder.setName(sffName.getValue())
.setKey(new ServiceFfNameKey(sffName.getValue()))
- .setIp(new IpBuilder().setAddress(new Ipv4Address(addressValue)).build());
+ .setIp(new IpBuilder().setAddress(new Ipv4Address(remoteForwarderStringIp)).build());
policyWriter.cache(remoteSffBuilder.build());
serviceTypeChoice = forwarderTypeChoice(sffName.getValue());
} else {
).orElseGet(createNegativePathWithLogSupplier(sffName.getValue(),
(value) -> LOG.error("Sff with name {} does not exist", value))
);
- }
-
- private static void appendLocalSff(final PolicyWriter policyWriter) {
- final LocalBuilder localSffBuilder = new LocalBuilder();
- localSffBuilder.setIp(new IpBuilder().setAddress(new Ipv4Address(policyWriter.getManagementIpAddress()))
- .build());
- policyWriter.cache(localSffBuilder.build());
+ }
+ return false;
}
static ServiceTypeChoice forwarderTypeChoice(final String forwarderName) {
private static void checkSfcRspStatus(final RspName rspName, final DataBroker dataBroker) {
/** TODO A better way to do this is to register listener and wait for notification than using hardcoded timeout
* with Thread.sleep(). Example in class BridgeDomainManagerImpl
- */
+ */
ConfiguredRenderedPath renderedPath = null;
LOG.info("Waiting for SFC to configure path {} ...", rspName.getValue());
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ServiceChain;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.policy.map.Class;
-import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.Local;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.service.chain.service.function.forwarder.ServiceFfName;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.slf4j.Logger;
private final String interfaceName;
private final String policyMapName;
private final String managementIpAddress;
- private Local localForwarder;
public PolicyWriter(final DataBroker dataBroker, final String interfaceName, final String ipAddress,
final String policyMapName, final NodeId nodeId) {
this.policyMapEntries.addAll(policyMapEntries);
}
- public void cache(Local localForwarder) {
- this.localForwarder = localForwarder;
- }
-
public void cache(ServiceFfName remoteForwarder) {
remoteForwarders.add(remoteForwarder);
}
public CheckedFuture<Boolean, TransactionCommitFailedException> commitToDatastore() {
LOG.info("Configuring policy on node {} ... ", nodeId.getValue());
// SFC
- boolean localResult = PolicyWriterUtil.writeLocal(localForwarder, nodeId, mountpoint);
boolean remoteResult = PolicyWriterUtil.writeRemote(remoteForwarders, nodeId, mountpoint);
boolean servicePathsResult = PolicyWriterUtil.writeServicePaths(serviceChains, nodeId, mountpoint);
// GBP - maintain order!
boolean interfaceResult = PolicyWriterUtil.writeInterface(policyMapName, interfaceName, nodeId, mountpoint);
// Result
LOG.info("Policy configuration on node {} completed", nodeId.getValue());
- return Futures.immediateCheckedFuture(classMapResult && policyMapResult && interfaceResult && localResult
- && remoteResult && servicePathsResult);
+ return Futures.immediateCheckedFuture(classMapResult && policyMapResult && interfaceResult && remoteResult
+ && servicePathsResult);
}
public CheckedFuture<Boolean, TransactionCommitFailedException> removeFromDatastore() {
// TODO remove class map?
// SFC
boolean servicePathsResult = PolicyWriterUtil.removeServicePaths(serviceChains, nodeId, mountpoint);
- boolean localResult = PolicyWriterUtil.removeLocal(nodeId, mountpoint);
// TODO remove remote forwarders
// Result
LOG.info("Policy removed from node {}", nodeId.getValue());
- return Futures.immediateCheckedFuture(classMapResult && policyMapEntriesResult && servicePathsResult
- && localResult);
+ return Futures.immediateCheckedFuture(classMapResult && policyMapEntriesResult && servicePathsResult);
}
public String getManagementIpAddress() {
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHop;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocatorBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPathsBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Test for {@link ServiceChainingUtil}.
*/
@Test
public void testSetSfcPart_success() throws Exception {
final RenderedServicePath rsp = createRsp("unit-rsp-03");
+ final DataPlaneLocatorBuilder dataPlaneLocatorBuilder = new DataPlaneLocatorBuilder();
+ final IpBuilder ipBuilderLocatorType = new IpBuilder();
+ ipBuilderLocatorType.setIp(IetfModelCodec.ipAddress2013(new IpAddress(new Ipv4Address("1.2.3.4"))));
+ dataPlaneLocatorBuilder.setLocatorType(ipBuilderLocatorType.build());
+ final SffDataPlaneLocatorBuilder sffDataPlaneLocatorBuilder = new SffDataPlaneLocatorBuilder();
+ sffDataPlaneLocatorBuilder.setDataPlaneLocator(dataPlaneLocatorBuilder.build());
final org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder
sff = new ServiceFunctionForwarderBuilder()
.setName(new SffName("unit-sff-03"))
.setIpMgmtAddress(IetfModelCodec.ipAddress2013(new IpAddress(new Ipv4Address("1.2.3.4"))))
+ .setSffDataPlaneLocator(Collections.singletonList(sffDataPlaneLocatorBuilder.build()))
.build();
final ServiceFunctionPathBuilder sfpBuilder = new ServiceFunctionPathBuilder();
sfpBuilder.setSymmetric(false);
final ServiceFunctionPath sfp = sfpBuilder.build();
- stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
-
PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(sff);
Mockito.verify(policyWriter).cache(Matchers.<ServiceFfName>any());
Mockito.verify(policyWriter).cache(Matchers.<ServiceChain>any());
- Mockito.verify(policyWriter).getCurrentNodeId();
- Mockito.verify(policyWriter).getCurrentMountpoint();
Mockito.verify(policyWriter).getManagementIpAddress();
Mockito.verifyNoMoreInteractions(policyWriter);
}
@Test
public void testSetSfcPart_success_newRsp() throws Exception {
final RenderedServicePath rsp = createRsp("unit-rsp-03");
+ final DataPlaneLocatorBuilder dataPlaneLocatorBuilder = new DataPlaneLocatorBuilder();
+ final IpBuilder ipBuilderLocatorType = new IpBuilder();
+ ipBuilderLocatorType.setIp(IetfModelCodec.ipAddress2013(new IpAddress(new Ipv4Address("1.2.3.4"))));
+ dataPlaneLocatorBuilder.setLocatorType(ipBuilderLocatorType.build());
+ final SffDataPlaneLocatorBuilder sffDataPlaneLocatorBuilder = new SffDataPlaneLocatorBuilder();
+ sffDataPlaneLocatorBuilder.setDataPlaneLocator(dataPlaneLocatorBuilder.build());
final org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder
sff = new ServiceFunctionForwarderBuilder()
.setName(new SffName("unit-sff-03"))
.setIpMgmtAddress(IetfModelCodec.ipAddress2013(new IpAddress(new Ipv4Address("1.2.3.4"))))
+ .setSffDataPlaneLocator(Collections.singletonList(sffDataPlaneLocatorBuilder.build()))
.build();
final ServiceFunctionPathBuilder sfpBuilder = new ServiceFunctionPathBuilder();
sfpBuilder.setSymmetric(false);
final ServiceFunctionPath sfp = sfpBuilder.build();
- stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(false);
-
PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(sff);
Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
Assert.assertTrue(outcome);
- Mockito.verify(policyWriter).cache(Matchers.<Local>any());
Mockito.verify(policyWriter).cache(Matchers.<ServiceFfName>any());
Mockito.verify(policyWriter).cache(Matchers.<ServiceChain>any());
- Mockito.verify(policyWriter).getCurrentMountpoint();
- Mockito.verify(policyWriter, Mockito.times(2)).getManagementIpAddress();
+ Mockito.verify(policyWriter).getManagementIpAddress();
Mockito.verifyNoMoreInteractions(policyWriter);
}
Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
Assert.assertFalse(outcome);
- Mockito.verify(policyWriter).getCurrentMountpoint();
- Mockito.verify(policyWriter).getManagementIpAddress();
- Mockito.verify(policyWriter).cache(Matchers.<Local>any());
Mockito.verifyNoMoreInteractions(policyWriter);
}
sfpBuilder.setSymmetric(false);
final ServiceFunctionPath sfp = sfpBuilder.build();
- stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
-
PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(
Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
- Mockito.verify(policyWriter).getCurrentMountpoint();
- Mockito.verify(policyWriter).getCurrentNodeId();
Mockito.verifyNoMoreInteractions(policyWriter);
}
sfpBuilder.setSymmetric(false);
final ServiceFunctionPath sfp = sfpBuilder.build();
- stub(method(ServiceChainingUtil.class, "checkLocalForwarderPresence")).toReturn(true);
-
PowerMockito.mockStatic(SfcProviderServiceForwarderAPI.class);
final SfcProviderServiceForwarderAPI api = PowerMockito.mock(SfcProviderServiceForwarderAPI.class);
PowerMockito.when(api.readServiceFunctionForwarder(sffNameCaptor.capture())).thenReturn(
Assert.assertEquals("rsp-hop-01-sf+sff", sffNameCaptor.getValue().getValue());
- Mockito.verify(policyWriter).getCurrentMountpoint();
- Mockito.verify(policyWriter).getCurrentNodeId();
Mockito.verifyNoMoreInteractions(policyWriter);
}