This is an automated email from the ASF dual-hosted git repository.
markap14 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 806d8d6165 NIFI-12634 Ignored Blank Prefix Values in Kubernetes
Components (#8268)
806d8d6165 is described below
commit 806d8d61658c03537a38132eb5764900cb7b4e8c
Author: David Handermann <[email protected]>
AuthorDate: Fri Jan 19 07:30:45 2024 -0600
NIFI-12634 Ignored Blank Prefix Values in Kubernetes Components (#8268)
- Updated KubernetesConfigMapStateProvider and
KubernetesLeaderElectionManager to ignore blank prefix values as provided in
default configuration files
---
.../election/KubernetesLeaderElectionManager.java | 3 +-
.../KubernetesLeaderElectionManagerTest.java | 35 +++++++++++++++++-----
.../pom.xml | 4 +++
.../provider/KubernetesConfigMapStateProvider.java | 7 +++--
.../KubernetesConfigMapStateProviderTest.java | 26 +++++++++++-----
5 files changed, 56 insertions(+), 19 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/main/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManager.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/main/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManager.java
index ecefed0323..0272149470 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/main/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManager.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/main/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManager.java
@@ -80,7 +80,8 @@ public class KubernetesLeaderElectionManager extends
TrackedLeaderElectionManage
* Kubernetes Leader Election Manager constructor with NiFi Properties
*/
public KubernetesLeaderElectionManager(final NiFiProperties
nifiProperties) {
- this.roleIdPrefix =
nifiProperties.getProperty(NiFiProperties.CLUSTER_LEADER_ELECTION_KUBERNETES_LEASE_PREFIX);
+ final String leasePrefix =
nifiProperties.getProperty(NiFiProperties.CLUSTER_LEADER_ELECTION_KUBERNETES_LEASE_PREFIX);
+ this.roleIdPrefix = leasePrefix == null || leasePrefix.isBlank() ?
null : leasePrefix;
executorService = createExecutorService();
leaderElectionCommandProvider = createLeaderElectionCommandProvider();
}
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/test/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManagerTest.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/test/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManagerTest.java
index 3457332127..05c6f636c5 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/test/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManagerTest.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-leader-election/src/test/java/org/apache/nifi/kubernetes/leader/election/KubernetesLeaderElectionManagerTest.java
@@ -53,6 +53,8 @@ class KubernetesLeaderElectionManagerTest {
private static final String PREFIX = "label";
+ private static final String EMPTY_PREFIX = "";
+
@Mock
LeaderElectionStateChangeListener changeListener;
@@ -68,16 +70,11 @@ class KubernetesLeaderElectionManagerTest {
ManagedLeaderElectionCommandProvider leaderElectionCommandProvider;
KubernetesLeaderElectionManager manager;
- KubernetesLeaderElectionManager managerWithProperties;
@BeforeEach
void setManager() {
leaderElectionCommandProvider = new
ManagedLeaderElectionCommandProvider();
manager = new MockKubernetesLeaderElectionManager(new
NiFiProperties());
-
- final Properties properties = new Properties();
-
properties.setProperty(NiFiProperties.CLUSTER_LEADER_ELECTION_KUBERNETES_LEASE_PREFIX,
PREFIX);
- managerWithProperties = new MockKubernetesLeaderElectionManager(new
NiFiProperties(properties));
}
@Test
@@ -195,15 +192,37 @@ class KubernetesLeaderElectionManagerTest {
@Test
void testRoleIdWithPrefix() {
- managerWithProperties.start();
+ final Properties properties = new Properties();
+
properties.setProperty(NiFiProperties.CLUSTER_LEADER_ELECTION_KUBERNETES_LEASE_PREFIX,
PREFIX);
+ final MockKubernetesLeaderElectionManager electionManager = new
MockKubernetesLeaderElectionManager(new NiFiProperties(properties));
+
+ electionManager.start();
setSubmitStartLeading();
- managerWithProperties.register(ROLE, changeListener, PARTICIPANT_ID);
+ electionManager.register(ROLE, changeListener, PARTICIPANT_ID);
captureRunCommand();
- assertEquals(PREFIX + "-" + LEADER_ELECTION_ROLE.getRoleId(),
leaderElectionCommandProvider.name);
+ final String expected = String.format("%s-%s", PREFIX,
LEADER_ELECTION_ROLE.getRoleId());
+ assertEquals(expected, leaderElectionCommandProvider.name);
+ }
+
+ @Test
+ void testRoleIdWithEmptyPrefix() {
+ final Properties properties = new Properties();
+
properties.setProperty(NiFiProperties.CLUSTER_LEADER_ELECTION_KUBERNETES_LEASE_PREFIX,
EMPTY_PREFIX);
+ final MockKubernetesLeaderElectionManager electionManager = new
MockKubernetesLeaderElectionManager(new NiFiProperties(properties));
+
+ electionManager.start();
+
+ setSubmitStartLeading();
+
+ electionManager.register(ROLE, changeListener, PARTICIPANT_ID);
+
+ captureRunCommand();
+
+ assertEquals(LEADER_ELECTION_ROLE.getRoleId(),
leaderElectionCommandProvider.name);
}
private void setSubmitStartLeading() {
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/pom.xml
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/pom.xml
index 1ee073e5c4..a93989ddf0 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/pom.xml
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/pom.xml
@@ -48,6 +48,10 @@
<artifactId>kubernetes-server-mock</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-mock</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-expression-language</artifactId>
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/main/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProvider.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/main/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProvider.java
index 6c8d742e00..a4d90d5421 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/main/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProvider.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/main/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProvider.java
@@ -41,6 +41,7 @@ import java.util.regex.Pattern;
import org.apache.nifi.components.AbstractConfigurableComponent;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.PropertyValue;
+import org.apache.nifi.components.Validator;
import org.apache.nifi.components.state.Scope;
import org.apache.nifi.components.state.StateMap;
import org.apache.nifi.components.state.StateProvider;
@@ -48,7 +49,6 @@ import
org.apache.nifi.components.state.StateProviderInitializationContext;
import org.apache.nifi.kubernetes.client.ServiceAccountNamespaceProvider;
import org.apache.nifi.kubernetes.client.StandardKubernetesClientProvider;
import org.apache.nifi.logging.ComponentLog;
-import org.apache.nifi.processor.util.StandardValidators;
/**
* State Provider implementation based on Kubernetes ConfigMaps with Base64
encoded keys to meet Kubernetes constraints
@@ -57,7 +57,7 @@ public class KubernetesConfigMapStateProvider extends
AbstractConfigurableCompon
static final PropertyDescriptor CONFIG_MAP_NAME_PREFIX = new
PropertyDescriptor.Builder()
.name("ConfigMap Name Prefix")
.description("Optional prefix that the Provider will prepend to
Kubernetes ConfigMap names. The resulting ConfigMap name will contain
nifi-component and the component identifier.")
- .addValidator(StandardValidators.NON_BLANK_VALIDATOR)
+ .addValidator(Validator.VALID)
.required(false)
.build();
@@ -126,8 +126,9 @@ public class KubernetesConfigMapStateProvider extends
AbstractConfigurableCompon
this.namespace = new ServiceAccountNamespaceProvider().getNamespace();
final PropertyValue configMapNamePrefixProperty =
context.getProperty(CONFIG_MAP_NAME_PREFIX);
- final String configMapNamePrefix = configMapNamePrefixProperty.isSet()
? configMapNamePrefixProperty.getValue() + PREFIX_SEPARATOR : EMPTY_PREFIX;
+ final String prefixPropertyValue =
configMapNamePrefixProperty.getValue();
+ final String configMapNamePrefix = prefixPropertyValue == null ||
prefixPropertyValue.isBlank() ? EMPTY_PREFIX : prefixPropertyValue +
PREFIX_SEPARATOR;
configMapNameFormat = String.format(CONFIG_MAP_NAME_FORMAT,
configMapNamePrefix);
configMapNamePattern =
Pattern.compile(String.format(CONFIG_MAP_NAME_PATTERN_FORMAT,
configMapNamePrefix));
}
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/test/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProviderTest.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/test/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProviderTest.java
index 54b40e5833..d833113b97 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/test/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProviderTest.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-kubernetes-bundle/nifi-framework-kubernetes-state-provider/src/test/java/org/apache/nifi/kubernetes/state/provider/KubernetesConfigMapStateProviderTest.java
@@ -24,11 +24,14 @@ import
io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
import io.fabric8.kubernetes.client.server.mock.KubernetesMockServerExtension;
import io.fabric8.mockwebserver.dsl.HttpMethod;
import okhttp3.mockwebserver.RecordedRequest;
+import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.components.state.Scope;
import org.apache.nifi.components.state.StateMap;
import org.apache.nifi.components.state.StateProviderInitializationContext;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.parameter.ParameterLookup;
+import org.apache.nifi.util.MockProcessContext;
+import org.apache.nifi.util.MockValidationContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -72,6 +75,8 @@ class KubernetesConfigMapStateProviderTest {
private static final String CONFIG_MAP_NAME_PREFIX_VALUE = "label";
+ private static final String EMPTY = "";
+
@Mock
StateProviderInitializationContext context;
@@ -97,12 +102,19 @@ class KubernetesConfigMapStateProviderTest {
}
@Test
- void testInitializeShutdown() {
- setContext();
- provider.initialize(context);
+ void testInitializeValidateShutdown() {
+ setContextWithConfigMapNamePrefix(EMPTY);
+ provider.initialize(context);
assertEquals(IDENTIFIER, provider.getIdentifier());
+ final MockProcessContext processContext = new
MockProcessContext(provider);
+
processContext.setProperty(KubernetesConfigMapStateProvider.CONFIG_MAP_NAME_PREFIX,
EMPTY);
+ final MockValidationContext validationContext = new
MockValidationContext(processContext, null);
+ final Collection<ValidationResult> results =
provider.validate(validationContext);
+
+ assertTrue(results.isEmpty());
+
provider.shutdown();
}
@@ -299,7 +311,7 @@ class KubernetesConfigMapStateProviderTest {
@Test
void testSetStateGetStateWithPrefix() throws IOException {
- setContextWithProperties();
+ setContextWithConfigMapNamePrefix(CONFIG_MAP_NAME_PREFIX_VALUE);
provider.initialize(context);
final Map<String, String> state =
Collections.singletonMap(STATE_PROPERTY, STATE_VALUE);
@@ -317,7 +329,7 @@ class KubernetesConfigMapStateProviderTest {
@Test
void testSetStateGetStoredComponentIdsWithPrefix() throws IOException {
- setContextWithProperties();
+ setContextWithConfigMapNamePrefix(CONFIG_MAP_NAME_PREFIX_VALUE);
provider.initialize(context);
final Collection<String> initialStoredComponentIds =
provider.getStoredComponentIds();
@@ -340,10 +352,10 @@ class KubernetesConfigMapStateProviderTest {
.thenReturn(new StandardPropertyValue(null, null,
ParameterLookup.EMPTY));
}
- private void setContextWithProperties() {
+ private void setContextWithConfigMapNamePrefix(final String
configMapNamePrefix) {
setContext();
when(context.getProperty(KubernetesConfigMapStateProvider.CONFIG_MAP_NAME_PREFIX))
- .thenReturn(new
StandardPropertyValue(CONFIG_MAP_NAME_PREFIX_VALUE, null,
ParameterLookup.EMPTY));
+ .thenReturn(new StandardPropertyValue(configMapNamePrefix,
null, ParameterLookup.EMPTY));
}
private void assertStateEquals(final Map<String, String> expected, final
StateMap stateMap) {