RemoteConnectionInfo.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
  3. * or more contributor license agreements. Licensed under the Elastic License
  4. * 2.0 and the Server Side Public License, v 1; you may not use this file except
  5. * in compliance with, at your election, the Elastic License 2.0 or the Server
  6. * Side Public License, v 1.
  7. */
  8. package org.elasticsearch.transport;
  9. import org.elasticsearch.TransportVersion;
  10. import org.elasticsearch.common.io.stream.StreamInput;
  11. import org.elasticsearch.common.io.stream.StreamOutput;
  12. import org.elasticsearch.common.io.stream.Writeable;
  13. import org.elasticsearch.core.TimeValue;
  14. import org.elasticsearch.xcontent.ToXContentFragment;
  15. import org.elasticsearch.xcontent.XContentBuilder;
  16. import java.io.IOException;
  17. import java.util.Arrays;
  18. import java.util.List;
  19. import java.util.Objects;
  20. import static org.elasticsearch.transport.RemoteClusterPortSettings.TRANSPORT_VERSION_REMOTE_CLUSTER_SECURITY;
  21. /**
  22. * This class encapsulates all remote cluster information to be rendered on
  23. * {@code _remote/info} requests.
  24. */
  25. public final class RemoteConnectionInfo implements ToXContentFragment, Writeable {
  26. final ModeInfo modeInfo;
  27. final TimeValue initialConnectionTimeout;
  28. final String clusterAlias;
  29. final boolean skipUnavailable;
  30. final boolean hasClusterCredentials;
  31. public RemoteConnectionInfo(
  32. String clusterAlias,
  33. ModeInfo modeInfo,
  34. TimeValue initialConnectionTimeout,
  35. boolean skipUnavailable,
  36. boolean hasClusterCredentials
  37. ) {
  38. this.clusterAlias = clusterAlias;
  39. this.modeInfo = modeInfo;
  40. this.initialConnectionTimeout = initialConnectionTimeout;
  41. this.skipUnavailable = skipUnavailable;
  42. this.hasClusterCredentials = hasClusterCredentials;
  43. }
  44. public RemoteConnectionInfo(StreamInput input) throws IOException {
  45. if (input.getTransportVersion().onOrAfter(TransportVersion.V_7_6_0)) {
  46. RemoteConnectionStrategy.ConnectionStrategy mode = input.readEnum(RemoteConnectionStrategy.ConnectionStrategy.class);
  47. modeInfo = mode.getReader().read(input);
  48. initialConnectionTimeout = input.readTimeValue();
  49. clusterAlias = input.readString();
  50. skipUnavailable = input.readBoolean();
  51. if (input.getTransportVersion().onOrAfter(TRANSPORT_VERSION_REMOTE_CLUSTER_SECURITY)) {
  52. hasClusterCredentials = input.readBoolean();
  53. } else {
  54. hasClusterCredentials = false;
  55. }
  56. } else {
  57. List<String> seedNodes = Arrays.asList(input.readStringArray());
  58. int connectionsPerCluster = input.readVInt();
  59. initialConnectionTimeout = input.readTimeValue();
  60. int numNodesConnected = input.readVInt();
  61. clusterAlias = input.readString();
  62. skipUnavailable = input.readBoolean();
  63. modeInfo = new SniffConnectionStrategy.SniffModeInfo(seedNodes, connectionsPerCluster, numNodesConnected);
  64. hasClusterCredentials = false;
  65. }
  66. }
  67. public boolean isConnected() {
  68. return modeInfo.isConnected();
  69. }
  70. public String getClusterAlias() {
  71. return clusterAlias;
  72. }
  73. public ModeInfo getModeInfo() {
  74. return modeInfo;
  75. }
  76. public TimeValue getInitialConnectionTimeout() {
  77. return initialConnectionTimeout;
  78. }
  79. public boolean isSkipUnavailable() {
  80. return skipUnavailable;
  81. }
  82. public boolean hasClusterCredentials() {
  83. return hasClusterCredentials;
  84. }
  85. @Override
  86. public void writeTo(StreamOutput out) throws IOException {
  87. if (out.getTransportVersion().onOrAfter(TransportVersion.V_7_6_0)) {
  88. out.writeEnum(modeInfo.modeType());
  89. modeInfo.writeTo(out);
  90. out.writeTimeValue(initialConnectionTimeout);
  91. } else {
  92. if (modeInfo.modeType() == RemoteConnectionStrategy.ConnectionStrategy.SNIFF) {
  93. SniffConnectionStrategy.SniffModeInfo sniffInfo = (SniffConnectionStrategy.SniffModeInfo) this.modeInfo;
  94. out.writeStringArray(sniffInfo.seedNodes.toArray(new String[0]));
  95. out.writeVInt(sniffInfo.maxConnectionsPerCluster);
  96. out.writeTimeValue(initialConnectionTimeout);
  97. out.writeVInt(sniffInfo.numNodesConnected);
  98. } else {
  99. out.writeStringArray(new String[0]);
  100. out.writeVInt(0);
  101. out.writeTimeValue(initialConnectionTimeout);
  102. out.writeVInt(0);
  103. }
  104. }
  105. out.writeString(clusterAlias);
  106. out.writeBoolean(skipUnavailable);
  107. if (out.getTransportVersion().onOrAfter(TRANSPORT_VERSION_REMOTE_CLUSTER_SECURITY)) {
  108. out.writeBoolean(hasClusterCredentials);
  109. }
  110. }
  111. @Override
  112. public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
  113. builder.startObject(clusterAlias);
  114. {
  115. builder.field("connected", modeInfo.isConnected());
  116. builder.field("mode", modeInfo.modeName());
  117. modeInfo.toXContent(builder, params);
  118. builder.field("initial_connect_timeout", initialConnectionTimeout);
  119. builder.field("skip_unavailable", skipUnavailable);
  120. if (hasClusterCredentials) {
  121. builder.field("cluster_credentials", "::es_redacted::");
  122. }
  123. }
  124. builder.endObject();
  125. return builder;
  126. }
  127. @Override
  128. public boolean equals(Object o) {
  129. if (this == o) return true;
  130. if (o == null || getClass() != o.getClass()) return false;
  131. RemoteConnectionInfo that = (RemoteConnectionInfo) o;
  132. return skipUnavailable == that.skipUnavailable
  133. && Objects.equals(modeInfo, that.modeInfo)
  134. && Objects.equals(initialConnectionTimeout, that.initialConnectionTimeout)
  135. && Objects.equals(clusterAlias, that.clusterAlias)
  136. && hasClusterCredentials == that.hasClusterCredentials;
  137. }
  138. @Override
  139. public int hashCode() {
  140. return Objects.hash(modeInfo, initialConnectionTimeout, clusterAlias, skipUnavailable, hasClusterCredentials);
  141. }
  142. public interface ModeInfo extends ToXContentFragment, Writeable {
  143. boolean isConnected();
  144. String modeName();
  145. RemoteConnectionStrategy.ConnectionStrategy modeType();
  146. }
  147. }