diff --git a/.gitignore b/.gitignore index 9482e82c15a..fa9a52f1f5c 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ pulumi-analyzer-policy-python.cmd # Ignore user-provided go.work files. /go.work /go.work.sum +**/build/ +**/target/ diff --git a/tests/integration/java_integration_test.go b/tests/integration/java_integration_test.go index fdfea391c5b..6e29ef2a93e 100644 --- a/tests/integration/java_integration_test.go +++ b/tests/integration/java_integration_test.go @@ -3,6 +3,8 @@ package integration import ( + "bytes" + "encoding/json" "os/exec" "path/filepath" "testing" @@ -117,6 +119,44 @@ func TestIntegrations(t *testing.T) { integration.ProgramTest(t, &test) }) + t.Run("package-schema", func(t *testing.T) { + t.Parallel() + + dir := getCwd(t) + pulumi, err := exec.LookPath("pulumi") + require.NoError(t, err) + + providers := []string{"provider-maven", "provider-gradle"} + for _, provider := range providers { + provider := provider // Create new variable to avoid loop capture + t.Run(provider, func(t *testing.T) { + t.Parallel() + + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd := exec.Command(pulumi, "package", "get-schema", "./"+provider) + cmd.Dir = dir + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err = cmd.Run() + require.NoError(t, err) + + // Validate that the schema output is valid JSON + var schema map[string]interface{} + err = json.Unmarshal(stdout.Bytes(), &schema) + require.NoError(t, err, "schema should be valid JSON") + + // Validate required schema fields + assert.Contains(t, schema, "name", "schema should have a name field") + assert.Equal(t, "example", schema["name"], "schema name should be 'example'") + assert.Contains(t, schema, "version", "schema should have a version field") + assert.Equal(t, "0.0.1", schema["version"], "schema version should be '0.0.1'") + assert.Contains(t, schema, "resources", "schema should have a resources field") + }) + } + }) + runAliasTest(t, "rename") runAliasTest(t, "rename-component") runAliasTest(t, "rename-component-and-child") diff --git a/tests/integration/provider-gradle/PulumiPlugin.yaml b/tests/integration/provider-gradle/PulumiPlugin.yaml new file mode 100644 index 00000000000..991ff723c4d --- /dev/null +++ b/tests/integration/provider-gradle/PulumiPlugin.yaml @@ -0,0 +1 @@ +runtime: java diff --git a/tests/integration/provider-gradle/build.gradle b/tests/integration/provider-gradle/build.gradle new file mode 100644 index 00000000000..f0b1f45df91 --- /dev/null +++ b/tests/integration/provider-gradle/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'application' +} + +group 'com.pulumi.example.provider' +version '0.0.1-SNAPSHOT' + +repositories { + mavenLocal() + maven { // The google mirror is less flaky than mavenCentral() + url("https://maven-central.storage-download.googleapis.com/maven2/") + } + mavenCentral() +} + +def grpcVersion = '1.67.1' +def protobufVersion = '3.25.1' +def pulumiJavaSdkVersion = System.getenv("PULUMI_JAVA_SDK_VERSION") ?: "0.0.1" + +dependencies { + implementation("com.pulumi:pulumi:$pulumiJavaSdkVersion") { + exclude group: 'io.grpc', module: 'grpc-netty-shaded' + } + implementation "io.grpc:grpc-netty-shaded:$grpcVersion" + implementation "io.grpc:grpc-protobuf:$grpcVersion" + implementation "io.grpc:grpc-stub:$grpcVersion" + implementation "javax.annotation:javax.annotation-api:1.3.2" + implementation "com.google.protobuf:protobuf-java:$protobufVersion" +} + +application { + mainClass = project.hasProperty("mainClass") + ? project.getProperty("mainClass") + : "${group}.Main" +} \ No newline at end of file diff --git a/tests/integration/provider-gradle/settings.gradle b/tests/integration/provider-gradle/settings.gradle new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/ExampleProvider.java b/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/ExampleProvider.java new file mode 100644 index 00000000000..6bf8db1c1c0 --- /dev/null +++ b/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/ExampleProvider.java @@ -0,0 +1,26 @@ +package com.pulumi.example.provider; + +import com.pulumi.provider.internal.models.*; + +import java.util.concurrent.CompletableFuture; +import com.pulumi.provider.internal.Provider; + +public class ExampleProvider extends Provider { + @Override + public CompletableFuture getSchema(GetSchemaRequest request) { + String schema = "{\n" + + " \"name\": \"example\",\n" + + " \"version\": \"0.0.1\",\n" + + " \"resources\": {\n" + + " \"example:index:Resource\": {\n" + + " \"properties\": {\n" + + " \"value\": {\n" + + " \"type\": \"string\"\n" + + " }\n" + + " }" + + " }\n" + + " }\n" + + "}"; + return CompletableFuture.completedFuture(new GetSchemaResponse(schema)); + } +} diff --git a/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/Main.java b/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/Main.java new file mode 100644 index 00000000000..4d53283eeed --- /dev/null +++ b/tests/integration/provider-gradle/src/main/java/com/pulumi/example/provider/Main.java @@ -0,0 +1,12 @@ +package com.pulumi.example.provider; + +import java.io.IOException; +import com.pulumi.provider.internal.ResourceProviderService; + +public class Main { + public static void main(String[] args) throws IOException, InterruptedException { + var server = new ResourceProviderService(new ExampleProvider()); + server.startAndBlockUntilShutdown(); + } +} + diff --git a/tests/integration/provider-maven/PulumiPlugin.yaml b/tests/integration/provider-maven/PulumiPlugin.yaml new file mode 100644 index 00000000000..991ff723c4d --- /dev/null +++ b/tests/integration/provider-maven/PulumiPlugin.yaml @@ -0,0 +1 @@ +runtime: java diff --git a/tests/integration/provider-maven/pom.xml b/tests/integration/provider-maven/pom.xml new file mode 100644 index 00000000000..0cdc5b94bc4 --- /dev/null +++ b/tests/integration/provider-maven/pom.xml @@ -0,0 +1,132 @@ + + + 4.0.0 + + com.pulumi.example + provider + 1.0-SNAPSHOT + + + UTF-8 + 11 + 11 + 11 + ${project.groupId}.${project.artifactId}.App + + 1.67.1 + 3.25.1 + UTF-8 + + + + + default-pulumi-java-sdk-dependency + + + !env.PULUMI_JAVA_SDK_VERSION + + + + + + + + com.pulumi + pulumi + 0.0.1 + + + io.grpc + grpc-netty-shaded + + + + + io.grpc + grpc-netty-shaded + ${grpc.version} + + + io.grpc + grpc-protobuf + ${grpc.version} + + + io.grpc + grpc-stub + ${grpc.version} + + + javax.annotation + javax.annotation-api + 1.3.2 + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + + true + ${mainClass} + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + + true + ${mainClass} + + + + jar-with-dependencies + + + + + make-my-jar-with-dependencies + package + + single + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + ${mainClass} + ${mainArgs} + + + + org.apache.maven.plugins + maven-wrapper-plugin + 3.1.0 + + 3.8.5 + + + + + \ No newline at end of file diff --git a/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/App.java b/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/App.java new file mode 100644 index 00000000000..afc42a3aeff --- /dev/null +++ b/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/App.java @@ -0,0 +1,12 @@ +package com.pulumi.example.provider; + +import java.io.IOException; +import com.pulumi.provider.internal.ResourceProviderService; + +public class App { + public static void main(String[] args) throws IOException, InterruptedException { + var server = new ResourceProviderService(new ExampleProvider()); + server.startAndBlockUntilShutdown(); + } +} + diff --git a/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/ExampleProvider.java b/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/ExampleProvider.java new file mode 100644 index 00000000000..6bf8db1c1c0 --- /dev/null +++ b/tests/integration/provider-maven/src/main/java/com/pulumi/example/provider/ExampleProvider.java @@ -0,0 +1,26 @@ +package com.pulumi.example.provider; + +import com.pulumi.provider.internal.models.*; + +import java.util.concurrent.CompletableFuture; +import com.pulumi.provider.internal.Provider; + +public class ExampleProvider extends Provider { + @Override + public CompletableFuture getSchema(GetSchemaRequest request) { + String schema = "{\n" + + " \"name\": \"example\",\n" + + " \"version\": \"0.0.1\",\n" + + " \"resources\": {\n" + + " \"example:index:Resource\": {\n" + + " \"properties\": {\n" + + " \"value\": {\n" + + " \"type\": \"string\"\n" + + " }\n" + + " }" + + " }\n" + + " }\n" + + "}"; + return CompletableFuture.completedFuture(new GetSchemaResponse(schema)); + } +}