pulumi / pulumi-kubernetes

A Pulumi resource provider for Kubernetes to manage API resources and workloads in running clusters
https://www.pulumi.com/docs/reference/clouds/kubernetes/
Apache License 2.0
406 stars 115 forks source link

Child resource cannot be registered by Chart v4 (Java SDK) #3057

Closed EronWright closed 2 months ago

EronWright commented 3 months ago

What happened?

For some reason, my Java SDK program throws an exception, seemingly as the child resources of a v4.Chart are registered.

    error: an unhandled error occurred: '/opt/homebrew/bin/mvn /opt/homebrew/bin/mvn -Dorg.slf4j.simpleLogger.defaultLogLevel=warn --no-transfer-progress compile exec:java' exited with non-zero exit code: 32

    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!

    Jun 12, 2024 4:44:04 PM com.pulumi.deployment.internal.DeploymentImpl$DefaultEngineLogger errorAsync
    SEVERE: Running program [PID: 97072](/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home/bin/java -classpath /opt/homebrew/Cellar/maven/3.9.6/libexec/boot/plexus-classworlds-2.7.0.jar -Dclassworlds.conf=/opt/homebrew/Cellar/maven/3.9.6/libexec/bin/m2.conf -Dmaven.home=/opt/homebrew/Cellar/maven/3.9.6/libexec -Dlibrary.jansi.path=/opt/homebrew/Cellar/maven/3.9.6/libexec/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/Users/eronwright/Pulumi/pulumi-hacking/kubernetes/mlc/blogpost/values/java org.codehaus.plexus.classworlds.launcher.Launcher -Dorg.slf4j.simpleLogger.defaultLogLevel=warn --no-transfer-progress compile exec:java) failed with an unhandled exception:
    java.lang.IllegalArgumentException: Couldn't instantiate class 'com.pulumi.kubernetes.rbac.v1.RoleBinding' using constructor: 'public com.pulumi.kubernetes.rbac.v1.RoleBinding(java.lang.String,com.pulumi.kubernetes.rbac.v1.RoleBindingArgs,com.pulumi.resources.CustomResourceOptions)', for resource type: 'kubernetes:rbac.authorization.k8s.io/v1:RoleBinding'
        at com.pulumi.serialization.internal.ResourcePackages.tryConstruct(ResourcePackages.java:234)
        at com.pulumi.serialization.internal.Deserializer.tryDeserializeResource(Deserializer.java:367)
        at com.pulumi.serialization.internal.Deserializer.deserializeCore(Deserializer.java:103)
        at com.pulumi.serialization.internal.Deserializer.deserialize(Deserializer.java:59)
        at com.pulumi.serialization.internal.Deserializer.lambda$deserializeList$8(Deserializer.java:150)
        at com.pulumi.serialization.internal.Deserializer.lambda$deserializeOneOf$10(Deserializer.java:223)
        at com.pulumi.serialization.internal.Deserializer.deserializeCore(Deserializer.java:109)
        at com.pulumi.serialization.internal.Deserializer.deserializeOneOf(Deserializer.java:221)
        at com.pulumi.serialization.internal.Deserializer.deserializeList(Deserializer.java:143)
        at com.pulumi.serialization.internal.Deserializer.lambda$deserialize$6(Deserializer.java:75)
        at com.pulumi.serialization.internal.Deserializer.deserializeCore(Deserializer.java:109)
        at com.pulumi.serialization.internal.Deserializer.deserialize(Deserializer.java:59)
        at com.pulumi.serialization.internal.Converter.convertValue(Converter.java:81)
        at com.pulumi.core.internal.OutputCompletionSource.setValue(OutputCompletionSource.java:95)
        at com.pulumi.deployment.internal.DeploymentImpl$ReadOrRegisterResourceInternal.lambda$completeResourceAsync$0(DeploymentImpl.java:1187)
        at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:646)
        at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:483)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

The underlying root cause exception is:

    Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at com.pulumi.serialization.internal.ResourcePackages.tryConstruct(ResourcePackages.java:231)
        ... 21 more
    Caused by: com.pulumi.exceptions.MissingRequiredPropertyException: Missing required property 'roleRef when constructing 'RoleBindingArgs'
        at com.pulumi.kubernetes.rbac.v1.RoleBindingArgs$Builder.build(RoleBindingArgs.java:246)
        at com.pulumi.kubernetes.rbac.v1.RoleBinding.makeArgs(RoleBinding.java:131)
        at com.pulumi.kubernetes.rbac.v1.RoleBinding.<init>(RoleBinding.java:119)
        ... 27 more

Example

package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.deployment.Deployment;
import com.pulumi.kubernetes.helm.v4.Chart;
import com.pulumi.kubernetes.helm.v4.ChartArgs;
import com.pulumi.asset.FileAsset;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var certManager = new Chart("cert-manager", ChartArgs.builder()
            .namespace("cert-manager")
            .chart("oci://registry-1.docker.io/bitnamicharts/cert-manager")
            .version("1.3.1")
            .valueYamlFiles(new FileAsset("values.yaml"))
            .values(Map.ofEntries(
                Map.entry("commonLabels", Map.of("pulumi.com/stackName", Deployment.getInstance().getStackName())),
                Map.entry("extraDeploy", List.of(new FileAsset("manifest.yaml")))
            ))
            .build());

    }
}

Output of pulumi about

❯ p about
CLI          
Version      3.117.0
Go Version   go1.22.3
Go Compiler  gc

Plugins
KIND      NAME        VERSION
language  java        unknown
resource  kubernetes  4.13.1

Host     
OS       darwin
Version  14.4.1
Arch     arm64

Additional context

Generated from:

name: values
runtime: yaml
description: A minimal Kubernetes Pulumi YAML program
resources:
  cert-manager:
    type: kubernetes:helm.sh/v4:Chart
    properties:
      namespace: cert-manager
      chart: oci://registry-1.docker.io/bitnamicharts/cert-manager
      version: "1.3.1"
      valueYamlFiles:
      - fn::fileAsset: values.yaml
      values:
        commonLabels:
          pulumi.com/stackName: ${pulumi.stack}
        extraDeploy:
        - fn::fileAsset: manifest.yaml

Contributing

Vote on this issue by adding a 👍 reaction. To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already).

mjeffryes commented 2 months ago

We have a strong suspicion that this is a Java specific manifestation of https://github.com/pulumi/pulumi/issues/15788

YanishR commented 2 months ago

Hello 🙂 I am experiencing the same as cross-referenced in this issue raise by another member of the community

EronWright commented 2 months ago

I've identified the root cause and am working on a solution.