Skip to content

Commit e5dcfe4

Browse files
committed
map output to groups, add test, cleanup
1 parent b9d5f9e commit e5dcfe4

File tree

6 files changed

+122
-31
lines changed

6 files changed

+122
-31
lines changed

pom.xml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212

1313
<properties>
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
<hadoop.version>3.3.6</hadoop.version>
16+
<maven.compiler.source>11</maven.compiler.source>
17+
<maven.compiler.target>11</maven.compiler.target>
1518
</properties>
1619

1720
<dependencies>
1821
<dependency>
1922
<groupId>org.apache.hadoop</groupId>
2023
<artifactId>hadoop-common</artifactId>
21-
<version>3.3.6</version>
24+
<version>${hadoop.version}</version>
2225
<scope>provided</scope>
2326
<exclusions>
2427
<exclusion>
@@ -42,7 +45,7 @@
4245
<dependency>
4346
<groupId>junit</groupId>
4447
<artifactId>junit</artifactId>
45-
<version>3.8.1</version>
48+
<version>4.13.1</version>
4649
<scope>test</scope>
4750
</dependency>
4851
</dependencies>
@@ -64,10 +67,6 @@
6467
<pattern>com.fasterxml</pattern>
6568
<shadedPattern>org.shaded.fasterxml</shadedPattern>
6669
</relocation>
67-
<relocation>
68-
<pattern>io.fabric8</pattern>
69-
<shadedPattern>org.shaded.fabric8</shadedPattern>
70-
</relocation>
7170
</relocations>
7271
</configuration>
7372
</execution>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package tech.stackable.hadoop;
2+
3+
public class OpaQuery {
4+
public final OpaQueryInput input;
5+
6+
public OpaQuery(OpaQueryInput input) {
7+
this.input = input;
8+
}
9+
10+
public static class OpaQueryInput {
11+
public final String username;
12+
public OpaQueryInput(String user) {
13+
this.username = user;
14+
}
15+
}
16+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tech.stackable.hadoop;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import org.apache.hadoop.util.Lists;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.function.UnaryOperator;
9+
10+
public class OpaQueryResult {
11+
public Map<String, Map<String, Object>> result;
12+
public List<String> groups;
13+
14+
@SuppressWarnings("unchecked")
15+
@JsonProperty("result")
16+
private void unpackNested(Map<String, Map<String, Object>> result) {
17+
this.result = result;
18+
List<String> rawGroups = Lists.newArrayList();
19+
for (String group : (List<String>) result.get("groups").get("groups")) {
20+
rawGroups.add(removeSlashes.apply(group));
21+
}
22+
23+
this.groups = rawGroups;
24+
}
25+
26+
private final static UnaryOperator<String> removeSlashes = s -> {
27+
if (s.startsWith("/")) {
28+
s = s.substring(1);
29+
}
30+
if (s.endsWith("/")) {
31+
s = s.substring(0, s.length() - 1);
32+
}
33+
return s;
34+
};
35+
}

src/main/java/tech/stackable/hadoop/StackableGroupMapper.java

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import org.apache.hadoop.conf.Configuration;
77
import org.apache.hadoop.security.GroupMappingServiceProvider;
8-
import org.apache.hadoop.util.Lists;
98
import org.slf4j.Logger;
109
import org.slf4j.LoggerFactory;
1110

@@ -34,21 +33,6 @@ public StackableGroupMapper() {
3433
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
3534
}
3635

37-
private static class OpaQuery {
38-
public OpaQueryInput input;
39-
40-
public OpaQuery(OpaQueryInput input) {
41-
this.input = input;
42-
}
43-
}
44-
45-
public class OpaQueryInput {
46-
public final String username;
47-
public OpaQueryInput(String user) {
48-
this.username = user;
49-
}
50-
}
51-
5236
/**
5337
* Returns list of groups for a user.
5438
*
@@ -68,7 +52,7 @@ public List<String> getGroups(String user) throws IOException {
6852
URI opaUri = URI.create(opaMappingUrl);
6953
HttpResponse<String> response = null;
7054

71-
OpaQuery query = new OpaQuery(new OpaQueryInput(user));
55+
OpaQuery query = new OpaQuery(new OpaQuery.OpaQueryInput(user));
7256
String body = json.writeValueAsString(query);
7357

7458
LOG.info("Request body [{}]", body);
@@ -82,16 +66,16 @@ public List<String> getGroups(String user) throws IOException {
8266
LOG.error(e.getMessage());
8367
}
8468

85-
switch (response.statusCode()) {
86-
case 200:
87-
break;
88-
default:
89-
throw new IOException(opaUri.toString());
69+
if (response == null || response.statusCode() != 200) {
70+
throw new IOException(opaUri.toString());
9071
}
9172
String responseBody = response.body();
9273
LOG.info("Response body [{}]", responseBody);
9374

94-
return Lists.newArrayList("me", "myself", "I");
75+
OpaQueryResult result = json.readValue(responseBody, OpaQueryResult.class);
76+
LOG.info("Groups for [{}]: [{}]", user, result.groups);
77+
78+
return result.groups;
9579
}
9680

9781
/**
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package tech.stackable.hadoop;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.databind.DeserializationFeature;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
10+
public class StackableGroupMapperTest {
11+
12+
@Test
13+
public void testJsonMapper() throws JsonProcessingException {
14+
String input = "{\n" +
15+
" \"result\": {\n" +
16+
" \"groups\": {\n" +
17+
" \"groups\": [\n" +
18+
" \"/admin\",\n" +
19+
" \"/superuser\"\n" +
20+
" ]\n" +
21+
" },\n" +
22+
" \"users_by_name\": {\n" +
23+
" \"alice\": {\n" +
24+
" \"customAttributes\": {},\n" +
25+
" \"groups\": [\n" +
26+
" \"/superset-admin\"\n" +
27+
" ],\n" +
28+
" \"id\": \"af07f12c-1234-40a7-93e0-874537bdf3f5\",\n" +
29+
" \"username\": \"alice\"\n" +
30+
" },\n" +
31+
" \"bob\": {\n" +
32+
" \"customAttributes\": {},\n" +
33+
" \"groups\": [\n" +
34+
" \"/admin\"\n" +
35+
" ],\n" +
36+
" \"id\": \"af07f12c-2345-40a7-93e0-874537bdf3f5\",\n" +
37+
" \"username\": \"bob\"\n" +
38+
" },\n" +
39+
" \"stackable\": {\n" +
40+
" \"customAttributes\": {},\n" +
41+
" \"groups\": [\n" +
42+
" \"/admin\",\n" +
43+
" \"/superuser\"\n" +
44+
" ],\n" +
45+
" \"id\": \"af07f12c-3456-40a7-93e0-874537bdf3f5\",\n" +
46+
" \"username\": \"stackable\"\n" +
47+
" }\n" +
48+
" }\n" +
49+
" }\n" +
50+
"}";
51+
52+
ObjectMapper json = new ObjectMapper()
53+
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
54+
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
55+
OpaQueryResult result = json.readValue(input, OpaQueryResult.class);
56+
Assert.assertEquals("admin", result.groups.get(0));
57+
Assert.assertEquals("superuser", result.groups.get(1));
58+
}
59+
}

test/stack/10-hdfs.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ spec:
3636
default:
3737
envOverrides:
3838
HADOOP_CLASSPATH: "/stackable/hadoop/share/hadoop/tools/lib/*.jar"
39-
USERS_MAPPING_SUFFIX: "v1/data/hdfs"
40-
USERS_MAPPING_TARGET: "users"
4139
configOverrides:
4240
core-site.xml:
4341
hadoop.security.group.mapping: "tech.stackable.hadoop.StackableGroupMapper"

0 commit comments

Comments
 (0)