Skip to content

Commit cbf0b84

Browse files
committed
addressing review comments
1 parent e95901f commit cbf0b84

File tree

2 files changed

+86
-17
lines changed

2 files changed

+86
-17
lines changed

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

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.HashSet;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Optional;
3132
import java.util.Set;
3233
import java.util.stream.Collectors;
3334
import okhttp3.Call;
@@ -68,27 +69,18 @@ public Set<APIResource> findAll(
6869
String group, List<String> versions, String preferredVersion, String path)
6970
throws ApiException {
7071
V1APIResourceList resourceList = resourceDiscovery(path);
71-
return sort(group, versions, preferredVersion, resourceList);
72+
return groupResourcesByName(group, versions, preferredVersion, resourceList);
7273
}
7374

74-
private Set<APIResource> sort(
75-
String group, List<String> versions, String preferredVersion, V1APIResourceList resourceList)
76-
throws ApiException {
77-
Map<String, Set<String>> subResources = new HashMap<>();
75+
public Set<APIResource> groupResourcesByName(
76+
String group,
77+
List<String> versions,
78+
String preferredVersion,
79+
V1APIResourceList resourceList) {
80+
// parse raw discovery responses to APIResource for better readability
7881
Set<APIResource> resources =
7982
resourceList.getResources().stream()
80-
.filter(
81-
r -> {
82-
boolean isSubResource = r.getName().contains("/");
83-
if (isSubResource) {
84-
String[] parts = r.getName().split("/", 2);
85-
if (!subResources.containsKey(parts[0])) {
86-
subResources.put(parts[0], new HashSet<>());
87-
}
88-
subResources.get(parts[0]).add(parts[1]);
89-
}
90-
return !isSubResource;
91-
})
83+
.filter(r -> !getSubResourceNameIfPossible(r.getName()).isPresent())
9284
.map(
9385
r ->
9486
new APIResource(
@@ -100,6 +92,9 @@ private Set<APIResource> sort(
10092
r.getName(),
10193
r.getSingularName()))
10294
.collect(Collectors.toSet());
95+
96+
// wiring up connections between major-resource and sub-resources
97+
Map<String, Set<String>> subResources = manageRelationFromResourceToSubResources(resourceList);
10398
resources.stream()
10499
.forEach(
105100
r -> {
@@ -110,6 +105,37 @@ private Set<APIResource> sort(
110105
return resources;
111106
}
112107

108+
private Map<String, Set<String>> manageRelationFromResourceToSubResources(
109+
V1APIResourceList resourceList) {
110+
Map<String, Set<String>> subResources = new HashMap<>();
111+
resourceList.getResources().stream()
112+
.forEach(r -> subResources.put(r.getName(), new HashSet<>()));
113+
resourceList.getResources().stream()
114+
.forEach(
115+
r -> {
116+
getSubResourceNameIfPossible(r.getName())
117+
.ifPresent(
118+
subResourceName -> {
119+
subResources.get(getMajorResourceName(r.getName())).add(subResourceName);
120+
});
121+
});
122+
return subResources;
123+
}
124+
125+
private String getMajorResourceName(String discoveredResourceName) {
126+
String[] parts = discoveredResourceName.split("/", 2);
127+
return parts[0];
128+
}
129+
130+
private Optional<String> getSubResourceNameIfPossible(String discoveredResourceName) {
131+
boolean isSubResource = discoveredResourceName.contains("/");
132+
if (!isSubResource) {
133+
return Optional.empty();
134+
}
135+
String[] parts = discoveredResourceName.split("/", 2);
136+
return Optional.of(parts[1]);
137+
}
138+
113139
public V1APIVersions legacyCoreApi() throws ApiException {
114140
return versionDiscovery("/api");
115141
}

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818
import com.github.tomakehurst.wiremock.junit.WireMockRule;
1919
import io.kubernetes.client.openapi.ApiClient;
2020
import io.kubernetes.client.openapi.ApiException;
21+
import io.kubernetes.client.openapi.models.V1APIResource;
22+
import io.kubernetes.client.openapi.models.V1APIResourceList;
2123
import io.kubernetes.client.openapi.models.V1APIVersions;
2224
import io.kubernetes.client.util.ClientBuilder;
2325
import java.io.IOException;
2426
import java.util.Arrays;
27+
import java.util.Set;
2528
import org.junit.Before;
2629
import org.junit.Rule;
2730
import org.junit.Test;
@@ -56,4 +59,44 @@ public void testDiscoveryRequest() throws ApiException {
5659
verify(1, getRequestedFor(urlPathEqualTo("/foo")));
5760
assertEquals(2, versions.getVersions().size());
5861
}
62+
63+
@Test
64+
public void testGroupResourcesByName() {
65+
Discovery discovery = new Discovery(apiClient);
66+
Set<Discovery.APIResource> discoveredResources =
67+
discovery.groupResourcesByName(
68+
"foo",
69+
Arrays.asList("v1", "v2"),
70+
"v1",
71+
new V1APIResourceList()
72+
.resources(
73+
Arrays.asList(
74+
new V1APIResource()
75+
.name("meows")
76+
.kind("Meow")
77+
.namespaced(true)
78+
.singularName("meow"),
79+
new V1APIResource()
80+
.name("meows/mouse")
81+
.kind("MeowMouse")
82+
.namespaced(true)
83+
.singularName(""),
84+
new V1APIResource()
85+
.name("zigs")
86+
.kind("Zig")
87+
.namespaced(false)
88+
.singularName("zig"))));
89+
assertEquals(2, discoveredResources.size());
90+
91+
Discovery.APIResource meow =
92+
discoveredResources.stream()
93+
.filter(r -> r.getResourcePlural().equals("meows"))
94+
.findFirst()
95+
.get();
96+
assertEquals(1, meow.getSubResources().size());
97+
assertEquals("meows", meow.getResourcePlural());
98+
assertEquals("meow", meow.getResourceSingular());
99+
assertEquals(true, meow.getNamespaced());
100+
assertEquals("mouse", meow.getSubResources().get(0));
101+
}
59102
}

0 commit comments

Comments
 (0)