diff --git a/provider/cmd/pulumi-resource-docker-build/schema.json b/provider/cmd/pulumi-resource-docker-build/schema.json index 5f614ab..8ccf804 100644 --- a/provider/cmd/pulumi-resource-docker-build/schema.json +++ b/provider/cmd/pulumi-resource-docker-build/schema.json @@ -1,7 +1,7 @@ { "name": "docker-build", "displayName": "docker-build", - "version": "0.0.2-alpha.1713828576+f5e57ab7.dirty", + "version": "0.0.2-alpha.1714062140+5175dbeb.dirty", "description": "A Pulumi provider for building modern Docker images with buildx and BuildKit.", "keywords": [ "docker", @@ -1263,6 +1263,7 @@ "required": [ "contextHash", "digest", + "push", "ref" ], "inputProperties": { @@ -1389,7 +1390,10 @@ "type": "string", "description": "Set the target build stage(s) to build.\n\nIf not specified all targets will be built by default.\n\nEquivalent to Docker's `--target` flag." } - } + }, + "requiredInputs": [ + "push" + ] }, "docker-build:index:Index": { "description": "A wrapper around `docker buildx imagetools create` to create an index\n(or manifest list) referencing one or more existing images.\n\nIn most cases you do not need an `Index` to build a multi-platform\nimage -- specifying multiple platforms on the `Image` will handle this\nfor you automatically.\n\nHowever, as of April 2024, building multi-platform images _with\ncaching_ will only export a cache for one platform at a time (see [this\ndiscussion](https://github.com/docker/buildx/discussions/1382) for more\ndetails).\n\nTherefore this resource can be helpful if you are building\nmulti-platform images with caching: each platform can be built and\ncached separately, and an `Index` can join them all together. An\nexample of this is shown below.\n\nThis resource creates an OCI image index or a Docker manifest list\ndepending on the media types of the source images.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n### Multi-platform registry caching\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as docker_build from \"@pulumi/docker-build\";\n\nconst amd64 = new docker_build.Image(\"amd64\", {\n cacheFrom: [{\n registry: {\n ref: \"docker.io/pulumi/pulumi:cache-amd64\",\n },\n }],\n cacheTo: [{\n registry: {\n mode: docker_build.CacheMode.Max,\n ref: \"docker.io/pulumi/pulumi:cache-amd64\",\n },\n }],\n context: {\n location: \"app\",\n },\n platforms: [docker_build.Platform.Linux_amd64],\n tags: [\"docker.io/pulumi/pulumi:3.107.0-amd64\"],\n});\nconst arm64 = new docker_build.Image(\"arm64\", {\n cacheFrom: [{\n registry: {\n ref: \"docker.io/pulumi/pulumi:cache-arm64\",\n },\n }],\n cacheTo: [{\n registry: {\n mode: docker_build.CacheMode.Max,\n ref: \"docker.io/pulumi/pulumi:cache-arm64\",\n },\n }],\n context: {\n location: \"app\",\n },\n platforms: [docker_build.Platform.Linux_arm64],\n tags: [\"docker.io/pulumi/pulumi:3.107.0-arm64\"],\n});\nconst index = new docker_build.Index(\"index\", {\n sources: [\n amd64.ref,\n arm64.ref,\n ],\n tag: \"docker.io/pulumi/pulumi:3.107.0\",\n});\nexport const ref = index.ref;\n```\n```python\nimport pulumi\nimport pulumi_docker_build as docker_build\n\namd64 = docker_build.Image(\"amd64\",\n cache_from=[docker_build.CacheFromArgs(\n registry=docker_build.CacheFromRegistryArgs(\n ref=\"docker.io/pulumi/pulumi:cache-amd64\",\n ),\n )],\n cache_to=[docker_build.CacheToArgs(\n registry=docker_build.CacheToRegistryArgs(\n mode=docker_build.CacheMode.MAX,\n ref=\"docker.io/pulumi/pulumi:cache-amd64\",\n ),\n )],\n context=docker_build.BuildContextArgs(\n location=\"app\",\n ),\n platforms=[docker_build.Platform.LINUX_AMD64],\n tags=[\"docker.io/pulumi/pulumi:3.107.0-amd64\"])\narm64 = docker_build.Image(\"arm64\",\n cache_from=[docker_build.CacheFromArgs(\n registry=docker_build.CacheFromRegistryArgs(\n ref=\"docker.io/pulumi/pulumi:cache-arm64\",\n ),\n )],\n cache_to=[docker_build.CacheToArgs(\n registry=docker_build.CacheToRegistryArgs(\n mode=docker_build.CacheMode.MAX,\n ref=\"docker.io/pulumi/pulumi:cache-arm64\",\n ),\n )],\n context=docker_build.BuildContextArgs(\n location=\"app\",\n ),\n platforms=[docker_build.Platform.LINUX_ARM64],\n tags=[\"docker.io/pulumi/pulumi:3.107.0-arm64\"])\nindex = docker_build.Index(\"index\",\n sources=[\n amd64.ref,\n arm64.ref,\n ],\n tag=\"docker.io/pulumi/pulumi:3.107.0\")\npulumi.export(\"ref\", index.ref)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing DockerBuild = Pulumi.DockerBuild;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var amd64 = new DockerBuild.Image(\"amd64\", new()\n {\n CacheFrom = new[]\n {\n new DockerBuild.Inputs.CacheFromArgs\n {\n Registry = new DockerBuild.Inputs.CacheFromRegistryArgs\n {\n Ref = \"docker.io/pulumi/pulumi:cache-amd64\",\n },\n },\n },\n CacheTo = new[]\n {\n new DockerBuild.Inputs.CacheToArgs\n {\n Registry = new DockerBuild.Inputs.CacheToRegistryArgs\n {\n Mode = DockerBuild.CacheMode.Max,\n Ref = \"docker.io/pulumi/pulumi:cache-amd64\",\n },\n },\n },\n Context = new DockerBuild.Inputs.BuildContextArgs\n {\n Location = \"app\",\n },\n Platforms = new[]\n {\n DockerBuild.Platform.Linux_amd64,\n },\n Tags = new[]\n {\n \"docker.io/pulumi/pulumi:3.107.0-amd64\",\n },\n });\n\n var arm64 = new DockerBuild.Image(\"arm64\", new()\n {\n CacheFrom = new[]\n {\n new DockerBuild.Inputs.CacheFromArgs\n {\n Registry = new DockerBuild.Inputs.CacheFromRegistryArgs\n {\n Ref = \"docker.io/pulumi/pulumi:cache-arm64\",\n },\n },\n },\n CacheTo = new[]\n {\n new DockerBuild.Inputs.CacheToArgs\n {\n Registry = new DockerBuild.Inputs.CacheToRegistryArgs\n {\n Mode = DockerBuild.CacheMode.Max,\n Ref = \"docker.io/pulumi/pulumi:cache-arm64\",\n },\n },\n },\n Context = new DockerBuild.Inputs.BuildContextArgs\n {\n Location = \"app\",\n },\n Platforms = new[]\n {\n DockerBuild.Platform.Linux_arm64,\n },\n Tags = new[]\n {\n \"docker.io/pulumi/pulumi:3.107.0-arm64\",\n },\n });\n\n var index = new DockerBuild.Index(\"index\", new()\n {\n Sources = new[]\n {\n amd64.Ref,\n arm64.Ref,\n },\n Tag = \"docker.io/pulumi/pulumi:3.107.0\",\n });\n\n return new Dictionary\u003cstring, object?\u003e\n {\n [\"ref\"] = index.Ref,\n };\n});\n\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tamd64, err := dockerbuild.NewImage(ctx, \"amd64\", \u0026dockerbuild.ImageArgs{\n\t\t\tCacheFrom: dockerbuild.CacheFromArray{\n\t\t\t\t\u0026dockerbuild.CacheFromArgs{\n\t\t\t\t\tRegistry: \u0026dockerbuild.CacheFromRegistryArgs{\n\t\t\t\t\t\tRef: pulumi.String(\"docker.io/pulumi/pulumi:cache-amd64\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tCacheTo: dockerbuild.CacheToArray{\n\t\t\t\t\u0026dockerbuild.CacheToArgs{\n\t\t\t\t\tRegistry: \u0026dockerbuild.CacheToRegistryArgs{\n\t\t\t\t\t\tMode: dockerbuild.CacheModeMax,\n\t\t\t\t\t\tRef: pulumi.String(\"docker.io/pulumi/pulumi:cache-amd64\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tContext: \u0026dockerbuild.BuildContextArgs{\n\t\t\t\tLocation: pulumi.String(\"app\"),\n\t\t\t},\n\t\t\tPlatforms: docker - build.PlatformArray{\n\t\t\t\tdockerbuild.Platform_Linux_amd64,\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"docker.io/pulumi/pulumi:3.107.0-amd64\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tarm64, err := dockerbuild.NewImage(ctx, \"arm64\", \u0026dockerbuild.ImageArgs{\n\t\t\tCacheFrom: dockerbuild.CacheFromArray{\n\t\t\t\t\u0026dockerbuild.CacheFromArgs{\n\t\t\t\t\tRegistry: \u0026dockerbuild.CacheFromRegistryArgs{\n\t\t\t\t\t\tRef: pulumi.String(\"docker.io/pulumi/pulumi:cache-arm64\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tCacheTo: dockerbuild.CacheToArray{\n\t\t\t\t\u0026dockerbuild.CacheToArgs{\n\t\t\t\t\tRegistry: \u0026dockerbuild.CacheToRegistryArgs{\n\t\t\t\t\t\tMode: dockerbuild.CacheModeMax,\n\t\t\t\t\t\tRef: pulumi.String(\"docker.io/pulumi/pulumi:cache-arm64\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tContext: \u0026dockerbuild.BuildContextArgs{\n\t\t\t\tLocation: pulumi.String(\"app\"),\n\t\t\t},\n\t\t\tPlatforms: docker - build.PlatformArray{\n\t\t\t\tdockerbuild.Platform_Linux_arm64,\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"docker.io/pulumi/pulumi:3.107.0-arm64\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tindex, err := dockerbuild.NewIndex(ctx, \"index\", \u0026dockerbuild.IndexArgs{\n\t\t\tSources: pulumi.StringArray{\n\t\t\t\tamd64.Ref,\n\t\t\t\tarm64.Ref,\n\t\t\t},\n\t\t\tTag: pulumi.String(\"docker.io/pulumi/pulumi:3.107.0\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tctx.Export(\"ref\", index.Ref)\n\t\treturn nil\n\t})\n}\n```\n```yaml\ndescription: Multi-platform registry caching\nname: registry-caching\noutputs:\n ref: ${index.ref}\nresources:\n amd64:\n properties:\n cacheFrom:\n - registry:\n ref: docker.io/pulumi/pulumi:cache-amd64\n cacheTo:\n - registry:\n mode: max\n ref: docker.io/pulumi/pulumi:cache-amd64\n context:\n location: app\n platforms:\n - linux/amd64\n tags:\n - docker.io/pulumi/pulumi:3.107.0-amd64\n type: docker-build:Image\n arm64:\n properties:\n cacheFrom:\n - registry:\n ref: docker.io/pulumi/pulumi:cache-arm64\n cacheTo:\n - registry:\n mode: max\n ref: docker.io/pulumi/pulumi:cache-arm64\n context:\n location: app\n platforms:\n - linux/arm64\n tags:\n - docker.io/pulumi/pulumi:3.107.0-arm64\n type: docker-build:Image\n index:\n properties:\n sources:\n - ${amd64.ref}\n - ${arm64.ref}\n tag: docker.io/pulumi/pulumi:3.107.0\n type: docker-build:Index\nruntime: yaml\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.dockerbuild.Image;\nimport com.pulumi.dockerbuild.ImageArgs;\nimport com.pulumi.dockerbuild.inputs.CacheFromArgs;\nimport com.pulumi.dockerbuild.inputs.CacheFromRegistryArgs;\nimport com.pulumi.dockerbuild.inputs.CacheToArgs;\nimport com.pulumi.dockerbuild.inputs.CacheToRegistryArgs;\nimport com.pulumi.dockerbuild.inputs.BuildContextArgs;\nimport com.pulumi.dockerbuild.Index;\nimport com.pulumi.dockerbuild.IndexArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var amd64 = new Image(\"amd64\", ImageArgs.builder() \n .cacheFrom(CacheFromArgs.builder()\n .registry(CacheFromRegistryArgs.builder()\n .ref(\"docker.io/pulumi/pulumi:cache-amd64\")\n .build())\n .build())\n .cacheTo(CacheToArgs.builder()\n .registry(CacheToRegistryArgs.builder()\n .mode(\"max\")\n .ref(\"docker.io/pulumi/pulumi:cache-amd64\")\n .build())\n .build())\n .context(BuildContextArgs.builder()\n .location(\"app\")\n .build())\n .platforms(\"linux/amd64\")\n .tags(\"docker.io/pulumi/pulumi:3.107.0-amd64\")\n .build());\n\n var arm64 = new Image(\"arm64\", ImageArgs.builder() \n .cacheFrom(CacheFromArgs.builder()\n .registry(CacheFromRegistryArgs.builder()\n .ref(\"docker.io/pulumi/pulumi:cache-arm64\")\n .build())\n .build())\n .cacheTo(CacheToArgs.builder()\n .registry(CacheToRegistryArgs.builder()\n .mode(\"max\")\n .ref(\"docker.io/pulumi/pulumi:cache-arm64\")\n .build())\n .build())\n .context(BuildContextArgs.builder()\n .location(\"app\")\n .build())\n .platforms(\"linux/arm64\")\n .tags(\"docker.io/pulumi/pulumi:3.107.0-arm64\")\n .build());\n\n var index = new Index(\"index\", IndexArgs.builder() \n .sources( \n amd64.ref(),\n arm64.ref())\n .tag(\"docker.io/pulumi/pulumi:3.107.0\")\n .build());\n\n ctx.export(\"ref\", index.ref());\n }\n}\n```\n{{% /example %}}\n{{% /examples %}}", diff --git a/provider/internal/image.go b/provider/internal/image.go index 60f9e3a..5b674d6 100644 --- a/provider/internal/image.go +++ b/provider/internal/image.go @@ -99,7 +99,7 @@ type ImageArgs struct { NoCache bool `pulumi:"noCache,optional"` Platforms []Platform `pulumi:"platforms,optional"` Pull bool `pulumi:"pull,optional"` - Push bool `pulumi:"push,optional"` + Push bool `pulumi:"push"` Registries []Registry `pulumi:"registries,optional"` Secrets map[string]string `pulumi:"secrets,optional"` SSH []SSH `pulumi:"ssh,optional"` @@ -907,11 +907,9 @@ func (*Image) Diff( if !reflect.DeepEqual(olds.Context.Named, news.Context.Named) { diff["context.named"] = update } - if olds.Dockerfile.Location != news.Dockerfile.Location { - diff["dockerfile.location"] = update - } - if olds.Dockerfile.Inline != news.Dockerfile.Inline { - diff["dockerfile.inline"] = update + dockerfile, _, _ := news.Context.validate(true, news.Dockerfile) + if !reflect.DeepEqual(olds.Dockerfile, dockerfile) { + diff["dockerfile"] = update } // Use string comparison to ignore any manifests attached to the export. if fmt.Sprint(olds.Exports) != fmt.Sprint(news.Exports) { @@ -932,10 +930,10 @@ func (*Image) Diff( if !reflect.DeepEqual(olds.Platforms, news.Platforms) { diff["platforms"] = update } - if olds.Pull != news.Pull { + if !reflect.DeepEqual(olds.Pull, news.Pull) { diff["pull"] = update } - if olds.Push != news.Push { + if !reflect.DeepEqual(olds.Push, news.Push) { diff["push"] = update } if !reflect.DeepEqual(olds.Secrets, news.Secrets) { @@ -960,7 +958,7 @@ func (*Image) Diff( // Check if anything has changed in our build context. hash, err := hashBuildContext( news.Context.Location, - news.Dockerfile.Location, + dockerfile.Location, news.Context.Named.Map(), ) if err != nil { diff --git a/provider/internal/image_test.go b/provider/internal/image_test.go index e209367..606853a 100644 --- a/provider/internal/image_test.go +++ b/provider/internal/image_test.go @@ -82,6 +82,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty( []resource.PropertyValue{ resource.NewStringProperty("docker.io/pulumibot/buildkit-e2e"), @@ -129,6 +130,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty([]resource.PropertyValue{}), "context": resource.NewObjectProperty(resource.PropertyMap{ "location": resource.NewStringProperty("testdata/noop"), @@ -157,6 +159,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty( []resource.PropertyValue{resource.NewStringProperty("invalid-exports")}, ), @@ -189,6 +192,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty( []resource.PropertyValue{resource.NewStringProperty("foo")}, ), @@ -215,6 +219,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty( []resource.PropertyValue{resource.NewStringProperty("foo")}, ), @@ -246,6 +251,7 @@ func TestImageLifecycle(t *testing.T) { op: func(t *testing.T) integration.Operation { return integration.Operation{ Inputs: resource.PropertyMap{ + "push": resource.NewBoolProperty(false), "tags": resource.NewArrayProperty( []resource.PropertyValue{ resource.NewStringProperty("default-dockerfile"), diff --git a/sdk/dotnet/Image.cs b/sdk/dotnet/Image.cs index d4196f5..3505596 100644 --- a/sdk/dotnet/Image.cs +++ b/sdk/dotnet/Image.cs @@ -681,7 +681,7 @@ namespace Pulumi.DockerBuild /// Equivalent to Docker's `--push` flag. /// [Output("push")] - public Output Push { get; private set; } = null!; + public Output Push { get; private set; } = null!; /// /// If the image was pushed to any registries then this will contain a @@ -765,7 +765,7 @@ namespace Pulumi.DockerBuild /// The unique name of the resource /// The arguments used to populate this resource's properties /// A bag of options that control this resource's behavior - public Image(string name, ImageArgs? args = null, CustomResourceOptions? options = null) + public Image(string name, ImageArgs args, CustomResourceOptions? options = null) : base("docker-build:index:Image", name, args ?? new ImageArgs(), MakeResourceOptions(options, "")) { } @@ -1018,8 +1018,8 @@ namespace Pulumi.DockerBuild /// /// Equivalent to Docker's `--push` flag. /// - [Input("push")] - public Input? Push { get; set; } + [Input("push", required: true)] + public Input Push { get; set; } = null!; [Input("registries")] private InputList? _registries; diff --git a/sdk/go/dockerbuild/image.go b/sdk/go/dockerbuild/image.go index 793ba39..c647a04 100644 --- a/sdk/go/dockerbuild/image.go +++ b/sdk/go/dockerbuild/image.go @@ -7,6 +7,7 @@ import ( "context" "reflect" + "errors" "github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumix" @@ -655,7 +656,7 @@ type Image struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push pulumi.BoolPtrOutput `pulumi:"push"` + Push pulumi.BoolOutput `pulumi:"push"` // If the image was pushed to any registries then this will contain a // single fully-qualified tag including the build's digest. // @@ -712,9 +713,12 @@ type Image struct { func NewImage(ctx *pulumi.Context, name string, args *ImageArgs, opts ...pulumi.ResourceOption) (*Image, error) { if args == nil { - args = &ImageArgs{} + return nil, errors.New("missing one or more required arguments") } + if args.Push == nil { + return nil, errors.New("invalid value for required argument 'Push'") + } if args.BuildOnPreview == nil { args.BuildOnPreview = pulumi.BoolPtr(true) } @@ -862,7 +866,7 @@ type imageArgs struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push *bool `pulumi:"push"` + Push bool `pulumi:"push"` // Registry credentials. Required if reading or exporting to private // repositories. // @@ -1010,7 +1014,7 @@ type ImageArgs struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push pulumi.BoolPtrInput + Push pulumi.BoolInput // Registry credentials. Required if reading or exporting to private // repositories. // @@ -1271,8 +1275,8 @@ func (o ImageOutput) Pull() pulumi.BoolPtrOutput { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. -func (o ImageOutput) Push() pulumi.BoolPtrOutput { - return o.ApplyT(func(v *Image) pulumi.BoolPtrOutput { return v.Push }).(pulumi.BoolPtrOutput) +func (o ImageOutput) Push() pulumi.BoolOutput { + return o.ApplyT(func(v *Image) pulumi.BoolOutput { return v.Push }).(pulumi.BoolOutput) } // If the image was pushed to any registries then this will contain a diff --git a/sdk/go/dockerbuild/x/image.go b/sdk/go/dockerbuild/x/image.go index e0ad4b8..1da4f9c 100644 --- a/sdk/go/dockerbuild/x/image.go +++ b/sdk/go/dockerbuild/x/image.go @@ -7,6 +7,7 @@ import ( "context" "reflect" + "errors" "github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumix" @@ -655,7 +656,7 @@ type Image struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push pulumix.Output[*bool] `pulumi:"push"` + Push pulumix.Output[bool] `pulumi:"push"` // If the image was pushed to any registries then this will contain a // single fully-qualified tag including the build's digest. // @@ -712,9 +713,12 @@ type Image struct { func NewImage(ctx *pulumi.Context, name string, args *ImageArgs, opts ...pulumi.ResourceOption) (*Image, error) { if args == nil { - args = &ImageArgs{} + return nil, errors.New("missing one or more required arguments") } + if args.Push == nil { + return nil, errors.New("invalid value for required argument 'Push'") + } if args.BuildOnPreview == nil { args.BuildOnPreview = pulumix.Ptr(true) } @@ -862,7 +866,7 @@ type imageArgs struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push *bool `pulumi:"push"` + Push bool `pulumi:"push"` // Registry credentials. Required if reading or exporting to private // repositories. // @@ -1010,7 +1014,7 @@ type ImageArgs struct { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. - Push pulumix.Input[*bool] + Push pulumix.Input[bool] // Registry credentials. Required if reading or exporting to private // repositories. // @@ -1274,9 +1278,9 @@ func (o ImageOutput) Pull() pulumix.Output[*bool] { // Defaults to `false`. // // Equivalent to Docker's `--push` flag. -func (o ImageOutput) Push() pulumix.Output[*bool] { - value := pulumix.Apply[Image](o, func(v Image) pulumix.Output[*bool] { return v.Push }) - return pulumix.Flatten[*bool, pulumix.Output[*bool]](value) +func (o ImageOutput) Push() pulumix.Output[bool] { + value := pulumix.Apply[Image](o, func(v Image) pulumix.Output[bool] { return v.Push }) + return pulumix.Flatten[bool, pulumix.Output[bool]](value) } // If the image was pushed to any registries then this will contain a diff --git a/sdk/java/src/main/java/com/pulumi/dockerbuild/Image.java b/sdk/java/src/main/java/com/pulumi/dockerbuild/Image.java index 07f9cad..2613b42 100644 --- a/sdk/java/src/main/java/com/pulumi/dockerbuild/Image.java +++ b/sdk/java/src/main/java/com/pulumi/dockerbuild/Image.java @@ -1023,7 +1023,7 @@ public class Image extends com.pulumi.resources.CustomResource { * */ @Export(name="push", refs={Boolean.class}, tree="[0]") - private Output push; + private Output push; /** * @return When `true` the build will automatically include a `registry` export. @@ -1033,8 +1033,8 @@ public class Image extends com.pulumi.resources.CustomResource { * Equivalent to Docker's `--push` flag. * */ - public Output> push() { - return Codegen.optional(this.push); + public Output push() { + return this.push; } /** * If the image was pushed to any registries then this will contain a @@ -1209,7 +1209,7 @@ public class Image extends com.pulumi.resources.CustomResource { * @param name The _unique_ name of the resulting resource. * @param args The arguments to use to populate this resource's properties. */ - public Image(String name, @Nullable ImageArgs args) { + public Image(String name, ImageArgs args) { this(name, args, null); } /** @@ -1218,7 +1218,7 @@ public class Image extends com.pulumi.resources.CustomResource { * @param args The arguments to use to populate this resource's properties. * @param options A bag of options that control this resource's behavior. */ - public Image(String name, @Nullable ImageArgs args, @Nullable com.pulumi.resources.CustomResourceOptions options) { + public Image(String name, ImageArgs args, @Nullable com.pulumi.resources.CustomResourceOptions options) { super("docker-build:index:Image", name, args == null ? ImageArgs.Empty : args, makeResourceOptions(options, Codegen.empty())); } diff --git a/sdk/java/src/main/java/com/pulumi/dockerbuild/ImageArgs.java b/sdk/java/src/main/java/com/pulumi/dockerbuild/ImageArgs.java index ae479e9..bfd71fb 100644 --- a/sdk/java/src/main/java/com/pulumi/dockerbuild/ImageArgs.java +++ b/sdk/java/src/main/java/com/pulumi/dockerbuild/ImageArgs.java @@ -16,6 +16,7 @@ import com.pulumi.dockerbuild.inputs.DockerfileArgs; import com.pulumi.dockerbuild.inputs.ExportArgs; import com.pulumi.dockerbuild.inputs.RegistryArgs; import com.pulumi.dockerbuild.inputs.SSHArgs; +import com.pulumi.exceptions.MissingRequiredPropertyException; import java.lang.Boolean; import java.lang.String; import java.util.List; @@ -419,8 +420,8 @@ public final class ImageArgs extends com.pulumi.resources.ResourceArgs { * Equivalent to Docker's `--push` flag. * */ - @Import(name="push") - private @Nullable Output push; + @Import(name="push", required=true) + private Output push; /** * @return When `true` the build will automatically include a `registry` export. @@ -430,8 +431,8 @@ public final class ImageArgs extends com.pulumi.resources.ResourceArgs { * Equivalent to Docker's `--push` flag. * */ - public Optional> push() { - return Optional.ofNullable(this.push); + public Output push() { + return this.push; } /** @@ -1158,7 +1159,7 @@ public final class ImageArgs extends com.pulumi.resources.ResourceArgs { * @return builder * */ - public Builder push(@Nullable Output push) { + public Builder push(Output push) { $.push = push; return this; } @@ -1378,6 +1379,9 @@ public final class ImageArgs extends com.pulumi.resources.ResourceArgs { public ImageArgs build() { $.buildOnPreview = Codegen.booleanProp("buildOnPreview").output().arg($.buildOnPreview).def(true).getNullable(); $.network = Codegen.objectProp("network", NetworkMode.class).output().arg($.network).def(NetworkMode.Default_).getNullable(); + if ($.push == null) { + throw new MissingRequiredPropertyException("ImageArgs", "push"); + } return $; } } diff --git a/sdk/nodejs/image.ts b/sdk/nodejs/image.ts index faa0130..7d36445 100644 --- a/sdk/nodejs/image.ts +++ b/sdk/nodejs/image.ts @@ -640,7 +640,7 @@ export class Image extends pulumi.CustomResource { * * Equivalent to Docker's `--push` flag. */ - public readonly push!: pulumi.Output; + public readonly push!: pulumi.Output; /** * If the image was pushed to any registries then this will contain a * single fully-qualified tag including the build's digest. @@ -711,10 +711,13 @@ export class Image extends pulumi.CustomResource { * @param args The arguments to use to populate this resource's properties. * @param opts A bag of options that control this resource's behavior. */ - constructor(name: string, args?: ImageArgs, opts?: pulumi.CustomResourceOptions) { + constructor(name: string, args: ImageArgs, opts?: pulumi.CustomResourceOptions) { let resourceInputs: pulumi.Inputs = {}; opts = opts || {}; if (!opts.id) { + if ((!args || args.push === undefined) && !opts.urn) { + throw new Error("Missing required property 'push'"); + } resourceInputs["addHosts"] = args ? args.addHosts : undefined; resourceInputs["buildArgs"] = args ? args.buildArgs : undefined; resourceInputs["buildOnPreview"] = (args ? args.buildOnPreview : undefined) ?? true; @@ -918,7 +921,7 @@ export interface ImageArgs { * * Equivalent to Docker's `--push` flag. */ - push?: pulumi.Input; + push: pulumi.Input; /** * Registry credentials. Required if reading or exporting to private * repositories. diff --git a/sdk/python/pulumi_docker_build/image.py b/sdk/python/pulumi_docker_build/image.py index 1e3a72e..20879f4 100644 --- a/sdk/python/pulumi_docker_build/image.py +++ b/sdk/python/pulumi_docker_build/image.py @@ -17,6 +17,7 @@ __all__ = ['ImageArgs', 'Image'] @pulumi.input_type class ImageArgs: def __init__(__self__, *, + push: pulumi.Input[bool], add_hosts: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, build_args: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, build_on_preview: Optional[pulumi.Input[bool]] = None, @@ -33,7 +34,6 @@ class ImageArgs: no_cache: Optional[pulumi.Input[bool]] = None, platforms: Optional[pulumi.Input[Sequence[pulumi.Input['Platform']]]] = None, pull: Optional[pulumi.Input[bool]] = None, - push: Optional[pulumi.Input[bool]] = None, registries: Optional[pulumi.Input[Sequence[pulumi.Input['RegistryArgs']]]] = None, secrets: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, ssh: Optional[pulumi.Input[Sequence[pulumi.Input['SSHArgs']]]] = None, @@ -41,6 +41,11 @@ class ImageArgs: target: Optional[pulumi.Input[str]] = None): """ The set of arguments for constructing a Image resource. + :param pulumi.Input[bool] push: When `true` the build will automatically include a `registry` export. + + Defaults to `false`. + + Equivalent to Docker's `--push` flag. :param pulumi.Input[Sequence[pulumi.Input[str]]] add_hosts: Custom `host:ip` mappings to use during the build. Equivalent to Docker's `--add-host` flag. @@ -128,11 +133,6 @@ class ImageArgs: :param pulumi.Input[bool] pull: Always pull referenced images. Equivalent to Docker's `--pull` flag. - :param pulumi.Input[bool] push: When `true` the build will automatically include a `registry` export. - - Defaults to `false`. - - Equivalent to Docker's `--push` flag. :param pulumi.Input[Sequence[pulumi.Input['RegistryArgs']]] registries: Registry credentials. Required if reading or exporting to private repositories. @@ -164,6 +164,7 @@ class ImageArgs: Equivalent to Docker's `--target` flag. """ + pulumi.set(__self__, "push", push) if add_hosts is not None: pulumi.set(__self__, "add_hosts", add_hosts) if build_args is not None: @@ -200,8 +201,6 @@ class ImageArgs: pulumi.set(__self__, "platforms", platforms) if pull is not None: pulumi.set(__self__, "pull", pull) - if push is not None: - pulumi.set(__self__, "push", push) if registries is not None: pulumi.set(__self__, "registries", registries) if secrets is not None: @@ -213,6 +212,22 @@ class ImageArgs: if target is not None: pulumi.set(__self__, "target", target) + @property + @pulumi.getter + def push(self) -> pulumi.Input[bool]: + """ + When `true` the build will automatically include a `registry` export. + + Defaults to `false`. + + Equivalent to Docker's `--push` flag. + """ + return pulumi.get(self, "push") + + @push.setter + def push(self, value: pulumi.Input[bool]): + pulumi.set(self, "push", value) + @property @pulumi.getter(name="addHosts") def add_hosts(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: @@ -476,22 +491,6 @@ class ImageArgs: def pull(self, value: Optional[pulumi.Input[bool]]): pulumi.set(self, "pull", value) - @property - @pulumi.getter - def push(self) -> Optional[pulumi.Input[bool]]: - """ - When `true` the build will automatically include a `registry` export. - - Defaults to `false`. - - Equivalent to Docker's `--push` flag. - """ - return pulumi.get(self, "push") - - @push.setter - def push(self, value: Optional[pulumi.Input[bool]]): - pulumi.set(self, "push", value) - @property @pulumi.getter def registries(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['RegistryArgs']]]]: @@ -1030,7 +1029,7 @@ class Image(pulumi.CustomResource): @overload def __init__(__self__, resource_name: str, - args: Optional[ImageArgs] = None, + args: ImageArgs, opts: Optional[pulumi.ResourceOptions] = None): """ A Docker image built using buildx -- Docker's interface to the improved @@ -1393,6 +1392,8 @@ class Image(pulumi.CustomResource): __props__.__dict__["no_cache"] = no_cache __props__.__dict__["platforms"] = platforms __props__.__dict__["pull"] = pull + if push is None and not opts.urn: + raise TypeError("Missing required property 'push'") __props__.__dict__["push"] = push __props__.__dict__["registries"] = registries __props__.__dict__["secrets"] = secrets @@ -1676,7 +1677,7 @@ class Image(pulumi.CustomResource): @property @pulumi.getter - def push(self) -> pulumi.Output[Optional[bool]]: + def push(self) -> pulumi.Output[bool]: """ When `true` the build will automatically include a `registry` export.