Search in sources :

Example 1 with SecretsProviderConfigurator

use of org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator in project pulsar by yahoo.

the class KubernetesRuntimeFactory method createContainer.

@Override
public KubernetesRuntime createContainer(InstanceConfig instanceConfig, String codePkgUrl, String originalCodeFileName, Long expectedHealthCheckInterval) throws Exception {
    String instanceFile = null;
    switch(instanceConfig.getFunctionDetails().getRuntime()) {
        case JAVA:
            instanceFile = javaInstanceJarFile;
            break;
        case PYTHON:
            instanceFile = pythonInstanceFile;
            break;
        case GO:
            break;
        default:
            throw new RuntimeException("Unsupported Runtime " + instanceConfig.getFunctionDetails().getRuntime());
    }
    // adjust the auth config to support auth
    if (authenticationEnabled) {
        authProvider.ifPresent(kubernetesFunctionAuthProvider -> kubernetesFunctionAuthProvider.configureAuthenticationConfig(authConfig, Optional.ofNullable(getFunctionAuthData(Optional.ofNullable(instanceConfig.getFunctionAuthenticationSpec())))));
    }
    Optional<KubernetesManifestCustomizer> manifestCustomizer = getRuntimeCustomizer();
    String overriddenNamespace = manifestCustomizer.map((customizer) -> customizer.customizeNamespace(instanceConfig.getFunctionDetails(), jobNamespace)).orElse(jobNamespace);
    String overriddenName = manifestCustomizer.map((customizer) -> customizer.customizeName(instanceConfig.getFunctionDetails(), jobName)).orElse(jobName);
    // pass metricsPort configured in functionRuntimeFactoryConfigs.metricsPort in functions_worker.yml
    if (metricsPort != null) {
        instanceConfig.setMetricsPort(metricsPort);
    }
    return new KubernetesRuntime(appsClient, coreClient, // get the namespace for this function
    overriddenNamespace, overriddenName, customLabels, installUserCodeDependencies, pythonDependencyRepository, pythonExtraDependencyRepository, pulsarDockerImageName, functionDockerImages, imagePullPolicy, pulsarRootDir, instanceConfig, instanceFile, extraDependenciesDir, logDirectory, configAdminCLI, codePkgUrl, originalCodeFileName, pulsarServiceUrl, pulsarAdminUrl, stateStorageServiceUri, authConfig, secretsProviderConfigurator, expectedMetricsCollectionInterval, percentMemoryPadding, cpuOverCommitRatio, memoryOverCommitRatio, gracePeriodSeconds, authProvider, authenticationEnabled, grpcPort, narExtractionDirectory, manifestCustomizer, functionInstanceClassPath, downloadDirectory);
}
Also used : Timer(java.util.Timer) Resources(org.apache.pulsar.common.functions.Resources) AuthenticationConfig(org.apache.pulsar.functions.instance.AuthenticationConfig) RuntimeCustomizer(org.apache.pulsar.functions.runtime.RuntimeCustomizer) StringUtils(org.apache.commons.lang3.StringUtils) AppsV1Api(io.kubernetes.client.openapi.apis.AppsV1Api) StringUtils.isNotEmpty(org.apache.commons.lang3.StringUtils.isNotEmpty) ApiClient(io.kubernetes.client.openapi.ApiClient) Configuration(io.kubernetes.client.openapi.Configuration) V1ConfigMap(io.kubernetes.client.openapi.models.V1ConfigMap) Map(java.util.Map) ToString(lombok.ToString) RuntimeUtils(org.apache.pulsar.functions.runtime.RuntimeUtils) TimerTask(java.util.TimerTask) StringUtils.isEmpty(org.apache.commons.lang3.StringUtils.isEmpty) FunctionAuthUtils.getFunctionAuthData(org.apache.pulsar.functions.auth.FunctionAuthUtils.getFunctionAuthData) RuntimeFactory(org.apache.pulsar.functions.runtime.RuntimeFactory) FunctionAuthProvider(org.apache.pulsar.functions.auth.FunctionAuthProvider) ConnectorsManager(org.apache.pulsar.functions.worker.ConnectorsManager) Function(org.apache.pulsar.functions.proto.Function) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) WorkerConfig(org.apache.pulsar.functions.worker.WorkerConfig) Field(java.lang.reflect.Field) EqualsAndHashCode(lombok.EqualsAndHashCode) Config(io.kubernetes.client.util.Config) Slf4j(lombok.extern.slf4j.Slf4j) SecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator) Paths(java.nio.file.Paths) Data(lombok.Data) Optional(java.util.Optional) InstanceConfig(org.apache.pulsar.functions.instance.InstanceConfig) VisibleForTesting(com.google.common.annotations.VisibleForTesting) KubernetesFunctionAuthProvider(org.apache.pulsar.functions.auth.KubernetesFunctionAuthProvider) ToString(lombok.ToString)

