pulumi / pulumi-github

A Pulumi package to facilitate interacting with GitHub
Apache License 2.0
56 stars 10 forks source link

`RepositoryCollaborator` should be `deleteBeforeReplace` by default. #677

Closed ringods closed 3 weeks ago

ringods commented 1 month ago

Describe what happened

The TF resource github_repository_collaborator has ForceNew: true for these 3 properties:

This translates to a resource replacement in the Pulumi provider. The default implementation of a replace by Pulumi is to create the new resource first before the delete is executed.

Conceptually, given a repository and a username, you can't create a RepositoryCollaborator twice with different permissions. I think this resource should be marked deleteBeforeReplace by default.

Sample program

Pulumi program to manage the pulumiverse Github organization:

https://github.com/pulumiverse/infra

Log output

  pulumi:pulumi:Stack: (same)
    [urn=urn:pulumi:prod::infra::pulumi:pulumi:Stack::infra-prod]
    ++github:index/repositoryCollaborator:RepositoryCollaborator: (create-replacement)
        [id=pulumi-configcat:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-configcat_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    ++github:index/repositoryCollaborator:RepositoryCollaborator: (create-replacement)
        [id=pulumi-unifi:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-unifi_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    ++github:index/repositoryCollaborator:RepositoryCollaborator: (create-replacement)
        [id=pulumi-concourse:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-concourse_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    +-github:index/repositoryCollaborator:RepositoryCollaborator: (replace)
        [id=pulumi-configcat:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-configcat_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    +-github:index/repositoryCollaborator:RepositoryCollaborator: (replace)
        [id=pulumi-unifi:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-unifi_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    +-github:index/repositoryCollaborator:RepositoryCollaborator: (replace)
        [id=pulumi-concourse:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-concourse_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
      ~ permission: "pull" => "admin"
    --github:index/repositoryCollaborator:RepositoryCollaborator: (delete-replaced)
        [id=pulumi-configcat:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-configcat_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
    --github:index/repositoryCollaborator:RepositoryCollaborator: (delete-replaced)
        [id=pulumi-concourse:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-concourse_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]
    --github:index/repositoryCollaborator:RepositoryCollaborator: (delete-replaced)
        [id=pulumi-unifi:ringods]
        [urn=urn:pulumi:prod::infra::github:index/repositoryCollaborator:RepositoryCollaborator::pulumi-unifi_ringods]
        [provider=urn:pulumi:prod::infra::pulumi:providers:github::default_5_26_0::7f875b1e-0fe5-47d9-a413-5c37a315a526]

        --outputs:--
      - id                       : "pulumi-concourse:ringods"
      - permission               : "pull"
      - permissionDiffSuppression: false
      - repository               : "pulumi-concourse"
      - username                 : "ringods"
        --outputs:--
      - id                       : "pulumi-configcat:ringods"
      - permission               : "pull"
      - permissionDiffSuppression: false
      - repository               : "pulumi-configcat"
      - username                 : "ringods"
        --outputs:--
      - id                       : "pulumi-unifi:ringods"
      - permission               : "pull"
      - permissionDiffSuppression: false
      - repository               : "pulumi-unifi"
      - username                 : "ringods"

Affected Resource(s)

github.RepositoryCollaborator

Output of pulumi about

CLI          
Version      3.118.0
Go Version   go1.22.3
Go Compiler  gc

Plugins
KIND      NAME    VERSION
resource  github  5.26.0
language  nodejs  unknown

Host     
OS       ubuntu
Version  22.04
Arch     x86_64

This project is written in nodejs: executable='/usr/bin/node' version='v18.17.1'

Current Stack: pulumiverse/infra/prod

<stripped the resource list>

Backend        
Name           pulumi.com
URL            https://app.pulumi.com/tmeckel
User           tmeckel
Organizations  tmeckel, ophios, pulumiverse, puluminaries
Token type     personal

Dependencies:
NAME                  VERSION
@pulumi/github        5.26.0
@pulumi/pulumi        3.116.0
@tsconfig/node16      16.1.3
typescript            4.9.5
yaml                  2.4.3
@bjerk/eslint-config  6.0.2
@simenandre/prettier  5.0.0
@types/node           18.19.33
runtypes              6.7.0

Pulumi locates its logs in /tmp by default

Additional context

No response

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).