This is an automated email from the ASF dual-hosted git repository.
turcsanyi 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 8424e3428a NIFI-13798: Renamed Airtable's API Key property to Personal
Access Token and updated docs due to API Keys deprecation
8424e3428a is described below
commit 8424e3428acb39f1015634a64a12d2dec84565d7
Author: lehelb <[email protected]>
AuthorDate: Tue Sep 24 10:44:43 2024 -0500
NIFI-13798: Renamed Airtable's API Key property to Personal Access Token
and updated docs due to API Keys deprecation
This closes #9308.
Signed-off-by: Peter Turcsanyi <[email protected]>
---
.../processors/airtable/QueryAirtableTable.java | 21 ++++++---
.../airtable/service/AirtableRestService.java | 8 ++--
.../additionalDetails.md | 9 ++--
.../airtable/TestAirtableRestService.java | 51 ++++++++++++++++++++++
.../airtable/TestQueryAirtableTable.java | 2 +-
5 files changed, 75 insertions(+), 16 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
index f4bb9fe718..b3d66b376c 100644
---
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
+++
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
@@ -54,6 +54,7 @@ import org.apache.nifi.components.state.Scope;
import org.apache.nifi.components.state.StateMap;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.flowfile.FlowFile;
+import org.apache.nifi.migration.PropertyConfiguration;
import org.apache.nifi.processor.AbstractProcessor;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
@@ -108,10 +109,11 @@ public class QueryAirtableTable extends AbstractProcessor
{
.required(true)
.build();
- static final PropertyDescriptor API_KEY = new PropertyDescriptor.Builder()
- .name("api-key")
- .displayName("API Key")
- .description("The REST API key to use in queries. Should be
generated on Airtable's account page.")
+ // API Keys are deprecated, Airtable now provides Personal Access Tokens
instead.
+ static final PropertyDescriptor PAT = new PropertyDescriptor.Builder()
+ .name("pat")
+ .displayName("Personal Access Token")
+ .description("The Personal Access Token (PAT) to use in queries.
Should be generated on Airtable's account page.")
.required(true)
.sensitive(true)
.expressionLanguageSupported(ExpressionLanguageScope.NONE)
@@ -195,7 +197,7 @@ public class QueryAirtableTable extends AbstractProcessor {
private static final List<PropertyDescriptor> PROPERTIES =
Collections.unmodifiableList(Arrays.asList(
API_URL,
- API_KEY,
+ PAT,
BASE_ID,
TABLE_ID,
FIELDS,
@@ -225,11 +227,11 @@ public class QueryAirtableTable extends AbstractProcessor
{
@OnScheduled
public void onScheduled(final ProcessContext context) {
final String apiUrl =
context.getProperty(API_URL).evaluateAttributeExpressions().getValue();
- final String apiKey = context.getProperty(API_KEY).getValue();
+ final String pat = context.getProperty(PAT).getValue();
final String baseId =
context.getProperty(BASE_ID).evaluateAttributeExpressions().getValue();
final String tableId =
context.getProperty(TABLE_ID).evaluateAttributeExpressions().getValue();
final WebClientServiceProvider webClientServiceProvider =
context.getProperty(WEB_CLIENT_SERVICE_PROVIDER).asControllerService(WebClientServiceProvider.class);
- airtableRestService = new
AirtableRestService(webClientServiceProvider, apiUrl, apiKey, baseId, tableId);
+ airtableRestService = new
AirtableRestService(webClientServiceProvider, apiUrl, pat, baseId, tableId);
}
@Override
@@ -282,6 +284,11 @@ public class QueryAirtableTable extends AbstractProcessor {
transferFlowFiles(session, flowFiles,
retrieveTableResult.getTotalRecordCount());
}
+ @Override
+ public void migrateProperties(final PropertyConfiguration config) {
+ config.renameProperty("api-key", PAT.getName());
+ }
+
private AirtableGetRecordsParameters buildGetRecordsParameters(final
ProcessContext context,
final String lastRecordFetchTime,
final String nowDateTimeString) {
diff --git
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
index ea37f42b67..4be80462e4 100644
---
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
+++
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
@@ -40,18 +40,18 @@ public class AirtableRestService {
private final WebClientServiceProvider webClientServiceProvider;
private final String apiUrl;
- private final String apiKey;
+ private final String pat;
private final String baseId;
private final String tableId;
public AirtableRestService(final WebClientServiceProvider
webClientServiceProvider,
final String apiUrl,
- final String apiKey,
+ final String pat,
final String baseId,
final String tableId) {
this.webClientServiceProvider = webClientServiceProvider;
this.apiUrl = apiUrl;
- this.apiKey = apiKey;
+ this.pat = pat;
this.baseId = baseId;
this.tableId = tableId;
}
@@ -61,7 +61,7 @@ public class AirtableRestService {
try (final HttpResponseEntity response =
webClientServiceProvider.getWebClientService()
.get()
.uri(uri)
- .header("Authorization", "Bearer " + apiKey)
+ .header("Authorization", "Bearer " + pat)
.retrieve()) {
final InputStream bodyInputStream = response.body();
diff --git
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.md
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.md
index f7fd766e6a..e2b63b19a1 100644
---
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.md
+++
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.md
@@ -23,10 +23,11 @@ processor can query records from a single base and table
via Airtable's REST API
able to handle a large number of records. It can also split large record sets
to multiple FlowFiles just like a database
processor.
-### API Key
+### Personal Access Token
-Airtable REST API calls requires an API Key that needs to be passed in a
request. An Airtable account is required to
-generate an API Key.
+Please note that API Keys were deprecated, Airtable now provides Personal
Access Tokens (PATs) instead.
+Airtable REST API calls requires a PAT (Personal Access Token) that needs to
be passed in a request. An Airtable account
+is required to generate the PAT.
### API rate limit
@@ -37,6 +38,6 @@ is recommended to start off with the default settings and to
increase both param
### Metadata API
-Currently the Metadata API of Airtable is unstable, and we don't provide a way
to use it. Until it becomes stable you
+Currently, the Metadata API of Airtable is unstable, and we don't provide a
way to use it. Until it becomes stable you
can set up a ConvertRecord or MergeRecord processor with a JsonTreeReader to
read the content and convert it into a
Record with schema.
\ No newline at end of file
diff --git
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
new file mode 100644
index 0000000000..591f9fa2e9
--- /dev/null
+++
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+package org.apache.nifi.processors.airtable;
+
+import org.apache.nifi.processors.airtable.service.AirtableRestService;
+import org.apache.nifi.web.client.provider.api.WebClientServiceProvider;
+import
org.apache.nifi.web.client.provider.service.StandardWebClientServiceProvider;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TestAirtableRestService {
+
+ private static final String API_URL_WITHOUT_SLASH =
"https://api.airtable.com/v0";
+ private static final String API_URL_WITH_SLASH =
"https://api.airtable.com/v0/";
+ private static final String PAT = "pat";
+ private static final String BASE_ID = "base-id";
+ private static final String TABLE_ID = "table-id";
+ private static final String EXPECTED_URL = String.format("%s/%s/%s",
API_URL_WITHOUT_SLASH, BASE_ID, TABLE_ID);
+
+ private final WebClientServiceProvider webClientServiceProvider = new
StandardWebClientServiceProvider();
+
+ @Test
+ void testApiUrlEndsWithoutSlash() {
+ AirtableRestService serviceWithoutSlash = new
AirtableRestService(webClientServiceProvider, API_URL_WITHOUT_SLASH, PAT,
BASE_ID, TABLE_ID);
+ String apiUrlWithSlash =
serviceWithoutSlash.createUriBuilder().build().toString();
+ assertEquals(EXPECTED_URL, apiUrlWithSlash);
+ }
+
+ @Test
+ void testApiUrlEndsWithSlash() {
+ AirtableRestService serviceWithSlash = new
AirtableRestService(webClientServiceProvider, API_URL_WITH_SLASH, PAT, BASE_ID,
TABLE_ID);
+ String apiUrlWithSlash =
serviceWithSlash.createUriBuilder().build().toString();
+ assertEquals(EXPECTED_URL, apiUrlWithSlash);
+ }
+}
+
diff --git
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
index dadd0cccb2..84473e2b4b 100644
---
a/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
+++
b/nifi-extension-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
@@ -61,7 +61,7 @@ public class TestQueryAirtableTable {
runner.addControllerService("webClientService",
webClientServiceProvider);
runner.enableControllerService(webClientServiceProvider);
- runner.setProperty(QueryAirtableTable.API_KEY, "???");
+ runner.setProperty(QueryAirtableTable.PAT, "???");
runner.setProperty(QueryAirtableTable.BASE_ID, "baseid");
runner.setProperty(QueryAirtableTable.TABLE_ID, "tableid");
runner.setProperty(QueryAirtableTable.WEB_CLIENT_SERVICE_PROVIDER,
webClientServiceProvider.getIdentifier());