MINIFI-537 Fix NPE in BootstrapTransformer
Also includes partial work towards MINIFI-536 by adding setters to ConfigSchema.
MINIFI-537 Add unit tests
Fix checkstlye errors
diff --git a/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java b/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
index 3609426..fd1aa07 100644
--- a/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
+++ b/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
@@ -257,7 +257,9 @@
orderedProperties.setProperty("nifi.web.jetty.working.directory", "./work/jetty");
orderedProperties.setProperty("nifi.web.jetty.threads", "200");
- orderedProperties.setProperty("nifi.sensitive.props.key", sensitiveProperties.getKey(), System.lineSeparator() + "# security properties #");
+ final String sensitivePropertiesKey = sensitiveProperties.getKey();
+ final String notnullSensitivePropertiesKey = sensitivePropertiesKey != null ? sensitivePropertiesKey : "";
+ orderedProperties.setProperty("nifi.sensitive.props.key", notnullSensitivePropertiesKey, System.lineSeparator() + "# security properties #");
orderedProperties.setProperty("nifi.sensitive.props.algorithm", sensitiveProperties.getAlgorithm());
orderedProperties.setProperty("nifi.sensitive.props.provider", sensitiveProperties.getProvider());
diff --git a/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java b/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
index ae7ffa7..d9c6716 100644
--- a/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
+++ b/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
@@ -718,6 +718,17 @@
}
}
+ @Test
+ public void testNullSensitiveKey() throws IOException, ConfigurationChangeException, SchemaLoaderException {
+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try (final InputStream configStream = ConfigTransformerTest.class.getClassLoader().getResourceAsStream("MINIFI-537/config.yml")) {
+ ConfigTransformer.writeNiFiProperties(SchemaLoader.loadConfigSchemaFromYaml(configStream), outputStream);
+ }
+ final Properties properties = new Properties();
+ properties.load(new ByteArrayInputStream(outputStream.toByteArray()));
+ assertEquals("", properties.getProperty("nifi.sensitive.props.key"));
+ }
+
private String getText(Element element, String path) throws XPathExpressionException {
return (String) xPathFactory.newXPath().evaluate(path + "/text()", element, XPathConstants.STRING);
}
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf b/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
index 2fe540d..06b0497 100644
--- a/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
+++ b/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
@@ -36,7 +36,7 @@
# Security Properties #
# These properties take precedence over any equivalent properties specified in config.yml #
nifi.minifi.security.keystore=
-nifi.minifi.security.keystoreType=
+nifi.minifi.security.keystoreType=jks
nifi.minifi.security.keystorePasswd=
nifi.minifi.security.keyPasswd=
nifi.minifi.security.truststore=
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml b/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
index 933e124..46da72c 100644
--- a/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
+++ b/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
@@ -46,7 +46,7 @@
snapshot frequency: 1 min
Security Properties:
keystore: ''
- keystore type: ''
+ keystore type: 'jks'
keystore password: ''
key password: ''
truststore: ''
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml b/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml
new file mode 100644
index 0000000..7193843
--- /dev/null
+++ b/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml
@@ -0,0 +1,43 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the \"License\"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an \"AS IS\" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+MiNiFi Config Version: 3
+Flow Controller:
+ name: MiNiFi Flow
+ comment: ''
+Core Properties:
+ flow controller graceful shutdown period: 10 sec
+ flow service write delay interval: 500 ms
+ administrative yield duration: 30 sec
+ bored yield duration: 10 millis
+ max concurrent threads: 1
+ variable registry properties: additional.properties
+Security Properties:
+ keystore: /tmp/ssl/localhost-ks.jks
+ keystore type: JKS
+ keystore password: localtest
+ key password: localtest
+ truststore: /tmp/ssl/localhost-ts.jks
+ truststore type: JKS
+ truststore password: localtest
+ ssl protocol: TLS
+Processors: []
+Connections: []
+Remote Process Groups: []
+Provenance Reporting: {}
+FlowFile Repository: {}
+Content Repository: {}
+Provenance Repository: {}
+Component Status Repository: {}
diff --git a/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java b/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
index d6b36ef..31577c9 100644
--- a/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
+++ b/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
@@ -186,18 +186,34 @@
return flowControllerProperties;
}
+ public void setFlowControllerProperties(final FlowControllerSchema flowControllerProperties) {
+ this.flowControllerProperties = flowControllerProperties;
+ }
+
public CorePropertiesSchema getCoreProperties() {
return coreProperties;
}
+ public void setCoreProperties(final CorePropertiesSchema coreProperties) {
+ this.coreProperties = coreProperties;
+ }
+
public FlowFileRepositorySchema getFlowfileRepositoryProperties() {
return flowfileRepositoryProperties;
}
+ public void setFlowfileRepositoryProperties(final FlowFileRepositorySchema flowfileRepositoryProperties) {
+ this.flowfileRepositoryProperties = flowfileRepositoryProperties;
+ }
+
public ContentRepositorySchema getContentRepositoryProperties() {
return contentRepositoryProperties;
}
+ public void setContentRepositoryProperties(final ContentRepositorySchema contentRepositoryProperties) {
+ this.contentRepositoryProperties = contentRepositoryProperties;
+ }
+
public SecurityPropertiesSchema getSecurityProperties() {
return securityProperties;
}
@@ -206,34 +222,54 @@
this.securityProperties = securityProperties;
}
- public void setProvenanceReportingProperties(ProvenanceReportingSchema provenanceReportingProperties) {
- this.provenanceReportingProperties = provenanceReportingProperties;
- }
-
public ProcessGroupSchema getProcessGroupSchema() {
return processGroupSchema;
}
+ public void setProcessGroupSchema(final ProcessGroupSchema processGroupSchema) {
+ this.processGroupSchema = processGroupSchema;
+ }
+
public ProvenanceReportingSchema getProvenanceReportingProperties() {
return provenanceReportingProperties;
}
+ public void setProvenanceReportingProperties(ProvenanceReportingSchema provenanceReportingProperties) {
+ this.provenanceReportingProperties = provenanceReportingProperties;
+ }
+
public List<ReportingSchema> getReportingTasksSchema() {
return reportingTasks;
}
+ public void setReportingTasks(final List<ReportingSchema> reportingTasks) {
+ this.reportingTasks = reportingTasks;
+ }
+
public ComponentStatusRepositorySchema getComponentStatusRepositoryProperties() {
return componentStatusRepositoryProperties;
}
+ public void setComponentStatusRepositoryProperties(final ComponentStatusRepositorySchema componentStatusRepositoryProperties) {
+ this.componentStatusRepositoryProperties = componentStatusRepositoryProperties;
+ }
+
public ProvenanceRepositorySchema getProvenanceRepositorySchema() {
return provenanceRepositorySchema;
}
+ public void setProvenanceRepositorySchema(final ProvenanceRepositorySchema provenanceRepositorySchema) {
+ this.provenanceRepositorySchema = provenanceRepositorySchema;
+ }
+
public Map<String, String> getNifiPropertiesOverrides() {
return nifiPropertiesOverrides;
}
+ public void setNifiPropertiesOverrides(final Map<String, String> nifiPropertiesOverrides) {
+ this.nifiPropertiesOverrides = nifiPropertiesOverrides;
+ }
+
@Override
public int getVersion() {
return CONFIG_VERSION;