Skip to content

Commit cdb6260

Browse files
committed
feat: change the approach
Related: line#6056 Motivation: Users might want to use the metadata from the Eureka `InstanceInfo` but currently, there's no way to retrieve it. Modifications: - Remove helper class because users cannot access this class to retrieve `InstanceInfo`. - Move `com.linecorp.armeria.internal.common.eureka.InstanceInfo` to `com.linecorp.armeria.common.eureka.InstanceInfo`. - Move the methods to the `InstanceInfo` class. - Add a test to verify that users can retrieve the `InstanceInfo`. Result: - Closes line#6056 - Now users can retrieve it.
1 parent 9f9d008 commit cdb6260

File tree

10 files changed

+158
-37
lines changed

10 files changed

+158
-37
lines changed

Diff for: eureka/src/main/java/com/linecorp/armeria/client/eureka/EurekaEndpointGroup.java

+4-23
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,12 @@
6060
import com.linecorp.armeria.common.annotation.Nullable;
6161
import com.linecorp.armeria.internal.common.eureka.Application;
6262
import com.linecorp.armeria.internal.common.eureka.Applications;
63-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo;
64-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus;
65-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.PortWrapper;
63+
import com.linecorp.armeria.common.eureka.InstanceInfo;
64+
import com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus;
65+
import com.linecorp.armeria.common.eureka.InstanceInfo.PortWrapper;
6666
import com.linecorp.armeria.server.eureka.EurekaUpdatingListener;
6767

6868
import io.netty.channel.EventLoop;
69-
import io.netty.util.AttributeKey;
7069
import io.netty.util.concurrent.ScheduledFuture;
7170

7271
/**
@@ -400,24 +399,6 @@ public List<Endpoint> apply(byte[] content) {
400399
}
401400
}
402401

403-
private static final class EurekaInstanceInfoUtil {
404-
405-
private static final AttributeKey<InstanceInfo> INSTANCE_INFO = AttributeKey.valueOf(
406-
EurekaInstanceInfoUtil.class, "INSTANCE_INFO");
407-
408-
@Nullable
409-
static InstanceInfo get(Endpoint endpoint) {
410-
requireNonNull(endpoint, "endpoint");
411-
return endpoint.attr(INSTANCE_INFO);
412-
}
413-
414-
static Endpoint with(Endpoint endpoint, InstanceInfo instanceInfo) {
415-
requireNonNull(endpoint, "endpoint");
416-
requireNonNull(instanceInfo, "instanceInfo");
417-
return endpoint.withAttr(INSTANCE_INFO, instanceInfo);
418-
}
419-
}
420-
421402
private static Endpoint endpoint(InstanceInfo instanceInfo, boolean secureVip) {
422403
final String hostname = instanceInfo.getHostName();
423404
final PortWrapper portWrapper = instanceInfo.getPort();
@@ -434,7 +415,7 @@ private static Endpoint endpoint(InstanceInfo instanceInfo, boolean secureVip) {
434415
if (ipAddr != null && hostname != ipAddr) {
435416
endpoint = endpoint.withIpAddr(ipAddr);
436417
}
437-
return EurekaInstanceInfoUtil.with(endpoint, instanceInfo);
418+
return InstanceInfo.with(endpoint, instanceInfo);
438419
}
439420

440421
@Override

Diff for: eureka/src/main/java/com/linecorp/armeria/internal/common/eureka/InstanceInfo.java renamed to eureka/src/main/java/com/linecorp/armeria/common/eureka/InstanceInfo.java

+33-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* License for the specific language governing permissions and limitations
1414
* under the License.
1515
*/
16-
package com.linecorp.armeria.internal.common.eureka;
16+
package com.linecorp.armeria.common.eureka;
1717

1818
import static com.google.common.base.MoreObjects.toStringHelper;
1919
import static java.util.Objects.requireNonNull;
@@ -32,7 +32,12 @@
3232
import com.google.common.base.Objects;
3333
import com.google.common.collect.ImmutableMap;
3434

