Skip to content

Commit

Permalink
migrate: Ensure idempotency when ran multiple times
Browse files Browse the repository at this point in the history
Reference: #362

To reproduce, copied an existing test case and ensured the test script included multiple `exec tfplugindocs migrate` invocations. This generated a test failure matching the bug report:

```
--- FAIL: Test_SchemaJson_MigrateAcceptanceTests (0.00s)
    --- FAIL: Test_SchemaJson_MigrateAcceptanceTests/time_provider_multiple_runs (0.32s)
        testscript.go:558: # Copyright (c) HashiCorp, Inc.
            # SPDX-License-Identifier: MPL-2.0
            # Multiple runs of tfplugindocs -migrate to verify idempotency (0.000s)
            # Run migrate command (0.301s)
            # Check template files (0.000s)
            > cmpenv templates/index.md.tmpl exp-templates/index.md.tmpl
            diff templates/index.md.tmpl exp-templates/index.md.tmpl
            --- templates/index.md.tmpl
            +++ exp-templates/index.md.tmpl
            @@ -31,36 +31,3 @@
             `triggers` are *not* treated as sensitive attributes; a value used for `triggers` will be displayed in Terraform UI output as plaintext.

             To force a these actions to reoccur without updating `triggers`, the [`terraform taint` command](https://www.terraform.io/docs/commands/taint.html) can be used to produce the action on the next run.
            ----
            -page_title: "Provider: Time"
            -description: |-
            -  The time provider is used to interact with time-based resources.
            ----
            -
            -{{/* This template serves as a starting point for documentation generation, and can be customized with hardcoded values and/or doc gen templates.
            -
            -For example, the {{ .SchemaMarkdown }} template can be used to replace manual schema documentation if descriptions of schema attributes are added in the provider source code. */ -}}
            -
            -# Time Provider
            -
            -The time provider is used to interact with time-based resources. The provider itself has no configuration options.
            -
            -Use the navigation to the left to read about the available resources.
            -
            -## Resource "Triggers"
            -
            -Certain time resources, only perform actions during specific lifecycle actions:
            -
            -- `time_offset`: Saves base timestamp into Terraform state only when created.
            -- `time_sleep`: Sleeps when created and/or destroyed.
            -- `time_static`: Saves base timestamp into Terraform state only when created.
            -
            -These resources provide an optional map argument called `triggers` that can be populated with arbitrary key/value pairs. When the keys or values of this argument are updated, Terraform will re-perform the desired action, such as updating the base timestamp or sleeping again.
            -
            -For example:
            -
            -{{tffile "examples/example_1.tf"}}
            -
            -`triggers` are *not* treated as sensitive attributes; a value used for `triggers` will be displayed in Terraform UI output as plaintext.
            -
            -To force a these actions to reoccur without updating `triggers`, the [`terraform taint` command](https://www.terraform.io/docs/commands/taint.html) can be used to produce the action on the next run.

            FAIL: testdata/scripts/schema-json/migrate/time_provider_multiple_runs.txtar:13: templates/index.md.tmpl and exp-templates/index.md.tmpl differ
```

To fix this, changed the internal logic from opening the template file multiple times with `os.O_APPEND` to opening the template file once with only `os.O_WRONLY|os.O_CREATE` and passing the file handle around instead.
  • Loading branch information
bflad committed Apr 26, 2024
1 parent 0d49b43 commit 8f54290
Show file tree
Hide file tree
Showing 2 changed files with 995 additions and 38 deletions.

0 comments on commit 8f54290

Please sign in to comment.