Example 2 with SecretsProviderConfigurator

use of org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator in project pulsar by yahoo.

the class LocalRunner method startProcessMode.

private void startProcessMode(org.apache.pulsar.functions.proto.Function.FunctionDetails functionDetails, int parallelism, int instanceIdOffset, String serviceUrl, String stateStorageServiceUrl, AuthenticationConfig authConfig, String userCodeFile) throws Exception {
    SecretsProviderConfigurator secretsProviderConfigurator = getSecretsProviderConfigurator();
    runtimeFactory = new ProcessRuntimeFactory(serviceUrl, webServiceUrl, stateStorageServiceUrl, authConfig, null, /* java instance jar file */
    null, /* python instance file */
    null, /* log directory */
    null, /* extra dependencies dir */
    narExtractionDirectory, /* nar extraction dir */
    secretsProviderConfigurator, false, Optional.empty(), Optional.empty());
    for (int i = 0; i < parallelism; ++i) {
        InstanceConfig instanceConfig = new InstanceConfig();
        instanceConfig.setFunctionDetails(functionDetails);
        // TODO: correctly implement function version and id
        instanceConfig.setFunctionVersion(UUID.randomUUID().toString());
        instanceConfig.setFunctionId(UUID.randomUUID().toString());
        instanceConfig.setInstanceId(i + instanceIdOffset);
        instanceConfig.setMaxBufferedTuples(1024);
        instanceConfig.setPort(FunctionCommon.findAvailablePort());
        if (metricsPortStart != null) {
            int metricsPort = metricsPortStart + i;
            if (metricsPortStart < 0 || metricsPortStart > 65535) {
                throw new IllegalArgumentException("Metrics port need to be within the range of 0 and 65535");
            }
            instanceConfig.setMetricsPort(metricsPort);
        } else {
            instanceConfig.setMetricsPort(FunctionCommon.findAvailablePort());
        }
        instanceConfig.setClusterName("local");
        if (functionConfig != null) {
            instanceConfig.setMaxPendingAsyncRequests(functionConfig.getMaxPendingAsyncRequests());
            if (functionConfig.getExposePulsarAdminClientEnabled() != null) {
                instanceConfig.setExposePulsarAdminClientEnabled(functionConfig.getExposePulsarAdminClientEnabled());
            }
        }
        RuntimeSpawner runtimeSpawner = new RuntimeSpawner(instanceConfig, userCodeFile, null, runtimeFactory, instanceLivenessCheck);
        spawners.add(runtimeSpawner);
        runtimeSpawner.start();
    }
    Timer statusCheckTimer = new Timer();
    statusCheckTimer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            CompletableFuture<String>[] futures = new CompletableFuture[spawners.size()];
            int index = 0;
            for (RuntimeSpawner spawner : spawners) {
                futures[index] = spawner.getFunctionStatusAsJson(index);
                index++;
            }
            try {
                CompletableFuture.allOf(futures).get(5, TimeUnit.SECONDS);
                for (index = 0; index < futures.length; ++index) {
                    String json = futures[index].get();
                    Gson gson = new GsonBuilder().setPrettyPrinting().create();
                    log.info(gson.toJson(JsonParser.parseString(json)));
                }
            } catch (TimeoutException | InterruptedException | ExecutionException e) {
                log.error("Could not get status from all local instances");
            }
        }
    }, 30000, 30000);
    java.lang.Runtime.getRuntime().addShutdownHook(new Thread(() -> statusCheckTimer.cancel()));
}
Also used : ProcessRuntimeFactory(org.apache.pulsar.functions.runtime.process.ProcessRuntimeFactory) GsonBuilder(com.google.gson.GsonBuilder) Gson(com.google.gson.Gson) DefaultSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator) NameAndConfigBasedSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.NameAndConfigBasedSecretsProviderConfigurator) SecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator) InstanceConfig(org.apache.pulsar.functions.instance.InstanceConfig) Timer(java.util.Timer) TimerTask(java.util.TimerTask) RuntimeSpawner(org.apache.pulsar.functions.runtime.RuntimeSpawner)