35+
import com.linecorp.armeria.client.Endpoint;
3536
import com.linecorp.armeria.common.annotation.Nullable;
37+
import com.linecorp.armeria.internal.common.eureka.DataCenterInfo;
38+
import com.linecorp.armeria.internal.common.eureka.LeaseInfo;
39+
40+
import io.netty.util.AttributeKey;
3641

3742
/**
3843
* An instance information.
@@ -43,6 +48,33 @@ public final class InstanceInfo {
4348

4449
private static final Logger logger = LoggerFactory.getLogger(InstanceInfo.class);
4550

51+
private static final AttributeKey<InstanceInfo> INSTANCE_INFO = AttributeKey.valueOf(
52+
InstanceInfo.class, "INSTANCE_INFO");
53+
54+
/**
55+
* Returns the {@link InstanceInfo} associated with the given {@link Endpoint}.
56+
*
57+
* @param endpoint The {@link Endpoint} whose {@link InstanceInfo} is to be retrieved.
58+
* @return The {@link InstanceInfo} associated with the specified {@link Endpoint}.
59+
*/
60+
@Nullable
61+
public static InstanceInfo get(Endpoint endpoint) {
62+
requireNonNull(endpoint, "endpoint");
63+
return endpoint.attr(INSTANCE_INFO);
64+
}
65+
66+
/**
67+
* Sets the Eureka {@link InstanceInfo} parameter to the {@link Endpoint} as an attribute.
68+
*
69+
* @param endpoint The {@link Endpoint} to which the {@link InstanceInfo} will be set as an attribute.
70+
* @return The same {@link Endpoint} passed as a parameter.
71+
*/
72+
public static Endpoint with(Endpoint endpoint, InstanceInfo instanceInfo) {
73+
requireNonNull(endpoint, "endpoint");
74+
requireNonNull(instanceInfo, "instanceInfo");
75+
return endpoint.withAttr(INSTANCE_INFO, instanceInfo);
76+
}
77+
4678
@Nullable
4779
private final String instanceId;
4880

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright 2020 LINE Corporation
3+
*
4+
* LINE Corporation licenses this file to you under the Apache License,
5+
* version 2.0 (the "License"); you may not use this file except in compliance
6+
* with the License. You may obtain a copy of the License at:
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations
14+
* under the License.
15+
*/
16+
/**
17+
* <a href="https://github.com/Netflix/eureka/">Eureka</a>-related common classes.
18+
*/
19+
@NonNullByDefault
20+
package com.linecorp.armeria.common.eureka;
21+
22+
import com.linecorp.armeria.common.annotation.NonNullByDefault;

Diff for: eureka/src/main/java/com/linecorp/armeria/internal/common/eureka/Application.java

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import com.fasterxml.jackson.annotation.JsonRootName;
2525
import com.google.common.collect.ImmutableSet;
2626

27+
import com.linecorp.armeria.common.eureka.InstanceInfo;
28+
2729
/**
2830
* An application.
2931
*/

Diff for: eureka/src/main/java/com/linecorp/armeria/internal/common/eureka/EurekaWebClient.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
import com.linecorp.armeria.common.QueryParamsBuilder;
3535
import com.linecorp.armeria.common.RequestHeaders;
3636
import com.linecorp.armeria.common.annotation.Nullable;
37-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus;
37+
import com.linecorp.armeria.common.eureka.InstanceInfo;
38+
import com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus;
3839

