@Override public ConcurrentMap<String, Record> getRegistryData() { final ConcurrentMap<String, Record> map = this.readData(EtcdPath.IPC); for (final Record record : map.values()) { record.setStatus(Status.UP); record.setType("IPC"); // Alpn Enabled for Rpc, ssl must be true. record.getLocation().put("ssl", Boolean.TRUE); } return map; }
@Override public ConcurrentMap<String, Record> getRegistryData() { final ConcurrentMap<String, Record> map = this.readData(EtcdPath.IPC); for (final Record record : map.values()) { record.setStatus(Status.UP); record.setType("IPC"); // Alpn Enabled for Rpc, ssl must be true. record.getLocation().put("ssl", Boolean.TRUE); } return map; }
@Override public void unpublish(String id, Handler<AsyncResult<Void>> resultHandler) { backend.remove(id, record -> { if (record.failed()) { resultHandler.handle(Future.failedFuture(record.cause())); return; } for (ServiceExporter exporter : exporters) { exporter.onUnpublish(id); } Record announcedRecord = new Record(record.result()); announcedRecord .setRegistration(null) .setStatus(Status.DOWN); vertx.eventBus().publish(announce, announcedRecord.toJson()); resultHandler.handle(Future.succeededFuture()); }); }
@Override public void unpublish(String id, Handler<AsyncResult<Void>> resultHandler) { backend.remove(id, record -> { if (record.failed()) { resultHandler.handle(Future.failedFuture(record.cause())); return; } for (ServiceExporter exporter : exporters) { exporter.onUnpublish(id); } Record announcedRecord = new Record(record.result()); announcedRecord .setRegistration(null) .setStatus(Status.DOWN); vertx.eventBus().publish(announce, announcedRecord.toJson()); resultHandler.handle(Future.succeededFuture()); }); }
@Override public void publish(Record record, Handler<AsyncResult<Record>> resultHandler) { Status status = record.getStatus() == null || record.getStatus() == Status.UNKNOWN ? Status.UP : record.getStatus(); backend.store(record.setStatus(status), ar -> { if (ar.failed()) { resultHandler.handle(Future.failedFuture(ar.cause())); return; } for (ServiceExporter exporter : exporters) { exporter.onPublish(new Record(ar.result())); } Record announcedRecord = new Record(ar.result()); announcedRecord .setRegistration(null) .setStatus(status); vertx.eventBus().publish(announce, announcedRecord.toJson()); resultHandler.handle(Future.succeededFuture(ar.result())); }); }
@Override public void publish(Record record, Handler<AsyncResult<Record>> resultHandler) { Status status = record.getStatus() == null || record.getStatus() == Status.UNKNOWN ? Status.UP : record.getStatus(); backend.store(record.setStatus(status), ar -> { if (ar.failed()) { resultHandler.handle(Future.failedFuture(ar.cause())); return; } for (ServiceExporter exporter : exporters) { exporter.onPublish(new Record(ar.result())); } Record announcedRecord = new Record(ar.result()); announcedRecord .setRegistration(null) .setStatus(status); vertx.eventBus().publish(announce, announcedRecord.toJson()); resultHandler.handle(Future.succeededFuture(ar.result())); }); }
@Test public void testPublicationWithStatusUnknown() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.UNKNOWN); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.UP); }
@Test public void testPublicationWithStatusDown() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.DOWN); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.DOWN); }
@Test public void testMatch() { Record record = new Record().setName("Name"); assertThat(record.match(new JsonObject().put("name", "Name"))).isTrue(); assertThat(record.match(new JsonObject().put("name", "Name-2"))).isFalse(); record.setStatus(Status.UP); assertThat(record.match(new JsonObject().put("status", "Up"))).isTrue(); assertThat(record.match(new JsonObject().put("status", "Down"))).isFalse(); assertThat(record.match(new JsonObject().put("status", "Up").put("name", "Name"))).isTrue(); assertThat(record.match(new JsonObject().put("status", "Down").put("name", "Name"))).isFalse(); record.setRegistration("the-registration"); assertThat(record.match(new JsonObject().put("registration", "the-registration"))).isTrue(); assertThat(record.match(new JsonObject().put("registration", "wrong"))).isFalse(); record.getMetadata().put("foo", "bar").put("key", 2); assertThat(record.match(new JsonObject().put("foo", "bar"))).isTrue(); assertThat(record.match(new JsonObject().put("foo", "bar2"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("other", "nope"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("other", "*"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("key", 2))).isTrue(); assertThat(record.match(new JsonObject().put("foo", "*").put("key", 2))).isTrue(); }
@Test public void testMatch() { Record record = new Record().setName("Name"); assertThat(record.match(new JsonObject().put("name", "Name"))).isTrue(); assertThat(record.match(new JsonObject().put("name", "Name-2"))).isFalse(); record.setStatus(Status.UP); assertThat(record.match(new JsonObject().put("status", "Up"))).isTrue(); assertThat(record.match(new JsonObject().put("status", "Down"))).isFalse(); assertThat(record.match(new JsonObject().put("status", "Up").put("name", "Name"))).isTrue(); assertThat(record.match(new JsonObject().put("status", "Down").put("name", "Name"))).isFalse(); record.setRegistration("the-registration"); assertThat(record.match(new JsonObject().put("registration", "the-registration"))).isTrue(); assertThat(record.match(new JsonObject().put("registration", "wrong"))).isFalse(); record.getMetadata().put("foo", "bar").put("key", 2); assertThat(record.match(new JsonObject().put("foo", "bar"))).isTrue(); assertThat(record.match(new JsonObject().put("foo", "bar2"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("other", "nope"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("other", "*"))).isFalse(); assertThat(record.match(new JsonObject().put("foo", "bar").put("key", 2))).isTrue(); assertThat(record.match(new JsonObject().put("foo", "*").put("key", 2))).isTrue(); }
@Test public void testPublicationWithStatusUp() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.UP); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.UP); }
@Test public void testPublicationWithStatusUnknown() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.UNKNOWN); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.UP); }
@Test public void testPublicationWithStatusOutOfService() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.OUT_OF_SERVICE); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.OUT_OF_SERVICE); }
@Test public void testPublicationWithStatusOutOfService() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.OUT_OF_SERVICE); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.OUT_OF_SERVICE); }
@Test public void testPublicationWithStatusUp() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.UP); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.UP); }
@Test public void testPublicationWithStatusDown() { AtomicReference<Record> ref = new AtomicReference<>(); Record record = HttpEndpoint.createRecord("some-service", "localhost").setStatus(Status.DOWN); discovery.publish(record, ar -> { ref.set(ar.result()); }); await().untilAtomic(ref, is(notNullValue())); assertThat(ref.get().getRegistration()).isNotNull(); assertThat(ref.get().getStatus()).isEqualTo(Status.DOWN); }
@Before public void setUp() { vertx = Vertx.vertx(); options = new ServiceDiscoveryOptions().setName("theDiscovery") .setAnnounceAddress("theAnnounceAddress").setUsageAddress("theUsageAddress"); discovery = ServiceDiscovery.create(vertx, options); record = new Record() .setName("theRecord") .setType(Queryable.SERVICE_TYPE) .setMetadata(new JsonObject().put("publisherId", "thePublisherId")) .setLocation(new JsonObject().put(Record.ENDPOINT, Queryable.ADDRESS_PREFIX + ".DroidQueries")) .setStatus(Status.UP); definition = SchemaDefinition.createInstance(droidsSchema, SchemaMetadata.create(new JsonObject().put("publisherId", "thePublisherId"))); consumer = ProxyHelper.registerService(Queryable.class, vertx, definition, Queryable.ADDRESS_PREFIX + ".DroidQueries"); }
@Test public void should_Fail_Service_Proxy_With_Record_Not_Registered(TestContext context) { GraphQLClient.getSchemaProxy(discovery, new Record() .setName("DroidQueries").setType(Queryable.SERVICE_TYPE).setStatus(Status.UP), context.asyncAssertFailure(ex -> assertEquals("Record 'DroidQueries' has no service discovery registration", ex.getMessage()) )); } }
@Test public void testUpdateWithUUIDMismatch() throws UnsupportedEncodingException { HelloService svc = new HelloServiceImpl("stuff"); ProxyHelper.registerService(HelloService.class, vertx, svc, "address"); Record record = new Record() .setName("Hello") .setLocation(new JsonObject().put(Record.ENDPOINT, "address")); discovery.publish(record, (r) -> { }); await().until(() -> record.getRegistration() != null); Record retrieved = retrieve(record.getRegistration()); assertThat(retrieved.getStatus()).isEqualTo(Status.UP); retrieved.setStatus(Status.OUT_OF_SERVICE).setRegistration("not-the-right-one").getMetadata().put("foo", "bar"); Restafari.Response response = given().body(retrieved.toJson().toString()) .put("/discovery/" + record.getRegistration()); assertThat(response.getStatusCode()).isEqualTo(400); }
@Test public void testUpdateWithUUIDMismatch() throws UnsupportedEncodingException { HelloService svc = new HelloServiceImpl("stuff"); ProxyHelper.registerService(HelloService.class, vertx, svc, "address"); Record record = new Record() .setName("Hello") .setLocation(new JsonObject().put(Record.ENDPOINT, "address")); discovery.publish(record, (r) -> { }); await().until(() -> record.getRegistration() != null); Record retrieved = retrieve(record.getRegistration()); assertThat(retrieved.getStatus()).isEqualTo(Status.UP); retrieved.setStatus(Status.OUT_OF_SERVICE).setRegistration("not-the-right-one").getMetadata().put("foo", "bar"); Restafari.Response response = given().body(retrieved.toJson().toString()) .put("/discovery/" + record.getRegistration()); assertThat(response.getStatusCode()).isEqualTo(400); }