Example 3 with SecretsProviderConfigurator

use of org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator in project incubator-pulsar by apache.

the class KubernetesRuntimeFactory method createContainer.

@Override
public KubernetesRuntime createContainer(InstanceConfig instanceConfig, String codePkgUrl, String originalCodeFileName, Long expectedHealthCheckInterval) throws Exception {
    String instanceFile = null;
    switch(instanceConfig.getFunctionDetails().getRuntime()) {
        case JAVA:
            instanceFile = javaInstanceJarFile;
            break;
        case PYTHON:
            instanceFile = pythonInstanceFile;
            break;
        case GO:
            break;
        default:
            throw new RuntimeException("Unsupported Runtime " + instanceConfig.getFunctionDetails().getRuntime());
    }
    // adjust the auth config to support auth
    if (authenticationEnabled) {
        authProvider.ifPresent(kubernetesFunctionAuthProvider -> kubernetesFunctionAuthProvider.configureAuthenticationConfig(authConfig, Optional.ofNullable(getFunctionAuthData(Optional.ofNullable(instanceConfig.getFunctionAuthenticationSpec())))));
    }
    Optional<KubernetesManifestCustomizer> manifestCustomizer = getRuntimeCustomizer();
    String overriddenNamespace = manifestCustomizer.map((customizer) -> customizer.customizeNamespace(instanceConfig.getFunctionDetails(), jobNamespace)).orElse(jobNamespace);
    String overriddenName = manifestCustomizer.map((customizer) -> customizer.customizeName(instanceConfig.getFunctionDetails(), jobName)).orElse(jobName);
    // pass metricsPort configured in functionRuntimeFactoryConfigs.metricsPort in functions_worker.yml
    if (metricsPort != null) {
        instanceConfig.setMetricsPort(metricsPort);
    }
    return new KubernetesRuntime(appsClient, coreClient, // get the namespace for this function
    overriddenNamespace, overriddenName, customLabels, installUserCodeDependencies, pythonDependencyRepository, pythonExtraDependencyRepository, pulsarDockerImageName, functionDockerImages, imagePullPolicy, pulsarRootDir, instanceConfig, instanceFile, extraDependenciesDir, logDirectory, configAdminCLI, codePkgUrl, originalCodeFileName, pulsarServiceUrl, pulsarAdminUrl, stateStorageServiceUri, authConfig, secretsProviderConfigurator, expectedMetricsCollectionInterval, percentMemoryPadding, cpuOverCommitRatio, memoryOverCommitRatio, gracePeriodSeconds, authProvider, authenticationEnabled, grpcPort, narExtractionDirectory, manifestCustomizer, functionInstanceClassPath, downloadDirectory);
}
Also used : Timer(java.util.Timer) Resources(org.apache.pulsar.common.functions.Resources) AuthenticationConfig(org.apache.pulsar.functions.instance.AuthenticationConfig) RuntimeCustomizer(org.apache.pulsar.functions.runtime.RuntimeCustomizer) StringUtils(org.apache.commons.lang3.StringUtils) AppsV1Api(io.kubernetes.client.openapi.apis.AppsV1Api) StringUtils.isNotEmpty(org.apache.commons.lang3.StringUtils.isNotEmpty) ApiClient(io.kubernetes.client.openapi.ApiClient) Configuration(io.kubernetes.client.openapi.Configuration) V1ConfigMap(io.kubernetes.client.openapi.models.V1ConfigMap) Map(java.util.Map) ToString(lombok.ToString) RuntimeUtils(org.apache.pulsar.functions.runtime.RuntimeUtils) TimerTask(java.util.TimerTask) StringUtils.isEmpty(org.apache.commons.lang3.StringUtils.isEmpty) FunctionAuthUtils.getFunctionAuthData(org.apache.pulsar.functions.auth.FunctionAuthUtils.getFunctionAuthData) RuntimeFactory(org.apache.pulsar.functions.runtime.RuntimeFactory) FunctionAuthProvider(org.apache.pulsar.functions.auth.FunctionAuthProvider) ConnectorsManager(org.apache.pulsar.functions.worker.ConnectorsManager) Function(org.apache.pulsar.functions.proto.Function) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) WorkerConfig(org.apache.pulsar.functions.worker.WorkerConfig) Field(java.lang.reflect.Field) EqualsAndHashCode(lombok.EqualsAndHashCode) Config(io.kubernetes.client.util.Config) Slf4j(lombok.extern.slf4j.Slf4j) SecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator) Paths(java.nio.file.Paths) Data(lombok.Data) Optional(java.util.Optional) InstanceConfig(org.apache.pulsar.functions.instance.InstanceConfig) VisibleForTesting(com.google.common.annotations.VisibleForTesting) KubernetesFunctionAuthProvider(org.apache.pulsar.functions.auth.KubernetesFunctionAuthProvider) ToString(lombok.ToString)

