Skip to content

Commit c5dcaa0

Browse files
committed
fix: discovery fail when at least one api is unavailable
1 parent 248446d commit c5dcaa0

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

util/src/main/java/io/kubernetes/client/Discovery.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@
3232
import java.util.Set;
3333
import java.util.stream.Collectors;
3434
import okhttp3.Call;
35+
import org.slf4j.Logger;
36+
import org.slf4j.LoggerFactory;
3537

3638
public class Discovery {
3739

40+
private static final Logger LOGGER = LoggerFactory.getLogger(Discovery.class);
3841
private final ApiClient apiClient;
3942

4043
public Discovery() {
@@ -60,16 +63,18 @@ public Set<APIResource> findAll() throws ApiException {
6063
return allResources;
6164
}
6265

63-
public Set<APIResource> findAll(String group, List<String> versions, String preferredVersion)
64-
throws ApiException {
66+
public Set<APIResource> findAll(String group, List<String> versions, String preferredVersion) {
6567
return findAll(group, versions, preferredVersion, "/apis/" + group + "/" + preferredVersion);
6668
}
6769

68-
public Set<APIResource> findAll(
69-
String group, List<String> versions, String preferredVersion, String path)
70-
throws ApiException {
71-
V1APIResourceList resourceList = resourceDiscovery(path);
72-
return groupResourcesByName(group, versions, preferredVersion, resourceList);
70+
public Set<APIResource> findAll(String group, List<String> versions, String preferredVersion, String path) {
71+
try {
72+
V1APIResourceList resourceList = resourceDiscovery(path);
73+
return groupResourcesByName(group, versions, preferredVersion, resourceList);
74+
} catch (ApiException e) {
75+
LOGGER.warn("Api {} returns a {} code, all api resources managed by this api cannot be discovered", path, e.getCode(), e);
76+
return Collections.emptySet();
77+
}
7378
}
7479

7580
public Set<APIResource> groupResourcesByName(

util/src/test/java/io/kubernetes/client/DiscoveryTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.junit.Assert.assertEquals;
2121

2222
import com.github.tomakehurst.wiremock.junit.WireMockRule;
23+
import io.kubernetes.client.Discovery.APIResource;
2324
import io.kubernetes.client.openapi.ApiClient;
2425
import io.kubernetes.client.openapi.ApiException;
2526
import io.kubernetes.client.openapi.models.V1APIResource;
@@ -28,6 +29,7 @@
2829
import io.kubernetes.client.util.ClientBuilder;
2930
import java.io.IOException;
3031
import java.util.Arrays;
32+
import java.util.List;
3133
import java.util.Set;
3234
import org.junit.Before;
3335
import org.junit.Rule;
@@ -101,4 +103,53 @@ public void testGroupResourcesByName() {
101103
assertEquals(true, meow.getNamespaced());
102104
assertEquals("mouse", meow.getSubResources().get(0));
103105
}
106+
107+
@Test
108+
public void findAllShouldReturnAllApiResourceWhenApiResponseIsSuccess() {
109+
Discovery discovery = new Discovery(apiClient);
110+
111+
String group = "test.com";
112+
String version = "v1";
113+
String path="/apis/"+group+'/'+version;
114+
115+
wireMockRule.stubFor(
116+
get(urlPathEqualTo(path))
117+
.willReturn(
118+
aResponse()
119+
.withStatus(200)
120+
.withHeader("Content-Type", "application/json")
121+
.withBody(
122+
apiClient
123+
.getJSON()
124+
.serialize(new V1APIResourceList()
125+
.resources(
126+
Arrays.asList(
127+
new V1APIResource()
128+
.name("first"),
129+
new V1APIResource()
130+
.name("second")))))));
131+
132+
Set<APIResource> apiResources = discovery.findAll(group, List.of(version), version);
133+
wireMockRule.verify(1, getRequestedFor(urlPathEqualTo(path)));
134+
assertEquals(2, apiResources.size());
135+
}
136+
137+
@Test
138+
public void findAllShouldReturnEmptyListWhenApiResponseIsNotSuccess() {
139+
Discovery discovery = new Discovery(apiClient);
140+
141+
String group = "test.com";
142+
String version = "v1";
143+
String path="/apis/"+group+'/'+version;
144+
145+
wireMockRule.stubFor(
146+
get(urlPathEqualTo(path))
147+
.willReturn(
148+
aResponse()
149+
.withStatus(503)));
150+
151+
Set<APIResource> apiResources = discovery.findAll(group, List.of(version), version);
152+
wireMockRule.verify(1, getRequestedFor(urlPathEqualTo(path)));
153+
assertEquals(0, apiResources.size());
154+
}
104155
}

0 commit comments

Comments
 (0)