Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

provider/aws: Manage Triggers for AWS CodeDeploy Event Notifications #5599

Merged

Conversation

niclic
Copy link
Contributor

@niclic niclic commented Mar 12, 2016

Manage Triggers for AWS CodeDeploy Event Notifications

All resource_aws_codedeploy_deployment_group.go resource tests PASS.

(During development, I sometimes got test failures, presumably because of eventual consistency errors.)

Relevant AWS links:

NOTES/THOUGHTS/QUESTIONS (feedback welcome):

  • I considered putting the validateTriggerEvent validator function in validators.go. However, it seems very specific to CodeDeploy so I kept it with the resource. If it were to go in validators.go, it would have to be renamed to something like validateAwsCodeDeployTriggerEvent.
  • The validateTriggerEvent function is a bit clumsy and could probably be written to be more idiomatic in go.
  • I suppose trigger_configurations could be developed as a separate resource, although this could also be said of the other resources attached to the Deployment Group. This implementation is consistent.
  • Prefixing the trigger_configuration fields with trigger seems a tiny bit redundant, but it adheres to the structure defined in the aws-sdk-go api, which I think is important. I briefly debated a more terse schema, like this:
  trigger_configuration {
    name = "foo-trigger"
    events = ["DeploymentFailure"]
    target_arn = "${aws_sns_topic.foo_topic.arn}"
  }

POSSIBLE ENHANCEMENTS

  • The ALL option is not yet supported for Deployment or Instance events. This appears to be a console convenience, so it is debatable whether it should be implemented as part of this PR.
  • Add acceptance tests to verify the actual structure of created trigger configurations as well as known error cases (rather than just create/update of the primary resources).
  • Consider adding unit tests for buildTriggerConfigs and triggerConfigsToMap functions.

  - Create a Trigger to Send Notifications for AWS CodeDeploy Events
  - Update aws_codedeploy_deployment_group docs
@niclic
Copy link
Contributor Author

niclic commented Mar 16, 2016

Some additional comments:

  • For a Deployment Group, each trigger must have a unique name (e.g. my-trigger). Attempting to use a duplicate name will produce a Duplicate Trigger target name detected error.
  • A SNS topic can only be associated with one trigger. Attempting to use the same SNS topic in two triggers will produce a Duplicate Trigger target arn detected error.

For the trigger_configuration (sub)resource, the SchemaSetFunc function uses both the trigger_name and the trigger_target_arn to calculate a hash (see the resourceAwsCodeDeployTriggerConfigHash function). With the above in mind this may be either unnecessary or unhelpful. The trigger_name by itself may be sufficient.

Using just the trigger_name would have the added benefit of making it easier to use the builtin TestCheckResourceAttr test helpers because the hash will not include the SNS topic ARN, so it is easy to determine the calculated IDs.


