<groupId>org.opendaylight.sxp</groupId>
<artifactId>sxp-controller</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.sxp</groupId>
+ <artifactId>sxp-core</artifactId>
+ </dependency>
<dependency>
<groupId>org.opendaylight.groupbasedpolicy</groupId>
<artifactId>groupbasedpolicy</artifactId>
<version>${project.version}</version>
</dependency>
- <!-- testing dependencies -->
+ <!-- testing dependencies -->
<dependency>
<groupId>org.opendaylight.groupbasedpolicy</groupId>
<artifactId>groupbasedpolicy</artifactId>
package org.opendaylight.controller.config.yang.config.ip.sgt.distribution.service.cfg;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.Future;
-
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.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.groupbasedpolicy.ip.sgt.distribution.service.impl.IpSgtDistributionServiceImpl;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
public class IpSgtDistributionServiceInstance
implements ClusterSingletonService, IpSgtDistributionService, AutoCloseable {
private static final ServiceGroupIdentifier IDENTIFIER =
ServiceGroupIdentifier.create(GroupbasedpolicyInstance.GBP_SERVICE_GROUP_IDENTIFIER);
private IpSgtDistributionServiceImpl ipSgtDistributionServiceImpl;
- private DataBroker dataBroker;
- private SxpControllerService sxpService;
- private IpAddress sourceIp;
- private ClusterSingletonServiceProvider clusterSingletonService;
+ private final DataBroker dataBroker;
+ private final SxpControllerService sxpService;
+ private final IpAddress sourceIp;
+ private final ClusterSingletonServiceProvider clusterSingletonService;
+ private final RpcProviderRegistry rpcProviderRegistry;
private ClusterSingletonServiceRegistration singletonServiceRegistration;
+ private BindingAwareBroker.RpcRegistration<IpSgtDistributionService> rpcRegistration;
- public IpSgtDistributionServiceInstance(final DataBroker dataBroker, final SxpControllerService sxpService,
- final String sourceIp, final ClusterSingletonServiceProvider clusterSingletonService) {
+ public IpSgtDistributionServiceInstance(final DataBroker dataBroker,
+ final String sourceIp, final ClusterSingletonServiceProvider clusterSingletonService,
+ final RpcProviderRegistry rpcProviderRegistry) {
this.dataBroker = Preconditions.checkNotNull(dataBroker);
- this.sxpService = Preconditions.checkNotNull(sxpService);
+ this.sxpService = Preconditions.checkNotNull(rpcProviderRegistry.getRpcService(SxpControllerService.class));
this.sourceIp = new IpAddress(Preconditions.checkNotNull(sourceIp.toCharArray()));
this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService);
+ this.rpcProviderRegistry = Preconditions.checkNotNull(rpcProviderRegistry);
}
public void initialize() {
LOG.info("Instance {} closed", this.getClass().getSimpleName());
try {
ipSgtDistributionServiceImpl.close();
+ rpcRegistration.close();
} catch (Exception e) {
LOG.error("Closing {} wasnt succesfull", ipSgtDistributionServiceImpl.getClass().getSimpleName());
}
@Override
public void instantiateServiceInstance() {
ipSgtDistributionServiceImpl = new IpSgtDistributionServiceImpl(dataBroker, sxpService, sourceIp);
+ rpcRegistration = rpcProviderRegistry.addRpcImplementation(IpSgtDistributionService.class, this);
}
}
package org.opendaylight.groupbasedpolicy.ip.sgt.distribution.service.impl;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+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 java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Future;
-
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.sxp.util.time.TimeConv;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SendIpSgtBindingToPeerInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequenceBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-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 IpSgtDistributionServiceImpl implements AutoCloseable, IpSgtDistributionService {
private static final Logger LOG = LoggerFactory.getLogger(IpSgtDistributionServiceImpl.class);
private void createSxpNode(SxpControllerService sxpService) {
AddNodeInput addNodeInput = new AddNodeInputBuilder().setNodeId(new NodeId(SXP_NODE_ID))
- .setSourceIp(sourceIp)
- .setDescription(SXP_NODE_DESCRIPTION)
- .build();
+ .setSourceIp(sourceIp)
+ .setDescription(SXP_NODE_DESCRIPTION)
+ .build();
Future<RpcResult<AddNodeOutput>> addNodeResult = sxpService.addNode(addNodeInput);
try {
- if (!addNodeResult.get().getResult().isResult()) {
+ if (! addNodeResult.get().getResult().isResult()) {
LOG.error("RPC add-node wasn't successfull");
}
} catch (Exception e) {
boolean success = true;
for (Binding binding : input.getBinding()) {
success = transformChanges(binding, bindingsMap);
- if (!success) {
+ if (! success) {
break;
}
}
- if (!success) {
+ if (! success) {
return Futures.immediateCheckedFuture(RpcResultBuilder.<Void>failed().build());
}
WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
private InstanceIdentifier<MasterDatabaseBinding> bindingIid(String domainId, IpPrefix prefix) {
return InstanceIdentifier.builder(NetworkTopology.class)
- .child(Topology.class, new TopologyKey(new TopologyId(SXP_TOPOLOGY_ID)))
- .child(Node.class,
- new NodeKey(
- new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId(
- SXP_NODE_ID)))
- .augmentation(SxpNodeIdentity.class)
- .child(SxpDomains.class)
- .child(SxpDomain.class, new SxpDomainKey(domainId))
- .child(MasterDatabase.class)
- .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(prefix))
- .build();
+ .child(Topology.class, new TopologyKey(new TopologyId(SXP_TOPOLOGY_ID)))
+ .child(Node.class,
+ new NodeKey(
+ new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId(
+ SXP_NODE_ID)))
+ .augmentation(SxpNodeIdentity.class)
+ .child(SxpDomains.class)
+ .child(SxpDomain.class, new SxpDomainKey(domainId))
+ .child(MasterDatabase.class)
+ .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(prefix))
+ .build();
}
private MasterDatabaseBinding createBinding(Entry<Sgt, IpPrefix> binding) {
- return new MasterDatabaseBindingBuilder().setIpPrefix(binding.getValue())
- .setSecurityGroupTag(binding.getKey())
- .build();
+ final DateAndTime nowDateTime = TimeConv.toDt(System.currentTimeMillis());
+ return new MasterDatabaseBindingBuilder()
+ .setIpPrefix(binding.getValue())
+ .setSecurityGroupTag(binding.getKey())
+ .setPeerSequence(new PeerSequenceBuilder().build())
+ .setTimestamp(nowDateTime)
+ .build();
}
@Override
boolean success = true;
for (Binding binding : input.getBinding()) {
success = transformChanges(binding, bindingsMap);
- if (!success) {
+ if (! success) {
break;
}
}
- if (!success) {
+ if (! success) {
return Futures.immediateCheckedFuture(RpcResultBuilder.<Void>failed().build());
}
WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
String password = sxpData.getPassword();
InstanceIdentifier<SxpDomain> iid = sxpDomainIid(domainId);
SxpDomain domain = new SxpDomainBuilder().setDomainName(domainId)
- .setConnections(new ConnectionsBuilder()
- .setConnection(Collections.singletonList(new ConnectionBuilder().setPeerAddress(peerAddr)
- .setTcpPort(port)
- .setMode(ConnectionMode.Speaker)
- .setPassword(password)
- .setConnectionTimers(new ConnectionTimersBuilder().build())
- .setDescription("Connection to " + domainId)
- .build()))
- .build())
- .build();
+ .setConnections(new ConnectionsBuilder()
+ .setConnection(Collections.singletonList(new ConnectionBuilder()
+ .setPeerAddress(peerAddr)
+ .setTcpPort(port)
+ .setMode(ConnectionMode.Speaker)
+ .setPassword(password)
+ .setConnectionTimers(new ConnectionTimersBuilder().build())
+ .setDescription("Connection to " + domainId)
+ .setVersion(sxpData.getVersion())
+ .build()))
+ .build())
+ .build();
WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
wtx.merge(LogicalDatastoreType.CONFIGURATION, iid, domain);
wtx.submit();
<reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"/>
<reference id="clusterSingletonService" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
- <odl:rpc-service id="sxpControllerService" interface="org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.controller.rev141002.SxpControllerService"/>
+ <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"/>
<!-- Modules /-->
<bean id="ipSgtDistributionService" class="org.opendaylight.controller.config.yang.config.ip.sgt.distribution.service.cfg.IpSgtDistributionServiceInstance"
- init-method="initialize" destroy-method="close">
+ init-method="initialize" destroy-method="close">
<argument ref="dataBroker"/>
- <argument ref="sxpControllerService"/>
<argument value="127.0.0.1"/>
<argument ref="clusterSingletonService"/>
+ <argument ref="rpcRegistry"/>
</bean>
</blueprint>
\ No newline at end of file
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.google.common.util.concurrent.Futures;
import java.util.Collections;
import java.util.concurrent.Future;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Matchers;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.sxp.util.time.TimeConv;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.RemoveIpSgtBindingFromPeerInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SendIpSgtBindingToPeerInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequence;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequenceBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
-import com.google.common.util.concurrent.Futures;
-
@RunWith(PowerMockRunner.class)
@PrepareForTest(IpSgtDistributionServiceImpl.class)
public class IpSgtDistributionServiceImplTest {
+ private static final PeerSequence EMPTY_PEER_SEQUENCE = new PeerSequenceBuilder().build();
+ private static final DateAndTime DUMMY_DT = TimeConv.toDt(123456L);
private final IpAddress ADDR = new IpAddress(new Ipv4Address("10.0.0.1"));
private final IpPrefix BINDING_ADDR = new IpPrefix(new Ipv4Prefix("192.168.50.1/32"));
private final Sgt BINDING_SGT = new Sgt(1010);
when(wtx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
when(nodeListener.getDomainIdForPeer(PEER_IID)).thenReturn(DOMAIN_ID);
Future<RpcResult<Void>> response = impl.sendIpSgtBindingToPeer(input);
- new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR).setSecurityGroupTag(BINDING_SGT).build();
+ final MasterDatabaseBinding expectedMasterDBBinding = new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR)
+ .setSecurityGroupTag(BINDING_SGT)
+ .setPeerSequence(EMPTY_PEER_SEQUENCE)
+ .setTimestamp(DUMMY_DT)
+ .build();
verify(wtx).put(eq(LogicalDatastoreType.CONFIGURATION),
eq(InstanceIdentifier.builder(SXP_NODE_IID)
- .augmentation(SxpNodeIdentity.class)
- .child(SxpDomains.class)
- .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
- .child(MasterDatabase.class)
- .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(BINDING_ADDR))
- .build()),
- eq(new MasterDatabaseBindingBuilder().setIpPrefix(BINDING_ADDR)
- .setSecurityGroupTag(BINDING_SGT)
- .build()));
+ .augmentation(SxpNodeIdentity.class)
+ .child(SxpDomains.class)
+ .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
+ .child(MasterDatabase.class)
+ .child(MasterDatabaseBinding.class, new MasterDatabaseBindingKey(BINDING_ADDR))
+ .build()),
+ Matchers.argThat(createMasterBDBindingMatcher(expectedMasterDBBinding)));
assertTrue(response.get().isSuccessful());
}
+ private static ArgumentMatcher<MasterDatabaseBinding> createMasterBDBindingMatcher(final MasterDatabaseBinding expectedMasterDBBinding) {
+ return new ArgumentMatcher<MasterDatabaseBinding>() {
+ @Override
+ public boolean matches(final Object o) {
+ boolean verdict = false;
+ if (o instanceof MasterDatabaseBinding) {
+ final MasterDatabaseBinding otherMasterDBBinding =
+ new MasterDatabaseBindingBuilder((MasterDatabaseBinding) o).setTimestamp(DUMMY_DT).build();
+ verdict = expectedMasterDBBinding.equals(otherMasterDBBinding);
+ }
+ return verdict;
+ }
+ };
+ }
+
@Test
public void testSendIpSgtBindingToPeer_failedWrite() throws Exception {
SendIpSgtBindingToPeerInput input =