/* Visible for testing */ ApplicationResource createApplicationResource(ReplicationInstance instanceInfo) { return new ApplicationResource(instanceInfo.getAppName(), serverConfig, registry); }
private static Builder handleRegister(ReplicationInstance instanceInfo, ApplicationResource applicationResource) { applicationResource.addInstance(instanceInfo.getInstanceInfo(), REPLICATION); return new Builder().setStatusCode(Status.OK.getStatusCode()); }
/** * Get requests returns the information about the instance's * {@link InstanceInfo}. * * @return response containing information about the the instance's * {@link InstanceInfo}. */ @GET public Response getInstanceInfo() { InstanceInfo appInfo = registry .getInstanceByAppAndId(app.getName(), id); if (appInfo != null) { logger.debug("Found: {} - {}", app.getName(), id); return Response.ok(appInfo).build(); } else { logger.debug("Not Found: {} - {}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); } }
@QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) { boolean isFromReplicaNode = "true".equals(isReplication); boolean isSuccess = registry.renew(app.getName(), id, isFromReplicaNode); logger.warn("Not Found (Renew): {} - {}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); && !(InstanceStatus.UNKNOWN.name().equals(overriddenStatus)) && isFromReplicaNode) { registry.storeOverriddenStatusIfRequired(app.getAppName(), id, InstanceStatus.valueOf(overriddenStatus)); logger.debug("Found (Renew): {} - {}; reply status={}", app.getName(), id, response.getStatus()); return response;
InstanceInfo instanceInfo = spy(InstanceInfoGenerator.takeOne()); when(instanceInfo.getId()).thenReturn(null); Response response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); when(instanceInfo.getAppName()).thenReturn(applicationResource.getName() + "extraExtra"); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400)); response = applicationResource.addInstance(instanceInfo, false+""); assertThat(response.getStatus(), is(400));
logger.debug("Registering instance {} (replication={})", info.getId(), isReplication); if (isBlank(info.getId())) { return Response.status(400).entity("Missing instanceId").build(); } else if (isBlank(info.getHostName())) { return Response.status(400).entity("Missing hostname").build(); } else if (isBlank(info.getIPAddr())) { return Response.status(400).entity("Missing ip address").build(); } else if (isBlank(info.getAppName())) { return Response.status(400).entity("Missing appName").build(); } else if (!appName.equals(info.getAppName())) { if (dataCenterInfo instanceof UniqueIdentifier) { String dataCenterInfoId = ((UniqueIdentifier) dataCenterInfo).getId(); if (isBlank(dataCenterInfoId)) { boolean experimental = "true".equalsIgnoreCase(serverConfig.getExperimental("registration.validation.dataCenterInfoId")); if (experimental) {
@Test public void testFullAppGet() throws Exception { Response response = applicationResource.getApplication( Version.V2.name(), MediaType.APPLICATION_JSON, EurekaAccept.full.name() ); String json = String.valueOf(response.getEntity()); DecoderWrapper decoder = CodecWrappers.getDecoder(CodecWrappers.LegacyJacksonJson.class); Application decodedApp = decoder.decode(json, Application.class); assertThat(EurekaEntityComparators.equal(testApplication, decodedApp), is(true)); }
@QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) { boolean isFromReplicaNode = "true".equals(isReplication); boolean isSuccess = registry.renew(app.getName(), id, isFromReplicaNode); logger.warn("Not Found (Renew): {} - {}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); && !(InstanceStatus.UNKNOWN.name().equals(overriddenStatus)) && isFromReplicaNode) { registry.storeOverriddenStatusIfRequired(app.getAppName(), id, InstanceStatus.valueOf(overriddenStatus)); logger.debug("Found (Renew): {} - {}; reply status={}", app.getName(), id, response.getStatus()); return response;
logger.debug("Registering instance {} (replication={})", info.getId(), isReplication); if (isBlank(info.getId())) { return Response.status(400).entity("Missing instanceId").build(); } else if (isBlank(info.getHostName())) { return Response.status(400).entity("Missing hostname").build(); } else if (isBlank(info.getIPAddr())) { return Response.status(400).entity("Missing ip address").build(); } else if (isBlank(info.getAppName())) { return Response.status(400).entity("Missing appName").build(); } else if (!appName.equals(info.getAppName())) { if (dataCenterInfo instanceof UniqueIdentifier) { String dataCenterInfoId = ((UniqueIdentifier) dataCenterInfo).getId(); if (isBlank(dataCenterInfoId)) { boolean experimental = "true".equalsIgnoreCase(serverConfig.getExperimental("registration.validation.dataCenterInfoId")); if (experimental) {
@Test public void testMiniAppGet() throws Exception { Response response = applicationResource.getApplication( Version.V2.name(), MediaType.APPLICATION_JSON, EurekaAccept.compact.name() ); String json = String.valueOf(response.getEntity()); DecoderWrapper decoder = CodecWrappers.getDecoder(CodecWrappers.LegacyJacksonJson.class); Application decodedApp = decoder.decode(json, Application.class); // assert false as one is mini, so should NOT equal assertThat(EurekaEntityComparators.equal(testApplication, decodedApp), is(false)); for (InstanceInfo instanceInfo : testApplication.getInstances()) { InstanceInfo decodedInfo = decodedApp.getByInstanceId(instanceInfo.getId()); assertThat(EurekaEntityComparators.equalMini(instanceInfo, decodedInfo), is(true)); } }
/** * Handles cancellation of leases for this particular instance. * * @param isReplication * a header parameter containing information whether this is * replicated from other nodes. * @return response indicating whether the operation was a success or * failure. */ @DELETE public Response cancelLease( @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication) { try { boolean isSuccess = registry.cancel(app.getName(), id, "true".equals(isReplication)); if (isSuccess) { logger.debug("Found (Cancel): {} - {}", app.getName(), id); return Response.ok().build(); } else { logger.info("Not Found (Cancel): {} - {}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); } } catch (Throwable e) { logger.error("Error (cancel): {} - {}", app.getName(), id, e); return Response.serverError().build(); } }
@Test public void testGoodRegistration() throws Exception { InstanceInfo noIdInfo = InstanceInfoGenerator.takeOne(); Response response = applicationResource.addInstance(noIdInfo, false+""); assertThat(response.getStatus(), is(204)); }
/** * Gets information about a particular {@link com.netflix.discovery.shared.Application}. * * @param version * the version of the request. * @param appId * the unique application identifier (which is the name) of the * application. * @return information about a particular application. */ @Path("{appId}") public ApplicationResource getApplicationResource( @PathParam("version") String version, @PathParam("appId") String appId) { CurrentRequestVersion.set(Version.toEnum(version)); return new ApplicationResource(appId, serverConfig, registry); }
@QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) { try { if (registry.getInstanceByAppAndId(app.getName(), id) == null) { logger.warn("Instance not found: {}/{}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); boolean isSuccess = registry.deleteStatusOverride(app.getName(), id, newStatus, lastDirtyTimestamp, "true".equals(isReplication)); logger.info("Status override removed: {} - {}", app.getName(), id); return Response.ok().build(); } else { logger.warn("Unable to remove status override: {} - {}", app.getName(), id); return Response.serverError().build();
@Test public void testRegisterBatching() throws Exception { ReplicationList replicationList = new ReplicationList(newReplicationInstanceOf(Action.Register, instanceInfo)); Response response = peerReplicationResource.batchReplication(replicationList); assertStatusOkReply(response); verify(applicationResource, times(1)).addInstance(instanceInfo, "true"); }
public MockServer(String appName, PeerEurekaNodes peerEurekaNodes) throws Exception { ApplicationInfoManager infoManager = new ApplicationInfoManager(new MyDataCenterInstanceConfig()); DefaultEurekaServerConfig serverConfig = Mockito.spy(new DefaultEurekaServerConfig()); DefaultEurekaClientConfig clientConfig = new DefaultEurekaClientConfig(); ServerCodecs serverCodecs = new DefaultServerCodecs(serverConfig); EurekaClient eurekaClient = Mockito.mock(EurekaClient.class); Mockito.doReturn("true").when(serverConfig).getExperimental("registry.registration.ignoreIfDirtyTimestampIsOlder"); this.registry = new PeerAwareInstanceRegistryImpl(serverConfig, clientConfig, serverCodecs, eurekaClient); this.registry.init(peerEurekaNodes); this.applicationResource = new ApplicationResource(appName, serverConfig, registry); EurekaServerContext serverContext = Mockito.mock(EurekaServerContext.class); Mockito.when(serverContext.getServerConfig()).thenReturn(serverConfig); Mockito.when(serverContext.getRegistry()).thenReturn(registry); this.replicationResource = new PeerReplicationResource(serverContext); } }
@QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) { try { if (registry.getInstanceByAppAndId(app.getName(), id) == null) { logger.warn("Instance not found: {}/{}", app.getName(), id); return Response.status(Status.NOT_FOUND).build(); boolean isSuccess = registry.statusUpdate(app.getName(), id, InstanceStatus.valueOf(newStatus), lastDirtyTimestamp, "true".equals(isReplication)); logger.info("Status updated: {} - {} - {}", app.getName(), id, newStatus); return Response.ok().build(); } else { logger.warn("Unable to update status: {} - {} - {}", app.getName(), id, newStatus); return Response.serverError().build();
/** * this test tests a scenario where multiple registration and update requests for a single client is sent to * different eureka servers before replication can occur between them */ @Test public void testReplicationWithRegistrationAndUpdateOnDifferentServers() throws Exception { // now simulate server1 (delayed) replication to server2. // without batching this is done by server1 making a REST call to the register endpoint of server2 with // replication=true server2.applicationResource.addInstance(instance1, "true"); // verify that server2's "newer" info is (or is not) overridden // server2 should still see instance2 even though server1 tried to replicate across server1 InstanceInfo newServer2Sees = server2.registry.getInstanceByAppAndId(appName, id); assertThat(newServer2Sees.getStatus(), equalTo(instance2.getStatus())); // now let server2 replicate to server1 server1.applicationResource.addInstance(newServer2Sees, "true"); // verify that server1 now have the updated info from server2 InstanceInfo newServer1Sees = server1.registry.getInstanceByAppAndId(appName, id); assertThat(newServer1Sees.getStatus(), equalTo(instance2.getStatus())); }
@Override @Before public void setUp() throws Exception { super.setUp(); InstanceInfoGenerator instanceInfos = InstanceInfoGenerator.newBuilder(6, 1).build(); testApplication = instanceInfos.toApplications().getRegisteredApplications().get(0); applicationResource = new ApplicationResource(testApplication.getName(), serverContext.getServerConfig(), serverContext.getRegistry()); for (InstanceInfo instanceInfo : testApplication.getInstances()) { registry.register(instanceInfo, false); } }