/*
* 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")
.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")
.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) {
final CloudServiceOptions options = getServiceOptions(context, getGoogleCredentials(context));
this.cloudService = options.getService();
}
/**
* Builds the service-specific options as a necessary step in creating a cloud service.
* @param context the process context provided on scheduling the processor.
* @param credentials valid GoogleCredentials retrieved by the controller service.
* @return CloudServiceOptions which can be initialized into a cloud service.
* @see <a href="http://googlecloudplatform.github.io/google-cloud-java/0.8.0/apidocs/com/google/cloud/ServiceOptions.html">ServiceOptions</a>
*/
protected abstract CloudServiceOptions getServiceOptions(ProcessContext context, GoogleCredentials credentials);
}