org.elasticsearch.transport.TransportInfo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch subproject :server
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.transport;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.logging.DeprecationCategory;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.common.transport.BoundTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.core.Nullable;
import org.elasticsearch.node.ReportingService;
import org.elasticsearch.xcontent.XContentBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static org.elasticsearch.core.Booleans.parseBoolean;
public class TransportInfo implements ReportingService.Info {
private static final DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(TransportInfo.class);
/** Whether to add hostname to publish host field when serializing. */
private static final boolean CNAME_IN_PUBLISH_ADDRESS = parseBoolean(
System.getProperty("es.transport.cname_in_publish_address"),
false
);
private final BoundTransportAddress address;
private Map profileAddresses;
private final boolean cnameInPublishAddress;
public TransportInfo(BoundTransportAddress address, @Nullable Map profileAddresses) {
this(address, profileAddresses, CNAME_IN_PUBLISH_ADDRESS);
}
public TransportInfo(
BoundTransportAddress address,
@Nullable Map profileAddresses,
boolean cnameInPublishAddress
) {
this.address = address;
this.profileAddresses = profileAddresses;
this.cnameInPublishAddress = cnameInPublishAddress;
}
public TransportInfo(StreamInput in) throws IOException {
address = new BoundTransportAddress(in);
int size = in.readVInt();
if (size > 0) {
profileAddresses = new HashMap<>(size);
for (int i = 0; i < size; i++) {
String key = in.readString();
BoundTransportAddress value = new BoundTransportAddress(in);
profileAddresses.put(key, value);
}
}
this.cnameInPublishAddress = CNAME_IN_PUBLISH_ADDRESS;
}
@Override
public void writeTo(StreamOutput out) throws IOException {
address.writeTo(out);
if (profileAddresses != null) {
out.writeVInt(profileAddresses.size());
} else {
out.writeVInt(0);
}
if (profileAddresses != null && profileAddresses.size() > 0) {
for (Map.Entry entry : profileAddresses.entrySet()) {
out.writeString(entry.getKey());
entry.getValue().writeTo(out);
}
}
}
static final class Fields {
static final String TRANSPORT = "transport";
static final String BOUND_ADDRESS = "bound_address";
static final String PUBLISH_ADDRESS = "publish_address";
static final String PROFILES = "profiles";
}
private String formatPublishAddressString(String propertyName, TransportAddress publishAddress) {
String publishAddressString = publishAddress.toString();
String hostString = publishAddress.address().getHostString();
if (InetAddresses.isInetAddress(hostString) == false) {
if (cnameInPublishAddress) {
publishAddressString = hostString + '/' + publishAddress.toString();
} else {
deprecationLogger.critical(
DeprecationCategory.SETTINGS,
"cname_in_publish_address",
propertyName
+ " was printed as [ip:port] instead of [hostname/ip:port]. "
+ "This format is deprecated and will change to [hostname/ip:port] in a future version. "
+ "Use -Des.transport.cname_in_publish_address=true to enforce non-deprecated formatting."
);
}
}
return publishAddressString;
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(Fields.TRANSPORT);
builder.xContentList(Fields.BOUND_ADDRESS, address.boundAddresses());
builder.field(Fields.PUBLISH_ADDRESS, formatPublishAddressString("transport.publish_address", address.publishAddress()));
builder.startObject(Fields.PROFILES);
if (profileAddresses != null && profileAddresses.size() > 0) {
for (Map.Entry entry : profileAddresses.entrySet()) {
builder.startObject(entry.getKey());
builder.array(Fields.BOUND_ADDRESS, (Object[]) entry.getValue().boundAddresses());
String propertyName = "transport." + entry.getKey() + ".publish_address";
builder.field(Fields.PUBLISH_ADDRESS, formatPublishAddressString(propertyName, entry.getValue().publishAddress()));
builder.endObject();
}
}
builder.endObject();
builder.endObject();
return builder;
}
public BoundTransportAddress address() {
return address;
}
public BoundTransportAddress getAddress() {
return address();
}
public Map getProfileAddresses() {
return profileAddresses();
}
public Map profileAddresses() {
return profileAddresses;
}
}