3940
/**
4041
* A Eureka {@link WebClient} which communicates to the

Diff for: eureka/src/main/java/com/linecorp/armeria/server/eureka/EurekaUpdatingListener.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@
3838
import com.linecorp.armeria.common.annotation.Nullable;
3939
import com.linecorp.armeria.common.util.SystemInfo;
4040
import com.linecorp.armeria.internal.common.eureka.EurekaWebClient;
41-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo;
42-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus;
43-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.PortWrapper;
41+
import com.linecorp.armeria.common.eureka.InstanceInfo;
42+
import com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus;
43+
import com.linecorp.armeria.common.eureka.InstanceInfo.PortWrapper;
4444
import com.linecorp.armeria.server.Route;
4545
import com.linecorp.armeria.server.RoutePathType;
4646
import com.linecorp.armeria.server.Server;

Diff for: eureka/src/main/java/com/linecorp/armeria/server/eureka/InstanceInfoBuilder.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
import com.linecorp.armeria.common.SessionProtocol;
2929
import com.linecorp.armeria.common.annotation.Nullable;
3030
import com.linecorp.armeria.internal.common.eureka.DataCenterInfo;
31-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo;
32-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus;
33-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.PortWrapper;
31+
import com.linecorp.armeria.common.eureka.InstanceInfo;
32+
import com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus;
33+
import com.linecorp.armeria.common.eureka.InstanceInfo.PortWrapper;
3434
import com.linecorp.armeria.internal.common.eureka.LeaseInfo;
3535

3636
import io.netty.util.NetUtil;

Diff for: eureka/src/test/java/com/linecorp/armeria/client/eureka/ArmeriaEurekaClientTest.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
import com.linecorp.armeria.common.annotation.Nullable;
5555
import com.linecorp.armeria.common.auth.AuthToken;
5656
import com.linecorp.armeria.internal.common.eureka.EurekaWebClient;
57-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo.PortWrapper;
57+
import com.linecorp.armeria.common.eureka.InstanceInfo.PortWrapper;
5858

5959
import jakarta.ws.rs.core.MediaType;
6060

@@ -118,19 +118,19 @@ public EurekaHttpResponse<Void> register(InstanceInfo info) {
118118
return convertVoidResponse(delegate.register(convertInstanceInfo(info)));
119119
}
120120

121-
private static com.linecorp.armeria.internal.common.eureka.InstanceInfo convertInstanceInfo(
121+
private static com.linecorp.armeria.common.eureka.InstanceInfo convertInstanceInfo(
122122
InstanceInfo info) {
123123
final PortWrapper port = new PortWrapper(info.isPortEnabled(PortType.UNSECURE), info.getPort());
124124
final PortWrapper securePort = new PortWrapper(info.isPortEnabled(PortType.SECURE),
125125
info.getSecurePort());
126126

127-
return new com.linecorp.armeria.internal.common.eureka.InstanceInfo(
127+
return new com.linecorp.armeria.common.eureka.InstanceInfo(
128128
info.getInstanceId(),
129129
info.getAppName(), info.getAppGroupName(), info.getHostName(),
130130
info.getIPAddr(),
131131
info.getVIPAddress(), info.getSecureVipAddress(), port,
132132
securePort,
133-
com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus
133+
com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus
134134
.toEnum(info.getStatus().name()), info.getHomePageUrl(),
135135
info.getStatusPageUrl(),
136136
info.getHealthCheckUrl(),
@@ -162,7 +162,7 @@ public EurekaHttpResponse<InstanceInfo> sendHeartBeat(String appName, String id,
162162
return convertResponse(delegate.sendHeartBeat(
163163
appName, id, convertInstanceInfo(info),
164164
overriddenStatus == null ?
165-
null : com.linecorp.armeria.internal.common.eureka.InstanceInfo.InstanceStatus
165+
null : com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus
166166
.toEnum(overriddenStatus.name())),
167167
InstanceInfo.class);
168168
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.linecorp.armeria.common.eureka;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import com.linecorp.armeria.client.Endpoint;
11+
import com.linecorp.armeria.common.eureka.InstanceInfo.InstanceStatus;
12+
import com.linecorp.armeria.common.eureka.InstanceInfo.PortWrapper;
13+
import com.linecorp.armeria.internal.common.eureka.DataCenterInfo;
14+
import com.linecorp.armeria.internal.common.eureka.LeaseInfo;
15+
16+
class InstanceInfoTest {
17+
18+
@Test
19+
void getShouldReturnAssociatedInstanceInfo() {
20+
21+
final String instanceId = "123";
22+
final String appName = "myApp";
23+
final String appGroupName = "myGroup";
24+
final String hostName = "myHost";
25+
final String ipAddr = "192.168.1.1";
26+
final String vipAddress = "10.0.0.1";
27+
final String secureVipAddress = "10.0.0.2";
28+
final PortWrapper port = new PortWrapper(true,80);
29+
final PortWrapper securePort = new PortWrapper(true,443);
30+
final InstanceInfo. InstanceStatus status = InstanceStatus.UP;
31+
final String homePageUrl = "https://example.com";
32+
final String statusPageUrl = "https://status.example.com";
33+
final String healthCheckUrl = "/health";
34+
final String secureHealthCheckUrl = "/secure/health";
35+
final DataCenterInfo dataCenterInfo = new DataCenterInfo("name",new HashMap<>());
36+
final LeaseInfo leaseInfo = new LeaseInfo(30,90);
37+
final Map<String, String> metadata = new HashMap<>();
38+
final InstanceInfo instanceInfo = new InstanceInfo(
39+
instanceId,
40+
appName,
41+
appGroupName,
42+
hostName,
43+
ipAddr,
44+
vipAddress,
45+
secureVipAddress,
46+
port,
47+
securePort,
48+
status,
49+
homePageUrl,
50+
statusPageUrl,
51+
healthCheckUrl,
52+
secureHealthCheckUrl,
53+
dataCenterInfo,
54+
leaseInfo,
55+
metadata
56+
);
57+
final Endpoint endpoint = Endpoint.parse("foo");
58+
59+
final Endpoint endpointWith = InstanceInfo.with(endpoint, instanceInfo);
60+
61+
final InstanceInfo instanceInfoRetrieved = InstanceInfo.get(endpointWith);
62+
assertThat(instanceInfoRetrieved).isNotNull();
63+
assertThat(instanceInfoRetrieved).isSameAs(instanceInfo);
64+
assertThat(instanceInfoRetrieved.getInstanceId()).isEqualTo(instanceId);
65+
assertThat(instanceInfoRetrieved.getAppName()).isEqualTo(appName);
66+
assertThat(instanceInfoRetrieved.getAppGroupName()).isEqualTo(appGroupName);
67+
assertThat(instanceInfoRetrieved.getHostName()).isEqualTo(hostName);
68+
assertThat(instanceInfoRetrieved.getIpAddr()).isEqualTo(ipAddr);
69+
assertThat(instanceInfoRetrieved.getVipAddress()).isEqualTo(vipAddress);
70+
assertThat(instanceInfoRetrieved.getSecureVipAddress()).isEqualTo(secureVipAddress);
71+
assertThat(instanceInfoRetrieved.getPort()).isEqualTo(port);
72+
assertThat(instanceInfoRetrieved.getSecurePort()).isEqualTo(securePort);
73+
assertThat(instanceInfoRetrieved.getStatus()).isEqualTo(status);
74+
assertThat(instanceInfoRetrieved.getHomePageUrl()).isEqualTo(homePageUrl);
75+
assertThat(instanceInfoRetrieved.getStatusPageUrl()).isEqualTo(statusPageUrl);
76+
assertThat(instanceInfoRetrieved.getHealthCheckUrl()).isEqualTo(healthCheckUrl);
77+
assertThat(instanceInfoRetrieved.getSecureHealthCheckUrl()).isEqualTo(secureHealthCheckUrl);
78+
assertThat(instanceInfoRetrieved.getDataCenterInfo()).isEqualTo(dataCenterInfo);
79+
assertThat(instanceInfoRetrieved.getLeaseInfo()).isEqualTo(leaseInfo);
80+
assertThat(instanceInfoRetrieved.getMetadata()).isEqualTo(metadata);
81+
82+
}
83+
}

Diff for: eureka/src/test/java/com/linecorp/armeria/server/eureka/EurekaUpdatingListenerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import com.linecorp.armeria.common.RequestHeaders;
4444
import com.linecorp.armeria.common.SessionProtocol;
4545
import com.linecorp.armeria.common.util.SystemInfo;
46-
import com.linecorp.armeria.internal.common.eureka.InstanceInfo;
46+
import com.linecorp.armeria.common.eureka.InstanceInfo;
4747
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
4848
import com.linecorp.armeria.server.Server;
4949
import com.linecorp.armeria.server.ServerBuilder;

0 commit comments

Comments
 (0)