Example 4 with SecretsProviderConfigurator

use of org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator in project incubator-pulsar by apache.

the class LocalRunner method startProcessMode.

private void startProcessMode(org.apache.pulsar.functions.proto.Function.FunctionDetails functionDetails, int parallelism, int instanceIdOffset, String serviceUrl, String stateStorageServiceUrl, AuthenticationConfig authConfig, String userCodeFile) throws Exception {
    SecretsProviderConfigurator secretsProviderConfigurator = getSecretsProviderConfigurator();
    runtimeFactory = new ProcessRuntimeFactory(serviceUrl, webServiceUrl, stateStorageServiceUrl, authConfig, null, /* java instance jar file */
    null, /* python instance file */
    null, /* log directory */
    null, /* extra dependencies dir */
    narExtractionDirectory, /* nar extraction dir */
    secretsProviderConfigurator, false, Optional.empty(), Optional.empty());
    for (int i = 0; i < parallelism; ++i) {
        InstanceConfig instanceConfig = new InstanceConfig();
        instanceConfig.setFunctionDetails(functionDetails);
        // TODO: correctly implement function version and id
        instanceConfig.setFunctionVersion(UUID.randomUUID().toString());
        instanceConfig.setFunctionId(UUID.randomUUID().toString());
        instanceConfig.setInstanceId(i + instanceIdOffset);
        instanceConfig.setMaxBufferedTuples(1024);
        instanceConfig.setPort(FunctionCommon.findAvailablePort());
        if (metricsPortStart != null) {
            int metricsPort = metricsPortStart + i;
            if (metricsPortStart < 0 || metricsPortStart > 65535) {
                throw new IllegalArgumentException("Metrics port need to be within the range of 0 and 65535");
            }
            instanceConfig.setMetricsPort(metricsPort);
        } else {
            instanceConfig.setMetricsPort(FunctionCommon.findAvailablePort());
        }
        instanceConfig.setClusterName("local");
        if (functionConfig != null) {
            instanceConfig.setMaxPendingAsyncRequests(functionConfig.getMaxPendingAsyncRequests());
            if (functionConfig.getExposePulsarAdminClientEnabled() != null) {
                instanceConfig.setExposePulsarAdminClientEnabled(functionConfig.getExposePulsarAdminClientEnabled());
            }
        }
        RuntimeSpawner runtimeSpawner = new RuntimeSpawner(instanceConfig, userCodeFile, null, runtimeFactory, instanceLivenessCheck);
        spawners.add(runtimeSpawner);
        runtimeSpawner.start();
    }
    Timer statusCheckTimer = new Timer();
    statusCheckTimer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            CompletableFuture<String>[] futures = new CompletableFuture[spawners.size()];
            int index = 0;
            for (RuntimeSpawner spawner : spawners) {
                futures[index] = spawner.getFunctionStatusAsJson(index);
                index++;
            }
            try {
                CompletableFuture.allOf(futures).get(5, TimeUnit.SECONDS);
                for (index = 0; index < futures.length; ++index) {
                    String json = futures[index].get();
                    Gson gson = new GsonBuilder().setPrettyPrinting().create();
                    log.info(gson.toJson(JsonParser.parseString(json)));
                }
            } catch (TimeoutException | InterruptedException | ExecutionException e) {
                log.error("Could not get status from all local instances");
            }
        }
    }, 30000, 30000);
    java.lang.Runtime.getRuntime().addShutdownHook(new Thread(() -> statusCheckTimer.cancel()));
}
Also used : ProcessRuntimeFactory(org.apache.pulsar.functions.runtime.process.ProcessRuntimeFactory) GsonBuilder(com.google.gson.GsonBuilder) Gson(com.google.gson.Gson) DefaultSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator) NameAndConfigBasedSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.NameAndConfigBasedSecretsProviderConfigurator) SecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator) InstanceConfig(org.apache.pulsar.functions.instance.InstanceConfig) Timer(java.util.Timer) TimerTask(java.util.TimerTask) RuntimeSpawner(org.apache.pulsar.functions.runtime.RuntimeSpawner)

Example 5 with SecretsProviderConfigurator

use of org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator in project incubator-pulsar by apache.

the class LocalRunner method getSecretsProviderConfigurator.

private SecretsProviderConfigurator getSecretsProviderConfigurator() {
    SecretsProviderConfigurator secretsProviderConfigurator;
    if (secretsProviderClassName != null) {
        Map<String, String> config = null;
        if (secretsProviderConfig != null) {
            config = (Map<String, String>) new Gson().fromJson(secretsProviderConfig, Map.class);
        }
        secretsProviderConfigurator = new NameAndConfigBasedSecretsProviderConfigurator(secretsProviderClassName, config);
    } else {
        secretsProviderConfigurator = new DefaultSecretsProviderConfigurator();
    }
    return secretsProviderConfigurator;
}
Also used : DefaultSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator) NameAndConfigBasedSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.NameAndConfigBasedSecretsProviderConfigurator) SecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator) DefaultSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator) Gson(com.google.gson.Gson) NameAndConfigBasedSecretsProviderConfigurator(org.apache.pulsar.functions.secretsproviderconfigurator.NameAndConfigBasedSecretsProviderConfigurator)

Aggregations

SecretsProviderConfigurator (org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator)9 Gson (com.google.gson.Gson)6 Timer (java.util.Timer)6 TimerTask (java.util.TimerTask)6 InstanceConfig (org.apache.pulsar.functions.instance.InstanceConfig)6 DefaultSecretsProviderConfigurator (org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator)6 NameAndConfigBasedSecretsProviderConfigurator (org.apache.pulsar.functions.secretsproviderconfigurator.NameAndConfigBasedSecretsProviderConfigurator)6 VisibleForTesting (com.google.common.annotations.VisibleForTesting)3 GsonBuilder (com.google.gson.GsonBuilder)3 ApiClient (io.kubernetes.client.openapi.ApiClient)3 Configuration (io.kubernetes.client.openapi.Configuration)3 AppsV1Api (io.kubernetes.client.openapi.apis.AppsV1Api)3 CoreV1Api (io.kubernetes.client.openapi.apis.CoreV1Api)3 V1ConfigMap (io.kubernetes.client.openapi.models.V1ConfigMap)3 Config (io.kubernetes.client.util.Config)3 Field (java.lang.reflect.Field)3 Paths (java.nio.file.Paths)3 Map (java.util.Map)3 Optional (java.util.Optional)3 Data (lombok.Data)3