func validateTriggerEvent(v interface{}, k string) (ws []string, errors []error) {
value := v.(string)
if value != "DeploymentStart" && value != "DeploymentSuccess" && value != "DeploymentFailure" && value != "DeploymentStop" && value != "InstanceStart" && value != "InstanceSuccess" && value != "InstanceFailure" {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels pretty hacky - this conditional will need to continue to be expanded if newer values are added. A potential pattern to use here may be something like this:

https://github.com/hashicorp/terraform/blob/master/builtin/providers/aws/validators.go#L81

This would mean the associated tests would then be able to be specified as follows:

https://github.com/hashicorp/terraform/blob/master/builtin/providers/aws/resource_aws_dynamodb_table_test.go#L58

rather than having 2 ranges within the test func

@stack72
Copy link
Contributor

stack72 commented Apr 2, 2016

Hi @niclic

Thanks so much for the work on this PR - sorry it has taken a while to get back to you. I just had a look at this and ran the tests. I got the following on the test run:

TF_LOG=1 make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSCodeDeployDeploymentGroup' 2>~/tf.log
==> Checking that code complies with gofmt requirements...
/Users/stacko/Code/go/bin/stringer
go generate $(go list ./... | grep -v /vendor/)
TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSCodeDeployDeploymentGroup -timeout 120m
=== RUN   TestAccAWSCodeDeployDeploymentGroup_basic
--- PASS: TestAccAWSCodeDeployDeploymentGroup_basic (18.36s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration
--- PASS: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration (16.28s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple
--- FAIL: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple (8.52s)
    testing.go:154: Step 0 error: Error applying: 1 error(s) occurred:

        * aws_codedeploy_deployment_group.foo_group: InvalidTriggerConfigException: Topic ARN arn:aws:sns:us-west-2:881237884953:foo is not valid
            status code: 400, request id: 239e1ba1-f87e-11e5-a76f-1938298cf3fa
FAIL
exit status 1
FAIL    github.com/hashicorp/terraform/builtin/providers/aws    43.173s

I have left another few comments inline

Thanks

Paul

@stack72 stack72 added the waiting-response An issue/pull request is waiting for a response from the community label Apr 2, 2016
@thegranddesign
Copy link

@niclic can't wait to see this get merged in. Thank you for the work on this. 😀

@niclic
Copy link
Contributor Author

niclic commented Apr 4, 2016

Thanks for the comments @stack72 and @thegranddesign.

I have a few new commits to push, as well as comments on issues I have encountered since revisiting this PR. There are some issues that need to be resolved.

@stack72 stack72 self-assigned this Apr 5, 2016
  - also rename TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration test
@niclic
Copy link
Contributor Author

niclic commented Apr 5, 2016

I refactored the validateTriggerEvent function and test as you suggested. @stack72

@niclic
Copy link
Contributor Author

niclic commented Apr 5, 2016

@stack72

RE: InvalidTriggerConfigException exception:

* aws_codedeploy_deployment_group.foo_group: InvalidTriggerConfigException: Topic ARN arn:aws:sns:us-west-2:881237884953:foo is not valid
            status code: 400, request id: 239e1ba1-f87e-11e5-a76f-1938298cf3fa

Frustratingly, this error doesn't always happen. The following information leads me to suspect this is some sort of eventual consistency issue.

  • I get no error when I use a pre-existing SNS Topic for the value of trigger_target_arn.
  • If I modify the retry logic in the resourceAwsCodeDeployDeploymentGroupCreate function to handle this type of error, you can see in the DEBUG log that the correct state is eventually reached after a number of retries.

For example:

err = resource.Retry(2*time.Minute, func() *resource.RetryError {
resp, err = conn.CreateDeploymentGroup(&input)
if err != nil {
  codedeployErr, ok := err.(awserr.Error)
  if !ok {
    return resource.NonRetryableError(err)
  }
  if codedeployErr.Code() == "InvalidRoleException" || codedeployErr.Code() == "InvalidTriggerConfigException" {
    log.Printf("[DEBUG] Trying to create deployment group again: %q",
      codedeployErr.Message())
    return resource.RetryableError(err)
  }

  return resource.NonRetryableError(err)
}
return nil
})

Here is some DEBUG log that show the retries.

TEST: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic

2016/04/03 17:59:40 [DEBUG] apply: aws_iam_role.foo_role: executing Apply

2016/04/03 17:59:40 [DEBUG] apply: aws_sns_topic.foo_topic: executing Apply
2016/04/03 17:59:40 [DEBUG] SNS create topic: foo

2016/04/03 17:59:40 [DEBUG] apply: aws_codedeploy_app.foo_app: executing Apply
2016/04/03 17:59:40 [DEBUG] Creating CodeDeploy application foo
2016/04/03 17:59:41 [DEBUG] CodeDeploy application 41dec668-cf0e-40d0-ae13-4d412a63f88a created
2016/04/03 17:59:41 [DEBUG] Reading CodeDeploy application foo
...
2016/04/03 17:59:43 [DEBUG] apply: aws_iam_role_policy.foo_policy: executing Apply

2016/04/03 17:59:43 [DEBUG] apply: aws_codedeploy_deployment_group.foo_group: executing Apply
2016/04/03 17:59:43 [DEBUG] Waiting for state to become: [success]
2016/04/03 17:59:44 [DEBUG] Trying to create deployment group again: "Cannot assume role provided."
2016/04/03 17:59:45 [DEBUG] Trying to create deployment group again: "Cannot assume role provided."
2016/04/03 17:59:46 [DEBUG] Trying to create deployment group again: "Cannot assume role provided."
2016/04/03 17:59:47 [DEBUG] Trying to create deployment group again: "Topic ARN arn:aws:sns:us-west-2:[ACCOUNT_ID]:foo is not valid"
2016/04/03 17:59:50 [DEBUG] Reading CodeDeploy DeploymentGroup 794b992b-2438-4436-beb1-5f52bf3cb1b8

Here is another example:

TEST:TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple

2016/04/03 17:20:28 [DEBUG] apply: aws_iam_role.foo_role: executing Apply

2016/04/03 17:20:28 [DEBUG] apply: aws_sns_topic.bar_topic: executing Apply
2016/04/03 17:20:28 [DEBUG] SNS create topic: bar

2016/04/03 17:20:28 [DEBUG] apply: aws_codedeploy_app.foo_app: executing Apply
2016/04/03 17:20:28 [DEBUG] Creating CodeDeploy application foo
2016/04/03 17:20:28 [DEBUG] CodeDeploy application c5b91f00-fc44-40b3-8bbb-652a3a053a87 created
2016/04/03 17:20:28 [DEBUG] Reading CodeDeploy application foo

2016/04/03 17:20:28 [DEBUG] apply: aws_sns_topic.foo_topic: executing Apply
2016/04/03 17:20:28 [DEBUG] SNS create topic: foo
...
2016/04/03 17:20:28 [DEBUG] apply: aws_iam_role_policy.foo_policy: executing Apply

2016/04/03 17:20:29 [DEBUG] apply: aws_codedeploy_deployment_group.foo_group: executing Apply
2016/04/03 17:20:29 [DEBUG] Waiting for state to become: [success]
2016/04/03 17:20:30 [DEBUG] Trying to create deployment group again: "Topic ARN arn:aws:sns:us-west-2:[ACCOUNT_ID]:bar is not valid"
2016/04/03 17:20:31 [DEBUG] Trying to create deployment group again: "Cannot assume role provided."
2016/04/03 17:20:32 [DEBUG] Trying to create deployment group again: "Topic ARN arn:aws:sns:us-west-2:[ACCOUNT_ID]:bar is not valid"
2016/04/03 17:20:33 [DEBUG] vertex provider.aws (close), waiting for: aws_codedeploy_deployment_group.foo_group
2016/04/03 17:20:34 [DEBUG] Trying to create deployment group again: "Topic ARN arn:aws:sns:us-west-2:[ACCOUNT_ID]:bar is not valid"
2016/04/03 17:20:36 [DEBUG] Reading CodeDeploy DeploymentGroup 224afda6-1a94-43c3-ab96-0efdc2e3af98

Note: I've removed the updates to the SNS topics and redacted my AWS ACCOUNT ID.

I'm not sure of the best way to handle this issue. The retry logic seems to work as expected. However, there are legitimate InvalidTriggerConfigException errors that should fail fast, so the actual error message would have to be parsed. I may be wrong about this being a case of eventual consistency; it could be a bug somewhere in my code.

@niclic
Copy link
Contributor Author

niclic commented Apr 5, 2016

Another issue...

Reviewing DEBUG logs for test output, I notice updates are not applied to the trigger_configuration.trigger_events set in some cases.

I don't believe every set attribute must be included in the hash function, but I may be wrong. For example, compare resourceAwsSecurityGroupRuleHash and resourceAwsDynamoDbTable. But if I do include trigger_events as part of the trigger_configuration hash then updates to trigger_events are propagated, but only by creating NEW resources, not updating existing ones.

For example:

func resourceAwsCodeDeployTriggerConfigHash(v interface{}) int {
  var buf bytes.Buffer
  m := v.(map[string]interface{})
  buf.WriteString(fmt.Sprintf("%s-", m["trigger_name"].(string)))
  buf.WriteString(fmt.Sprintf("%s-", m["trigger_target_arn"].(string)))

  if triggerEvents, ok := m["trigger_events"]; ok {
    names := triggerEvents.(*schema.Set).List()
    strings := make([]string, len(names))
    for i, raw := range names {
      strings[i] = raw.(string)
    }
    sort.Strings(strings)

    for _, s := range strings {
      buf.WriteString(fmt.Sprintf("%s-", s))
    }
  }
  return hashcode.String(buf.String())
}

Otherwise, changes to trigger_configuration.trigger_events are only applied when the trigger_configuration is recreated due to a change to either trigger_name or trigger_target_arn.

I'd like to improve these tests to assert on the actual changes to resource attributes. I mentioned above that the existing "does the Deployment Group exist?" check does not test all possible attribute changes across CRUD operations and this is an example where better tests are needed.

There are several ways to write these tests, but this is one reason I suggested removing the trigger_target_arn attribute from the resourceAwsCodeDeployTriggerConfigHash function (to make use of the built in attribute assertion helpers). However, when I remove trigger_target_arn from the resourceAwsCodeDeployTriggerConfigHash function, the update tests that change the trigger_configuration.trigger_target_arn fail with this nasty error:

--- FAIL: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple (21.38s)
  testing.go:148: Step 1 error: Error applying: 1 error(s) occurred:

    * aws_codedeploy_deployment_group.foo_group: diffs didn't match during apply. This is a bug with Terraform and should be reported as a GitHub Issue.

    Please include the following information in your report:

        Terraform Version: 0.6.13
        Resource ID: aws_codedeploy_deployment_group.foo_group
        Mismatch reason: attribute mismatch: trigger_configuration.1222338438.trigger_events.#
        Diff One (usually from plan): *terraform.InstanceDiff{Attributes:map[string]*terraform.ResourceAttrDiff{"trigger_configuration.3422256551.trigger_name":*terraform.ResourceAttrDiff{Old:"foo-trigger", New:"foo-trigger", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.~1222338438.trigger_events.#":*terraform.ResourceAttrDiff{Old:"0", New:"1", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.1222338438.trigger_events.3702887483":*terraform.ResourceAttrDiff{Old:"InstanceFailure", New:"", NewComputed:false, NewRemoved:true, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.1222338438.trigger_name":*terraform.ResourceAttrDiff{Old:"bar-trigger", New:"", NewComputed:false, NewRemoved:true, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_events.217472897":*terraform.ResourceAttrDiff{Old:"", New:"DeploymentStop", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_target_arn":*terraform.ResourceAttrDiff{Old:"arn:aws:sns:us-west-2:502628581780:foo", New:"arn:aws:sns:us-west-2:502628581780:foo", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.~1222338438.trigger_name":*terraform.ResourceAttrDiff{Old:"", New:"bar-trigger", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.~1222338438.trigger_target_arn":*terraform.ResourceAttrDiff{Old:"", New:"${aws_sns_topic.baz_topic.arn}", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.1222338438.trigger_events.#":*terraform.ResourceAttrDiff{Old:"1", New:"0", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_events.4157777861":*terraform.ResourceAttrDiff{Old:"DeploymentFailure", New:"DeploymentFailure", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.~1222338438.trigger_events.3702887483":*terraform.ResourceAttrDiff{Old:"", New:"InstanceFailure", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_events.#":*terraform.ResourceAttrDiff{Old:"1", New:"4", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_events.3108600758":*terraform.ResourceAttrDiff{Old:"", New:"DeploymentSuccess", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.3422256551.trigger_events.661737673":*terraform.ResourceAttrDiff{Old:"", New:"DeploymentStart", NewComputed:false, NewRemoved:false, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}, "trigger_configuration.1222338438.trigger_target_arn":*terraform.ResourceAttrDiff{Old:"arn:aws:sns:us-west-2:502628581780:bar", New:"", NewComputed:false, NewRemoved:true, NewExtra:interface {}(nil), RequiresNew:false, Type:0x0}}, Destroy:false, DestroyTainted:false}
        Diff Two (usually from apply): *terraform.InstanceDiff{Attributes:map[string]*terraform.ResourceAttrDiff(nil), Destroy:false, DestroyTainted:false}

    Also include as much context as you can about your config, state, and the steps you performed to trigger this error.

FAIL
exit status 1
FAIL  github.com/hashicorp/terraform/builtin/providers/aws  21.395s
make: *** [testacc] Error 1

So something is not right with the code as it stands. To reproduce this error, comment out the line in resourceAwsCodeDeployTriggerConfigHash and watch the testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_updateMultiple test fail (because this test changes the trigger_target_arn attribute).

func resourceAwsCodeDeployTriggerConfigHash(v interface{}) int {
  var buf bytes.Buffer
  m := v.(map[string]interface{})
  buf.WriteString(fmt.Sprintf("%s-", m["trigger_name"].(string)))
  // buf.WriteString(fmt.Sprintf("%s-", m["trigger_target_arn"].(string))) // comment this line out to cause errors
  return hashcode.String(buf.String())
}

  - by using built in resource attribute helpers
  - these can get quite verbose and repetitive, so passing the resource to a function might be better
  - can't use these (yet) to assert trigger configuration state
…source schema

  - buildTriggerConfigs
  - triggerConfigsToMap
@stack72
Copy link
Contributor

stack72 commented Apr 11, 2016

HI @niclic

thanks so much for the work on this - the latest changes make it work consistently now :)

TF_LOG=1 make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSCodeDeployDeploymentGroup' 2>~/tf.log
==> Checking that code complies with gofmt requirements...
go generate $(go list ./... | grep -v /vendor/)
TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSCodeDeployDeploymentGroup -timeout 120m
=== RUN   TestAccAWSCodeDeployDeploymentGroup_basic
--- PASS: TestAccAWSCodeDeployDeploymentGroup_basic (32.51s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic
--- PASS: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic (28.83s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple
--- PASS: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple (32.50s)
PASS
ok      github.com/hashicorp/terraform/builtin/providers/aws    93.853s

This looks good :)

@stack72 stack72 removed the waiting-response An issue/pull request is waiting for a response from the community label Apr 11, 2016
@stack72 stack72 merged commit 0cd0a4e into hashicorp:master Apr 11, 2016
@stack72
Copy link
Contributor

stack72 commented Apr 11, 2016

Just a FYI, to prove no eventual consistency problems, I reran the tests:

TF_LOG=1 make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSCodeDeployDeploymentGroup' 2>~/tf.log
==> Checking that code complies with gofmt requirements...
/Users/stacko/Code/go/bin/stringer
go generate $(go list ./... | grep -v /vendor/)
TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSCodeDeployDeploymentGroup -timeout 120m
=== RUN   TestAccAWSCodeDeployDeploymentGroup_basic
--- PASS: TestAccAWSCodeDeployDeploymentGroup_basic (30.05s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic
--- PASS: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic (26.55s)
=== RUN   TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple
--- PASS: TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple (35.31s)
PASS
ok      github.com/hashicorp/terraform/builtin/providers/aws    91.932s

@niclic
Copy link
Contributor Author

niclic commented Apr 11, 2016

Didn't expect this to get merged so quickly!

Thanks @stack72

I believe there are still issues to be resolved.

  • Without handling eventual consistency errors explicitly, they could pop up again.
  • The hashing of trigger_configurations remains a problem: trigger_events are unlikely to be updated in some scenarios and removing trigger_target_arn causes errors.

I only illustrated possible code fixes in my comments above, but I didn't commit changes for these issues.

It's always possible that commits to master will/did resolve the first issue.

The second one bothers me because the TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic test doesn't actually assert the changes to the trigger_configuration.trigger_events.

Next steps?

I will continue to poke around and propose a patch in a new PR. But it could help to have someone else take a look or help me understand the cause of these issues.

@stack72
Copy link
Contributor

stack72 commented Apr 11, 2016

@niclic

I will continue to monitor master for failures in this area - please do continue to look around the code and see what can be changed. I will stay in touch on this

Thanks again

Paul

chrislovecnm pushed a commit to chrislovecnm/terraform that referenced this pull request Apr 16, 2016
…ashicorp#5599)

* provider/aws: CodeDeploy Deployment Group Triggers

  - Create a Trigger to Send Notifications for AWS CodeDeploy Events
  - Update aws_codedeploy_deployment_group docs

* Refactor validateTriggerEvent function and test

  - also rename TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration test

* Enhance existing Deployment Group integration tests

  - by using built in resource attribute helpers
  - these can get quite verbose and repetitive, so passing the resource to a function might be better
  - can't use these (yet) to assert trigger configuration state

* Unit tests for conversions between aws TriggerConfig and terraform resource schema

  - buildTriggerConfigs
  - triggerConfigsToMap
@niclic niclic deleted the aws_codedeploy_deployment_group_triggers branch May 9, 2016 18:47
@ghost
Copy link

ghost commented Apr 26, 2020

I'm going to lock this issue because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues.

If you have found a problem that seems similar to this, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.

@ghost ghost locked and limited conversation to collaborators Apr 26, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants