community icon indicating copy to clipboard operation
community copied to clipboard

feat: initial infra for slack intergration

Open Shurtu-gal opened this issue 10 months ago β€’ 18 comments

Description

  • Sets up the initial infrastructure needed for Slack integration.

Tasks

  • [x] Initialise Terraform files
  • [x] Make a GitHub Workflow
  • [x] Test workflow on personal repo
  • [x] Add remaining channels and groups as required.
  • [x] Add slack handles in working groups.
  • [ ] https://github.com/asyncapi/community/pull/1143

Related issue(s) Fixes #1072

Shurtu-gal avatar Mar 27 '24 20:03 Shurtu-gal

@smoya The working groups part has also been done. Successful workflow runs can be viewed here.

Just needs to wait for the added comment https://github.com/asyncapi/community/pull/1143#discussion_r1551667548

Shurtu-gal avatar Apr 04 '24 13:04 Shurtu-gal

@asyncapi/bounty_team

aeworxet avatar Apr 15 '24 17:04 aeworxet

@aeworxet The work regarding the PR has been done. Once this https://github.com/asyncapi/community/pull/1143 gets approved we can merge this too.

Thank you for being so patient πŸ€—

Shurtu-gal avatar Apr 15 '24 18:04 Shurtu-gal

@aeworxet The work regarding the PR has been done. Once this #1143 gets approved we can merge this too.

Thank you for being so patient πŸ€—

As shared via DM in Slack, would you mind adding a markdown file with all the instructions on how to run this and how to get a proper Slack token (application creation, permissions, etc)? πŸ™

Additionally, I'm concerned about the fact we already have created some Slack groups. As you shared, when running TF apply and TF finds those groups already created and not managed by TF, it will fail. So we nee to handle this somehow.

smoya avatar Apr 16 '24 17:04 smoya

@smoya the docs has been added, furthermore I have incorporated changes from you PR.

Shurtu-gal avatar Apr 16 '24 21:04 Shurtu-gal

/update

Shurtu-gal avatar Apr 18 '24 19:04 Shurtu-gal

@Shurtu-gal I'm having the following error when terraform init:

~/dev/community/.github/workflows/slack slack-integration ?1                                                                                                          52s 12:36:34
❯ terraform init

Initializing the backend...
Initializing modules...
- channels in channels
- groups in groups
- users in users
β•·
β”‚ Error: Missing attribute separator
β”‚
β”‚   on channels/channels.tf line 56, in locals:
β”‚   55:     for wg_data in local.wg_channel_data : wg_data.name => {
β”‚   56:       name = lookup(lookup(lookup(wg_data, "slack", {}), "channel", {}), "handle", "wg-${replace(lower(wg_data.name), " ", "-")}"))
β”‚
β”‚ Expected a newline or comma to mark the beginning of the next attribute.

smoya avatar Apr 22 '24 10:04 smoya

I'm having a new error:

❯ terraform plan
β•·
β”‚ Error: Reference to undeclared resource
β”‚
β”‚   on channels/channels.tf line 60, in locals:
β”‚   60:       permanent_members = concat([for member in wg_channel.chairpersons : member.slack], [for member in wg_data.members : member.slack])
β”‚
β”‚ A managed resource "wg_channel" "chairpersons" has not been declared in module.channels.

Also please rename the variable. Can’t be wg_channel because it is not about the channel. As explained in other comments in my previous review, it adds a lot of confusion.

smoya avatar Apr 29 '24 09:04 smoya

@Shurtu-gal There are some user groups and channels already created in AsyncAPI Slack that, as per the README you wrote (in case of usergroups), should be imported. However:

❯ terraform import slack_usergroup.dx_wg <actual_group_id>
Error: resource address "slack_usergroup.dx_wg" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "slack_usergroup" "dx_wg" {
  # (resource arguments)
}

smoya avatar Apr 29 '24 14:04 smoya

@smoya I have updated the README. You can try out the following command.

terraform import module.groups.slack_usergroup.wg_groups[\"Developer Experience\"] <actual_group_id>

I have also added the manual groups and changed the handle to dx_wg

Shurtu-gal avatar Apr 30 '24 16:04 Shurtu-gal

For the record, these are the commands we should execute before checking or applying the terraform plan in order to import the user groups that are already present in our slack workspace. Also, all channels should be imported first so we get them into the tfstate (already done and pushed):

terraform import module.groups.slack_usergroup.wg_groups[\"Developer Experience\"] S06T4ULNQL8
terraform import module.groups.slack_usergroup.groups[\"CoC Committee\"] S06G3VCDTPU
terraform import module.groups.slack_usergroup.groups[\"Studio\"] S05D76QM92M

smoya avatar May 02 '24 12:05 smoya

For the record, these are the commands we should execute before checking or applying the terraform plan in order to import the user groups that are already present in our slack workspace:

terraform import module.groups.slack_usergroup.wg_groups[\"Developer Experience\"] S06T4ULNQL8
terraform import module.groups.slack_usergroup.groups[\"CoC Committee\"] S06G3VCDTPU
terraform import module.groups.slack_usergroup.groups[\"Studio\"] S05D76QM92M

Yes, that's correct!

Shurtu-gal avatar May 02 '24 12:05 Shurtu-gal

@smoya I have added the requisites.

Shurtu-gal avatar May 02 '24 15:05 Shurtu-gal

@Shurtu-gal If we need to run the import of the already created usergroups every time we run the plan, that's going to be a pain and impossible to automate. Isn't any other solution so already created user groups are kept as it happens with channels?

smoya avatar May 03 '24 05:05 smoya

@Shurtu-gal If we need to run the import of the already created usergroups every time we run the plan, that's going to be a pain and impossible to automate. Isn't any other solution so already created user groups are kept as it happens with channels?

@smoya afaik upon import of user groups, the terraform.state should be updated, thus not needing imports for the same group again. As the provider will see that the group is already present it won't do any further modification with it.

Shurtu-gal avatar May 03 '24 07:05 Shurtu-gal

@Shurtu-gal If we need to run the import of the already created usergroups every time we run the plan, that's going to be a pain and impossible to automate. Isn't any other solution so already created user groups are kept as it happens with channels?

@smoya afaik upon import of user groups, the terraform.state should be updated, thus not needing imports for the same group again. As the provider will see that the group is already present it won't do any further modification with it.

Do you mean .tfstate file? Afaik it can contain sensitive data and it should not be tracked in git πŸ€” the state should be created by the tf provider by checking resources on Slack API.

smoya avatar May 03 '24 07:05 smoya

@Shurtu-gal and I ended up doing a zoom session to ultimate all the details. Now all the manual testing is done and LGTM βœ…

@thulieblack @derberg please do the final review to the following output of terraform plan (the command tells you what terraform apply will perform on our Slack). Please note that all the current channels will be listed in the output because it is the first execution, so it is the way terraform adds them into the state, however you will see no modification will happen but just adding metadata related with terraform.

If it is πŸ‘, please approve this PR.

After merging, I expect terraform will run through the workflow and will create a file which contains the terraform state, which will be pushed to git by the bot creating an automated PR. In case Gh don't run the first time, I will trigger manually the deploy.

For the record, in case you need to check and compare, the list of channels on AsyncAPI Slack workspace can be found here.

You can see the following terraform plan output highlighted by checking my asciinema recording (there is no online highlighter service for this...)

Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # module.channels.slack_conversation.channels["01_introductions"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C023GJWH33K"
        name                               = "01_introductions"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["02_general"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C34F2JV0U"
        name                               = "02_general"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["03_specification"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C0230UAM6R3"
        name                               = "03_specification"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["04_tooling"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "CQVJXFNQL"
        name                               = "04_tooling"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["05_promotion-marketing"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "CH44ZMJAZ"
        name                               = "05_promotion-marketing"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["06_training"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C021E161QBV"
        name                               = "06_training"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["07_events"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C023A76SV2Q"
        name                               = "07_events"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["08_jobs"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C022P9CAMBR"
        name                               = "08_jobs"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["09_mentorships"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C023A7K5M3N"
        name                               = "09_mentorships"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["10_watercooler"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C34AUKWQK"
        name                               = "10_watercooler"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["11_contributing"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02FK3YDPCL"
        name                               = "11_contributing"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["12_design"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02JW8DA0DC"
        name                               = "12_design"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["13_docs"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02QY9FMM18"
        name                               = "13_docs"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["14_accessibility"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02UV8CTT61"
        name                               = "14_accessibility"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["15_ambassadors"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C04TRUTNPHB"
        name                               = "15_ambassadors"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["16_news"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C05PWURSSP7"
        name                               = "16_news"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["17_bounty"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C05UHTSEHE2"
        name                               = "17_bounty"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["18_asyncapi-v3"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C066WFT906A"
        name                               = "18_asyncapi-v3"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["19_coc"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C06FLH3AVSB"
        name                               = "19_coc"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["93_bot-infra-alerts"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C045Y33BZQX"
        name                               = "93_bot-infra-alerts"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["94_bot-failing-ci"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C03CHT8UFR7"
        name                               = "94_bot-failing-ci"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["95_bot-tsc-members-mentioned"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C031UMXT63F"
        name                               = "95_bot-tsc-members-mentioned"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["96_bot-stackoverflow-questions"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02544TFYJ0"
        name                               = "96_bot-stackoverflow-questions"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["97_bot-github-new-issues-prs"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C01J06RL10X"
        name                               = "97_bot-github-new-issues-prs"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["98_bot-github-releases"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C01JF00UGKC"
        name                               = "98_bot-github-releases"
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["glee-demos"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02L1QCT1HP"
        name                               = "glee-demos"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["gsoc2021-students-mentors-collaboration"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C023H9V3ZLM"
        name                               = "gsoc2021-students-mentors-collaboration"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["help-"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C02RJF383MM"
        name                               = "help-"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["jsonschema"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C038FTU4LQ6"
        name                               = "jsonschema"
        # (9 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["libopenapi-speakeasy"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C04F6TQ40N7"
        name                               = "libopenapi-speakeasy"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["linux"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C04EKM39P4M"
        name                               = "linux"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["salemfr1100"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C055JEMLGF7"
        name                               = "salemfr1100"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["status-updates"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C06N61ASV6X"
        name                               = "status-updates"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.channels["test-bot-public"] will be updated in-place
  ~ resource "slack_conversation" "channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C0579CUA7GD"
        name                               = "test-bot-public"
        # (8 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.wg_channels["Developer Experience"] will be updated in-place
  ~ resource "slack_conversation" "wg_channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C06G92DN05D"
        name                               = "wg-developer-experience"
      + permanent_members                  = [
          + "U0132LQU8C9",
          + "U01N6AW5V5G",
          + "U01RVRD1TCL",
          + "U01TP1KJV1R",
          + "U03CNHGEUR1",
          + "U04STTQHV18",
          + "U0572R8J927",
          + "U34F2JRRS",
          + "UTCN3ET4M",
        ]
        # (10 unchanged attributes hidden)
    }

  # module.channels.slack_conversation.wg_channels["Essential Building Blocks"] will be updated in-place
  ~ resource "slack_conversation" "wg_channels" {
      + action_on_destroy                  = "archive"
      + action_on_update_permanent_members = "none"
      + adopt_existing_channel             = true
        id                                 = "C06SSB65QQJ"
        name                               = "wg-essential-building-blocks"
      + permanent_members                  = [
          + "U0132LQU8C9",
          + "U01SGCZMJKW",
          + "U04C58GB8TF",
          + "U06L7EQQSF2",
          + "UNH2HT346",
          + "UQ2ANBG1E",
        ]
        # (9 unchanged attributes hidden)
    }

  # module.groups.slack_usergroup.groups["Maintainers"] will be created
  + resource "slack_usergroup" "groups" {
      + description = "Maintainers"
      + handle      = "maintainers"
      + id          = (known after apply)
      + name        = "Maintainers"
      + users       = [
          + "U011D1DAU6S",
          + "U0132LQU8C9",
          + "U018NLDV5E1",
          + "U01BM49KL3Z",
          + "U01DVKKAV5K",
          + "U01EB02BP7A",
          + "U01EYAFR5BR",
          + "U01G3U01SVC",
          + "U01L3FH3BUH",
          + "U01LYC8PW0M",
          + "U01N6AW5V5G",
          + "U01P5QDLP0X",
          + "U01QRHR1ABH",
          + "U01RVRD1TCL",
          + "U01RWDD69PZ",
          + "U01S8EQ9LQ2",
          + "U01SE93Q48N",
          + "U01SGCZMJKW",
          + "U0231F9KXNK",
          + "U02AKC14WAJ",
          + "U02EC8BT0TX",
          + "U02FP8WBFQE",
          + "U02FPPCEH6H",
          + "U02FT2TKM37",
          + "U02G8MDDEF3",
          + "U02JVEQ6S9W",
          + "U02T2MY9W5T",
          + "U02TAMG2VKN",
          + "U02UK9RUPGQ",
          + "U037S2HK4TS",
          + "U03A5145",
          + "U03A51H8",
          + "U03AC4G51H8",
          + "U03CNHGEUR1",
          + "U03CNJPMT7C",
          + "U03D18YKX2M",
          + "U03HBC08EBB",
          + "U03NV5L4S49",
          + "U04630DU3N3",
          + "U04C58GB8TF",
          + "U04STTQHV18",
          + "U054UUYBNLF",
          + "U0572R8J927",
          + "U062LA14E58",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UH3B166TD",
          + "UN22ZTLHG",
          + "UQ2ANBG1E",
          + "UTCN3ET4M",
        ]
    }

  # module.groups.slack_usergroup.groups["TSC Members"] will be created
  + resource "slack_usergroup" "groups" {
      + description = "TSC members - https://www.asyncapi.com/community/tsc"
      + handle      = "tsc"
      + id          = (known after apply)
      + name        = "TSC Members"
      + users       = [
          + "U011D1DAU6S",
          + "U0132LQU8C9",
          + "U018NLDV5E1",
          + "U01BM49KL3Z",
          + "U01DVKKAV5K",
          + "U01EB02BP7A",
          + "U01EYAFR5BR",
          + "U01L3FH3BUH",
          + "U01LYC8PW0M",
          + "U01N6AW5V5G",
          + "U01P5QDLP0X",
          + "U01QRHR1ABH",
          + "U01RVRD1TCL",
          + "U01RWDD69PZ",
          + "U01S8EQ9LQ2",
          + "U01SE93Q48N",
          + "U01SGCZMJKW",
          + "U0231F9KXNK",
          + "U02AKC14WAJ",
          + "U02EC8BT0TX",
          + "U02FP8WBFQE",
          + "U02FPPCEH6H",
          + "U02FT2TKM37",
          + "U02G8MDDEF3",
          + "U02JVEQ6S9W",
          + "U02T2MY9W5T",
          + "U02TAMG2VKN",
          + "U02UK9RUPGQ",
          + "U037S2HK4TS",
          + "U03AC4G51H8",
          + "U03CNHGEUR1",
          + "U03CNJPMT7C",
          + "U03D18YKX2M",
          + "U03HBC08EBB",
          + "U03NV5L4S49",
          + "U04630DU3N3",
          + "U04C58GB8TF",
          + "U04STTQHV18",
          + "U054UUYBNLF",
          + "U0572R8J927",
          + "U062LA14E58",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UH3B166TD",
          + "UN22ZTLHG",
          + "UQ2ANBG1E",
          + "UTCN3ET4M",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos[".github"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/.github"
      + handle      = "maintainers_.github"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/.github"
      + users       = [
          + "U01RVRD1TCL",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["asyncapi-php-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/asyncapi-php-template"
      + handle      = "maintainers_asyncapi-php-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/asyncapi-php-template"
      + users       = [
          + "U01LYC8PW0M",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["asyncapi-react"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/asyncapi-react"
      + handle      = "maintainers_asyncapi-react"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/asyncapi-react"
      + users       = [
          + "U01EB02BP7A",
          + "U34F2JRRS",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["avro-schema-parser"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/avro-schema-parser"
      + handle      = "maintainers_avro-schema-parser"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/avro-schema-parser"
      + users       = [
          + "U01BM49KL3Z",
          + "U01EYAFR5BR",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["bindings"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/bindings"
      + handle      = "maintainers_bindings"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/bindings"
      + users       = [
          + "U018NLDV5E1",
          + "U01DVKKAV5K",
          + "U01EYAFR5BR",
          + "U01L3FH3BUH",
          + "U01P5QDLP0X",
          + "U01RVRD1TCL",
          + "U03HBC08EBB",
          + "U03NV5L4S49",
          + "U04C58GB8TF",
          + "U34F2JRRS",
          + "UH3B166TD",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["brand"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/brand"
      + handle      = "maintainers_brand"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/brand"
      + users       = [
          + "U02JVEQ6S9W",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["bundler"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/bundler"
      + handle      = "maintainers_bundler"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/bundler"
      + users       = [
          + "U01G3U01SVC",
          + "U01SGCZMJKW",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["chatbot"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/chatbot"
      + handle      = "maintainers_chatbot"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/chatbot"
      + users       = [
          + "U01EB02BP7A",
          + "U01RWDD69PZ",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["cli"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/cli"
      + handle      = "maintainers_cli"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/cli"
      + users       = [
          + "U01EB02BP7A",
          + "U01SGCZMJKW",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["community"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/community"
      + handle      = "maintainers_community"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/community"
      + users       = [
          + "U02AKC14WAJ",
          + "U03CNJPMT7C",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["converter-go"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/converter-go"
      + handle      = "maintainers_converter-go"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/converter-go"
      + users       = [
          + "U01EB02BP7A",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["design-system"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/design-system"
      + handle      = "maintainers_design-system"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/design-system"
      + users       = [
          + "U02JVEQ6S9W",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["diff"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/diff"
      + handle      = "maintainers_diff"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/diff"
      + users       = [
          + "U01QRHR1ABH",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["dotnet-nats-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/dotnet-nats-template"
      + handle      = "maintainers_dotnet-nats-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/dotnet-nats-template"
      + users       = [
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["dotnet-rabbitmq-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/dotnet-rabbitmq-template"
      + handle      = "maintainers_dotnet-rabbitmq-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/dotnet-rabbitmq-template"
      + users       = [
          + "U03A5145",
          + "U03A51H8",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["event-gateway"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/event-gateway"
      + handle      = "maintainers_event-gateway"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/event-gateway"
      + users       = [
          + "U01EB02BP7A",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["generator"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/generator"
      + handle      = "maintainers_generator"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/generator"
      + users       = [
          + "U01EB02BP7A",
          + "U03D18YKX2M",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["generator-filters"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/generator-filters"
      + handle      = "maintainers_generator-filters"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/generator-filters"
      + users       = [
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["generator-hooks"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/generator-hooks"
      + handle      = "maintainers_generator-hooks"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/generator-hooks"
      + users       = [
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["generator-react-sdk"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/generator-react-sdk"
      + handle      = "maintainers_generator-react-sdk"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/generator-react-sdk"
      + users       = [
          + "U01EB02BP7A",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["github-action-for-cli"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/github-action-for-cli"
      + handle      = "maintainers_github-action-for-cli"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/github-action-for-cli"
      + users       = [
          + "U0572R8J927",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["github-action-for-generator"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/github-action-for-generator"
      + handle      = "maintainers_github-action-for-generator"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/github-action-for-generator"
      + users       = [
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["glee"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/glee"
      + handle      = "maintainers_glee"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/glee"
      + users       = [
          + "U01RVRD1TCL",
          + "U01SGCZMJKW",
          + "U34F2JRRS",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["go-watermill-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/go-watermill-template"
      + handle      = "maintainers_go-watermill-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/go-watermill-template"
      + users       = [
          + "U0231F9KXNK",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["html-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/html-template"
      + handle      = "maintainers_html-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/html-template"
      + users       = [
          + "U01EB02BP7A",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["jasyncapi"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/jasyncapi"
      + handle      = "maintainers_jasyncapi"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/jasyncapi"
      + users       = [
          + "U0132LQU8C9",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["jasyncapi-idea-plugin"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/jasyncapi-idea-plugin"
      + handle      = "maintainers_jasyncapi-idea-plugin"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/jasyncapi-idea-plugin"
      + users       = [
          + "U054UUYBNLF",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["java-spring-cloud-stream-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/java-spring-cloud-stream-template"
      + handle      = "maintainers_java-spring-cloud-stream-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/java-spring-cloud-stream-template"
      + users       = [
          + "U01DVKKAV5K",
          + "UH3B166TD",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["java-spring-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/java-spring-template"
      + handle      = "maintainers_java-spring-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/java-spring-template"
      + users       = [
          + "U011D1DAU6S",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["java-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/java-template"
      + handle      = "maintainers_java-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/java-template"
      + users       = [
          + "U01EYAFR5BR",
          + "U02FP8WBFQE",
          + "U02FPPCEH6H",
          + "U02FT2TKM37",
          + "U02G8MDDEF3",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["markdown-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/markdown-template"
      + handle      = "maintainers_markdown-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/markdown-template"
      + users       = [
          + "U01EB02BP7A",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["modelina"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/modelina"
      + handle      = "maintainers_modelina"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/modelina"
      + users       = [
          + "U01EB02BP7A",
          + "U02T2MY9W5T",
          + "U02UK9RUPGQ",
          + "U037S2HK4TS",
          + "U062LA14E58",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["nodejs-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/nodejs-template"
      + handle      = "maintainers_nodejs-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/nodejs-template"
      + users       = [
          + "U34F2JRRS",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["nodejs-ws-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/nodejs-ws-template"
      + handle      = "maintainers_nodejs-ws-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/nodejs-ws-template"
      + users       = [
          + "U34F2JRRS",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["openapi-schema-parser"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/openapi-schema-parser"
      + handle      = "maintainers_openapi-schema-parser"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/openapi-schema-parser"
      + users       = [
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["optimizer"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/optimizer"
      + handle      = "maintainers_optimizer"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/optimizer"
      + users       = [
          + "U01G3U01SVC",
          + "U01RVRD1TCL",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["parser-api"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/parser-api"
      + handle      = "maintainers_parser-api"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/parser-api"
      + users       = [
          + "UN22ZTLHG",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["parser-go"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/parser-go"
      + handle      = "maintainers_parser-go"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/parser-go"
      + users       = [
          + "U01EB02BP7A",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["parser-js"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/parser-js"
      + handle      = "maintainers_parser-js"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/parser-js"
      + users       = [
          + "U01EB02BP7A",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UN22ZTLHG",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["playground"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/playground"
      + handle      = "maintainers_playground"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/playground"
      + users       = [
          + "U01EB02BP7A",
          + "U34F2JRRS",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["problem"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/problem"
      + handle      = "maintainers_problem"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/problem"
      + users       = [
          + "U01S8EQ9LQ2",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["protobuf-schema-parser"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/protobuf-schema-parser"
      + handle      = "maintainers_protobuf-schema-parser"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/protobuf-schema-parser"
      + users       = [
          + "U03AC4G51H8",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["python-paho-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/python-paho-template"
      + handle      = "maintainers_python-paho-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/python-paho-template"
      + users       = [
          + "U01DVKKAV5K",
          + "UH3B166TD",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["raml-dt-schema-parser"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/raml-dt-schema-parser"
      + handle      = "maintainers_raml-dt-schema-parser"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/raml-dt-schema-parser"
      + users       = [
          + "U34F2JRRS",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["server-api"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/server-api"
      + handle      = "maintainers_server-api"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/server-api"
      + users       = [
          + "U01EB02BP7A",
          + "U02EC8BT0TX",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["simulator"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/simulator"
      + handle      = "maintainers_simulator"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/simulator"
      + users       = [
          + "U01SE93Q48N",
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["spec"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/spec"
      + handle      = "maintainers_spec"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/spec"
      + users       = [
          + "U03NV5L4S49",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["spec-json-schemas"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/spec-json-schemas"
      + handle      = "maintainers_spec-json-schemas"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/spec-json-schemas"
      + users       = [
          + "U03NV5L4S49",
          + "U34F2JRRS",
          + "UD698Q5LM",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["studio"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/studio"
      + handle      = "maintainers_studio"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/studio"
      + users       = [
          + "U01N6AW5V5G",
          + "U02JVEQ6S9W",
          + "U04STTQHV18",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["template-for-generator-templates"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/template-for-generator-templates"
      + handle      = "maintainers_template-for-generator-templates"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/template-for-generator-templates"
      + users       = [
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["template-for-go-projects"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/template-for-go-projects"
      + handle      = "maintainers_template-for-go-projects"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/template-for-go-projects"
      + users       = [
          + "U01EB02BP7A",
          + "UN22ZTLHG",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["training"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/training"
      + handle      = "maintainers_training"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/training"
      + users       = [
          + "U02AKC14WAJ",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["ts-nats-template"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/ts-nats-template"
      + handle      = "maintainers_ts-nats-template"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/ts-nats-template"
      + users       = [
          + "UQ2ANBG1E",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["vs-asyncapi-preview"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/vs-asyncapi-preview"
      + handle      = "maintainers_vs-asyncapi-preview"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/vs-asyncapi-preview"
      + users       = [
          + "UTCN3ET4M",
        ]
    }

  # module.groups.slack_usergroup.maintainer_repos["website"] will be created
  + resource "slack_usergroup" "maintainer_repos" {
      + description = "Maintainers for https://github.com/asyncapi/website"
      + handle      = "maintainers_website"
      + id          = (known after apply)
      + name        = "Maintainers of asyncapi/website"
      + users       = [
          + "U01EB02BP7A",
          + "U02AKC14WAJ",
          + "U02JVEQ6S9W",
          + "U02TAMG2VKN",
          + "U03CNHGEUR1",
          + "U03CNJPMT7C",
          + "U04630DU3N3",
          + "U34F2JRRS",
          + "UD698Q5LM",
        ]
    }

  # module.groups.slack_usergroup.wg_groups["Developer Experience"] will be updated in-place
  ~ resource "slack_usergroup" "wg_groups" {
      ~ description = "The Developer Experience Working Group" -> "The goal of this group is to empower AsyncAPI user journey trough intuitive onboarding, tools, and a frictionless experience."
        id          = "S06T4ULNQL8"
      ~ name        = "Developer Experience Working Group" -> "Developer Experience"
        # (3 unchanged attributes hidden)
    }

  # module.groups.slack_usergroup.wg_groups["Essential Building Blocks"] will be created
  + resource "slack_usergroup" "wg_groups" {
      + channels    = [
          + "C06SSB65QQJ",
        ]
      + description = "Essential Building Blocks Working Group"
      + handle      = "essential-building-blocks-wg"
      + id          = (known after apply)
      + name        = "Essential Building Blocks"
      + users       = [
          + "U0132LQU8C9",
          + "U01SGCZMJKW",
          + "U04C58GB8TF",
          + "U06L7EQQSF2",
          + "UNH2HT346",
          + "UQ2ANBG1E",
        ]
    }

Plan: 58 to add, 37 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

smoya avatar May 03 '24 11:05 smoya

@smoya the groups need to be imported 🧐

Shurtu-gal avatar May 03 '24 15:05 Shurtu-gal

@smoya the groups need to be imported 🧐

Done. Tfstate file updated, and the output of the terraform plan is now updated in my comment

smoya avatar May 06 '24 10:05 smoya

/ptal

smoya avatar May 06 '24 10:05 smoya

/help

smoya avatar May 06 '24 11:05 smoya

Hello, @smoya! πŸ‘‹πŸΌ

    I'm 🧞🧞🧞 Genie 🧞🧞🧞 from the magic lamp. Looks like somebody needs a hand!

    At the moment the following comments are supported in pull requests:

    - `/please-take-a-look` or `/ptal` - This comment will add a comment to the PR asking for attention from the reviewrs who have not reviewed the PR yet.
    - `/ready-to-merge` or `/rtm` - This comment will trigger automerge of PR in case all required checks are green, approvals in place and do-not-merge label is not added
    - `/do-not-merge` or `/dnm` - This comment will block automerging even if all conditions are met and ready-to-merge label is added
    - `/autoupdate` or `/au` - This comment will add `autoupdate` label to the PR and keeps your PR up-to-date to the target branch's future changes. Unless there is a merge conflict or it is a draft PR. (Currently only works for upstream branches.)
    - `/update` or `/u` - This comment will update the PR with the latest changes from the target branch. Unless there is a merge conflict or it is a draft PR. NOTE: this only updates the PR once, so if you need to update again, you need to call the command again.

asyncapi-bot avatar May 06 '24 11:05 asyncapi-bot

/ptal

EDIT: Google Chrome_nMt3mylW

smoya avatar May 06 '24 11:05 smoya

/ptal

smoya avatar May 06 '24 11:05 smoya

@derberg @alequetzalli @thulieblack Please take a look at this PR. Thanks! :wave:

asyncapi-bot avatar May 06 '24 11:05 asyncapi-bot

would be good to document basics

in document about working groups, about automation for groups creation, and how people can use these groups to contact folks

also what is the idea behind maintainer_repos? will there be one group for all maintainers or just per repo? and also should be documented how that works

I will add the relevant documentation. There will be individual groups for maintainers of each of our repos. So anybody can be pinged easily in slack.

Shurtu-gal avatar May 06 '24 15:05 Shurtu-gal

/update

Shurtu-gal avatar May 06 '24 15:05 Shurtu-gal

@derberg I have added the necessary docs.

Shurtu-gal avatar May 07 '24 01:05 Shurtu-gal

@derberg I have changed the docs please let me know if anything else needs to be added somewhere.

I also took the privilege of adding the following, should it be changed ?

image

Shurtu-gal avatar May 07 '24 13:05 Shurtu-gal

@thulieblack your final review is needed here, just in case you miss some channel/group, or you see something doesn't look ok. πŸ™

smoya avatar May 07 '24 20:05 smoya