Skip to content

Commit 599b4c7

Browse files
Jasonjbutler
Jason
authored andcommitted
Add device group configuration models
1 parent b100149 commit 599b4c7

14 files changed

+406
-5
lines changed

Diff for: lombok.config

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lombok.addLombokGeneratedAnnotation = true

Diff for: pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@
4545
<dependency>
4646
<groupId>com.aws.greengrass</groupId>
4747
<artifactId>nucleus</artifactId>
48-
<version>2.0.0-SNAPSHOT</version>
48+
<version>2.1.0-SNAPSHOT</version>
4949
<scope>provided</scope>
5050
</dependency>
5151
<dependency>
5252
<groupId>com.aws.greengrass</groupId>
5353
<artifactId>nucleus</artifactId>
54-
<version>2.0.0-SNAPSHOT</version>
54+
<version>2.1.0-SNAPSHOT</version>
5555
<type>test-jar</type>
5656
<scope>test</scope>
5757
</dependency>
@@ -70,7 +70,7 @@
7070
<dependency>
7171
<groupId>org.mockito</groupId>
7272
<artifactId>mockito-junit-jupiter</artifactId>
73-
<version>3.2.4</version>
73+
<version>3.5.13</version>
7474
<scope>test</scope>
7575
</dependency>
7676
</dependencies>

Diff for: src/main/java/com/aws/greengrass/device/DeviceSupportService.java

+39-2
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,60 @@
55

66
package com.aws.greengrass.device;
77

8+
import com.aws.greengrass.config.Node;
89
import com.aws.greengrass.config.Topics;
10+
import com.aws.greengrass.config.WhatHappened;
911
import com.aws.greengrass.dependency.ImplementsService;
12+
import com.aws.greengrass.device.configuration.GroupConfiguration;
13+
import com.aws.greengrass.device.configuration.GroupManager;
1014
import com.aws.greengrass.lifecyclemanager.PluginService;
15+
import com.fasterxml.jackson.databind.MapperFeature;
16+
import com.fasterxml.jackson.databind.ObjectMapper;
1117

1218
import javax.inject.Inject;
1319

20+
import static com.aws.greengrass.componentmanager.KernelConfigResolver.CONFIGURATION_CONFIG_KEY;
21+
1422
@ImplementsService(name = DeviceSupportService.DEVICE_SUPPORT_SERVICE_NAME)
23+
@SuppressWarnings("PMD.UnusedPrivateField")
1524
public class DeviceSupportService extends PluginService {
1625
public static final String DEVICE_SUPPORT_SERVICE_NAME = "aws.greengrass.DeviceSupport";
26+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
27+
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
28+
29+
private final GroupManager groupManager;
30+
31+
private final SessionManager sessionManager;
32+
33+
private final Topics configurationTopics;
1734

1835
/**
1936
* Constructor.
2037
*
21-
* @param topics Root Configuration topic for this service
38+
* @param topics Root Configuration topic for this service
39+
* @param groupManager Group configuration management
40+
* @param sessionManager Session management
2241
*/
2342
@Inject
24-
public DeviceSupportService(Topics topics) {
43+
public DeviceSupportService(Topics topics, GroupManager groupManager, SessionManager sessionManager) {
2544
super(topics);
45+
this.groupManager = groupManager;
46+
this.sessionManager = sessionManager;
47+
48+
//handleConfiguration
49+
this.configurationTopics = topics.lookupTopics(CONFIGURATION_CONFIG_KEY);
50+
this.configurationTopics.subscribe(this::handleConfigurationChange);
51+
}
52+
53+
@SuppressWarnings("PMD.UnusedFormalParameter")
54+
private void handleConfigurationChange(WhatHappened whatHappened, Node childNode) {
55+
try {
56+
groupManager.setGroupConfiguration(
57+
OBJECT_MAPPER.convertValue(configurationTopics.toPOJO(), GroupConfiguration.class));
58+
} catch (IllegalArgumentException e) {
59+
logger.atError().kv("service", DEVICE_SUPPORT_SERVICE_NAME).kv("event", whatHappened)
60+
.kv("node", configurationTopics.getFullName()).kv("value", configurationTopics).setCause(e)
61+
.log("Unable to parse group configuration");
62+
}
2663
}
2764
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.aws.greengrass.device;
2+
3+
/**
4+
* Singleton class for managing AuthN and AuthZ session.
5+
*/
6+
public class SessionManager {
7+
8+
public Session getSession(String sessionId) {
9+
return null;
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.aws.greengrass.device.configuration;
7+
8+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
9+
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
10+
import lombok.Builder;
11+
import lombok.Value;
12+
13+
import java.util.Collections;
14+
import java.util.Set;
15+
16+
@Value
17+
@Builder
18+
@JsonDeserialize(builder = AuthorizationPolicy.AuthorizationPolicyBuilder.class)
19+
public class AuthorizationPolicy {
20+
21+
String policyId;
22+
23+
String policyDescription;
24+
25+
@Builder.Default
26+
Effect effect = Effect.ALLOW;
27+
28+
@Builder.Default
29+
Set<String> operations = Collections.emptySet();
30+
31+
@Builder.Default
32+
Set<String> resources = Collections.emptySet();
33+
34+
@JsonPOJOBuilder(withPrefix = "")
35+
public static class AuthorizationPolicyBuilder {
36+
}
37+
38+
public enum Effect {
39+
ALLOW, DENY
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.aws.greengrass.device.configuration;
7+
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
public enum ConfigurationFormatVersion {
11+
@JsonProperty("2021-03-05") MAR_05_2021
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.aws.greengrass.device.configuration;
7+
8+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
9+
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
10+
import lombok.Builder;
11+
import lombok.Value;
12+
13+
import java.util.Collections;
14+
import java.util.Map;
15+
16+
@Value
17+
@Builder
18+
@JsonDeserialize(builder = GroupConfiguration.GroupConfigurationBuilder.class)
19+
public class GroupConfiguration {
20+
21+
@Builder.Default
22+
ConfigurationFormatVersion version = ConfigurationFormatVersion.MAR_05_2021;
23+
24+
@Builder.Default
25+
Map<String, GroupDefinition> groups = Collections.emptyMap();
26+
27+
@Builder.Default
28+
Map<String, Map<String, AuthorizationPolicy>> roles = Collections.emptyMap();
29+
30+
@JsonPOJOBuilder(withPrefix = "")
31+
public static class GroupConfigurationBuilder {
32+
}
33+
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.aws.greengrass.device.configuration;
7+
8+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
9+
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
10+
import lombok.Builder;
11+
import lombok.NonNull;
12+
import lombok.Value;
13+
14+
@Value
15+
@JsonDeserialize(builder = GroupDefinition.GroupDefinitionBuilder.class)
16+
public class GroupDefinition {
17+
18+
String selectionRule;
19+
20+
// RuleExpressionNode ruleExpressionTree;
21+
22+
String roleName;
23+
24+
@Builder
25+
GroupDefinition(@NonNull String selectionRule, @NonNull String roleName) {
26+
this.selectionRule = selectionRule;
27+
//TODO build binary expression tree from rule string
28+
// this.ruleExpressionTree = null;
29+
this.roleName = roleName;
30+
}
31+
32+
@JsonPOJOBuilder(withPrefix = "")
33+
public static class GroupDefinitionBuilder {
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.aws.greengrass.device.configuration;
7+
8+
import com.aws.greengrass.device.Session;
9+
import com.aws.greengrass.logging.api.Logger;
10+
import com.aws.greengrass.logging.impl.LogManager;
11+
12+
import java.util.Collections;
13+
import java.util.Set;
14+
import java.util.concurrent.atomic.AtomicReference;
15+
16+
/**
17+
* a singleton manager class for managing device group roles.
18+
* It listens to configuration update through nucleus, On the hand, for each request in a session, it iterate through
19+
* the configurations to find match group(s), returning the authorization policies of group(s).
20+
*/
21+
@SuppressWarnings("PMD.UnusedPrivateField")
22+
public class GroupManager {
23+
private static final Logger logger = LogManager.getLogger(GroupManager.class);
24+
25+
private final AtomicReference<GroupConfiguration> groupConfigurationRef = new AtomicReference<>();
26+
27+
public void setGroupConfiguration(GroupConfiguration groupConfiguration) {
28+
groupConfigurationRef.set(groupConfiguration);
29+
}
30+
31+
/**
32+
* find applicable policies to evaluate for the given device request.
33+
*
34+
* @param session session used to retrieve cached device attributes
35+
* @return set of applicable policy for the device
36+
*/
37+
public Set<AuthorizationPolicy> getApplicablePolicies(Session session) {
38+
// GroupConfiguration config = groupConfiguration.get();
39+
//TODO iterate groups to find matching group(s), return the policies.
40+
41+
return Collections.emptySet();
42+
}
43+
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.aws.greengrass.device.configuration;
2+
3+
4+
import lombok.Value;
5+
6+
// placeholder, replace with javaCC generated tree node
7+
@Value
8+
public class RuleExpressionNode {
9+
RuleExpressionNode left;
10+
RuleExpressionNode right;
11+
}

0 commit comments

Comments
 (0)