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=d3a7c7a686e08c9205dbc6dd46c0b16e3853505b;hp=b5fb0c1f9929070754095f1792902c22d5fb64d7;hb=e84f63ee098fff5b02cbce1281ca0d1208f966fa;hpb=33d4762518cbd392654569eb920a82073a9f787c 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 b5fb0c1f99..d3a7c7a686 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 @@ -40,7 +40,6 @@ import org.apache.commons.lang3.SerializationUtils; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.controller.cluster.access.concepts.MemberName; import org.opendaylight.controller.cluster.datastore.DistributedDataStoreInterface; -import org.opendaylight.controller.cluster.datastore.messages.AddPrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.AddShardReplica; import org.opendaylight.controller.cluster.datastore.messages.ChangeShardMembersVotingStatus; import org.opendaylight.controller.cluster.datastore.messages.FlipShardMembersVotingStatus; @@ -50,17 +49,15 @@ 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.PrimaryShardInfo; -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.ActorUtils; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.raft.client.messages.GetSnapshot; +import org.opendaylight.controller.eos.akka.DataCenterControl; 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.ActivateEosDatacenterInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.ActivateEosDatacenterOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsOutputBuilder; @@ -78,15 +75,14 @@ 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.ChangeMemberVotingStatesForShardOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.ClusterAdminService; 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.DeactivateEosDatacenterInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.DeactivateEosDatacenterOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.FlipMemberVotingStatesForAllShardsInput; 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.GetKnownClientsForAllShardsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetKnownClientsForAllShardsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetKnownClientsForAllShardsOutputBuilder; -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; @@ -99,9 +95,6 @@ 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.RemoveAllShardReplicasInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaOutputBuilder; @@ -114,12 +107,11 @@ 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.shard.result.output.ShardResult; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.shard.result.output.ShardResultBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.shard.result.output.ShardResultKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; +import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; @@ -135,7 +127,7 @@ public class ClusterAdminRpcService implements ClusterAdminService { private static final Logger LOG = LoggerFactory.getLogger(ClusterAdminRpcService.class); private static final @NonNull RpcResult LOCAL_SHARD_RESULT = RpcResultBuilder.success(new LocateShardOutputBuilder() - .setMemberNode(new LocalBuilder().setLocal(Empty.getInstance()).build()) + .setMemberNode(new LocalBuilder().setLocal(Empty.value()).build()) .build()) .build(); @@ -143,17 +135,21 @@ public class ClusterAdminRpcService implements ClusterAdminService { private final DistributedDataStoreInterface operDataStore; private final BindingNormalizedNodeSerializer serializer; private final Timeout makeLeaderLocalTimeout; + private final DataCenterControl dataCenterControl; public ClusterAdminRpcService(final DistributedDataStoreInterface configDataStore, - final DistributedDataStoreInterface operDataStore, - final BindingNormalizedNodeSerializer serializer) { + final DistributedDataStoreInterface operDataStore, + final BindingNormalizedNodeSerializer serializer, + final DataCenterControl dataCenterControl) { this.configDataStore = configDataStore; this.operDataStore = operDataStore; this.serializer = serializer; - this.makeLeaderLocalTimeout = + makeLeaderLocalTimeout = new Timeout(configDataStore.getActorUtils().getDatastoreContext() .getShardLeaderElectionTimeout().duration().$times(2)); + + this.dataCenterControl = dataCenterControl; } @Override @@ -326,85 +322,6 @@ public class ClusterAdminRpcService implements ClusterAdminService { return future; } - @Override - public ListenableFuture> addPrefixShardReplica( - final AddPrefixShardReplicaInput 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("Adding replica for shard {}, datastore type {}", identifier, dataStoreType); - - final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); - final SettableFuture> returnFuture = SettableFuture.create(); - ListenableFuture future = sendMessageToShardManager(dataStoreType, new AddPrefixShardReplica(prefix)); - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(final Success success) { - LOG.info("Successfully added replica for shard {}", prefix); - returnFuture.set(newSuccessfulResult(new AddPrefixShardReplicaOutputBuilder().build())); - } - - @Override - public void onFailure(final Throwable failure) { - onMessageFailure(String.format("Failed to add replica for shard %s", prefix), - returnFuture, failure); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - - @Override - public ListenableFuture> removePrefixShardReplica( - final RemovePrefixShardReplicaInput 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"); - } - - final String memberName = input.getMemberName(); - if (Strings.isNullOrEmpty(memberName)) { - return newFailedRpcResultFuture("A valid member name must be specified"); - } - - LOG.info("Removing replica for shard {} memberName {}, datastoreType {}", - identifier, memberName, dataStoreType); - final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); - - final SettableFuture> returnFuture = SettableFuture.create(); - final ListenableFuture future = sendMessageToShardManager(dataStoreType, - new RemovePrefixShardReplica(prefix, MemberName.forName(memberName))); - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(final Success success) { - LOG.info("Successfully removed replica for shard {}", prefix); - returnFuture.set(newSuccessfulResult(new RemovePrefixShardReplicaOutputBuilder().build())); - } - - @Override - public void onFailure(final Throwable failure) { - onMessageFailure(String.format("Failed to remove replica for shard %s", prefix), - returnFuture, failure); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - @Override public ListenableFuture> addReplicasForAllShards( final AddReplicasForAllShardsInput input) { @@ -567,53 +484,6 @@ public class ClusterAdminRpcService implements ClusterAdminService { return returnFuture; } - @Override - public ListenableFuture> 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()); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - @Override public ListenableFuture> backupDatastore(final BackupDatastoreInput input) { LOG.debug("backupDatastore: {}", input); @@ -622,9 +492,13 @@ public class ClusterAdminRpcService implements ClusterAdminService { return newFailedRpcResultFuture("A valid file path must be specified"); } + final Uint32 timeout = input.getTimeout(); + final Timeout opTimeout = timeout != null ? Timeout.apply(timeout.longValue(), TimeUnit.SECONDS) + : SHARD_MGR_TIMEOUT; + final SettableFuture> returnFuture = SettableFuture.create(); - ListenableFuture> future = sendMessageToShardManagers(GetSnapshot.INSTANCE); - Futures.addCallback(future, new FutureCallback>() { + ListenableFuture> future = sendMessageToShardManagers(new GetSnapshot(opTimeout)); + Futures.addCallback(future, new FutureCallback<>() { @Override public void onSuccess(final List snapshots) { saveSnapshotsToFile(new DatastoreSnapshotList(snapshots), input.getFilePath(), returnFuture); @@ -649,6 +523,50 @@ public class ClusterAdminRpcService implements ClusterAdminService { MoreExecutors.directExecutor()); } + @Override + public ListenableFuture> activateEosDatacenter( + final ActivateEosDatacenterInput input) { + LOG.debug("Activating EOS Datacenter"); + final SettableFuture> future = SettableFuture.create(); + Futures.addCallback(dataCenterControl.activateDataCenter(), new FutureCallback<>() { + @Override + public void onSuccess(final Empty result) { + LOG.debug("Successfully activated datacenter."); + future.set(RpcResultBuilder.success().build()); + } + + @Override + public void onFailure(final Throwable failure) { + future.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "Failed to activate datacenter.", failure).build()); + } + }, MoreExecutors.directExecutor()); + + return future; + } + + @Override + public ListenableFuture> deactivateEosDatacenter( + final DeactivateEosDatacenterInput input) { + LOG.debug("Deactivating EOS Datacenter"); + final SettableFuture> future = SettableFuture.create(); + Futures.addCallback(dataCenterControl.deactivateDataCenter(), new FutureCallback<>() { + @Override + public void onSuccess(final Empty result) { + LOG.debug("Successfully deactivated datacenter."); + future.set(RpcResultBuilder.success().build()); + } + + @Override + public void onFailure(final Throwable failure) { + future.set(ClusterAdminRpcService.newFailedRpcResultBuilder( + "Failed to deactivate datacenter.", failure).build()); + } + }, MoreExecutors.directExecutor()); + + return future; + } + private static RpcResult processReplies( final ImmutableMap> allShardReplies) { final Map result = Maps.newHashMapWithExpectedSize(allShardReplies.size()); @@ -695,7 +613,7 @@ public class ClusterAdminRpcService implements ClusterAdminService { final List memberVotingStatus) { Map serverVotingStatusMap = new HashMap<>(); for (MemberVotingState memberStatus: memberVotingStatus) { - serverVotingStatusMap.put(memberStatus.getMemberName(), memberStatus.isVoting()); + serverVotingStatusMap.put(memberStatus.getMemberName(), memberStatus.getVoting()); } return new ChangeShardMembersVotingStatus(shardName, serverVotingStatusMap); } @@ -778,8 +696,6 @@ public class ClusterAdminRpcService implements ClusterAdminService { return ask(shardManager, message, SHARD_MGR_TIMEOUT); } - @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", - justification = "https://github.com/spotbugs/spotbugs/issues/811") @SuppressWarnings("checkstyle:IllegalCatch") private static void saveSnapshotsToFile(final DatastoreSnapshotList snapshots, final String fileName, final SettableFuture> returnFuture) {