Pulumi.FSharp.Extensions icon indicating copy to clipboard operation
Pulumi.FSharp.Extensions copied to clipboard

CustomResourceOptions CE

Open mvsmal opened this issue 1 year ago • 4 comments

This PR adds:

  • CustomResourceOptions CE in Pulumi.FSharp.Core This is just a hard-coded CE for the Pulumi type (also includes CE for CustomTimeouts)
  • Yield operation in the resources CEs

I've managed to avoid breaking changes and kept the existing dependsOn operation, which will overwrite that property on the passed customResourceOptions. I also added a deprecation notice in the comments.

Here is an example of a generated code:

namespace Pulumi.FSharp

open Pulumi.FSharp
open Pulumi

module Docker =
    open Pulumi.Docker

    let _combine ((rName, rArgs), (lName, lArgs)) =
        (match lName, rName with
         | null, null -> null
         | null, name -> name
         | name, null -> name
         | _ -> failwith "Duplicate name"),
        (List.concat [ lArgs; rArgs ])

    let _combineCros ((rName, rArgs, rCros, rCroI), (lName, lArgs, lCros, lCroI)) =
        (match lName, rName with
         | null, null -> null
         | null, name -> name
         | name, null -> name
         | _ -> failwith "DuplicateName"),
        (List.concat [ lArgs; rArgs ]),
        (List.concat [ lCros; rCros ]),
        (match lCroI, rCroI with
         | null, null -> null
         | null, croi -> croi
         | croi, null -> croi
         | _ -> failwith "DuplicateCroI")

    type ImageBuilder() =


            member _.Yield(_: unit) = null, [ id ], [ id ], null

            member _.Run(name, args, cros, croI) =
                Image(
                    name,
                    List.fold (fun args f -> f args) (ImageArgs()) args,
                    List.fold
                        (fun cros f -> f cros)
                        (match croI with
                         | null -> CustomResourceOptions()
                         | croI -> croI)
                        cros
                )

            member this.Combine(args) = _combineCros args
            member this.For(args, delayedArgs) = this.Combine(args, delayedArgs ())
            member _.Delay(f) = f ()
            member _.Zero _ = ()

            ///Pulumi logical resource name
            [<CustomOperation("name")>]
            member _.Name((_, args, cros, croI), newName) = newName, args, cros, croI

            member _.Yield(arg) =
                null,
                [ (let func (args: ImageArgs) =
                      args.Build <- input arg
                      args

                   ()
                   func) ],
                [ id ],
                null

            ///The image name, of the format repository[:tag], e.g. `docker.io/username/demo-image:v1`.
            ///This reference is not unique to each build and push.For the unique manifest SHA of a pushed docker image, or the local image ID, please use `repoDigest`.
            [<CustomOperation("imageName")>]
            member _.ImageName((name, args, cros, croI), imageName) =
                name,
                List.Cons(
                    (fun (args: ImageArgs) ->
                        args.ImageName <- input imageName
                        args),
                    args
                ),
                cros,
                croI

            ///The image name, of the format repository[:tag], e.g. `docker.io/username/demo-image:v1`.
            ///This reference is not unique to each build and push.For the unique manifest SHA of a pushed docker image, or the local image ID, please use `repoDigest`.
            member _.ImageName((name, args, cros, croI), imageName) =
                name,
                List.Cons(
                    (fun (args: ImageArgs) ->
                        args.ImageName <- io imageName
                        args),
                    args
                ),
                cros,
                croI

            member _.Yield(arg) =
                null,
                [ (let func (args: ImageArgs) =
                      args.Registry <- input arg
                      args

                   ()
                   func) ],
                [ id ],
                null

            ///A flag to skip a registry push.
            [<CustomOperation("skipPush")>]
            member _.SkipPush((name, args, cros, croI), skipPush) =
                name,
                List.Cons(
                    (fun (args: ImageArgs) ->
                        args.SkipPush <- input skipPush
                        args),
                    args
                ),
                cros,
                croI

            ///A flag to skip a registry push.
            member _.SkipPush((name, args, cros, croI), skipPush) =
                name,
                List.Cons(
                    (fun (args: ImageArgs) ->
                        args.SkipPush <- io skipPush
                        args),
                    args
                ),
                cros,
                croI

            ///Obsolete. Use customResourceOptions nested CE. Ensure this resource gets created after its dependency
            [<CustomOperation("dependsOn")>]
            member _.DependsOn((name, args, cros, croI), dependency) =
                name,
                args,
                List.Cons(
                    (fun (cros: CustomResourceOptions) ->
                        cros.DependsOn <- inputList [ input dependency ]
                        cros),
                    cros
                ),
                croI

            ///Obsolete. Use customResourceOptions nested CE. Ensure this resource gets created after its dependency
            member _.DependsOn((name, args, cros, croI), dependency) =
                name,
                args,
                List.Cons(
                    (fun (cros: CustomResourceOptions) ->
                        cros.DependsOn <- inputList (Seq.map input dependency)
                        cros),
                    cros
                ),
                croI

            member _.Yield(croI: CustomResourceOptions) = null, [ id ], [ id ], croI

    ///`Image` builds a Docker image and pushes it Docker and OCI compatible registries.
    ///
    ///*** Operations ***
    ///
    /// - imageName
    ///
    /// - skipPush
    ///
    ///
    ///
    ///*** Nested computational expressions ***
    ///
    /// - dockerBuild
    ///
    /// - registry
    let image = ImageBuilder()

mvsmal avatar Nov 10 '23 07:11 mvsmal

Friendly reminder 🙂

mvsmal avatar Jan 15 '24 13:01 mvsmal

hi @UnoSD Hope you are fine. Would you have time for reviewing this thing?

mvsmal avatar Feb 16 '24 11:02 mvsmal

Hi @mvsmal, apologies, I forgot this one was open. I will be insanely busy for the rest of Feb, but I'll put this on top of my list for the beginning of March.

UnoSD avatar Feb 17 '24 08:02 UnoSD

hi @mvsmal, thank you for the patience and apologies again. Thing are getting quieter now, so I will try and have a look; by any chance, do you have example code that I can add to the test project to test all the operations in the change? thanks

UnoSD avatar Mar 21 '24 14:03 UnoSD