[ 
https://issues.apache.org/jira/browse/NIFI-3449?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15861838#comment-15861838
 ] 

ASF GitHub Bot commented on NIFI-3449:
--------------------------------------

Github user gene-telligent commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/1482#discussion_r100621877
  
    --- Diff: 
nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/AbstractGCPProcessor.java
 ---
    @@ -0,0 +1,118 @@
    +/*
    + * 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.gcp;
    +
    +import com.google.auth.oauth2.GoogleCredentials;
    +import com.google.cloud.HttpServiceOptions;
    +import com.google.cloud.Service;
    +import com.google.common.collect.ImmutableList;
    +import org.apache.nifi.annotation.lifecycle.OnScheduled;
    +import org.apache.nifi.components.PropertyDescriptor;
    +import org.apache.nifi.processor.AbstractProcessor;
    +import org.apache.nifi.processor.ProcessContext;
    +import org.apache.nifi.processor.util.StandardValidators;
    +import 
org.apache.nifi.processors.gcp.credentials.service.GCPCredentialsService;
    +
    +import java.util.List;
    +
    +/**
    + * Abstract base class for gcp processors.
    + *
    + */
    +public abstract class AbstractGCPProcessor<
    +        CloudService extends Service<CloudServiceOptions>,
    +        CloudServiceRpc,
    +        CloudServiceOptions extends HttpServiceOptions<CloudService, 
CloudServiceRpc, CloudServiceOptions>> extends AbstractProcessor {
    +
    +    public static final PropertyDescriptor PROJECT_ID = new 
PropertyDescriptor
    +            .Builder().name("gcp-project-id")
    +            .displayName("Project ID")
    +            .description("Google Cloud Project ID")
    +            .expressionLanguageSupported(true)
    +            .required(true)
    +            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
    +            .build();
    +
    +    public static final PropertyDescriptor RETRY_COUNT = new 
PropertyDescriptor
    +            .Builder().name("gcp-retry-count")
    +            .displayName("Number of retries")
    +            .description("How many retry attempts should be made before 
routing to the failure relationship.")
    +            .defaultValue("6")
    +            .expressionLanguageSupported(true)
    +            .required(true)
    +            .addValidator(StandardValidators.INTEGER_VALIDATOR)
    +            .build();
    +
    +    /**
    +     * Links to the {@link GCPCredentialsService} which provides 
credentials for this particular processor.
    +     */
    +    public static final PropertyDescriptor 
GCP_CREDENTIALS_PROVIDER_SERVICE = new PropertyDescriptor.Builder()
    +            .name("gcp-credentials-provider-service")
    +            .name("GCP Credentials Provider Service")
    +            .description("The Controller Service used to obtain Google 
Cloud Platform credentials.")
    +            .required(true)
    +            .identifiesControllerService(GCPCredentialsService.class)
    +            .build();
    +
    +
    +    protected volatile CloudService cloudService;
    +
    +    protected CloudService getCloudService() {
    +        return cloudService;
    +    }
    +
    +    @Override
    +    public List<PropertyDescriptor> getSupportedPropertyDescriptors() {
    +        return ImmutableList.of(
    +                GCP_CREDENTIALS_PROVIDER_SERVICE,
    +                PROJECT_ID,
    +                RETRY_COUNT
    +        );
    +    }
    +
    +
    +    /**
    +     * Retrieve credentials from the {@link GCPCredentialsService} 
attached to this processor.
    +     * @param context the process context provided on scheduling the 
processor.
    +     * @return GoogleCredentials for the processor to access.
    +     * @see  <a 
href="https://developers.google.com/api-client-library/java/google-api-java-client/reference/1.20.0/com/google/api/client/googleapis/auth/oauth2/GoogleCredential";>AuthCredentials</a>
    +     */
    +    private GoogleCredentials getGoogleCredentials(final ProcessContext 
context) {
    +        final GCPCredentialsService gcpCredentialsService =
    +                
context.getProperty(GCP_CREDENTIALS_PROVIDER_SERVICE).asControllerService(GCPCredentialsService.class);
    +        return gcpCredentialsService.getGoogleCredentials();
    +    }
    +
    +    /**
    +     * Assigns the cloud service client on scheduling.
    +     * @param context the process context provided on scheduling the 
processor.
    +     */
    +    @OnScheduled
    +    public void onScheduled(ProcessContext context) {
    --- End diff --
    
    Thankfully, according to 
https://github.com/GoogleCloudPlatform/google-cloud-java/issues/1238 , all 
service objects are thread-safe. 


> Create Google Cloud Platform/Google Cloud Storage Processors
> ------------------------------------------------------------
>
>                 Key: NIFI-3449
>                 URL: https://issues.apache.org/jira/browse/NIFI-3449
>             Project: Apache NiFi
>          Issue Type: New Feature
>          Components: Extensions
>            Reporter: Gene Peters
>              Labels: features
>
> Hi all,
> We had a need in our production deployments to interact with Google Cloud 
> Storage. At the time, NIFI-2809 hadn't seen much movement, and after applying 
> the patch I found that the configuration was too specific for my needs (it's 
> hardcoded to use "Application Default" credentials, everything uploaded to 
> GCS is uploaded with the "public" ACL, etc). So I created a series of 
> Processors / Controller Services based off of the AWS NiFi library, and would 
> like to contribute them. 
> Features:
> * All credentialing is handled by a controller service, allowing multiple 
> processors to use the same service / credentials
> * An Abstract processor is provided which forms the basis for all GCP related 
> processors.
> * The standard Google Cloud Storage operations are supported, very similarly 
> to the AWS S3 processors: ListGCSBucket, DeleteGCSObject, FetchGCSObject, 
> PutGCSObject
> * Everything is documented and unit tested. 
> * I've also provided integration tests, but they're disabled by default (as 
> they require Google Cloud credentials). To run them, use the flag 
> {{skipGCPIntegrationTests=false}}
> Todo:
> * The GCP Java library's ReadChannel objects implement the "restorable" 
> interface, which allows for state saving / checkpointing. I'd really like to 
> leverage this with the State support that NiFi provides, but it would require 
> serializing / deserializing the object. 
> I'm going to be submitting this as a pull request through GitHub. 



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to