X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-cluster-admin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fadmin%2FClusterAdminRpcService.java;h=af2224cfe4ed4fd7577cc40a6791946803832086;hp=0f2e81264f457d0af6da6e58d3836e0818889109;hb=1b24ce7d52a5acb3bb48bb6ae0724c4909220039;hpb=37238e4339ec7bfbfb0c7e57bf1545543f27a6cf diff --git a/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java b/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java index 0f2e81264f..af2224cfe4 100644 --- a/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java +++ b/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java @@ -37,12 +37,15 @@ import org.opendaylight.controller.cluster.datastore.messages.AddPrefixShardRepl import org.opendaylight.controller.cluster.datastore.messages.AddShardReplica; import org.opendaylight.controller.cluster.datastore.messages.ChangeShardMembersVotingStatus; import org.opendaylight.controller.cluster.datastore.messages.FlipShardMembersVotingStatus; +import org.opendaylight.controller.cluster.datastore.messages.GetShardRole; +import org.opendaylight.controller.cluster.datastore.messages.GetShardRoleReply; import org.opendaylight.controller.cluster.datastore.messages.MakeLeaderLocal; import org.opendaylight.controller.cluster.datastore.messages.RemovePrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.RemoveShardReplica; import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot; import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; +import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.raft.client.messages.GetSnapshot; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaInput; @@ -58,6 +61,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.DataStoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.FlipMemberVotingStatesForAllShardsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.FlipMemberVotingStatesForAllShardsOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.MakeLeaderLocalInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasOutput; @@ -425,6 +434,95 @@ public class ClusterAdminRpcService implements ClusterAdminService { "Failed to change member voting states"); } + @Override + public Future> getShardRole(final GetShardRoleInput input) { + final String shardName = input.getShardName(); + if (Strings.isNullOrEmpty(shardName)) { + return newFailedRpcResultFuture("A valid shard name must be specified"); + } + + DataStoreType dataStoreType = input.getDataStoreType(); + if (dataStoreType == null) { + return newFailedRpcResultFuture("A valid DataStoreType must be specified"); + } + + LOG.info("Getting role for shard {}, datastore type {}", shardName, dataStoreType); + + final SettableFuture> returnFuture = SettableFuture.create(); + ListenableFuture future = sendMessageToShardManager(dataStoreType, + new GetShardRole(shardName)); + Futures.addCallback(future, new FutureCallback() { + @Override + public void onSuccess(final GetShardRoleReply reply) { + if (reply == null) { + returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "No Shard role present. Please retry..").build()); + return; + } + LOG.info("Successfully received role:{} for shard {}", reply.getRole(), shardName); + final GetShardRoleOutputBuilder builder = new GetShardRoleOutputBuilder(); + if (reply.getRole() != null) { + builder.setRole(reply.getRole()); + } + returnFuture.set(newSuccessfulResult(builder.build())); + } + + @Override + public void onFailure(final Throwable failure) { + returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "Failed to get shard role.", failure).build()); + } + }); + + return returnFuture; + } + + @Override + public Future> getPrefixShardRole(final GetPrefixShardRoleInput input) { + final InstanceIdentifier identifier = input.getShardPrefix(); + if (identifier == null) { + return newFailedRpcResultFuture("A valid shard identifier must be specified"); + } + + final DataStoreType dataStoreType = input.getDataStoreType(); + if (dataStoreType == null) { + return newFailedRpcResultFuture("A valid DataStoreType must be specified"); + } + + LOG.info("Getting prefix shard role for shard: {}, datastore type {}", identifier, dataStoreType); + + final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); + final String shardName = ClusterUtils.getCleanShardName(prefix); + final SettableFuture> returnFuture = SettableFuture.create(); + ListenableFuture future = sendMessageToShardManager(dataStoreType, + new GetShardRole(shardName)); + Futures.addCallback(future, new FutureCallback() { + @Override + public void onSuccess(final GetShardRoleReply reply) { + if (reply == null) { + returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "No Shard role present. Please retry..").build()); + return; + } + + LOG.info("Successfully received role:{} for shard {}", reply.getRole(), shardName); + final GetPrefixShardRoleOutputBuilder builder = new GetPrefixShardRoleOutputBuilder(); + if (reply.getRole() != null) { + builder.setRole(reply.getRole()); + } + returnFuture.set(newSuccessfulResult(builder.build())); + } + + @Override + public void onFailure(final Throwable failure) { + returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "Failed to get shard role.", failure).build()); + } + }); + + return returnFuture; + } + @Override public Future> backupDatastore(final BackupDatastoreInput input) { LOG.debug("backupDatastore: {}", input);