From aaa4768131e8c3bed2e203901636617de7048dbc Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 8 Jul 2013 15:44:24 +0200 Subject: [PATCH] Add support for metadata `es_port`. If you run on a specific port, it will indicate it to GCE plugin. By default, `9300` will be used. --- README.md | 38 +++++++++++++++++++ .../gce/GceUnicastHostsProvider.java | 21 ++++++++-- .../tests/GceComputeServiceAbstractMock.java | 8 ++++ .../cloud/gce/tests/GceDifferentTagsTest.java | 12 +----- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 49fd6253797..2fce860f2f3 100644 --- a/README.md +++ b/README.md @@ -249,6 +249,44 @@ Then, define it in `elasticsearch.yml`: tags: elasticsearch, dev ``` +Changing default transport port +------------------------------- + +By default, elasticsearch GCE plugin assumes that you run elasticsearch on 9300 default port. +But you can specify the port value elasticsearch is meant to use using google compute engine metadata `es_port`: + +### When creating instance + +Add `--metadata=es_port:9301` option: + +```sh +# when creating first instance +gcutil --project=es-cloud addinstance myesnode1 --service_account_scope=compute-rw,storage-full --persistent_boot_disk --metadata=es_port:9301 + +# when creating an instance from an image +gcutil --project=es-cloud addinstance --image=elasticsearch-0-90-2 \ + --kernel=projects/google/global/kernels/gce-v20130603 myesnode2 \ + --zone europe-west1-a --machine_type f1-micro --service_account_scope=compute-rw \ + --persistent_boot_disk --metadata=es_port:9301 +``` + +### On a running instance + +```sh +# Get metadata fingerprint +gcutil --project=es-cloud getinstance myesnode1 --zone=europe-west1-a ++------------------------+---------------------------------------------------------------------------------------------------------+ +| property | value | ++------------------------+---------------------------------------------------------------------------------------------------------+ +| metadata | | +| fingerprint | 42WmSpB8rSM= | ++------------------------+---------------------------------------------------------------------------------------------------------+ + +# Use that fingerprint +gcutil --project=es-cloud setinstancemetadata myesnode1 --zone=europe-west1-a --metadata=es_port:9301 --fingerprint=42WmSpB8rSM= +``` + + Tips ---- diff --git a/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java b/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java index 54342bdbbde..d8ba7fe73f4 100644 --- a/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java +++ b/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java @@ -168,11 +168,11 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas } } if (filterByTag) { - logger.trace("*** filtering out instance {} based tags {}, not part of {}", name, tags, + logger.trace("filtering out instance {} based tags {}, not part of {}", name, tags, instance.getTags() == null ? "" : instance.getTags().getItems()); continue; } else { - logger.trace("*** instance {} with tags {} is added to discovery", name, tags); + logger.trace("instance {} with tags {} is added to discovery", name, tags); } String ip_public = null; @@ -207,7 +207,22 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas // We can ignore it in the list of DiscoveryNode logger.trace("current node found. Ignoring {} - {}", name, ip_private); } else { - TransportAddress[] addresses = transportService.addressesFromString(ip_private); + String address = ip_private; + // Test if we have es_port metadata defined here + if (instance.getMetadata() != null && instance.getMetadata().containsKey("es_port")) { + Object es_port = instance.getMetadata().get("es_port"); + logger.trace("es_port is defined with {}", es_port); + if (es_port instanceof String) { + address = address.concat(":").concat((String) es_port); + } else { + // Ignoring other values + logger.trace("es_port is instance of {}. Ignoring...", es_port.getClass().getName()); + } + } + + // ip_private is a single IP Address. We need to build a TransportAddress from it + TransportAddress[] addresses = transportService.addressesFromString(address); + // we only limit to 1 addresses, makes no sense to ping 100 ports for (int i = 0; (i < addresses.length && i < UnicastZenPing.LIMIT_PORTS_COUNT); i++) { logger.trace("adding {}, type {}, image {}, address {}, transport_address {}, status {}", name, type, diff --git a/src/test/java/org/elasticsearch/cloud/gce/tests/GceComputeServiceAbstractMock.java b/src/test/java/org/elasticsearch/cloud/gce/tests/GceComputeServiceAbstractMock.java index e98b1498be6..be37ac7588c 100644 --- a/src/test/java/org/elasticsearch/cloud/gce/tests/GceComputeServiceAbstractMock.java +++ b/src/test/java/org/elasticsearch/cloud/gce/tests/GceComputeServiceAbstractMock.java @@ -20,6 +20,7 @@ package org.elasticsearch.cloud.gce.tests; import com.google.api.services.compute.model.Instance; +import com.google.api.services.compute.model.Metadata; import com.google.api.services.compute.model.NetworkInterface; import com.google.api.services.compute.model.Tags; import org.elasticsearch.ElasticSearchException; @@ -52,6 +53,7 @@ public abstract class GceComputeServiceAbstractMock extends AbstractLifecycleCom Collection instances = new ArrayList(); // For each instance (item of tags) + int port = 9300; for (List tags : getTags()) { Instance instance = new Instance(); instance.setName("Mock Node " + tags); @@ -67,7 +69,13 @@ public abstract class GceComputeServiceAbstractMock extends AbstractLifecycleCom networkInterfaces.add(networkInterface); instance.setNetworkInterfaces(networkInterfaces); + // Add metadata es_port:930X where X is the instance number + Metadata metadata = new Metadata(); + metadata.put("es_port", "" + port); + instance.setMetadata(metadata); instances.add(instance); + + port++; } diff --git a/src/test/java/org/elasticsearch/cloud/gce/tests/GceDifferentTagsTest.java b/src/test/java/org/elasticsearch/cloud/gce/tests/GceDifferentTagsTest.java index e8e7b438b18..f555554876d 100644 --- a/src/test/java/org/elasticsearch/cloud/gce/tests/GceDifferentTagsTest.java +++ b/src/test/java/org/elasticsearch/cloud/gce/tests/GceDifferentTagsTest.java @@ -47,11 +47,7 @@ public class GceDifferentTagsTest extends GceAbstractTest { nodeBuilder("elasticsearch,dev"); // We expect having 1 node as part of the cluster, let's test that - // TODO Fix that test as we don't filter yet on port, each node can see each other - checkNumberOfNodes(2); - - // Should be - // checkNumberOfNodes(1); + checkNumberOfNodes(1); } @Test @@ -63,10 +59,6 @@ public class GceDifferentTagsTest extends GceAbstractTest { nodeBuilder("elasticsearch"); // We expect having 1 nodes as part of the cluster, let's test that - // TODO Fix that test as we don't filter yet on port, each node can see each other - checkNumberOfNodes(2); - - // Should be - // checkNumberOfNodes(1); + checkNumberOfNodes(1); } }