diff --git a/.gitattributes b/.gitattributes index fb307819..10f02e0a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14,10 +14,10 @@ # resources is thousands of lines of emitted Go that nobody should read line by # line -- the reviewable change is the blueprint, so point reviewers there. blueprints/** linguist-generated=true -probe-evidence/** linguist-generated=true -openapi-specs/** linguist-generated=true -interop-specs/** linguist-generated=true +recordings/** linguist-generated=true +openapi/** linguist-generated=true +specs/** linguist-generated=true pilot/*/internal/services/** linguist-generated=true # Pinned specifications are upstream documents, not ours to review line by line. -openapi-specs/**/api.yaml linguist-generated=true +openapi/**/api.yaml linguist-generated=true diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 88369eb5..0fd1ab41 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -20,6 +20,6 @@ cmd/** @ShocOne # blueprint or a template -- a diff here on its own usually means something was # hand-edited. blueprints/** @ShocOne -probe-evidence/** @ShocOne -openapi-specs/** @ShocOne +recordings/** @ShocOne +openapi/** @ShocOne pilot/** @ShocOne diff --git a/.github/linters/.checkov.yaml b/.github/linters/.checkov.yaml index d197d72e..1178bb06 100644 --- a/.github/linters/.checkov.yaml +++ b/.github/linters/.checkov.yaml @@ -12,4 +12,4 @@ skip-path: # See the note in trivy.yaml. The pinned ThousandEyes document's # client-certificate example is a sample PEM, not a credential, and the document is # committed verbatim so it cannot be edited to satisfy a scanner. - - openapi-specs + - openapi diff --git a/.github/linters/.gitleaks.toml b/.github/linters/.gitleaks.toml index 9042f72d..b0f792f2 100644 --- a/.github/linters/.gitleaks.toml +++ b/.github/linters/.gitleaks.toml @@ -24,4 +24,4 @@ Scoped to this path only. Every other file in the repository is still scanned, including the probe cassettes that a later phase will commit -- those carry real recorded HTTP traffic and must keep being checked. """ -paths = ['''^openapi-specs/'''] +paths = ['''^openapi/'''] diff --git a/.github/linters/.tflint.hcl b/.github/linters/.tflint.hcl index de3a0e0b..8ab22bb9 100644 --- a/.github/linters/.tflint.hcl +++ b/.github/linters/.tflint.hcl @@ -4,7 +4,7 @@ # are no reusable modules, and that distinction is what the one disabled rule below # turns on. Trivy and tflint both walk the tree rather than reading super-linter's # changed-file list, so FILTER_REGEX_EXCLUDE's `^pilot/.*` does not reach them -- -# the same reason openapi-specs is handled by trivy's scan.skip-dirs. +# the same reason openapi is handled by trivy's scan.skip-dirs. config { # Nothing here is called as a module, so there are no variables to infer. diff --git a/.github/linters/.trivyignore.yaml b/.github/linters/.trivyignore.yaml index b489bcbf..87f4856a 100644 --- a/.github/linters/.trivyignore.yaml +++ b/.github/linters/.trivyignore.yaml @@ -4,7 +4,7 @@ # # Referenced explicitly from trivy.yaml. Trivy's filesystem scanner walks the tree # rather than reading super-linter's changed-file list, which is why an exception -# has to live here and not in FILTER_REGEX_EXCLUDE -- the same reason openapi-specs +# has to live here and not in FILTER_REGEX_EXCLUDE -- the same reason openapi # is handled by scan.skip-dirs. vulnerabilities: diff --git a/.github/linters/trivy.yaml b/.github/linters/trivy.yaml index f15706a0..e541295e 100644 --- a/.github/linters/trivy.yaml +++ b/.github/linters/trivy.yaml @@ -32,9 +32,9 @@ scan: # that as a leaked key. It is illustrative text in a vendor's documentation, and # the only way to satisfy the scanner would be to edit a pinned artefact -- which # would defeat the point of pinning it, and is why VALIDATE_OPENAPI is off too. - - openapi-specs + - openapi - # Deliberately NOT skipped: probe-evidence. Those cassettes are our own recorded + # Deliberately NOT skipped: recordings. Those cassettes are our own recorded # HTTP traffic against a live tenant, so a secret appearing there is exactly the # thing worth being told about. The Authorization header is absent by construction # -- it is not on the recorder's allow list -- but that is a property to keep diff --git a/.github/workflows/acceptance.yml b/.github/workflows/acceptance.yml index 58b094af..f26eac80 100644 --- a/.github/workflows/acceptance.yml +++ b/.github/workflows/acceptance.yml @@ -130,7 +130,7 @@ jobs: # Deliberately no sweep step, and the reason is worth recording rather than leaving as an # apparent omission. # - # `probe -mode sweep` exists, but it sweeps the *prober's* ledger -- the objects it recorded + # `probe sweep` exists, but it sweeps the *prober's* ledger -- the objects it recorded # creating before it issued each request. It knows nothing about objects an acceptance test # created, because those are Terraform's, tracked in its state and destroyed by the test # framework at the end of the run. Invoking it here would clean up nothing and look like it diff --git a/.github/workflows/codegen-verify.yml b/.github/workflows/codegen-verify.yml index f9283b08..4b9ccca9 100644 --- a/.github/workflows/codegen-verify.yml +++ b/.github/workflows/codegen-verify.yml @@ -1,7 +1,7 @@ # Fails when the committed generated code no longer matches the blueprints it was # generated from. # -# Everything under pilot/ is produced by cmd/tfpluginframeworkgen. Nothing stops a change +# Everything under pilot/ is produced by cmd/tfpfgen. Nothing stops a change # to the generator, a template or a blueprint from landing without the output being # regenerated, and stale generated code compiles perfectly well -- so the drift # would be invisible. This regenerates and fails if anything moved. @@ -16,8 +16,8 @@ on: - "blueprints/**" - "cmd/**" - "internal/**" - - "interop-specs/**" - - "probe-evidence/**" + - "specs/**" + - "recordings/**" - "pilot/**" - "go.mod" - "go.sum" @@ -66,12 +66,12 @@ jobs: - name: Regenerate run: | echo "::group::🔁 Regenerating the pilot provider" - go run ./cmd/tfpluginframeworkgen emit \ + go run ./cmd/tfpfgen provider generate \ -blueprint blueprints/thousandeyes \ -out pilot/thousandeyes echo "::endgroup::" - # git diff rather than `tfpluginframeworkgen verify`, deliberately. verify compares + # git diff rather than `tfpfgen provider generate -check`, deliberately. verify compares # the files the blueprints produce against disk, so it cannot see a stale file # the blueprints no longer produce. Diffing the worktree after a real # regeneration catches that too. @@ -82,14 +82,14 @@ jobs: exit 0 fi - echo "::error::Generated code is out of date. Run 'go run ./cmd/tfpluginframeworkgen emit -blueprint blueprints/thousandeyes -out pilot/thousandeyes' and commit the result." + echo "::error::Generated code is out of date. Run 'go run ./cmd/tfpfgen provider generate -blueprint blueprints/thousandeyes -out pilot/thousandeyes' and commit the result." { echo "### ❌ Generated code is out of date" echo "" echo "Run this locally and commit the result:" echo "" echo '```bash' - echo 'go run ./cmd/tfpluginframeworkgen emit -blueprint blueprints/thousandeyes -out pilot/thousandeyes' + echo 'go run ./cmd/tfpfgen provider generate -blueprint blueprints/thousandeyes -out pilot/thousandeyes' echo '```' echo "" echo "
Files that differ" @@ -196,10 +196,13 @@ jobs: - name: Verify bindings against the pinned SDK run: | echo "::group::🔗 Bindings" - go run ./cmd/tfpluginframeworkgen bindings \ + go run ./cmd/tfpfgen bindings check \ + -blueprint blueprints/thousandeyes \ + -module pilot/thousandeyes + go run ./cmd/tfpfgen bindings facts \ -blueprint blueprints/thousandeyes \ -module pilot/thousandeyes \ - -facts-check blueprints/thousandeyes/static.facts.json + -out blueprints/thousandeyes/static.facts.json -check echo "::endgroup::" interop: @@ -231,17 +234,17 @@ jobs: - name: Re-export and diff run: | echo "::group::🔀 Exporting" - go run ./cmd/tfpluginframeworkgen interop export \ + go run ./cmd/tfpfgen spec export \ -blueprint blueprints/thousandeyes \ - -out interop-specs/thousandeyes/provider-code-spec.json + -out specs/thousandeyes/provider-code-spec.json echo "::endgroup::" - if git diff --quiet -- interop-specs/; then + if git diff --quiet -- specs/; then echo "✅ The exported specification matches the blueprints." exit 0 fi - echo "::error::interop-specs/ is out of date. Re-export it and commit the result." + echo "::error::specs/ is out of date. Re-export it and commit the result." { echo "### ❌ The exported specification is out of date" echo "" @@ -249,16 +252,16 @@ jobs: # Double quotes with an escaped backslash, not a single-quoted string ending # in one: the latter reads as an attempt to escape the closing quote. The text # has no expansion in it, so the quoting style makes no other difference. - echo "go run ./cmd/tfpluginframeworkgen interop export \\" + echo "go run ./cmd/tfpfgen spec export \\" echo " -blueprint blueprints/thousandeyes \\" - echo ' -out interop-specs/thousandeyes/provider-code-spec.json' + echo ' -out specs/thousandeyes/provider-code-spec.json' echo '```' } >> "$GITHUB_STEP_SUMMARY" - git diff --stat -- interop-specs/ + git diff --stat -- specs/ exit 1 - # This job is the reason internal/interop exists. + # This job is the reason internal/spec exists. # # Our own tests assert the export satisfies HashiCorp's embedded JSON schema, # which is a structural claim. It is not the same claim as "a tool can render @@ -279,7 +282,7 @@ jobs: echo "::group::🏗️ Generating" tfplugingen-framework generate resources \ - --input interop-specs/thousandeyes/provider-code-spec.json \ + --input specs/thousandeyes/provider-code-spec.json \ --output "$RUNNER_TEMP/gen" echo "::endgroup::" @@ -362,22 +365,21 @@ jobs: - name: Verify facts reproduce with no network run: | echo "::group::🔬 Replaying committed cassettes" - go run ./cmd/tfpluginframeworkgen probe \ - -blueprint blueprints/thousandeyes \ - -mode verify + go run ./cmd/tfpfgen probe verify \ + -blueprint blueprints/thousandeyes echo "::endgroup::" # Committed evidence that nobody has folded in is evidence nobody is acting on. - name: The blueprint reflects the recorded facts run: | - echo "::group::🔀 merge -check" - for facts in probe-evidence/*/*/*/facts.json; do + echo "::group::🔀 blueprint merge -check" + for facts in recordings/*/*/*/facts.json; do echo "checking $facts" - go run ./cmd/tfpluginframeworkgen merge \ + go run ./cmd/tfpfgen blueprint merge \ -blueprint blueprints/thousandeyes \ -facts "$facts" \ -check \ - -accept-conflicts + -allow-conflicts done echo "::endgroup::" diff --git a/.github/workflows/dependancy-review.yml b/.github/workflows/dependency-review.yml similarity index 100% rename from .github/workflows/dependancy-review.yml rename to .github/workflows/dependency-review.yml diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 3f2c8127..886b66c5 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -142,7 +142,7 @@ jobs: # ^pilot/.* generated output. Third-party style opinions about # generated code are noise: the shape is decided by the # templates. - # ^openapi-specs/. vendored third-party API documents, pinned verbatim - # ^probe-evidence/ recorded HTTP cassettes and derived facts, replayed + # ^openapi/. vendored third-party API documents, pinned verbatim + # ^recordings/ recorded HTTP cassettes and derived facts, replayed # byte-for-byte by the probe verification job - FILTER_REGEX_EXCLUDE: '(.*\.md$|.*_test\.go$|.*/test/.*|.*\.json$|^pilot/.*|^openapi-specs/.*|^probe-evidence/.*)' + FILTER_REGEX_EXCLUDE: '(.*\.md$|.*_test\.go$|.*/test/.*|.*\.json$|^pilot/.*|^openapi/.*|^recordings/.*)' diff --git a/.gitignore b/.gitignore index e726774f..572976a6 100644 --- a/.gitignore +++ b/.gitignore @@ -35,18 +35,18 @@ golangci-lint-report.sarif go.work go.work.sum -# tfpluginframeworkgen -/bin/tfpluginframeworkgen -.tfpluginframeworkgen/cache/ +# tfpfgen +/bin/tfpfgen +.tfpfgen/cache/ # A probe ledger records live objects in somebody's tenant. It is per-run rather than # per-snapshot, so committing one would be both meaningless and a disclosure. -.tfpluginframeworkgen/probe/ +.tfpfgen/probe/ # A sandbox profile carries assertions.accountGroupId, and a tenant identifier in a committed # file turns a vulnerability into a targeted one. See docs/examples/probe-profile.example.json # for a version with nothing real in it. -.tfpluginframeworkgen/sandbox/ +.tfpfgen/sandbox/ # Emitted when a template renders unparsable Go, kept for inspection only. *.broken diff --git a/.tfpluginframeworkgen/probe/thousandeyes/account_group/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/account_group/ledger.jsonl new file mode 100644 index 00000000..8216f326 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/account_group/ledger.jsonl @@ -0,0 +1,18 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1","id":"281474976748142","status":201} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":2,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976748143","status":201} +{"kind":"intent","seq":3,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":3,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976748144","status":201} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1","id":"281474976748142","status":204} +{"kind":"deleted","seq":2,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976748143","status":204} +{"kind":"deleted","seq":3,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976748144","status":204} +{"kind":"intent","seq":4,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":4,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1","id":"281474976748146","status":201} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":5,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976748147","status":201} +{"kind":"deleted","seq":5,"probe":"write.writable-returned","path":"/account-groups","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976748147","status":204} +{"kind":"intent","seq":6,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":6,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976748148","status":201} +{"kind":"deleted","seq":6,"probe":"write.rehearsal","path":"/account-groups","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976748148","status":204} +{"kind":"deleted","seq":4,"probe":"write.required","path":"/account-groups","name":"tfpfgen-probe-write-required-1","id":"281474976748146","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/alert_suppression_window/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/alert_suppression_window/ledger.jsonl new file mode 100644 index 00000000..4e24e31e --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/alert_suppression_window/ledger.jsonl @@ -0,0 +1,109 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.update-style","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":3,"probe":"write.update-style","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":4,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":5,"probe":"write.normalisation","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":5,"probe":"write.normalisation","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":6,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":6,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":7,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":7,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":8,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":8,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-1","id":"281474976711116","status":201} +{"kind":"intent","seq":9,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":9,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":10,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-3"} +{"kind":"created","seq":10,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-3","id":"281474976711117","status":201} +{"kind":"intent","seq":11,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":11,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":12,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-5"} +{"kind":"rejected","seq":12,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-5","status":400} +{"kind":"deleted","seq":8,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-1","id":"281474976711116","status":204} +{"kind":"deleted","seq":10,"probe":"write.required","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-required-3","id":"281474976711117","status":204} +{"kind":"intent","seq":13,"probe":"write.writable-returned","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":13,"probe":"write.writable-returned","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976711118","status":201} +{"kind":"deleted","seq":13,"probe":"write.writable-returned","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976711118","status":204} +{"kind":"intent","seq":14,"probe":"write.update-style","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":14,"probe":"write.update-style","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-update-style-1","id":"281474976711119","status":201} +{"kind":"deleted","seq":14,"probe":"write.update-style","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-update-style-1","id":"281474976711119","status":204} +{"kind":"intent","seq":15,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":15,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-1","id":"281474976711120","status":201} +{"kind":"intent","seq":16,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":16,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-2","id":"281474976711121","status":201} +{"kind":"deleted","seq":15,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-1","id":"281474976711120","status":204} +{"kind":"deleted","seq":16,"probe":"write.server-default","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-server-default-2","id":"281474976711121","status":204} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":17,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-1","id":"281474976711122","status":201} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":18,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-2","id":"281474976711123","status":201} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":19,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-3","id":"281474976711124","status":201} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":20,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-4","id":"281474976711125","status":201} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":21,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-5","id":"281474976711126","status":201} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":22,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-6","id":"281474976711127","status":201} +{"kind":"intent","seq":23,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":23,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-7","id":"281474976711128","status":201} +{"kind":"intent","seq":24,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":24,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-8","id":"281474976711129","status":201} +{"kind":"intent","seq":25,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":25,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-9","id":"281474976711130","status":201} +{"kind":"intent","seq":26,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":26,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-10","id":"281474976711131","status":201} +{"kind":"intent","seq":27,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":27,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-11","id":"281474976711132","status":201} +{"kind":"intent","seq":28,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":28,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-12","id":"281474976711133","status":201} +{"kind":"intent","seq":29,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-13"} +{"kind":"created","seq":29,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-13","id":"281474976711134","status":201} +{"kind":"intent","seq":30,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":30,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-14","id":"281474976711135","status":201} +{"kind":"intent","seq":31,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":31,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-15","id":"281474976711136","status":201} +{"kind":"intent","seq":32,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":32,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-16","id":"281474976711137","status":201} +{"kind":"intent","seq":33,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":33,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-17","id":"281474976711138","status":201} +{"kind":"intent","seq":34,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":34,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-18","id":"281474976711139","status":201} +{"kind":"intent","seq":35,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-19"} +{"kind":"created","seq":35,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-19","id":"281474976711140","status":201} +{"kind":"deleted","seq":17,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-1","id":"281474976711122","status":204} +{"kind":"deleted","seq":18,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-2","id":"281474976711123","status":204} +{"kind":"deleted","seq":19,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-3","id":"281474976711124","status":204} +{"kind":"deleted","seq":20,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-4","id":"281474976711125","status":204} +{"kind":"deleted","seq":21,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-5","id":"281474976711126","status":204} +{"kind":"deleted","seq":22,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-6","id":"281474976711127","status":204} +{"kind":"deleted","seq":23,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-7","id":"281474976711128","status":204} +{"kind":"deleted","seq":24,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-8","id":"281474976711129","status":204} +{"kind":"deleted","seq":25,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-9","id":"281474976711130","status":204} +{"kind":"deleted","seq":26,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-10","id":"281474976711131","status":204} +{"kind":"deleted","seq":27,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-11","id":"281474976711132","status":204} +{"kind":"deleted","seq":28,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-12","id":"281474976711133","status":204} +{"kind":"deleted","seq":29,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-13","id":"281474976711134","status":204} +{"kind":"deleted","seq":30,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-14","id":"281474976711135","status":204} +{"kind":"deleted","seq":31,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-15","id":"281474976711136","status":204} +{"kind":"deleted","seq":32,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-16","id":"281474976711137","status":204} +{"kind":"deleted","seq":33,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-17","id":"281474976711138","status":204} +{"kind":"deleted","seq":34,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-18","id":"281474976711139","status":204} +{"kind":"deleted","seq":35,"probe":"write.enum","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-enum-19","id":"281474976711140","status":204} +{"kind":"intent","seq":36,"probe":"write.normalisation","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":36,"probe":"write.normalisation","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":37,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":37,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976711141","status":201} +{"kind":"deleted","seq":37,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976711141","status":204} +{"kind":"intent","seq":38,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":38,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976711142","status":201} +{"kind":"deleted","seq":38,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976711142","status":204} +{"kind":"intent","seq":39,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":39,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976711144","status":201} +{"kind":"deleted","seq":39,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976711144","status":204} +{"kind":"intent","seq":40,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":40,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976711145","status":201} +{"kind":"deleted","seq":40,"probe":"write.rehearsal","path":"/alert-suppression-windows","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976711145","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/alerts_rule/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/alerts_rule/ledger.jsonl new file mode 100644 index 00000000..ffdc3958 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/alerts_rule/ledger.jsonl @@ -0,0 +1,149 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/alerts/rules","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/alerts/rules","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.update-style","path":"/alerts/rules","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":3,"probe":"write.update-style","path":"/alerts/rules","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":4,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":5,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"rejected","seq":5,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-1","status":400} +{"kind":"intent","seq":6,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-1"} +{"kind":"rejected","seq":6,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-1","status":400} +{"kind":"intent","seq":7,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":7,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":8,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":8,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":9,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":9,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":10,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":10,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":11,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":12,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":13,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-9"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-9","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-10"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-10","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":16,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":17,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":18,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":19,"probe":"write.side-effect","path":"/alerts/rules","name":"tfpfgen-probe-write-side-effect-1"} +{"kind":"rejected","seq":19,"probe":"write.side-effect","path":"/alerts/rules","name":"tfpfgen-probe-write-side-effect-1","status":400} +{"kind":"intent","seq":20,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":20,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":21,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":21,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":22,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":22,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":23,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":23,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":24,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":24,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":25,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":25,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-1","id":"281474977454652","status":201} +{"kind":"intent","seq":26,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":26,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":27,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-3"} +{"kind":"created","seq":27,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-3","id":"281474977454653","status":201} +{"kind":"intent","seq":28,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":28,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":29,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-5"} +{"kind":"rejected","seq":29,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-5","status":400} +{"kind":"intent","seq":30,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-6"} +{"kind":"created","seq":30,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-6","id":"281474977454654","status":201} +{"kind":"intent","seq":31,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-7"} +{"kind":"rejected","seq":31,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-7","status":400} +{"kind":"intent","seq":32,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-8"} +{"kind":"rejected","seq":32,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-8","status":400} +{"kind":"intent","seq":33,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-9"} +{"kind":"created","seq":33,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-9","id":"281474977454655","status":201} +{"kind":"deleted","seq":25,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-1","id":"281474977454652","status":204} +{"kind":"deleted","seq":27,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-3","id":"281474977454653","status":204} +{"kind":"deleted","seq":30,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-6","id":"281474977454654","status":204} +{"kind":"deleted","seq":33,"probe":"write.required","path":"/alerts/rules","name":"tfpfgen-probe-write-required-9","id":"281474977454655","status":204} +{"kind":"intent","seq":34,"probe":"write.writable-returned","path":"/alerts/rules","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":34,"probe":"write.writable-returned","path":"/alerts/rules","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":35,"probe":"write.update-style","path":"/alerts/rules","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":35,"probe":"write.update-style","path":"/alerts/rules","name":"tfpfgen-probe-write-update-style-1","id":"281474977454656","status":201} +{"kind":"deleted","seq":35,"probe":"write.update-style","path":"/alerts/rules","name":"tfpfgen-probe-write-update-style-1","id":"281474977454656","status":204} +{"kind":"intent","seq":36,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":36,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-1","id":"281474977454657","status":201} +{"kind":"intent","seq":37,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":37,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-2","id":"281474977454658","status":201} +{"kind":"deleted","seq":36,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-1","id":"281474977454657","status":204} +{"kind":"deleted","seq":37,"probe":"write.server-default","path":"/alerts/rules","name":"tfpfgen-probe-write-server-default-2","id":"281474977454658","status":204} +{"kind":"intent","seq":38,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":38,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-1","id":"281474977454659","status":201} +{"kind":"intent","seq":39,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":39,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-2","id":"281474977454660","status":201} +{"kind":"deleted","seq":38,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-1","id":"281474977454659","status":204} +{"kind":"deleted","seq":39,"probe":"write.immutability","path":"/alerts/rules","name":"tfpfgen-probe-write-immutability-2","id":"281474977454660","status":204} +{"kind":"intent","seq":40,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":40,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-1","id":"281474977454661","status":201} +{"kind":"intent","seq":41,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":41,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-2","id":"281474977454662","status":201} +{"kind":"intent","seq":42,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":42,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-3","id":"281474977454663","status":201} +{"kind":"intent","seq":43,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":43,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-4","id":"281474977454664","status":201} +{"kind":"intent","seq":44,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":44,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":45,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":45,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":46,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":46,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":47,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":47,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-8","id":"281474977454665","status":201} +{"kind":"intent","seq":48,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":48,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-9","id":"281474977454666","status":201} +{"kind":"intent","seq":49,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":49,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-10","id":"281474977454667","status":201} +{"kind":"intent","seq":50,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":50,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-11","id":"281474977454668","status":201} +{"kind":"intent","seq":51,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":51,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":52,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":52,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":53,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-14"} +{"kind":"rejected","seq":53,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-14","status":400} +{"kind":"intent","seq":54,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":54,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-15","id":"281474977454669","status":201} +{"kind":"deleted","seq":40,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-1","id":"281474977454661","status":204} +{"kind":"deleted","seq":41,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-2","id":"281474977454662","status":204} +{"kind":"deleted","seq":42,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-3","id":"281474977454663","status":204} +{"kind":"deleted","seq":43,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-4","id":"281474977454664","status":204} +{"kind":"deleted","seq":47,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-8","id":"281474977454665","status":204} +{"kind":"deleted","seq":48,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-9","id":"281474977454666","status":204} +{"kind":"deleted","seq":49,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-10","id":"281474977454667","status":204} +{"kind":"deleted","seq":50,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-11","id":"281474977454668","status":204} +{"kind":"deleted","seq":54,"probe":"write.enum","path":"/alerts/rules","name":"tfpfgen-probe-write-enum-15","id":"281474977454669","status":204} +{"kind":"intent","seq":55,"probe":"write.side-effect","path":"/alerts/rules","name":"tfpfgen-probe-write-side-effect-1"} +{"kind":"rejected","seq":55,"probe":"write.side-effect","path":"/alerts/rules","name":"tfpfgen-probe-write-side-effect-1","status":400} +{"kind":"intent","seq":56,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":56,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":57,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":57,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":58,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"created","seq":58,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-3","id":"281474977454670","status":201} +{"kind":"deleted","seq":58,"probe":"write.normalisation","path":"/alerts/rules","name":"tfpfgen-probe-write-normalisation-3","id":"281474977454670","status":204} +{"kind":"intent","seq":59,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":59,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1","id":"281474977454671","status":201} +{"kind":"deleted","seq":59,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1","id":"281474977454671","status":204} +{"kind":"intent","seq":60,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":60,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":61,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":61,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1","id":"281474977454693","status":201} +{"kind":"deleted","seq":61,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-1","id":"281474977454693","status":204} +{"kind":"intent","seq":62,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":62,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2","id":"281474977454696","status":201} +{"kind":"deleted","seq":62,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-2","id":"281474977454696","status":204} +{"kind":"intent","seq":63,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":63,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-100","id":"281474977454698","status":201} +{"kind":"deleted","seq":63,"probe":"write.rehearsal","path":"/alerts/rules","name":"tfpfgen-probe-write-rehearsal-100","id":"281474977454698","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/credential/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/credential/ledger.jsonl new file mode 100644 index 00000000..220ab095 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/credential/ledger.jsonl @@ -0,0 +1,17 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/credentials","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/credentials","name":"tfpfgen-probe-write-required-1","id":"281474976711478","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/credentials","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/credentials","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/credentials","name":"tfpfgen-probe-write-required-1","id":"281474976711478","status":204} +{"kind":"intent","seq":3,"probe":"write.writable-returned","path":"/credentials","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":3,"probe":"write.writable-returned","path":"/credentials","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976711479","status":201} +{"kind":"deleted","seq":3,"probe":"write.writable-returned","path":"/credentials","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976711479","status":204} +{"kind":"intent","seq":4,"probe":"write.update-style","path":"/credentials","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":4,"probe":"write.update-style","path":"/credentials","name":"tfpfgen-probe-write-update-style-1","id":"281474976711480","status":201} +{"kind":"deleted","seq":4,"probe":"write.update-style","path":"/credentials","name":"tfpfgen-probe-write-update-style-1","id":"281474976711480","status":204} +{"kind":"intent","seq":5,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":5,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-1","id":"281474976711481","status":201} +{"kind":"intent","seq":6,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":6,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-2","id":"281474976711482","status":201} +{"kind":"deleted","seq":5,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-1","id":"281474976711481","status":204} +{"kind":"deleted","seq":6,"probe":"write.immutability","path":"/credentials","name":"tfpfgen-probe-write-immutability-2","id":"281474976711482","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/dashboard/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/dashboard/ledger.jsonl new file mode 100644 index 00000000..e1566caa --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/dashboard/ledger.jsonl @@ -0,0 +1,72 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1","id":"6a70ac180fca20f23552cc1f","status":201} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1","id":"6a70ac180fca20f23552cc1f","status":204} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/dashboards","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/dashboards","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":3,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac1acc53e13602260fd5","status":201} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":4,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac1a0a9af02cfed9060d","status":201} +{"kind":"deleted","seq":3,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac1acc53e13602260fd5","status":204} +{"kind":"deleted","seq":4,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac1a0a9af02cfed9060d","status":204} +{"kind":"intent","seq":5,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":5,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1","id":"6a70ac1c0fca20f23552cc25","status":201} +{"kind":"intent","seq":6,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":6,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2","id":"6a70ac1d23c6477f30b56dcb","status":201} +{"kind":"intent","seq":7,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":7,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3","id":"6a70ac1d23c6477f30b56dcc","status":201} +{"kind":"intent","seq":8,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":8,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4","id":"6a70ac1ecc53e13602260fe7","status":201} +{"kind":"intent","seq":9,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":9,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5","id":"6a70ac1e0fca20f23552cc33","status":201} +{"kind":"deleted","seq":5,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1","id":"6a70ac1c0fca20f23552cc25","status":204} +{"kind":"deleted","seq":6,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2","id":"6a70ac1d23c6477f30b56dcb","status":204} +{"kind":"deleted","seq":7,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3","id":"6a70ac1d23c6477f30b56dcc","status":204} +{"kind":"deleted","seq":8,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4","id":"6a70ac1ecc53e13602260fe7","status":204} +{"kind":"deleted","seq":9,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5","id":"6a70ac1e0fca20f23552cc33","status":204} +{"kind":"intent","seq":10,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":10,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":11,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":11,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":12,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":12,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac2123c6477f30b56dd4","status":201} +{"kind":"deleted","seq":12,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac2123c6477f30b56dd4","status":204} +{"kind":"intent","seq":13,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":13,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac24cc53e13602260ff0","status":201} +{"kind":"deleted","seq":13,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac24cc53e13602260ff0","status":204} +{"kind":"intent","seq":14,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":14,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1","id":"6a70acf00a9af02cfed906fc","status":201} +{"kind":"deleted","seq":14,"probe":"write.required","path":"/dashboards","name":"tfpfgen-probe-write-required-1","id":"6a70acf00a9af02cfed906fc","status":204} +{"kind":"intent","seq":15,"probe":"write.writable-returned","path":"/dashboards","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":15,"probe":"write.writable-returned","path":"/dashboards","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":16,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":16,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1","id":"6a70acf40a9af02cfed906fd","status":201} +{"kind":"intent","seq":17,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":17,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2","id":"6a70acf423c6477f30b56edf","status":201} +{"kind":"deleted","seq":16,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-1","id":"6a70acf40a9af02cfed906fd","status":204} +{"kind":"deleted","seq":17,"probe":"write.server-default","path":"/dashboards","name":"tfpfgen-probe-write-server-default-2","id":"6a70acf423c6477f30b56edf","status":204} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":18,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1","id":"6a70acf70fca20f23552cd00","status":201} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":19,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2","id":"6a70acf723c6477f30b56efc","status":201} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":20,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3","id":"6a70acf80fca20f23552cd01","status":201} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":21,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4","id":"6a70acf8cc53e1360226110f","status":201} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":22,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5","id":"6a70acf90fca20f23552cd05","status":201} +{"kind":"deleted","seq":18,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-1","id":"6a70acf70fca20f23552cd00","status":204} +{"kind":"deleted","seq":19,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-2","id":"6a70acf723c6477f30b56efc","status":204} +{"kind":"deleted","seq":20,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-3","id":"6a70acf80fca20f23552cd01","status":204} +{"kind":"deleted","seq":21,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-4","id":"6a70acf8cc53e1360226110f","status":204} +{"kind":"deleted","seq":22,"probe":"write.enum","path":"/dashboards","name":"tfpfgen-probe-write-enum-5","id":"6a70acf90fca20f23552cd05","status":204} +{"kind":"intent","seq":23,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":23,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":24,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":24,"probe":"write.normalisation","path":"/dashboards","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":25,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":25,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70acfc0fca20f23552cd0a","status":201} +{"kind":"deleted","seq":25,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70acfc0fca20f23552cd0a","status":204} +{"kind":"intent","seq":26,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":26,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ad000a9af02cfed90713","status":201} +{"kind":"deleted","seq":26,"probe":"write.rehearsal","path":"/dashboards","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ad000a9af02cfed90713","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/dashboards_filter/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/dashboards_filter/ledger.jsonl new file mode 100644 index 00000000..f4f65a7a --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/dashboards_filter/ledger.jsonl @@ -0,0 +1,96 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ac29cc53e13602261001","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3"} +{"kind":"created","seq":3,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ac2acc53e13602261002","status":201} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ac29cc53e13602261001","status":204} +{"kind":"deleted","seq":3,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ac2acc53e13602261002","status":204} +{"kind":"intent","seq":4,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":4,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ac2b23c6477f30b56de0","status":201} +{"kind":"deleted","seq":4,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ac2b23c6477f30b56de0","status":204} +{"kind":"intent","seq":5,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":5,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ac2c23c6477f30b56de1","status":201} +{"kind":"deleted","seq":5,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ac2c23c6477f30b56de1","status":204} +{"kind":"intent","seq":6,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":6,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac2d0fca20f23552cc4d","status":201} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac2ecc53e13602261004","status":201} +{"kind":"deleted","seq":6,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac2d0fca20f23552cc4d","status":204} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac2ecc53e13602261004","status":204} +{"kind":"intent","seq":8,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":8,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ac2f23c6477f30b56de6","status":201} +{"kind":"intent","seq":9,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":9,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ac30cc53e13602261005","status":201} +{"kind":"deleted","seq":8,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ac2f23c6477f30b56de6","status":204} +{"kind":"deleted","seq":9,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ac30cc53e13602261005","status":204} +{"kind":"intent","seq":10,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":10,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac31cc53e13602261006","status":201} +{"kind":"deleted","seq":10,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac31cc53e13602261006","status":204} +{"kind":"intent","seq":11,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":11,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac3423c6477f30b56de9","status":201} +{"kind":"deleted","seq":11,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac3423c6477f30b56de9","status":204} +{"kind":"intent","seq":12,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":12,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ac7f23c6477f30b56e33","status":201} +{"kind":"intent","seq":13,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":13,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":14,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3"} +{"kind":"created","seq":14,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ac800a9af02cfed90677","status":201} +{"kind":"deleted","seq":12,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ac7f23c6477f30b56e33","status":204} +{"kind":"deleted","seq":14,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ac800a9af02cfed90677","status":204} +{"kind":"intent","seq":15,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":15,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ac810fca20f23552cc8d","status":201} +{"kind":"deleted","seq":15,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ac810fca20f23552cc8d","status":204} +{"kind":"intent","seq":16,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":16,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ac82cc53e1360226105d","status":201} +{"kind":"deleted","seq":16,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ac82cc53e1360226105d","status":204} +{"kind":"intent","seq":17,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":17,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac840fca20f23552cc91","status":201} +{"kind":"intent","seq":18,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":18,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac8423c6477f30b56e38","status":201} +{"kind":"deleted","seq":17,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ac840fca20f23552cc91","status":204} +{"kind":"deleted","seq":18,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ac8423c6477f30b56e38","status":204} +{"kind":"intent","seq":19,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":19,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ac860fca20f23552cc93","status":201} +{"kind":"intent","seq":20,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":20,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ac8623c6477f30b56e39","status":201} +{"kind":"deleted","seq":19,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ac860fca20f23552cc93","status":204} +{"kind":"deleted","seq":20,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ac8623c6477f30b56e39","status":204} +{"kind":"intent","seq":21,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":21,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac880a9af02cfed9067d","status":201} +{"kind":"deleted","seq":21,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ac880a9af02cfed9067d","status":204} +{"kind":"intent","seq":22,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":22,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac8a23c6477f30b56e43","status":201} +{"kind":"deleted","seq":22,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ac8a23c6477f30b56e43","status":204} +{"kind":"intent","seq":23,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":23,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ad060a9af02cfed9071a","status":201} +{"kind":"intent","seq":24,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":24,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":25,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3"} +{"kind":"created","seq":25,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ad070fca20f23552cd22","status":201} +{"kind":"deleted","seq":23,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-1","id":"6a70ad060a9af02cfed9071a","status":204} +{"kind":"deleted","seq":25,"probe":"write.required","path":"/dashboards/filters","name":"tfpfgen-probe-write-required-3","id":"6a70ad070fca20f23552cd22","status":204} +{"kind":"intent","seq":26,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":26,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ad08cc53e1360226111f","status":201} +{"kind":"deleted","seq":26,"probe":"write.writable-returned","path":"/dashboards/filters","name":"tfpfgen-probe-write-writable-returned-1","id":"6a70ad08cc53e1360226111f","status":204} +{"kind":"intent","seq":27,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":27,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ad09cc53e13602261129","status":201} +{"kind":"deleted","seq":27,"probe":"write.update-style","path":"/dashboards/filters","name":"tfpfgen-probe-write-update-style-1","id":"6a70ad09cc53e13602261129","status":204} +{"kind":"intent","seq":28,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":28,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ad0a0fca20f23552cd30","status":201} +{"kind":"intent","seq":29,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":29,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ad0b23c6477f30b56f3f","status":201} +{"kind":"deleted","seq":28,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-1","id":"6a70ad0a0fca20f23552cd30","status":204} +{"kind":"deleted","seq":29,"probe":"write.server-default","path":"/dashboards/filters","name":"tfpfgen-probe-write-server-default-2","id":"6a70ad0b23c6477f30b56f3f","status":204} +{"kind":"intent","seq":30,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":30,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ad0c23c6477f30b56f4a","status":201} +{"kind":"intent","seq":31,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":31,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ad0d23c6477f30b56f4b","status":201} +{"kind":"deleted","seq":30,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-1","id":"6a70ad0c23c6477f30b56f4a","status":204} +{"kind":"deleted","seq":31,"probe":"write.normalisation","path":"/dashboards/filters","name":"tfpfgen-probe-write-normalisation-2","id":"6a70ad0d23c6477f30b56f4b","status":204} +{"kind":"intent","seq":32,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":32,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ad0e23c6477f30b56f57","status":201} +{"kind":"deleted","seq":32,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-1","id":"6a70ad0e23c6477f30b56f57","status":204} +{"kind":"intent","seq":33,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":33,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ad110a9af02cfed90743","status":201} +{"kind":"deleted","seq":33,"probe":"write.rehearsal","path":"/dashboards/filters","name":"tfpfgen-probe-write-rehearsal-2","id":"6a70ad110a9af02cfed90743","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/endpoint_label/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/endpoint_label/ledger.jsonl new file mode 100644 index 00000000..6ee6acb0 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/endpoint_label/ledger.jsonl @@ -0,0 +1,413 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":3,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":4,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1"} +{"kind":"rejected","seq":4,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","status":400} +{"kind":"intent","seq":5,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":5,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":6,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":6,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":7,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":7,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":8,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":8,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":9,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":9,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":10,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":10,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":11,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9"} +{"kind":"rejected","seq":12,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","status":400} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10"} +{"kind":"rejected","seq":13,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","status":400} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":16,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14"} +{"kind":"rejected","seq":17,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","status":400} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15"} +{"kind":"rejected","seq":18,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","status":400} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16"} +{"kind":"rejected","seq":19,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","status":400} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17"} +{"kind":"rejected","seq":20,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","status":400} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18"} +{"kind":"rejected","seq":21,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","status":400} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19"} +{"kind":"rejected","seq":22,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","status":400} +{"kind":"intent","seq":23,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20"} +{"kind":"rejected","seq":23,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","status":400} +{"kind":"intent","seq":24,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21"} +{"kind":"rejected","seq":24,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","status":400} +{"kind":"intent","seq":25,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22"} +{"kind":"rejected","seq":25,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","status":400} +{"kind":"intent","seq":26,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23"} +{"kind":"rejected","seq":26,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","status":400} +{"kind":"intent","seq":27,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24"} +{"kind":"rejected","seq":27,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","status":400} +{"kind":"intent","seq":28,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25"} +{"kind":"rejected","seq":28,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","status":400} +{"kind":"intent","seq":29,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26"} +{"kind":"rejected","seq":29,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","status":400} +{"kind":"intent","seq":30,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27"} +{"kind":"rejected","seq":30,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","status":400} +{"kind":"intent","seq":31,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":31,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":32,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":32,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":33,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":33,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":34,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":34,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":35,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":35,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108117","status":201} +{"kind":"intent","seq":36,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":36,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":37,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":37,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"deleted","seq":35,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108117","status":204} +{"kind":"intent","seq":38,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":38,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":39,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":39,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108118","status":201} +{"kind":"deleted","seq":39,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108118","status":204} +{"kind":"intent","seq":40,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":40,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108119","status":201} +{"kind":"intent","seq":41,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":41,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108120","status":201} +{"kind":"deleted","seq":40,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108119","status":204} +{"kind":"deleted","seq":41,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108120","status":204} +{"kind":"intent","seq":42,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":42,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108121","status":201} +{"kind":"intent","seq":43,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":43,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108122","status":201} +{"kind":"intent","seq":44,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":44,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108123","status":201} +{"kind":"intent","seq":45,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":45,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108124","status":201} +{"kind":"intent","seq":46,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":46,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108125","status":201} +{"kind":"intent","seq":47,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":47,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108126","status":201} +{"kind":"intent","seq":48,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":48,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108127","status":201} +{"kind":"intent","seq":49,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":49,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108128","status":201} +{"kind":"intent","seq":50,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":50,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108129","status":201} +{"kind":"intent","seq":51,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":51,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108130","status":201} +{"kind":"intent","seq":52,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":52,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108131","status":201} +{"kind":"intent","seq":53,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":53,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108132","status":201} +{"kind":"intent","seq":54,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13"} +{"kind":"created","seq":54,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108133","status":201} +{"kind":"intent","seq":55,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":55,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108134","status":201} +{"kind":"intent","seq":56,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":56,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108135","status":201} +{"kind":"intent","seq":57,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":57,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108136","status":201} +{"kind":"intent","seq":58,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":58,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108137","status":201} +{"kind":"intent","seq":59,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":59,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108138","status":201} +{"kind":"intent","seq":60,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19"} +{"kind":"created","seq":60,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108139","status":201} +{"kind":"intent","seq":61,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20"} +{"kind":"created","seq":61,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108140","status":201} +{"kind":"intent","seq":62,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21"} +{"kind":"created","seq":62,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108141","status":201} +{"kind":"intent","seq":63,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22"} +{"kind":"created","seq":63,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108142","status":201} +{"kind":"intent","seq":64,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23"} +{"kind":"created","seq":64,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108143","status":201} +{"kind":"intent","seq":65,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24"} +{"kind":"created","seq":65,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108144","status":201} +{"kind":"intent","seq":66,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25"} +{"kind":"created","seq":66,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108145","status":201} +{"kind":"intent","seq":67,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26"} +{"kind":"created","seq":67,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108146","status":201} +{"kind":"intent","seq":68,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27"} +{"kind":"created","seq":68,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108147","status":201} +{"kind":"intent","seq":69,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28"} +{"kind":"rejected","seq":69,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28","status":400} +{"kind":"intent","seq":70,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29"} +{"kind":"rejected","seq":70,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29","status":400} +{"kind":"intent","seq":71,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30"} +{"kind":"rejected","seq":71,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30","status":400} +{"kind":"deleted","seq":42,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108121","status":204} +{"kind":"deleted","seq":43,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108122","status":204} +{"kind":"deleted","seq":44,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108123","status":204} +{"kind":"deleted","seq":45,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108124","status":204} +{"kind":"deleted","seq":46,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108125","status":204} +{"kind":"deleted","seq":47,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108126","status":204} +{"kind":"deleted","seq":48,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108127","status":204} +{"kind":"deleted","seq":49,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108128","status":204} +{"kind":"deleted","seq":50,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108129","status":204} +{"kind":"deleted","seq":51,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108130","status":204} +{"kind":"deleted","seq":52,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108131","status":204} +{"kind":"deleted","seq":53,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108132","status":204} +{"kind":"deleted","seq":54,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108133","status":204} +{"kind":"deleted","seq":55,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108134","status":204} +{"kind":"deleted","seq":56,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108135","status":204} +{"kind":"deleted","seq":57,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108136","status":204} +{"kind":"deleted","seq":58,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108137","status":204} +{"kind":"deleted","seq":59,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108138","status":204} +{"kind":"deleted","seq":60,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108139","status":204} +{"kind":"deleted","seq":61,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108140","status":204} +{"kind":"deleted","seq":62,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108141","status":204} +{"kind":"deleted","seq":63,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108142","status":204} +{"kind":"deleted","seq":64,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108143","status":204} +{"kind":"deleted","seq":65,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108144","status":204} +{"kind":"deleted","seq":66,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108145","status":204} +{"kind":"deleted","seq":67,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108146","status":204} +{"kind":"deleted","seq":68,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108147","status":204} +{"kind":"intent","seq":72,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":72,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":73,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":73,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":74,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":74,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108148","status":201} +{"kind":"deleted","seq":74,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108148","status":204} +{"kind":"intent","seq":75,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":75,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108149","status":201} +{"kind":"deleted","seq":75,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108149","status":204} +{"kind":"intent","seq":76,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":76,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108153","status":201} +{"kind":"intent","seq":77,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":77,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":78,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":78,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"deleted","seq":76,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108153","status":204} +{"kind":"intent","seq":79,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":79,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":80,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":80,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108154","status":201} +{"kind":"deleted","seq":80,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108154","status":204} +{"kind":"intent","seq":81,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":81,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108155","status":201} +{"kind":"intent","seq":82,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":82,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108156","status":201} +{"kind":"deleted","seq":81,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108155","status":204} +{"kind":"deleted","seq":82,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108156","status":204} +{"kind":"intent","seq":83,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":83,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108157","status":201} +{"kind":"intent","seq":84,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":84,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108158","status":201} +{"kind":"intent","seq":85,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":85,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108159","status":201} +{"kind":"intent","seq":86,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":86,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108160","status":201} +{"kind":"intent","seq":87,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":87,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108161","status":201} +{"kind":"intent","seq":88,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":88,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108162","status":201} +{"kind":"intent","seq":89,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":89,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108163","status":201} +{"kind":"intent","seq":90,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":90,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108164","status":201} +{"kind":"intent","seq":91,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":91,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108165","status":201} +{"kind":"intent","seq":92,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":92,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108166","status":201} +{"kind":"intent","seq":93,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":93,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108167","status":201} +{"kind":"intent","seq":94,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":94,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108168","status":201} +{"kind":"intent","seq":95,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13"} +{"kind":"created","seq":95,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108169","status":201} +{"kind":"intent","seq":96,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":96,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108170","status":201} +{"kind":"intent","seq":97,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":97,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108171","status":201} +{"kind":"intent","seq":98,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":98,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108172","status":201} +{"kind":"intent","seq":99,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":99,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108173","status":201} +{"kind":"intent","seq":100,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":100,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108174","status":201} +{"kind":"intent","seq":101,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19"} +{"kind":"created","seq":101,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108175","status":201} +{"kind":"intent","seq":102,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20"} +{"kind":"created","seq":102,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108176","status":201} +{"kind":"intent","seq":103,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21"} +{"kind":"created","seq":103,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108177","status":201} +{"kind":"intent","seq":104,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22"} +{"kind":"created","seq":104,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108178","status":201} +{"kind":"intent","seq":105,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23"} +{"kind":"created","seq":105,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108179","status":201} +{"kind":"intent","seq":106,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24"} +{"kind":"created","seq":106,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108180","status":201} +{"kind":"intent","seq":107,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25"} +{"kind":"created","seq":107,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108181","status":201} +{"kind":"intent","seq":108,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26"} +{"kind":"created","seq":108,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108182","status":201} +{"kind":"intent","seq":109,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27"} +{"kind":"created","seq":109,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108183","status":201} +{"kind":"intent","seq":110,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28"} +{"kind":"rejected","seq":110,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28","status":400} +{"kind":"intent","seq":111,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29"} +{"kind":"rejected","seq":111,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29","status":400} +{"kind":"intent","seq":112,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30"} +{"kind":"rejected","seq":112,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30","status":400} +{"kind":"deleted","seq":83,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108157","status":204} +{"kind":"deleted","seq":84,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108158","status":204} +{"kind":"deleted","seq":85,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108159","status":204} +{"kind":"deleted","seq":86,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108160","status":204} +{"kind":"deleted","seq":87,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108161","status":204} +{"kind":"deleted","seq":88,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108162","status":204} +{"kind":"deleted","seq":89,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108163","status":204} +{"kind":"deleted","seq":90,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108164","status":204} +{"kind":"deleted","seq":91,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108165","status":204} +{"kind":"deleted","seq":92,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108166","status":204} +{"kind":"deleted","seq":93,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108167","status":204} +{"kind":"deleted","seq":94,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108168","status":204} +{"kind":"deleted","seq":95,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108169","status":204} +{"kind":"deleted","seq":96,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108170","status":204} +{"kind":"deleted","seq":97,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108171","status":204} +{"kind":"deleted","seq":98,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108172","status":204} +{"kind":"deleted","seq":99,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108173","status":204} +{"kind":"deleted","seq":100,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108174","status":204} +{"kind":"deleted","seq":101,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108175","status":204} +{"kind":"deleted","seq":102,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108176","status":204} +{"kind":"deleted","seq":103,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108177","status":204} +{"kind":"deleted","seq":104,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108178","status":204} +{"kind":"deleted","seq":105,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108179","status":204} +{"kind":"deleted","seq":106,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108180","status":204} +{"kind":"deleted","seq":107,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108181","status":204} +{"kind":"deleted","seq":108,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108182","status":204} +{"kind":"deleted","seq":109,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108183","status":204} +{"kind":"intent","seq":113,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":113,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":114,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":114,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":115,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":115,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108184","status":201} +{"kind":"deleted","seq":115,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108184","status":204} +{"kind":"intent","seq":116,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":116,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108185","status":201} +{"kind":"deleted","seq":116,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108185","status":204} +{"kind":"intent","seq":117,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":117,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108188","status":201} +{"kind":"intent","seq":118,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":118,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":119,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":119,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"deleted","seq":117,"probe":"write.required","path":"/endpoint/labels","name":"tfpfgen-probe-write-required-1","id":"422212465108188","status":204} +{"kind":"intent","seq":120,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":120,"probe":"write.writable-returned","path":"/endpoint/labels","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":121,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":121,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108189","status":201} +{"kind":"deleted","seq":121,"probe":"write.update-style","path":"/endpoint/labels","name":"tfpfgen-probe-write-update-style-1","id":"422212465108189","status":204} +{"kind":"intent","seq":122,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":122,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108190","status":201} +{"kind":"intent","seq":123,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":123,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108191","status":201} +{"kind":"deleted","seq":122,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-1","id":"422212465108190","status":204} +{"kind":"deleted","seq":123,"probe":"write.server-default","path":"/endpoint/labels","name":"tfpfgen-probe-write-server-default-2","id":"422212465108191","status":204} +{"kind":"intent","seq":124,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":124,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108192","status":201} +{"kind":"intent","seq":125,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":125,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108193","status":201} +{"kind":"intent","seq":126,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3"} +{"kind":"created","seq":126,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108194","status":201} +{"kind":"intent","seq":127,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4"} +{"kind":"created","seq":127,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108195","status":201} +{"kind":"intent","seq":128,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5"} +{"kind":"created","seq":128,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108196","status":201} +{"kind":"intent","seq":129,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":129,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108197","status":201} +{"kind":"intent","seq":130,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":130,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108198","status":201} +{"kind":"intent","seq":131,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":131,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108199","status":201} +{"kind":"intent","seq":132,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":132,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108200","status":201} +{"kind":"intent","seq":133,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":133,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108201","status":201} +{"kind":"intent","seq":134,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":134,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108202","status":201} +{"kind":"intent","seq":135,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":135,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108203","status":201} +{"kind":"intent","seq":136,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13"} +{"kind":"created","seq":136,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108204","status":201} +{"kind":"intent","seq":137,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":137,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108205","status":201} +{"kind":"intent","seq":138,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":138,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108206","status":201} +{"kind":"intent","seq":139,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":139,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108207","status":201} +{"kind":"intent","seq":140,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":140,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108208","status":201} +{"kind":"intent","seq":141,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":141,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108209","status":201} +{"kind":"intent","seq":142,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19"} +{"kind":"created","seq":142,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108210","status":201} +{"kind":"intent","seq":143,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20"} +{"kind":"created","seq":143,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108211","status":201} +{"kind":"intent","seq":144,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21"} +{"kind":"created","seq":144,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108212","status":201} +{"kind":"intent","seq":145,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22"} +{"kind":"created","seq":145,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108213","status":201} +{"kind":"intent","seq":146,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23"} +{"kind":"created","seq":146,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108214","status":201} +{"kind":"intent","seq":147,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24"} +{"kind":"created","seq":147,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108215","status":201} +{"kind":"intent","seq":148,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25"} +{"kind":"created","seq":148,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108216","status":201} +{"kind":"intent","seq":149,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26"} +{"kind":"created","seq":149,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108217","status":201} +{"kind":"intent","seq":150,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27"} +{"kind":"created","seq":150,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108218","status":201} +{"kind":"intent","seq":151,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28"} +{"kind":"rejected","seq":151,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-28","status":400} +{"kind":"intent","seq":152,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29"} +{"kind":"rejected","seq":152,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-29","status":400} +{"kind":"intent","seq":153,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30"} +{"kind":"rejected","seq":153,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-30","status":400} +{"kind":"deleted","seq":124,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-1","id":"422212465108192","status":204} +{"kind":"deleted","seq":125,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-2","id":"422212465108193","status":204} +{"kind":"deleted","seq":126,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-3","id":"422212465108194","status":204} +{"kind":"deleted","seq":127,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-4","id":"422212465108195","status":204} +{"kind":"deleted","seq":128,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-5","id":"422212465108196","status":204} +{"kind":"deleted","seq":129,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-6","id":"422212465108197","status":204} +{"kind":"deleted","seq":130,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-7","id":"422212465108198","status":204} +{"kind":"deleted","seq":131,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-8","id":"422212465108199","status":204} +{"kind":"deleted","seq":132,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-9","id":"422212465108200","status":204} +{"kind":"deleted","seq":133,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-10","id":"422212465108201","status":204} +{"kind":"deleted","seq":134,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-11","id":"422212465108202","status":204} +{"kind":"deleted","seq":135,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-12","id":"422212465108203","status":204} +{"kind":"deleted","seq":136,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-13","id":"422212465108204","status":204} +{"kind":"deleted","seq":137,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-14","id":"422212465108205","status":204} +{"kind":"deleted","seq":138,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-15","id":"422212465108206","status":204} +{"kind":"deleted","seq":139,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-16","id":"422212465108207","status":204} +{"kind":"deleted","seq":140,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-17","id":"422212465108208","status":204} +{"kind":"deleted","seq":141,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-18","id":"422212465108209","status":204} +{"kind":"deleted","seq":142,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-19","id":"422212465108210","status":204} +{"kind":"deleted","seq":143,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-20","id":"422212465108211","status":204} +{"kind":"deleted","seq":144,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-21","id":"422212465108212","status":204} +{"kind":"deleted","seq":145,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-22","id":"422212465108213","status":204} +{"kind":"deleted","seq":146,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-23","id":"422212465108214","status":204} +{"kind":"deleted","seq":147,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-24","id":"422212465108215","status":204} +{"kind":"deleted","seq":148,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-25","id":"422212465108216","status":204} +{"kind":"deleted","seq":149,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-26","id":"422212465108217","status":204} +{"kind":"deleted","seq":150,"probe":"write.enum","path":"/endpoint/labels","name":"tfpfgen-probe-write-enum-27","id":"422212465108218","status":204} +{"kind":"intent","seq":154,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":154,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":155,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":155,"probe":"write.normalisation","path":"/endpoint/labels","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":156,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":156,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108219","status":201} +{"kind":"deleted","seq":156,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-1","id":"422212465108219","status":204} +{"kind":"intent","seq":157,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":157,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108220","status":201} +{"kind":"deleted","seq":157,"probe":"write.rehearsal","path":"/endpoint/labels","name":"tfpfgen-probe-write-rehearsal-2","id":"422212465108220","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/role/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/role/ledger.jsonl new file mode 100644 index 00000000..b930e225 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/role/ledger.jsonl @@ -0,0 +1,33 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1"} +{"kind":"failed","seq":1,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1","status":500,"reason":"server error"} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"failed","seq":2,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1","status":500,"reason":"server error"} +{"kind":"intent","seq":3,"probe":"write.server-default","path":"/roles","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"failed","seq":3,"probe":"write.server-default","path":"/roles","name":"tfpfgen-probe-write-server-default-1","status":500,"reason":"server error"} +{"kind":"intent","seq":4,"probe":"write.normalisation","path":"/roles","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":4,"probe":"write.normalisation","path":"/roles","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":5,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"failed","seq":5,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1","status":500,"reason":"server error"} +{"kind":"intent","seq":6,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":6,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1","reason":"absent from a complete collection read: the create never took effect"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1","reason":"absent from a complete collection read: the create never took effect"} +{"kind":"rejected","seq":3,"probe":"write.server-default","path":"/roles","name":"tfpfgen-probe-write-server-default-1","reason":"absent from a complete collection read: the create never took effect"} +{"kind":"rejected","seq":5,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1","reason":"absent from a complete collection read: the create never took effect"} +{"kind":"intent","seq":7,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":7,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1","id":"281474976765324","status":201} +{"kind":"intent","seq":8,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-2"} +{"kind":"failed","seq":8,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-2","status":500,"reason":"server error"} +{"kind":"deleted","seq":7,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-1","id":"281474976765324","status":204} +{"kind":"intent","seq":9,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":9,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976765325","status":201} +{"kind":"deleted","seq":9,"probe":"write.writable-returned","path":"/roles","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976765325","status":204} +{"kind":"intent","seq":10,"probe":"write.normalisation","path":"/roles","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":10,"probe":"write.normalisation","path":"/roles","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":11,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":11,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976765326","status":201} +{"kind":"deleted","seq":11,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976765326","status":204} +{"kind":"intent","seq":12,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"created","seq":12,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976765327","status":201} +{"kind":"deleted","seq":12,"probe":"write.rehearsal","path":"/roles","name":"tfpfgen-probe-write-rehearsal-2","id":"281474976765327","status":204} +{"kind":"rejected","seq":8,"probe":"write.required","path":"/roles","name":"tfpfgen-probe-write-required-2","reason":"absent from a complete collection read: the create never took effect"} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tag/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tag/ledger.jsonl new file mode 100644 index 00000000..3efa7232 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tag/ledger.jsonl @@ -0,0 +1,413 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"357d5ab6-96fe-42a4-8920-acf45c8b11b4","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":5,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5"} +{"kind":"created","seq":5,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"7e3a9c46-4327-42ac-9773-76d4436b2050","status":201} +{"kind":"intent","seq":6,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6"} +{"kind":"rejected","seq":6,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6","status":400} +{"kind":"intent","seq":7,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7"} +{"kind":"rejected","seq":7,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7","status":400} +{"kind":"intent","seq":8,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8"} +{"kind":"rejected","seq":8,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8","status":400} +{"kind":"intent","seq":9,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9"} +{"kind":"created","seq":9,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"6971684f-3283-481e-ab2b-eb62b2242ba0","status":201} +{"kind":"intent","seq":10,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10"} +{"kind":"rejected","seq":10,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10","status":400} +{"kind":"intent","seq":11,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11"} +{"kind":"rejected","seq":11,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11","status":400} +{"kind":"intent","seq":12,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12"} +{"kind":"rejected","seq":12,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12","status":400} +{"kind":"intent","seq":13,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13"} +{"kind":"rejected","seq":13,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13","status":400} +{"kind":"intent","seq":14,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14"} +{"kind":"rejected","seq":14,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14","status":400} +{"kind":"intent","seq":15,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15"} +{"kind":"rejected","seq":15,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"357d5ab6-96fe-42a4-8920-acf45c8b11b4","status":204} +{"kind":"deleted","seq":5,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"7e3a9c46-4327-42ac-9773-76d4436b2050","status":204} +{"kind":"deleted","seq":9,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"6971684f-3283-481e-ab2b-eb62b2242ba0","status":204} +{"kind":"intent","seq":16,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":16,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"2d1934ab-97f0-4579-b609-d36964deef44","status":201} +{"kind":"intent","seq":17,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2"} +{"kind":"rejected","seq":17,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2","status":400} +{"kind":"intent","seq":18,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3"} +{"kind":"rejected","seq":18,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3","status":403} +{"kind":"deleted","seq":16,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"2d1934ab-97f0-4579-b609-d36964deef44","status":204} +{"kind":"intent","seq":19,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":19,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"2d242ce7-d81d-406e-ab28-37f062d6e95f","status":201} +{"kind":"deleted","seq":19,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"2d242ce7-d81d-406e-ab28-37f062d6e95f","status":204} +{"kind":"intent","seq":20,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":20,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"2748e9c9-f2f2-46a9-825e-1f2f71d79f0c","status":201} +{"kind":"intent","seq":21,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":21,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"31b0f161-0fef-45eb-affb-f0564ed0ddd4","status":201} +{"kind":"intent","seq":22,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3"} +{"kind":"created","seq":22,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"69d72f55-1309-44d1-b892-912672c88175","status":201} +{"kind":"deleted","seq":20,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"2748e9c9-f2f2-46a9-825e-1f2f71d79f0c","status":204} +{"kind":"deleted","seq":21,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"31b0f161-0fef-45eb-affb-f0564ed0ddd4","status":204} +{"kind":"deleted","seq":22,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"69d72f55-1309-44d1-b892-912672c88175","status":204} +{"kind":"intent","seq":23,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":23,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"97bd7fc7-6d92-4dec-984d-4602d7f1176d","status":201} +{"kind":"intent","seq":24,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":24,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"910a7349-eb22-46ba-a73b-745a71cc17f5","status":201} +{"kind":"intent","seq":25,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3"} +{"kind":"created","seq":25,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"a91e3c26-88de-4886-979f-2ad8783dbf0b","status":201} +{"kind":"intent","seq":26,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2"} +{"kind":"created","seq":26,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"3418b0f3-7340-4cd9-aae1-8241c8e0c9e0","status":201} +{"kind":"intent","seq":27,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5"} +{"kind":"created","seq":27,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"344991c2-664a-4143-a30e-1162382a78e3","status":201} +{"kind":"intent","seq":28,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6"} +{"kind":"created","seq":28,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"da71225b-48cc-4e69-a92f-03b4f8b7c571","status":201} +{"kind":"deleted","seq":23,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"97bd7fc7-6d92-4dec-984d-4602d7f1176d","status":204} +{"kind":"deleted","seq":24,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"910a7349-eb22-46ba-a73b-745a71cc17f5","status":204} +{"kind":"deleted","seq":25,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"a91e3c26-88de-4886-979f-2ad8783dbf0b","status":204} +{"kind":"deleted","seq":26,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"3418b0f3-7340-4cd9-aae1-8241c8e0c9e0","status":204} +{"kind":"deleted","seq":27,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"344991c2-664a-4143-a30e-1162382a78e3","status":204} +{"kind":"deleted","seq":28,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"da71225b-48cc-4e69-a92f-03b4f8b7c571","status":204} +{"kind":"intent","seq":29,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":29,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"d69087e5-9194-4a6f-9adc-0304e0fbb0eb","status":201} +{"kind":"intent","seq":30,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":30,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":31,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":31,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3","status":403} +{"kind":"intent","seq":32,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":32,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4","status":403} +{"kind":"intent","seq":33,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":33,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5","status":403} +{"kind":"intent","seq":34,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":34,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":35,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":35,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":36,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":36,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":37,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":37,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"c9819989-cdda-4b0e-9011-b3d8eead6106","status":201} +{"kind":"intent","seq":38,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":38,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"a9af1098-3c4f-4626-a624-d2363d16358a","status":201} +{"kind":"intent","seq":39,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":39,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":40,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":40,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":41,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":41,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":42,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":42,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"ff446802-39c5-4bde-91c7-46d6d5683ecf","status":201} +{"kind":"intent","seq":43,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":43,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"3c95cda1-66f6-4a5e-a67c-89b72b9722f6","status":201} +{"kind":"intent","seq":44,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":44,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"b8e1cc58-6371-4f03-8345-766450765cab","status":201} +{"kind":"intent","seq":45,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":45,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"ae85fcae-90f4-4046-88c6-e1dca091d659","status":201} +{"kind":"intent","seq":46,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":46,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"abca06cb-cfeb-4160-8a8a-70325d6c3d06","status":201} +{"kind":"intent","seq":47,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19"} +{"kind":"rejected","seq":47,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19","status":400} +{"kind":"intent","seq":48,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20"} +{"kind":"rejected","seq":48,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20","status":400} +{"kind":"intent","seq":49,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21"} +{"kind":"rejected","seq":49,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21","status":400} +{"kind":"intent","seq":50,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22"} +{"kind":"rejected","seq":50,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22","status":400} +{"kind":"deleted","seq":29,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"d69087e5-9194-4a6f-9adc-0304e0fbb0eb","status":204} +{"kind":"deleted","seq":37,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"c9819989-cdda-4b0e-9011-b3d8eead6106","status":204} +{"kind":"deleted","seq":38,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"a9af1098-3c4f-4626-a624-d2363d16358a","status":204} +{"kind":"deleted","seq":42,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"ff446802-39c5-4bde-91c7-46d6d5683ecf","status":204} +{"kind":"deleted","seq":43,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"3c95cda1-66f6-4a5e-a67c-89b72b9722f6","status":204} +{"kind":"deleted","seq":44,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"b8e1cc58-6371-4f03-8345-766450765cab","status":204} +{"kind":"deleted","seq":45,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"ae85fcae-90f4-4046-88c6-e1dca091d659","status":204} +{"kind":"deleted","seq":46,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"abca06cb-cfeb-4160-8a8a-70325d6c3d06","status":204} +{"kind":"intent","seq":51,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1"} +{"kind":"created","seq":51,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"cff32397-98d4-45c0-80dc-5f4be0a2c29e","status":201} +{"kind":"intent","seq":52,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2"} +{"kind":"created","seq":52,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"c78359b5-f645-446d-9c89-835b4fec11c3","status":201} +{"kind":"intent","seq":53,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3"} +{"kind":"created","seq":53,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"41c6514c-35b3-4410-abd2-c2664b64066a","status":201} +{"kind":"deleted","seq":51,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"cff32397-98d4-45c0-80dc-5f4be0a2c29e","status":204} +{"kind":"deleted","seq":52,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"c78359b5-f645-446d-9c89-835b4fec11c3","status":204} +{"kind":"deleted","seq":53,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"41c6514c-35b3-4410-abd2-c2664b64066a","status":204} +{"kind":"intent","seq":54,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":54,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"7c3deec8-bcbc-4af0-ac7e-92cae852176f","status":201} +{"kind":"intent","seq":55,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":55,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"fd748de1-fa96-4031-ab36-50ab41db6c42","status":201} +{"kind":"deleted","seq":54,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"7c3deec8-bcbc-4af0-ac7e-92cae852176f","status":204} +{"kind":"deleted","seq":55,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"fd748de1-fa96-4031-ab36-50ab41db6c42","status":204} +{"kind":"intent","seq":56,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":56,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"f845c02a-d8cb-41fc-be40-b39a9e9d6a60","status":201} +{"kind":"intent","seq":57,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":57,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":58,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":58,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":59,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":59,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":60,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5"} +{"kind":"created","seq":60,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"9e7bfc36-18af-4c02-b342-4afb4e1ae2d9","status":201} +{"kind":"intent","seq":61,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6"} +{"kind":"rejected","seq":61,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6","status":400} +{"kind":"intent","seq":62,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7"} +{"kind":"rejected","seq":62,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7","status":400} +{"kind":"intent","seq":63,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8"} +{"kind":"rejected","seq":63,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8","status":400} +{"kind":"intent","seq":64,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9"} +{"kind":"created","seq":64,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"83cd725f-b3f2-4878-8476-4e5fc477bd28","status":201} +{"kind":"intent","seq":65,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10"} +{"kind":"rejected","seq":65,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10","status":400} +{"kind":"intent","seq":66,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11"} +{"kind":"rejected","seq":66,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11","status":400} +{"kind":"intent","seq":67,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12"} +{"kind":"rejected","seq":67,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12","status":400} +{"kind":"intent","seq":68,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13"} +{"kind":"rejected","seq":68,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13","status":400} +{"kind":"intent","seq":69,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14"} +{"kind":"rejected","seq":69,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14","status":400} +{"kind":"intent","seq":70,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15"} +{"kind":"rejected","seq":70,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15","status":400} +{"kind":"deleted","seq":56,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"f845c02a-d8cb-41fc-be40-b39a9e9d6a60","status":204} +{"kind":"deleted","seq":60,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"9e7bfc36-18af-4c02-b342-4afb4e1ae2d9","status":204} +{"kind":"deleted","seq":64,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"83cd725f-b3f2-4878-8476-4e5fc477bd28","status":204} +{"kind":"intent","seq":71,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":71,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"04c19145-1ebe-45e7-a9aa-d7be71b08bcd","status":201} +{"kind":"intent","seq":72,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2"} +{"kind":"rejected","seq":72,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2","status":400} +{"kind":"intent","seq":73,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3"} +{"kind":"created","seq":73,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3","id":"847efe68-9052-407f-95d9-39c6a7cd00b3","status":201} +{"kind":"deleted","seq":71,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"04c19145-1ebe-45e7-a9aa-d7be71b08bcd","status":204} +{"kind":"deleted","seq":73,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3","id":"847efe68-9052-407f-95d9-39c6a7cd00b3","status":204} +{"kind":"intent","seq":74,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":74,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"3de6a000-d1ee-48e0-9a30-a6e218ec076a","status":201} +{"kind":"deleted","seq":74,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"3de6a000-d1ee-48e0-9a30-a6e218ec076a","status":204} +{"kind":"intent","seq":75,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":75,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"6aa24ba4-af85-4c6a-abf0-a225bdcb0f32","status":201} +{"kind":"intent","seq":76,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":76,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"0b9d6c8d-537b-4208-a9bf-e3a45512665f","status":201} +{"kind":"intent","seq":77,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3"} +{"kind":"created","seq":77,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"ad9454d1-26d5-4989-ba99-8d5963f5e305","status":201} +{"kind":"deleted","seq":75,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"6aa24ba4-af85-4c6a-abf0-a225bdcb0f32","status":204} +{"kind":"deleted","seq":76,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"0b9d6c8d-537b-4208-a9bf-e3a45512665f","status":204} +{"kind":"deleted","seq":77,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"ad9454d1-26d5-4989-ba99-8d5963f5e305","status":204} +{"kind":"intent","seq":78,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":78,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"acf82f63-d7d7-47a9-8ce6-1b931f28ccb9","status":201} +{"kind":"intent","seq":79,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":79,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"66f81bbb-8231-43d8-8024-f08968e2cbf5","status":201} +{"kind":"intent","seq":80,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3"} +{"kind":"created","seq":80,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"535942a1-36bc-4f55-a8ae-df83dec7279c","status":201} +{"kind":"intent","seq":81,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2"} +{"kind":"created","seq":81,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"a0202aea-62cc-4629-81ed-60a8720491ce","status":201} +{"kind":"intent","seq":82,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5"} +{"kind":"created","seq":82,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"94f5a135-6fcf-4edb-861d-2888ab7ecc21","status":201} +{"kind":"intent","seq":83,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6"} +{"kind":"created","seq":83,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"572c5e0d-6add-4c5e-8a53-0ac89ed4aec6","status":201} +{"kind":"deleted","seq":78,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"acf82f63-d7d7-47a9-8ce6-1b931f28ccb9","status":204} +{"kind":"deleted","seq":79,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"66f81bbb-8231-43d8-8024-f08968e2cbf5","status":204} +{"kind":"deleted","seq":80,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"535942a1-36bc-4f55-a8ae-df83dec7279c","status":204} +{"kind":"deleted","seq":81,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"a0202aea-62cc-4629-81ed-60a8720491ce","status":204} +{"kind":"deleted","seq":82,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"94f5a135-6fcf-4edb-861d-2888ab7ecc21","status":204} +{"kind":"deleted","seq":83,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"572c5e0d-6add-4c5e-8a53-0ac89ed4aec6","status":204} +{"kind":"intent","seq":84,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":84,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"a13e43c4-4fe7-48b2-9d96-cf3a601f1a25","status":201} +{"kind":"intent","seq":85,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":85,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":86,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":86,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3","status":403} +{"kind":"intent","seq":87,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":87,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4","status":403} +{"kind":"intent","seq":88,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":88,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5","status":403} +{"kind":"intent","seq":89,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":89,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":90,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":90,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":91,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":91,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":92,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":92,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"7531d1e6-3fc1-4316-80c4-79bf215ac165","status":201} +{"kind":"intent","seq":93,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":93,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"4c497e89-b663-4a77-abaa-9271d74e3920","status":201} +{"kind":"intent","seq":94,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":94,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":95,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":95,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":96,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":96,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":97,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":97,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"04e3d8d7-5c07-402b-b34f-e8e7896f4e39","status":201} +{"kind":"intent","seq":98,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":98,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"820a9233-a06f-44e3-b1d3-bd87e52daccb","status":201} +{"kind":"intent","seq":99,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":99,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"46fcff18-0bbe-4393-b2c3-b1d0e4115e74","status":201} +{"kind":"intent","seq":100,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":100,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"d78753ed-cbc0-471a-a7da-b8ac737bab9f","status":201} +{"kind":"intent","seq":101,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":101,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"1730ab97-5c3b-403d-9973-9c07acaa70bf","status":201} +{"kind":"intent","seq":102,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19"} +{"kind":"rejected","seq":102,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19","status":400} +{"kind":"intent","seq":103,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20"} +{"kind":"rejected","seq":103,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20","status":400} +{"kind":"intent","seq":104,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21"} +{"kind":"rejected","seq":104,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21","status":400} +{"kind":"intent","seq":105,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22"} +{"kind":"rejected","seq":105,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22","status":400} +{"kind":"deleted","seq":84,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"a13e43c4-4fe7-48b2-9d96-cf3a601f1a25","status":204} +{"kind":"deleted","seq":92,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"7531d1e6-3fc1-4316-80c4-79bf215ac165","status":204} +{"kind":"deleted","seq":93,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"4c497e89-b663-4a77-abaa-9271d74e3920","status":204} +{"kind":"deleted","seq":97,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"04e3d8d7-5c07-402b-b34f-e8e7896f4e39","status":204} +{"kind":"deleted","seq":98,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"820a9233-a06f-44e3-b1d3-bd87e52daccb","status":204} +{"kind":"deleted","seq":99,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"46fcff18-0bbe-4393-b2c3-b1d0e4115e74","status":204} +{"kind":"deleted","seq":100,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"d78753ed-cbc0-471a-a7da-b8ac737bab9f","status":204} +{"kind":"deleted","seq":101,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"1730ab97-5c3b-403d-9973-9c07acaa70bf","status":204} +{"kind":"intent","seq":106,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1"} +{"kind":"created","seq":106,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"c04cb09a-e9e5-4e33-bfb7-47c2f144708b","status":201} +{"kind":"intent","seq":107,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2"} +{"kind":"created","seq":107,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"e8b34206-3591-496b-baf9-048ef1ec8295","status":201} +{"kind":"intent","seq":108,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3"} +{"kind":"created","seq":108,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"1e35ad29-49b4-4a9c-9d52-d578885006e5","status":201} +{"kind":"deleted","seq":106,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"c04cb09a-e9e5-4e33-bfb7-47c2f144708b","status":204} +{"kind":"deleted","seq":107,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"e8b34206-3591-496b-baf9-048ef1ec8295","status":204} +{"kind":"deleted","seq":108,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"1e35ad29-49b4-4a9c-9d52-d578885006e5","status":204} +{"kind":"intent","seq":109,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":109,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"f748b7b1-5783-432d-8424-2e5c04e58072","status":201} +{"kind":"intent","seq":110,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":110,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"539585db-610e-4987-a4a3-425f667de3ad","status":201} +{"kind":"deleted","seq":109,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"f748b7b1-5783-432d-8424-2e5c04e58072","status":204} +{"kind":"deleted","seq":110,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"539585db-610e-4987-a4a3-425f667de3ad","status":204} +{"kind":"intent","seq":111,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":111,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"6756bec4-d09b-44d9-841d-559ddf24f9fa","status":201} +{"kind":"intent","seq":112,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":112,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":113,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":113,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":114,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":114,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":115,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5"} +{"kind":"created","seq":115,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"b1c4a105-d558-4232-a183-83cc61fb9941","status":201} +{"kind":"intent","seq":116,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6"} +{"kind":"rejected","seq":116,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-6","status":400} +{"kind":"intent","seq":117,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7"} +{"kind":"rejected","seq":117,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-7","status":400} +{"kind":"intent","seq":118,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8"} +{"kind":"rejected","seq":118,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-8","status":400} +{"kind":"intent","seq":119,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9"} +{"kind":"created","seq":119,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"9c0b36e4-57ef-4ca5-b008-872f8588f1a5","status":201} +{"kind":"intent","seq":120,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10"} +{"kind":"rejected","seq":120,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-10","status":400} +{"kind":"intent","seq":121,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11"} +{"kind":"rejected","seq":121,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-11","status":400} +{"kind":"intent","seq":122,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12"} +{"kind":"rejected","seq":122,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-12","status":400} +{"kind":"intent","seq":123,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13"} +{"kind":"rejected","seq":123,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-13","status":400} +{"kind":"intent","seq":124,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14"} +{"kind":"rejected","seq":124,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-14","status":400} +{"kind":"intent","seq":125,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15"} +{"kind":"rejected","seq":125,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-15","status":400} +{"kind":"deleted","seq":111,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-1","id":"6756bec4-d09b-44d9-841d-559ddf24f9fa","status":204} +{"kind":"deleted","seq":115,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-5","id":"b1c4a105-d558-4232-a183-83cc61fb9941","status":204} +{"kind":"deleted","seq":119,"probe":"write.required","path":"/tags","name":"tfpfgen-probe-write-required-9","id":"9c0b36e4-57ef-4ca5-b008-872f8588f1a5","status":204} +{"kind":"intent","seq":126,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":126,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0","status":201} +{"kind":"intent","seq":127,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2"} +{"kind":"rejected","seq":127,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-2","status":400} +{"kind":"intent","seq":128,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3"} +{"kind":"created","seq":128,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3","id":"e9d496fa-339f-44ec-a9c4-f1fa0e66d219","status":201} +{"kind":"deleted","seq":126,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-1","id":"cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0","status":204} +{"kind":"deleted","seq":128,"probe":"write.writable-returned","path":"/tags","name":"tfpfgen-probe-write-writable-returned-3","id":"e9d496fa-339f-44ec-a9c4-f1fa0e66d219","status":204} +{"kind":"intent","seq":129,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":129,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"adf344f4-02cf-439d-84b7-9dc830a86a26","status":201} +{"kind":"deleted","seq":129,"probe":"write.update-style","path":"/tags","name":"tfpfgen-probe-write-update-style-1","id":"adf344f4-02cf-439d-84b7-9dc830a86a26","status":204} +{"kind":"intent","seq":130,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":130,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"06d73295-69f9-4efe-a656-ff135480d059","status":201} +{"kind":"intent","seq":131,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":131,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"249951a7-c76e-4789-834f-47b80cdf1409","status":201} +{"kind":"intent","seq":132,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3"} +{"kind":"created","seq":132,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"39206999-5104-4091-80e6-150da8420b7b","status":201} +{"kind":"deleted","seq":130,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-1","id":"06d73295-69f9-4efe-a656-ff135480d059","status":204} +{"kind":"deleted","seq":131,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-2","id":"249951a7-c76e-4789-834f-47b80cdf1409","status":204} +{"kind":"deleted","seq":132,"probe":"write.server-default","path":"/tags","name":"tfpfgen-probe-write-server-default-3","id":"39206999-5104-4091-80e6-150da8420b7b","status":204} +{"kind":"intent","seq":133,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":133,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"0fae749c-7cb5-418c-9641-7bcd4844eac4","status":201} +{"kind":"intent","seq":134,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":134,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"32bb772f-577c-47be-9990-fa047b673ae0","status":201} +{"kind":"intent","seq":135,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3"} +{"kind":"created","seq":135,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"ded128e9-00ae-43ad-9b39-324c38e41dfe","status":201} +{"kind":"intent","seq":136,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2"} +{"kind":"created","seq":136,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"2fb8bac5-331c-4d45-bb47-2d65859f57de","status":201} +{"kind":"intent","seq":137,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5"} +{"kind":"created","seq":137,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"a8cb0ab8-9ab0-41ce-9281-9ef263e73b71","status":201} +{"kind":"intent","seq":138,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6"} +{"kind":"created","seq":138,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"fec75c57-6175-48c0-8fd5-bf9d03e5eede","status":201} +{"kind":"deleted","seq":133,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-1","id":"0fae749c-7cb5-418c-9641-7bcd4844eac4","status":204} +{"kind":"deleted","seq":134,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-2","id":"32bb772f-577c-47be-9990-fa047b673ae0","status":204} +{"kind":"deleted","seq":135,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-3","id":"ded128e9-00ae-43ad-9b39-324c38e41dfe","status":204} +{"kind":"deleted","seq":136,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-alt-2","id":"2fb8bac5-331c-4d45-bb47-2d65859f57de","status":204} +{"kind":"deleted","seq":137,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-5","id":"a8cb0ab8-9ab0-41ce-9281-9ef263e73b71","status":204} +{"kind":"deleted","seq":138,"probe":"write.immutability","path":"/tags","name":"tfpfgen-probe-write-immutability-6","id":"fec75c57-6175-48c0-8fd5-bf9d03e5eede","status":204} +{"kind":"intent","seq":139,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":139,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"d84f9860-c520-4833-8184-ab9e51ea33bf","status":201} +{"kind":"intent","seq":140,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":140,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":141,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":141,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-3","status":403} +{"kind":"intent","seq":142,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":142,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-4","status":403} +{"kind":"intent","seq":143,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":143,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-5","status":403} +{"kind":"intent","seq":144,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":144,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":145,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":145,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":146,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":146,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":147,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":147,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"de4cebb2-a124-4d95-98f0-ff62e0cd6419","status":201} +{"kind":"intent","seq":148,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":148,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"63cc1a5c-0b59-4301-ac73-64aeb1da3d54","status":201} +{"kind":"intent","seq":149,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":149,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":150,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12"} +{"kind":"rejected","seq":150,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-12","status":400} +{"kind":"intent","seq":151,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13"} +{"kind":"rejected","seq":151,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-13","status":400} +{"kind":"intent","seq":152,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":152,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"1a4679fe-dcd9-4ec7-a63a-953de7191d42","status":201} +{"kind":"intent","seq":153,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":153,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"18d797b4-4d9a-40a8-9c4e-2fba961ca540","status":201} +{"kind":"intent","seq":154,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":154,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"d689e082-8d7d-44a9-aaf9-4cafcd4e9a57","status":201} +{"kind":"intent","seq":155,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":155,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"928f67ce-eee5-409f-bae5-5e7b9f60a069","status":201} +{"kind":"intent","seq":156,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":156,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"7611246c-c822-4ac4-84ba-d8e20177c9c6","status":201} +{"kind":"intent","seq":157,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19"} +{"kind":"rejected","seq":157,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-19","status":400} +{"kind":"intent","seq":158,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20"} +{"kind":"rejected","seq":158,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-20","status":400} +{"kind":"intent","seq":159,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21"} +{"kind":"rejected","seq":159,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-21","status":400} +{"kind":"intent","seq":160,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22"} +{"kind":"rejected","seq":160,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-22","status":400} +{"kind":"deleted","seq":139,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-1","id":"d84f9860-c520-4833-8184-ab9e51ea33bf","status":204} +{"kind":"deleted","seq":147,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-9","id":"de4cebb2-a124-4d95-98f0-ff62e0cd6419","status":204} +{"kind":"deleted","seq":148,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-10","id":"63cc1a5c-0b59-4301-ac73-64aeb1da3d54","status":204} +{"kind":"deleted","seq":152,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-14","id":"1a4679fe-dcd9-4ec7-a63a-953de7191d42","status":204} +{"kind":"deleted","seq":153,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-15","id":"18d797b4-4d9a-40a8-9c4e-2fba961ca540","status":204} +{"kind":"deleted","seq":154,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-16","id":"d689e082-8d7d-44a9-aaf9-4cafcd4e9a57","status":204} +{"kind":"deleted","seq":155,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-17","id":"928f67ce-eee5-409f-bae5-5e7b9f60a069","status":204} +{"kind":"deleted","seq":156,"probe":"write.enum","path":"/tags","name":"tfpfgen-probe-write-enum-18","id":"7611246c-c822-4ac4-84ba-d8e20177c9c6","status":204} +{"kind":"intent","seq":161,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1"} +{"kind":"created","seq":161,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"fe9a8559-f20b-4866-bfca-9a38295b7717","status":201} +{"kind":"intent","seq":162,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2"} +{"kind":"created","seq":162,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"19318e58-bcce-4934-8357-6a60dd43bc5f","status":201} +{"kind":"intent","seq":163,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3"} +{"kind":"created","seq":163,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"612786db-ddc4-4363-af88-15f0e3aa5952","status":201} +{"kind":"deleted","seq":161,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-1","id":"fe9a8559-f20b-4866-bfca-9a38295b7717","status":204} +{"kind":"deleted","seq":162,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-2","id":"19318e58-bcce-4934-8357-6a60dd43bc5f","status":204} +{"kind":"deleted","seq":163,"probe":"write.side-effect","path":"/tags","name":"tfpfgen-probe-write-side-effect-3","id":"612786db-ddc4-4363-af88-15f0e3aa5952","status":204} +{"kind":"intent","seq":164,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"created","seq":164,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"105bb743-1df9-450d-b0c5-08cae8c0ab95","status":201} +{"kind":"intent","seq":165,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":165,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"bb532b4e-ef82-4d82-b13e-45e03d7a50f9","status":201} +{"kind":"deleted","seq":164,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-1","id":"105bb743-1df9-450d-b0c5-08cae8c0ab95","status":204} +{"kind":"deleted","seq":165,"probe":"write.normalisation","path":"/tags","name":"tfpfgen-probe-write-normalisation-2","id":"bb532b4e-ef82-4d82-b13e-45e03d7a50f9","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_agent_to_server/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_agent_to_server/ledger.jsonl new file mode 100644 index 00000000..80aa3a52 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_agent_to_server/ledger.jsonl @@ -0,0 +1,37 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-1","id":"281474976976787","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-required-1","id":"281474976976787","status":204} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":5,"probe":"write.writable-returned","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":6,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":6,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976788","status":201} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976789","status":201} +{"kind":"deleted","seq":6,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976788","status":204} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976789","status":204} +{"kind":"intent","seq":8,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":8,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976790","status":201} +{"kind":"intent","seq":9,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":9,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976791","status":201} +{"kind":"intent","seq":10,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":10,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":11,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":12,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":13,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976792","status":201} +{"kind":"deleted","seq":8,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976790","status":204} +{"kind":"deleted","seq":9,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976791","status":204} +{"kind":"deleted","seq":13,"probe":"write.enum","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976792","status":204} +{"kind":"intent","seq":14,"probe":"write.normalisation","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":14,"probe":"write.normalisation","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":15,"probe":"write.normalisation","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":15,"probe":"write.normalisation","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976793","status":201} +{"kind":"deleted","seq":15,"probe":"write.normalisation","path":"/tests/agent-to-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976793","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_api/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_api/ledger.jsonl new file mode 100644 index 00000000..5ff8ccef --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_api/ledger.jsonl @@ -0,0 +1,189 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-1","id":"281474976976794","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":5,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-5"} +{"kind":"rejected","seq":5,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-5","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/api","name":"tfpfgen-probe-write-required-1","id":"281474976976794","status":204} +{"kind":"intent","seq":6,"probe":"write.writable-returned","path":"/tests/api","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":6,"probe":"write.writable-returned","path":"/tests/api","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":7,"probe":"write.update-style","path":"/tests/api","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":7,"probe":"write.update-style","path":"/tests/api","name":"tfpfgen-probe-write-update-style-1","id":"281474976976795","status":201} +{"kind":"deleted","seq":7,"probe":"write.update-style","path":"/tests/api","name":"tfpfgen-probe-write-update-style-1","id":"281474976976795","status":204} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-1","id":"281474976976796","status":201} +{"kind":"intent","seq":9,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":9,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-2","id":"281474976976797","status":201} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-1","id":"281474976976796","status":204} +{"kind":"deleted","seq":9,"probe":"write.server-default","path":"/tests/api","name":"tfpfgen-probe-write-server-default-2","id":"281474976976797","status":204} +{"kind":"intent","seq":10,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":10,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-1","id":"281474976976798","status":201} +{"kind":"intent","seq":11,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":11,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-2","id":"281474976976799","status":201} +{"kind":"deleted","seq":10,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-1","id":"281474976976798","status":204} +{"kind":"deleted","seq":11,"probe":"write.immutability","path":"/tests/api","name":"tfpfgen-probe-write-immutability-2","id":"281474976976799","status":204} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":12,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-1","id":"281474976976800","status":201} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":13,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-2","id":"281474976976801","status":201} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":16,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":17,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-6","id":"281474976976802","status":201} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":18,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-7","id":"281474976976803","status":201} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":19,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-8","id":"281474976976804","status":201} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":20,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-9","id":"281474976976805","status":201} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":21,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-10","id":"281474976976806","status":201} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":22,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-11","id":"281474976976807","status":201} +{"kind":"intent","seq":23,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":23,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-12","id":"281474976976808","status":201} +{"kind":"intent","seq":24,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-13"} +{"kind":"created","seq":24,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-13","id":"281474976976809","status":201} +{"kind":"intent","seq":25,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-14"} +{"kind":"created","seq":25,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-14","id":"281474976976810","status":201} +{"kind":"intent","seq":26,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-15"} +{"kind":"created","seq":26,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-15","id":"281474976976811","status":201} +{"kind":"intent","seq":27,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-16"} +{"kind":"created","seq":27,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-16","id":"281474976976812","status":201} +{"kind":"intent","seq":28,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-17"} +{"kind":"created","seq":28,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-17","id":"281474976976813","status":201} +{"kind":"intent","seq":29,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-18"} +{"kind":"created","seq":29,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-18","id":"281474976976814","status":201} +{"kind":"intent","seq":30,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-19"} +{"kind":"created","seq":30,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-19","id":"281474976976815","status":201} +{"kind":"intent","seq":31,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-20"} +{"kind":"created","seq":31,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-20","id":"281474976976816","status":201} +{"kind":"intent","seq":32,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-21"} +{"kind":"created","seq":32,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-21","id":"281474976976817","status":201} +{"kind":"intent","seq":33,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-22"} +{"kind":"created","seq":33,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-22","id":"281474976976818","status":201} +{"kind":"intent","seq":34,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-23"} +{"kind":"created","seq":34,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-23","id":"281474976976819","status":201} +{"kind":"intent","seq":35,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-24"} +{"kind":"created","seq":35,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-24","id":"281474976976820","status":201} +{"kind":"intent","seq":36,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-25"} +{"kind":"created","seq":36,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-25","id":"281474976976821","status":201} +{"kind":"intent","seq":37,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-26"} +{"kind":"created","seq":37,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-26","id":"281474976976822","status":201} +{"kind":"intent","seq":38,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-27"} +{"kind":"created","seq":38,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-27","id":"281474976976823","status":201} +{"kind":"intent","seq":39,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-28"} +{"kind":"created","seq":39,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-28","id":"281474976976824","status":201} +{"kind":"intent","seq":40,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-29"} +{"kind":"created","seq":40,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-29","id":"281474976976825","status":201} +{"kind":"intent","seq":41,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-30"} +{"kind":"created","seq":41,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-30","id":"281474976976826","status":201} +{"kind":"intent","seq":42,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-31"} +{"kind":"created","seq":42,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-31","id":"281474976976827","status":201} +{"kind":"intent","seq":43,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-32"} +{"kind":"created","seq":43,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-32","id":"281474976976828","status":201} +{"kind":"intent","seq":44,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-33"} +{"kind":"created","seq":44,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-33","id":"281474976976829","status":201} +{"kind":"intent","seq":45,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-34"} +{"kind":"created","seq":45,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-34","id":"281474976976830","status":201} +{"kind":"intent","seq":46,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-35"} +{"kind":"created","seq":46,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-35","id":"281474976976831","status":201} +{"kind":"intent","seq":47,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-36"} +{"kind":"created","seq":47,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-36","id":"281474976976832","status":201} +{"kind":"intent","seq":48,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-37"} +{"kind":"created","seq":48,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-37","id":"281474976976833","status":201} +{"kind":"intent","seq":49,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-38"} +{"kind":"created","seq":49,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-38","id":"281474976976834","status":201} +{"kind":"intent","seq":50,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-39"} +{"kind":"created","seq":50,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-39","id":"281474976976835","status":201} +{"kind":"intent","seq":51,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-40"} +{"kind":"created","seq":51,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-40","id":"281474976976836","status":201} +{"kind":"intent","seq":52,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-41"} +{"kind":"created","seq":52,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-41","id":"281474976976837","status":201} +{"kind":"intent","seq":53,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-42"} +{"kind":"created","seq":53,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-42","id":"281474976976838","status":201} +{"kind":"intent","seq":54,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-43"} +{"kind":"created","seq":54,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-43","id":"281474976976839","status":201} +{"kind":"intent","seq":55,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-44"} +{"kind":"created","seq":55,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-44","id":"281474976976840","status":201} +{"kind":"intent","seq":56,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-45"} +{"kind":"created","seq":56,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-45","id":"281474976976841","status":201} +{"kind":"intent","seq":57,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-46"} +{"kind":"created","seq":57,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-46","id":"281474976976842","status":201} +{"kind":"deleted","seq":12,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-1","id":"281474976976800","status":204} +{"kind":"deleted","seq":13,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-2","id":"281474976976801","status":204} +{"kind":"deleted","seq":17,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-6","id":"281474976976802","status":204} +{"kind":"deleted","seq":18,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-7","id":"281474976976803","status":204} +{"kind":"deleted","seq":19,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-8","id":"281474976976804","status":204} +{"kind":"deleted","seq":20,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-9","id":"281474976976805","status":204} +{"kind":"deleted","seq":21,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-10","id":"281474976976806","status":204} +{"kind":"deleted","seq":22,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-11","id":"281474976976807","status":204} +{"kind":"deleted","seq":23,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-12","id":"281474976976808","status":204} +{"kind":"deleted","seq":24,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-13","id":"281474976976809","status":204} +{"kind":"deleted","seq":25,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-14","id":"281474976976810","status":204} +{"kind":"deleted","seq":26,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-15","id":"281474976976811","status":204} +{"kind":"deleted","seq":27,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-16","id":"281474976976812","status":204} +{"kind":"deleted","seq":28,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-17","id":"281474976976813","status":204} +{"kind":"deleted","seq":29,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-18","id":"281474976976814","status":204} +{"kind":"deleted","seq":30,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-19","id":"281474976976815","status":204} +{"kind":"deleted","seq":31,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-20","id":"281474976976816","status":204} +{"kind":"deleted","seq":32,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-21","id":"281474976976817","status":204} +{"kind":"deleted","seq":33,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-22","id":"281474976976818","status":204} +{"kind":"deleted","seq":34,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-23","id":"281474976976819","status":204} +{"kind":"deleted","seq":35,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-24","id":"281474976976820","status":204} +{"kind":"deleted","seq":36,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-25","id":"281474976976821","status":204} +{"kind":"deleted","seq":37,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-26","id":"281474976976822","status":204} +{"kind":"deleted","seq":38,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-27","id":"281474976976823","status":204} +{"kind":"deleted","seq":39,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-28","id":"281474976976824","status":204} +{"kind":"deleted","seq":40,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-29","id":"281474976976825","status":204} +{"kind":"deleted","seq":41,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-30","id":"281474976976826","status":204} +{"kind":"deleted","seq":42,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-31","id":"281474976976827","status":204} +{"kind":"deleted","seq":43,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-32","id":"281474976976828","status":204} +{"kind":"deleted","seq":44,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-33","id":"281474976976829","status":204} +{"kind":"deleted","seq":45,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-34","id":"281474976976830","status":204} +{"kind":"deleted","seq":46,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-35","id":"281474976976831","status":204} +{"kind":"deleted","seq":47,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-36","id":"281474976976832","status":204} +{"kind":"deleted","seq":48,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-37","id":"281474976976833","status":204} +{"kind":"deleted","seq":49,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-38","id":"281474976976834","status":204} +{"kind":"deleted","seq":50,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-39","id":"281474976976835","status":204} +{"kind":"deleted","seq":51,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-40","id":"281474976976836","status":204} +{"kind":"deleted","seq":52,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-41","id":"281474976976837","status":204} +{"kind":"deleted","seq":53,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-42","id":"281474976976838","status":204} +{"kind":"deleted","seq":54,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-43","id":"281474976976839","status":204} +{"kind":"deleted","seq":55,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-44","id":"281474976976840","status":204} +{"kind":"deleted","seq":56,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-45","id":"281474976976841","status":204} +{"kind":"deleted","seq":57,"probe":"write.enum","path":"/tests/api","name":"tfpfgen-probe-write-enum-46","id":"281474976976842","status":204} +{"kind":"intent","seq":58,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":58,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":59,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":59,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":60,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":60,"probe":"write.normalisation","path":"/tests/api","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":61,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":61,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":62,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":62,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":63,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":63,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977110","status":201} +{"kind":"deleted","seq":63,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977110","status":204} +{"kind":"intent","seq":64,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":64,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":65,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":65,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977111","status":201} +{"kind":"deleted","seq":65,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977111","status":204} +{"kind":"intent","seq":66,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":66,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977116","status":201} +{"kind":"deleted","seq":66,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977116","status":204} +{"kind":"intent","seq":67,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":67,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":68,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":68,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977117","status":201} +{"kind":"deleted","seq":68,"probe":"write.rehearsal","path":"/tests/api","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977117","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_bgp/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_bgp/ledger.jsonl new file mode 100644 index 00000000..e436e7eb --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_bgp/ledger.jsonl @@ -0,0 +1,17 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/bgp","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/bgp","name":"tfpfgen-probe-write-required-1","id":"281474976976843","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/bgp","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/bgp","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/bgp","name":"tfpfgen-probe-write-required-1","id":"281474976976843","status":204} +{"kind":"intent","seq":3,"probe":"write.writable-returned","path":"/tests/bgp","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":3,"probe":"write.writable-returned","path":"/tests/bgp","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":4,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-1","id":"281474976976844","status":201} +{"kind":"intent","seq":5,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":5,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-2","id":"281474976976845","status":201} +{"kind":"deleted","seq":4,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-1","id":"281474976976844","status":204} +{"kind":"deleted","seq":5,"probe":"write.server-default","path":"/tests/bgp","name":"tfpfgen-probe-write-server-default-2","id":"281474976976845","status":204} +{"kind":"intent","seq":6,"probe":"write.normalisation","path":"/tests/bgp","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":6,"probe":"write.normalisation","path":"/tests/bgp","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":7,"probe":"write.normalisation","path":"/tests/bgp","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":7,"probe":"write.normalisation","path":"/tests/bgp","name":"tfpfgen-probe-write-normalisation-2","status":400} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_server/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_server/ledger.jsonl new file mode 100644 index 00000000..541ed1b7 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_server/ledger.jsonl @@ -0,0 +1,61 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-1","id":"281474976976846","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":5,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-5"} +{"kind":"rejected","seq":5,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-5","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/dns-server","name":"tfpfgen-probe-write-required-1","id":"281474976976846","status":204} +{"kind":"intent","seq":6,"probe":"write.writable-returned","path":"/tests/dns-server","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":6,"probe":"write.writable-returned","path":"/tests/dns-server","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":7,"probe":"write.update-style","path":"/tests/dns-server","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":7,"probe":"write.update-style","path":"/tests/dns-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976847","status":201} +{"kind":"deleted","seq":7,"probe":"write.update-style","path":"/tests/dns-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976847","status":204} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976848","status":201} +{"kind":"intent","seq":9,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":9,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976849","status":201} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976848","status":204} +{"kind":"deleted","seq":9,"probe":"write.server-default","path":"/tests/dns-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976849","status":204} +{"kind":"intent","seq":10,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":10,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976850","status":201} +{"kind":"intent","seq":11,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":11,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976851","status":201} +{"kind":"deleted","seq":10,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976850","status":204} +{"kind":"deleted","seq":11,"probe":"write.immutability","path":"/tests/dns-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976851","status":204} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":12,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976852","status":201} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":13,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976853","status":201} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":16,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":17,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976854","status":201} +{"kind":"deleted","seq":12,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976852","status":204} +{"kind":"deleted","seq":13,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976853","status":204} +{"kind":"deleted","seq":17,"probe":"write.enum","path":"/tests/dns-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976854","status":204} +{"kind":"intent","seq":18,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":18,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":19,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":19,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976855","status":201} +{"kind":"intent","seq":20,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"created","seq":20,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-3","id":"281474976976856","status":201} +{"kind":"deleted","seq":19,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976855","status":204} +{"kind":"deleted","seq":20,"probe":"write.normalisation","path":"/tests/dns-server","name":"tfpfgen-probe-write-normalisation-3","id":"281474976976856","status":204} +{"kind":"intent","seq":21,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":21,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977112","status":201} +{"kind":"deleted","seq":21,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977112","status":204} +{"kind":"intent","seq":22,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":22,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":23,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":23,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977118","status":201} +{"kind":"deleted","seq":23,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977118","status":204} +{"kind":"intent","seq":24,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":24,"probe":"write.rehearsal","path":"/tests/dns-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_trace/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_trace/ledger.jsonl new file mode 100644 index 00000000..a0e1d7a5 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_dns_trace/ledger.jsonl @@ -0,0 +1,26 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-1","id":"281474976976857","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/dns-trace","name":"tfpfgen-probe-write-required-1","id":"281474976976857","status":204} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/tests/dns-trace","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":5,"probe":"write.writable-returned","path":"/tests/dns-trace","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976976858","status":201} +{"kind":"deleted","seq":5,"probe":"write.writable-returned","path":"/tests/dns-trace","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976976858","status":204} +{"kind":"intent","seq":6,"probe":"write.update-style","path":"/tests/dns-trace","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":6,"probe":"write.update-style","path":"/tests/dns-trace","name":"tfpfgen-probe-write-update-style-1","id":"281474976976859","status":201} +{"kind":"deleted","seq":6,"probe":"write.update-style","path":"/tests/dns-trace","name":"tfpfgen-probe-write-update-style-1","id":"281474976976859","status":204} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-1","id":"281474976976860","status":201} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-2","id":"281474976976861","status":201} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-1","id":"281474976976860","status":204} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/dns-trace","name":"tfpfgen-probe-write-server-default-2","id":"281474976976861","status":204} +{"kind":"intent","seq":9,"probe":"write.normalisation","path":"/tests/dns-trace","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":9,"probe":"write.normalisation","path":"/tests/dns-trace","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":10,"probe":"write.normalisation","path":"/tests/dns-trace","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":10,"probe":"write.normalisation","path":"/tests/dns-trace","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976862","status":201} +{"kind":"deleted","seq":10,"probe":"write.normalisation","path":"/tests/dns-trace","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976862","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_dnssec/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_dnssec/ledger.jsonl new file mode 100644 index 00000000..32f6d266 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_dnssec/ledger.jsonl @@ -0,0 +1,26 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-1","id":"281474976976863","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/dnssec","name":"tfpfgen-probe-write-required-1","id":"281474976976863","status":204} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/tests/dnssec","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"created","seq":5,"probe":"write.writable-returned","path":"/tests/dnssec","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976976864","status":201} +{"kind":"deleted","seq":5,"probe":"write.writable-returned","path":"/tests/dnssec","name":"tfpfgen-probe-write-writable-returned-1","id":"281474976976864","status":204} +{"kind":"intent","seq":6,"probe":"write.update-style","path":"/tests/dnssec","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":6,"probe":"write.update-style","path":"/tests/dnssec","name":"tfpfgen-probe-write-update-style-1","id":"281474976976865","status":201} +{"kind":"deleted","seq":6,"probe":"write.update-style","path":"/tests/dnssec","name":"tfpfgen-probe-write-update-style-1","id":"281474976976865","status":204} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-1","id":"281474976976866","status":201} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-2","id":"281474976976867","status":201} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-1","id":"281474976976866","status":204} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/dnssec","name":"tfpfgen-probe-write-server-default-2","id":"281474976976867","status":204} +{"kind":"intent","seq":9,"probe":"write.normalisation","path":"/tests/dnssec","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":9,"probe":"write.normalisation","path":"/tests/dnssec","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":10,"probe":"write.normalisation","path":"/tests/dnssec","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":10,"probe":"write.normalisation","path":"/tests/dnssec","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976868","status":201} +{"kind":"deleted","seq":10,"probe":"write.normalisation","path":"/tests/dnssec","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976868","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_ftp_server/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_ftp_server/ledger.jsonl new file mode 100644 index 00000000..905c3ab6 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_ftp_server/ledger.jsonl @@ -0,0 +1,86 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-1","id":"281474976976869","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"intent","seq":5,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-5"} +{"kind":"rejected","seq":5,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-5","status":400} +{"kind":"intent","seq":6,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-6"} +{"kind":"rejected","seq":6,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-6","status":400} +{"kind":"intent","seq":7,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-7"} +{"kind":"rejected","seq":7,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-7","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/ftp-server","name":"tfpfgen-probe-write-required-1","id":"281474976976869","status":204} +{"kind":"intent","seq":8,"probe":"write.writable-returned","path":"/tests/ftp-server","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":8,"probe":"write.writable-returned","path":"/tests/ftp-server","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":9,"probe":"write.update-style","path":"/tests/ftp-server","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":9,"probe":"write.update-style","path":"/tests/ftp-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976870","status":201} +{"kind":"deleted","seq":9,"probe":"write.update-style","path":"/tests/ftp-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976870","status":204} +{"kind":"intent","seq":10,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":10,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976871","status":201} +{"kind":"intent","seq":11,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":11,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976872","status":201} +{"kind":"deleted","seq":10,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976871","status":204} +{"kind":"deleted","seq":11,"probe":"write.server-default","path":"/tests/ftp-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976872","status":204} +{"kind":"intent","seq":12,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":12,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976873","status":201} +{"kind":"intent","seq":13,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":13,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976874","status":201} +{"kind":"intent","seq":14,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-3"} +{"kind":"created","seq":14,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-3","id":"281474976976875","status":201} +{"kind":"deleted","seq":12,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976873","status":204} +{"kind":"deleted","seq":13,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976874","status":204} +{"kind":"deleted","seq":14,"probe":"write.immutability","path":"/tests/ftp-server","name":"tfpfgen-probe-write-immutability-3","id":"281474976976875","status":204} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":15,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976876","status":201} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":16,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976877","status":201} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":17,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":18,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":19,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":20,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976878","status":201} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":21,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-7","id":"281474976976879","status":201} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":22,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":23,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":23,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-9","id":"281474976976880","status":201} +{"kind":"intent","seq":24,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-10"} +{"kind":"rejected","seq":24,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-10","status":400} +{"kind":"intent","seq":25,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-11"} +{"kind":"rejected","seq":25,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-11","status":400} +{"kind":"intent","seq":26,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":26,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-12","id":"281474976976881","status":201} +{"kind":"deleted","seq":15,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976876","status":204} +{"kind":"deleted","seq":16,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976877","status":204} +{"kind":"deleted","seq":20,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976878","status":204} +{"kind":"deleted","seq":21,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-7","id":"281474976976879","status":204} +{"kind":"deleted","seq":23,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-9","id":"281474976976880","status":204} +{"kind":"deleted","seq":26,"probe":"write.enum","path":"/tests/ftp-server","name":"tfpfgen-probe-write-enum-12","id":"281474976976881","status":204} +{"kind":"intent","seq":27,"probe":"write.normalisation","path":"/tests/ftp-server","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":27,"probe":"write.normalisation","path":"/tests/ftp-server","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":28,"probe":"write.normalisation","path":"/tests/ftp-server","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"created","seq":28,"probe":"write.normalisation","path":"/tests/ftp-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976882","status":201} +{"kind":"deleted","seq":28,"probe":"write.normalisation","path":"/tests/ftp-server","name":"tfpfgen-probe-write-normalisation-2","id":"281474976976882","status":204} +{"kind":"intent","seq":29,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":29,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977113","status":201} +{"kind":"deleted","seq":29,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977113","status":204} +{"kind":"intent","seq":30,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":30,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":31,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":31,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977114","status":201} +{"kind":"deleted","seq":31,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977114","status":204} +{"kind":"intent","seq":32,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":32,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977119","status":201} +{"kind":"deleted","seq":32,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977119","status":204} +{"kind":"intent","seq":33,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":33,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":34,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":34,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977120","status":201} +{"kind":"deleted","seq":34,"probe":"write.rehearsal","path":"/tests/ftp-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977120","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_http_server/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_http_server/ledger.jsonl new file mode 100644 index 00000000..7e861045 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_http_server/ledger.jsonl @@ -0,0 +1,69 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-1","id":"281474976976775","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/http-server","name":"tfpfgen-probe-write-required-1","id":"281474976976775","status":204} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/tests/http-server","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":5,"probe":"write.writable-returned","path":"/tests/http-server","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":6,"probe":"write.update-style","path":"/tests/http-server","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":6,"probe":"write.update-style","path":"/tests/http-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976776","status":201} +{"kind":"deleted","seq":6,"probe":"write.update-style","path":"/tests/http-server","name":"tfpfgen-probe-write-update-style-1","id":"281474976976776","status":204} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976777","status":201} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976778","status":201} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-1","id":"281474976976777","status":204} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/http-server","name":"tfpfgen-probe-write-server-default-2","id":"281474976976778","status":204} +{"kind":"intent","seq":9,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":9,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976779","status":201} +{"kind":"intent","seq":10,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":10,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976780","status":201} +{"kind":"deleted","seq":9,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-1","id":"281474976976779","status":204} +{"kind":"deleted","seq":10,"probe":"write.immutability","path":"/tests/http-server","name":"tfpfgen-probe-write-immutability-2","id":"281474976976780","status":204} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":11,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976781","status":201} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":12,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976782","status":201} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":13,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":16,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976783","status":201} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":17,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-7","id":"281474976976784","status":201} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":18,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-8","id":"281474976976785","status":201} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-9"} +{"kind":"failed","seq":19,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-9","reason":"POST /tests/http-server: Post \"https://api.thousandeyes.com/v7/tests/http-server\": context deadline exceeded"} +{"kind":"deleted","seq":16,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-6","id":"281474976976783","status":204} +{"kind":"deleted","seq":17,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-7","id":"281474976976784","status":204} +{"kind":"deleted","seq":18,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-8","id":"281474976976785","status":204} +{"kind":"intent","seq":20,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":20,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":21,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":21,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":22,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":22,"probe":"write.normalisation","path":"/tests/http-server","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"deleted","seq":11,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-1","id":"281474976976781","status":204} +{"kind":"deleted","seq":12,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-2","id":"281474976976782","status":204} +{"kind":"deleted","seq":19,"probe":"write.enum","path":"/tests/http-server","name":"tfpfgen-probe-write-enum-9","id":"281474976976786","reason":"removed by the prefix sweep"} +{"kind":"intent","seq":23,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":23,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977115","status":201} +{"kind":"deleted","seq":23,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977115","status":204} +{"kind":"intent","seq":24,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":24,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":25,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":25,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977121","status":201} +{"kind":"deleted","seq":25,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976977121","status":204} +{"kind":"intent","seq":26,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":26,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":27,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-100"} +{"kind":"created","seq":27,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977122","status":201} +{"kind":"deleted","seq":27,"probe":"write.rehearsal","path":"/tests/http-server","name":"tfpfgen-probe-write-rehearsal-100","id":"281474976977122","status":204} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_page_load/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_page_load/ledger.jsonl new file mode 100644 index 00000000..df1a0b8d --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_page_load/ledger.jsonl @@ -0,0 +1,63 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":1,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-1","id":"281474976976883","status":201} +{"kind":"intent","seq":2,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":2,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":3,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":3,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":4,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":4,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":1,"probe":"write.required","path":"/tests/page-load","name":"tfpfgen-probe-write-required-1","id":"281474976976883","status":204} +{"kind":"intent","seq":5,"probe":"write.writable-returned","path":"/tests/page-load","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":5,"probe":"write.writable-returned","path":"/tests/page-load","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":6,"probe":"write.update-style","path":"/tests/page-load","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"created","seq":6,"probe":"write.update-style","path":"/tests/page-load","name":"tfpfgen-probe-write-update-style-1","id":"281474976976884","status":201} +{"kind":"deleted","seq":6,"probe":"write.update-style","path":"/tests/page-load","name":"tfpfgen-probe-write-update-style-1","id":"281474976976884","status":204} +{"kind":"intent","seq":7,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":7,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-1","id":"281474976976885","status":201} +{"kind":"intent","seq":8,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"created","seq":8,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-2","id":"281474976976886","status":201} +{"kind":"deleted","seq":7,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-1","id":"281474976976885","status":204} +{"kind":"deleted","seq":8,"probe":"write.server-default","path":"/tests/page-load","name":"tfpfgen-probe-write-server-default-2","id":"281474976976886","status":204} +{"kind":"intent","seq":9,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"created","seq":9,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-1","id":"281474976976887","status":201} +{"kind":"intent","seq":10,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-2"} +{"kind":"created","seq":10,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-2","id":"281474976976888","status":201} +{"kind":"deleted","seq":9,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-1","id":"281474976976887","status":204} +{"kind":"deleted","seq":10,"probe":"write.immutability","path":"/tests/page-load","name":"tfpfgen-probe-write-immutability-2","id":"281474976976888","status":204} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-1"} +{"kind":"created","seq":11,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-1","id":"281474976976889","status":201} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-2"} +{"kind":"created","seq":12,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-2","id":"281474976976890","status":201} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":13,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":16,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-6"} +{"kind":"created","seq":16,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-6","id":"281474976976891","status":201} +{"kind":"intent","seq":17,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-7"} +{"kind":"created","seq":17,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-7","id":"281474976976892","status":201} +{"kind":"intent","seq":18,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-8"} +{"kind":"created","seq":18,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-8","id":"281474976976893","status":201} +{"kind":"intent","seq":19,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-9"} +{"kind":"created","seq":19,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-9","id":"281474976976894","status":201} +{"kind":"intent","seq":20,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-10"} +{"kind":"created","seq":20,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-10","id":"281474976976895","status":201} +{"kind":"intent","seq":21,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-11"} +{"kind":"created","seq":21,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-11","id":"281474976976896","status":201} +{"kind":"intent","seq":22,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-12"} +{"kind":"created","seq":22,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-12","id":"281474976976897","status":201} +{"kind":"deleted","seq":11,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-1","id":"281474976976889","status":204} +{"kind":"deleted","seq":12,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-2","id":"281474976976890","status":204} +{"kind":"deleted","seq":16,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-6","id":"281474976976891","status":204} +{"kind":"deleted","seq":17,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-7","id":"281474976976892","status":204} +{"kind":"deleted","seq":18,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-8","id":"281474976976893","status":204} +{"kind":"deleted","seq":19,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-9","id":"281474976976894","status":204} +{"kind":"deleted","seq":20,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-10","id":"281474976976895","status":204} +{"kind":"deleted","seq":21,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-11","id":"281474976976896","status":204} +{"kind":"deleted","seq":22,"probe":"write.enum","path":"/tests/page-load","name":"tfpfgen-probe-write-enum-12","id":"281474976976897","status":204} +{"kind":"intent","seq":23,"probe":"write.normalisation","path":"/tests/page-load","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":23,"probe":"write.normalisation","path":"/tests/page-load","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":24,"probe":"write.normalisation","path":"/tests/page-load","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":24,"probe":"write.normalisation","path":"/tests/page-load","name":"tfpfgen-probe-write-normalisation-2","status":400} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/tests_web_transaction/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/tests_web_transaction/ledger.jsonl new file mode 100644 index 00000000..15780c4e --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/tests_web_transaction/ledger.jsonl @@ -0,0 +1,36 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/tests/web-transactions","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/tests/web-transactions","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/tests/web-transactions","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/tests/web-transactions","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.update-style","path":"/tests/web-transactions","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":3,"probe":"write.update-style","path":"/tests/web-transactions","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/tests/web-transactions","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":4,"probe":"write.server-default","path":"/tests/web-transactions","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":5,"probe":"write.immutability","path":"/tests/web-transactions","name":"tfpfgen-probe-write-immutability-1"} +{"kind":"rejected","seq":5,"probe":"write.immutability","path":"/tests/web-transactions","name":"tfpfgen-probe-write-immutability-1","status":400} +{"kind":"intent","seq":6,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-1"} +{"kind":"rejected","seq":6,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-1","status":400} +{"kind":"intent","seq":7,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-2"} +{"kind":"rejected","seq":7,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-2","status":400} +{"kind":"intent","seq":8,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-3"} +{"kind":"rejected","seq":8,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-3","status":400} +{"kind":"intent","seq":9,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-4"} +{"kind":"rejected","seq":9,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-4","status":400} +{"kind":"intent","seq":10,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-5"} +{"kind":"rejected","seq":10,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-5","status":400} +{"kind":"intent","seq":11,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-6"} +{"kind":"rejected","seq":11,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-6","status":400} +{"kind":"intent","seq":12,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-7"} +{"kind":"rejected","seq":12,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-7","status":400} +{"kind":"intent","seq":13,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-8"} +{"kind":"rejected","seq":13,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-8","status":400} +{"kind":"intent","seq":14,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-9"} +{"kind":"rejected","seq":14,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-9","status":400} +{"kind":"intent","seq":15,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-10"} +{"kind":"rejected","seq":15,"probe":"write.enum","path":"/tests/web-transactions","name":"tfpfgen-probe-write-enum-10","status":400} +{"kind":"intent","seq":16,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":16,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":17,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":17,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":18,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":18,"probe":"write.normalisation","path":"/tests/web-transactions","name":"tfpfgen-probe-write-normalisation-3","status":400} diff --git a/.tfpluginframeworkgen/probe/thousandeyes/user/ledger.jsonl b/.tfpluginframeworkgen/probe/thousandeyes/user/ledger.jsonl new file mode 100644 index 00000000..03caed10 --- /dev/null +++ b/.tfpluginframeworkgen/probe/thousandeyes/user/ledger.jsonl @@ -0,0 +1,65 @@ +{"kind":"intent","seq":1,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":1,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":2,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":2,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":3,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":3,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":4,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":4,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":5,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":5,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":6,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":6,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":7,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":7,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":8,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":8,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":9,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":9,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":10,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1"} +{"kind":"rejected","seq":10,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1","status":400} +{"kind":"intent","seq":11,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":11,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":12,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":12,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":13,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"rejected","seq":13,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1","status":400} +{"kind":"intent","seq":14,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":14,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":15,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":15,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":16,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":16,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":17,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"rejected","seq":17,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1","status":400} +{"kind":"intent","seq":18,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":18,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2","status":400} +{"kind":"intent","seq":19,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1"} +{"kind":"created","seq":19,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1","id":"281474976781820","status":201} +{"kind":"intent","seq":20,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-2"} +{"kind":"rejected","seq":20,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-2","status":400} +{"kind":"intent","seq":21,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-3"} +{"kind":"rejected","seq":21,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-3","status":400} +{"kind":"intent","seq":22,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-4"} +{"kind":"rejected","seq":22,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-4","status":400} +{"kind":"deleted","seq":19,"probe":"write.required","path":"/users","name":"tfpfgen-probe-write-required-1","id":"281474976781820","status":204} +{"kind":"intent","seq":23,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1"} +{"kind":"rejected","seq":23,"probe":"write.writable-returned","path":"/users","name":"tfpfgen-probe-write-writable-returned-1","status":400} +{"kind":"intent","seq":24,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1"} +{"kind":"rejected","seq":24,"probe":"write.update-style","path":"/users","name":"tfpfgen-probe-write-update-style-1","status":400} +{"kind":"intent","seq":25,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1"} +{"kind":"created","seq":25,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1","id":"281474976781821","status":201} +{"kind":"intent","seq":26,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-2"} +{"kind":"rejected","seq":26,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-2","status":400} +{"kind":"deleted","seq":25,"probe":"write.server-default","path":"/users","name":"tfpfgen-probe-write-server-default-1","id":"281474976781821","status":204} +{"kind":"intent","seq":27,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1"} +{"kind":"rejected","seq":27,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-1","status":400} +{"kind":"intent","seq":28,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2"} +{"kind":"rejected","seq":28,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-2","status":400} +{"kind":"intent","seq":29,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3"} +{"kind":"rejected","seq":29,"probe":"write.normalisation","path":"/users","name":"tfpfgen-probe-write-normalisation-3","status":400} +{"kind":"intent","seq":30,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1"} +{"kind":"created","seq":30,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976781823","status":201} +{"kind":"deleted","seq":30,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-1","id":"281474976781823","status":204} +{"kind":"intent","seq":31,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2"} +{"kind":"rejected","seq":31,"probe":"write.rehearsal","path":"/users","name":"tfpfgen-probe-write-rehearsal-2","status":400} diff --git a/.tfpluginframeworkgen/sandbox/thousandeyes.json b/.tfpluginframeworkgen/sandbox/thousandeyes.json new file mode 100644 index 00000000..b854a35c --- /dev/null +++ b/.tfpluginframeworkgen/sandbox/thousandeyes.json @@ -0,0 +1,14 @@ +{ + "endpoint": "https://api.thousandeyes.com/v7", + "tokenEnv": "TFPFGEN_PROBE_TOKEN", + "sandbox": true, + "sandboxEvidence": "The deploymenttheory lab tenant: a disposable account group used only for provider development and acceptance runs; it holds one lab endpoint agent and the built-in tags, and nothing anybody depends on.", + "namePrefix": "tfpfgen-probe", + "assertions": { + "endpointHostSuffix": "thousandeyes.com", + "maxExistingObjects": 25, + "accountGroupId": "", + "accountGroupParam": "aid", + "accountGroupJsonPath": "aid" + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index de13c5ae..da3e9326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,3 +8,102 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 This file is maintained by [release-please](.github/workflows/release-please.yml) from conventional commit messages. Add entries by writing good commit messages, not by editing this file by hand. + +## Unreleased — Naming standard hard cut + +Everything below was renamed in one release; no aliases were kept. + +### CLI + +The binary is now `tfpfgen` (was `tfpluginframeworkgen`), and the grammar is +noun-group throughout: `tfpfgen `. Flags are single-dash everywhere. + +| Old | New | +|---|---| +| `tfpluginframeworkgen` (binary, `cmd/tfpluginframeworkgen`) | `tfpfgen` (`cmd/tfpfgen`) | +| `specs` | `openapi fetch` | +| `specs -output-dir` | `openapi fetch -out` | +| `ingest` | `blueprint draft` | +| `ingest -spec-root` | `blueprint draft -openapi-dir` | +| `ingest -spec` | `blueprint draft -openapi` | +| `ingest -only` | `blueprint draft -tag` | +| `ingest -list` | `blueprint draft -dry-run` | +| `ingest -all` | `blueprint draft -include-unusable` | +| `ingest -plan-drafts` | `blueprint draft -scenario-drafts` | +| `probe -mode record\|replay\|verify\|sweep` | `probe record\|replay\|verify\|sweep` (bare `probe` still defaults to replay) | +| `probe -list` | `probe list` | +| `probe -only` | `probe -probe` | +| `probe -evidence` | `probe -recordings` | +| `probe -plan` | `probe -scenario` | +| `probe -plan-dir` | `probe -scenario-dir` | +| `probe -no-rehearse` | `probe -skip-rehearsal` | +| `merge` | `blueprint merge` | +| `merge -accept-conflicts` | `blueprint merge -allow-conflicts` | +| `merge -snapshot-id` | `blueprint merge -recording` | +| `merge -promote-plans` | `blueprint merge -adopt-scenarios` | +| `merge -github-summary` | `blueprint merge -summary` | +| `emit` | `provider generate` | +| `emit -only` | `provider generate -resource` | +| `emit -list` | `provider generate -dry-run` | +| `verify` (command) | `provider generate -check` | +| `scaffold` | `provider scaffold resource\|data-source` (still not implemented) | +| `bindings` | `bindings check` | +| `bindings -facts-out` | `bindings facts -out` | +| `bindings -facts-check` | `bindings facts -check` | +| `interop export` | `spec export` | +| `interop export -only` | `spec export -resource` | +| `interop import` | `spec import` | +| `interop import -list` | `spec import -dry-run` | +| `-v` (global) | deleted — it never worked | +| `-config` (global) | deleted — it never worked | + +`blueprint validate|diff|list`, `version`, `-q` and `-chdir`/`-C` are unchanged; +`spec import -spec` keeps its name and means the Provider Code Specification JSON. + +### Repository paths + +| Old | New | +|---|---| +| `openapi-specs/` | `openapi/` | +| `probe-evidence/` | `recordings/` | +| `interop-specs/` | `specs/` | +| `.probe.plan.json` | `.scenario.json` (drafts: `.scenario.draft.json`) | +| `plan.json` (inside a recording) | `scenario.json` | +| `.tfpluginframeworkgen/` | `.tfpfgen/` | +| `docs/gates.md` | `docs/checks.md` | +| `docs/examples/probe-profile.example.json` | `docs/examples/sandbox-profile.example.json` | +| `.github/workflows/dependancy-review.yml` | `.github/workflows/dependency-review.yml` | + +`blueprints/` and `pilot/` are unchanged, as are the `TFPFGEN_` environment prefix +and the `tfpfgen-probe` object prefix. + +### Vocabulary and Go API + +| Old | New | +|---|---| +| plan (the probe worksheet) | scenario — "plan" is banned outside `terraform plan` and `planModifiers` | +| snapshot / evidence (probe output) | recording — "snapshot" is the pinned OpenAPI document only | +| gate (CI job) | check | +| gate (sandbox admission) | guard | +| gate (API dispatch field) | dispatch field | +| emit | generate — render is internal template execution only | +| protocol (as a synonym for probe) | probe | +| archetype | scaffold template | +| archetype provider | reference provider | +| probe profile | sandbox profile | +| wave | batch | +| `internal/render` + `internal/emit` | `internal/generate` | +| `internal/ingest/openapi` | `internal/openapi` | +| `internal/specstore` | `internal/snapshot` | +| `internal/interop` | `internal/spec` | +| `probe.Plan` | `probe.Scenario` | +| `probe.Findings` | `probe.FactSet` | +| `cassette.Finding` | `cassette.Leak` | +| `cassette.Write` | `cassette.Record` | +| `specstore.Pin` | `snapshot.Pin` | +| `emit.Plan` | `generate.Fileset` | +| `GateOptions` | `GuardOptions` | +| `interop.Note` | `spec.Loss` | +| unprefixed enum constants | type-prefixed: `ConfidenceObserved`, `BlockKindResource`, `EntryKindIntent`, `ProbeKindRead`, … | +| `ResourceName` / `DataSourceName` / `EphemeralName` / `ActionName` (generated registration constant) | `TypeName` | +| blueprint keys `alerts_rule`, `dashboards_filter`, `TestsDnssec` | `alert_rule`, `dashboard_filter`, `TestsDNSSEC` (SDK-side names keep the SDK's spelling) | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 95f4bc12..9771d296 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,7 @@ If you are taking the time to mention a problem, even a seemingly minor one, it ## Generated artefacts are regenerated, never hand-edited This repository is a code generator, and most of what it commits is its own -output. Blueprints, probe evidence, specification snapshots and the pilot +output. Blueprints, probe recordings, OpenAPI snapshots and the pilot provider under `pilot/` are all generated. To change any of them, change the input — the blueprint, a template, the generator, or the recorded probe — and re-run the relevant command. @@ -26,7 +26,8 @@ generator change can produce a clean diff and broken code. Every generated file carries this header, and it is the authoritative signal: ```go -// Code generated by tfpluginframeworkgen from blueprints/ (sha256:…). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/ +// (sha256:…). DO NOT EDIT. ``` A small number of files are scaffolded once and then owned by you — those carry @@ -35,21 +36,21 @@ no such header, and the generator will not touch them again. The Three consequences worth knowing before opening a pull request: -- **Emitted output must be deterministic.** No timestamps, no tool version, no +- **Generated output must be deterministic.** No timestamps, no tool version, no absolute paths, and no reliance on Go map iteration order in anything written to disk. A single such value makes the drift check fail on a run that changed nothing, which destroys its usefulness. -- **Never commit a real credential to probe evidence.** Cassettes are committed +- **Never commit a real credential to a recording.** Cassettes are committed by design. Redaction allowlists header values rather than denylisting them, and a final pass fails the recording outright — exit `7`, nothing written — if any credential-shaped value survives into the output. There is nothing extra to run before pushing; the check is part of every record run, and - `probe -mode verify` re-derives committed evidence offline. -- **Regenerate with the postcheck on.** `emit` finishes by compiling the output, - regenerating its registry docs and running `terraform fmt` + `probe verify` re-derives committed recordings offline. +- **Regenerate with the postcheck on.** `provider generate` finishes by compiling + the output, regenerating its registry docs and running `terraform fmt` (`-skip-postcheck` exists for tight inner loops only). A PR that arrives with - stale `docs/` or unformatted fixtures is a PR whose final `emit` was skipped — - CI will say so, one gate later. + stale `docs/` or unformatted fixtures is a PR whose final `provider generate` + was skipped — CI will say so, one check later. diff --git a/README.md b/README.md index 92fb5cd5..92a23e80 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ and so that the first acceptance run confirms what the evidence already proved, instead of discovering what it missed. > **Status: the pilot is real.** The pipeline runs end to end and has been walked -> across five recorded waves: 23 resource blueprints, 22 resources green against -> the live API in CI, 20 committed evidence snapshots, plus data sources, an -> ephemeral and an action. The full cross-repo chain — OpenAPI spec bump → SDK +> across five recorded batches: 23 resource blueprints, 22 resources green against +> the live API in CI, 20 committed recordings, plus data sources, an +> ephemeral and an action. The full cross-repo chain — OpenAPI document bump → SDK > regeneration and release → provider re-generation → live acceptance — has been > validated once, deliberately. See [Roadmap](#roadmap). @@ -27,14 +27,14 @@ tell you the things that decide whether a Terraform provider actually works: - whether `PATCH` merges or replaces, whether create returns the object, and how long after create the thing is actually readable -A generator that trusts the specification produces providers with perpetual +A generator that trusts the OpenAPI document produces providers with perpetual diffs, spurious replacements, and `provider produced inconsistent result after apply`. The alternative, historically, is discovering each fact one production bug at a time and encoding it as a hand-maintained special case. So this toolkit **pokes the live API and records what it does**. The probe -transcripts are committed as evidence, facts are re-derived from them offline in -CI, and they feed the generator alongside the specification. +transcripts are committed as recordings, facts are re-derived from them offline +in CI, and they feed the generator alongside the OpenAPI document. The pilot taught one more lesson, big enough to reshape the pipeline: it is not enough to probe fields one behaviour at a time and let acceptance tests find the @@ -45,50 +45,60 @@ generated acceptance tests will run** — same values, same bodies, both directi ## Key features -- **A 16-probe catalogue** against a live sandbox: six read-only protocols and +- **A 16-probe catalogue** against a live sandbox: six read-only probes and ten mutating ones, ending with `write.rehearsal` — minimal→maximal and maximal→minimal lifecycles, per-hop echo comparison, in-bounds contrast values, and single-culprit bisection of refused bodies. -- **Evidence you can replay.** Every recorded run freezes its transcript, facts, - plan, subject and rehearsal bodies; CI re-derives the facts offline with egress - blocked and fails on any difference. +- **Recordings you can replay.** Every recorded run freezes its transcript, facts, + scenario, subject and rehearsal bodies; CI re-derives the facts offline with + egress blocked and fails on any difference. - **Static facts from the SDK itself.** Behaviour written into the SDK's struct tags (a zero value the encoding cannot send) is derived by inspection, not - probed, and drift-gated against the pinned SDK version. + probed, and drift-checked against the pinned SDK version. - **One fixture derivation, two renderings.** The values the probe rehearses on the wire are the values the generator renders into `minimal.tf`/`maximal.tf` — format-aware (`date-time`, `uuid`, `ipv4`, …), with curated hints and omissions where no derivation can know. -- **Deterministic, committed artefacts with a drift gate on every arrow** — - snapshots, blueprints, plans, evidence, static facts, the generated tree, the - interop export. Byte-identical regeneration is a tested property. -- **Generation finishes with the tools that gate it.** `emit` runs a postcheck - battery — compile, tfplugindocs, `terraform fmt` — so a tree that would fail CI - fails at generation time. +- **Deterministic, committed artefacts with a drift check on every arrow** — + snapshots, blueprints, scenarios, recordings, static facts, the generated tree, + the exported Provider Code Specification (codegen-spec v0.1). Byte-identical + regeneration is a tested property. +- **Generation finishes with the tools that check it.** `provider generate` runs + a postcheck battery — compile, tfplugindocs, `terraform fmt` — so a tree that + would fail CI fails at generation time. - **A hard generated/hand-written boundary**, enforced five ways, with an escape hatch that scaffolds once and never regenerates. - **Safety as structure, not convention**: mutating probes sit behind a - runtime-verified sandbox gate, every create is ledgered before it is issued, + runtime-verified sandbox guard, every create is ledgered before it is issued, cleanup is per-probe, and cassettes pass a refuse-on-detect secret scan before anything is written. ## High-level architecture +```mermaid +flowchart LR + upstream["upstream OpenAPI URL"] -- "openapi fetch" --> snap["pinned snapshot\n(openapi/)"] + snap -- "blueprint draft" --> bp["blueprints/\n(+ scenario drafts)"] + live["live API"] -- "probe record" --> rec["recordings/"] + rec -- "blueprint merge" --> bp + sdk["pinned SDK"] -- "bindings facts" --> bp + curation["human curation\n(scenarios, hints, presence)"] --> bp + bp -- "provider generate" --> prov["provider Go tree\n(pilot/)"] + prov -- "postcheck\n(build, docs, fmt)" --> done["checked provider"] + bp -. "provider generate -check\n(fails on drift)" .-> prov ``` -upstream URL ──specs──► OpenAPI snapshot ──ingest──┐ - ├──merge──► blueprint.json ──emit──► provider Go tree -live API ──probe (catalogue + rehearsal fixpoint)───┤ │ + tests, fixtures, -pinned SDK ──bindings -facts-out (static facts)─────┤ │ examples, docs - │ postcheck -human curation (plans, hints, presence) ────────────┘ (build · docs · fmt) -``` + +with drift checking: `provider generate -check`. Alongside the main line, +`bindings facts` derives static facts from the pinned SDK for `blueprint merge` +to fold in, human curation (scenarios, hints, presence) feeds the same merge, +and `provider generate` finishes with a postcheck battery (build · docs · fmt). Each arrow writes a **committed, reviewable artefact**. CI regenerates every one of them and fails on drift, then builds and tests the result — because a generator change can produce a clean diff and broken code. The -[gates](docs/gates.md) page lists every job and its local reproduction. +[checks](docs/checks.md) page lists every job and its local reproduction. -A blueprint names SDK symbols as strings, so `tfpluginframeworkgen bindings` type-checks +A blueprint names SDK symbols as strings, so `tfpfgen bindings check` type-checks them against the SDK the provider actually pins. That turns a wrong symbol from a pile of identical compile errors in generated code into one message naming the blueprint field to edit. @@ -97,22 +107,22 @@ blueprint field to edit. | Path | Contents | |---|---| -| `cmd/tfpluginframeworkgen/` | the one installable binary; stdlib `flag` subcommand dispatch | +| `cmd/tfpfgen/` | the one installable binary; stdlib `flag` subcommand dispatch | | `internal/blueprint/` | the IR, its validation, and the layered-merge engine | -| `internal/ingest/` | OpenAPI → blueprint | -| `internal/specstore/` | pinned specification snapshots: list, read, checksum, pin | -| `internal/interop/` | reads and writes `terraform-plugin-codegen-spec` v0.1 | +| `internal/openapi/` | OpenAPI document → draft blueprints | +| `internal/snapshot/` | pinned OpenAPI snapshots: list, read, checksum, pin | +| `internal/spec/` | reads and writes `terraform-plugin-codegen-spec` v0.1 | | `internal/probe/` | the API behaviour prober | | `internal/cassette/` | HTTP record/replay, redaction, deterministic canonicalisation | | `internal/fixturespec/` | the one derivation of fixture values, rendered as HCL and as wire JSON | -| `internal/emit/`, `internal/render/` | blueprint → Go; all logic lives in `render` | +| `internal/generate/` | blueprint → Go: rendering, formatting, writing, postcheck | | `internal/sdkbind/` | type-checks blueprint bindings against the pinned SDK; derives static facts | | `internal/manifest/` | what the last run produced, so orphaned files can be found | -| `internal/templates/` | embedded `.tmpl` files — the emitted shape, as reviewable text | -| `blueprints/` | committed blueprints, plans and static facts, one directory per provider | -| `probe-evidence/` | committed probe cassettes and derived facts | -| `openapi-specs/` | pinned, immutable specification snapshots | -| `interop-specs/` | the committed codegen-spec v0.1 export, drift-gated | +| `internal/templates/` | embedded `.tmpl` files — the generated shape, as reviewable text | +| `blueprints/` | committed blueprints, scenarios and static facts, one directory per provider | +| `recordings/` | committed probe recordings and derived facts | +| `openapi/` | pinned, immutable OpenAPI snapshots | +| `specs/` | the committed spec export, drift-checked | | `pilot/thousandeyes/` | a nested module: a fully generated provider, built, unit-tested and live-tested in CI | | `docs/` | architecture, guides and the CLI reference — see below | @@ -122,18 +132,19 @@ The loop, end to end (each step's full story is in the [onboarding runbook](docs/onboarding-a-new-api.md)): ```bash -tfpluginframeworkgen specs -url https://…/api.yaml -output-dir openapi-specs/PROVIDER -tfpluginframeworkgen ingest -only THING -out blueprints/PROVIDER -plan-drafts blueprints/PROVIDER -tfpluginframeworkgen bindings -blueprint blueprints/PROVIDER -module pilot/PROVIDER -tfpluginframeworkgen probe -blueprint blueprints/PROVIDER -resource THING \ - -mode record --allow-mutations -profile .tfpluginframeworkgen/sandbox/PROVIDER.json -tfpluginframeworkgen merge -blueprint blueprints/PROVIDER -facts probe-evidence/…/facts.json -tfpluginframeworkgen emit -blueprint blueprints/PROVIDER -out pilot/PROVIDER +tfpfgen openapi fetch -url https://…/api.yaml -out openapi/PROVIDER +tfpfgen blueprint draft -tag THING -out blueprints/PROVIDER -scenario-drafts blueprints/PROVIDER +tfpfgen bindings check -blueprint blueprints/PROVIDER -module pilot/PROVIDER +tfpfgen probe record -blueprint blueprints/PROVIDER -resource THING \ + -allow-mutations -profile .tfpfgen/sandbox/PROVIDER.json +tfpfgen blueprint merge -blueprint blueprints/PROVIDER -facts recordings/…/facts.json +tfpfgen provider generate -blueprint blueprints/PROVIDER -out pilot/PROVIDER ``` -The safe modes are the defaults: `probe` replays committed evidence unless told -to record, mutating runs demand a sandbox profile that proves itself at runtime, -and the token comes from `TFPFGEN_PROBE_TOKEN` — never a flag, never a file. +The safe verbs are the defaults: a bare `probe` means `probe replay`, which reads +the committed recording and never the network; mutating runs demand a sandbox +profile that proves itself at runtime, and the token comes from +`TFPFGEN_PROBE_TOKEN` — never a flag, never a file. ## What is generated and what is yours @@ -141,7 +152,8 @@ The boundary is the most important thing to understand about a generated provider. Generated files carry exactly this header, and nothing else may: ```go -// Code generated by tfpluginframeworkgen from blueprints/ (sha256:…). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/ +// (sha256:…). DO NOT EDIT. ``` Broadly: CRUD, models, schemas, registration, acceptance tests and **both** @@ -157,15 +169,16 @@ table, the five enforcement mechanisms, and the escape hatch. This toolkit is **not** a wrapper around `tfplugingen-openapi` or `tfplugingen-framework`. Those generate a schema and a model struct and stop: -they emit no CRUD logic at all, and they cannot express `dynamic` attributes, +they generate no CRUD logic at all, and they cannot express `dynamic` attributes, `int32`/`float32`, blocks, resource identity, or write-only attributes. Their renderers live under `internal/`, so there is nothing to import. What this project does adopt is the **Provider Code Specification** as an -interop format: `tfpluginframeworkgen interop` reads and writes v0.1 JSON, so -`tfplugingen-openapi` output can be ingested and the schema slice can be handed -to other tools. Everything that format cannot carry — CRUD wiring, SDK binding, -observed behaviour, test scaffolding — lives in this project's own richer IR. +interop format: `tfpfgen spec export` and `spec import` write and read v0.1 +JSON, so `tfplugingen-openapi` output can be imported and the schema slice can +be handed to other tools. Everything that format cannot carry — CRUD wiring, +SDK binding, observed behaviour, test scaffolding — lives in this project's own +richer IR. CI feeds the committed export to HashiCorp's real `tfplugingen-framework` on every PR, as a conformance oracle that does not share this repository's assumptions ([docs/interop.md](docs/interop.md)). @@ -178,24 +191,25 @@ assumptions ([docs/interop.md](docs/interop.md)). | [docs/onboarding-a-new-api.md](docs/onboarding-a-new-api.md) | the end-to-end runbook, walked ~20 times | | [docs/cli.md](docs/cli.md) | every subcommand, flag and exit code | | [docs/blueprint.md](docs/blueprint.md) | the IR, field by field | -| [docs/probing.md](docs/probing.md) | the probe catalogue, sandbox gate, ledger, budgets | +| [docs/probing.md](docs/probing.md) | the probe catalogue, sandbox guard, ledger, budgets | | [docs/fixtures-and-rehearsal.md](docs/fixtures-and-rehearsal.md) | fixture derivation and the rehearsal fixpoint | | [docs/generated-boundary.md](docs/generated-boundary.md) | what is generated, what is yours, how it is enforced | -| [docs/gates.md](docs/gates.md) | every CI gate and its local reproduction | +| [docs/checks.md](docs/checks.md) | every CI check and its local reproduction | | [docs/interop.md](docs/interop.md) | the codegen-spec v0.1 bridge | +| [docs/glossary.md](docs/glossary.md) | the glossary — every domain term, one meaning each | ## Roadmap | Phase | Delivers | State | |---|---|---| -| 0 | module, CLI skeleton, CI gates | **done** | +| 0 | module, CLI skeleton, CI checks | **done** | | 1 | walking skeleton: one resource, hand-authored blueprint → `terraform plan` | **done** | | 1b | nested attributes | **done** | -| 2 | `ingest`: OpenAPI → the same blueprint, byte-identical | **done** | +| 2 | `blueprint draft`: OpenAPI → the same blueprint, byte-identical | **done** | | 3 | `terraform-plugin-codegen-spec` v0.1 interop | **done** | -| 4 | the prober: record, replay, gating, cleanup | **done** | +| 4 | the prober: record, replay, guarding, cleanup | **done** | | 5 | block kinds: data sources, actions, identity, list resources, arbitrary-depth nesting, generated validators, read-after-write, escape hatches | **done** | -| 6 | breadth: 23 resources across five waves; probe resequencing (rehearsal, static facts, generated fixtures); postcheck; spec-refresh loop; SDK chain validated end to end | **done** | +| 6 | breadth: 23 resources across five batches; probe resequencing (rehearsal, static facts, generated fixtures); postcheck; the OpenAPI refresh loop; SDK chain validated end to end | **done** | | 7 | a second API, proving nothing is pilot-shaped | next | Three pilot resources are deferred with their reasons recorded in the blueprints: @@ -220,24 +234,24 @@ the reference provider, which is why they are last rather than next. seen is still findable; the sweeper removes by identifier and then by name prefix. Anything left is reported with a runnable `curl` and exits 5 even if every fact was gathered. See [docs/probing.md](docs/probing.md). -- **A wrong fact is worse than no fact.** Inferred field interdependencies are emitted as +- **A wrong fact is worse than no fact.** Inferred field interdependencies are recorded as documentation, never as active constraints. - **A generated validator errs toward permitting.** `OneOf` comes from the value set the - *specification documents*, not from the narrower set one tenant was observed to accept: - the documented set is the wider of the two, so a stale specification surfaces as a real - API error carrying the API's own message rather than as a plan failure nobody can work - around. Where the prober saw a documented value refused, it stays permitted and the - refusal is named in a comment beside the validator. + *OpenAPI document declares*, not from the narrower set one tenant was observed to accept: + the documented set is the wider of the two, so a stale document surfaces as a real + API error carrying the API's own message rather than as a `terraform plan` failure + nobody can work around. Where the prober saw a documented value refused, it stays + permitted and the refusal is named in a comment beside the validator. - **The rehearsal bisects one culprit at a time.** A body refused because of two *interacting* fields exceeds the bisection budget and is recorded as a refusal note for a human, not silently guessed at. -- **The prober cannot learn everything.** Licence-gated behaviour, cross-object +- **The prober cannot learn everything.** Licence-dependent behaviour, cross-object constraints, RBAC, production latency, and whether a field is *semantically* a - secret all need a human. The probe plan's deny list and the blueprint's + secret all need a human. The scenario's deny list and the blueprint's curated hints are where that boundary is drawn honestly. -- **`ingest` refuses partial resources by default.** A resource whose CRUD set is - incomplete is a curation decision, not something to guess at. -- **There is no numeric-integrality probe.** A field the specification types as +- **`blueprint draft` refuses partial resources by default.** A resource whose CRUD + set is incomplete is a curation decision, not something to guess at. +- **There is no numeric-integrality probe.** A field the OpenAPI document types as `number` is generated as `float64` even when every recorded observation of it is integral; the observations are suggestive, not a derived fact. diff --git a/SECURITY.md b/SECURITY.md index 8b41638f..fa6e13ba 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -19,12 +19,12 @@ transcripts, so its threat surface is specific and worth stating: profile loader refuses a profile containing a credential-shaped value. Anything that would move a token into a file, a flag, a log line or a committed artefact is a vulnerability — report it. -- **Committed cassettes.** Probe transcripts under `probe-evidence/` are public +- **Committed cassettes.** Probe transcripts under `recordings/` are public by design. Redaction allowlists rather than denylists, and a recording fails outright (exit `7`, nothing written) if a credential-shaped value survives. A redaction bypass — any way a secret can reach a committed cassette — is the highest-severity bug this repository can have. -- **Sandbox profiles.** `.tfpluginframeworkgen/sandbox/` is gitignored because a +- **Sandbox profiles.** `.tfpfgen/sandbox/` is gitignored because a profile carries tenant identifiers. Committed artefacts must never contain tenant names; opaque numeric identifiers are accepted. - **Generated fixtures.** The fixture derivation refuses to invent values for diff --git a/blueprints/thousandeyes/account_group.probe.plan.json b/blueprints/thousandeyes/account_group.scenario.json similarity index 100% rename from blueprints/thousandeyes/account_group.probe.plan.json rename to blueprints/thousandeyes/account_group.scenario.json diff --git a/blueprints/thousandeyes/alerts_rule.probe.plan.json b/blueprints/thousandeyes/alert_rule.scenario.json similarity index 100% rename from blueprints/thousandeyes/alerts_rule.probe.plan.json rename to blueprints/thousandeyes/alert_rule.scenario.json diff --git a/blueprints/thousandeyes/alert_suppression_window.probe.plan.json b/blueprints/thousandeyes/alert_suppression_window.scenario.json similarity index 100% rename from blueprints/thousandeyes/alert_suppression_window.probe.plan.json rename to blueprints/thousandeyes/alert_suppression_window.scenario.json diff --git a/blueprints/thousandeyes/credential.probe.plan.json b/blueprints/thousandeyes/credential.scenario.json similarity index 100% rename from blueprints/thousandeyes/credential.probe.plan.json rename to blueprints/thousandeyes/credential.scenario.json diff --git a/blueprints/thousandeyes/dashboard.probe.plan.json b/blueprints/thousandeyes/dashboard.scenario.json similarity index 100% rename from blueprints/thousandeyes/dashboard.probe.plan.json rename to blueprints/thousandeyes/dashboard.scenario.json diff --git a/blueprints/thousandeyes/dashboards_filter.probe.plan.json b/blueprints/thousandeyes/dashboard_filter.scenario.json similarity index 100% rename from blueprints/thousandeyes/dashboards_filter.probe.plan.json rename to blueprints/thousandeyes/dashboard_filter.scenario.json diff --git a/blueprints/thousandeyes/endpoint_label.probe.plan.json b/blueprints/thousandeyes/endpoint_label.scenario.json similarity index 100% rename from blueprints/thousandeyes/endpoint_label.probe.plan.json rename to blueprints/thousandeyes/endpoint_label.scenario.json diff --git a/blueprints/thousandeyes/ephemerals/credential.blueprint.json b/blueprints/thousandeyes/ephemerals/credential.blueprint.json index 13fb01ff..8f29b55b 100644 --- a/blueprints/thousandeyes/ephemerals/credential.blueprint.json +++ b/blueprints/thousandeyes/ephemerals/credential.blueprint.json @@ -5,7 +5,7 @@ "key": "credential", "name": "credential", "goPackage": "credential", - "goPackageAlias": "ephV7Credential", + "goPackageAlias": "v7CredentialEph", "goTypeName": "CredentialEphemeral", "modelTypeName": "CredentialEphemeralModel", "serviceGroup": "credentials", diff --git a/blueprints/thousandeyes/resources/alerts_rule.blueprint.json b/blueprints/thousandeyes/resources/alert_rule.blueprint.json similarity index 96% rename from blueprints/thousandeyes/resources/alerts_rule.blueprint.json rename to blueprints/thousandeyes/resources/alert_rule.blueprint.json index f8228270..1676f9f7 100644 --- a/blueprints/thousandeyes/resources/alerts_rule.blueprint.json +++ b/blueprints/thousandeyes/resources/alert_rule.blueprint.json @@ -2,12 +2,12 @@ "formatVersion": "4", "resources": [ { - "key": "alerts_rule", - "name": "alerts_rule", - "goPackage": "alerts_rule", - "goPackageAlias": "v7AlertsRule", - "goTypeName": "AlertsRuleResource", - "modelTypeName": "AlertsRuleResourceModel", + "key": "alert_rule", + "name": "alert_rule", + "goPackage": "alert_rule", + "goPackageAlias": "v7AlertRule", + "goTypeName": "AlertRuleResource", + "modelTypeName": "AlertRuleResourceModel", "serviceGroup": "alert_rules", "apiVersionDir": "v7", "schema": { @@ -369,12 +369,12 @@ "type": { "kind": "single_nested", "nestedObject": { - "goTypeName": "AlertsRuleAlertNotificationModel", + "goTypeName": "AlertRuleAlertNotificationModel", "sdkType": "alert_rules.AlertNotification", "attrTypesVar": "alertsRuleAlertNotificationAttrTypes", "objectTypeVar": "alertsRuleAlertNotificationObjectType", - "expandFunc": "expandAlertsRuleAlertNotification", - "flattenFunc": "flattenAlertsRuleAlertNotification", + "expandFunc": "expandAlertRuleAlertNotification", + "flattenFunc": "flattenAlertRuleAlertNotification", "attributes": [ { "name": "custom_webhook", @@ -382,12 +382,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "AlertsRuleNotificationCustomWebhookModel", + "goTypeName": "AlertRuleNotificationCustomWebhookModel", "sdkType": "alert_rules.NotificationCustomWebhook", "attrTypesVar": "alertsRuleNotificationCustomWebhookAttrTypes", "objectTypeVar": "alertsRuleNotificationCustomWebhookObjectType", - "expandFunc": "expandAlertsRuleNotificationCustomWebhooks", - "flattenFunc": "flattenAlertsRuleNotificationCustomWebhooks", + "expandFunc": "expandAlertRuleNotificationCustomWebhooks", + "flattenFunc": "flattenAlertRuleNotificationCustomWebhooks", "attributes": [ { "name": "integration_id", @@ -485,12 +485,12 @@ "sdkField": "CustomWebhook", "sdkGoType": "[]alert_rules.NotificationCustomWebhook", "expand": { - "func": "expandAlertsRuleNotificationCustomWebhooks", + "func": "expandAlertRuleNotificationCustomWebhooks", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenAlertsRuleNotificationCustomWebhooks", + "func": "flattenAlertRuleNotificationCustomWebhooks", "needsCtx": true, "returnsError": true } @@ -502,12 +502,12 @@ "type": { "kind": "single_nested", "nestedObject": { - "goTypeName": "AlertsRuleNotificationEmailModel", + "goTypeName": "AlertRuleNotificationEmailModel", "sdkType": "alert_rules.NotificationEmail", "attrTypesVar": "alertsRuleNotificationEmailAttrTypes", "objectTypeVar": "alertsRuleNotificationEmailObjectType", - "expandFunc": "expandAlertsRuleNotificationEmail", - "flattenFunc": "flattenAlertsRuleNotificationEmail", + "expandFunc": "expandAlertRuleNotificationEmail", + "flattenFunc": "flattenAlertRuleNotificationEmail", "attributes": [ { "name": "message", @@ -566,12 +566,12 @@ "sdkField": "Email", "sdkGoType": "*alert_rules.NotificationEmail", "expand": { - "func": "expandAlertsRuleNotificationEmail", + "func": "expandAlertRuleNotificationEmail", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenAlertsRuleNotificationEmail", + "func": "flattenAlertRuleNotificationEmail", "needsCtx": true, "returnsError": true } @@ -583,12 +583,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "AlertsRuleNotificationThirdPartyModel", + "goTypeName": "AlertRuleNotificationThirdPartyModel", "sdkType": "alert_rules.NotificationThirdParty", "attrTypesVar": "alertsRuleNotificationThirdPartyAttrTypes", "objectTypeVar": "alertsRuleNotificationThirdPartyObjectType", - "expandFunc": "expandAlertsRuleNotificationThirdParties", - "flattenFunc": "flattenAlertsRuleNotificationThirdParties", + "expandFunc": "expandAlertRuleNotificationThirdParties", + "flattenFunc": "flattenAlertRuleNotificationThirdParties", "attributes": [ { "name": "integration_id", @@ -649,12 +649,12 @@ "sdkField": "ThirdParty", "sdkGoType": "[]alert_rules.NotificationThirdParty", "expand": { - "func": "expandAlertsRuleNotificationThirdParties", + "func": "expandAlertRuleNotificationThirdParties", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenAlertsRuleNotificationThirdParties", + "func": "flattenAlertRuleNotificationThirdParties", "needsCtx": true, "returnsError": true } @@ -666,12 +666,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "AlertsRuleNotificationWebhookModel", + "goTypeName": "AlertRuleNotificationWebhookModel", "sdkType": "alert_rules.NotificationWebhook", "attrTypesVar": "alertsRuleNotificationWebhookAttrTypes", "objectTypeVar": "alertsRuleNotificationWebhookObjectType", - "expandFunc": "expandAlertsRuleNotificationWebhooks", - "flattenFunc": "flattenAlertsRuleNotificationWebhooks", + "expandFunc": "expandAlertRuleNotificationWebhooks", + "flattenFunc": "flattenAlertRuleNotificationWebhooks", "attributes": [ { "name": "integration_id", @@ -769,12 +769,12 @@ "sdkField": "Webhook", "sdkGoType": "[]alert_rules.NotificationWebhook", "expand": { - "func": "expandAlertsRuleNotificationWebhooks", + "func": "expandAlertRuleNotificationWebhooks", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenAlertsRuleNotificationWebhooks", + "func": "flattenAlertRuleNotificationWebhooks", "needsCtx": true, "returnsError": true } @@ -790,12 +790,12 @@ "sdkField": "Notifications", "sdkGoType": "*alert_rules.AlertNotification", "expand": { - "func": "expandAlertsRuleAlertNotification", + "func": "expandAlertRuleAlertNotification", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenAlertsRuleAlertNotification", + "func": "flattenAlertRuleAlertNotification", "needsCtx": true, "returnsError": true } @@ -1059,12 +1059,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "AlertsRuleAlertSimpleTestModel", + "goTypeName": "AlertRuleAlertSimpleTestModel", "sdkType": "alert_rules.AlertSimpleTest", "attrTypesVar": "alertsRuleAlertSimpleTestAttrTypes", "objectTypeVar": "alertsRuleAlertSimpleTestObjectType", - "expandFunc": "expandAlertsRuleAlertSimpleTests", - "flattenFunc": "flattenAlertsRuleAlertSimpleTests", + "expandFunc": "expandAlertRuleAlertSimpleTests", + "flattenFunc": "flattenAlertRuleAlertSimpleTests", "attributes": [ { "name": "alerts_enabled", @@ -1337,7 +1337,7 @@ "sdkField": "Tests", "sdkGoType": "[]alert_rules.AlertSimpleTest", "flatten": { - "func": "flattenAlertsRuleAlertSimpleTests", + "func": "flattenAlertRuleAlertSimpleTests", "needsCtx": true, "returnsError": true }, diff --git a/blueprints/thousandeyes/resources/dashboards_filter.blueprint.json b/blueprints/thousandeyes/resources/dashboard_filter.blueprint.json similarity index 92% rename from blueprints/thousandeyes/resources/dashboards_filter.blueprint.json rename to blueprints/thousandeyes/resources/dashboard_filter.blueprint.json index 25cff09a..9f665e44 100644 --- a/blueprints/thousandeyes/resources/dashboards_filter.blueprint.json +++ b/blueprints/thousandeyes/resources/dashboard_filter.blueprint.json @@ -2,12 +2,12 @@ "formatVersion": "4", "resources": [ { - "key": "dashboards_filter", - "name": "dashboards_filter", - "goPackage": "dashboards_filter", - "goPackageAlias": "v7DashboardsFilter", - "goTypeName": "DashboardsFilterResource", - "modelTypeName": "DashboardsFilterResourceModel", + "key": "dashboard_filter", + "name": "dashboard_filter", + "goPackage": "dashboard_filter", + "goPackageAlias": "v7DashboardFilter", + "goTypeName": "DashboardFilterResource", + "modelTypeName": "DashboardFilterResourceModel", "serviceGroup": "dashboards_filters", "apiVersionDir": "v7", "schema": { @@ -36,12 +36,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "DashboardsFilterApiContextFiltersModel", + "goTypeName": "DashboardFilterApiContextFiltersModel", "sdkType": "dashboards_filters.ApiDataSourceFilters", "attrTypesVar": "dashboardsFilterApiContextFiltersAttrTypes", "objectTypeVar": "dashboardsFilterApiContextFiltersObjectType", - "expandFunc": "expandDashboardsFilterApiContextFilterses", - "flattenFunc": "flattenDashboardsFilterApiContextFilterses", + "expandFunc": "expandDashboardFilterApiContextFilterses", + "flattenFunc": "flattenDashboardFilterApiContextFilterses", "attributes": [ { "name": "data_source_id", @@ -77,12 +77,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "DashboardsFilterApiDataSourceFilterModel", + "goTypeName": "DashboardFilterApiDataSourceFilterModel", "sdkType": "dashboards_filters.ApiDataSourceFilter", "attrTypesVar": "dashboardsFilterApiDataSourceFilterAttrTypes", "objectTypeVar": "dashboardsFilterApiDataSourceFilterObjectType", - "expandFunc": "expandDashboardsFilterApiDataSourceFilters", - "flattenFunc": "flattenDashboardsFilterApiDataSourceFilters", + "expandFunc": "expandDashboardFilterApiDataSourceFilters", + "flattenFunc": "flattenDashboardFilterApiDataSourceFilters", "attributes": [ { "name": "filter_id", @@ -188,12 +188,12 @@ "sdkField": "Filters", "sdkGoType": "[]dashboards_filters.ApiDataSourceFilter", "expand": { - "func": "expandDashboardsFilterApiDataSourceFilters", + "func": "expandDashboardFilterApiDataSourceFilters", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenDashboardsFilterApiDataSourceFilters", + "func": "flattenDashboardFilterApiDataSourceFilters", "needsCtx": true, "returnsError": true } @@ -215,13 +215,13 @@ "sdkField": "Context", "sdkGoType": "[]dashboards_filters.ApiContextFilters", "expand": { - "func": "expandDashboardsFilterApiContextFilterses", + "func": "expandDashboardFilterApiContextFilterses", "needsCtx": true, "returnsError": true, "cast": "dashboards_filters.ApiContextFilters" }, "flatten": { - "func": "flattenDashboardsFilterApiContextFilterses", + "func": "flattenDashboardFilterApiContextFilterses", "needsCtx": true, "returnsError": true } @@ -233,12 +233,12 @@ "type": { "kind": "single_nested", "nestedObject": { - "goTypeName": "DashboardsFilterApiDashboardFilterUserDetailsModel", + "goTypeName": "DashboardFilterApiDashboardFilterUserDetailsModel", "sdkType": "dashboards_filters.ApiDashboardFilterUserDetails", "attrTypesVar": "dashboardsFilterApiDashboardFilterUserDetailsAttrTypes", "objectTypeVar": "dashboardsFilterApiDashboardFilterUserDetailsObjectType", - "expandFunc": "expandDashboardsFilterApiDashboardFilterUserDetails", - "flattenFunc": "flattenDashboardsFilterApiDashboardFilterUserDetails", + "expandFunc": "expandDashboardFilterApiDashboardFilterUserDetails", + "flattenFunc": "flattenDashboardFilterApiDashboardFilterUserDetails", "attributes": [ { "name": "name", @@ -286,7 +286,7 @@ "sdkField": "CreatedBy", "sdkGoType": "*dashboards_filters.ApiDashboardFilterUserDetails", "flatten": { - "func": "flattenDashboardsFilterApiDashboardFilterUserDetails", + "func": "flattenDashboardFilterApiDashboardFilterUserDetails", "needsCtx": true, "returnsError": true }, @@ -371,12 +371,12 @@ "type": { "kind": "single_nested", "nestedObject": { - "goTypeName": "DashboardsFilterApiDashboardFilterUserDetailsModel2", + "goTypeName": "DashboardFilterApiDashboardFilterUserDetailsModel2", "sdkType": "dashboards_filters.ApiDashboardFilterUserDetails", "attrTypesVar": "dashboardsFilterApiDashboardFilterUserDetailsAttrTypes2", "objectTypeVar": "dashboardsFilterApiDashboardFilterUserDetailsObjectType2", - "expandFunc": "expandDashboardsFilterApiDashboardFilterUserDetails2", - "flattenFunc": "flattenDashboardsFilterApiDashboardFilterUserDetails2", + "expandFunc": "expandDashboardFilterApiDashboardFilterUserDetails2", + "flattenFunc": "flattenDashboardFilterApiDashboardFilterUserDetails2", "attributes": [ { "name": "name", @@ -424,7 +424,7 @@ "sdkField": "ModifiedBy", "sdkGoType": "*dashboards_filters.ApiDashboardFilterUserDetails", "flatten": { - "func": "flattenDashboardsFilterApiDashboardFilterUserDetails2", + "func": "flattenDashboardFilterApiDashboardFilterUserDetails2", "needsCtx": true, "returnsError": true }, diff --git a/blueprints/thousandeyes/resources/tests_dnssec.blueprint.json b/blueprints/thousandeyes/resources/tests_dnssec.blueprint.json index 0467bf25..58be84b7 100644 --- a/blueprints/thousandeyes/resources/tests_dnssec.blueprint.json +++ b/blueprints/thousandeyes/resources/tests_dnssec.blueprint.json @@ -5,9 +5,9 @@ "key": "tests_dnssec", "name": "tests_dnssec", "goPackage": "tests_dnssec", - "goPackageAlias": "v7TestsDnssec", - "goTypeName": "TestsDnssecResource", - "modelTypeName": "TestsDnssecResourceModel", + "goPackageAlias": "v7TestsDNSSEC", + "goTypeName": "TestsDNSSECResource", + "modelTypeName": "TestsDNSSECResourceModel", "serviceGroup": "dnssec_tests", "apiVersionDir": "v7", "schema": { @@ -18,12 +18,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "TestsDnssecAlertRuleModel", + "goTypeName": "TestsDNSSECAlertRuleModel", "sdkType": "dnssec_tests.AlertRule", "attrTypesVar": "testsDnssecAlertRuleAttrTypes", "objectTypeVar": "testsDnssecAlertRuleObjectType", - "expandFunc": "expandTestsDnssecAlertRules", - "flattenFunc": "flattenTestsDnssecAlertRules", + "expandFunc": "expandTestsDNSSECAlertRules", + "flattenFunc": "flattenTestsDNSSECAlertRules", "attributes": [ { "name": "alert_type", @@ -335,12 +335,12 @@ "sdkField": "AlertRules", "sdkGoType": "[]dnssec_tests.AlertRule", "expand": { - "func": "expandTestsDnssecAlertRules", + "func": "expandTestsDNSSECAlertRules", "needsCtx": true, "returnsError": true }, "flatten": { - "func": "flattenTestsDnssecAlertRules", + "func": "flattenTestsDNSSECAlertRules", "needsCtx": true, "returnsError": true } @@ -564,12 +564,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "TestsDnssecTestLabelsModel", + "goTypeName": "TestsDNSSECTestLabelsModel", "sdkType": "dnssec_tests.TestLabels", "attrTypesVar": "testsDnssecTestLabelsAttrTypes", "objectTypeVar": "testsDnssecTestLabelsObjectType", - "expandFunc": "expandTestsDnssecTestLabelses", - "flattenFunc": "flattenTestsDnssecTestLabelses", + "expandFunc": "expandTestsDNSSECTestLabelses", + "flattenFunc": "flattenTestsDNSSECTestLabelses", "attributes": [ { "name": "is_builtin", @@ -635,7 +635,7 @@ "sdkField": "Labels", "sdkGoType": "[]dnssec_tests.TestLabels", "flatten": { - "func": "flattenTestsDnssecTestLabelses", + "func": "flattenTestsDNSSECTestLabelses", "needsCtx": true, "returnsError": true }, @@ -755,12 +755,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "TestsDnssecTestSharedAccountsModel", + "goTypeName": "TestsDNSSECTestSharedAccountsModel", "sdkType": "dnssec_tests.TestSharedAccounts", "attrTypesVar": "testsDnssecTestSharedAccountsAttrTypes", "objectTypeVar": "testsDnssecTestSharedAccountsObjectType", - "expandFunc": "expandTestsDnssecTestSharedAccountses", - "flattenFunc": "flattenTestsDnssecTestSharedAccountses", + "expandFunc": "expandTestsDNSSECTestSharedAccountses", + "flattenFunc": "flattenTestsDNSSECTestSharedAccountses", "attributes": [ { "name": "aid", @@ -808,7 +808,7 @@ "sdkField": "SharedWithAccounts", "sdkGoType": "[]dnssec_tests.TestSharedAccounts", "flatten": { - "func": "flattenTestsDnssecTestSharedAccountses", + "func": "flattenTestsDNSSECTestSharedAccountses", "needsCtx": true, "returnsError": true }, @@ -822,12 +822,12 @@ "type": { "kind": "set_nested", "nestedObject": { - "goTypeName": "TestsDnssecTestTagsModel", + "goTypeName": "TestsDNSSECTestTagsModel", "sdkType": "dnssec_tests.TestTags", "attrTypesVar": "testsDnssecTestTagsAttrTypes", "objectTypeVar": "testsDnssecTestTagsObjectType", - "expandFunc": "expandTestsDnssecTestTagses", - "flattenFunc": "flattenTestsDnssecTestTagses", + "expandFunc": "expandTestsDNSSECTestTagses", + "flattenFunc": "flattenTestsDNSSECTestTagses", "attributes": [ { "name": "id", @@ -893,7 +893,7 @@ "sdkField": "Tags", "sdkGoType": "[]dnssec_tests.TestTags", "flatten": { - "func": "flattenTestsDnssecTestTagses", + "func": "flattenTestsDNSSECTestTagses", "needsCtx": true, "returnsError": true }, diff --git a/blueprints/thousandeyes/role.probe.plan.json b/blueprints/thousandeyes/role.scenario.json similarity index 100% rename from blueprints/thousandeyes/role.probe.plan.json rename to blueprints/thousandeyes/role.scenario.json diff --git a/blueprints/thousandeyes/static.facts.json b/blueprints/thousandeyes/static.facts.json index 71ad125b..fb0b4bae 100644 --- a/blueprints/thousandeyes/static.facts.json +++ b/blueprints/thousandeyes/static.facts.json @@ -1,6 +1,6 @@ [ { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "field": "zeroValueUnsendable", "value": { @@ -14,7 +14,7 @@ "rationale": "the SDK declares this field value-typed with omitempty, so its zero value is dropped by the encoder before any request is sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "direction", "field": "zeroValueUnsendable", "value": { @@ -28,7 +28,7 @@ "rationale": "the SDK declares this field value-typed with omitempty, so its zero value is dropped by the encoder before any request is sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "zeroValueUnsendable", "value": { @@ -42,7 +42,7 @@ "rationale": "the SDK declares this field value-typed with omitempty, so its zero value is dropped by the encoder before any request is sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "zeroValueUnsendable", "value": { diff --git a/blueprints/thousandeyes/tag.probe.plan.json b/blueprints/thousandeyes/tag.scenario.json similarity index 100% rename from blueprints/thousandeyes/tag.probe.plan.json rename to blueprints/thousandeyes/tag.scenario.json diff --git a/blueprints/thousandeyes/tests_agent_to_agent.probe.plan.draft.json b/blueprints/thousandeyes/tests_agent_to_agent.scenario.draft.json similarity index 100% rename from blueprints/thousandeyes/tests_agent_to_agent.probe.plan.draft.json rename to blueprints/thousandeyes/tests_agent_to_agent.scenario.draft.json diff --git a/blueprints/thousandeyes/tests_agent_to_server.probe.plan.json b/blueprints/thousandeyes/tests_agent_to_server.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_agent_to_server.probe.plan.json rename to blueprints/thousandeyes/tests_agent_to_server.scenario.json diff --git a/blueprints/thousandeyes/tests_api.probe.plan.json b/blueprints/thousandeyes/tests_api.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_api.probe.plan.json rename to blueprints/thousandeyes/tests_api.scenario.json diff --git a/blueprints/thousandeyes/tests_bgp.probe.plan.json b/blueprints/thousandeyes/tests_bgp.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_bgp.probe.plan.json rename to blueprints/thousandeyes/tests_bgp.scenario.json diff --git a/blueprints/thousandeyes/tests_dns_server.probe.plan.json b/blueprints/thousandeyes/tests_dns_server.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_dns_server.probe.plan.json rename to blueprints/thousandeyes/tests_dns_server.scenario.json diff --git a/blueprints/thousandeyes/tests_dns_trace.probe.plan.json b/blueprints/thousandeyes/tests_dns_trace.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_dns_trace.probe.plan.json rename to blueprints/thousandeyes/tests_dns_trace.scenario.json diff --git a/blueprints/thousandeyes/tests_dnssec.probe.plan.json b/blueprints/thousandeyes/tests_dnssec.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_dnssec.probe.plan.json rename to blueprints/thousandeyes/tests_dnssec.scenario.json diff --git a/blueprints/thousandeyes/tests_ftp_server.probe.plan.json b/blueprints/thousandeyes/tests_ftp_server.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_ftp_server.probe.plan.json rename to blueprints/thousandeyes/tests_ftp_server.scenario.json diff --git a/blueprints/thousandeyes/tests_http_server.probe.plan.json b/blueprints/thousandeyes/tests_http_server.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_http_server.probe.plan.json rename to blueprints/thousandeyes/tests_http_server.scenario.json diff --git a/blueprints/thousandeyes/tests_page_load.probe.plan.json b/blueprints/thousandeyes/tests_page_load.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_page_load.probe.plan.json rename to blueprints/thousandeyes/tests_page_load.scenario.json diff --git a/blueprints/thousandeyes/tests_sip_server.probe.plan.draft.json b/blueprints/thousandeyes/tests_sip_server.scenario.draft.json similarity index 100% rename from blueprints/thousandeyes/tests_sip_server.probe.plan.draft.json rename to blueprints/thousandeyes/tests_sip_server.scenario.draft.json diff --git a/blueprints/thousandeyes/tests_voice.probe.plan.draft.json b/blueprints/thousandeyes/tests_voice.scenario.draft.json similarity index 100% rename from blueprints/thousandeyes/tests_voice.probe.plan.draft.json rename to blueprints/thousandeyes/tests_voice.scenario.draft.json diff --git a/blueprints/thousandeyes/tests_web_transaction.probe.plan.json b/blueprints/thousandeyes/tests_web_transaction.scenario.json similarity index 100% rename from blueprints/thousandeyes/tests_web_transaction.probe.plan.json rename to blueprints/thousandeyes/tests_web_transaction.scenario.json diff --git a/blueprints/thousandeyes/user.probe.plan.json b/blueprints/thousandeyes/user.scenario.json similarity index 100% rename from blueprints/thousandeyes/user.probe.plan.json rename to blueprints/thousandeyes/user.scenario.json diff --git a/cmd/tfpluginframeworkgen/bindings.go b/cmd/tfpfgen/bindings.go similarity index 54% rename from cmd/tfpluginframeworkgen/bindings.go rename to cmd/tfpfgen/bindings.go index 5a494158..31df903a 100644 --- a/cmd/tfpluginframeworkgen/bindings.go +++ b/cmd/tfpfgen/bindings.go @@ -3,6 +3,7 @@ package main import ( "bytes" "encoding/json" + "flag" "fmt" "log" "os" @@ -11,39 +12,99 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/sdkbind" ) -func runBindings(args []string) error { - fs, _ := newFlagSet("bindings", "bindings -blueprint DIR -module DIR") - - var ( - blueprintPath = fs.String("blueprint", "", "blueprint file or directory (required)") - module = fs.String("module", "", "directory of a module that depends on the SDK (required)") - factsOut = fs.String("facts-out", "", - "write statically derived facts (zero-value unsendable) to FILE") - factsCheck = fs.String("facts-check", "", - "re-derive static facts and fail when FILE differs -- the drift gate for a "+ - "committed static facts document") - ) +const ( + usageBindingsCheck = "bindings check -blueprint DIR -module DIR" + usageBindingsFacts = "bindings facts -blueprint DIR -module DIR -out FILE [-check]" +) + +// bindingsVerbs is the bindings group's verb table. +var bindingsVerbs = []command{ + { + name: "check", + summary: "check blueprint SDK bindings against the pinned SDK", + usage: usageBindingsCheck, + run: runBindingsCheck, + }, + { + name: "facts", + summary: "derive static facts from the pinned SDK's types", + usage: usageBindingsFacts, + run: runBindingsFacts, + }, +} + +func runBindingsGroup(args []string) error { + return runVerbs("bindings", bindingsVerbs, "", args) +} + +// bindingsFlags is the flag set the two bindings verbs share. +func bindingsFlags(verb, usage string) (*flag.FlagSet, *string, *string) { + fs, _ := newFlagSet(verb, usage) + blueprintPath := fs.String("blueprint", "", "blueprint file or directory (required)") + module := fs.String("module", "", "directory of a module that depends on the SDK (required)") + return fs, blueprintPath, module +} + +func runBindingsCheck(args []string) error { + fs, blueprintPath, module := bindingsFlags("bindings check", usageBindingsCheck) + + if err := parse(fs, args); err != nil { + return err + } + + bp, err := loadBindingsBlueprint(*blueprintPath, *module) + if err != nil { + return err + } + + return checkBindings(bp, *module) +} + +func runBindingsFacts(args []string) error { + fs, blueprintPath, module := bindingsFlags("bindings facts", usageBindingsFacts) + out := fs.String("out", "", "write the statically derived facts (zero-value unsendable) here (required)") + check := fs.Bool("check", false, + "write nothing; re-derive the facts and fail when -out's file differs -- the "+ + "drift gate for a committed static facts document") if err := parse(fs, args); err != nil { return err } - if *blueprintPath == "" { - return usagef("-blueprint is required") + if *out == "" { + return usagef("-out is required: it names the static facts document to write or, with -check, to compare against") + } + + bp, err := loadBindingsBlueprint(*blueprintPath, *module) + if err != nil { + return err + } + + if *check { + return staticFacts(bp, *module, "", *out) + } + return staticFacts(bp, *module, *out, "") +} + +// loadBindingsBlueprint validates the shared flags and loads the blueprint. +func loadBindingsBlueprint(blueprintPath, module string) (blueprint.Blueprint, error) { + if blueprintPath == "" { + return blueprint.Blueprint{}, usagef("-blueprint is required") } // The SDK is resolved from a module that depends on it, so the version checked // is the version the provider will actually compile against rather than // whatever happens to be in a local checkout. The toolkit's own module // deliberately depends on no provider SDK, so it cannot be used here. - if *module == "" { - return usagef("-module is required: it names a module whose go.mod pins the SDK, " + + if module == "" { + return blueprint.Blueprint{}, usagef("-module is required: it names a module whose go.mod pins the SDK, " + "normally the generated provider's own directory") } - bp, err := blueprint.LoadDir(*blueprintPath) - if err != nil { - return err - } + return blueprint.LoadDir(blueprintPath) +} + +// checkBindings verifies every declared binding against the pinned SDK. +func checkBindings(bp blueprint.Blueprint, module string) error { // Counted per kind rather than as one number, because this said "resource binding // set(s)" while verifying only resources -- so a blueprint whose data sources and actions @@ -58,11 +119,11 @@ func runBindings(args []string) error { log.Printf( "verifying bindings against the SDK pinned by %s: "+ "%d resource(s), %d data source(s), %d list facet(s), %d action(s), %d ephemeral(s)", - *module, len(bp.Resources), len(bp.DataSources), lists, len(bp.Actions), + module, len(bp.Resources), len(bp.DataSources), lists, len(bp.Actions), len(bp.Ephemerals), ) - report := sdkbind.Verify(sdkbind.NewLoader(*module), bp) + report := sdkbind.Verify(sdkbind.NewLoader(module), bp) if err := report.Err(); err != nil { // A one-line annotation for the checks UI. The detail is left to main, so @@ -83,14 +144,10 @@ func runBindings(args []string) error { // Named warnings, not failures: a value-typed struct the provider can never // omit is an SDK defect to fix, and the resource may be deliberately gated on // it -- but nobody should meet it first as a live 400 naming nothing. - for _, w := range sdkbind.UnsendableStructWarnings(sdkbind.NewLoader(*module), bp) { + for _, w := range sdkbind.UnsendableStructWarnings(sdkbind.NewLoader(module), bp) { fmt.Fprintf(os.Stderr, "::warning::%s\n", w) } - if *factsOut != "" || *factsCheck != "" { - return staticFacts(bp, *module, *factsOut, *factsCheck) - } - return nil } @@ -126,7 +183,7 @@ func staticFacts(bp blueprint.Blueprint, module, out, check string) error { fmt.Fprintf(os.Stderr, "::error::the committed static facts have drifted from the pinned SDK\n") return fmt.Errorf("static facts drift: %s no longer matches a fresh derivation; "+ - "regenerate with -facts-out and review the diff", check) + "regenerate with `bindings facts -out` and review the diff", check) } log.Printf("✅ static facts match the pinned SDK") } diff --git a/cmd/tfpfgen/blueprint.go b/cmd/tfpfgen/blueprint.go new file mode 100644 index 00000000..0bb88ac7 --- /dev/null +++ b/cmd/tfpfgen/blueprint.go @@ -0,0 +1,42 @@ +package main + +// blueprintVerbs is the blueprint group's verb table. draft and merge are the +// two built stages; validate, diff and list are registered up front so the help +// output describes the intended surface and a user who reaches for a missing +// verb gets a straight answer instead of "unknown verb". +var blueprintVerbs = []command{ + { + name: "draft", + summary: "infer draft blueprints from an OpenAPI snapshot", + usage: usageBlueprintDraft, + run: runBlueprintDraft, + }, + { + name: "merge", + summary: "fold probe facts into a blueprint", + usage: usageBlueprintMerge, + run: runBlueprintMerge, + }, + { + name: "validate", + summary: "validate blueprints without generating anything", + usage: "blueprint validate [flags]", + run: notImplemented("blueprint validate"), + }, + { + name: "diff", + summary: "diff two blueprints", + usage: "blueprint diff [flags]", + run: notImplemented("blueprint diff"), + }, + { + name: "list", + summary: "list the blueprints a directory holds", + usage: "blueprint list [flags]", + run: notImplemented("blueprint list"), + }, +} + +func runBlueprint(args []string) error { + return runVerbs("blueprint", blueprintVerbs, "", args) +} diff --git a/cmd/tfpluginframeworkgen/ingest.go b/cmd/tfpfgen/blueprint_draft.go similarity index 70% rename from cmd/tfpluginframeworkgen/ingest.go rename to cmd/tfpfgen/blueprint_draft.go index 584c92c7..b1c44d5c 100644 --- a/cmd/tfpluginframeworkgen/ingest.go +++ b/cmd/tfpfgen/blueprint_draft.go @@ -11,38 +11,40 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/ingest/openapi" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/openapi" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/specstore" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/snapshot" ) -func runIngest(args []string) error { - fs, _ := newFlagSet("ingest", "ingest [-spec-root DIR] [-snapshot NAME] [-only TAG] [-list]") +const usageBlueprintDraft = "blueprint draft [-openapi-dir DIR] [-snapshot NAME] [-tag TAG] [-out DIR] [-dry-run]" + +func runBlueprintDraft(args []string) error { + fs, _ := newFlagSet("blueprint draft", usageBlueprintDraft) var ( - specRoot = fs.String("spec-root", "openapi-specs/thousandeyes", "directory holding pinned snapshots") - snapshot = fs.String("snapshot", "", "snapshot to read (default: the newest)") - specPath = fs.String("spec", "", "read this document directly, bypassing the snapshot store") - only = fs.String("only", "", + openapiDir = fs.String("openapi-dir", "openapi/thousandeyes", "directory holding pinned OpenAPI snapshots") + snapshot = fs.String("snapshot", "", "snapshot to read (default: the newest)") + openapiPath = fs.String("openapi", "", "read this OpenAPI document directly, bypassing the snapshot store") + tag = fs.String("tag", "", "restrict to candidates whose tag or key contains this; comma-separate several") - list = fs.Bool("list", false, "list what the document offers and exit") - all = fs.Bool("all", false, "include candidates that cannot become resources or data sources") - out = fs.String("out", "", "write inferred blueprints under this directory") - provider = fs.String("provider", "thousandeyes", "provider name, which prefixes every resource type") - sdkRoot = fs.String("sdk-service-root", + dryRun = fs.Bool("dry-run", false, "list what the document offers and write nothing") + includeUnusable = fs.Bool("include-unusable", false, "include candidates that cannot become resources or data sources") + out = fs.String("out", "", "write inferred blueprints under this directory") + provider = fs.String("provider", "thousandeyes", "provider name, which prefixes every resource type") + sdkRoot = fs.String("sdk-service-root", "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api", "import prefix the SDK's service packages live under") - accessor = fs.String("sdk-accessor", "r.client.API", "expression reaching a service from the resource receiver") - apiVersionDir = fs.String("api-version-dir", "v7", "version directory generated packages live under") - planDrafts = fs.String("plan-drafts", "", - "also scaffold a KEY.probe.plan.draft.json worksheet per resource under this directory") + accessor = fs.String("sdk-accessor", "r.client.API", "expression reaching a service from the resource receiver") + apiVersionDir = fs.String("api-version-dir", "v7", "version directory generated packages live under") + scenarioDrafts = fs.String("scenario-drafts", "", + "also scaffold a KEY.scenario.draft.json scenario worksheet per resource under this directory") ) if err := parse(fs, args); err != nil { return err } - path, err := resolveSpecPath(*specPath, *specRoot, *snapshot) + path, err := resolveOpenAPIPath(*openapiPath, *openapiDir, *snapshot) if err != nil { return err } @@ -54,18 +56,18 @@ func runIngest(args []string) error { log.Printf("specification: %s (%s %s)", path, doc.Title, doc.Version) - candidates := filterCandidates(doc.Discover(), *only, *all) + candidates := filterCandidates(doc.Discover(), *tag, *includeUnusable) if len(candidates) == 0 { return fmt.Errorf("%w: no candidates matched", errNothingToDo) } - if *list { + if *dryRun { printCandidates(candidates) return nil } if *out == "" { - return usagef("-out is required unless -list is given") + return usagef("-out is required unless -dry-run is given") } opts := openapi.InferOptions{ @@ -75,7 +77,7 @@ func runIngest(args []string) error { APIVersionDir: *apiVersionDir, } - return inferAll(doc, candidates, opts, *out, *planDrafts) + return inferAll(doc, candidates, opts, *out, *scenarioDrafts) } func inferAll( @@ -86,13 +88,13 @@ func inferAll( planDrafts string, ) error { var ( - notes []openapi.Note + notes []openapi.Caveat written int skipped int ) for _, c := range candidates { - if kind, why := c.Classify(); kind != openapi.KindResource { + if kind, why := c.Classify(); kind != openapi.CandidateKindResource { // Said out loud rather than silently skipped: silence reads as agreement, // and a data source or action the spec offers deserves at least a line // saying inference does not reach it yet. @@ -122,7 +124,7 @@ func inferAll( written++ if planDrafts != "" { - if err := writePlanDraft(planDrafts, bp, res); err != nil { + if err := writeScenarioDraft(planDrafts, bp, res); err != nil { return err } } @@ -139,14 +141,14 @@ func inferAll( return nil } -// writePlanDraft scaffolds one resource's probe-plan worksheet. +// writeScenarioDraft scaffolds one resource's probe-plan worksheet. // // The .draft.json suffix is the whole mechanism, borrowed from interop's drafts: no -// loader resolves it -- the bulk record driver reads only KEY.probe.plan.json -- so a +// loader resolves it -- the bulk record driver reads only KEY.scenario.json -- so a // scaffold nobody has curated can never be recorded against by accident. Promotion is // a rename, which is a diff a reviewer sees. An existing draft is never overwritten: // a worksheet somebody has started marking up is theirs. -func writePlanDraft(dir string, bp blueprint.Blueprint, res blueprint.Resource) error { +func writeScenarioDraft(dir string, bp blueprint.Blueprint, res blueprint.Resource) error { subj, err := probe.SubjectOf(bp, res) if err != nil { // A resource the prober cannot subject at all gets no worksheet; the probe @@ -155,13 +157,13 @@ func writePlanDraft(dir string, bp blueprint.Blueprint, res blueprint.Resource) return nil } - path := filepath.Join(dir, res.Key+".probe.plan.draft.json") + path := filepath.Join(dir, res.Key+".scenario.draft.json") if _, err := os.Stat(path); err == nil { log.Printf("kept %s (already exists; drafts are never overwritten)", path) return nil } - data, err := json.MarshalIndent(probe.DraftPlan(subj), "", " ") + data, err := json.MarshalIndent(probe.DraftScenario(subj), "", " ") if err != nil { return fmt.Errorf("marshalling the %s plan draft: %w", res.Key, err) } @@ -184,7 +186,7 @@ func writePlanDraft(dir string, bp blueprint.Blueprint, res blueprint.Resource) // This is as much the output as the blueprints are. A generator that silently // drops what it cannot express produces a provider that looks complete and is // not, so every skipped field is named. -func printNotes(notes []openapi.Note) { +func printNotes(notes []openapi.Caveat) { if len(notes) == 0 { return } @@ -195,15 +197,15 @@ func printNotes(notes []openapi.Note) { } } -// resolveSpecPath picks the document to read. -func resolveSpecPath(specPath, specRoot, snapshotName string) (string, error) { +// resolveOpenAPIPath picks the document to read. +func resolveOpenAPIPath(openapiPath, openapiDir, snapshotName string) (string, error) { // An explicit path is for inspecting a document that is not pinned yet. // Everything reproducible goes through the snapshot store. - if specPath != "" { - return specPath, nil + if openapiPath != "" { + return openapiPath, nil } - snap, err := specstore.Find(specRoot, snapshotName) + snap, err := snapshot.Find(openapiDir, snapshotName) if err != nil { return "", err } @@ -218,15 +220,15 @@ func resolveSpecPath(specPath, specRoot, snapshotName string) (string, error) { return snap.SpecPath(), nil } -func filterCandidates(in []openapi.Candidate, only string, includeUnusable bool) []openapi.Candidate { +func filterCandidates(in []openapi.Candidate, tag string, includeUnusable bool) []openapi.Candidate { out := make([]openapi.Candidate, 0, len(in)) for _, c := range in { kind, _ := c.Classify() - if kind == openapi.KindNeither && !includeUnusable { + if kind == openapi.CandidateKindNeither && !includeUnusable { continue } - if only != "" && !matches(c, only) { + if tag != "" && !matches(c, tag) { continue } out = append(out, c) @@ -237,7 +239,7 @@ func filterCandidates(in []openapi.Candidate, only string, includeUnusable bool) // matches reports whether a candidate matches any of the comma-separated terms. // -// Any-of rather than all-of, because the flag's job is selecting a wave: `-only +// Any-of rather than all-of, because the flag's job is selecting a batch: `-tag // tests,alerts,dashboards` names three areas, and no candidate belongs to all three. func matches(c openapi.Candidate, want string) bool { for _, term := range strings.Split(want, ",") { @@ -271,11 +273,11 @@ func printCandidates(candidates []openapi.Candidate) { for _, c := range candidates { kind, why := c.Classify() switch kind { - case openapi.KindResource: + case openapi.CandidateKindResource: resources++ - case openapi.KindDataSource: + case openapi.CandidateKindDataSource: dataSources++ - case openapi.KindNeither: + case openapi.CandidateKindNeither: } extra := "" diff --git a/cmd/tfpluginframeworkgen/merge.go b/cmd/tfpfgen/blueprint_merge.go similarity index 88% rename from cmd/tfpluginframeworkgen/merge.go rename to cmd/tfpfgen/blueprint_merge.go index 9ee242b6..f763d493 100644 --- a/cmd/tfpluginframeworkgen/merge.go +++ b/cmd/tfpfgen/blueprint_merge.go @@ -13,11 +13,11 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe" ) -const usageMerge = "merge -blueprint DIR -facts FILE [-strategy annotate|apply] [-check] " + - "[-accept-conflicts] [-github-summary PATH]" +const usageBlueprintMerge = "blueprint merge -blueprint DIR -facts FILE [-strategy annotate|apply] " + + "[-check] [-allow-conflicts] [-summary PATH]" -func runMerge(args []string) error { - fs, _ := newFlagSet("merge", usageMerge) +func runBlueprintMerge(args []string) error { + fs, _ := newFlagSet("blueprint merge", usageBlueprintMerge) var ( blueprintPath = fs.String("blueprint", "", "blueprint file or directory (required)") @@ -26,15 +26,15 @@ func runMerge(args []string) error { "annotate writes behaviour and descriptions; apply may also widen presence") check = fs.Bool("check", false, "write nothing and exit 1 if merging would change anything") - acceptConflicts = fs.Bool("accept-conflicts", false, + allowConflicts = fs.Bool("allow-conflicts", false, "suppress the conflict exit code; conflicts are still reported and still not applied") - snapshotID = fs.String("snapshot-id", "", - "identifies the evidence in the description marker; defaults to the facts file's directory") - promoteDir = fs.String("promote-plans", "", - "directory of KEY.probe.plan.json files whose fixture values are promoted into "+ + recordingID = fs.String("recording", "", + "identifies the recording in the description marker; defaults to the facts file's directory") + adoptDir = fs.String("adopt-scenarios", "", + "directory of KEY.scenario.json scenario files whose fixture values are adopted into "+ "accFixture wire hints, for attributes the generator refuses to derive") - summaryPath = fs.String("github-summary", os.Getenv("GITHUB_STEP_SUMMARY"), - "append a summary here") + summaryPath = fs.String("summary", os.Getenv("GITHUB_STEP_SUMMARY"), + "append a markdown summary here (defaults to $GITHUB_STEP_SUMMARY)") ) if err := parse(fs, args); err != nil { @@ -76,14 +76,14 @@ func runMerge(args []string) error { return fmt.Errorf("%w: %s holds no facts", errNothingToDo, *factsPath) } - id := *snapshotID + id := *recordingID switch { case id != "": case allStatic(facts): // Static facts write their own description channel under a fixed id: they are not // tied to any recording, and letting them default to a directory name made them // overwrite every live block -- after which re-merging the snapshot read as drift. - id = merge.StaticSnapshotID + id = merge.StaticRecordingID default: // The snapshot directory name, which is what cassette.Write produced. Using it means // re-merging the same evidence is a no-op while newer evidence produces a visible @@ -92,15 +92,15 @@ func runMerge(args []string) error { } result, err := merge.Apply(&bp, facts, merge.Options{ - Strategy: merge.Strategy(*strategy), - SnapshotID: id, + Strategy: merge.Strategy(*strategy), + RecordingID: id, }) if err != nil { return err } - if *promoteDir != "" { - promoted, err := promotePlans(&bp, *promoteDir) + if *adoptDir != "" { + promoted, err := adoptScenarios(&bp, *adoptDir) if err != nil { return err } @@ -109,7 +109,7 @@ func runMerge(args []string) error { // like an unfolded fact: drift, not decoration. result.Changes = append(result.Changes, merge.Change{ Resource: "accFixture", - What: "plan-fixture values promoted to wire hints", + What: "scenario fixture values adopted as wire hints", To: fmt.Sprintf("%d hint(s)", promoted), }) } @@ -136,12 +136,12 @@ func runMerge(args []string) error { log.Printf("✅ the blueprint is up to date with %s", *factsPath) - return conflictErr(result, *acceptConflicts) + return conflictErr(result, *allowConflicts) } if !result.Changed() { log.Printf("the blueprint already reflects %s", *factsPath) - return conflictErr(result, *acceptConflicts) + return conflictErr(result, *allowConflicts) } if err := writeBlueprints(*blueprintPath, bp); err != nil { @@ -150,12 +150,12 @@ func runMerge(args []string) error { log.Printf("folded %d change(s) into %s", len(result.Changes), *blueprintPath) - return conflictErr(result, *acceptConflicts) + return conflictErr(result, *allowConflicts) } // conflictErr returns the conflict error unless it was accepted. // -// -accept-conflicts suppresses the exit code only. It never applies anything: a flag that made +// -allow-conflicts suppresses the exit code only. It never applies anything: a flag that made // merge overrule a human's curated decision would defeat the entire precedence design, so the // only thing it can turn off is the non-zero exit. func conflictErr(result merge.Result, accepted bool) error { diff --git a/cmd/tfpluginframeworkgen/merge_test.go b/cmd/tfpfgen/blueprint_merge_test.go similarity index 91% rename from cmd/tfpluginframeworkgen/merge_test.go rename to cmd/tfpfgen/blueprint_merge_test.go index 13b4132c..490fd856 100644 --- a/cmd/tfpluginframeworkgen/merge_test.go +++ b/cmd/tfpfgen/blueprint_merge_test.go @@ -65,7 +65,7 @@ func TestUnit_CLI_Merge_NoServerDefaultConflicts(t *testing.T) { dir := copyBlueprints(t) before := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")) - err := runMerge([]string{ + err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("color-no-default.json"), "-strategy", "apply", "-q", }) @@ -90,7 +90,7 @@ func TestUnit_CLI_Merge_CorroboratedDefaultApplies(t *testing.T) { dir := copyBlueprints(t) - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("access-type-default.json"), "-strategy", "apply", "-q", }); err != nil { @@ -131,7 +131,7 @@ func TestUnit_CLI_Merge_ResourceFragmentsCarryNoProviderBlock(t *testing.T) { dir := copyBlueprints(t) - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("access-type-default.json"), "-strategy", "apply", "-q", }); err != nil { @@ -161,7 +161,7 @@ func TestUnit_CLI_Merge_CheckIsTheCIGate(t *testing.T) { dir := copyBlueprints(t) before := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")) - err := runMerge([]string{ + err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("access-type-default.json"), "-strategy", "apply", "-check", "-q", }) @@ -175,14 +175,14 @@ func TestUnit_CLI_Merge_CheckIsTheCIGate(t *testing.T) { // Once folded in, -check passes -- which is what makes it usable as a gate rather than a // permanent failure. - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("access-type-default.json"), "-strategy", "apply", "-q", }); err != nil { t.Fatalf("merge: %v", err) } - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("access-type-default.json"), "-strategy", "apply", "-check", "-q", }); err != nil { @@ -201,12 +201,12 @@ func TestUnit_CLI_Merge_IsIdempotentThroughTheCLI(t *testing.T) { "-strategy", "apply", "-q", } - if err := runMerge(args); err != nil { + if err := runBlueprintMerge(args); err != nil { t.Fatalf("first merge: %v", err) } first := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")) - if err := runMerge(args); err != nil { + if err := runBlueprintMerge(args); err != nil { t.Fatalf("second merge: %v", err) } second := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")) @@ -226,15 +226,15 @@ func TestUnit_CLI_Merge_AcceptConflictsSuppressesOnlyTheExitCode(t *testing.T) { dir := copyBlueprints(t) before := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")) - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("color-no-default.json"), - "-strategy", "apply", "-accept-conflicts", "-q", + "-strategy", "apply", "-allow-conflicts", "-q", }); err != nil { - t.Errorf("-accept-conflicts should suppress the exit code: %v", err) + t.Errorf("-allow-conflicts should suppress the exit code: %v", err) } if after := readFile(t, filepath.Join(dir, "resources", "tag.blueprint.json")); after != before { - t.Error("-accept-conflicts must not apply the conflicting change") + t.Error("-allow-conflicts must not apply the conflicting change") } } @@ -244,9 +244,9 @@ func TestUnit_CLI_Merge_WritesAStepSummary(t *testing.T) { dir := copyBlueprints(t) summary := filepath.Join(t.TempDir(), "summary.md") - _ = runMerge([]string{ + _ = runBlueprintMerge([]string{ "-blueprint", dir, "-facts", factsFile("color-no-default.json"), - "-github-summary", summary, "-q", + "-summary", summary, "-q", }) got := readFile(t, summary) @@ -272,7 +272,7 @@ func TestUnit_CLI_Merge_RejectsBadUsage(t *testing.T) { t.Parallel() var ue *usageError - if err := runMerge(args); !errors.As(err, &ue) { + if err := runBlueprintMerge(args); !errors.As(err, &ue) { t.Errorf("error = %v, want a usageError", err) } }) @@ -280,7 +280,7 @@ func TestUnit_CLI_Merge_RejectsBadUsage(t *testing.T) { // A facts file that does not exist, and one holding an invalid fact, are input errors rather // than usage errors -- and the second matters: a fact with no evidence must not reach merge. - if err := runMerge([]string{ + if err := runBlueprintMerge([]string{ "-blueprint", blueprintDir(), "-facts", filepath.Join(t.TempDir(), "absent.json"), "-q", }); err == nil { t.Error("a missing facts file must fail") @@ -290,7 +290,7 @@ func TestUnit_CLI_Merge_RejectsBadUsage(t *testing.T) { if err := os.WriteFile(bad, []byte(`[{"resource":"tag","field":"writable"}]`), 0o600); err != nil { t.Fatalf("WriteFile: %v", err) } - if err := runMerge([]string{"-blueprint", blueprintDir(), "-facts", bad, "-q"}); err == nil { + if err := runBlueprintMerge([]string{"-blueprint", blueprintDir(), "-facts", bad, "-q"}); err == nil { t.Error("a fact with no evidence must be refused on load") } @@ -298,7 +298,7 @@ func TestUnit_CLI_Merge_RejectsBadUsage(t *testing.T) { if err := os.WriteFile(empty, []byte(`[]`), 0o600); err != nil { t.Fatalf("WriteFile: %v", err) } - if err := runMerge([]string{"-blueprint", blueprintDir(), "-facts", empty, "-q"}); !errors.Is(err, errNothingToDo) { + if err := runBlueprintMerge([]string{"-blueprint", blueprintDir(), "-facts", empty, "-q"}); !errors.Is(err, errNothingToDo) { t.Errorf("an empty facts file = %v, want errNothingToDo", err) } } diff --git a/cmd/tfpluginframeworkgen/commands.go b/cmd/tfpfgen/commands.go similarity index 51% rename from cmd/tfpluginframeworkgen/commands.go rename to cmd/tfpfgen/commands.go index f2aec983..056beba6 100644 --- a/cmd/tfpluginframeworkgen/commands.go +++ b/cmd/tfpfgen/commands.go @@ -7,10 +7,11 @@ import ( "io" "log" "os" + "strings" ) -// command is one subcommand. run receives the arguments after the subcommand -// name and owns its own flag parsing, so adding a flag to one subcommand cannot +// command is one subcommand or verb. run receives the arguments after the name +// and owns its own flag parsing, so adding a flag to one subcommand cannot // affect another. type command struct { name string @@ -22,66 +23,46 @@ type command struct { // commands is ordered for the help output: it reads as the pipeline stages in // the order an author walks them, not alphabetically. +// +// The grammar is noun-group throughout: the first word names the artefact, the +// second what to do to it. Every group dispatches through runVerbs, so the verb +// tables all behave identically. var commands = []command{ { - name: "specs", - summary: "fetch and snapshot an upstream OpenAPI document", - usage: usageSpecs, - run: runSpecs, - }, - { - name: "ingest", - summary: "infer a provider blueprint from an OpenAPI snapshot", - usage: "ingest [-spec-root DIR] [-snapshot NAME] [-only TAG] [-list]", - run: runIngest, + name: "openapi", + summary: "fetch and pin upstream OpenAPI documents", + usage: "openapi [flags]", + run: runOpenAPI, }, { name: "blueprint", - summary: "validate, diff or list blueprints", - usage: "blueprint [flags]", - run: notImplemented("blueprint"), + summary: "draft, merge, validate, diff or list blueprints", + usage: "blueprint [flags]", + run: runBlueprint, }, { name: "probe", summary: "exercise a resource's lifecycle; record or replay cassettes", - usage: usageProbe, + usage: "probe [flags]", run: runProbe, }, { - name: "merge", - summary: "fold probe facts into a blueprint", - usage: usageMerge, - run: runMerge, - }, - { - name: "emit", - summary: "render a terraform-plugin-framework provider from blueprints", - usage: "emit -blueprint DIR -out DIR [-only NAME] [-dry-run]", - run: runEmit, - }, - { - name: "verify", - summary: "fail if the committed provider has drifted from its blueprints", - usage: "verify -blueprint DIR -out DIR", - run: runVerify, - }, - { - name: "scaffold", - summary: "write a blank resource from the archetype, registered and compiling", - usage: "scaffold -name NAME [-kind resource|datasource]", - run: notImplemented("scaffold"), + name: "provider", + summary: "generate a terraform-plugin-framework provider from blueprints", + usage: "provider [flags]", + run: runProvider, }, { name: "bindings", summary: "check blueprint SDK bindings against the pinned SDK", - usage: "bindings -blueprint DIR -module DIR", - run: runBindings, + usage: "bindings [flags]", + run: runBindingsGroup, }, { - name: "interop", - summary: "export or import terraform-plugin-codegen-spec v0.1 JSON", - usage: "interop [flags]", - run: runInterop, + name: "spec", + summary: "export or import Provider Code Specification v0.1 JSON", + usage: "spec [flags]", + run: runSpecGroup, }, { name: "version", @@ -100,7 +81,51 @@ func lookup(name string) (command, bool) { return command{}, false } -// notImplemented returns a run function for a subcommand that is registered but +// runVerbs dispatches one noun group's verb table. +// +// defaultVerb, when non-empty, is what a bare `tfpfgen -flags` means -- +// probe uses it so the safe verb (replay) is what you get by typing less. A +// group without a default demands its verb, because guessing one would make +// `blueprint -blueprint DIR` silently pick an action nobody named. +func runVerbs(group string, verbs []command, defaultVerb string, args []string) error { + if len(args) > 0 { + switch args[0] { + case "-h", "-help", "--help", "help": + // A request for the verb list is output, not a diagnostic. + printVerbs(os.Stdout, group, verbs) + return nil + } + } + + verb, rest := defaultVerb, args + if len(args) > 0 && !strings.HasPrefix(args[0], "-") { + verb, rest = args[0], args[1:] + } + + if verb == "" { + printVerbs(os.Stderr, group, verbs) + return usagef("%s needs a verb", group) + } + + for _, v := range verbs { + if v.name == verb { + return v.run(rest) + } + } + + printVerbs(os.Stderr, group, verbs) + return usagef("%s: unknown verb %q", group, verb) +} + +func printVerbs(w io.Writer, group string, verbs []command) { + fmt.Fprintf(w, "Usage: tfpfgen %s [flags]\n\nVerbs:\n", group) + for _, v := range verbs { + fmt.Fprintf(w, " %-10s %s\n", v.name, v.summary) + } + fmt.Fprintln(w) +} + +// notImplemented returns a run function for a verb that is registered but // unbuilt. It still parses the global flags, so `-h` prints something useful. func notImplemented(name string) func([]string) error { return func(args []string) error { @@ -113,17 +138,14 @@ func notImplemented(name string) func([]string) error { } // globals are the flags every subcommand accepts. They are registered per -// FlagSet rather than parsed before dispatch, so `tfpluginframeworkgen emit -v` reads -// naturally and there is no "flags must come before the command" rule to learn. +// FlagSet rather than parsed before dispatch, so `tfpfgen provider generate -q` +// reads naturally and there is no "flags must come before the command" rule to +// learn. type globals struct { - verbose bool - quiet bool - chdir string - config string + quiet bool + chdir string } -const defaultConfigPath = ".tfpluginframeworkgen/config.yaml" - func newFlagSet(name, usage string) (*flag.FlagSet, *globals) { fs := flag.NewFlagSet(name, flag.ContinueOnError) @@ -134,17 +156,16 @@ func newFlagSet(name, usage string) (*flag.FlagSet, *globals) { fs.SetOutput(io.Discard) g := &globals{} - fs.BoolVar(&g.verbose, "v", false, "verbose output") fs.BoolVar(&g.quiet, "q", false, "suppress progress output") - fs.StringVar(&g.chdir, "C", "", "change to this directory before running") - fs.StringVar(&g.config, "config", defaultConfigPath, "path to the provider generation config") + fs.StringVar(&g.chdir, "chdir", "", "change to this directory before running") + fs.StringVar(&g.chdir, "C", "", "shorthand for -chdir") if usage == "" { usage = name + " [flags]" } fs.Usage = func() { out := fs.Output() - fmt.Fprintf(out, "Usage: tfpluginframeworkgen %s\n\nFlags:\n", usage) + fmt.Fprintf(out, "Usage: tfpfgen %s\n\nFlags:\n", usage) fs.PrintDefaults() } @@ -152,7 +173,7 @@ func newFlagSet(name, usage string) (*flag.FlagSet, *globals) { } // parse parses args and applies the global flags. Every subcommand calls it -// rather than fs.Parse directly, so -C and -q cannot be honoured by some +// rather than fs.Parse directly, so -chdir and -q cannot be honoured by some // subcommands and silently ignored by others, and so help and errors reach the // right stream with the right exit code. func parse(fs *flag.FlagSet, args []string) error { @@ -182,7 +203,9 @@ func applyGlobals(fs *flag.FlagSet) error { chdir string quiet bool ) - if f := fs.Lookup("C"); f != nil { + // -chdir and -C share one destination; whichever was set last on the + // command line wins, and Lookup on either name sees the same value. + if f := fs.Lookup("chdir"); f != nil { chdir = f.Value.String() } if f := fs.Lookup("q"); f != nil { diff --git a/cmd/tfpluginframeworkgen/commands_test.go b/cmd/tfpfgen/commands_test.go similarity index 81% rename from cmd/tfpluginframeworkgen/commands_test.go rename to cmd/tfpfgen/commands_test.go index 1c1936b3..4ab86a3c 100644 --- a/cmd/tfpluginframeworkgen/commands_test.go +++ b/cmd/tfpfgen/commands_test.go @@ -9,8 +9,8 @@ import ( "strings" "testing" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/ingest/openapi" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/manifest" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/openapi" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe" ) @@ -71,7 +71,7 @@ func emitInto(t *testing.T) string { quiet(t) out := t.TempDir() - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { t.Fatalf("emit: %v", err) } return out @@ -82,7 +82,7 @@ func TestUnit_CLI_Emit_WritesAndIsIdempotent(t *testing.T) { out := t.TempDir() - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { t.Fatalf("first emit: %v", err) } @@ -93,10 +93,10 @@ func TestUnit_CLI_Emit_WritesAndIsIdempotent(t *testing.T) { } // A second run must change nothing, or the drift gate would fire on a no-op. - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { t.Fatalf("second emit: %v", err) } - if err := runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", ""}); err != nil { + if err := runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", ""}); err != nil { t.Errorf("verify after a clean emit: %v", err) } } @@ -107,7 +107,7 @@ func TestUnit_CLI_Emit_DryRunAndListTouchNothing(t *testing.T) { out := t.TempDir() got := captureStdout(t, func() { - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out, "-dry-run"}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out, "-dry-run"}); err != nil { t.Errorf("dry run: %v", err) } }) @@ -125,7 +125,7 @@ func TestUnit_CLI_Emit_DryRunAndListTouchNothing(t *testing.T) { } // -list works without -out at all, for inspecting a blueprint. - if err := runEmit([]string{"-blueprint", blueprintDir(), "-list"}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-dry-run"}); err != nil { t.Errorf("list: %v", err) } } @@ -142,7 +142,7 @@ func TestUnit_CLI_Emit_RequiredFlags(t *testing.T) { t.Run(name, func(t *testing.T) { t.Parallel() - err := runEmit(args) + err := runProviderGenerate(args) if err == nil { t.Fatal("expected a usage error") } @@ -161,7 +161,7 @@ func TestUnit_CLI_Emit_OnlyLeavesTheManifestAlone(t *testing.T) { out := t.TempDir() - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out, "-only", "tag"}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out, "-resource", "tag"}); err != nil { t.Fatalf("emit -only: %v", err) } @@ -181,7 +181,7 @@ func TestUnit_CLI_Emit_OnlyLeavesTheManifestAlone(t *testing.T) { func TestUnit_CLI_Emit_UnmatchedOnlyIsAnError(t *testing.T) { quiet(t) - err := runEmit([]string{"-blueprint", blueprintDir(), "-out", t.TempDir(), "-only", "nonexistent"}) + err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", t.TempDir(), "-resource", "nonexistent"}) if !errors.Is(err, errNothingToDo) { t.Errorf("error = %v, want errNothingToDo: a mistyped filter must not look like success", err) } @@ -208,7 +208,7 @@ func TestUnit_CLI_Verify_DetectsEachDriftClass(t *testing.T) { t.Fatalf("WriteFile: %v", wErr) } - err = runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", ""}) + err = runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", ""}) if err == nil { t.Fatal("an edited generated file must be detected") } @@ -223,7 +223,7 @@ func TestUnit_CLI_Verify_DetectsEachDriftClass(t *testing.T) { if err := os.Remove(filepath.Join(out, "internal", "provider", "datasources.go")); err != nil { t.Fatalf("Remove: %v", err) } - if err := runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", ""}); err == nil { + if err := runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", ""}); err == nil { t.Error("a deleted generated file must be detected") } }) @@ -252,7 +252,7 @@ func TestUnit_CLI_Verify_DetectsEachDriftClass(t *testing.T) { t.Fatalf("Save: %v", err) } - if err := runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", ""}); err == nil { + if err := runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", ""}); err == nil { t.Error("an orphaned file must be detected") } }) @@ -269,7 +269,7 @@ func TestUnit_CLI_Verify_WritesAStepSummary(t *testing.T) { summary := filepath.Join(t.TempDir(), "summary.md") // The error is the point of the call, but the assertion is on the summary file. - if err := runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", summary}); err == nil { + if err := runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", summary}); err == nil { t.Fatal("expected drift to be reported") } @@ -277,7 +277,7 @@ func TestUnit_CLI_Verify_WritesAStepSummary(t *testing.T) { if err != nil { t.Fatalf("the summary should have been written: %v", err) } - for _, want := range []string{"out of date", "tfpluginframeworkgen emit"} { + for _, want := range []string{"out of date", "tfpfgen provider generate"} { if !strings.Contains(string(body), want) { t.Errorf("summary omits %q:\n%s", want, body) } @@ -288,12 +288,12 @@ func TestUnit_CLI_Verify_RequiredFlags(t *testing.T) { t.Parallel() for name, args := range map[string][]string{ - "no blueprint": {}, - "no out": {"-blueprint", blueprintDir()}, + "no blueprint": {"-check"}, + "no out": {"-check", "-blueprint", blueprintDir()}, } { t.Run(name, func(t *testing.T) { t.Parallel() - if err := runVerify(args); err == nil { + if err := runProviderGenerate(args); err == nil { t.Error("expected a usage error") } }) @@ -310,7 +310,7 @@ func TestUnit_CLI_Verify_ToleratesATreeWithNoManifest(t *testing.T) { // "no orphans" and "could not check" are different answers, and neither is a // failure when everything else matches. - if err := runVerify([]string{"-blueprint", blueprintDir(), "-out", out, "-github-summary", ""}); err != nil { + if err := runProviderGenerate([]string{"-check", "-blueprint", blueprintDir(), "-out", out, "-summary", ""}); err != nil { t.Errorf("a tree with no manifest should still verify: %v", err) } } @@ -319,7 +319,7 @@ func TestUnit_CLI_Bindings(t *testing.T) { quiet(t) t.Run("the committed blueprint matches the pinned SDK", func(t *testing.T) { - err := runBindings([]string{ + err := runBindingsCheck([]string{ "-blueprint", blueprintDir(), "-module", filepath.Join(repoRoot, "pilot", "thousandeyes"), }) @@ -330,10 +330,10 @@ func TestUnit_CLI_Bindings(t *testing.T) { t.Run("required flags", func(t *testing.T) { t.Parallel() - if err := runBindings(nil); err == nil { + if err := runBindingsCheck(nil); err == nil { t.Error("expected -blueprint to be required") } - if err := runBindings([]string{"-blueprint", blueprintDir()}); err == nil { + if err := runBindingsCheck([]string{"-blueprint", blueprintDir()}); err == nil { t.Error("expected -module to be required") } }) @@ -343,9 +343,9 @@ func TestUnit_CLI_Ingest_ListsCandidates(t *testing.T) { quiet(t) got := captureStdout(t, func() { - err := runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), - "-only", "tag", "-list", + err := runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), + "-tag", "tag", "-dry-run", }) if err != nil { t.Errorf("ingest -list: %v", err) @@ -364,9 +364,9 @@ func TestUnit_CLI_Ingest_InfersBlueprints(t *testing.T) { out := t.TempDir() - err := runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), - "-only", "tag", "-out", out, + err := runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), + "-tag", "tag", "-out", out, }) if err != nil { t.Fatalf("ingest: %v", err) @@ -379,7 +379,7 @@ func TestUnit_CLI_Ingest_InfersBlueprints(t *testing.T) { } // TestUnit_CLI_Ingest_ScaffoldsPlanDraftWorksheets: -plan-drafts writes one -// KEY.probe.plan.draft.json per inferred resource -- invisible to every loader until +// KEY.scenario.draft.json per inferred resource -- invisible to every loader until // the curator renames the .draft away -- and never overwrites a started worksheet. func TestUnit_CLI_Ingest_ScaffoldsPlanDraftWorksheets(t *testing.T) { quiet(t) @@ -388,16 +388,16 @@ func TestUnit_CLI_Ingest_ScaffoldsPlanDraftWorksheets(t *testing.T) { drafts := t.TempDir() run := func() error { - return runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), - "-only", "tag", "-out", out, "-plan-drafts", drafts, + return runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), + "-tag", "tag", "-out", out, "-scenario-drafts", drafts, }) } if err := run(); err != nil { t.Fatalf("ingest: %v", err) } - path := filepath.Join(drafts, "tag.probe.plan.draft.json") + path := filepath.Join(drafts, "tag.scenario.draft.json") data, err := os.ReadFile(path) //nolint:gosec // test-owned path if err != nil { t.Fatalf("the draft should have been written: %v", err) @@ -405,7 +405,7 @@ func TestUnit_CLI_Ingest_ScaffoldsPlanDraftWorksheets(t *testing.T) { // The draft must be a plan the strict loader would take after curation -- // same decoder, same unknown-field refusal. - plan, err := loadPlan(path) + plan, err := loadScenario(path) if err != nil { t.Fatalf("the draft does not round-trip through the plan loader: %v", err) } @@ -444,9 +444,9 @@ func TestUnit_CLI_Ingest_OnlyTakesACommaList(t *testing.T) { quiet(t) got := captureStdout(t, func() { - err := runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), - "-only", "tags,credentials", "-list", + err := runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), + "-tag", "tags,credentials", "-dry-run", }) if err != nil { t.Errorf("ingest -list: %v", err) @@ -463,8 +463,8 @@ func TestUnit_CLI_Ingest_OnlyTakesACommaList(t *testing.T) { func TestUnit_CLI_Ingest_RequiresAnOutputUnlessListing(t *testing.T) { quiet(t) - err := runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), "-only", "tag", + err := runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), "-tag", "tag", }) if err == nil { t.Fatal("expected -out to be required") @@ -478,9 +478,9 @@ func TestUnit_CLI_Ingest_RequiresAnOutputUnlessListing(t *testing.T) { func TestUnit_CLI_Ingest_UnmatchedFilterIsAnError(t *testing.T) { quiet(t) - err := runIngest([]string{ - "-spec-root", filepath.Join(repoRoot, "openapi-specs", "thousandeyes"), - "-only", "definitelynotathing", "-list", + err := runBlueprintDraft([]string{ + "-openapi-dir", filepath.Join(repoRoot, "openapi", "thousandeyes"), + "-tag", "definitelynotathing", "-dry-run", }) if !errors.Is(err, errNothingToDo) { t.Errorf("error = %v, want errNothingToDo", err) @@ -490,7 +490,7 @@ func TestUnit_CLI_Ingest_UnmatchedFilterIsAnError(t *testing.T) { func TestUnit_CLI_Ingest_MissingSnapshotIsReported(t *testing.T) { quiet(t) - err := runIngest([]string{"-spec-root", t.TempDir(), "-list"}) + err := runBlueprintDraft([]string{"-openapi-dir", t.TempDir(), "-dry-run"}) if err == nil { t.Fatal("expected a missing snapshot to be reported") } @@ -504,11 +504,11 @@ func TestUnit_CLI_Ingest_MissingSnapshotIsReported(t *testing.T) { func TestUnit_CLI_Ingest_ReadsAnExplicitSpec(t *testing.T) { quiet(t) - spec := filepath.Join(repoRoot, "openapi-specs", "thousandeyes", + spec := filepath.Join(repoRoot, "openapi", "thousandeyes", "7.0.97-t1785152261691", "api.yaml") captureStdout(t, func() { - if err := runIngest([]string{"-spec", spec, "-only", "tag", "-list"}); err != nil { + if err := runBlueprintDraft([]string{"-openapi", spec, "-tag", "tag", "-dry-run"}); err != nil { t.Errorf("ingest -spec: %v", err) } }) @@ -621,14 +621,14 @@ func TestUnit_CLI_Emit_CleanRemovesOrphans(t *testing.T) { // Without -clean the file is reported but kept: an orphan is usually a // rename, but it might be a blueprint that failed to load, and deleting a // working resource's files on that basis would be worse. - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out}); err != nil { t.Fatalf("emit: %v", err) } if _, err := os.Stat(filepath.Join(out, stray)); err != nil { t.Error("without -clean the orphan should be kept") } - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out, "-clean"}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out, "-clean"}); err != nil { t.Fatalf("emit -clean: %v", err) } if _, err := os.Stat(filepath.Join(out, stray)); !os.IsNotExist(err) { @@ -651,12 +651,12 @@ func TestUnit_CLI_Emit_RefusesToClobberHandWrittenFiles(t *testing.T) { t.Fatalf("WriteFile: %v", err) } - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out}); err == nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out}); err == nil { t.Fatal("overwriting a hand-written file must be refused") } // -force is the deliberate escape hatch for adopting an existing tree. - if err := runEmit([]string{"-blueprint", blueprintDir(), "-out", out, "-force"}); err != nil { + if err := runProviderGenerate([]string{"-blueprint", blueprintDir(), "-out", out, "-force"}); err != nil { t.Errorf("-force should allow it: %v", err) } } diff --git a/cmd/tfpfgen/docs_test.go b/cmd/tfpfgen/docs_test.go new file mode 100644 index 00000000..a213699c --- /dev/null +++ b/cmd/tfpfgen/docs_test.go @@ -0,0 +1,79 @@ +package main + +import ( + "io" + "os" + "path/filepath" + "regexp" + "strings" + "testing" +) + +// TestUnit_CLI_DocsMatchTheBinary is the drift check docs/cli.md promises. +// +// The page is hand-maintained, and the failure mode of hand-maintained +// references is silent: the binary moves and the page keeps describing the old +// surface. This test holds the page to the binary in both directions it can +// check mechanically -- every command, verb, usage sketch and registered flag +// must appear in the page, and none of the retired spellings may. +func TestUnit_CLI_DocsMatchTheBinary(t *testing.T) { + doc, err := os.ReadFile(filepath.Join(repoRoot, "docs", "cli.md")) + if err != nil { + t.Fatalf("reading docs/cli.md: %v", err) + } + page := string(doc) + + groups := map[string][]command{ + "openapi": openapiVerbs, + "blueprint": blueprintVerbs, + "probe": probeVerbs, + "provider": providerVerbs, + "bindings": bindingsVerbs, + "spec": specVerbs, + } + + for _, c := range commands { + if !strings.Contains(page, c.name) { + t.Errorf("docs/cli.md does not mention the %q command", c.name) + } + } + + flagLine := regexp.MustCompile(`(?m)^\s+-([a-zA-Z][a-zA-Z-]*)`) + + for group, verbs := range groups { + for _, v := range verbs { + if !strings.Contains(page, group+" "+v.name) { + t.Errorf("docs/cli.md does not mention %q", group+" "+v.name) + } + if v.usage != "" && !strings.Contains(page, v.usage) { + t.Errorf("docs/cli.md does not carry the usage line %q verbatim", v.usage) + } + + // The verb's own -h output is the binary's statement of its flags; + // every flag it prints must be named in the page. + help := captureStdout(t, func() { + _ = run([]string{group, v.name, "-h"}, io.Discard) + }) + for _, m := range flagLine.FindAllStringSubmatch(help, -1) { + name := "-" + m[1] + if !strings.Contains(page, name) { + t.Errorf("docs/cli.md does not mention %s %s's flag %s", group, v.name, name) + } + } + } + } + + // Retired spellings must not resurface. Their presence means an edit + // described the old surface, which is exactly the drift this test exists + // to catch. + for _, banned := range []string{ + "tfpluginframeworkgen", "-mode ", "-output-dir", "-github-summary", + "-accept-conflicts", "-facts-out", "-facts-check", "-no-rehearse", + "probe.plan", "probe-evidence", "interop-specs", "openapi-specs", + "--allow-mutations", + } { + if strings.Contains(page, banned) { + t.Errorf("docs/cli.md still contains the retired spelling %q", banned) + } + } +} diff --git a/cmd/tfpluginframeworkgen/emit.go b/cmd/tfpfgen/generate.go similarity index 69% rename from cmd/tfpluginframeworkgen/emit.go rename to cmd/tfpfgen/generate.go index 51b5765b..61d62eec 100644 --- a/cmd/tfpluginframeworkgen/emit.go +++ b/cmd/tfpfgen/generate.go @@ -9,65 +9,95 @@ import ( "strings" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/emit" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/generate" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/manifest" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/version" ) -type emitOptions struct { +const usageProviderGenerate = "provider generate -blueprint DIR -out DIR [-resource KEY] [-dry-run] [-check]" + +// providerVerbs is the provider group's verb table. +var providerVerbs = []command{ + { + name: "generate", + summary: "generate the provider Go tree from blueprints; -check fails on drift", + usage: usageProviderGenerate, + run: runProviderGenerate, + }, + { + name: "scaffold", + summary: "write a blank resource from the scaffold template, registered and compiling", + usage: "provider scaffold -name NAME", + run: notImplemented("provider scaffold"), + }, +} + +func runProvider(args []string) error { + return runVerbs("provider", providerVerbs, "", args) +} + +type generateOptions struct { skipPostcheck bool blueprintPath string out string - only string + resource string dryRun bool - list bool + check bool force bool clean bool + summary string } -// planOnly reports whether the run inspects output without writing it. -func (o emitOptions) planOnly() bool { return o.list || o.dryRun } +// wholeProvider reports whether the run covers every resource. A -resource run +// must not touch the manifest or the registration files, because a partial +// inventory would make the drift check report every unlisted file as an orphan. +func (o generateOptions) wholeProvider() bool { return o.resource == "" } -// wholeProvider reports whether the run covers every resource. A -only run must -// not touch the manifest or the registration files, because a partial inventory -// would make verify report every unlisted file as an orphan. -func (o emitOptions) wholeProvider() bool { return o.only == "" } +func parseGenerateFlags(args []string) (generateOptions, error) { + fs, _ := newFlagSet("provider generate", usageProviderGenerate) -func parseEmitFlags(args []string) (emitOptions, error) { - fs, _ := newFlagSet("emit", "emit -blueprint DIR -out DIR [-only NAME] [-dry-run]") - - var o emitOptions + var o generateOptions fs.StringVar(&o.blueprintPath, "blueprint", "", "blueprint file or directory (required)") fs.StringVar(&o.out, "out", "", "provider root to write into (required)") - fs.StringVar(&o.only, "only", "", "generate a single resource by key, for inspecting output") - fs.BoolVar(&o.dryRun, "dry-run", false, "print the write plan and touch nothing") - fs.BoolVar(&o.list, "list", false, "list the files that would be written and exit") + fs.StringVar(&o.resource, "resource", "", "generate a single resource by key, for inspecting output") + fs.BoolVar(&o.dryRun, "dry-run", false, "print the files that would be written and touch nothing") + fs.BoolVar(&o.check, "check", false, + "write nothing and exit 1 if the committed provider has drifted from its blueprints") fs.BoolVar(&o.force, "force", false, "overwrite files that are not marked as generated") fs.BoolVar(&o.clean, "clean", false, "delete files the blueprints no longer produce") + fs.StringVar(&o.summary, "summary", os.Getenv("GITHUB_STEP_SUMMARY"), + "with -check: append a markdown drift summary here (defaults to $GITHUB_STEP_SUMMARY)") fs.BoolVar(&o.skipPostcheck, "skip-postcheck", false, - "skip the post-emit battery (compile, docs regeneration, terraform fmt); for "+ + "skip the post-generation battery (compile, docs regeneration, terraform fmt); for "+ "tight inner loops only -- CI and any run before a commit should keep it") if err := parse(fs, args); err != nil { - return emitOptions{}, err + return generateOptions{}, err } if o.blueprintPath == "" { - return emitOptions{}, usagef("-blueprint is required") + return generateOptions{}, usagef("-blueprint is required") + } + if o.dryRun && o.check { + return generateOptions{}, usagef("-dry-run and -check are different questions; pick one") } - if o.out == "" && !o.planOnly() { - return emitOptions{}, usagef("-out is required unless -list or -dry-run is given") + if o.out == "" && !o.dryRun { + return generateOptions{}, usagef("-out is required unless -dry-run is given") } return o, nil } -func runEmit(args []string) error { - o, err := parseEmitFlags(args) +func runProviderGenerate(args []string) error { + o, err := parseGenerateFlags(args) if err != nil { return err } + if o.check { + return runGenerateCheck(o) + } + bp, err := blueprint.LoadDir(o.blueprintPath) if err != nil { return err @@ -76,12 +106,12 @@ func runEmit(args []string) error { log.Printf("blueprint: %s (%d resource(s), %d data source(s))", o.blueprintPath, len(bp.Resources), len(bp.DataSources)) - gen, err := emit.New() + gen, err := generate.New() if err != nil { return err } - plan, err := gen.Build(bp, emit.Options{BlueprintPath: o.blueprintPath, Only: o.only}) + plan, err := gen.Build(bp, generate.BuildOptions{BlueprintPath: o.blueprintPath, Only: o.resource}) if err != nil { return err } @@ -90,17 +120,17 @@ func runEmit(args []string) error { return fmt.Errorf("%w: nothing matched", errNothingToDo) } - if o.planOnly() { - printPlan(plan) + if o.dryRun { + printFileset(plan) return nil } - if err := writePlan(plan, o); err != nil { + if err := writeFileset(plan, o); err != nil { return err } // The battery runs by default, because every one of these was learned as a CI - // failure after an emit that looked done: emitted Go that did not compile against + // failure after a generation that looked done: generated Go that did not compile against // a moved SDK, registry docs stale the moment a description changed, fixtures a // formatter would rewrite. Generation is not finished until the tools that gate // the output have seen it. @@ -112,17 +142,17 @@ func runEmit(args []string) error { return postcheck(o.out) } -// postcheck holds emitted output to the tools that gate it. +// postcheck holds generated output to the tools that gate it. // // Three checks, in failure-likelihood order. Compile first: nothing else matters if // the module does not build. Docs second: tfplugindocs reads the compiled schema, and -// stale docs/ were this battery's founding failure -- five waves changed descriptions -// and CI, not emit, noticed. terraform fmt last, advisory-fixing: the emitter aligns +// stale docs/ were this battery's founding failure -- five batches changed descriptions +// and CI, not the generator, noticed. terraform fmt last, advisory-fixing: the generator aligns // what it writes, so a diff here is a bug worth seeing, and fmt writing the fix keeps // the tree correct either way. terraform validate stays a CI job: it needs the -// provider built into a dev-override, which is workflow plumbing rather than emission. +// provider built into a dev-override, which is workflow plumbing rather than generation. func postcheck(out string) error { - // A scratch emit -- a test's temp dir, an -only inspection -- has no module + // A scratch generation -- a test's temp dir, a -resource inspection -- has no module // to compile or docs to regenerate, and holding it to the battery would gate // the wrong thing. The pilot and any real provider root carry go.mod. if _, err := os.Stat(filepath.Join(out, "go.mod")); err != nil { @@ -134,7 +164,7 @@ func postcheck(out string) error { build := exec.Command("go", "build", "./...") build.Dir = out if msg, err := build.CombinedOutput(); err != nil { - return fmt.Errorf("postcheck: emitted code does not compile:\n%s", msg) + return fmt.Errorf("postcheck: generated code does not compile:\n%s", msg) } if hasGenerateDirective(out) { @@ -162,8 +192,8 @@ func postcheck(out string) error { // Fixed on disk already; failing anyway, because an emitter whose output a // formatter rewrites is drifting from the canonical form and the diff is // the bug report. - return fmt.Errorf("postcheck: terraform fmt rewrote emitted files, which means "+ - "the emitter's alignment has drifted from canonical form:\n%s", rewritten) + return fmt.Errorf("postcheck: terraform fmt rewrote generated files, which means "+ + "the generator's alignment has drifted from canonical form:\n%s", rewritten) } return nil @@ -187,19 +217,19 @@ func hasGenerateDirective(out string) bool { return false } -// printPlan lists what would be written, for -list and -dry-run. +// printFileset lists what would be written, for -dry-run. // -// Building a plan touches nothing on disk, so these flags exercise the same code -// path as a real run rather than approximating it. -func printPlan(plan emit.Plan) { +// Building a fileset touches nothing on disk, so the flag exercises the same +// code path as a real run rather than approximating it. +func printFileset(plan generate.Fileset) { for _, f := range plan.Files { fmt.Fprintf(os.Stdout, "%-72s %6d bytes sha256:%s\n", f.Path, len(f.Content), f.SHA256()[:12]) } log.Printf("%d file(s) would be written; nothing was changed", len(plan.Files)) } -func writePlan(plan emit.Plan, o emitOptions) error { - res, err := emit.Write(plan, emit.WriteOptions{Root: o.out, Force: o.force}) +func writeFileset(plan generate.Fileset, o generateOptions) error { + res, err := generate.Write(plan, generate.WriteOptions{Root: o.out, Force: o.force}) if err != nil { return err } @@ -227,7 +257,7 @@ func writePlan(plan emit.Plan, o emitOptions) error { return err } } else { - log.Printf("note: -only was given, so the manifest was left unchanged") + log.Printf("note: -resource was given, so the manifest was left unchanged") } for _, p := range res.Written { @@ -260,7 +290,7 @@ func writePlan(plan emit.Plan, o emitOptions) error { // leaving them. // handleOrphans returns the manifest entries for orphans that were reported but // not deleted, so the caller can carry them forward. -func handleOrphans(root string, plan emit.Plan, clean bool) ([]manifest.Entry, error) { +func handleOrphans(root string, plan generate.Fileset, clean bool) ([]manifest.Entry, error) { m, ok, err := manifest.Load(root) if err != nil { return nil, err @@ -314,7 +344,7 @@ func handleOrphans(root string, plan emit.Plan, clean bool) ([]manifest.Entry, e // the drift check reads, so a file listed there is one the practitioner may not edit. Leaving a // scaffold out is what makes it theirs -- and it also keeps it from being reported as an orphan // once it stops appearing in a later plan. -func manifestEntries(plan emit.Plan, blueprintPath string) []manifest.Entry { +func manifestEntries(plan generate.Fileset, blueprintPath string) []manifest.Entry { out := make([]manifest.Entry, 0, len(plan.Files)) for _, f := range plan.Files { if f.Scaffold { diff --git a/cmd/tfpluginframeworkgen/verify.go b/cmd/tfpfgen/generate_check.go similarity index 84% rename from cmd/tfpluginframeworkgen/verify.go rename to cmd/tfpfgen/generate_check.go index 5a2701dd..85e46e7e 100644 --- a/cmd/tfpluginframeworkgen/verify.go +++ b/cmd/tfpfgen/generate_check.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/emit" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/generate" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/manifest" ) @@ -43,38 +43,23 @@ func (r verifyResult) count() int { return len(r.drifted) + len(r.missing) + len(r.orphaned) } -func runVerify(args []string) error { - fs, _ := newFlagSet("verify", "verify -blueprint DIR -out DIR") - - var ( - blueprintPath = fs.String("blueprint", "", "blueprint file or directory (required)") - out = fs.String("out", "", "provider root to check (required)") - summaryPath = fs.String("github-summary", os.Getenv("GITHUB_STEP_SUMMARY"), - "write a markdown summary here (defaults to $GITHUB_STEP_SUMMARY)") - ) - - if err := parse(fs, args); err != nil { - return err - } - - if *blueprintPath == "" { - return usagef("-blueprint is required") - } - if *out == "" { - return usagef("-out is required") - } +// runGenerateCheck is `provider generate -check`: build the fileset the +// blueprints produce, compare it against the committed tree, and fail on drift +// without writing anything. +func runGenerateCheck(o generateOptions) error { + blueprintPath, out, summaryPath := &o.blueprintPath, &o.out, &o.summary bp, err := blueprint.LoadDir(*blueprintPath) if err != nil { return err } - gen, err := emit.New() + gen, err := generate.New() if err != nil { return err } - plan, err := gen.Build(bp, emit.Options{BlueprintPath: *blueprintPath}) + plan, err := gen.Build(bp, generate.BuildOptions{BlueprintPath: *blueprintPath}) if err != nil { return err } @@ -106,7 +91,7 @@ func runVerify(args []string) error { fmt.Fprint(os.Stderr, report) // The GitHub annotation makes the failure visible in the checks UI rather // than only in the log. - fmt.Fprintf(os.Stderr, "::error::Generated code is out of date. Run: tfpluginframeworkgen emit -blueprint %s -out %s\n", + fmt.Fprintf(os.Stderr, "::error::Generated code is out of date. Run: tfpfgen provider generate -blueprint %s -out %s\n", *blueprintPath, *out) if *summaryPath != "" { @@ -120,7 +105,7 @@ func runVerify(args []string) error { } // compareAgainstDisk checks what the blueprints produce against what is there. -func compareAgainstDisk(plan emit.Plan, out string) (verifyResult, error) { +func compareAgainstDisk(plan generate.Fileset, out string) (verifyResult, error) { var res verifyResult produced := make(map[string]bool, len(plan.Files)) @@ -172,7 +157,7 @@ func buildDriftReport(blueprintPath, out string, drifted, missing, orphaned []st var b strings.Builder b.WriteString("### ❌ Generated code is out of date\n\n") - b.WriteString("Run this and commit the result:\n\n```bash\ntfpluginframeworkgen emit -blueprint ") + b.WriteString("Run this and commit the result:\n\n```bash\ntfpfgen provider generate -blueprint ") b.WriteString(blueprintPath + " -out " + out + "\n```\n\n") if len(drifted) > 0 { diff --git a/cmd/tfpluginframeworkgen/main.go b/cmd/tfpfgen/main.go similarity index 79% rename from cmd/tfpluginframeworkgen/main.go rename to cmd/tfpfgen/main.go index 68ecd53e..0a0e8354 100644 --- a/cmd/tfpluginframeworkgen/main.go +++ b/cmd/tfpfgen/main.go @@ -1,14 +1,15 @@ -// Command tfpluginframeworkgen generates terraform-plugin-framework providers from an +// Command tfpfgen generates terraform-plugin-framework providers from an // API specification plus recorded API behaviour. // -// tfpluginframeworkgen ingest -only Tags -// tfpluginframeworkgen probe -blueprint blueprints/thousandeyes -mode replay -// tfpluginframeworkgen emit -blueprint blueprints/thousandeyes -out pilot/thousandeyes -// tfpluginframeworkgen verify -blueprint blueprints/thousandeyes -out pilot/thousandeyes +// tfpfgen blueprint draft -tag Tags -out blueprints/thousandeyes +// tfpfgen probe replay -blueprint blueprints/thousandeyes +// tfpfgen provider generate -blueprint blueprints/thousandeyes -out pilot/thousandeyes +// tfpfgen provider generate -check -blueprint blueprints/thousandeyes -out pilot/thousandeyes // -// Subcommands follow the go tool's shape: each owns its own flag.FlagSet, so -// there is no global flag namespace for two subcommands to collide in, and -// argument parsing needs no third-party dependency. +// The grammar is noun-group: the first word names the artefact, the second what +// to do to it. Each verb owns its own flag.FlagSet, so there is no global flag +// namespace for two subcommands to collide in, and argument parsing needs no +// third-party dependency. package main import ( @@ -73,7 +74,7 @@ func main() { os.Exit(exitOK) } - fmt.Fprintf(os.Stderr, "tfpluginframeworkgen: %v\n", err) + fmt.Fprintf(os.Stderr, "tfpfgen: %v\n", err) var coded exitCoder if errors.As(err, &coded) { @@ -98,6 +99,8 @@ func run(args []string, diag io.Writer) error { case "-h", "-help", "--help", "help": printUsage(os.Stdout) return nil + case "-version", "--version": + return runVersion(nil) } cmd, ok := lookup(name) diff --git a/cmd/tfpluginframeworkgen/main_test.go b/cmd/tfpfgen/main_test.go similarity index 64% rename from cmd/tfpluginframeworkgen/main_test.go rename to cmd/tfpfgen/main_test.go index d8b62f1c..db1fecd2 100644 --- a/cmd/tfpluginframeworkgen/main_test.go +++ b/cmd/tfpfgen/main_test.go @@ -4,6 +4,7 @@ import ( "errors" "flag" "io" + "path/filepath" "strings" "testing" ) @@ -48,10 +49,10 @@ func TestUnit_CLI_Dispatch_ExitCodes(t *testing.T) { // A malformed flag must not be reported as an internal failure: exit 1 // would tell a caller the tool broke rather than that they mistyped. {"undefined flag is a usage error", []string{"version", "-nope"}, exitInvalidInput}, - {"unbuilt subcommand reports a plain failure", []string{"scaffold"}, exitError}, + {"unbuilt verb reports a plain failure", []string{"provider", "scaffold"}, exitError}, // A built subcommand missing a required flag is the caller's mistake, and // must not be reported the same way as a subcommand that does not exist yet. - {"built subcommand missing a required flag is a usage error", []string{"emit"}, exitInvalidInput}, + {"built verb missing a required flag is a usage error", []string{"provider", "generate"}, exitInvalidInput}, } for _, tc := range tests { @@ -71,25 +72,28 @@ func TestUnit_CLI_Dispatch_ExitCodes(t *testing.T) { // directions so the list cannot quietly go stale. var builtCommands = map[string]bool{ "version": true, - // specs fetches and pins; with -url omitted it re-fetches from the latest + // openapi fetch pins; with -url omitted it re-fetches from the latest // snapshot's own recorded source, which is the weekly-refresh loop. - "specs": true, - "emit": true, - "verify": true, - "bindings": true, - // ingest infers resource blueprints from a pinned snapshot. Data sources, - // actions and the provider block are still hand-authored, and every skip is - // printed as a note rather than being silent. - "ingest": true, - // interop exports, and imports resources-only drafts. `interop` with no verb - // reports that it needs one, which is a real answer rather than a claim that - // the subcommand does not exist. - "interop": true, + "openapi fetch": true, + // blueprint draft infers resource blueprints from a pinned snapshot. Data + // sources, actions and the provider block are still hand-authored, and every + // skip is printed as a note rather than being silent. + "blueprint draft": true, + // blueprint merge folds facts into a blueprint and reports what it refused. + "blueprint merge": true, // probe records, replays, verifies and sweeps; the mutating tier ran live - // against a sandbox and its evidence is committed under probe-evidence/. - "probe": true, - // merge folds facts into a blueprint and reports what it refused. - "merge": true, + // against a sandbox and its recordings are committed under recordings/. + "probe record": true, + "probe replay": true, + "probe verify": true, + "probe sweep": true, + "probe list": true, + "provider generate": true, + "bindings check": true, + "bindings facts": true, + // spec exports, and imports resources-only drafts. + "spec export": true, + "spec import": true, } // TestUnit_CLI_Dispatch_ImplementationClaimsAreTrue guards two failure modes at @@ -102,26 +106,50 @@ var builtCommands = map[string]bool{ func TestUnit_CLI_Dispatch_ImplementationClaimsAreTrue(t *testing.T) { t.Parallel() - for _, c := range commands { - t.Run(c.name, func(t *testing.T) { - t.Parallel() + groups := map[string][]command{ + "openapi": openapiVerbs, + "blueprint": blueprintVerbs, + "probe": probeVerbs, + "provider": providerVerbs, + "bindings": bindingsVerbs, + "spec": specVerbs, + } - // Invoked with no arguments, so a built subcommand fails on its - // required flags rather than doing any work. - err := run([]string{c.name}, io.Discard) + for group, verbs := range groups { + for _, v := range verbs { + name := group + " " + v.name + t.Run(name, func(t *testing.T) { + t.Parallel() + + // Invoked with no further arguments, so a built verb fails on + // its required flags rather than doing any work. probe verbs + // would reach for a blueprint, so they get an absent one. + args := []string{group, v.name} + if group == "probe" { + args = append(args, "-blueprint", filepath.Join(t.TempDir(), "absent")) + } + err := run(args, io.Discard) - if builtCommands[c.name] { - if errors.Is(err, errNotImplemented) { - t.Errorf("%q is listed as built but reports errNotImplemented; the registry entry is wrong", c.name) + if builtCommands[name] { + if errors.Is(err, errNotImplemented) { + t.Errorf("%q is listed as built but reports errNotImplemented; the registry entry is wrong", name) + } + return } - return - } - if !errors.Is(err, errNotImplemented) { - t.Errorf("run(%q) error = %v, want it to wrap errNotImplemented", c.name, err) - } - }) + if !errors.Is(err, errNotImplemented) { + t.Errorf("run(%q) error = %v, want it to wrap errNotImplemented", name, err) + } + }) + } } + + t.Run("version", func(t *testing.T) { + t.Parallel() + if err := run([]string{"version"}, io.Discard); err != nil { + t.Errorf("version: %v", err) + } + }) } // TestUnit_CLI_Registry_IsWellFormed catches the copy-paste mistakes that a diff --git a/cmd/tfpluginframeworkgen/specs.go b/cmd/tfpfgen/openapi.go similarity index 70% rename from cmd/tfpluginframeworkgen/specs.go rename to cmd/tfpfgen/openapi.go index c45eb31a..69a43f72 100644 --- a/cmd/tfpluginframeworkgen/specs.go +++ b/cmd/tfpfgen/openapi.go @@ -13,44 +13,58 @@ import ( "path/filepath" "time" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/ingest/openapi" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/specstore" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/openapi" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/snapshot" ) -const usageSpecs = "specs [-url URL] [-output-dir DIR] [-dry-run]" +const usageOpenAPIFetch = "openapi fetch [-url URL] -out DIR [-dry-run]" -// specsFetchTimeout bounds the whole fetch. A specification is a couple of megabytes; +// openapiVerbs is the openapi group's verb table. +var openapiVerbs = []command{ + { + name: "fetch", + summary: "fetch and pin an upstream OpenAPI document", + usage: usageOpenAPIFetch, + run: runOpenAPIFetch, + }, +} + +func runOpenAPI(args []string) error { + return runVerbs("openapi", openapiVerbs, "", args) +} + +// fetchTimeout bounds the whole fetch. A specification is a couple of megabytes; // anything that takes longer than this is a network problem worth hearing about. -const specsFetchTimeout = 2 * time.Minute +const fetchTimeout = 2 * time.Minute -// runSpecs fetches the upstream OpenAPI document and pins it as a new snapshot. +// runOpenAPIFetch fetches the upstream OpenAPI document and pins it as a new snapshot. // // The refresh loop is the point: with -url omitted, the source comes from the latest -// snapshot's own metadata, so `specs -output-dir openapi-specs/thousandeyes` re-fetches +// snapshot's own metadata, so `openapi fetch -out openapi/thousandeyes` re-fetches // from wherever the last pin came from -- no one has to remember the URL, because the // snapshot that would go stale is the thing that records it. -func runSpecs(args []string) error { - fs, _ := newFlagSet("specs", usageSpecs) +func runOpenAPIFetch(args []string) error { + fs, _ := newFlagSet("openapi fetch", usageOpenAPIFetch) var ( - url = fs.String("url", "", "the document to fetch; defaults to the latest snapshot's recorded source") - outputDir = fs.String("output-dir", "", "snapshot root, e.g. openapi-specs/thousandeyes (required)") - dryRun = fs.Bool("dry-run", false, "fetch and report, but pin nothing") + url = fs.String("url", "", "the document to fetch; defaults to the latest snapshot's recorded source") + out = fs.String("out", "", "snapshot root to pin into, e.g. openapi/thousandeyes (required)") + dryRun = fs.Bool("dry-run", false, "fetch and report, but pin nothing") ) if err := parse(fs, args); err != nil { return err } - if *outputDir == "" { - return usagef("-output-dir is required") + if *out == "" { + return usagef("-out is required") } sourceURL := *url - var previous specstore.Snapshot + var previous snapshot.Snapshot havePrevious := false - if latest, err := specstore.Latest(*outputDir); err == nil { + if latest, err := snapshot.Latest(*out); err == nil { previous, havePrevious = latest, true if sourceURL == "" { meta, mErr := latest.LoadMetadata() @@ -59,7 +73,7 @@ func runSpecs(args []string) error { } sourceURL = meta.SourceURL } - } else if !errors.Is(err, specstore.ErrNoSnapshot) { + } else if !errors.Is(err, snapshot.ErrNoSnapshot) { return err } @@ -114,7 +128,7 @@ func runSpecs(args []string) error { return nil } - snap, err := specstore.Pin(*outputDir, doc, specstore.Metadata{ + snap, err := snapshot.Pin(*out, doc, snapshot.Metadata{ Version: parsed.Version, SHA256: digest, SourceURL: sourceURL, @@ -126,14 +140,14 @@ func runSpecs(args []string) error { return err } - log.Printf("✅ pinned %s", filepath.Join(*outputDir, snap.Name)) + log.Printf("✅ pinned %s", filepath.Join(*out, snap.Name)) return nil } // fetchSpec downloads the document, refusing anything but a clean 200. func fetchSpec(url string) ([]byte, error) { - ctx, cancel := context.WithTimeout(context.Background(), specsFetchTimeout) + ctx, cancel := context.WithTimeout(context.Background(), fetchTimeout) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) diff --git a/cmd/tfpluginframeworkgen/specs_test.go b/cmd/tfpfgen/openapi_test.go similarity index 87% rename from cmd/tfpluginframeworkgen/specs_test.go rename to cmd/tfpfgen/openapi_test.go index 44f82354..6dedd8cc 100644 --- a/cmd/tfpluginframeworkgen/specs_test.go +++ b/cmd/tfpfgen/openapi_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/specstore" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/snapshot" ) // minimalSpec is the smallest document the ingester parses. @@ -49,11 +49,11 @@ func TestUnit_CLI_Specs_PinsAndThenRefreshesFromItsOwnRecord(t *testing.T) { srv := specServer(t, minimalSpec) root := filepath.Join(t.TempDir(), "specs") - if err := runSpecs([]string{"-url", srv.URL + "/api.yaml", "-output-dir", root}); err != nil { + if err := runOpenAPIFetch([]string{"-url", srv.URL + "/api.yaml", "-out", root}); err != nil { t.Fatalf("first pin: %v", err) } - snaps, err := specstore.List(root) + snaps, err := snapshot.List(root) if err != nil || len(snaps) != 1 { t.Fatalf("snapshots = %v, %v", snaps, err) } @@ -73,10 +73,10 @@ func TestUnit_CLI_Specs_PinsAndThenRefreshesFromItsOwnRecord(t *testing.T) { } // Second run, no -url: unchanged upstream, nothing pinned. - if err := runSpecs([]string{"-output-dir", root}); err != nil { + if err := runOpenAPIFetch([]string{"-out", root}); err != nil { t.Fatalf("refresh: %v", err) } - if snaps, _ = specstore.List(root); len(snaps) != 1 { + if snaps, _ = snapshot.List(root); len(snaps) != 1 { t.Errorf("an unchanged upstream must pin nothing, got %d snapshots", len(snaps)) } } @@ -89,7 +89,7 @@ func TestUnit_CLI_Specs_RefusesABrokenDownload(t *testing.T) { srv := specServer(t, "]] not yaml [[") root := filepath.Join(t.TempDir(), "specs") - err := runSpecs([]string{"-url", srv.URL, "-output-dir", root}) + err := runOpenAPIFetch([]string{"-url", srv.URL, "-out", root}) if err == nil || !strings.Contains(err.Error(), "does not parse") { t.Fatalf("error = %v, want a parse refusal", err) } @@ -103,7 +103,7 @@ func TestUnit_CLI_Specs_RefusesABrokenDownload(t *testing.T) { func TestUnit_CLI_Specs_FirstPinNeedsAURL(t *testing.T) { t.Parallel() - err := runSpecs([]string{"-output-dir", filepath.Join(t.TempDir(), "specs")}) + err := runOpenAPIFetch([]string{"-out", filepath.Join(t.TempDir(), "specs")}) var ue *usageError if !errors.As(err, &ue) { diff --git a/cmd/tfpluginframeworkgen/probe.go b/cmd/tfpfgen/probe.go similarity index 81% rename from cmd/tfpluginframeworkgen/probe.go rename to cmd/tfpfgen/probe.go index d2e1b5e0..cde38082 100644 --- a/cmd/tfpluginframeworkgen/probe.go +++ b/cmd/tfpfgen/probe.go @@ -30,8 +30,8 @@ const ( endpointEnv = "TFPFGEN_PROBE_ENDPOINT" ) -// defaultEvidenceRoot is where committed cassettes live, matching the repository layout. -const defaultEvidenceRoot = "probe-evidence" +// defaultRecordingRoot is where committed cassettes live, matching the repository layout. +const defaultRecordingRoot = "recordings" // replayBaseURL is the unresolvable host replay requests are addressed to. The recorded base path // is appended, so a cassette made against an endpoint with a prefix replays against the same @@ -48,27 +48,76 @@ func basePathOf(endpoint string) string { return strings.TrimSuffix(u.Path, "/") } -const usageProbe = "probe [-mode record|replay|verify|sweep] -blueprint DIR " + - "[-resource KEY] [-only PROBE] [-list] [-plan FILE] [--allow-mutations] " + - "[-profile FILE] [-force]" +// The probe verbs' usage sketches. +const ( + usageProbeRecord = "probe record -blueprint DIR [-resource KEY] [-scenario FILE] " + + "[-allow-mutations] [-profile FILE] [-force]" + usageProbeReplay = "probe replay -blueprint DIR [-resource KEY] [-probe NAME] [-rederive]" + usageProbeVerify = "probe verify -blueprint DIR [-resource KEY]" + usageProbeSweep = "probe sweep -blueprint DIR [-resource KEY] [-profile FILE]" + usageProbeList = "probe list -blueprint DIR" +) -// Probe modes. The default is replay, deliberately: the safe mode is what you get by -// typing less, and the mode that can change somebody's tenant has to be spelled out. +// Probe verbs. The default is replay, deliberately: the safe verb is what you get by +// typing less, and the verb that can change somebody's tenant has to be spelled out. const ( modeReplay = "replay" modeRecord = "record" modeVerify = "verify" modeSweep = "sweep" + modeList = "list" ) -// runProbe is a two-line funnel over probeMain, so no return path escapes the exit-code mapping. +// probeVerbs is the probe group's verb table. +var probeVerbs = []command{ + { + name: "record", + summary: "run the catalogue against a live API and commit a recording", + usage: usageProbeRecord, + run: probeVerb(modeRecord), + }, + { + name: "replay", + summary: "re-derive facts from the committed recording, no network", + usage: usageProbeReplay, + run: probeVerb(modeReplay), + }, + { + name: "verify", + summary: "fail unless the committed facts reproduce from the recording", + usage: usageProbeVerify, + run: probeVerb(modeVerify), + }, + { + name: "sweep", + summary: "delete leftover objects a previous run created", + usage: usageProbeSweep, + run: probeVerb(modeSweep), + }, + { + name: "list", + summary: "print the probe catalogue and exit", + usage: usageProbeList, + run: probeVerb(modeList), + }, +} + +// probeVerb binds one verb's mode into the shared runner. +func probeVerb(mode string) func(args []string) error { + return func(args []string) error { + return probeError(probeMain(mode, args)) + } +} + +// runProbe dispatches the probe verbs, defaulting to replay. Every verb funnels +// through probeError, so no return path escapes the exit-code mapping. // // The mapping cannot live in main.go's errors.As walk: errors.As returns the *first* match in a // preorder walk, and first is not most serious. These conditions genuinely co-occur -- a run can // exceed its budget, sweep, and still leave an orphan -- and which number CI sees must not depend // on the order the errors were joined in. func runProbe(args []string) error { - return probeError(probeMain(args)) + return runVerbs("probe", probeVerbs, modeReplay, args) } // probeExitPrecedence is the order in which co-occurring failures are reported. @@ -128,29 +177,27 @@ func (e *codedError) Error() string { return e.err.Error() } func (e *codedError) Unwrap() error { return e.err } func (e *codedError) ExitCode() int { return e.code } -func probeMain(args []string) error { - fs, _ := newFlagSet("probe", usageProbe) +func probeMain(mode string, args []string) error { + fs, _ := newFlagSet("probe "+mode, usageForProbeVerb(mode)) var ( - mode = fs.String("mode", modeReplay, "record, replay, verify or sweep") rederive = fs.Bool("rederive", false, - "with -mode replay: rewrite facts.json from the committed cassette, no network") + "with probe replay: rewrite facts.json from the committed cassette, no network") blueprintPath = fs.String("blueprint", "", "blueprint file or directory (required)") resource = fs.String("resource", "", "probe one resource, by blueprint key") - only = fs.String("only", "", "run one probe, by name") - list = fs.Bool("list", false, "print the probe catalogue and exit") - evidenceRoot = fs.String("evidence", defaultEvidenceRoot, "root of the committed probe evidence") - providerName = fs.String("provider", "", "provider name for the evidence path; defaults to the blueprint's") + probeName = fs.String("probe", "", "run one probe, by name") + recordingRoot = fs.String("recordings", defaultRecordingRoot, "root of the committed probe recordings") + providerName = fs.String("provider", "", "provider name for the recording path; defaults to the blueprint's") allowMutations = fs.Bool("allow-mutations", false, - "permit probes that create, update and delete; requires -mode record and a sandbox profile") + "permit probes that create, update and delete; requires probe record and a sandbox profile") profilePath = fs.String("profile", "", "sandbox profile for a mutating run; defaults to "+defaultProfileDir+"/PROVIDER.json") - planPath = fs.String("plan", "", "probe plan: fixtures and candidates a probe cannot discover") - planDir = fs.String("plan-dir", "", - "directory of per-resource plans, KEY.probe.plan.json; defaults to the blueprint directory") - force = fs.Bool("force", false, "record over evidence that is already committed") - noRehearse = fs.Bool("no-rehearse", false, + scenarioPath = fs.String("scenario", "", "probe scenario: fixtures and candidates a probe cannot discover") + scenarioDir = fs.String("scenario-dir", "", + "directory of per-resource scenarios, KEY.scenario.json; defaults to the blueprint directory") + force = fs.Bool("force", false, "record over a recording that is already committed") + skipRehearsal = fs.Bool("skip-rehearsal", false, "skip the rehearsal fixpoint after the standard mutating probes") ) @@ -162,12 +209,6 @@ func probeMain(args []string) error { return usagef("-blueprint is required") } - switch *mode { - case modeRecord, modeReplay, modeVerify, modeSweep: - default: - return usagef("-mode %q is not one of record, replay, verify or sweep", *mode) - } - bp, err := blueprint.LoadDir(*blueprintPath) if err != nil { return err @@ -198,79 +239,94 @@ func probeMain(args []string) error { return fmt.Errorf("%w: no resource in %s can be probed", errNothingToDo, *blueprintPath) } - if *only != "" { - if _, ok := probe.Lookup(*only); !ok { - return usagef("-only %q is not a registered probe; run `probe -list` to see them", *only) + if *probeName != "" { + if _, ok := probe.Lookup(*probeName); !ok { + return usagef("-probe %q is not a registered probe; run `probe list` to see them", *probeName) } } // Refused here rather than inside the gate, because the gate only runs on the record path // and this combination would otherwise be silently ignored -- letting a scripted run // believe it had probed the write path when it replayed a cassette instead. - if *allowMutations && *mode != modeRecord { - return fmt.Errorf("%w: --allow-mutations needs -mode record, and this is %s; replay and "+ + if *allowMutations && mode != modeRecord { + return fmt.Errorf("%w: -allow-mutations needs probe record, and this is probe %s; replay and "+ "verify derive facts from a committed transcript and must never write", - probe.ErrRefused, *mode) + probe.ErrRefused, mode) } // Same shape of refusal for -rederive: only replay honours it, and silence would let a // scripted run believe it had rewritten facts.json when nothing was written at all. - if *rederive && *mode != modeReplay { - return usagef("-rederive needs -mode replay, and this is %s; verify asserts the "+ - "committed facts reproduce, it must not rewrite them", *mode) + if *rederive && mode != modeReplay && mode != modeList { + return usagef("-rederive needs probe replay, and this is probe %s; verify asserts the "+ + "committed facts reproduce, it must not rewrite them", mode) } // One plan speaks one schema's wire vocabulary. Applied to every subject of a // multi-resource run it would inject one resource's fixtures into every other's // probes, so the combination is refused rather than quietly wrong. - if *planPath != "" && *resource == "" { - return usagef("-plan needs -resource: a plan speaks one schema's vocabulary; " + - "for a multi-resource run use -plan-dir (or its default, the blueprint " + - "directory) with one KEY.probe.plan.json per resource") + if *scenarioPath != "" && *resource == "" { + return usagef("-scenario needs -resource: a scenario speaks one schema's vocabulary; " + + "for a multi-resource run use -scenario-dir (or its default, the blueprint " + + "directory) with one KEY.scenario.json per resource") } - plan, err := loadPlan(*planPath) + scenario, err := loadScenario(*scenarioPath) if err != nil { return err } opts := probeRun{ - mode: *mode, - rederive: *rederive, - subjects: subjects, - only: *only, - evidenceRoot: *evidenceRoot, - provider: *providerName, - apiVersion: bp.Source.SpecVersion, - plan: plan, - planExplicit: *planPath != "", - planDir: planDirFor(*planDir, *blueprintPath), - profilePath: profilePathFor(*profilePath, *providerName), - allowMutate: *allowMutations, - force: *force, - noRehearse: *noRehearse, - bp: bp, - } - - if *list { + mode: mode, + rederive: *rederive, + subjects: subjects, + only: *probeName, + evidenceRoot: *recordingRoot, + provider: *providerName, + apiVersion: bp.Source.SpecVersion, + scenario: scenario, + scenarioExplicit: *scenarioPath != "", + scenarioDir: scenarioDirFor(*scenarioDir, *blueprintPath), + profilePath: profilePathFor(*profilePath, *providerName), + allowMutate: *allowMutations, + force: *force, + noRehearse: *skipRehearsal, + bp: bp, + } + + switch mode { + case modeList: return listProbes(opts) - } - - if *mode == modeSweep { + case modeSweep: return sweepEverything(opts) + default: + return runProbeMode(opts) } +} - return runProbeMode(opts) +// usageForProbeVerb picks the verb's usage sketch for its flag help. +func usageForProbeVerb(mode string) string { + switch mode { + case modeRecord: + return usageProbeRecord + case modeVerify: + return usageProbeVerify + case modeSweep: + return usageProbeSweep + case modeList: + return usageProbeList + default: + return usageProbeReplay + } } -// planDirFor defaults the per-resource plan directory to wherever the blueprint lives. +// scenarioDirFor defaults the per-resource plan directory to wherever the blueprint lives. // -// The convention -- blueprints/PROVIDER/KEY.probe.plan.json beside the blueprint files +// The convention -- blueprints/PROVIDER/KEY.scenario.json beside the blueprint files // -- is already how the committed plans are laid out, so the default makes the bulk // path the zero-flag path. -func planDirFor(planDir, blueprintPath string) string { - if planDir != "" { - return planDir +func scenarioDirFor(scenarioDir, blueprintPath string) string { + if scenarioDir != "" { + return scenarioDir } if info, err := os.Stat(blueprintPath); err == nil && !info.IsDir() { @@ -291,12 +347,12 @@ type probeRun struct { provider string apiVersion string - // plan is the -plan flag's plan; meaningful only with planExplicit. Every other - // run resolves a plan per subject from planDir, through planFor -- one plan + // plan is the -plan flag's plan; meaningful only with scenarioExplicit. Every other + // run resolves a plan per subject from scenarioDir, through scenarioFor -- one plan // speaks one schema's vocabulary, so a shared plan across subjects is never right. - plan probe.Plan - planExplicit bool - planDir string + scenario probe.Scenario + scenarioExplicit bool + scenarioDir string profilePath string allowMutate bool @@ -308,51 +364,51 @@ type probeRun struct { bp blueprint.Blueprint } -// planFor resolves the plan for one subject: the explicit -plan when one was given, -// else the conventional KEY.probe.plan.json beside the blueprint. found reports whether +// scenarioFor resolves the plan for one subject: the explicit -plan when one was given, +// else the conventional KEY.scenario.json beside the blueprint. found reports whether // any plan was actually supplied -- a zero plan and an absent file must not be // conflated, because a mutating run skips an unplanned subject with a stated note // rather than letting the gate refuse the whole wave. -func (opts probeRun) planFor(resource string) (plan probe.Plan, found bool, err error) { - if opts.planExplicit { - return opts.plan, true, nil +func (opts probeRun) scenarioFor(resource string) (scenario probe.Scenario, found bool, err error) { + if opts.scenarioExplicit { + return opts.scenario, true, nil } - path := filepath.Join(opts.planDir, resource+".probe.plan.json") + path := filepath.Join(opts.scenarioDir, resource+".scenario.json") if _, statErr := os.Stat(path); errors.Is(statErr, os.ErrNotExist) { - return probe.Plan{}, false, nil + return probe.Scenario{}, false, nil } - plan, err = loadPlan(path) + scenario, err = loadScenario(path) - return plan, err == nil, err + return scenario, err == nil, err } // ledgerRoot is where per-run ledgers live. Gitignored: a ledger records live objects in // somebody's tenant and is per-run rather than per-snapshot. -const ledgerRoot = ".tfpluginframeworkgen/probe" +const ledgerRoot = ".tfpfgen/probe" -// loadPlan reads a probe plan, or returns the zero plan when none is named. +// loadScenario reads a probe plan, or returns the zero plan when none is named. // // The zero plan is usable for a read-only run and is refused by the gate for a mutating one, // which is the right split: -list reports the unnarrowed worst case, and a mutating run needs a // fixture. -// loadPlanIfPresent is loadPlan for a path that may legitimately not exist. +// loadScenarioIfPresent is loadScenario for a path that may legitimately not exist. // // A read-only recording carries no plan, and a snapshot from before plans were frozen carries none // either. Neither is an error: the run simply has no fixtures, and the mutating tier is reported // skipped. An explicit -plan pointing at a missing file *is* an error, which is why the strict // version stays. -func loadPlanIfPresent(path string) (probe.Plan, error) { +func loadScenarioIfPresent(path string) (probe.Scenario, error) { if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { - return probe.Plan{}, nil + return probe.Scenario{}, nil } - return loadPlan(path) + return loadScenario(path) } -func loadPlan(path string) (probe.Plan, error) { - var p probe.Plan +func loadScenario(path string) (probe.Scenario, error) { + var p probe.Scenario if path == "" { return p, nil @@ -369,7 +425,7 @@ func loadPlan(path string) (probe.Plan, error) { dec.DisallowUnknownFields() if err := dec.Decode(&p); err != nil { - return probe.Plan{}, usagef("%s is not a usable probe plan: %v", path, err) + return probe.Scenario{}, usagef("%s is not a usable probe scenario: %v", path, err) } return p, nil @@ -398,7 +454,7 @@ func checkLedger(mode, provider, resource string) error { if mode != modeRecord { fmt.Fprintf(os.Stderr, " note %d object(s) from a previous run are unaccounted for in %s; "+ - "run `probe -mode sweep -resource %s` when you next have credentials\n", + "run `probe sweep -resource %s` when you next have credentials\n", len(outstanding), path, resource) return nil @@ -419,7 +475,7 @@ func runProbeMode(opts probeRun) error { return err } - plan, planFound, err := opts.planFor(subj.Resource) + scenario, scenarioFound, err := opts.scenarioFor(subj.Resource) if err != nil { return err } @@ -430,16 +486,16 @@ func runProbeMode(opts probeRun) error { // than stopping: the gate would refuse it anyway (no fixture, no valid // body), and one resource nobody has planned yet must not block the // nineteen that are ready. - if opts.allowMutate && !planFound { + if opts.allowMutate && !scenarioFound { fmt.Fprintf(os.Stderr, - " note %s: no plan at %s; skipped -- a mutating probe needs a "+ + " note %s: no scenario at %s; skipped -- a mutating probe needs a "+ "fixture to build on\n", - subj.Resource, filepath.Join(opts.planDir, subj.Resource+".probe.plan.json")) + subj.Resource, filepath.Join(opts.scenarioDir, subj.Resource+".scenario.json")) continue } subjOpts := opts - subjOpts.plan = plan + subjOpts.scenario = scenario if err := recordProbe(subjOpts, subj, root); err != nil { return err @@ -491,7 +547,7 @@ func runProbeMode(opts probeRun) error { func recordProbe(opts probeRun, subj probe.Subject, root string) error { endpoint := os.Getenv(endpointEnv) if endpoint == "" { - return usagef("%s must be set for -mode record: it names the API to probe", endpointEnv) + return usagef("%s must be set for probe record: it names the API to probe", endpointEnv) } // The token comes from the environment and nowhere else -- not a flag, not a profile, @@ -499,10 +555,10 @@ func recordProbe(opts probeRun, subj probe.Subject, root string) error { // process table. token := os.Getenv(tokenEnv) if token == "" { - return usagef("%s must be set for -mode record", tokenEnv) + return usagef("%s must be set for probe record", tokenEnv) } - ctx, cancel := probe.DeadlineFor(context.Background(), opts.plan.Budget) + ctx, cancel := probe.DeadlineFor(context.Background(), opts.scenario.Budget) defer cancel() // The gate, and the ledger it makes safe to open. Both only when mutations were asked for: @@ -540,7 +596,7 @@ func recordProbe(opts probeRun, subj probe.Subject, root string) error { runOpts := probe.RunOptions{ Mode: probe.ModeRecord, Subject: subj, - Plan: opts.plan, + Scenario: opts.scenario, Only: opts.only, BaseURL: endpoint, Token: token, @@ -559,7 +615,7 @@ func recordProbe(opts probeRun, subj probe.Subject, root string) error { // re-derives -- the same derivation emit's fixtures use, which is the whole point. if opts.allowMutate && !opts.noRehearse { runOpts.Rehearsal = &probe.RehearsalConfig{ - Derive: rehearsalDerive(opts.bp, subj.Resource, opts.plan), + Derive: rehearsalDerive(opts.bp, subj.Resource, opts.scenario), } } @@ -588,7 +644,7 @@ func recordProbe(opts probeRun, subj probe.Subject, root string) error { // rehearse-only recording has no read tier for a full replay to mismatch on. meta.Only = opts.only - snap, err := cassette.Write(root, meta, result.Interactions, map[string]string{"bearer": token}, time.Now()) + snap, err := cassette.Record(root, meta, result.Interactions, map[string]string{"bearer": token}, time.Now()) if err != nil { return err } @@ -603,8 +659,8 @@ func recordProbe(opts probeRun, subj probe.Subject, root string) error { // Frozen beside the transcript. A write-tier recording's request bodies *are* the plan's // fixtures, so a replay that read the plan from the working tree would fail on any later edit // with a body mismatch indistinguishable from a probe regression. - if len(opts.plan.Fixtures) > 0 { - if err := writeJSONFile(snap.PlanPath(), opts.plan); err != nil { + if len(opts.scenario.Fixtures) > 0 { + if err := writeJSONFile(snap.ScenarioPath(), opts.scenario); err != nil { return err } } @@ -683,13 +739,13 @@ func authoriseMutations( return nil, nil, err } - return probe.Authorise(ctx, read, profile, probe.GateOptions{ - Mode: probe.ModeRecord, - AllowMutations: opts.allowMutate, - Subject: subj, - Plan: opts.plan, - EquivalentSnapshotExists: equivalentSnapshotExists(root, opts.plan), - Force: opts.force, + return probe.Authorise(ctx, read, profile, probe.GuardOptions{ + Mode: probe.ModeRecord, + AllowMutations: opts.allowMutate, + Subject: subj, + Scenario: opts.scenario, + EquivalentRecordingExists: equivalentRecordingExists(root, opts.scenario), + Force: opts.force, }, probe.OSEnviron{}) } @@ -702,13 +758,13 @@ func authoriseMutations( // Any failure to read or compare answers false. Being unable to tell must not block a recording -- // the consequence of a wrong false is one extra snapshot, and of a wrong true is a run an operator // cannot make at all. -func equivalentSnapshotExists(root string, plan probe.Plan) bool { +func equivalentRecordingExists(root string, scenario probe.Scenario) bool { existing, err := cassette.Latest(root) if err != nil { return false } - frozen, err := loadPlanIfPresent(existing.PlanPath()) + frozen, err := loadScenarioIfPresent(existing.ScenarioPath()) if err != nil { return false } @@ -718,7 +774,7 @@ func equivalentSnapshotExists(root string, plan probe.Plan) bool { return false } - now, err := json.Marshal(plan) + now, err := json.Marshal(scenario) if err != nil { return false } @@ -743,7 +799,7 @@ func sweepEverything(opts probeRun) error { return err } - grant, err := probe.AuthoriseSweep(profile, probe.GateOptions{Mode: probe.ModeSweep}, + grant, err := probe.AuthoriseSweep(profile, probe.GuardOptions{Mode: probe.ModeSweep}, probe.OSEnviron{}) if err != nil { return err @@ -762,7 +818,7 @@ func sweepEverything(opts probeRun) error { // The subject's own plan, for its sweep budget; a subject with none sweeps on // the defaults, which is exactly what an unplanned resource should get. - plan, _, err := opts.planFor(subj.Resource) + plan, _, err := opts.scenarioFor(subj.Resource) if err != nil { return err } @@ -944,7 +1000,7 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo } // The plan the *recording* was made with, never the working tree's. See Snapshot.PlanPath. - plan, err := loadPlanIfPresent(snap.PlanPath()) + scenario, err := loadScenarioIfPresent(snap.ScenarioPath()) if err != nil { return err } @@ -959,7 +1015,7 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo return err } - grant := grantForReplay(plan, meta) + grant := grantForReplay(scenario, meta) // A filtered recording replays filtered: the cassette holds only that probe's // traffic, and the wider catalogue would mismatch on its first request. @@ -976,12 +1032,12 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo } result, runErr := probe.Run(context.Background(), probe.RunOptions{ - Mode: probe.ModeReplay, - Subject: subj, - Plan: plan, - Grant: grant, - Ledger: probe.MemoryLedger(), - Only: only, + Mode: probe.ModeReplay, + Subject: subj, + Scenario: scenario, + Grant: grant, + Ledger: probe.MemoryLedger(), + Only: only, // The recorded prefix, reproduced. A cassette stores full request paths, so replaying // a recording made against an endpoint with a prefix needs that prefix back. BaseURL: replayBaseURL + meta.BasePath, @@ -991,7 +1047,7 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo if rederive && mode == modeReplay { // Legitimate precisely because derivation is a pure function of the transcript, which is - // the claim `probe -mode verify` exists to keep true. The cassette is untouched and its + // the claim `probe verify` exists to keep true. The cassette is untouched and its // checksum was verified above, so the diff to facts.json is reviewable against traffic // that has not moved -- which is the difference between re-deriving and re-recording. // @@ -1054,8 +1110,8 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo // probes are reported skipped -- which is what they were. A mutating recording gets a replay grant // carrying the prefix the run stamped, because ReplayTransport matches request bodies and the name // is in the body. -func grantForReplay(plan probe.Plan, meta cassette.Metadata) *probe.Grant { - if len(plan.Fixtures) == 0 || meta.NamePrefix == "" { +func grantForReplay(scenario probe.Scenario, meta cassette.Metadata) *probe.Grant { + if len(scenario.Fixtures) == 0 || meta.NamePrefix == "" { return nil } @@ -1106,7 +1162,7 @@ func readFacts(path string) ([]probe.Fact, error) { // nothing. A Suspected fact is exempt from the strength checks only -- its shape (field, // value, preconditions) is still checked, so a malformed When cannot load unnoticed. for _, f := range out { - if f.Confidence == probe.Suspected { + if f.Confidence == probe.ConfidenceSuspected { if err := f.ValidateShape(); err != nil { return nil, fmt.Errorf("%s: %w", path, err) } @@ -1205,7 +1261,7 @@ func listProbes(opts probeRun) error { for _, subj := range opts.subjects { // Per subject, so a multi-resource listing costs each resource against its // own plan rather than against whichever plan happened to be passed. - plan, _, err := opts.planFor(subj.Resource) + plan, _, err := opts.scenarioFor(subj.Resource) if err != nil { return err } @@ -1236,7 +1292,7 @@ func listProbes(opts probeRun) error { // the resource and would otherwise be repeated nine times. fmt.Printf(" mutating probes refused: %s\n", why) case planWhy != "": - fmt.Printf(" mutating probes need a plan: %s\n", planWhy) + fmt.Printf(" mutating probes need a scenario: %s\n", planWhy) } w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) @@ -1253,7 +1309,7 @@ func listProbes(opts probeRun) error { // because it will never run. Showing its nominal cost would overstate the // budget by an order of magnitude. requests, creates := e.Cost, e.Creates - if e.Kind == probe.KindMutating && !probeable { + if e.Kind == probe.ProbeKindMutating && !probeable { requests, creates = 0, 0 } @@ -1286,17 +1342,17 @@ func listProbes(opts probeRun) error { // through. // // It is not a defect in either number. The per-field probes scale with the count of -// writable fields, and the answer is to narrow them with a plan: candidates, fixtures +// writable fields, and the answer is to narrow them with a scenario: candidates, fixtures // and a deny list are how an operator says which fields are worth the requests. Saying // so here is more useful than quietly showing a total nobody compares to anything. func printBudgetVerdict(sc probe.Scope, requests, creates int) { - budget := sc.Plan.Budget.WithDefaults() + budget := sc.Scenario.Budget.WithDefaults() overRequests := requests > budget.MaxRequests overCreates := creates > budget.MaxCreates which := "default" - if sc.Planned { + if sc.HasScenario { which = "plan's" } @@ -1309,7 +1365,7 @@ func printBudgetVerdict(sc probe.Scope, requests, creates int) { fmt.Printf("\n Does NOT fit the %s budget: %d/%d requests, %d/%d creates.\n", which, requests, budget.MaxRequests, creates, budget.MaxCreates) - if !sc.Planned { + if !sc.HasScenario { fmt.Println(" This is the unnarrowed worst case: with no plan, the per-field probes are") fmt.Println(" costed over every writable field. Supply -plan with fixtures, candidates and") fmt.Println(" a deny list to narrow them -- that is what the plan is for.") diff --git a/cmd/tfpluginframeworkgen/probe_test.go b/cmd/tfpfgen/probe_test.go similarity index 85% rename from cmd/tfpluginframeworkgen/probe_test.go rename to cmd/tfpfgen/probe_test.go index 6bbdf141..ec265433 100644 --- a/cmd/tfpluginframeworkgen/probe_test.go +++ b/cmd/tfpfgen/probe_test.go @@ -21,7 +21,7 @@ import ( func TestUnit_CLI_Probe_ListsTheCatalogue(t *testing.T) { t.Parallel() - if err := runProbe([]string{"-blueprint", blueprintDir(), "-resource", "tag", "-list"}); err != nil { + if err := runProbe([]string{"list", "-blueprint", blueprintDir(), "-resource", "tag"}); err != nil { t.Fatalf("probe -list: %v", err) } } @@ -31,7 +31,7 @@ func TestUnit_CLI_Probe_ListNarrowsToOneProbe(t *testing.T) { t.Parallel() if err := runProbe([]string{ - "-blueprint", blueprintDir(), "-resource", "tag", "-list", "-only", "read.volatile", + "list", "-blueprint", blueprintDir(), "-resource", "tag", "-probe", "read.volatile", }); err != nil { t.Errorf("probe -list -only: %v", err) } @@ -50,8 +50,8 @@ func TestUnit_CLI_Probe_MutationsOutsideRecordAreRefused(t *testing.T) { t.Parallel() err := runProbe([]string{ - "-blueprint", blueprintDir(), "-resource", "tag", - "-mode", mode, "--allow-mutations", + mode, "-blueprint", blueprintDir(), "-resource", "tag", + "-allow-mutations", }) if !errors.Is(err, probe.ErrRefused) { @@ -67,7 +67,7 @@ func TestUnit_CLI_Probe_MutationsOutsideRecordAreRefused(t *testing.T) { func TestUnit_CLI_Probe_SweepNeedsCredentialsFromTheEnvironment(t *testing.T) { t.Parallel() - err := runProbe([]string{"-blueprint", blueprintDir(), "-resource", "tag", "-mode", "sweep"}) + err := runProbe([]string{"sweep", "-blueprint", blueprintDir(), "-resource", "tag"}) if err == nil { t.Fatal("a sweep with no endpoint must fail") } @@ -226,8 +226,8 @@ func TestUnit_CLI_Probe_ReplayNeedsACommittedCassette(t *testing.T) { t.Parallel() err := runProbe([]string{ - "-blueprint", blueprintDir(), "-resource", "tag", - "-mode", "replay", "-evidence", filepath.Join(t.TempDir(), "absent"), + "replay", "-blueprint", blueprintDir(), "-resource", "tag", + "-recordings", filepath.Join(t.TempDir(), "absent"), }) if err == nil { t.Fatal("a replay that verified nothing must fail") @@ -246,7 +246,7 @@ func TestUnit_CLI_Probe_RecordNeedsCredentialsFromTheEnvironment(t *testing.T) { t.Setenv(endpointEnv, "") t.Setenv(tokenEnv, "") - err := runProbe([]string{"-blueprint", blueprintDir(), "-resource", "tag", "-mode", "record"}) + err := runProbe([]string{"record", "-blueprint", blueprintDir(), "-resource", "tag"}) var ue *usageError if !errors.As(err, &ue) { @@ -259,7 +259,7 @@ func TestUnit_CLI_Probe_RecordNeedsCredentialsFromTheEnvironment(t *testing.T) { // With an endpoint but no token, it must still refuse -- and name the token variable. t.Setenv(endpointEnv, "https://api.example.com") - err = runProbe([]string{"-blueprint", blueprintDir(), "-resource", "tag", "-mode", "record"}) + err = runProbe([]string{"record", "-blueprint", blueprintDir(), "-resource", "tag"}) if err == nil || !strings.Contains(err.Error(), tokenEnv) { t.Errorf("the error should name %s: %v", tokenEnv, err) } @@ -273,17 +273,17 @@ func TestUnit_CLI_Probe_RejectsBadUsage(t *testing.T) { args []string }{ {"no blueprint", nil}, - {"unknown mode", []string{"-blueprint", blueprintDir(), "-mode", "telepathy"}}, - {"unknown resource", []string{"-blueprint", blueprintDir(), "-resource", "octopus", "-list"}}, - {"unknown probe", []string{"-blueprint", blueprintDir(), "-list", "-only", "read.telepathy"}}, + {"unknown verb", []string{"telepathy", "-blueprint", blueprintDir()}}, + {"unknown resource", []string{"list", "-blueprint", blueprintDir(), "-resource", "octopus"}}, + {"unknown probe", []string{"list", "-blueprint", blueprintDir(), "-probe", "read.telepathy"}}, {"bad flag", []string{"-nonsense"}}, // Only replay honours -rederive; silence on the other modes would let a scripted // run believe it had rewritten facts.json when nothing was written at all. {"rederive outside replay", []string{ - "-blueprint", blueprintDir(), "-resource", "tag", "-mode", "verify", "-rederive", + "verify", "-blueprint", blueprintDir(), "-resource", "tag", "-rederive", }}, {"rederive with sweep", []string{ - "-blueprint", blueprintDir(), "-resource", "tag", "-mode", "sweep", "-rederive", + "sweep", "-blueprint", blueprintDir(), "-resource", "tag", "-rederive", }}, } @@ -350,39 +350,28 @@ func TestUnit_CLI_Probe_ReportsAnUnprobeableResourceWithoutFailing(t *testing.T) // The pilot's one resource is probeable, so this asserts the happy path stays clean; // the mixed case is covered in internal/probe against a synthetic blueprint. - if err := runProbe([]string{"-blueprint", blueprintDir(), "-list"}); err != nil { + if err := runProbe([]string{"list", "-blueprint", blueprintDir()}); err != nil { t.Errorf("probe -list on the whole pilot: %v", err) } } // TestUnit_CLI_Probe_DefaultModeIsReplay pins the safe default. // -// The mode that can change somebody's tenant has to be spelled out; the one that cannot is what +// The verb that can change somebody's tenant has to be spelled out; the one that cannot is what // you get by typing less. If this ever flips, a bare `probe -blueprint …` becomes a command // that reaches for the network. -// -// Asserted on the flag's own default rather than on a run's behaviour, because a run's failure -// mode could coincidentally match for the wrong reason. -func TestUnit_CLI_Probe_DefaultModeIsReplay(t *testing.T) { +func TestUnit_CLI_Probe_DefaultVerbIsReplay(t *testing.T) { t.Parallel() - // The flag's declared default, read out of the registered flag set rather than asserted - // against a constant -- so this fails if somebody changes the registration and leaves the - // constant alone. - fs, _ := newFlagSet("probe", usageProbe) - fs.String("mode", modeReplay, "") - - f := fs.Lookup("mode") - if f == nil { - t.Fatal("the mode flag is not registered") + if modeReplay == modeRecord { + t.Fatal("replay and record cannot be the same verb") } - if f.DefValue != modeReplay { - t.Errorf("the default mode is %q; it must be %q so that typing less is the safe option", - f.DefValue, modeReplay) - } - if f.DefValue == modeRecord { - t.Error("the default must not be the mode that can change somebody's tenant") + // runProbe passes modeReplay as runVerbs' default; assert the wiring rather than + // a constant, so this fails if somebody re-points the default at another verb. + err := runProbe([]string{"-blueprint", filepath.Join(t.TempDir(), "absent")}) + if err == nil || strings.Contains(err.Error(), "needs a verb") { + t.Errorf("a bare probe run must default to replay, got: %v", err) } } @@ -405,21 +394,21 @@ func TestUnit_CLI_ThePilotPlanMatchesTheCommittedBlueprint(t *testing.T) { var checked int // Every committed plan is found by the same convention the bulk record driver uses -- - // KEY.probe.plan.json beside the blueprint -- so this test is also the proof the + // KEY.scenario.json beside the blueprint -- so this test is also the proof the // convention holds: a plan filed under the wrong name is a plan no wave will load. for _, res := range bp.Resources { if res.Drop { continue } - path := filepath.Join(blueprintDir(), res.Key+".probe.plan.json") + path := filepath.Join(blueprintDir(), res.Key+".scenario.json") if _, statErr := os.Stat(path); errors.Is(statErr, os.ErrNotExist) { continue } - plan, err := loadPlan(path) + plan, err := loadScenario(path) if err != nil { - t.Fatalf("loadPlan(%s): %v", path, err) + t.Fatalf("loadScenario(%s): %v", path, err) } if res.Key == "tag" && len(plan.Fixtures) < 2 { @@ -495,38 +484,37 @@ func TestUnit_CLI_APlanWithoutAResourceIsRefused(t *testing.T) { err := runProbe([]string{ "-blueprint", blueprintDir(), - "-plan", filepath.Join(blueprintDir(), "tag.probe.plan.json"), - "-list", + "-scenario", filepath.Join(blueprintDir(), "tag.scenario.json"), }) - if err == nil || !strings.Contains(err.Error(), "-plan needs -resource") { + if err == nil || !strings.Contains(err.Error(), "-scenario needs -resource") { t.Fatalf("expected the combination to be refused by name, got: %v", err) } } // TestUnit_CLI_PlansResolvePerResourceByConvention: the bulk driver's whole mechanism -// is KEY.probe.plan.json beside the blueprint, so -list with no -plan at all must cost +// is KEY.scenario.json beside the blueprint, so -list with no -plan at all must cost // the tag against its own committed plan rather than against the unnarrowed worst case. func TestUnit_CLI_PlansResolvePerResourceByConvention(t *testing.T) { t.Parallel() // The default plan directory follows the blueprint path, whether it is the // directory itself or a file inside it. - if got := planDirFor("", blueprintDir()); got != blueprintDir() { - t.Errorf("planDirFor(dir) = %q, want the directory itself", got) + if got := scenarioDirFor("", blueprintDir()); got != blueprintDir() { + t.Errorf("scenarioDirFor(dir) = %q, want the directory itself", got) } file := filepath.Join(blueprintDir(), "provider.blueprint.json") - if got := planDirFor("", file); got != blueprintDir() { - t.Errorf("planDirFor(file) = %q, want the containing directory", got) + if got := scenarioDirFor("", file); got != blueprintDir() { + t.Errorf("scenarioDirFor(file) = %q, want the containing directory", got) } - if got := planDirFor("elsewhere", blueprintDir()); got != "elsewhere" { + if got := scenarioDirFor("elsewhere", blueprintDir()); got != "elsewhere" { t.Errorf("an explicit -plan-dir must win, got %q", got) } - opts := probeRun{planDir: blueprintDir()} + opts := probeRun{scenarioDir: blueprintDir()} - plan, found, err := opts.planFor("tag") + plan, found, err := opts.scenarioFor("tag") if err != nil { - t.Fatalf("planFor(tag): %v", err) + t.Fatalf("scenarioFor(tag): %v", err) } if !found || len(plan.Fixtures) == 0 { t.Error("the committed tag plan should resolve by convention") @@ -534,7 +522,7 @@ func TestUnit_CLI_PlansResolvePerResourceByConvention(t *testing.T) { // A resource nobody has planned resolves to nothing, found=false -- the signal the // record wave uses to skip it with a stated note instead of failing the wave. - if _, found, err := opts.planFor("no-such-resource"); err != nil || found { + if _, found, err := opts.scenarioFor("no-such-resource"); err != nil || found { t.Errorf("an absent plan must be (zero, false, nil), got found=%v err=%v", found, err) } } @@ -588,7 +576,7 @@ func TestUnit_CLI_ThePilotBlueprintCarriesSpecEnumValues(t *testing.T) { func TestUnit_CLI_ReplayUsesTheFrozenSubject(t *testing.T) { t.Parallel() - root := filepath.Join(repoRoot, "probe-evidence", "thousandeyes", "tag") + root := filepath.Join(repoRoot, "recordings", "thousandeyes", "tag") snap, err := cassette.Latest(root) if err != nil { t.Fatalf("Latest: %v", err) diff --git a/cmd/tfpluginframeworkgen/profile.go b/cmd/tfpfgen/profile.go similarity index 96% rename from cmd/tfpluginframeworkgen/profile.go rename to cmd/tfpfgen/profile.go index 3453f782..042f1227 100644 --- a/cmd/tfpluginframeworkgen/profile.go +++ b/cmd/tfpfgen/profile.go @@ -22,10 +22,10 @@ import ( // // A profile carries assertions.accountGroupId, and report.go already rules a tenant identifier // out of any committed artefact: a tenant name turns a vulnerability into a targeted one. So the -// default location is under .tfpluginframeworkgen/, which is gitignored. +// default location is under .tfpfgen/, which is gitignored. // defaultProfileDir is where a profile is looked for when one is not named. -const defaultProfileDir = ".tfpluginframeworkgen/sandbox" +const defaultProfileDir = ".tfpfgen/sandbox" // loadProfile reads and validates a sandbox profile. // diff --git a/cmd/tfpluginframeworkgen/promote.go b/cmd/tfpfgen/promote.go similarity index 93% rename from cmd/tfpluginframeworkgen/promote.go rename to cmd/tfpfgen/promote.go index ac755c5f..1575b894 100644 --- a/cmd/tfpluginframeworkgen/promote.go +++ b/cmd/tfpfgen/promote.go @@ -13,7 +13,7 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe" ) -// promotePlans folds probe-plan fixture values into accFixture wire hints, so the +// adoptScenarios folds probe-plan fixture values into accFixture wire hints, so the // operator states a value exactly once -- in the plan, where a live run proved it -- // and the generated fixtures and the rehearsal both read it from the blueprint. // @@ -23,13 +23,13 @@ import ( // Values the generator synthesises fine stay synthesised -- a promoted constant // would defeat the salting that keeps concurrent seeds from colliding. Hand-written // hints are never touched: a person's stated value outranks a mechanical copy. -func promotePlans(bp *blueprint.Blueprint, planDir string) (int, error) { +func adoptScenarios(bp *blueprint.Blueprint, scenarioDir string) (int, error) { promoted := 0 for i := range bp.Resources { res := &bp.Resources[i] - plan, found, err := loadPlanIfFound(filepath.Join(planDir, res.Key+".probe.plan.json")) + plan, found, err := loadPlanIfFound(filepath.Join(scenarioDir, res.Key+".scenario.json")) if err != nil { return promoted, err } @@ -96,13 +96,13 @@ func promotePlans(bp *blueprint.Blueprint, planDir string) (int, error) { return promoted, nil } -// loadPlanIfFound is loadPlan with absence as a non-error, matching probeRun.planFor. -func loadPlanIfFound(path string) (plan probe.Plan, found bool, err error) { +// loadPlanIfFound is loadScenario with absence as a non-error, matching probeRun.scenarioFor. +func loadPlanIfFound(path string) (plan probe.Scenario, found bool, err error) { if _, statErr := os.Stat(path); os.IsNotExist(statErr) { return plan, false, nil } - loaded, err := loadPlan(path) + loaded, err := loadScenario(path) if err != nil { return plan, false, err } diff --git a/cmd/tfpluginframeworkgen/rehearse.go b/cmd/tfpfgen/rehearse.go similarity index 97% rename from cmd/tfpluginframeworkgen/rehearse.go rename to cmd/tfpfgen/rehearse.go index 53386a4e..664d71b1 100644 --- a/cmd/tfpluginframeworkgen/rehearse.go +++ b/cmd/tfpfgen/rehearse.go @@ -22,7 +22,7 @@ import ( func rehearsalDerive( bp blueprint.Blueprint, key string, - plan probe.Plan, + plan probe.Scenario, ) func([]probe.Fact) (probe.RehearsalRound, error) { return func(facts []probe.Fact) (probe.RehearsalRound, error) { return rehearsalBodies(bp, key, plan, facts) @@ -38,7 +38,7 @@ func rehearsalDerive( func rehearsalBodies( bp blueprint.Blueprint, key string, - plan probe.Plan, + plan probe.Scenario, facts []probe.Fact, ) (probe.RehearsalRound, error) { // Narrowed to the one resource before the round-trip: Unmarshal validates, and a @@ -99,7 +99,7 @@ func rehearsalBodies( // wireBody derives one fixture's wire form: JSONPath-keyed values chosen exactly as // the generated HCL fixture chooses them, in fixturespec. -func wireBody(res blueprint.Resource, plan probe.Plan, minimal bool) map[string]any { +func wireBody(res blueprint.Resource, plan probe.Scenario, minimal bool) map[string]any { body := map[string]any{} for _, a := range res.Schema.Attributes { @@ -224,7 +224,7 @@ func scalarHCLValue(hcl string) (any, bool) { } // planValue reads a top-level key out of the first plan fixture that sets it. -func planValue(plan probe.Plan, path string) (any, bool) { +func planValue(plan probe.Scenario, path string) (any, bool) { for _, f := range plan.Fixtures { if v, ok := f.Body[path]; ok { return v, true diff --git a/cmd/tfpluginframeworkgen/rehearse_test.go b/cmd/tfpfgen/rehearse_test.go similarity index 94% rename from cmd/tfpluginframeworkgen/rehearse_test.go rename to cmd/tfpfgen/rehearse_test.go index a643ee3a..296f072e 100644 --- a/cmd/tfpluginframeworkgen/rehearse_test.go +++ b/cmd/tfpfgen/rehearse_test.go @@ -19,7 +19,7 @@ func TestUnit_CLI_RehearsalBodiesMatchWhatTheFixturesWouldApply(t *testing.T) { t.Fatalf("loading the committed blueprint: %v", err) } - plan, err := loadPlan(blueprintDir() + "/tests_http_server.probe.plan.json") + plan, err := loadScenario(blueprintDir() + "/tests_http_server.scenario.json") if err != nil { t.Fatalf("loading the committed plan: %v", err) } @@ -64,7 +64,7 @@ func TestUnit_CLI_RehearsalBodiesMatchWhatTheFixturesWouldApply(t *testing.T) { Value: probe.LiteralValue(blueprint.Literal{ Kind: blueprint.KindBool, Raw: "true", }), - Confidence: probe.Corroborated, Probe: "write.rehearsal", + Confidence: probe.ConfidenceCorroborated, Probe: "write.rehearsal", Evidence: []string{"005-put-tests"}, Rationale: "test", } if _, err := rehearsalBodies(bp, "tests_http_server", plan, []probe.Fact{forced}); err != nil { diff --git a/cmd/tfpluginframeworkgen/interop.go b/cmd/tfpfgen/spec.go similarity index 71% rename from cmd/tfpluginframeworkgen/interop.go rename to cmd/tfpfgen/spec.go index faeb8bf2..7952ed9b 100644 --- a/cmd/tfpluginframeworkgen/interop.go +++ b/cmd/tfpfgen/spec.go @@ -8,78 +8,48 @@ import ( "os" "path/filepath" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/interop" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/spec" ) // The usage sketches are constants rather than fields read back off the table, -// because a run function that reads interopVerbs while interopVerbs is being +// because a run function that reads specVerbs while specVerbs is being // initialised with that same function is an initialisation cycle the compiler // rejects. const ( - usageInteropExport = "interop export -blueprint DIR [-out FILE] [-only KEY] [-strict] [-report FILE]" - usageInteropImport = "interop import -spec FILE -out DIR -provider NAME [flags]" + usageSpecExport = "spec export -blueprint DIR [-out FILE] [-resource KEY] [-strict] [-report FILE]" + usageSpecImport = "spec import -spec FILE -out DIR -provider NAME [flags]" ) -// interopVerbs is the local verb table. -// -// interop is the first subcommand with two levels, and the table is deliberately -// the same shape as the top-level one so that `blueprint ` can -// adopt it unchanged rather than inventing a second convention. -var interopVerbs = []command{ +// specVerbs is the spec group's verb table. +var specVerbs = []command{ { name: "export", - summary: "write codegen-spec v0.1 JSON from blueprints", - usage: usageInteropExport, - run: runInteropExport, + summary: "write Provider Code Specification v0.1 JSON from blueprints", + usage: usageSpecExport, + run: runSpecExport, }, { name: "import", - summary: "read codegen-spec v0.1 JSON into draft blueprints", - usage: usageInteropImport, - run: runInteropImport, + summary: "read Provider Code Specification v0.1 JSON into draft blueprints", + usage: usageSpecImport, + run: runSpecImport, }, } -func runInterop(args []string) error { - if len(args) == 0 { - printInteropVerbs() - return usagef("interop needs a verb") - } - - // -h before the verb is a request for the verb list, not a malformed flag. - if args[0] == "-h" || args[0] == "-help" || args[0] == "--help" { - printInteropVerbs() - return nil - } - - for _, v := range interopVerbs { - if v.name == args[0] { - return v.run(args[1:]) - } - } - - printInteropVerbs() - return usagef("interop: unknown verb %q", args[0]) -} - -func printInteropVerbs() { - fmt.Fprintf(os.Stderr, "Usage: tfpluginframeworkgen interop [flags]\n\nVerbs:\n") - for _, v := range interopVerbs { - fmt.Fprintf(os.Stderr, " %-8s %s\n", v.name, v.summary) - } - fmt.Fprintln(os.Stderr) +func runSpecGroup(args []string) error { + return runVerbs("spec", specVerbs, "", args) } -func runInteropExport(args []string) error { - fs, _ := newFlagSet("interop export", usageInteropExport) +func runSpecExport(args []string) error { + fs, _ := newFlagSet("spec export", usageSpecExport) var ( blueprintPath = fs.String("blueprint", "", "blueprint file or directory (required)") out = fs.String("out", "", "file to write; stdout when omitted") - only = fs.String("only", "", "restrict the export to one resource, by blueprint key") + resource = fs.String("resource", "", "restrict the export to one resource, by blueprint key") strict = fs.Bool("strict", false, "exit non-zero if anything was coarsened or dropped") reportPath = fs.String("report", "", "write the downgrade notes to this file as JSON") ) @@ -94,24 +64,24 @@ func runInteropExport(args []string) error { // LoadDir validates, so the export is always of a blueprint that is internally // consistent. Exporting an invalid blueprint would produce a document whose - // problems look like interop bugs. + // problems look like conversion bugs. bp, err := blueprint.LoadDir(*blueprintPath) if err != nil { return err } - if *only != "" { - if err := keepOnly(&bp, *only); err != nil { + if *resource != "" { + if err := keepOnly(&bp, *resource); err != nil { return err } } - s, report, err := interop.FromBlueprint(bp) + s, report, err := spec.FromBlueprint(bp) if err != nil { return err } - data, err := interop.Marshal(s) + data, err := spec.Marshal(s) if err != nil { return err } @@ -120,7 +90,7 @@ func runInteropExport(args []string) error { // not after. A document that fails that schema is a bug in this package, and // writing it first would leave a bad artefact on disk for CI to diff against. // This is also the conformance check that justifies the whole package. - if err := interop.Validate(context.Background(), data); err != nil { + if err := spec.Validate(context.Background(), data); err != nil { return err } @@ -149,11 +119,11 @@ func runInteropExport(args []string) error { return report.Err(*strict) } -func runInteropImport(args []string) error { - fs, _ := newFlagSet("interop import", usageInteropImport) +func runSpecImport(args []string) error { + fs, _ := newFlagSet("spec import", usageSpecImport) var ( - specPath = fs.String("spec", "", "codegen-spec v0.1 JSON to read (required)") + specPath = fs.String("spec", "", "Provider Code Specification v0.1 JSON to read (required)") out = fs.String("out", "", "directory to write draft blueprints under (required)") provider = fs.String("provider", "", "registry provider name, which prefixes every Terraform type (required)") @@ -162,7 +132,7 @@ func runInteropImport(args []string) error { apiVersionDir = fs.String("api-version-dir", "", "version directory generated packages live under, e.g. v7") serviceGroup = fs.String("service-group", "", "service grouping for the on-disk layout") - list = fs.Bool("list", false, "report what the document offers and exit") + dryRun = fs.Bool("dry-run", false, "report what the document offers and write nothing") ) if err := parse(fs, args); err != nil { @@ -178,12 +148,12 @@ func runInteropImport(args []string) error { return fmt.Errorf("reading %s: %w", *specPath, err) } - s, err := interop.Parse(context.Background(), data) + s, err := spec.Parse(context.Background(), data) if err != nil { return err } - if *list { + if *dryRun { return listSpec(s) } @@ -194,7 +164,7 @@ func runInteropImport(args []string) error { return usagef("-out is required") } - bp, report, err := interop.ToBlueprint(s, interop.Options{ + bp, report, err := spec.ToBlueprint(s, spec.Options{ Provider: *provider, TypePrefix: *typePrefix, GoModule: *goModule, @@ -228,7 +198,7 @@ func writeDrafts(root string, bp blueprint.Blueprint) ([]string, error) { // The provider part carries no resources, so it is a draft too -- its SDK block // is empty and has to be authored. providerPart := blueprint.Blueprint{FormatVersion: bp.FormatVersion, Provider: bp.Provider} - providerPath := filepath.Join(root, "provider"+interop.DraftExt) + providerPath := filepath.Join(root, "provider"+spec.DraftExt) if err := blueprint.Save(providerPath, providerPart); err != nil { return nil, err @@ -237,7 +207,7 @@ func writeDrafts(root string, bp blueprint.Blueprint) ([]string, error) { for _, res := range bp.Resources { part := blueprint.Blueprint{FormatVersion: bp.FormatVersion, Resources: []blueprint.Resource{res}} - path := filepath.Join(root, "resources", res.Key+interop.DraftExt) + path := filepath.Join(root, "resources", res.Key+spec.DraftExt) if err := blueprint.Save(path, part); err != nil { return nil, err @@ -250,7 +220,7 @@ func writeDrafts(root string, bp blueprint.Blueprint) ([]string, error) { // printUnauthored tells the operator what to write and what to do next. func printUnauthored(bp blueprint.Blueprint, written []string) { - fields := interop.Unauthored(bp) + fields := spec.Unauthored(bp) fmt.Fprintf(os.Stderr, "\n%d draft(s) written. %d field group(s) must be authored before emission:\n\n", len(written), len(fields)) @@ -264,13 +234,13 @@ A draft is deliberately invisible to emit and verify: %q does not end in %q, so LoadDir cannot open it. Author the fields above, rename the drafts, then check the bindings against the SDK: - go run ./cmd/tfpluginframeworkgen bindings -blueprint -module + go run ./cmd/tfpfgen bindings check -blueprint -module -`, interop.DraftExt, blueprint.Ext) +`, spec.DraftExt, blueprint.Ext) } // listSpec reports what a document offers without writing anything. -func listSpec(s spec.Specification) error { +func listSpec(s hcspec.Specification) error { name := "(none)" if s.Provider != nil { name = s.Provider.Name @@ -302,7 +272,7 @@ func listSpec(s spec.Specification) error { // keepOnly narrows the blueprint to one resource. // // It matches on Key rather than on the Terraform type, because Key is the stable -// merge identifier every other subcommand's -only already uses. +// merge identifier every other subcommand's -resource already uses. func keepOnly(bp *blueprint.Blueprint, key string) error { for _, r := range bp.Resources { if r.Key == key { @@ -320,7 +290,7 @@ func keepOnly(bp *blueprint.Blueprint, key string) error { } } - return usagef("-only %q matches no resource or data source key", key) + return usagef("-resource %q matches no resource or data source key", key) } // printReport writes the downgrade notes to stderr. @@ -329,14 +299,14 @@ func keepOnly(bp *blueprint.Blueprint, key string) error { // the log package, and a loss report is not progress chatter. A user who silences // progress has not asked to be kept in the dark about what the export could not // carry. -func printReport(r interop.Report) { +func printReport(r spec.Report) { fmt.Fprintln(os.Stderr, r.Summary()) if len(r.Notes) == 0 { return } - current := interop.Severity("") + current := spec.Severity("") for _, n := range r.Sorted() { if n.Severity != current { @@ -350,15 +320,15 @@ func printReport(r interop.Report) { // One annotation per severity for the checks UI, matching runBindings' single // ::error:: line rather than annotating every note. - if n := r.Count(interop.SeverityDropped); n > 0 { + if n := r.Count(spec.SeverityDropped); n > 0 { fmt.Fprintf(os.Stderr, "::warning::%d blueprint value(s) have no counterpart in the exported specification\n", n) } - if n := r.Count(interop.SeverityLossy); n > 0 { + if n := r.Count(spec.SeverityLossy); n > 0 { fmt.Fprintf(os.Stderr, "::warning::%d blueprint value(s) were coarsened on export\n", n) } } -func writeReport(path string, r interop.Report) error { +func writeReport(path string, r spec.Report) error { data, err := json.MarshalIndent(r, "", " ") if err != nil { return fmt.Errorf("encoding the report: %w", err) diff --git a/cmd/tfpluginframeworkgen/interop_test.go b/cmd/tfpfgen/spec_test.go similarity index 88% rename from cmd/tfpluginframeworkgen/interop_test.go rename to cmd/tfpfgen/spec_test.go index 7d5fc7ac..989b2dde 100644 --- a/cmd/tfpluginframeworkgen/interop_test.go +++ b/cmd/tfpfgen/spec_test.go @@ -10,12 +10,12 @@ import ( "testing" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/interop" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/spec" ) // committedSpec is the exported document CI diffs against. func committedSpec() string { - return filepath.Join(repoRoot, "interop-specs", "thousandeyes", "provider-code-spec.json") + return filepath.Join(repoRoot, "specs", "thousandeyes", "provider-code-spec.json") } // TestUnit_CLI_Interop_ExportMatchesTheCommittedSpec is the drift gate as a test. @@ -33,7 +33,7 @@ func TestUnit_CLI_Interop_ExportMatchesTheCommittedSpec(t *testing.T) { out := filepath.Join(t.TempDir(), "spec.json") - if err := runInterop([]string{"export", "-blueprint", blueprintDir(), "-out", out, "-q"}); err != nil { + if err := runSpecGroup([]string{"export", "-blueprint", blueprintDir(), "-out", out, "-q"}); err != nil { t.Fatalf("interop export: %v", err) } @@ -61,7 +61,7 @@ func TestUnit_CLI_Interop_TheCommittedSpecIsValid(t *testing.T) { t.Fatalf("reading the committed specification: %v", err) } - if err := interop.Validate(context.Background(), data); err != nil { + if err := spec.Validate(context.Background(), data); err != nil { t.Fatalf("the committed specification does not satisfy the upstream schema: %v", err) } @@ -119,7 +119,7 @@ func TestUnit_CLI_Interop_ExportToStdout(t *testing.T) { // -out omitted writes to stdout, so `interop export | jq` is the natural way to // look at one. Only the exit status is asserted here; the content is covered by // the drift test above. - if err := runInterop([]string{"export", "-blueprint", blueprintDir(), "-q"}); err != nil { + if err := runSpecGroup([]string{"export", "-blueprint", blueprintDir(), "-q"}); err != nil { t.Errorf("export to stdout: %v", err) } } @@ -127,14 +127,14 @@ func TestUnit_CLI_Interop_ExportToStdout(t *testing.T) { func TestUnit_CLI_Interop_StrictFailsOnThePilot(t *testing.T) { t.Parallel() - err := runInterop([]string{ + err := runSpecGroup([]string{ "export", "-blueprint", blueprintDir(), "-out", filepath.Join(t.TempDir(), "s.json"), "-strict", "-q", }) // The pilot has CRUD bindings, and the format cannot carry them, so strict must // fail. If this ever passes, either the taxonomy stopped reporting or the // blueprint stopped binding -- both worth knowing about. - if !errors.Is(err, interop.ErrDowngraded) { + if !errors.Is(err, spec.ErrDowngraded) { t.Errorf("error = %v, want ErrDowngraded", err) } } @@ -150,7 +150,7 @@ func TestUnit_CLI_Interop_PilotHasNoLossyNotes(t *testing.T) { reportPath := filepath.Join(t.TempDir(), "report.json") - err := runInterop([]string{ + err := runSpecGroup([]string{ "export", "-blueprint", blueprintDir(), "-out", filepath.Join(t.TempDir(), "s.json"), "-report", reportPath, "-q", @@ -164,15 +164,15 @@ func TestUnit_CLI_Interop_PilotHasNoLossyNotes(t *testing.T) { t.Fatalf("reading the report: %v", err) } - var report interop.Report + var report spec.Report if err := json.Unmarshal(data, &report); err != nil { t.Fatalf("parsing the report: %v", err) } - if got := report.Count(interop.SeverityLossy); got != 0 { + if got := report.Count(spec.SeverityLossy); got != 0 { t.Errorf("the pilot should need no coarsening, got %d lossy note(s):\n%v", got, report.Sorted()) } - if report.Count(interop.SeverityDropped) == 0 { + if report.Count(spec.SeverityDropped) == 0 { t.Error("the pilot's CRUD bindings must be reported as dropped") } @@ -193,7 +193,7 @@ func TestUnit_CLI_Interop_Only(t *testing.T) { out := filepath.Join(t.TempDir(), "s.json") - if err := runInterop([]string{"export", "-blueprint", blueprintDir(), "-only", "tag", "-out", out, "-q"}); err != nil { + if err := runSpecGroup([]string{"export", "-blueprint", blueprintDir(), "-resource", "tag", "-out", out, "-q"}); err != nil { t.Fatalf("interop export -only tag: %v", err) } @@ -206,7 +206,7 @@ func TestUnit_CLI_Interop_Only(t *testing.T) { } // An unmatched -only is a caller mistake, not an empty success. - err = runInterop([]string{"export", "-blueprint", blueprintDir(), "-only", "octopus", "-q"}) + err = runSpecGroup([]string{"export", "-blueprint", blueprintDir(), "-resource", "octopus", "-q"}) var ue *usageError if !errors.As(err, &ue) { @@ -217,7 +217,7 @@ func TestUnit_CLI_Interop_Only(t *testing.T) { // TestUnit_CLI_Interop_ImportWritesInvisibleDrafts is the empirical half of the draft // design. // -// TestUnit_Interop_Drafts asserts the extension does not match; this asserts the +// TestUnit_Spec_Drafts asserts the extension does not match; this asserts the // consequence, which is the thing actually promised: a directory of drafts is not // something emit refuses to process, it is something emit cannot see at all. The // distinction matters because the failure mode being designed against is a @@ -227,7 +227,7 @@ func TestUnit_CLI_Interop_ImportWritesInvisibleDrafts(t *testing.T) { out := filepath.Join(t.TempDir(), "drafts") - err := runInterop([]string{ + err := runSpecGroup([]string{ "import", "-spec", committedSpec(), "-provider", "thousandeyes", "-api-version-dir", "v7", "-service-group", "tags", "-out", out, "-q", }) @@ -241,7 +241,7 @@ func TestUnit_CLI_Interop_ImportWritesInvisibleDrafts(t *testing.T) { return err } found = append(found, filepath.Base(path)) - if !strings.HasSuffix(path, interop.DraftExt) { + if !strings.HasSuffix(path, spec.DraftExt) { t.Errorf("%s is not a draft; an imported blueprint must not be loadable by emit", path) } return nil @@ -269,7 +269,7 @@ func TestUnit_CLI_Interop_PromotedDraftsLoadAndFailOnBindings(t *testing.T) { out := filepath.Join(t.TempDir(), "drafts") - err := runInterop([]string{ + err := runSpecGroup([]string{ "import", "-spec", committedSpec(), "-provider", "thousandeyes", "-out", out, "-q", }) if err != nil { @@ -280,7 +280,7 @@ func TestUnit_CLI_Interop_PromotedDraftsLoadAndFailOnBindings(t *testing.T) { if err != nil || d.IsDir() { return err } - promoted := strings.TrimSuffix(path, interop.DraftExt) + blueprint.Ext + promoted := strings.TrimSuffix(path, spec.DraftExt) + blueprint.Ext return os.Rename(path, promoted) }) if err != nil { @@ -301,7 +301,7 @@ func TestUnit_CLI_Interop_ImportList(t *testing.T) { // -list reports what the document offers and writes nothing, so it needs neither // -out nor -provider. - if err := runInterop([]string{"import", "-spec", committedSpec(), "-list"}); err != nil { + if err := runSpecGroup([]string{"import", "-spec", committedSpec(), "-dry-run"}); err != nil { t.Errorf("interop import -list: %v", err) } } @@ -315,11 +315,11 @@ func TestUnit_CLI_Interop_ImportRejectsBadInput(t *testing.T) { } // The documented-but-rejected version, arriving as input rather than output. - if err := runInterop([]string{"import", "-spec", bad, "-provider", "x", "-out", t.TempDir(), "-q"}); err == nil { + if err := runSpecGroup([]string{"import", "-spec", bad, "-provider", "x", "-out", t.TempDir(), "-q"}); err == nil { t.Error(`a document declaring "0.1.0" must be refused`) } - if err := runInterop([]string{ + if err := runSpecGroup([]string{ "import", "-spec", filepath.Join(t.TempDir(), "absent.json"), "-provider", "x", "-out", t.TempDir(), "-q", }); err == nil { t.Error("a missing spec file must fail") @@ -346,7 +346,7 @@ func TestUnit_CLI_Interop_RejectsBadUsage(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - err := runInterop(tc.args) + err := runSpecGroup(tc.args) var ue *usageError if !errors.As(err, &ue) { @@ -362,7 +362,7 @@ func TestUnit_CLI_Interop_HelpIsNotAnError(t *testing.T) { // -h before the verb asks for the verb list, which is output rather than a // diagnostic. for _, arg := range []string{"-h", "-help", "--help"} { - if err := runInterop([]string{arg}); err != nil { + if err := runSpecGroup([]string{arg}); err != nil { t.Errorf("interop %s = %v, want nil", arg, err) } } @@ -371,7 +371,7 @@ func TestUnit_CLI_Interop_HelpIsNotAnError(t *testing.T) { func TestUnit_CLI_Interop_ExportReportsAMissingBlueprint(t *testing.T) { t.Parallel() - err := runInterop([]string{"export", "-blueprint", filepath.Join(t.TempDir(), "absent"), "-q"}) + err := runSpecGroup([]string{"export", "-blueprint", filepath.Join(t.TempDir(), "absent"), "-q"}) if err == nil { t.Error("a missing blueprint directory must fail") } @@ -387,7 +387,7 @@ func TestUnit_CLI_Interop_ExportReportsAnUnwritablePath(t *testing.T) { t.Fatalf("WriteFile: %v", err) } - err := runInterop([]string{ + err := runSpecGroup([]string{ "export", "-blueprint", blueprintDir(), "-out", filepath.Join(blocker, "nested", "s.json"), "-q", }) if err == nil { @@ -395,7 +395,7 @@ func TestUnit_CLI_Interop_ExportReportsAnUnwritablePath(t *testing.T) { } // Same for the report path. - err = runInterop([]string{ + err = runSpecGroup([]string{ "export", "-blueprint", blueprintDir(), "-out", filepath.Join(dir, "ok.json"), "-report", filepath.Join(blocker, "nested", "r.json"), "-q", diff --git a/cmd/tfpluginframeworkgen/specdrift_test.go b/cmd/tfpfgen/specdrift_test.go similarity index 98% rename from cmd/tfpluginframeworkgen/specdrift_test.go rename to cmd/tfpfgen/specdrift_test.go index 627b28bd..d64a2af6 100644 --- a/cmd/tfpluginframeworkgen/specdrift_test.go +++ b/cmd/tfpfgen/specdrift_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/ingest/openapi" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/openapi" ) // TestUnit_CLI_CommittedBlueprintMatchesTheSpecItWasInferredFrom is the gate that was missing. @@ -109,7 +109,7 @@ func TestUnit_CLI_CommittedBlueprintMatchesTheSpecItWasInferredFrom(t *testing.T // These three are enumerations in the pinned document that the committed blueprint does not carry. // Applying them is a one-line change each. What makes it not a one-line change is that // AllowedValues sizes the write.enum probe's plan: with the members present the probe wants 76 -// requests where the committed cassette recorded far fewer, so `probe -mode verify` stops +// requests where the committed cassette recorded far fewer, so `probe verify` stops // reproducing its 39 facts and starts reporting orphans. The blueprint cannot be corrected without // re-recording the evidence. // @@ -159,7 +159,7 @@ func collectSpecFacts(attrs []blueprint.Attribute, prefix string, out map[string func newestSnapshot(t *testing.T) string { t.Helper() - root := filepath.Join(repoRoot, "openapi-specs", "thousandeyes") + root := filepath.Join(repoRoot, "openapi", "thousandeyes") matches, err := filepath.Glob(filepath.Join(root, "*", "api.yaml")) if err != nil || len(matches) == 0 { diff --git a/cmd/tfpluginframeworkgen/testdata/facts/access-type-default.json b/cmd/tfpfgen/testdata/facts/access-type-default.json similarity index 100% rename from cmd/tfpluginframeworkgen/testdata/facts/access-type-default.json rename to cmd/tfpfgen/testdata/facts/access-type-default.json diff --git a/cmd/tfpluginframeworkgen/testdata/facts/color-no-default.json b/cmd/tfpfgen/testdata/facts/color-no-default.json similarity index 100% rename from cmd/tfpluginframeworkgen/testdata/facts/color-no-default.json rename to cmd/tfpfgen/testdata/facts/color-no-default.json diff --git a/cmd/tfpfgen/usage.go b/cmd/tfpfgen/usage.go new file mode 100644 index 00000000..cf36544a --- /dev/null +++ b/cmd/tfpfgen/usage.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "io" + "text/tabwriter" +) + +const usageHeader = `tfpfgen generates terraform-plugin-framework providers from an API +specification plus recorded API behaviour. + +Usage: + + tfpfgen [flags] + +Commands: +` + +const usageFooter = ` +Global flags, accepted by every command: + + -q suppress progress output + -chdir change to this directory before running (-C for short) + +The pipeline, in the order an author walks it: + + openapi fetch -> blueprint draft -> [probe record -> blueprint merge] -> provider generate + +Every stage writes a committed, reviewable artefact; provider generate -check +fails on drift, and CI regenerates each stage the same way. Run +"tfpfgen -h" for a command's verbs and flags. +` + +func printUsage(w io.Writer) { + fmt.Fprint(w, usageHeader) + + tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0) + for _, c := range commands { + fmt.Fprintf(tw, " %s\t%s\n", c.name, c.summary) + } + _ = tw.Flush() + + fmt.Fprint(w, usageFooter) +} diff --git a/cmd/tfpluginframeworkgen/version.go b/cmd/tfpfgen/version.go similarity index 88% rename from cmd/tfpluginframeworkgen/version.go rename to cmd/tfpfgen/version.go index 0c706f35..461532b2 100644 --- a/cmd/tfpluginframeworkgen/version.go +++ b/cmd/tfpfgen/version.go @@ -22,7 +22,7 @@ func runVersion(args []string) error { return nil } - fmt.Fprintf(os.Stdout, "tfpluginframeworkgen %s (%s %s/%s)\n", + fmt.Fprintf(os.Stdout, "tfpfgen %s (%s %s/%s)\n", version.Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) return nil diff --git a/cmd/tfpluginframeworkgen/usage.go b/cmd/tfpluginframeworkgen/usage.go deleted file mode 100644 index 1d616e83..00000000 --- a/cmd/tfpluginframeworkgen/usage.go +++ /dev/null @@ -1,45 +0,0 @@ -package main - -import ( - "fmt" - "io" - "text/tabwriter" -) - -const usageHeader = `tfpluginframeworkgen generates terraform-plugin-framework providers from an API -specification plus recorded API behaviour. - -Usage: - - tfpluginframeworkgen [flags] - -Commands: -` - -const usageFooter = ` -Global flags, accepted by every command: - - -v verbose output - -q suppress progress output - -C change to this directory before running - -config

provider generation config (default ` + defaultConfigPath + `) - -The pipeline, in the order an author walks it: - - specs -> ingest -> [probe -> merge] -> emit -> verify - -Every stage writes a committed, reviewable artefact, and CI regenerates each one -and fails on drift. Run "tfpluginframeworkgen -h" for a command's flags. -` - -func printUsage(w io.Writer) { - fmt.Fprint(w, usageHeader) - - tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0) - for _, c := range commands { - fmt.Fprintf(tw, " %s\t%s\n", c.name, c.summary) - } - _ = tw.Flush() - - fmt.Fprint(w, usageFooter) -} diff --git a/docs/README.md b/docs/README.md index de76f9a8..0624f8d9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,8 +16,9 @@ because it reads as settled. | [`probing.md`](probing.md) | the probe catalogue, confidence levels, safety model and cleanup guarantees | | [`fixtures-and-rehearsal.md`](fixtures-and-rehearsal.md) | one fixture derivation, the rehearsal probe, and the fixpoint between them | | [`generated-boundary.md`](generated-boundary.md) | how generated and hand-written code stay apart, and the escape hatch | -| [`gates.md`](gates.md) | every CI gate, what it proves, and its local reproduction | -| [`interop.md`](interop.md) | reading and writing Provider Code Specification v0.1, and what it cannot carry | +| [`checks.md`](checks.md) | every CI check, what it proves, and its local reproduction | +| [`interop.md`](interop.md) | reading and writing the Provider Code Specification (codegen-spec v0.1), and what it cannot carry | +| [`glossary.md`](glossary.md) | the glossary — every domain term, one meaning each | | [`findings/`](findings/) | investigation write-ups whose evidence shaped the toolkit — kept as history | | [`examples/`](examples/) | starting points, e.g. the sandbox profile | @@ -36,28 +37,29 @@ likely to be asked again. Specification cannot express CRUD wiring, SDK binding, observed behaviour or test scaffolding, so it is a format this project reads and writes — not its model. -3. **Full-lifecycle probing, gated and recorded.** Mutating probes require an +3. **Full-lifecycle probing, guarded and recorded.** Mutating probes require an explicit flag *and* a profile that proves at runtime that it is a sandbox. - Every transcript is committed, and facts are re-derived from it offline in CI. + Every transcript is committed as a recording, and facts are re-derived from it + offline in CI. 4. **The pilot is a new provider, not a migration.** Generating onto a clean slate keeps state-upgrade work off the toolkit's critical path. 5. **Acceptance is confirmation, not discovery.** Everything an acceptance test would discover is discovered by the probe first — the rehearsal runs the same lifecycles with the same values before any provider code exists. A red acceptance run means the evidence is incomplete, and the fix starts with - `probe`. -6. **Generation finishes with the tools that gate it.** `emit` runs the same - compile, docs and formatting checks CI runs, at generation time. A gate that - fires after the commit is just a slower postcheck. -7. **`deny` gates experiments, not sends.** A denied field is never probed, but a + `probe record`. +6. **Generation finishes with the tools that check it.** `provider generate` runs + the same compile, docs and formatting checks CI runs, at generation time. A + check that fires after the commit is just a slower postcheck. +7. **`deny` blocks experiments, not sends.** A denied field is never probed, but a fixture value declared for it still goes into every body that needs it — otherwise a denied-but-required field would sink every create. ## Conventions worth knowing before reading the code - **Templates carry no logic.** Everything a template consumes is a finished - string or a boolean, precomputed in `internal/render`. Templates branch on - presence, never on meaning. This is why the emitted shape can be reviewed as + string or a boolean, precomputed in `internal/generate`. Templates branch on + presence, never on meaning. This is why the generated shape can be reviewed as ordinary text without reading the generator. - **Generated output is deterministic.** No timestamps, no tool version, no absolute paths, no map-iteration order. Two runs over the same inputs produce diff --git a/docs/architecture.md b/docs/architecture.md index d59f6313..e8ef85f2 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -6,66 +6,77 @@ those boundaries are drawn where they are. ## The pipeline +```mermaid +flowchart LR + upstream["upstream OpenAPI URL"] -- "openapi fetch" --> snap["pinned snapshot\n(openapi/)"] + snap -- "blueprint draft" --> bp["blueprints/\n(+ scenario drafts)"] + live["live API"] -- "probe record" --> rec["recordings/"] + rec -- "blueprint merge" --> bp + sdk["pinned SDK"] -- "bindings facts" --> bp + curation["human curation\n(scenarios, hints, presence)"] --> bp + bp -- "provider generate" --> prov["provider Go tree\n(pilot/)"] + prov -- "postcheck\n(build, docs, fmt)" --> done["checked provider"] + bp -. "provider generate -check\n(fails on drift)" .-> prov ``` -upstream URL ──specs──► OpenAPI snapshot ──ingest──┐ - ├──merge──► blueprint.json ──emit──► provider Go tree -live API ──probe (catalogue + rehearsal fixpoint)───┤ │ + tests, fixtures, -pinned SDK ──bindings -facts-out (static facts)─────┤ │ examples, docs - │ postcheck -human curation (plans, hints, presence) ────────────┘ (build · docs · fmt) -``` + +with drift checking: `provider generate -check`. Alongside the main line, +`bindings facts` derives static facts from the pinned SDK for `blueprint merge` +to fold in, human curation (scenarios, hints, presence) feeds the same merge, +and `provider generate` finishes with a postcheck battery (build · docs · fmt). Every arrow's output is a committed, reviewable artefact. That is deliberate: a pipeline whose intermediate state lives only in memory can only be reviewed by reading its output, and its output is thousands of lines of generated Go. And -every arrow has a drift gate in CI — see [gates.md](gates.md). +every arrow has a drift check in CI — see [checks.md](checks.md). -Every stage is built, and each is a subcommand of the one binary. +Every stage is built, and each is a verb of the one binary. | Stage | Package | State | |---|---|---| -| `specs` — fetch and pin an OpenAPI snapshot | `internal/specstore` | **built** — the refresh loop re-fetches from the latest snapshot's recorded source | -| `ingest` — OpenAPI → blueprint + plan drafts | `internal/ingest/openapi` | **built** | -| `probe` — live API → behaviour facts | `internal/probe` | **built** (record, replay, verify, sweep; the rehearsal fixpoint) | -| `merge` — fold facts into a blueprint | `internal/blueprint/merge` | **built** (plus plan promotion) | -| `emit` — blueprint → provider, postchecked | `internal/emit`, `internal/render`, `internal/templates` | **built** | -| `verify` — fail on drift | `cmd/tfpluginframeworkgen/verify.go`, `internal/manifest` | **built** | +| `openapi fetch` — fetch and pin an OpenAPI snapshot | `internal/snapshot` | **built** — the refresh loop re-fetches from the latest snapshot's recorded source | +| `blueprint draft` — OpenAPI → blueprint + scenario drafts | `internal/openapi` | **built** | +| `probe` — live API → behaviour facts | `internal/probe` | **built** (record, replay, verify, sweep, list; the rehearsal fixpoint) | +| `blueprint merge` — fold facts into a blueprint | `internal/blueprint/merge` | **built** (plus scenario adoption) | +| `provider generate` — blueprint → provider, postchecked | `internal/generate`, `internal/templates` | **built** | +| `provider generate -check` — fail on drift | `cmd/tfpfgen/generate_check.go`, `internal/manifest` | **built** | | `bindings` — type-check bindings against the SDK; derive static facts | `internal/sdkbind` | **built** | -| `interop` — Provider Code Specification v0.1 | `internal/interop` | **built** (export; import writes drafts) | +| `spec` — Provider Code Specification v0.1 | `internal/spec` | **built** (export; import writes drafts) | ## Where logic is allowed to live This is the load-bearing rule, and most of the structure follows from it. -**All logic lives in `internal/render`.** Every value a template consumes is a +**All logic lives in `internal/generate`.** Every value a template consumes is a finished Go expression, a finished declaration, or a boolean. Templates branch on *presence* — "is there a description?" — never on *meaning* — "what kind of -attribute is this?". +attribute is this?". Render, in this codebase, means template execution and +nothing more. -The reason is reviewability. `internal/templates` is the emitted shape written as -ordinary text, so you can read what the generator produces without reading the +The reason is reviewability. `internal/templates` is the generated shape written +as ordinary text, so you can read what the generator produces without reading the generator. A template containing type dispatch destroys that: the shape becomes something you have to simulate mentally rather than read. The convention is inherited from the sibling SDK generator, whose `service.go.tmpl` consumes only precomputed strings. -If a template needs to decide something, the decision belongs in `render`. +If a template needs to decide something, the decision belongs in `generate`. **Recursion is handled in Go, not in templates.** A Terraform schema is recursive, and the obvious response — one recursive template — would put the shape back -inside logic. Instead `render` walks the attribute tree and produces finished +inside logic. Instead `generate` walks the attribute tree and produces finished declarations, which the file template merely lists. ## Package map ``` -cmd/tfpluginframeworkgen/ CLI. stdlib flag, one FlagSet per subcommand, no cobra. +cmd/tfpfgen/ CLI. stdlib flag, one FlagSet per verb, no cobra. internal/ blueprint/ the IR: types, validation, canonical JSON, layered load - render/ ALL emit logic. Blueprint -> finished strings. - templates/ embedded .tmpl. The emitted shape, as reviewable text. - emit/ plan, format, write, postcheck. Owns gofumpt and overwrite refusal. + generate/ ALL generation logic. Blueprint -> finished strings; + fileset build, format, write, postcheck. Owns gofumpt + and overwrite refusal. + templates/ embedded .tmpl. The generated shape, as reviewable text. manifest/ what the last run produced, so orphans can be found naming/ identifiers. One word-splitter, several joins. sdkbind/ type-checks bindings against the SDK actually pinned @@ -73,84 +84,84 @@ internal/ list facets and actions. Also derives static facts (zero-value unsendable) from the SDK's struct tags. fixturespec/ ONE derivation of acceptance-fixture values, rendered - as HCL by render and as wire JSON by probe - ingest/openapi/ OpenAPI document -> draft blueprints + plan worksheets - specstore/ pinned OpenAPI snapshots: list, read, checksum, pin - probe/ the probe catalogue, gate, ledger, sweeper, budgets + as HCL by generate and as wire JSON by probe + openapi/ OpenAPI document -> draft blueprints + scenario worksheets + snapshot/ pinned OpenAPI snapshots: list, read, checksum, pin + probe/ the probe catalogue, guard, ledger, sweeper, budgets cassette/ transcripts: record, redact, replay, freeze - interop/ codegen-spec v0.1 export and import + spec/ codegen-spec v0.1 export and import version/ the tool version, in exactly one place ``` -`naming` and `blueprint` depend on nothing else in the repo. `render` depends on -`blueprint`, `naming` and `fixturespec`. `emit` depends on `render` and -`templates`. Nothing depends on `cmd`. +`naming` and `blueprint` depend on nothing else in the repo. `generate` depends +on `blueprint`, `naming`, `fixturespec` and `templates`. Nothing depends on +`cmd`. Two behaviours live in `cmd` rather than in a stage package, on purpose. The -rehearsal fixpoint (`rehearse.go`) alternates `probe` and `merge` until fixture -derivation converges, and plan promotion (`promote.go`) copies plan values into -blueprint hints — both need packages from opposite ends of the pipeline, and the -probe must never import the package that interprets its output. The command layer -is the only place allowed to see both at once. +rehearsal fixpoint (`rehearse.go`) alternates probing and merging until fixture +derivation converges, and scenario adoption (`promote.go`) copies scenario values +into blueprint hints — both need packages from opposite ends of the pipeline, and +the probe must never import the package that interprets its output. The command +layer is the only place allowed to see both at once. ## Determinism -Generated output must be byte-identical for identical inputs. The drift gate +Generated output must be byte-identical for identical inputs. The drift check regenerates and fails on any diff, so a single unstable value would make CI fail on runs that changed nothing — and a CI failure that everyone learns to ignore is worse than no CI at all. -What that forbids, in emitted files and in the manifest: +What that forbids, in generated files and in the manifest: - no timestamps -- no tool version (it lives in `.tfpluginframeworkgen/manifest.json`, and nowhere else, +- no tool version (it lives in `.tfpfgen/manifest.json`, and nowhere else, so a release is a one-line diff rather than a rewrite of the tree) - no absolute paths - no reliance on Go map iteration order; every map is rendered through a sorted key slice, and every IR slice is sorted by a declared key before rendering -`TestUnit_Emit_IsDeterministic` builds the pilot twenty-five times and compares. -Twenty-five rather than two, because map iteration order varies per iteration and -two runs can agree by luck. +`TestUnit_Generate_IsDeterministic` builds the pilot twenty-five times and +compares. Twenty-five rather than two, because map iteration order varies per +iteration and two runs can agree by luck. ## Formatting -Emitted code is formatted with **gofumpt**, not `go/format`. +Generated code is formatted with **gofumpt**, not `go/format`. This is not a style preference. The target repositories run gofumpt, gci and golines with autofix enabled. Output that is merely gofmt-clean gets silently rewritten the first time a developer opens the file, and then shows up as drift with no source change — which reads as a generator bug and is not one. -Import blocks are emitted pre-grouped into the three sections the house `gci` +Import blocks are generated pre-grouped into the three sections the house `gci` configuration expects: standard library, third party, then `deploymenttheory`. -Each emitted file gets its **own** import set. A shared block would fail to +Each generated file gets its **own** import set. A shared block would fail to compile in most of them, since Go rejects unused imports. ## Failure behaviour -The generator fails loudly rather than emitting something approximate. +The generator fails loudly rather than producing something approximate. - An attribute whose type has no framework mapping is a hard error, not a skipped attribute. Silently omitting one produces a provider that looks complete and cannot express part of the API. - An unresolvable conversion is a hard error listing every unresolved pair, not just the first. -- Nesting deeper than the emitter supports is refused, naming the offending +- Nesting deeper than the generator supports is refused, naming the offending attribute. - A template that renders unparseable Go returns the numbered source with the error, because a formatter reports a line and column and matching that against unnumbered output is needless work. -- `emit` refuses to overwrite a file that is not marked generated. +- `provider generate` refuses to overwrite a file that is not marked generated. ## Further reading - [`blueprint.md`](blueprint.md) — the IR, field by field - [`generated-boundary.md`](generated-boundary.md) — what is generated, what is yours, and how the two are kept apart -- [`probing.md`](probing.md) — the probe catalogue, gate, ledger and budgets +- [`probing.md`](probing.md) — the probe catalogue, guard, ledger and budgets - [`fixtures-and-rehearsal.md`](fixtures-and-rehearsal.md) — fixture derivation and the rehearsal fixpoint -- [`gates.md`](gates.md) — every CI gate and its local reproduction +- [`checks.md`](checks.md) — every CI check and its local reproduction - [`cli.md`](cli.md) — command reference diff --git a/docs/blueprint.md b/docs/blueprint.md index 0ede7d6b..09b738c5 100644 --- a/docs/blueprint.md +++ b/docs/blueprint.md @@ -1,6 +1,7 @@ # The blueprint -A blueprint is the intermediate representation the generator emits from. It is +A blueprint is the intermediate representation the generator builds a provider +from. It is JSON, committed, and meant to be read like a code review — which is why it is not a compact binary format or an in-memory structure. @@ -27,7 +28,7 @@ is not decidable — a probe that observed nothing would be indistinguishable fr a probe that observed `false`. **JSON keys are camelCase.** The house `.golangci.yml` enables `tagliatelle`, -which defaults to camelCase. A consequence worth knowing: `internal/interop` must +which defaults to camelCase. A consequence worth knowing: `internal/spec` must use HashiCorp's Go types *verbatim* rather than redeclaring them, because their JSON is snake_case and would trip the linter on every field. @@ -37,12 +38,17 @@ would make the drift check useless. ## Layout -One provider block and one file per resource: +One provider block, one file per block, and the probe worksheets beside them: ``` blueprints/thousandeyes/ - provider.blueprint.json the provider block: name, module, SDK, conventions - resources/tag.blueprint.json one resource + provider.blueprint.json the provider block: name, module, SDK, conventions + resources/tag.blueprint.json one resource + datasources/tag.blueprint.json one data source + actions/…, ephemerals/… the other block kinds, one file each + tag.scenario.json the probe scenario for a resource + tests_voice.scenario.draft.json a scenario not yet promoted + static.facts.json facts derived from the SDK's types, no HTTP ``` `LoadDir` merges them and validates the result **as a whole**. That matters: @@ -50,7 +56,7 @@ cross-resource collisions — two resources sharing a Terraform type, or an impo alias — are invisible to a per-file check and are exactly what stops a provider from starting. -Exactly one file may carry a provider block. Two would mean the emitter silently +Exactly one file may carry a provider block. Two would mean the generator silently picks one, and which one would depend on filename ordering. ## Provider @@ -76,8 +82,8 @@ kind is a `Name`, a `Schema`, and then the operations that kind supports. `resource`, `datasource`, `action` and `list` (a facet of a resource) are built and in the pilot. `ephemeral` is declarable — `Blueprint.Ephemerals`, with an `open` binding that is required and `renew`/`close` modelled but refused until they render — and the -emitter does not yet produce it; `emit` refuses a blueprint that declares one rather -than silently skipping it. +generator does not yet produce it; `provider generate` refuses a blueprint that +declares one rather than silently skipping it. **An attribute's legal fields depend on the kind rendering it.** Every kind has its own schema package — `resource/schema`, `datasource/schema` and so on — and those packages @@ -90,7 +96,7 @@ are structurally similar but deliberately not identical: | `writeOnly` | ✓ | ✗ | ✗ | ✓ | ✗ | `Validate` refuses a field the target kind has no home for, naming both the attribute -and the kind. Without that refusal the generator emits +and the kind. Without that refusal the generator writes `datasourceschema.StringAttribute{Default: ...}` and the failure surfaces as a compiler error in generated output, which names neither. @@ -126,8 +132,8 @@ real action forced: made the first action unrepresentable. A flatten *on* an action attribute is now refused, because it would convert into somewhere that does not exist. - **No `computed`, no `sensitive`, no plan modifiers, no default.** There is no state for a - computed value to live in and no stored value to mark sensitive. `BlockAction` has encoded - this since format 3; the action is simply the first kind to exercise it. + computed value to live in and no stored value to mark sensitive. `BlockKindAction` has + encoded this since format 3; the action is simply the first kind to exercise it. The deadline is a generated constant with no timeouts block to override it, because the framework's action schema has no home for one. @@ -181,7 +187,7 @@ violated rather than validated afterwards: - **The type name must equal the resource's.** That string is the entire linkage between the two — there is no import from one package to the other — and the framework returns an - error diagnostic from `GetMetadata` if they differ. Both read the same `ResourceName`. + error diagnostic from `GetMetadata` if they differ. Both read the same `TypeName`. - **The resource must declare an identity.** `ListResult.Identity` is mandatory, so a list facet on a resource without one is refused, naming both halves. - **`Metadata` and `Configure` take `resource.*` request types**, not list-specific ones. The @@ -223,7 +229,7 @@ Two consequences follow from a data source sending nothing to the API: generator does not synthesise the `UseStateForUnknown` it adds for a resource's computed strings. -Emitted as four files — `datasource.go`, `model.go`, `read.go`, `state.go` — against a +Generated as four files — `datasource.go`, `model.go`, `read.go`, `state.go` — against a resource's five. There is no `construct.go` because there is nothing to construct. ## Resource @@ -346,14 +352,14 @@ for `computedOptionalRequired` against `behaviour.requiredByApi`, and `default` | field | meaning | |---|---| -| `type.allowedValues` | what the **specification documents** | +| `type.allowedValues` | what the **OpenAPI document declares** | | `behaviour.acceptedValues` | the documented values this API **took** | | `behaviour.rejectedValues` | the documented values this API **refused** | | `behaviour.valuesClosed` | whether values from *outside* the documented set were refused | **A generated `OneOf` comes from `allowedValues`**, the declared set — which reads backwards until you consider which way each errs. The documented set is a superset of what any single -tenant accepts, so a validator built from it errs toward *permitting*: a stale specification +tenant accepts, so a validator built from it errs toward *permitting*: a stale document surfaces as a real API error carrying the API's own message. Built from `acceptedValues` it would err toward *blocking*, and the pilot is the case in point — `access_type` documents `system`, this sandbox refused it, and another licence may well allow it. @@ -378,10 +384,10 @@ diagnostic. Constraints live on `AttrType` rather than `Attribute` because they of the type: a collection's **element type carries its own**, and those are lifted onto the collection as `ValueStringsAre(...)` — a bound on a set's elements is not a bound on the set. -`constraints.format` carries the specification's declared string format (`date-time`, `uuid`, +`constraints.format` carries the OpenAPI document's declared string format (`date-time`, `uuid`, `email`, …). It generates no validator — the framework has none for formats — but it drives -fixture synthesis: a probe or acceptance fixture for a `date-time` field sends a real timestamp -rather than a sentinel string an API would refuse (see +payload and fixture derivation: a probe payload or acceptance fixture for a `date-time` field +sends a real timestamp rather than a sentinel string an API would refuse (see [fixtures-and-rehearsal.md](fixtures-and-rehearsal.md)). Declared numeric bounds are also what keep the rehearsal's contrast values in range. @@ -394,15 +400,15 @@ Three refusals, each because the framework has no validator to generate: - A range nothing can satisfy, such as `minLength` above `maxLength`. Two things worth knowing about the numbers. JSON Schema states every bound as a number, so an -`int64` attribute's minimum arrives as a `float64` and is **narrowed** — emitting it as a float +`int64` attribute's minimum arrives as a `float64` and is **narrowed** — writing it as a float would not compile against `int64validator`. And a whole-number float bound keeps its decimal point, so the literal's type is unambiguous where it reaches a float validator. -Unlike allowed values there is **no observed counterpart**: the prober has no protocol for +Unlike allowed values there is **no observed counterpart**: the prober has no probe for discovering a length limit or a numeric range, so there is no evidence that could suppress a constraint validator. Only the computed rule below applies. -`ingest` reads these from the specification, and refuses a `pattern` Go's `regexp` cannot +`blueprint draft` reads these from the OpenAPI document, and refuses a `pattern` Go's `regexp` cannot compile — reported by name rather than passed on, because the generated code calls `regexp.MustCompile` and an expression RE2 rejects would panic when the provider starts. JSON Schema permits ECMA constructs, lookahead most often, that RE2 does not. @@ -412,8 +418,8 @@ Three things suppress the validator: - **`valuesClosed` is `false`.** The only case with direct evidence of harm — the API accepted a value from outside the documented set, so a `OneOf` would reject configurations it demonstrably takes. `valuesClosed` being *absent* is not the same thing: an unprobed - attribute keeps its validator, or ingesting a specification and emitting from it straight - away would produce none at all. + attribute keeps its validator, or drafting a blueprint from an OpenAPI document and + generating from it straight away would produce none at all. - **A purely `computed` attribute.** A validator runs against configuration, and a computed attribute is never configured, so one there could never run. `computed_optional` still gets it. @@ -422,8 +428,8 @@ Three things suppress the validator: ## Attributes, continued -`computedOptionalRequired` is spelled exactly as the official specification spells it — -`required`, `optional`, `computed`, `computed_optional` — so interop needs no +`computedOptionalRequired` is spelled exactly as the Provider Code Specification spells it — +`required`, `optional`, `computed`, `computed_optional` — so the spec bridge needs no mapping table. **Type kinds.** Scalars: `bool`, `string`, `int32`, `int64`, `float32`, `float64`, @@ -432,7 +438,7 @@ objects: `list_nested`, `set_nested`, `single_nested`, each with `nested`. Nested attributes, not blocks. The choice is permanent for a published provider, so it is recorded here to stay reviewable — and the evidence is one-sided. In -`deploymenttheory/terraform-provider-microsoft365`, a 167-resource provider, +`deploymenttheory/terraform-provider-microsoft365`, the ~168-resource reference provider, `schema.ListNestedBlock` appears three times across two files, of which one use is live and one is dead code; `SetNestedBlock` and `SingleNestedBlock` appear not at all. Against 366 `SingleNestedAttribute`, 178 `ListNestedAttribute` and 110 `SetNestedAttribute`. The @@ -444,7 +450,7 @@ in the reference provider. Each level gets its own model struct, `attr.Type` map type var and conversion helper pair, and an enclosing level refers to the one below it through that object type var rather than restating its shape. -Two things are refused rather than half-emitted: +Two things are refused rather than half-generated: - **Two nested objects that would declare the same Go identifier.** Every nested object contributes a package-level model, `attr.Type` map, object type var and helper pair, so @@ -457,7 +463,7 @@ Two things are refused rather than half-emitted: ### Where an inferred nested object's names come from -`ingest` infers nested objects, so the five generated identifiers are derived rather than +`blueprint draft` infers nested objects, so the five generated identifiers are derived rather than authored. The rule, for a schema `Assignment` inside resource `tag`: | field | value | rule | @@ -498,7 +504,7 @@ How one attribute crosses the boundary. A conversion with `returnsError` makes its caller fallible, which propagates: the helper returns diagnostics, so `constructResource` does, so its CRUD call site -changes. That propagation is computed in `render`, so a resource with only +changes. That propagation is computed in `internal/generate`, so a resource with only infallible scalars still gets the simpler signatures. An `expand` or `flatten` is a `ConvertCall`, and three small fields on it absorb @@ -518,9 +524,9 @@ its own; absent, `expand` serves both. ## Binding -The part the official specification has nothing for. The design goal is that a -call is **data**, never a dialect the emitter branches on — adding an SDK whose -methods look different should be a blueprint change, not an emitter change. +The part the Provider Code Specification has nothing for. The design goal is that a +call is **data**, never a dialect the generator branches on — adding an SDK whose +methods look different should be a blueprint change, not a generator change. ```jsonc "read": { @@ -536,11 +542,11 @@ methods look different should be a blueprint change, not an emitter change. `return` is recorded rather than inferred because it decides the arity of every error return in the generated body. Getting it wrong produces code that does not -compile — `tfpluginframeworkgen bindings` checks it against the method's real signature. +compile — `tfpfgen bindings check` verifies it against the method's real signature. An argument of kind `literal` carries an `expr` — a verbatim Go expression — plus the `imports` that expression references. It exists for constant request -options: an expansion-gated read (`teclient.WithQueryParam("expand", "filters")`) +options: an expansion-dependent read (`teclient.WithQueryParam("expand", "filters")`) needs the option repeated everywhere the read is generated, including the acceptance test helper, where the SDK's client package must be aliased because the helper's own `client` variable shadows it. A literal with no expression is @@ -571,8 +577,8 @@ five more: | `updateDefault` | the value assigned when an update omits the field — kept separate from `serverDefault` because the pilot's APIs default differently on create and update | | `zeroValueUnsendable` | the SDK's wire encoding cannot express the zero value at all; derived statically from struct tags, not probed (see [probing.md](probing.md#static-facts)) | -Populated by `merge` from probe facts — the pilot's tag blueprint carries values -recorded from a live run — and consumed by `render`: an observed normalisation or +Populated by `blueprint merge` from probe facts — the pilot's tag blueprint carries values +recorded from a live run — and consumed by the generator: an observed normalisation or a `returnedOnRead: false` changes which assertions the generated acceptance test makes. Every field is a pointer, for the reason in *Absence is representable* above. @@ -593,7 +599,7 @@ the API's own dispatch: } ``` -The semantics are a contract between merge (which writes variants) and emission +The semantics are a contract between merge (which writes variants) and generation (which acts on them): - A base behaviour field holds unconditionally. A variant's non-zero fields @@ -632,13 +638,13 @@ the knowledge no derivation can have. } ``` -- `dataBlocks` are emitted verbatim above the resource block, so a hint can +- `dataBlocks` are written verbatim above the resource block, so a hint can reference live tenant data instead of a literal that goes stale. - A value's `hcl` is the fixture's right-hand side, verbatim and never salted. `wire` is the same value in wire-typed form, which the rehearsal sends; a data - reference has no wire form, a literal does. `source` marks a hint promoted from - a probe plan (`merge -promote-plans`), which refreshes its own hints on - re-merge and never touches hand-written ones. + reference has no wire form, a literal does. `source` marks a hint adopted from + a probe scenario (`blueprint merge -adopt-scenarios`), which refreshes its own + hints on re-merge and never touches hand-written ones. - `omit: true` is a **curated omission**: the attribute appears in no generated fixture and no rehearsal body. For values that are individually valid and jointly refused — a rule takes `minimumSources` or `minimumSourcesPct` but @@ -647,14 +653,14 @@ the knowledge no derivation can have. an accident. **`sweep`** overrides the prober's name-field inference (`nameField`, -`readNameField`). It lives on the resource rather than the probe plan because -`probe -mode sweep` builds its subject from the blueprint alone — a sweep is -exactly the situation where no plan may be to hand, and the field that finds +`readNameField`). It lives on the resource rather than the probe scenario because +`probe sweep` builds its subject from the blueprint alone — a sweep is +exactly the situation where no scenario may be to hand, and the field that finds stranded objects cannot depend on one. **`accTest.skipUnlessEnv`** names an environment variable the generated test -requires; unset, the test skips with a message naming it. The pilot gates its -admin-scoped resources on `TFPFGEN_ACC_ADMIN` this way, so a contributor without +requires; unset, the test skips with a message naming it. The pilot's +admin-scoped resources require `TFPFGEN_ACC_ADMIN` this way, so a contributor without an admin token gets skips rather than failures. ## Validation @@ -692,9 +698,17 @@ to learn a second vocabulary to read this repo. | the type kind | per-type attributes (`StringAttribute`, `SetNestedAttribute`) | one `AttrType` with a `Kind`, whose values spell theirs (`single_nested`, `set_nested`) | Spelling is British English, which is this project's own. It is a separate question from -terminology: `ComputedOptionalRequired` is adopted because it is HashiCorp's *word* for the concept, +terminology: `ComputedOptionalRequired` is taken up because it is HashiCorp's *word* for the concept, and `Behaviour` keeps its spelling because the concept is ours and so is the voice. +The rule cuts the other way for words HashiCorp already owns. The probe worksheet is a +**scenario**, never a plan, because *plan* is Terraform's word for something else and stays +reserved for it (and for `planModifiers`, which is spelled their way). The evidence a probe +run leaves behind is a **recording**, never a snapshot, because *snapshot* is the pinned copy +of the OpenAPI document. Sandbox admission is a **guard** and a CI job is a **check**, because +*gate* used to mean both and a word meaning two things is a word meaning neither. And the +toolkit **generates** — *emit* is gone from this repository's prose. + What stays American is only what an identifier outside this repo fixes, and the list is short enough to state: the HTTP `Authorization` header and `http.StatusUnauthorized`; the API's own field names and response headers, including `color` and `x-organization-rate-limit-limit`; and @@ -709,7 +723,7 @@ and the reason belongs next to the name rather than in a reviewer's head. - **Blueprint**, not `Specification`. Their `Specification` is a schema description; a blueprint is that plus everything CRUD generation needs — SDK bindings, wire mappings, observed behaviour. The two are not the same document, and calling ours theirs would promise interoperability we do not - have. `interop export` produces a real `Specification` from a blueprint, and that command is where + have. `spec export` produces a real `Specification` from a blueprint, and that command is where the equivalence is claimed. - **Behaviour**, on an attribute. What a probe observed about the API: writability, immutability, requiredness, server defaults. Their spec has nowhere to put an empirical finding. @@ -723,5 +737,9 @@ and the reason belongs next to the name rather than in a reviewer's head. `AttrType` differs structurally as well as in name: their spec models the type by which pointer is non-nil, and ours by a `Kind` discriminant. That is a deliberate difference — a discriminant is what -lets one code path walk every attribute — and it is the reason `interop` exists as a mapping layer -rather than a cast. +lets one code path walk every attribute — and it is the reason `internal/spec` exists as a mapping +layer rather than a cast. + +This section is the doctrine — whose word wins for which concept, and why this project diverges +where it does. The complete term inventory, one meaning per word, lives in +[docs/glossary.md](glossary.md). diff --git a/docs/checks.md b/docs/checks.md new file mode 100644 index 00000000..669e18ec --- /dev/null +++ b/docs/checks.md @@ -0,0 +1,139 @@ +# The checks + +Every artefact in the pipeline is committed, and every arrow between artefacts is +drift-checked in CI. This page lists each check, what it proves, and the exact local +command that reproduces it — because the correct response to any red check is to +run the pipeline stage that owns the artefact, never to hand-edit the artefact +into passing. + +The checks live in the workflows under `.github/workflows/`. The job names below +are verbatim, so a failing check on a PR can be matched to its section here. + +## `go | Verify generated code` (`codegen-verify.yml`) + +Five jobs, one per arrow. + +### 🔁 Regenerate and diff + +Regenerates the pilot from the committed blueprints and fails on any `git diff`. +Then builds and tests the toolkit *and* the generated provider, and asserts the +generated Go is a gofumpt fixed point. Proves: committed provider ⟵ committed +blueprints, with no hand edits in between. + +```bash +go run ./cmd/tfpfgen provider generate -blueprint blueprints/thousandeyes -out pilot/thousandeyes +git diff --exit-code +go build ./... && go test ./... +(cd pilot/thousandeyes && go build ./... && go test ./...) +``` + +Red here means a blueprint changed without re-running `provider generate`, or a +generated file was edited by hand. Regenerate and commit; the hand edit belongs in +the blueprint or in a hook (see [generated-boundary.md](generated-boundary.md)). + +### 🔗 Verify SDK bindings + +Type-checks every binding in the blueprints against the SDK version the pilot's +`go.mod` pins, and re-derives the static facts document against it. + +```bash +go run ./cmd/tfpfgen bindings check \ + -blueprint blueprints/thousandeyes \ + -module pilot/thousandeyes +go run ./cmd/tfpfgen bindings facts \ + -blueprint blueprints/thousandeyes \ + -module pilot/thousandeyes \ + -out blueprints/thousandeyes/static.facts.json -check +``` + +Red here usually means an SDK version bump: a method, model or struct tag moved +underneath the blueprints. Fix the bindings, then regenerate the static facts +(`bindings facts -out`, without `-check`) and re-merge them. + +### 🔀 Round-trip through tfplugingen-framework + +Exports the blueprints as the Provider Code Specification (codegen-spec v0.1), +diffs the committed export, and feeds it to HashiCorp's `tfplugingen-framework` +to prove the export is one their tooling accepts. See [interop.md](interop.md). + +```bash +go run ./cmd/tfpfgen spec export \ + -blueprint blueprints/thousandeyes \ + -out specs/thousandeyes/provider-code-spec.json +git diff --exit-code -- specs/ +``` + +### 🔬 Re-derive probe facts offline + +Replays every committed recording with no network and no credentials, asserts the +re-derived facts equal the committed `facts.json`, then re-merges every facts file +under `-check` to assert the blueprints already reflect the evidence. + +```bash +go run ./cmd/tfpfgen probe verify -blueprint blueprints/thousandeyes +for facts in recordings/*/*/*/facts.json; do + go run ./cmd/tfpfgen blueprint merge \ + -blueprint blueprints/thousandeyes -facts "$facts" -check -allow-conflicts +done +``` + +Red on the first half means fact derivation is no longer a pure function of the +transcript (or a recording was edited); red on the second means a recording was +made but never merged. See [probing.md](probing.md). + +### 🌍 Terraform validates the examples + +The only job that runs Terraform itself. Regenerates the registry docs and fails +if they drift, asserts committed HCL is a `terraform fmt` fixed point, then +builds the provider, points Terraform at it with `dev_overrides`, and validates +the committed examples against the real schema. This is the job that catches an +example the generated validators reject. + +```bash +(cd pilot/thousandeyes && go generate . && git diff --exit-code -- docs/) +terraform fmt -check -recursive -diff pilot/ +``` + +The `provider generate` postcheck battery runs the first two of these at +generation time (see [cli.md](cli.md#the-postcheck-battery)), so this check +should only go red when someone skipped the battery. + +## The other workflows + +| Workflow | Job | What it proves | +|---|---|---| +| `go \| Unit Tests` (`unit-tests.yml`) | 🧪 Run Unit Tests | the toolkit's own suite, with coverage | +| `go \| Linter` (`go-lint.yml`) | ✨ Run golangci-lint | toolkit lint | +| `go \| Acceptance tests` (`acceptance.yml`) | 🌍 Acceptance (live tenant) | the generated provider's full lifecycle against the real API | +| `Linter` (`linter.yml`) | ✨ Linter | super-linter over markdown, YAML, and everything else non-Go | +| `Dependency Review` (`dependency-review.yml`) | 🔎 Dependency Review | no known-vulnerable dependency lands via PR | +| `release-please` (`release-please.yml`) | 🔖 Release Please | versioning and CHANGELOG from conventional commits | +| `PR Title Validation` (`pr-title-validation.yml`) | ✅ Validate PR Title | conventional-commit PR titles, safely via `env` | +| `Auto-Merge Dependabot` (`auto-merge-dependabot.yml`) | 🤖 Auto-Merge Dependabot | patch-level dependabot PRs merge themselves once green | + +## Acceptance + +Acceptance is deliberately **not** a per-PR check. It runs weekly and on manual +dispatch, behind a GitHub environment, with a concurrency group so two live +runs can never fight over the same tenant. It creates and destroys real objects, +so it needs `TF_ACC=1` and the provider's live credentials; admin-scoped +resources additionally require `TFPFGEN_ACC_ADMIN`. + +Locally, the equivalent is: + +```bash +cd pilot/thousandeyes +TF_ACC=1 go test -v -count=1 -p 1 -run 'TestAcc' -timeout 90m ./... +``` + +Acceptance is **confirmation, not discovery**: the probe has already rehearsed +the exact lifecycles these tests run (see +[fixtures-and-rehearsal.md](fixtures-and-rehearsal.md)). A red acceptance run +therefore means the evidence is incomplete or the API changed — the fix starts +with `probe record`, not with the generated code. + +## Exit codes + +Every command's exit codes are a contract, listed in [cli.md](cli.md#exit-codes). +The one worth repeating here: `probe`'s precedence is **7 > 5 > 3 > 4 > 6 > 1**, +so a run that both exceeded its budget and left an orphan reports the orphan. diff --git a/docs/cli.md b/docs/cli.md index 4fe071b1..c6873181 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1,55 +1,66 @@ # CLI reference -`tfpluginframeworkgen` is one binary with subcommands, dispatched with the standard -library's `flag` package. Each subcommand owns its own `FlagSet`, so there is no -global flag namespace for two subcommands to collide in, and `tfpluginframeworkgen emit --v` reads naturally rather than requiring flags before the command. +`tfpfgen` is one binary with a noun-group grammar: the first word names the +artefact, the second what to do to it — `tfpfgen [flags]`. +Dispatch is the standard library's `flag` package; each verb owns its own +`FlagSet`, so there is no global flag namespace for two verbs to collide in, and +`tfpfgen provider generate -q` reads naturally rather than requiring flags before +the command. -> This page is maintained by hand and checked against `tfpluginframeworkgen -h`. -> The authoritative text is the binary's own help output; if the two disagree, -> the binary is right and this page is stale. +This page is asserted against the binary by a unit test: the usage lines and +flag tables below are checked against the registered flag sets, so a flag that +exists is listed and a flag that does not cannot appear here. ## Commands -Listed in pipeline order — the order an author walks them, which is also the order -`help` prints them. +Listed in pipeline order — the order an author walks them, which is also the +order `help` prints them. -| Command | Purpose | State | +| Command | Purpose | Verbs | |---|---|---| -| `specs` | fetch and snapshot an upstream OpenAPI document | **built** | -| `ingest` | infer a provider blueprint from an OpenAPI snapshot | **built** *(resources only; data sources, actions and the provider block are hand-authored)* | -| `blueprint` | validate, diff or list blueprints | planned *(validation itself is built and runs on every load)* | -| `probe` | exercise a resource's lifecycle; record, replay, verify or sweep | **built** *(both tiers plus the rehearsal; a mutating run needs `--allow-mutations` and a sandbox profile)* | -| `merge` | fold probe facts into a blueprint | **built** | -| `emit` | render a provider from blueprints, then postcheck it | **built** | -| `verify` | fail if the committed provider has drifted | **built** | -| `scaffold` | write a blank resource from the archetype | planned *(the archetype exists; `emit` scaffolds it via `hooks`)* | -| `bindings` | check blueprint SDK bindings against the pinned SDK; derive static facts | **built** | -| `interop` | export or import codegen-spec v0.1 JSON | **built** *(import is resources-only and writes drafts)* | -| `version` | print the version | **built** | - -A planned command is registered and documented but not implemented: running one +| `openapi` | fetch and pin upstream OpenAPI documents | `fetch` | +| `blueprint` | draft, merge, validate, diff or list blueprints | `draft`, `merge`; `validate`, `diff`, `list` planned | +| `probe` | exercise a resource's lifecycle; record or replay cassettes | `record`, `replay`, `verify`, `sweep`, `list` | +| `provider` | generate a terraform-plugin-framework provider from blueprints | `generate`; `scaffold` planned | +| `bindings` | check blueprint SDK bindings against the pinned SDK | `check`, `facts` | +| `spec` | export or import Provider Code Specification v0.1 JSON | `export`, `import` | +| `version` | print the toolkit version and exit | — | + +The pipeline, in the order an author walks it: + +```mermaid +flowchart LR + A["openapi fetch"] --> B["blueprint draft"] + B --> C["probe record"] + C --> D["blueprint merge"] + D --> E["provider generate"] + E -. "provider generate -check\n(fails on drift)" .-> E +``` + +with drift checking: `provider generate -check`. + +A planned verb is registered and documented but not implemented: running one says so and exits non-zero. Registering the full surface up front means `help` -describes the intended pipeline from the first commit, and reaching for a missing -stage gets a straight answer rather than "unknown command". +describes the intended pipeline from the first commit, and reaching for a +missing stage gets a straight answer rather than "unknown verb". -Two pieces of pipeline behaviour live *inside* commands rather than as commands of -their own, and it is worth saying so because the source layout suggests otherwise: -the **rehearsal fixpoint** (`cmd/tfpluginframeworkgen/rehearse.go`) is a behaviour -of `probe -mode record`, and **plan promotion** (`cmd/tfpluginframeworkgen/promote.go`) -is a behaviour of `merge -promote-plans`. There is no `rehearse` or `promote` -subcommand. +Two pieces of pipeline behaviour live *inside* verbs rather than as verbs of +their own, and it is worth saying so because the source layout suggests +otherwise: the **rehearsal fixpoint** (`cmd/tfpfgen/rehearse.go`) is a behaviour +of `probe record`, and **scenario adoption** (`cmd/tfpfgen/promote.go`) is a +behaviour of `blueprint merge -adopt-scenarios`. There is no `rehearse` or +`adopt` verb. ## Global flags -Accepted by every subcommand. +Accepted by every verb. | Flag | Purpose | |---|---| -| `-v` | verbose output | | `-q` | suppress progress output | -| `-C

` | change to this directory before running | -| `-config ` | provider generation config (default `.tfpluginframeworkgen/config.yaml`) | +| `-chdir ` | change to this directory before running (`-C` for short) | + +The bare binary also accepts `-version`, which is `tfpfgen version`. ## Exit codes @@ -60,8 +71,8 @@ detail. |---|---| | `0` | success | | `1` | failure — including drift, and a mismatched binding | -| `2` | invalid input: a usage error, or an unusable plan or config | -| `3` | gating refused (`probe`) | +| `2` | invalid input: a usage error, or an unusable scenario or profile | +| `3` | guard refused the run (`probe`) | | `4` | budget exceeded (`probe`) | | `5` | cleanup left orphaned objects (`probe`) | | `6` | replay mismatch (`probe`) | @@ -70,407 +81,407 @@ detail. A malformed flag exits `2`, not `1`: a caller mistake must not be reported the same way as the tool failing. -Exit `2` has a second meaning, and it is worth stating rather than hiding: a panic -is captured, reported with its stack, swept after, and then re-raised — and the Go -runtime exits `2` for a panic. So exit `2` means a usage error (no stack in the -output) or a bug (a stack). Re-raising is still right: a panic is a bug and the -stack is worth more than a tidier code. - Where several of `3`–`7` apply at once — a run can exceed its budget, sweep, and -still leave an orphan — the precedence is **7 > 5 > 3 > 4 > 6 > 1**. It is a table -rather than a walk over the error tree, because the first match in a tree walk is -not the most serious condition, and which code CI sees must not depend on the order -the errors happened to be joined in. +still leave an orphan — the precedence is **7 > 5 > 3 > 4 > 6 > 1**. It is a +table rather than a walk over the error tree, because the first match in a tree +walk is not the most serious condition, and which code CI sees must not depend +on the order the errors happened to be joined in. --- -## `specs` +## `openapi` + +### `openapi fetch` Fetches the upstream OpenAPI document and pins it as a new snapshot. ``` -tfpluginframeworkgen specs [-url URL] [-output-dir DIR] [-dry-run] +tfpfgen openapi fetch [-url URL] -out DIR [-dry-run] ``` | Flag | Default | Purpose | |---|---|---| | `-url` | the latest snapshot's recorded source | the document to fetch | -| `-output-dir` | — | snapshot root, e.g. `openapi-specs/thousandeyes` (required) | +| `-out` | — | snapshot root to pin into, e.g. `openapi/thousandeyes` (required) | | `-dry-run` | `false` | fetch and report, but pin nothing | The refresh loop is the point: with `-url` omitted, the source comes from the -latest snapshot's own metadata, so `specs -output-dir openapi-specs/thousandeyes` +latest snapshot's own metadata, so `openapi fetch -out openapi/thousandeyes` re-fetches from wherever the last pin came from. No one has to remember the URL, because the snapshot that would go stale is the thing that records it. `-url` is only required for the very first snapshot. -A snapshot is a directory named `-t` holding the document -(`api.yaml`) and `metadata.json` (source URL, digest, fetch time). An upstream -document identical to the latest snapshot pins nothing and exits `0` — the weekly -refresh should be quiet when there is nothing to review. +A snapshot is a directory holding the document and its metadata (source URL, +digest, fetch time). Snapshots are immutable and checksum-verified on load. An +upstream document identical to the latest snapshot pins nothing and exits `0` — +the weekly refresh should be quiet when there is nothing to review. The fetch is +bounded at two minutes: a document is a couple of megabytes, and anything slower +is a network problem worth hearing about. -The fetch is bounded at two minutes: a specification is a couple of megabytes, and -anything slower is a network problem worth hearing about. +## `blueprint` -## `ingest` +### `blueprint draft` -Infers draft blueprints (and optionally probe-plan worksheets) from a pinned +Infers draft blueprints (and optionally scenario worksheets) from a pinned OpenAPI snapshot. ``` -tfpluginframeworkgen ingest [-spec-root DIR] [-snapshot NAME] [-only TAG] [-list] +tfpfgen blueprint draft [-openapi-dir DIR] [-snapshot NAME] [-tag TAG] [-out DIR] [-dry-run] ``` | Flag | Default | Purpose | |---|---|---| -| `-spec-root` | `openapi-specs/thousandeyes` | directory holding pinned snapshots | +| `-openapi-dir` | `openapi/thousandeyes` | directory holding pinned OpenAPI snapshots | | `-snapshot` | the newest | snapshot to read | -| `-spec` | — | read this document directly, bypassing the snapshot store | -| `-list` | `false` | list what the document offers and exit | -| `-only` | — | restrict to candidates whose tag or key contains this; comma-separate several | -| `-all` | `false` | include candidates that cannot become resources or data sources | -| `-out` | — | write inferred blueprints under this directory | -| `-plan-drafts` | — | also scaffold a `KEY.probe.plan.draft.json` worksheet per resource under this directory | +| `-openapi` | — | read this OpenAPI document directly, bypassing the snapshot store | +| `-tag` | — | restrict to candidates whose tag or key contains this; comma-separate several | +| `-dry-run` | `false` | list what the document offers and write nothing | +| `-include-unusable` | `false` | include candidates that cannot become resources or data sources | +| `-out` | — | write inferred blueprints under this directory (required unless `-dry-run`) | | `-provider` | `thousandeyes` | provider name, which prefixes every resource type | -| `-api-version-dir` | `v7` | version directory generated packages live under | | `-sdk-service-root` | the ThousandEyes SDK's | import prefix the SDK's service packages live under | | `-sdk-accessor` | `r.client.API` | expression reaching a service from the resource receiver | +| `-api-version-dir` | `v7` | version directory generated packages live under | +| `-scenario-drafts` | — | also scaffold a `KEY.scenario.draft.json` scenario worksheet per resource under this directory | -`ingest -list` is the survey: it reports every candidate the document offers and -why the ineligible ones are ineligible. The write path produces **drafts** — a -schema and a best-guess binding, which a human then curates (presence, hints, -denials, sweep configuration) before the file earns its non-draft name. The -`-plan-drafts` worksheets serve the same role for probe plans: every field listed -with a place to put fixture values and candidates, nothing invented. +`blueprint draft -dry-run` is the survey: it reports every candidate the +document offers and why the ineligible ones are ineligible. The write path +produces **drafts** — a schema and a best-guess binding, which a human then +curates (presence, hints, denials, sweep configuration) before the file earns +its non-draft name. The `-scenario-drafts` worksheets serve the same role for +scenarios: every field listed with a place to put fixture values and candidates, +nothing invented. An existing draft is never overwritten; promoting one is a +rename, which is a diff a reviewer sees. -## `probe` +### `blueprint merge` -Exercises a live API and writes down what it observed. +Folds a probe run's facts into the blueprint they describe. ``` -tfpluginframeworkgen probe [-mode record|replay|verify|sweep] -blueprint DIR - [-resource KEY] [-only PROBE] [-list] [-plan FILE] [-plan-dir DIR] - [--allow-mutations] [-profile FILE] [-force] [-no-rehearse] [-rederive] - [-evidence DIR] [-provider NAME] +tfpfgen blueprint merge -blueprint DIR -facts FILE [-strategy annotate|apply] [-check] [-allow-conflicts] [-summary PATH] ``` -| Flag | Purpose | -|---|---| -| `-mode` | `replay` (default), `record`, `verify` or `sweep` | -| `-blueprint` | blueprint file or directory (required) | -| `-resource` | probe one resource, by blueprint key | -| `-only` | run one probe, by name | -| `-list` | print the catalogue with its worst-case cost, and exit | -| `-plan` | probe plan: the fixtures and candidate values a probe cannot discover | -| `-plan-dir` | directory of per-resource plans, `KEY.probe.plan.json`; defaults to the blueprint directory | -| `--allow-mutations` | permit probes that create, update and delete | -| `-profile` | sandbox profile; defaults to `.tfpluginframeworkgen/sandbox/.json` | -| `-force` | record over evidence that is already committed | -| `-no-rehearse` | skip the rehearsal fixpoint after the standard mutating probes | -| `-rederive` | with `-mode replay`: rewrite `facts.json` from the committed cassette, no network | -| `-evidence` | root of the committed evidence (default `probe-evidence`) | -| `-provider` | provider name for the evidence path; defaults to the blueprint's | - -The four modes: - -- **`record`** talks to the live API and freezes everything it saw — cassette, - facts, the plan and subject as probed, and the rehearsal's derived bodies. -- **`replay`** re-runs the probes against the committed cassette. No network, no - credentials. This is the default because the safe mode should be what you get by - typing less. -- **`verify`** replays and then compares the derived facts against the committed - `facts.json`, failing on any difference — the CI drift gate for evidence. It - compares facts even when the replay reproduces an error the recording ended on, - because a reproduced failure with identical facts is a faithful replay. -- **`sweep`** deletes every leftover object the ledger still holds an intent for, - and nothing else. - -`-resource` and `-only` are separate axes and deliberately not one flag: probing one -resource with the whole catalogue and probing every resource with one protocol are -both things an operator wants. - -A mutating record ends with the **rehearsal**: `write.rehearsal` walks both -lifecycle directions (create minimal → update to maximal → downgrade → delete, and -the reverse), and the command then re-derives fixtures from the merged evidence and -re-runs it until the derived bodies stop changing. The converged bodies are frozen -as `rehearsal.json` beside the cassette. `-no-rehearse` skips this for a cheap -targeted re-record; evidence recorded that way carries no rehearsal facts. See -[fixtures-and-rehearsal.md](fixtures-and-rehearsal.md). - -`-rederive` exists for toolkit upgrades: when fact derivation itself changes, the -committed cassettes are re-read and `facts.json` files are rewritten without -touching the network, so better inference never requires re-probing a live API. +| Flag | Default | Purpose | +|---|---|---| +| `-blueprint` | — | blueprint file or directory (required) | +| `-facts` | — | facts JSON to fold in (required) | +| `-strategy` | `annotate` | `annotate` writes behaviour and descriptions; `apply` may also widen presence | +| `-check` | `false` | write nothing and exit 1 if merging would change anything | +| `-allow-conflicts` | `false` | suppress the conflict exit code; conflicts are still reported and still not applied | +| `-recording` | the facts file's directory | identifies the recording in the description marker | +| `-adopt-scenarios` | — | directory of `KEY.scenario.json` scenario files whose fixture values are adopted into `accFixture` wire hints, for attributes the generator refuses to derive | +| `-summary` | `$GITHUB_STEP_SUMMARY` | append a markdown summary here | + +`annotate` is the default because most of what a probe learns lands in +`behaviour` and in the description marker block, neither of which changes the +schema. `apply` is for the facts that do — a field observed as server-populated +widening to `computed_optional`, for instance — and a fact whose application +would *conflict* with a curated declaration is reported and left alone under +either strategy. `-allow-conflicts` suppresses the exit code only; it never +applies anything. + +`-check` is the drift check: CI re-merges every committed facts file and fails +if any blueprint would change, so recordings and blueprints cannot silently +diverge. A facts file with no facts (a rehearsal-only or read-only recording) is +trivially reflected and passes. + +`-adopt-scenarios` copies fixture values from the *scenario* into `accFixture` +wire hints — but only for attributes the fixture generator refuses to derive +itself, only from the scenario's first fixture (later fixtures probe variants, +not the canonical shape), and never over a hand-written hint. Static facts +documents merge through the same verb, with `-recording` naming the `static` +channel; see [probing.md](probing.md#static-facts). + +### `blueprint validate`, `blueprint diff`, `blueprint list` + + blueprint validate [flags] + blueprint diff [flags] + blueprint list [flags] + +Registered, not yet implemented; running one says so and exits non-zero. +Validation itself is built and runs on every load. -Credentials come from the environment and nowhere else — `TFPFGEN_PROBE_ENDPOINT` and -`TFPFGEN_PROBE_TOKEN`. A flag would put the token in shell history and in the process -table; the profile is a file that gets written down, and the gate refuses one that -contains the token's value. +## `probe` -`-list` needs no credentials, no cassettes and no network: +Exercises a resource's lifecycle: records against a live API, or replays the +committed recording with no network. A bare `tfpfgen probe -flags` means +`probe replay` — the safe verb is what you get by typing less, and the verb that +can change somebody's tenant has to be spelled out. ``` -$ tfpluginframeworkgen probe -blueprint blueprints/thousandeyes -resource tag -list +tfpfgen probe record -blueprint DIR [-resource KEY] [-scenario FILE] [-allow-mutations] [-profile FILE] [-force] +tfpfgen probe replay -blueprint DIR [-resource KEY] [-probe NAME] [-rederive] +tfpfgen probe verify -blueprint DIR [-resource KEY] +tfpfgen probe sweep -blueprint DIR [-resource KEY] [-profile FILE] +tfpfgen probe list -blueprint DIR ``` -A mutating run needs `-mode record`, `--allow-mutations`, and a sandbox profile that -passes every gate condition. A refusal lists all of them at once and exits `3`: +The five verbs share one flag set; a flag that only makes sense under one verb +is refused, out loud, under any other (`-allow-mutations` needs `probe record`; +`-rederive` needs `probe replay`). -``` -$ tfpluginframeworkgen probe -blueprint blueprints/example -resource tag \ - -mode record --allow-mutations -tfpluginframeworkgen: mutating probes refused: 5 condition(s) were not met: - - sandbox: the profile does not declare sandbox: true - - sandboxEvidence: sandboxEvidence is 2 characters, and at least 24 are required; … - - namePrefix: namePrefix "tf" is shorter than 8 characters; … - - plan: the plan declares no fixtures; … - - noSnapshotOverwrite: evidence for this plan is already committed; … -``` - -See [probing.md](probing.md) for the gate, the ledger, the sweeper and the budgets. +| Flag | Default | Purpose | +|---|---|---| +| `-blueprint` | — | blueprint file or directory (required) | +| `-resource` | — | probe one resource, by blueprint key | +| `-probe` | — | run one probe, by name | +| `-scenario` | — | probe scenario: fixtures and candidates a probe cannot discover | +| `-scenario-dir` | the blueprint directory | directory of per-resource scenarios, `KEY.scenario.json` | +| `-recordings` | `recordings` | root of the committed probe recordings | +| `-provider` | the blueprint's | provider name for the recording path | +| `-allow-mutations` | `false` | permit probes that create, update and delete; requires `probe record` and a sandbox profile | +| `-profile` | `.tfpfgen/sandbox/PROVIDER.json` | sandbox profile for a mutating run | +| `-force` | `false` | record over a recording that is already committed | +| `-skip-rehearsal` | `false` | skip the rehearsal fixpoint after the standard mutating probes | +| `-rederive` | `false` | with `probe replay`: rewrite `facts.json` from the committed cassette, no network | + +The verbs: + +- **`record`** talks to the live API and freezes everything it saw — the + cassette, the facts, the scenario and subject as probed, and the rehearsal's + derived bodies. +- **`replay`** re-runs the probes against the committed recording. No network, + no credentials. +- **`verify`** replays and then compares the derived facts against the committed + `facts.json`, failing on any difference — the CI drift check for recordings. + It compares facts even when the replay reproduces an error the recording ended + on, because a reproduced failure with identical facts is a faithful replay. +- **`sweep`** deletes every leftover object the ledger still holds an intent + for, and nothing else. +- **`list`** prints the probe catalogue with its worst-case costs and a budget + verdict, per resource. It needs no credentials, no recordings and no network. + +`-resource` and `-probe` are separate axes and deliberately not one flag: +probing one resource with the whole catalogue and probing every resource with +one probe are both things an operator wants. + +Scenarios resolve per resource by convention — `KEY.scenario.json` in the +blueprint directory (`-scenario-dir` overrides the directory, `-scenario` a +single file, and `-scenario` demands `-resource`: a scenario speaks one schema's +wire vocabulary). A mutating run skips a resource with no scenario file, with a +stated note, rather than blocking the rest of the batch. -## `merge` +A mutating record ends with the **rehearsal**: `write.rehearsal` walks both +lifecycle directions (create minimal → update to maximal → downgrade → delete, +and the reverse), and the command then re-derives fixtures from the merged +evidence and re-runs it until the derived bodies stop changing. The converged +bodies are frozen as `rehearsal.json` beside the cassette. `-skip-rehearsal` +skips this for a cheap targeted re-record; a recording made that way carries no +rehearsal facts. See [fixtures-and-rehearsal.md](fixtures-and-rehearsal.md). + +`-rederive` exists for toolkit upgrades: when fact derivation itself changes, +the committed cassettes are re-read and `facts.json` files are rewritten without +touching the network, so better inference never requires re-probing a live API. -Folds a probe run's facts into the blueprint they describe. +Credentials come from the environment and nowhere else — `TFPFGEN_PROBE_ENDPOINT` +and `TFPFGEN_PROBE_TOKEN`. A flag would put the token in shell history and in the +process table; the profile is a file that gets written down, and the guard +refuses one that contains the token's value. -``` -tfpluginframeworkgen merge -blueprint DIR -facts FILE [-strategy annotate|apply] - [-check] [-accept-conflicts] [-promote-plans DIR] [-snapshot-id ID] - [-github-summary PATH] -``` +A mutating run needs `probe record`, `-allow-mutations`, and a sandbox profile +that passes every guard condition. A refusal lists all of them at once and exits +`3`. See [probing.md](probing.md) for the guard, the ledger, the sweeper and the +budgets. -| Flag | Default | Purpose | -|---|---|---| -| `-blueprint` | — | blueprint file or directory (required) | -| `-facts` | — | facts JSON to fold in (required) | -| `-strategy` | `annotate` | `annotate` writes behaviour and descriptions; `apply` may also widen presence | -| `-check` | `false` | write nothing and exit 1 if merging would change anything | -| `-accept-conflicts` | `false` | suppress the conflict exit code; conflicts are still reported and still not applied | -| `-promote-plans` | — | directory of `KEY.probe.plan.json` files whose fixture values are promoted into `accFixture` wire hints, for attributes the generator refuses to derive | -| `-snapshot-id` | the facts file's directory | identifies the evidence in the description marker | -| `-github-summary` | — | append a summary here | - -`annotate` is the default because most of what a probe learns lands in `behaviour` -and in the description marker block, neither of which changes the schema. `apply` -is for the facts that do — a field observed as server-populated widening to -`computed_optional`, for instance — and a fact whose application would *conflict* -with a curated declaration is reported and left alone under either strategy. - -`-check` is the drift gate: CI re-merges every committed facts file and fails if -any blueprint would change, so evidence and blueprint cannot silently diverge. A -facts file with no facts (a rehearsal-only or read-only snapshot) is trivially -reflected and passes. - -`-promote-plans` copies fixture values from the *plan* into `accFixture` wire -hints — but only for attributes the fixture generator refuses to derive itself, -only from the plan's first fixture (later fixtures probe variants, not the -canonical shape), and never over a hand-written hint. Static facts documents merge -through the same command with `-snapshot-id` naming the `static` channel; see -[probing.md](probing.md#static-facts). +## `provider` -## `emit` +### `provider generate` -Renders a provider from blueprints, then runs the postcheck battery over what it -wrote. +Generates the provider Go tree from blueprints, then runs the postcheck battery +over what it wrote. With `-check`, writes nothing and fails on drift. ``` -tfpluginframeworkgen emit -blueprint DIR -out DIR [-only NAME] [-dry-run] +tfpfgen provider generate -blueprint DIR -out DIR [-resource KEY] [-dry-run] [-check] ``` | Flag | Default | Purpose | |---|---|---| | `-blueprint` | — | blueprint file or directory (required) | -| `-out` | — | provider root to write into (required unless `-list` or `-dry-run`) | -| `-only` | — | generate a single resource by key, for inspecting output | -| `-dry-run` | `false` | print the write plan and touch nothing | -| `-list` | `false` | list the files that would be written and exit | -| `-clean` | `false` | delete files the blueprints no longer produce | +| `-out` | — | provider root to write into (required unless `-dry-run`) | +| `-resource` | — | generate a single resource by key, for inspecting output | +| `-dry-run` | `false` | print the files that would be written and touch nothing | +| `-check` | `false` | write nothing and exit 1 if the committed provider has drifted from its blueprints | | `-force` | `false` | overwrite files that are not marked as generated | -| `-skip-postcheck` | `false` | skip the post-emit battery; for tight inner loops only | - -Building the plan touches nothing on disk, so `-dry-run` exercises the same code -path as a real run rather than approximating it. +| `-clean` | `false` | delete files the blueprints no longer produce | +| `-summary` | `$GITHUB_STEP_SUMMARY` | with `-check`: append a markdown drift summary here | +| `-skip-postcheck` | `false` | skip the post-generation battery (compile, docs regeneration, terraform fmt); for tight inner loops only | + +`-dry-run` and `-check` are different questions, and combining them is refused: +`-dry-run` answers "what would a generation write?" by printing the fileset and +touching nothing; `-check` answers "does the committed tree still match?". +Building the fileset touches nothing on disk either way, so `-dry-run` exercises +the same code path as a real run rather than approximating it. + +`-check` reports three failure classes separately, because they have different +causes and different fixes: **drifted** (a generated file differs from what the +blueprints produce), **missing** (a file the blueprints produce is not on disk) +and **orphaned** (a file the blueprints no longer produce is still on disk). +Orphans need `.tfpfgen/manifest.json`; a tree without one says so rather than +silently reporting none, so "no orphans" is distinguishable from "could not +check". -`-force` exists for adopting an existing tree and is deliberately not the default: -a mistyped `-out` would otherwise destroy work with no way to recover it. +`-force` exists for adopting an existing tree and is deliberately not the +default: a mistyped `-out` would otherwise destroy work with no way to recover +it. -`-only` skips the provider-wide registration files, because a registration listing -a subset would not compile against a tree containing the rest. It also leaves the -manifest unchanged, since a partial inventory would make `verify` report every -unlisted file as an orphan. +`-resource` skips the provider-wide registration files, because a registration +listing a subset would not compile against a tree containing the rest. It also +leaves the manifest unchanged, since a partial inventory would make the drift +check report every unlisted file as an orphan. Files whose content is already identical are reported as unchanged rather than rewritten, so regenerating does not churn modification times. -### The postcheck battery +#### The postcheck battery -After writing, `emit` finishes the job with the same tools that gate the result in -CI, in order: +After writing, `provider generate` finishes the job with the same tools that +check the result in CI, in order: 1. **`go build ./...`** in the output module — the tree must compile. 2. **`go generate .`** — regenerates `docs/` via tfplugindocs, but only when the - module root carries a `go:generate` directive for it. Schema changes and their - registry docs can never drift apart. -3. **`terraform fmt -recursive`** — formats the generated `.tf` fixtures, and then - *fails if it rewrote anything*, because a rewrite means the generator produced - unformatted HCL and that is a generator bug to fix, not output to keep patching. + module root carries a `go:generate` directive for it. Schema changes and + their registry docs can never drift apart. +3. **`terraform fmt -recursive`** — formats the generated `.tf` fixtures, and + then *fails if it rewrote anything*, because a rewrite means the generator + produced unformatted HCL and that is a generator bug to fix, not output to + keep patching. The battery only runs when the output root is a Go module (`go.mod` present), so -emitting into a scratch directory for inspection stays cheap. `-skip-postcheck` -exists for tight inner loops; CI and any run before a commit should keep the -battery on — a skipped battery just moves the same failures to the gates. +generating into a scratch directory for inspection stays cheap. +`-skip-postcheck` exists for tight inner loops; CI and any run before a commit +should keep the battery on — a skipped battery just moves the same failures to +the CI checks. -## `verify` - -Fails if the committed provider no longer matches its blueprints. +### `provider scaffold` ``` -tfpluginframeworkgen verify -blueprint DIR -out DIR +tfpfgen provider scaffold -name NAME ``` -| Flag | Default | Purpose | -|---|---|---| -| `-blueprint` | — | blueprint file or directory (required) | -| `-out` | — | provider root to check (required) | -| `-github-summary` | `$GITHUB_STEP_SUMMARY` | write a markdown summary here | - -Three failure classes, reported separately because they have different causes and -different fixes: - -- **drift** — a generated file differs from what the blueprints produce -- **missing** — a file the blueprints produce is not on disk -- **orphaned** — a file the blueprints no longer produce is still on disk - -Orphans need `.tfpluginframeworkgen/manifest.json`. A tree without one says so rather -than silently reporting none, so "no orphans" is distinguishable from "could not -check". - -CI uses `emit` plus `git diff` instead, which is strictly stronger: `verify` can -only compare what the blueprints produce against disk, so a manifest-less tree -hides orphans from it. `verify` is for local use, where a clean git tree cannot be -assumed. +Registered, not yet implemented: it will write a blank resource or data source +from the scaffold template, registered and compiling. The scaffold template +exists; `provider generate` scaffolds it today via `hooks`. ## `bindings` Type-checks a blueprint's SDK bindings against the SDK the provider will compile against, and derives the static facts that live in the SDK's own source. +### `bindings check` + ``` -tfpluginframeworkgen bindings -blueprint DIR -module DIR [-facts-out FILE | -facts-check FILE] +tfpfgen bindings check -blueprint DIR -module DIR ``` | Flag | Default | Purpose | |---|---|---| | `-blueprint` | — | blueprint file or directory (required) | -| `-module` | — | a module whose `go.mod` pins the SDK (required) | -| `-facts-out` | — | write statically derived facts (zero-value unsendable) to FILE | -| `-facts-check` | — | re-derive static facts and fail when FILE differs — the drift gate for a committed static facts document | +| `-module` | — | directory of a module that depends on the SDK (required) | -`-module` is normally the generated provider's own directory. The toolkit's module -deliberately depends on no provider SDK, so it cannot be used — and resolving the -SDK from a module that genuinely depends on it is the point: it guarantees the -version checked is the version that will be compiled. +`-module` is normally the generated provider's own directory. The toolkit's +module deliberately depends on no provider SDK, so it cannot be used — and +resolving the SDK from a module that genuinely depends on it is the point: it +guarantees the version checked is the version that will be compiled. Checks the accessor field chain, service type, each operation's method, the declared return arity against the method's real arity, result types, request and -response models, and every attribute's SDK field against the model it is read from -or written to. +response models, and every attribute's SDK field against the model it is read +from or written to — for every kind that has a binding: resources, data sources, +list facets, actions and ephemerals, counted per kind. + +### `bindings facts` ``` -tag: binding.service.accessor: "r.client.Tags" does not resolve: - thousandeyes.Client has no field "Tags" (available: API, Transport) +tfpfgen bindings facts -blueprint DIR -module DIR -out FILE [-check] ``` -`-facts-out` scans the request models' struct tags for value-typed fields with -`omitempty` — fields whose zero value the SDK is structurally unable to send — and -writes them as `zeroValueUnsendable` facts for `merge` to fold in. `-facts-check` -is the same derivation as a drift gate: bump the SDK pin and CI tells you if the -facts document is stale. The scan also *warns* about value-typed request structs -that no attribute sets, because such a struct always serialises as `{}` on the -wire; a required struct stays a value by design, so this is a warning and not an -error. See [probing.md](probing.md#static-facts). +| Flag | Default | Purpose | +|---|---|---| +| `-blueprint` | — | blueprint file or directory (required) | +| `-module` | — | directory of a module that depends on the SDK (required) | +| `-out` | — | write the statically derived facts (zero-value unsendable) here (required) | +| `-check` | `false` | write nothing; re-derive the facts and fail when `-out`'s file differs — the drift check for a committed static facts document | + +Scans the request models' struct tags for value-typed fields with `omitempty` — +fields whose zero value the SDK is structurally unable to send — and writes them +as `zeroValueUnsendable` facts for `blueprint merge` to fold in. With `-check`, +the same derivation runs as a drift check against the committed document: bump +the SDK pin and CI tells you if the facts document is stale. The scan also +*warns* about value-typed request structs that no attribute sets, because such a +struct always serialises as `{}` on the wire; a required struct stays a value by +design, so this is a warning and not an error. See +[probing.md](probing.md#static-facts). + +## `spec` -## `interop` +Reads and writes HashiCorp's Provider Code Specification (codegen-spec v0.1). +Two verbs; see [`interop.md`](interop.md) for what the format cannot carry, and +why this exists at all. -Reads and writes HashiCorp's Provider Code Specification v0.1. Two verbs; see -[`interop.md`](interop.md) for what the format cannot carry, and why this exists at -all. +### `spec export` ``` -tfpluginframeworkgen interop export -blueprint DIR [-out FILE] [-only KEY] [-strict] [-report FILE] -tfpluginframeworkgen interop import -spec FILE -out DIR -provider NAME [flags] +tfpfgen spec export -blueprint DIR [-out FILE] [-resource KEY] [-strict] [-report FILE] ``` -### `interop export` - | Flag | Default | Purpose | |---|---|---| | `-blueprint` | — | blueprint file or directory (required) | | `-out` | stdout | file to write | -| `-only` | — | restrict to one resource, by blueprint key | -| `-strict` | `false` | exit 1 if anything was coarsened or dropped | -| `-report` | — | write the downgrade notes as JSON | +| `-resource` | — | restrict the export to one resource, by blueprint key | +| `-strict` | `false` | exit non-zero if anything was coarsened or dropped | +| `-report` | — | write the downgrade notes to this file as JSON | -Writes to stdout by default, so `interop export -blueprint … | jq` is the natural way -to look at one. The document is validated against upstream's embedded JSON schema -*before* it is written, so a mapping bug cannot leave a bad artefact on disk for CI to -diff against. +Writes to stdout by default, so `spec export -blueprint … | jq` is the natural +way to look at one. The document is validated against upstream's embedded JSON +schema *before* it is written, so a mapping bug cannot leave a bad artefact on +disk for CI to diff against. -A heavily downgraded export is a success. The format has no way to express a CRUD -binding, and a tool that failed for that reason would never export anything; `-strict` -is for the caller who wants to assert that a *particular* blueprint is fully -expressible. +A heavily downgraded export is a success. The format has no way to express a +CRUD binding, and a tool that failed for that reason would never export +anything; `-strict` is for the caller who wants to assert that a *particular* +blueprint is fully expressible. -The downgrade report goes to stderr with `fmt`, not through the log package, so `-q` -cannot hide it. Uniform losses are aggregated per resource with a count. +The downgrade report goes to stderr with `fmt`, not through the log package, so +`-q` cannot hide it. Uniform losses are aggregated per resource with a count. -``` -1 resource(s), 0 data source(s), 17 attribute(s). 20 note(s): 6 dropped, 0 lossy, 14 info +### `spec import` -dropped: - resources[tag].binding: SDK call wiring has no counterpart, so a document exported - from this blueprint cannot be emitted from - resources[tag].attributes[*].wire: expand and flatten bindings have no counterpart, - so the exported attributes carry no mapping to the SDK (23 affected) ``` - -### `interop import` +tfpfgen spec import -spec FILE -out DIR -provider NAME [flags] +``` | Flag | Default | Purpose | |---|---|---| -| `-spec` | — | codegen-spec v0.1 JSON to read (required) | +| `-spec` | — | Provider Code Specification v0.1 JSON to read (required) | | `-out` | — | directory to write draft blueprints under (required) | | `-provider` | — | registry provider name, which prefixes every Terraform type (required) | | `-type-prefix` | `-provider` | type prefix, when it differs from the provider name | | `-go-module` | — | the generated provider's Go module path | | `-api-version-dir` | — | version directory generated packages live under, e.g. `v7` | | `-service-group` | — | service grouping for the on-disk layout | -| `-list` | `false` | report what the document offers and exit | +| `-dry-run` | `false` | report what the document offers and write nothing | -Resources only. Data sources and the provider configuration schema are reported and -skipped. +Resources only. Data sources and the provider configuration schema are reported +and skipped. -Writes `*.blueprint.draft.json`, which `LoadDir` cannot see — so `emit` and `verify` -are structurally unable to open a blueprint that has a schema and no bindings. -Promoting a draft is a rename. The command prints the fields that must be authored -first, collapsed: - -``` -2 draft(s) written. 7 field group(s) must be authored before emission: - - provider.sdk.{dialect,modulePath,clientType} - resources[tag].binding.service.{importPath,typeName,accessor} - resources[tag].binding.{create,read,update,delete} - resources[tag].attributes[*].wire.{sdkField,sdkGoType,expand,flatten} (23) -``` +Writes `*.blueprint.draft.json`, which `LoadDir` cannot see — so +`provider generate` is structurally unable to open a blueprint that has a schema +and no bindings. Promoting a draft is a rename. The command prints the fields +that must be authored first, collapsed. ## `version` ``` -tfpluginframeworkgen version [-short] +tfpfgen version [-short] ``` +| Flag | Default | Purpose | +|---|---|---| +| `-short` | `false` | print only the version string | + --- -For the full pipeline walked in order with these commands — including the record → -merge → emit loop and the CI gates each stage answers to — see -[onboarding-a-new-api.md](onboarding-a-new-api.md) and [gates.md](gates.md). +For the full pipeline walked in order with these commands — including the +record → merge → generate loop and the CI checks each stage answers to — see +[onboarding-a-new-api.md](onboarding-a-new-api.md) and [checks.md](checks.md). diff --git a/docs/examples/probe-profile.example.json b/docs/examples/sandbox-profile.example.json similarity index 100% rename from docs/examples/probe-profile.example.json rename to docs/examples/sandbox-profile.example.json diff --git a/docs/findings/tag-conditional-structure.md b/docs/findings/tag-conditional-structure.md index 8410c938..6db3546f 100644 --- a/docs/findings/tag-conditional-structure.md +++ b/docs/findings/tag-conditional-structure.md @@ -72,8 +72,8 @@ The document agrees — `readOnly: true` — and a fresh inference marks it `com blueprint has it `computed_optional`, which is wrong: nothing a practitioner writes there ever reaches the API. A tag is assigned to an object from the object's side. -So the earlier plan to put `assignments` in a fixture was never going to work, and not because the -identifier is unresolvable. It is not writable at all. +So the earlier intention to put `assignments` in a payload was never going to work, and not +because the identifier is unresolvable. It is not writable at all. ## What the prober is missing @@ -91,23 +91,23 @@ consequences already visible in the pilot: ### What a probe would have to do -1. **Vary a candidate gate field across its allowed values**, and re-run the existing per-field - probes under each — writability, requiredness, returned-on-read — rather than once against one - arbitrary fixture. +1. **Vary a candidate dispatch field across its allowed values**, and re-run the existing + per-field probes under each — writability, requiredness, returned-on-read — rather than once + against one arbitrary payload. 2. **Record the precondition with the fact.** A fact needs somewhere to say "when `objectType` is `endpoint-agent`", or the observation is a half-truth stored as a whole one. 3. **Read the error body for co-requirements.** `filters: must not be empty` and `matchType: must not be null` arriving together, only under `type: dynamic`, is the API stating a conditional requirement outright. It is already in a response the prober receives. -4. **Distinguish accepted-and-discarded from accepted-and-stored**, per gate value. `matchType` on - a static tag is the clearest case: 201, and the value is gone. +4. **Distinguish accepted-and-discarded from accepted-and-stored**, per dispatch value. + `matchType` on a static tag is the clearest case: 201, and the value is gone. Until that exists, re-recording would only re-measure the same unconditional half-truths against a larger enum set. Which is why the re-record waits for the probe rather than the other way round. -## The dynamic-branch fixture +## The dynamic-branch payload -Added to `blueprints/thousandeyes/probe.plan.json` as `endpoint-agent-tag`. Every field in it is +Added to `blueprints/thousandeyes/tag.scenario.json` as `endpoint-agent-tag`. Every field in it is load-bearing, which is the point: this is the smallest body that reaches the dynamic branch at all, and each of the findings above is one of the reasons. @@ -116,17 +116,17 @@ and each of the findings above is one of the reasons. "filters": [{ "key": "...", "mode": "in", "scope": "custom", "values": ["..."] }] } ``` -Cost, from `probe -list` before and after: 147 → 174 requests, 47 → 56 creates. Inside the plan's -existing budget of 200 and 60, so no cap change. `write.required` is where the increase lands — -16 → 30 requests — because it now omits fields from three fixtures instead of two, and that is -exactly the probe whose disagreements become conditional facts. +Cost, from `probe list` before and after: 147 → 174 requests, 47 → 56 creates. Inside the +scenario's existing budget of 200 and 60, so no cap change. `write.required` is where the increase +lands — 16 → 30 requests — because it now omits fields from three payloads instead of two, and +that is exactly the probe whose disagreements become conditional facts. -Verified by sending the fixture's own body: 201, and the response returns `matchType: "and"` where a +Verified by sending the payload's own body: 201, and the response returns `matchType: "and"` where a static tag returned `null`. That is the conditional `returnedOnRead` finding confirmed from the other side, and it is what the re-record will now be able to observe. **One coverage consequence, stated rather than discovered.** `Scope.fixtureKeys` is deliberately -cross-fixture — "a field one fixture sets is a field the operator has told us a valid value for, so +cross-payload — "a field one payload sets is a field the operator has told us a valid value for, so it is not a candidate for what does the server do when this is omitted". Setting `matchType` and `filters` here therefore removes them from the omitted set, so the server-default protocol stops probing them. That is the design working: a valid dynamic body cannot omit either, so claiming to @@ -135,11 +135,11 @@ know a valid value for them is simply true. Their omission behaviour is still co ## Consequences for the blueprint, as diagnosed at the time -Each of these was a schema change whose evidence is above, and each changed the probe plan, so +Each of these was a schema change whose evidence is above, and each changed the scenario, so they belonged with the re-record rather than before it. All are since applied — see the status section below. -- `type`: must become writable, with its legal value gated on `object_type`. +- `type`: must become writable, with its legal value decided by `object_type`. - `assignments`: must become `computed`. It is read-only in the document and discarded in practice. - `match_type`: `returnedOnRead` is conditional and currently applied unconditionally. - `object_type`: `endpoint-agent` is in `rejectedValues` and should not be. @@ -156,7 +156,7 @@ conditional facts, and each finding above now lives in the blueprint as structur 2. **A dynamic tag requires `matchType` and `filters`** — both carry `requiredByApi = true when objectType is "endpoint-agent" and type is "dynamic"`; the shared precondition *is* the co-requirement group. Conjunctive preconditions - have no single gate for a validator to read, so these two stay description-only. + have no single dispatch field for a validator to read, so these two stay description-only. 3. **`matchType` is silently discarded on a static tag** — the unconditional `returnedOnRead: false` is gone; the truth is one variant per branch (`false when objectType is "test"`, `true when objectType is "endpoint-agent"`). @@ -169,5 +169,5 @@ conditional facts, and each finding above now lives in the blueprint as structur `endpoint-agent` no longer appears in `objectType.rejectedValues`: its refusal blames `type`, and the error-attribution guard now declines to count it, while a documented -value refused by its host fixture is retried in every other declared fixture before it +value refused by its host payload is retried in every other declared payload before it is called rejected at all. diff --git a/docs/fixtures-and-rehearsal.md b/docs/fixtures-and-rehearsal.md index 83b75f39..3c6983a0 100644 --- a/docs/fixtures-and-rehearsal.md +++ b/docs/fixtures-and-rehearsal.md @@ -6,15 +6,15 @@ the live API will actually accept. ## The problem this solves -The pipeline originally treated acceptance testing as a discovery mechanism: emit a -provider, run its tests against the live API, and fix whatever failed — a +The pipeline originally treated acceptance testing as a discovery mechanism: generate +a provider, run its tests against the live API, and fix whatever failed — a server-populated field here, a refused zero value there, an update that silently reset a sibling. Every fix was real, but each one was discovered *after* generation, one failure at a time, against the most expensive oracle available. That is playing whack-a-mole with a live tenant. The correction is sequencing. Everything an acceptance test would discover is now -discovered by the probe, **before emit**, and recorded as facts with evidence. +discovered by the probe, **before generation**, and recorded as facts with evidence. Acceptance's job is confirmation: a red acceptance run means the evidence is incomplete or stale, and the fix is better probing — not a hand-edit to generated code. @@ -80,14 +80,14 @@ blueprint (see [blueprint.md](blueprint.md)): - `omit` — the *curated omission*: this attribute must not appear in any fixture, recorded as a decision rather than left as an accident (the live case: a pair of fields the API refuses jointly, where the fixture keeps one); -- `source` — provenance, so a promoted hint is distinguishable from a hand-written +- `source` — provenance, so an adopted hint is distinguishable from a hand-written one. -Hints can also be **promoted from probe plans**: `merge -promote-plans DIR` copies -a plan's fixture values into wire hints, but only for attributes the derivation -refuses to derive itself, only from the plan's *first* fixture (later fixtures -exist to probe variants, and promoting one broke a real acceptance test), and never -over a hand-written hint. The plan stays the place where probe-only knowledge +Hints can also be **adopted from probe scenarios**: `blueprint merge -adopt-scenarios DIR` +copies a scenario's payload values into wire hints, but only for attributes the derivation +refuses to derive itself, only from the scenario's *first* payload (later payloads +exist to probe variants, and adopting one broke a real acceptance test), and never +over a hand-written hint. The scenario stays the place where probe-only knowledge lives; the blueprint accumulates only what generation actually needs. ## The rehearsal: `write.rehearsal` @@ -116,7 +116,7 @@ refinements keep the comparison honest: time (budgeted), so the *culprit* is named instead of the whole body being written off. Single-culprit by design; two interacting culprits exceed the budget and are recorded as a refusal note. -- **Read-back with expansions**: every read uses the plan's declared query +- **Read-back with expansions**: every read uses the scenario's declared query expansions, because some APIs omit nested collections from a bare item read — concluding "not returned" from an unexpanded read was a real false fact. @@ -133,7 +133,7 @@ Its facts are precisely the ones acceptance tests used to discover the hard way: | `zeroValueUnsendable` | the SDK cannot send the zero value at all | presence recommendation (static; see [probing.md](probing.md#static-facts)) | As with every probe, a fact carries its evidence (request indices into the -cassette) and a confidence level, and `merge` only *acts* on corroborated facts — +cassette) and a confidence level, and `blueprint merge` only *acts* on corroborated facts — a single observation annotates, it does not rewrite presence. ## The fixpoint @@ -141,23 +141,23 @@ a single observation annotates, it does not rewrite presence. Facts change fixtures: learn that the server forces a value and the right fixture value *is* that value; learn a zero value is unsendable and the fixture must omit it. But the rehearsal that produced those facts ran with the old fixtures — so -`probe -mode record` re-derives the bodies from the merged evidence and reruns the +`probe record` re-derives the bodies from the merged evidence and reruns the rehearsal until **derivation converges** (bounded rounds; convergence is the normal case after one). -The loop lives in the command layer (`cmd/tfpluginframeworkgen/rehearse.go`), not -in the probe, because it needs `merge` — and the probe package must never depend -on the package that interprets its output. The converged bodies are frozen as -`rehearsal.json` in the evidence snapshot, so replay replays the fixpoint's +The loop lives in the command layer (`cmd/tfpfgen/rehearse.go`), not +in the probe, because it needs the merge stage — and the probe package must never +depend on the package that interprets its output. The converged bodies are frozen +as `rehearsal.json` in the recording, so replay replays the fixpoint's *outcome* rather than re-deriving from a blueprint that has since moved. ## `maximal.tf` is generated and policed The last piece is ownership. Acceptance fixtures (`testdata/minimal.tf`, `testdata/maximal.tf`) are **generated** from the same derivation, headered as -generated, and drift-gated like every other emitted file. A hand-maintained +generated, and drift-checked like every other generated file. A hand-maintained maximal fixture was the original design, and it desynchronised from the rehearsed -bodies within one wave — the whole point of a shared derivation is defeated the +bodies within one batch — the whole point of a shared derivation is defeated the moment one of its renderings is edited by hand. What used to be hand-tuning a fixture is now a curated `accFixture` hint, which both renderings honour. See [generated-boundary.md](generated-boundary.md). diff --git a/docs/gates.md b/docs/gates.md deleted file mode 100644 index a2930cbf..00000000 --- a/docs/gates.md +++ /dev/null @@ -1,136 +0,0 @@ -# The gates - -Every artefact in the pipeline is committed, and every arrow between artefacts is -drift-gated in CI. This page lists each gate, what it proves, and the exact local -command that reproduces it — because the correct response to any red gate is to -run the pipeline stage that owns the artefact, never to hand-edit the artefact -into passing. - -The gates live in five workflows. The job names below are verbatim, so a failing -check on a PR can be matched to its section here. - -## `go | Verify generated code` (`codegen-verify.yml`) - -Five jobs, one per arrow. - -### 🔁 Regenerate and diff - -Re-emits the pilot from the committed blueprints and fails on any `git diff`. -Then builds and tests the toolkit *and* the emitted provider, and asserts the -emitted Go is a gofumpt fixed point. Proves: committed provider ⟵ committed -blueprints, with no hand edits in between. - -```bash -go run ./cmd/tfpluginframeworkgen emit -blueprint blueprints/thousandeyes -out pilot/thousandeyes -git diff --exit-code -go build ./... && go test ./... -(cd pilot/thousandeyes && go build ./... && go test ./...) -``` - -Red here means a blueprint changed without re-running `emit`, or a generated file -was edited by hand. Regenerate and commit; the hand edit belongs in the blueprint -or in a hook (see [generated-boundary.md](generated-boundary.md)). - -### 🔗 Verify SDK bindings - -Type-checks every binding in the blueprints against the SDK version the pilot's -`go.mod` pins, and re-derives the static facts document against it. - -```bash -go run ./cmd/tfpluginframeworkgen bindings \ - -blueprint blueprints/thousandeyes \ - -module pilot/thousandeyes \ - -facts-check blueprints/thousandeyes/static.facts.json -``` - -Red here usually means an SDK version bump: a method, model or struct tag moved -underneath the blueprints. Fix the bindings, then regenerate the static facts -(`-facts-out`) and re-merge them. - -### 🔀 Round-trip through tfplugingen-framework - -Exports the blueprints as codegen-spec v0.1, diffs the committed export, and -feeds it to HashiCorp's `tfplugingen-framework` to prove the export is one their -tooling accepts. See [interop.md](interop.md). - -```bash -go run ./cmd/tfpluginframeworkgen interop export \ - -blueprint blueprints/thousandeyes \ - -out interop-specs/thousandeyes/provider-code-spec.json -git diff --exit-code -- interop-specs/ -``` - -### 🔬 Re-derive probe facts offline - -Replays every committed cassette with no network and no credentials, asserts the -re-derived facts equal the committed `facts.json`, then re-merges every facts file -under `-check` to assert the blueprints already reflect the evidence. - -```bash -go run ./cmd/tfpluginframeworkgen probe -blueprint blueprints/thousandeyes -mode verify -for facts in probe-evidence/*/*/*/facts.json; do - go run ./cmd/tfpluginframeworkgen merge \ - -blueprint blueprints/thousandeyes -facts "$facts" -check -accept-conflicts -done -``` - -Red on the first half means fact derivation is no longer a pure function of the -transcript (or evidence was edited); red on the second means evidence was -recorded but never merged. See [probing.md](probing.md). - -### 🌍 Terraform validates the examples - -The only job that runs Terraform itself. Regenerates the registry docs and fails -if they drift, asserts committed HCL is a `terraform fmt` fixed point, then -builds the provider, points Terraform at it with `dev_overrides`, and validates -the committed examples against the real schema. This is the job that catches an -example the generated validators reject. - -```bash -(cd pilot/thousandeyes && go generate . && git diff --exit-code -- docs/) -terraform fmt -check -recursive -diff pilot/ -``` - -The `emit` postcheck battery runs the first two of these at generation time (see -[cli.md](cli.md#the-postcheck-battery)), so this gate should only go red when -someone skipped the battery. - -## The other workflows - -| Workflow | Job | What it proves | -|---|---|---| -| `go \| Unit Tests` | 🧪 Run Unit Tests | the toolkit's own suite, with coverage | -| `go \| Linter` | ✨ Run golangci-lint | toolkit lint | -| `go \| Acceptance tests` | 🌍 Acceptance (live tenant) | the generated provider's full lifecycle against the real API | -| `Lint Codebase` (`linter.yml`) | super-linter | markdown, YAML, and everything else non-Go | -| `dependancy-review.yml` | dependency review | no known-vulnerable dependency lands via PR | -| `release-please.yml` | release-please | versioning and CHANGELOG from conventional commits | -| `pr-title-validation.yml` | PR title | conventional-commit PR titles, safely via `env` | -| `auto-merge-dependabot.yml` | auto-merge | patch-level dependabot PRs merge themselves once green | - -## Acceptance - -Acceptance is deliberately **not** a per-PR gate. It runs weekly and on manual -dispatch, gated on a GitHub environment, with a concurrency group so two live -runs can never fight over the same tenant. It creates and destroys real objects, -so it needs `TF_ACC=1` and the provider's live credentials; admin-scoped -resources additionally gate on `TFPFGEN_ACC_ADMIN`. - -Locally, the equivalent is: - -```bash -cd pilot/thousandeyes -TF_ACC=1 go test ./internal/services/... -run 'TestAcc' -timeout 60m -v -``` - -Acceptance is **confirmation, not discovery**: the probe has already rehearsed -the exact lifecycles these tests run (see -[fixtures-and-rehearsal.md](fixtures-and-rehearsal.md)). A red acceptance run -therefore means the evidence is incomplete or the API changed — the fix starts -with `probe`, not with the generated code. - -## Exit codes - -Every command's exit codes are a contract, listed in [cli.md](cli.md#exit-codes). -The one worth repeating here: `probe`'s precedence is **7 > 5 > 3 > 4 > 6 > 1**, -so a run that both exceeded its budget and left an orphan reports the orphan. diff --git a/docs/generated-boundary.md b/docs/generated-boundary.md index e400a615..39e4f8f2 100644 --- a/docs/generated-boundary.md +++ b/docs/generated-boundary.md @@ -8,13 +8,13 @@ to do when a file genuinely cannot be generated. | Path | Owner | Change it by | |---|---|---| -| `internal/services/resources/**/{resource,model,construct,state,crud,list_resource}.go` | toolkit | editing the blueprint, then `emit` | +| `internal/services/resources/**/{resource,model,construct,state,crud,list_resource}.go` | toolkit | editing the blueprint, then `provider generate` | | `internal/services/**/predicate.go` | **you** | editing it — see the note on the consistency predicate | -| `internal/services/datasources/**/{datasource,model,read,state}.go` | toolkit | editing the blueprint, then `emit` | -| `internal/services/**/{modify_plan,validate}.go` | **you** | editing them; `emit` never touches them again | -| `internal/provider/{resources,datasources,list_resources,actions}.go` | toolkit | adding a blueprint, then `emit` | -| `internal/services/actions/**/{action,model,invoke}.go` | toolkit | editing the blueprint, then `emit` | -| `internal/services/**/testdata/{minimal,maximal}.tf` | toolkit | editing the blueprint's `accFixture` hints, then `emit` — see the note on fixtures | +| `internal/services/datasources/**/{datasource,model,read,state}.go` | toolkit | editing the blueprint, then `provider generate` | +| `internal/services/**/{modify_plan,validate}.go` | **you** | editing them; `provider generate` never touches them again | +| `internal/provider/{resources,datasources,list_resources,actions}.go` | toolkit | adding a blueprint, then `provider generate` | +| `internal/services/actions/**/{action,model,invoke}.go` | toolkit | editing the blueprint, then `provider generate` | +| `internal/services/**/testdata/{minimal,maximal}.tf` | toolkit | editing the blueprint's `accFixture` hints, then `provider generate` — see the note on fixtures | | `internal/provider/interfaces.go` | **you** | it pins that the generated registries are what satisfy each `ProviderWith*` | | `internal/provider/provider.go` | **you** | editing it — authentication is always bespoke | | `internal/client/` | **you** | editing it | @@ -22,7 +22,7 @@ to do when a file genuinely cannot be generated. | `internal/services/common/convert/` | **you**, for now | see the note below | | `internal/acceptance/` | **you** | editing it — see the note on the acceptance harness | | `go.mod`, `go.sum` | **you**, for now | `go get`; see the note below | -| `.tfpluginframeworkgen/manifest.json` | toolkit | it is written by `emit` | +| `.tfpfgen/manifest.json` | toolkit | it is written by `provider generate` | The `convert` package is hand-written today. It was expected to be generated, and may be later, but the resty-dialect version turned out to be sixteen functions @@ -38,7 +38,7 @@ starts declaring where its SDK comes from, since the SDK requirement and any The acceptance fixtures (`testdata/minimal.tf`, `testdata/maximal.tf`) moved from "yours" to generated, and the reversal is worth recording. A hand-maintained maximal fixture desynchronised from the bodies the probe had rehearsed within one -wave of resources — the values acceptance ran were no longer the values the +batch of resources — the values acceptance ran were no longer the values the evidence vouched for. Both renderings of a fixture now come from one derivation (see [fixtures-and-rehearsal.md](fixtures-and-rehearsal.md)); what used to be a hand edit to the fixture is now an `accFixture` hint in the blueprint, which the @@ -75,7 +75,8 @@ lost and no test scaffolding reaches a release build. **1. A header on every generated file.** ```go -// Code generated by tfpluginframeworkgen from blueprints/ (sha256:…). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/ +// (sha256:…). DO NOT EDIT. ``` The wording is not cosmetic. The house `.golangci.yml` sets @@ -88,51 +89,51 @@ Either would make every regeneration a diff. The blueprint path and digest are there so that from a suspicious line of generated Go you can reach the input that produced it. -**2. `emit` refuses to overwrite what it does not own.** +**2. `provider generate` refuses to overwrite what it does not own.** A target file whose contents lack the generated marker is a hard error naming the -file. `-force` overrides it, and exists for adopting an existing tree; it is +file. `-force` overrides it, and exists for taking over an existing tree; it is deliberately not the default, because a mistyped `-out` would otherwise destroy work with no way to recover it. **3. The manifest, for orphans.** -`.tfpluginframeworkgen/manifest.json` records what the last run produced. Comparing +`.tfpfgen/manifest.json` records what the last run produced. Comparing blueprints against disk finds files that changed and files that went missing, but it cannot find an **orphan** — a generated file the blueprints no longer produce. Rename a resource and the old package stays on disk, still compiling, registered nowhere, and nothing complains. -`emit` reports orphans and deletes them with `-clean`. It reports rather than -deletes by default: an orphan is usually a rename, but it might equally be a +`provider generate` reports orphans and deletes them with `-clean`. It reports rather +than deletes by default: an orphan is usually a rename, but it might equally be a blueprint that failed to load, and silently deleting a working resource's files on that basis would be worse than leaving them. -`verify` reports drift, missing and orphaned as three separate classes, because -they have different causes and different fixes. +`provider generate -check` reports drift, missing and orphaned as three separate +classes, because they have different causes and different fixes. **4. CI regenerates and diffs the worktree.** -`codegen-verify.yml` runs `emit` and fails on any diff. This is strictly stronger -than `verify`, which can only compare what the blueprints produce against disk — -it cannot see a stale file they no longer produce. Diffing after a real +`codegen-verify.yml` runs `provider generate` and fails on any diff. This is strictly +stronger than `-check`, which can only compare what the blueprints produce against disk +— it cannot see a stale file they no longer produce. Diffing after a real regeneration catches everything. The workflow then builds and tests **both modules**. The explicit `cd pilot/thousandeyes` is load-bearing: the pilot is a separate module, so a root -`go build ./...` silently skips every generated file. Without that step the gate +`go build ./...` silently skips every generated file. Without that step the check would pass on generated code that does not compile — the exact failure it exists to prevent. -**5. `emit` finishes with the tools that gate it.** +**5. `provider generate` finishes with the tools that check it.** -After writing, `emit` runs the postcheck battery — `go build ./...`, `go generate .` -(tfplugindocs), and `terraform fmt` over the output module (see +After writing, `provider generate` runs the postcheck battery — `go build ./...`, +`go generate .` (tfplugindocs), and `terraform fmt` over the output module (see [cli.md](cli.md#the-postcheck-battery)). The battery is the boundary enforced at -generation time rather than at review time: an emitted tree that does not compile, +generation time rather than at review time: a generated tree that does not compile, or whose registry docs or fixture formatting would drift, fails on the author's -machine instead of in CI. It exists because both failures happened — the gates -caught them, but a gate that fires after the commit is a slower postcheck. +machine instead of in CI. It exists because both failures happened — the checks +caught them, but a check that fires after the commit is a slower postcheck. ## State mapping has exactly one call site @@ -153,8 +154,8 @@ write response, so mapping that response writes it null, the next read fills it practitioner gets a diff no configuration change resolves. The pilot's own probe evidence says exactly that about `assignments`. -`TestUnit_Emit_TheStateMapperHasOneCallSite` parses the generated output and counts the -call expressions, so the property survives a template edit. +`TestUnit_Generate_TheStateMapperHasOneCallSite` parses the generated output and counts +the call expressions, so the property survives a template edit. The retry budget comes from `policy.readBack` when the prober measured it, and from a built-in default otherwise — with the generated comment saying which, because a retry loop @@ -165,13 +166,14 @@ consistent succeeds on the first attempt and pays nothing for the loop. *readable*, which is the question every API answers the same way. Waiting for a *particular field to change* — the shape that catches an API which returns a stale object rather than a 404 — depends on which field that API touches on write, and is sometimes resource-specific. -That belongs in a hand-written file per the section below, and is why the reference provider -carries a `predicate.go` in 28 of its 167 resource packages rather than in all of them. +That belongs in a hand-written file per the section below, and is why the ~168-resource +reference provider carries a `predicate.go` in 28 of its resource packages rather than in +all of them. ## The escape hatch Some files cannot be generated. A resource may need a `ModifyPlan` that encodes -judgement no specification carries, or a read-back predicate that knows which +judgement no document carries, or a read-back predicate that knows which field this particular API touches on write. Those files are **scaffolded once and then yours**. Declaring `hooks` on a @@ -201,19 +203,19 @@ passthrough would silently reinterpret every old field under the new schema. Four things make the ownership real rather than a convention: -1. **`emit` writes the file only if it is absent.** It stats the path before +1. **`provider generate` writes the file only if it is absent.** It stats the path before reading it, because the content is irrelevant — the only question is whether somebody already owns this file. 2. **It reports what it kept**, rather than staying quiet: `kept internal/services/.../modify_plan.go (yours; scaffolded once and not regenerated)`. A silent skip is indistinguishable from a file the generator forgot. 3. **The scaffold carries no generated marker**, and is absent from the manifest. - Both are what the drift check keys on, so `verify` does not report your edit + Both are what the drift check keys on, so `-check` does not report your edit as drift or the file as an orphan. -4. **The refusal is not what protects it.** `emit` already refuses to overwrite - an unmarked file, but that is a safety net for a collision nobody intended. +4. **The refusal is not what protects it.** `provider generate` already refuses to + overwrite an unmarked file, but that is a safety net for a collision nobody intended. Relying on it here would mean every regeneration *failed* once you edited a - scaffold: `TestUnit_Emit_AScaffoldIsWrittenOnceAndThenKept` fails with exactly + scaffold: `TestUnit_Generate_AScaffoldIsWrittenOnceAndThenKept` fails with exactly that error if the skip is removed. There is deliberately **no** preserved-region mechanism inside a generated file. @@ -245,25 +247,25 @@ provider — a blueprint claiming a constraint that is not being enforced. So fewer than two attributes (over one, `exactlyOneOf` is `Required` spelled at length). -`interop export` reports both `configValidators` and `hooks` as dropped. -`codegen-spec` has no path expression at all, so a cross-attribute rule has no -coarser form to degrade to; and the hooks are files a practitioner owns, which a -round trip through the format would silently lose. +`spec export` reports both `configValidators` and `hooks` as dropped. +The Provider Code Specification (codegen-spec v0.1) has no path expression at all, +so a cross-attribute rule has no coarser form to degrade to; and the hooks are files +a practitioner owns, which a round trip through the format would silently lose. ## Why registration files are generated whole `internal/provider/resources.go` and `datasources.go` are rewritten completely, not patched. -The archetype provider's equivalent is 168 hand-maintained aliased imports, which -is exactly the kind of list a person should not be maintaining. Owning the whole -file also lets the drift check police it; a partially-generated file makes that -impossible. +The ~168-resource reference provider's equivalent is a hand-maintained aliased import +per resource, which is exactly the kind of list a person should not be maintaining. +Owning the whole file also lets the drift check police it; a partially-generated file +makes that impossible. -**The anchor region-patcher is deferred, deliberately.** The original plan called +**The anchor region-patcher is deferred, deliberately.** The original design called for begin/end markers so generated entries could be inserted into a hand-written file. That is unnecessary while the pilot is greenfield — there is no hand-written -content to preserve — and it is only needed to adopt the toolkit into a provider +content to preserve — and it is only needed to bring the toolkit into a provider that already exists, such as `terraform-provider-microsoft365`. Two things to know before doing that work: @@ -274,6 +276,6 @@ before doing that work: ## Onboarding a new API -The full runbook — from pinning a specification to a green live acceptance run — +The full runbook — from pinning a snapshot to a green live acceptance run — lives in [onboarding-a-new-api.md](onboarding-a-new-api.md). The one rule that belongs on this page as well: at every step, **fix the blueprint, not the Go.** diff --git a/docs/glossary.md b/docs/glossary.md new file mode 100644 index 00000000..507dce3c --- /dev/null +++ b/docs/glossary.md @@ -0,0 +1,61 @@ +# Glossary + +Every domain noun this project uses has exactly one meaning, and this table is where +those meanings live. A term not in this table may not be introduced in docs or code +without adding it here first. + +| Term | Meaning | +|---|---| +| OpenAPI document | The upstream API description as its vendor publishes it; never called a spec or a specification. | +| snapshot | A pinned, committed copy of an OpenAPI document, fetched by `openapi fetch` and stored under `openapi/` so every derivation is reproducible. | +| blueprint | The committed JSON intermediate representation the generator builds a provider from — schema plus bindings, wire mappings and observed behaviour. | +| draft | A blueprint or scenario not yet fit for the pipeline, held under a `.draft.json` name the pipeline's loaders cannot open. | +| promote | To rename a draft to its canonical filename, and nothing else — a git-visible act with no content change. | +| adopt | To fold values from a probe scenario into blueprint hints (`blueprint merge -adopt-scenarios`); adopted hints refresh on re-merge, hand-written ones are never touched. | +| scenario | The per-resource probe worksheet (`.scenario.json`, `probe.Scenario`) saying what a probe run sends and in what order. | +| payload | A request body a scenario or probe sends to the API; distinct from a fixture, which is test input. | +| fixture | A test input owned by the test suite — `accFixture` hints, the generated `minimal.tf`/`maximal.tf`, Go `testdata`. | +| probe | The subsystem — and one unit within it — that exercises a live API's lifecycle to observe what it actually does. | +| recording | The committed evidence tree one probe run leaves under `recordings/`: scenario, facts, subject, metadata, report, rehearsal and interactions. | +| cassette | The replayable HTTP capture inside a recording: `metadata.json` plus the `interactions/` directory. | +| interaction | One captured HTTP request/response pair in a cassette. | +| fact | One observation about one field or operation, with a confidence and the probe that produced it. | +| static facts | Facts derived from the pinned SDK's own types with no HTTP (`bindings facts`, committed as `static.facts.json`). | +| note | One reported line in a loss or draft report — the unit of "reported, never silent"; the spec bridge's note type is `spec.Loss`. | +| confidence | How well-evidenced a fact is: `observed` (seen directly), `corroborated` (seen more than once or from two angles), `inferred` (follows from responses plus an assumption), `suspected` (one ambiguous observation; reported, never written). | +| rehearsal | The probe pass that sends the derived acceptance bodies before acceptance does, so a wrong derivation fails in the probe rather than in a test run. | +| rehearsal fixpoint | The loop that re-derives payloads from each round's new facts until another round would change nothing about what is sent. | +| subject | The wire-level description of the resource under probe — key, path templates, JSONPaths — with no Terraform naming in it. | +| guard | The sandbox-admission table that authorises mutation: every static condition reported together, runtime assertions only after those pass. | +| grant | The unforgeable token the guard issues; a mutating session cannot be constructed without one. | +| ledger | The durable, append-only record of every object a probe run created, so the sweeper can find them even when a create never resolved an ID. | +| sweep | The probe verb that finds and deletes objects a previous run stranded, built from the blueprint alone. | +| orphan | A generated file the blueprints no longer produce; reported by default, deleted only with `-clean`. | +| batch | One group of resources taken through the pipeline together. | +| generate | The user-facing operation that turns blueprints into provider code (`provider generate`); *render* is internal template execution only, and *emit* is not a word this project uses. | +| fileset | Everything one generation run produces, as a value (`generate.Fileset`) — what gets written, checked and recorded in the manifest. | +| postcheck | The battery `provider generate` runs after writing: `go build`, tfplugindocs, `terraform fmt`. | +| manifest | `.tfpfgen/manifest.json`, the record of what the last generation run produced; how orphans are found. | +| drift | A generated file on disk differing from what the blueprints produce. | +| check | A verification that can fail a run: a CI job, or a `-check` mode such as `provider generate -check`. Never "gate". | +| scaffold template | The template for a file written once and then owned by a person — `modify_plan.go`, `predicate.go`, `state_upgrade.go`. | +| reference provider | `deploymenttheory/terraform-provider-microsoft365`, the ~168-resource hand-written provider this toolkit's conventions are calibrated against. | +| sandbox profile | The operator-authored file that tells the guard what this tenant permits; never "probe profile". | +| spec | HashiCorp's Provider Code Specification (codegen-spec v0.1), always and only; read and written by `spec export` / `spec import` via `internal/spec`. | +| binding | The blueprint section that names which SDK service and methods a block's operations call, as data the generator never branches on. | +| dialect | The SDK calling convention a binding assumes — `restyService` today, `kiotaFluent` reserved. | +| wire | How one attribute crosses the boundary: its JSON path, SDK field and type, and the expand/flatten conversions. | +| behaviour | What the API actually does about a field, as observed — writability, immutability, server defaults, returned-on-read — as opposed to what its document claims. | +| hooks | The blueprint field naming which hand-written files to scaffold for a resource. | +| facet | A capability that is part of a resource rather than a sibling block — identity, and the list facet behind `terraform query`. | +| candidate | A synthetic value from outside an attribute's documented set, sent to learn whether that set is closed. | +| TypeName | The generated constant every resource, data source, ephemeral and action registers under — the full Terraform type name. | + +## Whose word wins + +HashiCorp's words for HashiCorp's concepts: `planModifiers`, `ComputedOptionalRequired` +and *spec* are theirs and are spelled their way. The SDK's words for SDK symbols: the +`dashboards_filters` package and its service names keep the SDK's spelling even where +our blueprint keys differ. GitHub's words for GitHub things: *artifact* upload and +status *checks* keep GitHub's spelling. Everything that is this project's own prose is +British English — behaviour, artefact, authorise. diff --git a/docs/interop.md b/docs/interop.md index 0a8389e9..0760b66f 100644 --- a/docs/interop.md +++ b/docs/interop.md @@ -1,15 +1,15 @@ -# Provider Code Specification interop +# The Provider Code Specification bridge -`internal/interop` reads and writes HashiCorp's [Provider Code Specification][spec] -v0.1. `tfpluginframeworkgen interop export` projects a blueprint onto that format; -`interop import` reads one back as a draft. +`internal/spec` reads and writes HashiCorp's [Provider Code Specification][spec] +(codegen-spec v0.1). `tfpfgen spec export` projects a blueprint onto that format; +`spec import` reads one back as a draft. [spec]: https://developer.hashicorp.com/terraform/plugin/code-generation/specification ## Why this exists **Nothing in this toolkit's pipeline consumes the exported document.** The pipeline -runs blueprint → Go. The official format sits outside it, and no stage reads it. +runs blueprint → Go. The spec sits outside it, and no stage reads it. The value is as a **conformance oracle**. Exporting the pilot blueprint and validating it against HashiCorp's own embedded JSON schema — then feeding it to their real @@ -27,9 +27,9 @@ workflow job. The half that has not earned its keep is **import**, not export. Export is cheap — the blueprint is a superset, so it is a projection plus a report — and it buys the oracle. Import needs naming synthesis, the draft mechanism, block conversion and four -refusals, and what it buys is a *worse* starting point than `ingest` already produces -from the same OpenAPI document, for any API where somebody has published a -codegen-spec. That set is currently empty. It is built narrowly for that reason: +refusals, and what it buys is a *worse* starting point than `blueprint draft` already +produces from the same OpenAPI document, for any API where somebody has published a +spec. That set is currently empty. It is built narrowly for that reason: resources only, no data sources, no provider configuration schema. ## The version string is `"0.1"`, not `"0.1.0"` @@ -49,14 +49,14 @@ The published documentation shows `0.1.0`, which upstream rejects. Anybody writi version by hand from the docs produces a document no tool will read, and the failure arrives as a bare "version is unsupported" a long way from the cause. -`interop.SpecVersion` is taken from `spec.Version0_1` rather than written out, and -`TestUnit_Interop_Version` asserts all four halves of this: the constant's value, that -our output declares it, that upstream parses our output, and that upstream **rejects** -the same document with `0.1.0` substituted. +`spec.SpecVersion` is taken from upstream's `Version0_1` constant rather than written +out, and `TestUnit_Spec_Version` asserts all four halves of this: the constant's value, +that our output declares it, that upstream parses our output, and that upstream +**rejects** the same document with `0.1.0` substituted. ## Upstream types are used verbatim -`internal/interop` never redeclares HashiCorp's structs. The official JSON is +`internal/spec` never redeclares HashiCorp's structs. The official JSON is snake_case and the house `.golangci.yml` enables `tagliatelle` with a camelCase default, so a local redeclaration would need a linter exclusion on every field — and would give two definitions to drift apart. Using their types directly means there are @@ -67,20 +67,21 @@ times over, once each in the `resource`, `datasource` and `provider` packages, a struct with one pointer field per type. `prepared.go` absorbs that — it holds every converted sub-value from the shared `schema` package, and the per-package assemblers do nothing but choose which pointer field to set. It is the same division the toolkit -draws between `internal/render` and `internal/templates`. +draws between `internal/generate` and `internal/templates`. ## What the format cannot carry -Everything below is reported, never dropped in silence. Severities are assigned by a -table in `note.go` rather than by judgement at each call site, so the whole loss -vocabulary reads in one screen and `TestUnit_Interop_Severities` can assert it is -total — a new IR field with no entry fails that test. +Everything below is reported, never dropped in silence. A downgrade is a `spec.Loss`, +and severities are assigned by a table in `note.go` rather than by judgement at each +call site, so the whole loss vocabulary reads in one screen and +`TestUnit_Spec_Severities` can assert it is total — a new IR field with no entry fails +that test. | Severity | Meaning | |---|---| | `info` | No counterpart, but nothing is at risk: provenance only, mechanically re-derivable, or the content crossed verbatim into a field with a different declared contract. | | `lossy` | Crossed in a coarsened form a consumer cannot distinguish from the original. | -| `dropped` | Carried nowhere. This is the level that says the export cannot be turned back into something emittable. | +| `dropped` | Carried nowhere. This is the level that says the export cannot be turned back into something the toolkit could generate from. | **Dropped:** CRUD bindings (`binding`), wire bindings (`wire`), observed behaviour (`behaviour`), update style, read-back, delete semantics, import policy, timeouts, the @@ -91,7 +92,7 @@ attribute on import; plan modifiers and defaults on a data-source attribute, whi format has no field for. **Info:** generated Go identifiers, the model field name, the type prefix, layout -conventions, specification provenance, and attribute descriptions — see below. +conventions, snapshot provenance, and attribute descriptions — see below. Uniform losses are aggregated per resource with a count; selective ones stay addressed per attribute. Wire bindings and model field names exist on *every* attribute, so @@ -124,8 +125,8 @@ is otherwise invisible, because the export would still be valid and still round- ## Static defaults -The blueprint stores a default as the Go literal the emitter will write (`"devices"`, -`0`, `false`); the official format wants a typed JSON value. Export parses, import +The blueprint stores a default as the Go literal the generator will write (`"devices"`, +`0`, `false`); the spec wants a typed JSON value. Export parses, import renders back. Two refusals live here, both returning `ErrUnrepresentable`: @@ -145,12 +146,12 @@ interpreted one (`"devices"`), because the format carries the value and not the ## Importing produces a draft -An imported blueprint has a schema and no bindings, so it cannot be emitted. Running -one through `blueprint.Validate` produces a correct message per missing field — for the -pilot, **fifty-three problems** that collectively say "this is broken" rather than -"this came from a schema-only source and needs its bindings authored". +An imported blueprint has a schema and no bindings, so nothing can be generated from +it. Running one through `blueprint.Validate` produces a correct message per missing +field — for the pilot, **fifty-three problems** that collectively say "this is broken" +rather than "this came from a schema-only source and needs its bindings authored". -So `interop import` writes `*.blueprint.draft.json`: +So `spec import` writes `*.blueprint.draft.json`: ```go const DraftExt = ".blueprint.draft.json" @@ -158,17 +159,17 @@ const DraftExt = ".blueprint.draft.json" `blueprint.findBlueprints` matches names ending in `blueprint.Ext` (`.blueprint.json`), and `.blueprint.draft.json` does not have that suffix. **So -`LoadDir`, `emit` and `verify` cannot see a draft at all.** That is the whole -mechanism: an incomplete blueprint is not something the pipeline tolerates, it is -something the pipeline cannot open. Promoting one is a rename — a git-visible, -reviewable act. +`LoadDir` — and with it `provider generate`, `-check` included — cannot see a draft at +all.** That is the whole mechanism: an incomplete blueprint is not something the +pipeline tolerates, it is something the pipeline cannot open. Promoting one is a +rename — a git-visible, reviewable act. ``` -$ tfpluginframeworkgen emit -blueprint drafts/ -out provider/ +$ tfpfgen provider generate -blueprint drafts/ -out provider/ no blueprint found under drafts/ (expected files named *.blueprint.json) ``` -Instead of the fifty-three messages, `interop import` prints what to author, +Instead of the fifty-three messages, `spec import` prints what to author, collapsed: ``` @@ -187,12 +188,12 @@ collapsed: - **A `Draft bool` on the blueprint, with `Validate` softening binding errors.** One field, but it creates a first-class "incomplete blueprint" state, and within two - releases somebody makes `emit` tolerate it. -- **Writing a normal `.blueprint.json` and letting `emit` fail.** The file is then - loadable by nothing — not even `blueprint validate` — so it is a trap that reports as - fifty-three unrelated errors. + releases somebody makes `provider generate` tolerate it. +- **Writing a normal `.blueprint.json` and letting `provider generate` fail.** The file + is then loadable by nothing — not even `blueprint validate` — so it is a trap that + reports as fifty-three unrelated errors. - **Setting `drop: true`.** The worst of the three: `Validate` *skips* dropped - resources, so the blueprint would pass CI cleanly while emitting nothing at all. + resources, so the blueprint would pass CI cleanly while generating nothing at all. ### Names are derived, and not singularised @@ -221,36 +222,36 @@ round-trip expectations for a field that is re-derivable anyway. | A `custom_type` | Reported as `dropped`; the blueprint has no field for it. | Blocks are **not** refused. A block and a nested attribute are the same data with -different HCL syntax, so refusing would make hand-authored specifications -un-ingestible; they are converted and reported `lossy`, because the choice is permanent -once a provider is published. HashiCorp's own OpenAPI generator emits no blocks, so this -only fires on hand-written input. +different HCL syntax, so refusing would make hand-authored documents unimportable; +they are converted and reported `lossy`, because the choice is permanent +once a provider is published. HashiCorp's own OpenAPI generator produces no blocks, so +this only fires on hand-written input. ## Verification ```bash # Round-trip and conformance, hermetic. -go test ./internal/interop/... -cover +go test ./internal/spec/... -cover # The committed export must match the blueprints. -go run ./cmd/tfpluginframeworkgen interop export \ +go run ./cmd/tfpfgen spec export \ -blueprint blueprints/thousandeyes \ - -out interop-specs/thousandeyes/provider-code-spec.json -git diff --quiet -- interop-specs/ + -out specs/thousandeyes/provider-code-spec.json +git diff --quiet -- specs/ # Strict fails on the pilot, because its CRUD bindings cannot cross. -go run ./cmd/tfpluginframeworkgen interop export -blueprint blueprints/thousandeyes -strict; echo $? # 1 +go run ./cmd/tfpfgen spec export -blueprint blueprints/thousandeyes -strict; echo $? # 1 # The third-party parse: the reason this package exists. go install github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework@v0.4.1 tfplugingen-framework generate resources \ - --input interop-specs/thousandeyes/provider-code-spec.json --output /tmp/gen + --input specs/thousandeyes/provider-code-spec.json --output /tmp/gen # Import, and confirm the drafts are invisible to the pipeline. -go run ./cmd/tfpluginframeworkgen interop import \ - -spec interop-specs/thousandeyes/provider-code-spec.json \ +go run ./cmd/tfpfgen spec import \ + -spec specs/thousandeyes/provider-code-spec.json \ -provider thousandeyes -api-version-dir v7 -service-group tags -out /tmp/drafts -go run ./cmd/tfpluginframeworkgen emit -blueprint /tmp/drafts -out /tmp/out # expect: no blueprint found +go run ./cmd/tfpfgen provider generate -blueprint /tmp/drafts -out /tmp/out # expect: no blueprint found ``` The `tfplugingen-framework` job in `codegen-verify.yml` **blocks** rather than warns. A @@ -258,7 +259,7 @@ check that cannot fail the build goes red within a month and is ignored within t which point it is a standing lie about the state of the export. Blocking is safe because the input is fixed — the committed document, not a freshly inferred one — and the tool is pinned, so the only thing that can break it is a change to our own mapping, which is -precisely what wants guarding. +precisely what the check exists to catch. ## Exit codes diff --git a/docs/onboarding-a-new-api.md b/docs/onboarding-a-new-api.md index a407c3b6..b7208332 100644 --- a/docs/onboarding-a-new-api.md +++ b/docs/onboarding-a-new-api.md @@ -1,16 +1,19 @@ # Onboarding a new API, end to end -The numbered runbook for taking an API from "there is a specification and an SDK" to "a -generated provider with live-proven behaviour". First written from two walked paths — the -tag resource (ingest-assisted, fully probed) and the credential pair (hand-authored, +The numbered runbook for taking an API from "there is an OpenAPI document and an SDK" to +"a generated provider with live-proven behaviour". First written from two walked paths — +the tag resource (draft-assisted, fully probed) and the credential pair (hand-authored, probed, plus an ephemeral) — and since walked roughly twenty times across five recorded -waves (tests, alerts, dashboards, account management, endpoint labels), so every step +batches (tests, alerts, dashboards, account management, endpoint labels), so every step below has been done repeatedly, and the sharp edges each one found are recorded where they cut. -Throughout: the pipeline's order is **author first, record second**. A resource lands in -the blueprint before it has evidence; replay and verify note the gap and continue, and -the record run is what closes it. Nothing here requires doing steps out of order. +The canonical pipeline order is +`openapi fetch -> blueprint draft -> [probe record -> blueprint merge] -> provider generate`, +and this runbook deliberately authors before recording. Throughout: the order is +**author first, record second**. A resource lands in the blueprint before it has +evidence; replay and verify note the gap and continue, and the record run is what +closes it. Nothing here requires doing steps out of order. ## 0. What you need before starting @@ -19,7 +22,7 @@ the record run is what closes it. Nothing here requires doing steps out of order returning `(*Result, *resty.Response, error)`). The generated provider's `go.mod` pins it, and every symbol a blueprint names is type-checked against that pin. - **A disposable tenant.** Mutating probes and acceptance tests create and destroy real - objects. The sandbox gate demands a profile that *says so* and proves it at runtime; + objects. The sandbox guard demands a profile that *says so* and proves it at runtime; do not point any of this at an account anybody depends on. - **A bearer token**, reachable from the environment only. The house pattern on macOS: @@ -31,22 +34,22 @@ the record run is what closes it. Nothing here requires doing steps out of order Never a flag (process table, shell history), never a file (the profile loader scans for credential-shaped values and refuses the file rather than reading it). -## 1. Pin the specification +## 1. Pin the OpenAPI document ```sh -tfpluginframeworkgen specs -url https://…/api.yaml -output-dir openapi-specs/PROVIDER +tfpfgen openapi fetch -url https://…/api.yaml -out openapi/PROVIDER ``` The first pin needs `-url`; every later refresh is just -`specs -output-dir openapi-specs/PROVIDER`, because the snapshot records its own source. +`openapi fetch -out openapi/PROVIDER`, because the snapshot records its own source. Snapshots are immutable and checksum-verified on every load; an unchanged upstream pins nothing. Adopting a newer snapshot is a deliberate curation step — diff the metadata, -re-ingest, re-record where behaviour moved — never a side effect of fetching one. +re-draft, re-record where behaviour moved — never a side effect of fetching one. -## 2. See what the specification offers +## 2. See what the document offers ```sh -tfpluginframeworkgen ingest -only THING -list +tfpfgen blueprint draft -tag THING -dry-run ``` Classification is editorial evidence, not a decision: a candidate is a collection path, @@ -56,21 +59,22 @@ data source and action inference is not implemented, so those are hand-authored ## 3. Infer resource blueprints ```sh -tfpluginframeworkgen ingest -only THING -out blueprints/PROVIDER \ +tfpfgen blueprint draft -tag THING -out blueprints/PROVIDER \ -sdk-service-root github.com/…/PROVIDER_api -sdk-accessor r.client.API -api-version-dir v7 ``` Attributes come from request ∪ response schemas (request = writable, response-only = computed); wire bindings and operations are synthesised against the SDK flags. The output is a **starting point for curation**: read every attribute, every operation, and -expect to edit. What ingest cannot know: +expect to edit. What inference cannot know: - **`policy.updateStyle`** is guessed from the HTTP verb. `putFull` is the safe guess (sending the whole object is correct under both semantics); the probe will observe the truth and disagree visibly if it differs. -- **Named SDK enum types.** A field the spec calls `string` may be a named type in the - SDK (`tags.ObjectType`). `bindings` (step 5) catches the mismatch; fix the wire with - the enum converters (`convert.FrameworkToEnum` with `typeArgs`, `convert.EnumToFramework`). +- **Named SDK enum types.** A field the document calls `string` may be a named type in + the SDK (`tags.ObjectType`). `bindings check` (step 5) catches the mismatch; fix the + wire with the enum converters (`convert.FrameworkToEnum` with `typeArgs`, + `convert.EnumToFramework`). - **`notFoundIsSuccess`** is defaulted `true` with no evidence; `read.not-found-shape` will settle it. @@ -84,14 +88,14 @@ all hand-authored, shaped exactly like the pilot's committed examples which resource's fixture creates one is judgement: declare it (`accTest.seedResourceKey` + attribute mappings; `envArgs` + `cleanup` for an action whose subject Terraform cannot create). No seed means no generated test — a stated refusal, not a silent one. -- **A probe plan per resource** (`PROVIDER/RESOURCE.probe.plan.json` by convention): - fixtures (complete valid bodies — one per *branch* of the API's dispatch, see step 6), - candidates for fields whose valid values the spec does not describe, and +- **A scenario per resource** (`PROVIDER/RESOURCE.scenario.json` by convention): + fixtures (complete valid payloads — one per *branch* of the API's dispatch, see step + 6), candidates for fields whose valid values the document does not describe, and `defaultInfluencers` naming every field whose value decides another field's behaviour. - **A gate nobody declares is a branch nobody measures.** Don't start from a blank - file: `ingest … -plan-drafts blueprints/PROVIDER` scaffolds a - `RESOURCE.probe.plan.draft.json` worksheet per resource — required fields filled - where the specification can say, `CURATE_ME` everywhere it cannot, documented enum + **A dispatch field nobody declares is a branch nobody measures.** Don't start from a + blank file: `blueprint draft … -scenario-drafts blueprints/PROVIDER` scaffolds a + `RESOURCE.scenario.draft.json` worksheet per resource — required fields filled + where the document can say, `CURATE_ME` everywhere it cannot, documented enum alternatives prefilled as candidates. The `.draft` suffix keeps it invisible to every loader; curate the placeholders, think about influencers (the scaffold deliberately guesses none), and promotion is the rename — a diff a reviewer sees. @@ -101,40 +105,41 @@ all hand-authored, shaped exactly like the pilot's committed examples ## 5. Type-check the bindings ```sh -tfpluginframeworkgen bindings -blueprint blueprints/PROVIDER -module pilot/PROVIDER +tfpfgen bindings check -blueprint blueprints/PROVIDER -module pilot/PROVIDER ``` Real `go/types` against the SDK version the provider pins — accessor chains, method signatures, return arities, response models, every attribute's `sdkField`, for all five -block kinds, counted per kind. Run it before ever emitting: it turns a pile of identical -compile errors in generated code into one message naming the blueprint field to edit. +block kinds, counted per kind. Run it before ever generating: it turns a pile of +identical compile errors in generated code into one message naming the blueprint field +to edit. Then derive the **static facts** — the behaviour written into the SDK's own struct tags (a value-typed `omitempty` field cannot send its zero value) — and fold them in: ```sh -tfpluginframeworkgen bindings -blueprint blueprints/PROVIDER -module pilot/PROVIDER \ - -facts-out blueprints/PROVIDER/static.facts.json -tfpluginframeworkgen merge -blueprint blueprints/PROVIDER \ +tfpfgen bindings facts -blueprint blueprints/PROVIDER -module pilot/PROVIDER \ + -out blueprints/PROVIDER/static.facts.json +tfpfgen blueprint merge -blueprint blueprints/PROVIDER \ -facts blueprints/PROVIDER/static.facts.json ``` -Commit the document; CI re-derives it with `-facts-check`, so an SDK version bump that -changes a struct tag shows up as drift instead of as a silently wrong fixture. Repeat -both commands whenever the SDK pin moves. +Commit the document; CI re-derives it with `bindings facts -check`, so an SDK version +bump that changes a struct tag shows up as drift instead of as a silently wrong fixture. +Repeat both commands whenever the SDK pin moves. -## 6. Emit, build, and wire the hand-written shell +## 6. Generate, build, and wire the hand-written shell ```sh -tfpluginframeworkgen emit -blueprint blueprints/PROVIDER -out pilot/PROVIDER -dry-run -tfpluginframeworkgen emit -blueprint blueprints/PROVIDER -out pilot/PROVIDER +tfpfgen provider generate -blueprint blueprints/PROVIDER -out pilot/PROVIDER -dry-run +tfpfgen provider generate -blueprint blueprints/PROVIDER -out pilot/PROVIDER cd pilot/PROVIDER && go test ./... ``` -`emit` finishes with the postcheck battery — compile, tfplugindocs regeneration, -`terraform fmt` over the fixtures — so a tree that would fail the CI gates fails on your -machine at generation time. `go test` is still yours to run; the battery proves the tree -is well-formed, not that it is correct. +`provider generate` finishes with the postcheck battery — compile, tfplugindocs +regeneration, `terraform fmt` over the fixtures — so a tree that would fail the CI +checks fails on your machine at generation time. `go test` is still yours to run; the +battery proves the tree is well-formed, not that it is correct. The hand-written boundary (once per provider, then stable): `main.go`, `internal/provider/{provider,interfaces}.go`, `internal/client/`, @@ -154,55 +159,59 @@ taught, both now load-bearing: ```sh TFPFGEN_PROBE_TOKEN=$(security find-generic-password -s tfpfgen-probe -w) \ TFPFGEN_PROBE_ENDPOINT=https://api.PROVIDER.com/v7 \ -tfpluginframeworkgen probe -blueprint blueprints/PROVIDER -resource THING \ - -mode record --allow-mutations \ - -profile .tfpluginframeworkgen/sandbox/PROVIDER.json +tfpfgen probe record -blueprint blueprints/PROVIDER -resource THING \ + -allow-mutations \ + -profile .tfpfgen/sandbox/PROVIDER.json ``` -Plans resolve per resource by convention — `blueprints/PROVIDER/THING.probe.plan.json` -beside the blueprint (`-plan-dir` overrides the directory, `-plan` a single file, and -`-plan` demands `-resource`: a plan speaks one schema's wire vocabulary). Scope the run -with `-resource`, or omit it to record a whole wave: each resource runs against its own -plan with its own ledger and budget, and one with no plan file is skipped with a stated -note rather than blocking the rest. Check the budget first with `-list`, which also -costs each resource against its own plan; every guard is required and every refusal -names all unmet conditions at once. What the fixtures decide: +Scenarios resolve per resource by convention — `blueprints/PROVIDER/THING.scenario.json` +beside the blueprint (`-scenario-dir` overrides the directory, `-scenario` a single +file, and `-scenario` demands `-resource`: a scenario speaks one schema's wire +vocabulary). Scope the run with `-resource`, or omit it to record a whole batch: each +resource runs against its own scenario with its own ledger and budget, and one with no +scenario file is skipped with a stated note rather than blocking the rest. Check the +budget first with `probe list`, which also costs each resource against its own +scenario; every guard condition is required and every refusal names all unmet +conditions at once. What the fixtures decide: - **One fixture per branch.** The dynamic-tag findings exist because a second fixture reached a branch the first could not. A field only one fixture declares is probed - inside that fixture's body (never an arbitrary one), and its facts are scoped to the - gates every attempt shared — measured branches get facts, unmeasured ones get nothing. -- **Declared gates keep their fixture's values.** Everything else is synthesised from a - pool that prefers observed-accepted values and never sends observed-refused ones. + inside that fixture's payload (never an arbitrary one), and its facts are scoped to + the dispatch fields every attempt shared — measured branches get facts, unmeasured + ones get nothing. +- **Declared dispatch fields keep their fixture's values.** Everything else is + synthesised from a pool that prefers observed-accepted values and never sends + observed-refused ones. - **Refused enum values escalate** into every other declared fixture before being called - rejected; a disagreement one gate cleanly partitions becomes a fact per branch. + rejected; a disagreement one dispatch field cleanly partitions becomes a fact per + branch. A mutating record ends with the **rehearsal fixpoint**: the exact lifecycles the generated acceptance tests will run, with the fixture values the generator will render, re-derived and re-run until they converge (see [fixtures-and-rehearsal.md](fixtures-and-rehearsal.md)). Its refusal notes are the -pre-emit signal — a body the API refuses in rehearsal is an acceptance failure you get -to fix *before* any provider code exists, usually with an `accFixture` hint or omission. -`-no-rehearse` skips it for a cheap targeted re-record. +pre-generation signal — a payload the API refuses in rehearsal is an acceptance failure +you get to fix *before* any provider code exists, usually with an `accFixture` hint or +omission. `-skip-rehearsal` skips it for a cheap targeted re-record. Then prove purity offline, exactly as CI will: ```sh -tfpluginframeworkgen probe -blueprint blueprints/PROVIDER -mode verify # no network +tfpfgen probe verify -blueprint blueprints/PROVIDER # no network ``` ## 8. Merge the evidence ```sh -tfpluginframeworkgen merge -blueprint blueprints/PROVIDER \ - -facts probe-evidence/PROVIDER/THING/SNAPSHOT/facts.json +tfpfgen blueprint merge -blueprint blueprints/PROVIDER \ + -facts recordings/PROVIDER/THING/RECORDING/facts.json ``` Merge widens and annotates; it never narrows and it never resolves a disagreement silently. Read all three sections of the output: - **Changes** — behaviour written, including conditional variants - (`behaviour.conditional[gate=value].…`) that emission acts on: `requiredWhen` + (`behaviour.conditional[field=value].…`) that generation acts on: `requiredWhen` validators, branch-aware assertions, fixture membership. - **Conflicts** — the curated blueprint and the evidence disagree. Each names the fix. A stale unconditional fact contradicted by a branch observation is resolved by @@ -212,20 +221,20 @@ silently. Read all three sections of the output: blueprint diff **is** the opt-in; review it as the decision it is. Reconcile presence changes by hand where the evidence demands them (the findings doc -pattern: a field the API discards becomes `computed`; a gated field becomes writable +pattern: a field the API discards becomes `computed`; a branch-dependent field becomes writable with its enum converter), then re-run merge until it reports nothing. -Where the fixture generator refuses to derive a value the plan already knows -(`-promote-plans` names the attributes in its output), promote the plan's values into -`accFixture` wire hints instead of retyping them: +Where the fixture generator refuses to derive a value the scenario already knows +(`-adopt-scenarios` names the attributes in its output), adopt the scenario's values +into `accFixture` wire hints instead of retyping them: ```sh -tfpluginframeworkgen merge -blueprint blueprints/PROVIDER \ - -facts probe-evidence/PROVIDER/THING/SNAPSHOT/facts.json \ - -promote-plans blueprints/PROVIDER +tfpfgen blueprint merge -blueprint blueprints/PROVIDER \ + -facts recordings/PROVIDER/THING/RECORDING/facts.json \ + -adopt-scenarios blueprints/PROVIDER ``` -Promotion only fills gaps — refused attributes, first fixture, hand-written hints always +Adoption only fills gaps — refused attributes, first fixture, hand-written hints always win — so re-running it is safe. ## 9. Acceptance, live @@ -240,16 +249,16 @@ cross-checks, the list query, the action invoke with its re-asserted reversal, t ephemeral echo. `-p 1` matters: packages otherwise run concurrently against one tenant. Seed values are salted per consumer for the same reason. -Then let CI own it: the acceptance workflow is dispatch + weekly schedule, environment- -gated, and the only job that creates real objects. +Then let CI own it: the acceptance workflow is dispatch + weekly schedule, sits behind +a GitHub environment, and is the only job that creates real objects. -## 10. The gates that keep it honest +## 10. The checks that keep it honest Every PR runs five jobs in `codegen-verify.yml` — 🔁 Regenerate and diff, 🔗 Verify SDK bindings (including the static-facts drift check), 🔀 Round-trip through tfplugingen-framework, 🔬 Re-derive probe facts offline (replay-verify with egress -blocked, then `merge -check` over every facts file), and 🌍 Terraform validates the -examples — each with a local reproduction listed in [gates.md](gates.md). A resource -with no evidence yet is a stated note; a verify that proved nothing at all fails. When -any of these disagrees with you, the committed artefact is the arbiter — regenerate, -re-derive, or re-record; never edit a generated file or a cassette by hand. +blocked, then `blueprint merge -check` over every facts file), and 🌍 Terraform +validates the examples — each with a local reproduction listed in [checks.md](checks.md). +A resource with no recording yet is a stated note; a verify that proved nothing at all +fails. When any of these disagrees with you, the committed artefact is the arbiter — +regenerate, re-derive, or re-record; never edit a generated file or a cassette by hand. diff --git a/docs/probing.md b/docs/probing.md index c1a15f16..e534ffbf 100644 --- a/docs/probing.md +++ b/docs/probing.md @@ -5,33 +5,34 @@ what an API *does* rather than what its specification claims. Everything it conc own evidence and a confidence level, and everything it does to somebody's tenant is bounded, recorded and swept. -> Status: complete. All sixteen probes are implemented, and the pilot's committed evidence is -> twenty live mutating runs against a real sandbox, recorded across five waves — every one of -> them re-derivable offline from its transcript, and every one gated in CI by replay-verify. +> Status: complete. All sixteen probes are implemented, and the pilot's committed recordings are +> twenty live mutating runs against a real sandbox, recorded across five batches — every one of +> them re-derivable offline from its transcript, and every one checked in CI by `probe verify`. ## What the first live run found Worth reading before the reference material, because it is the argument for the whole approach. -Every probe passed against a fixture designed to misbehave in twenty-six specific ways. Pointed at -a real API for the first time, the catalogue produced **four facts at `Observed` confidence that -were wrong**, and lost the observations of six probes entirely. None of it was visible offline. +Every probe passed against a stub server designed to misbehave in twenty-six specific ways. +Pointed at a real API for the first time, the catalogue produced **four facts at `observed` +confidence that were wrong**, and lost the observations of six probes entirely. None of it was +visible offline. | What went wrong | Why no test caught it | |---|---| | Every create reported "no identifier", and the sweeper deleted nothing | The identifier lookup matched the *first* attribute named `id`, and the pilot has `assignments[].id` sorting before the resource's own. No fixture had a nested object with an `id` in it. | | The enum probe reported a closed set and four rejected documented values, all wrong | It attributed any 4xx to the enum. Every create in its sweep was refused over a *different* required field. `write.required` had always had the "the error must name the field" guard; this probe did not. | | Six probes observed nothing at all | Synthesised sentinel values violated constraints the API enforces — a documented enum, an undocumented icon set, a hex-colour regex — so the whole body was refused and every field in it went unobserved. | -| A field required by the API was reported as unprobed | The plan's fixtures omitted `accessType` so a default could be observed. There is no default: the API requires it. | +| A field required by the API was reported as unprobed | The scenario's payloads omitted `accessType` so a default could be observed. There is no default: the API requires it. | | Half the immutability and requiredness attempts collided | Stamped names restarted from 1 per field, and the API's uniqueness key includes the name. A 409 duplicate is not a fact about the field being probed. | Each of those is now a guard with a regression test. The one that matters most is the identifier lookup: it failed *silently*, in the direction that leaves objects in somebody's tenant. -Later waves kept finding the same class of thing, which is the evidence the approach generalises +Later batches kept finding the same class of thing, which is the evidence the approach generalises rather than having been lucky once: an API version bump started refusing a synthesised HTTP -header the previous version tolerated (caught by the recorded rehearsal, fixed with one plan +header the previous version tolerated (caught by the recorded rehearsal, fixed with one scenario hint); a permissionless role create turned out to be a genuine server-side 500; user emails are -globally unique and deletion is what frees them, which reshaped the whole fixture strategy for +globally unique and deletion is what frees them, which reshaped the whole payload strategy for that resource. None of those facts is in any specification. **The evidence the run produced**, all of it re-derivable offline: @@ -53,8 +54,8 @@ that resource. None of those facts is in any specification. | Tier | What it does | What it needs | |---|---|---| -| Read-only | six probes: list shape, read shape, error envelope, volatility, pagination, unknown-parameter tolerance | credentials | -| Mutating | ten probes: writability, update style, read-your-writes, requiredness, server defaults, immutability, enum boundaries, normalisation, write side effects, and the rehearsal | credentials, `--allow-mutations`, a sandbox profile, and every gate condition | +| Read-only | six probes: unknown-parameter tolerance (`read.unknown-param`), not-found shape (`read.not-found-shape`), list shape (`read.list-shape`), volatility (`read.volatile`), error envelope (`read.error-envelope`), and weak returned-on-read (`read.returned-weak`) | credentials | +| Mutating | ten probes: writability, update style, read-your-writes, requiredness, server defaults, immutability, enum boundaries, normalisation, write side effects, and the rehearsal | credentials, `-allow-mutations`, a sandbox profile, and every guard condition | The two are separate Go interfaces with no overlap, so a read-only probe cannot write. That is a property of the type system rather than a convention: `ReadProbe` is handed a session whose only @@ -71,55 +72,70 @@ are contrasted against sibling values to tell "suppressed by interaction" from " and a jointly-refused body is bisected one sibling at a time to name the culprit. Its facts are the ones that used to be discovered by a failing acceptance test. -After the standard probes, `probe -mode record` re-derives the fixtures from the merged evidence -and re-runs the rehearsal until the derived bodies stop changing, then freezes the converged -bodies as `rehearsal.json` beside the cassette. The full contract — derivation, the fact kinds, -and why the fixpoint exists — is in +After the standard probes, `probe record` re-derives the rehearsal bodies from the merged +evidence and re-runs the rehearsal until the derived bodies stop changing, then freezes the +converged bodies as `rehearsal.json` in the recording. The full contract — derivation, the fact +kinds, and why the fixpoint exists — is in [fixtures-and-rehearsal.md](fixtures-and-rehearsal.md). -## Modes +## Verbs ``` -tfpluginframeworkgen probe -mode record|replay|verify|sweep -blueprint DIR [-resource KEY] +tfpfgen probe record|replay|verify|sweep -blueprint DIR [-resource KEY] ``` -| Mode | Network | Purpose | +| Verb | Network | Purpose | |---|---|---| -| `replay` *(default)* | none | re-derive facts from a committed cassette | -| `record` | live | issue real requests and write a snapshot | +| `replay` *(default)* | none | re-derive facts from a committed recording | +| `record` | live | issue real requests and write a recording | | `verify` | none | assert the committed facts are exactly what replaying the committed transcript produces | | `sweep` | live | remove objects a previous run left behind | -`replay` is the default deliberately: the safe mode is what you get by typing less, and the mode -that can change somebody's tenant has to be spelled out. +`replay` is the default deliberately — a bare `probe` means `probe replay`: the safe verb is +what you get by typing less, and the verb that can change somebody's tenant has to be spelled +out. -`verify` is the purity gate, and it runs in CI with egress blocked and no credentials. If +`verify` is the purity check, and it runs in CI with egress blocked and no credentials. If derivation ever depended on anything outside the transcript — a clock, an environment variable, map iteration order — the committed facts and the replayed facts would differ, and every fact in -the store would be unreproducible. Two refinements keep that gate honest rather than brittle: +the store would be unreproducible. Two refinements keep that check honest rather than brittle: a replay that reproduces an error the recording itself ended on still has its facts compared -(a faithful reproduction of a recorded failure is a *pass*, not a crash), and `replay -rederive` -rewrites `facts.json` from the committed cassette when the derivation logic itself improves — -so better inference never requires re-probing a live API. +(a faithful reproduction of a recorded failure is a *pass*, not a crash), and `probe replay +-rederive` rewrites `facts.json` from the committed transcript when the derivation logic itself +improves — so better inference never requires re-probing a live API. -## What a snapshot freezes +## What a recording freezes -A committed evidence snapshot is not just the cassette. It freezes everything replay needs to be -a pure function of the directory: +A committed recording is not just the cassette — the cassette itself is `metadata.json` plus the +`interactions/` directory. The recording freezes everything replay needs to be a pure function +of the directory: | File | What it pins | |---|---| -| `cassette.json` | the ordered transcript, redacted | +| `metadata.json`, `interactions/NNN-*.json` | the cassette: run metadata plus the ordered transcript, one redacted interaction per file | | `facts.json` | the derived facts, which `verify` re-derives and compares | -| `plan.json`, `subject.json` | the plan and blueprint-derived subject *as probed*, so later curation cannot silently change what a replay sends | -| `rehearsal.json` | the converged rehearsal bodies, so the fixpoint's outcome replays instead of re-deriving from a blueprint that has since moved | - -Two version marks make old evidence honest rather than wrong. The subject carries an -`evidenceRev`: observations added to the prober after a snapshot was recorded are only asserted -against evidence recorded at a revision that knew to capture them, so upgrading the toolkit never -turns green history red. And a snapshot recorded with `-only` records that filter in its +| `scenario.json`, `subject.json` | the scenario and blueprint-derived subject *as probed*, so later curation cannot silently change what a replay sends | +| `report.json` | the run summary — per-probe outcomes, notes, budget spend and sweep result — so what the run reported is itself part of the record | +| `rehearsal.json` *(when rehearsed)* | the converged rehearsal bodies, so the fixpoint's outcome replays instead of re-deriving from a blueprint that has since moved | + +Two version marks make an old recording honest rather than wrong. The subject carries an +`evidenceRev`: observations added to the prober after a recording was made are only asserted +against recordings made at a revision that knew to capture them, so upgrading the toolkit never +turns green history red. And a recording made with `-probe` records that filter in its metadata, so a filtered recording replays filtered rather than failing over probes it never ran. +## Confidence levels + +Every fact carries one of four confidence levels (`internal/probe/fact.go`), and each level +carries a rule about what `blueprint merge` may do with it: + +| Level | Meaning | +|---|---| +| `observed` | the fact follows from the responses by one unambiguous reading, and the sequence eliminated the alternatives named on the fact | +| `corroborated` | observed twice, with independent payloads or values — required for `Immutable=true` and `Writable=false`, because both drive changes a practitioner cannot work around | +| `inferred` | the fact follows from the responses plus an assumption stated in its alternatives; merge may write it into behaviour but must never let it change an attribute's presence | +| `suspected` | one ambiguous observation — reported, never written; a prompt for a human to look, not a conclusion | + ## Credentials The token and the endpoint come from the environment and nowhere else: @@ -130,15 +146,15 @@ export TFPFGEN_PROBE_TOKEN=… ``` Not a flag: a flag puts the credential in shell history and in the process table. Not the -profile: a profile is a file that gets written down, and the gate refuses one containing the +profile: a profile is a file that gets written down, and the guard refuses one containing the token's value — checked verbatim, because shape heuristics miss a great many real credentials. ## The sandbox profile -A mutating run needs one. Default location `.tfpluginframeworkgen/sandbox/.json`, +A mutating run needs one. Default location `.tfpfgen/sandbox/.json`, which is gitignored — a profile carries `assertions.accountGroupId`, and a tenant identifier in a committed file turns a vulnerability into a targeted one. Start from -[`examples/probe-profile.example.json`](examples/probe-profile.example.json). +[`examples/sandbox-profile.example.json`](examples/sandbox-profile.example.json). ```json { @@ -157,7 +173,7 @@ committed file turns a vulnerability into a targeted one. Start from ``` `sandbox: true` is a **claim**. The assertions are **evidence**, and the distinction is the whole -design of the gate. `maxExistingObjects` is the cheapest and most empirical of them: a tenant +design of the guard. `maxExistingObjects` is the cheapest and most empirical of them: a tenant holding four objects is a sandbox, one holding nine hundred is production, and no amount of configuration can misrepresent that. @@ -165,19 +181,20 @@ configuration can misrepresent that. makes an operator state a reason rather than tick a box. The profile is decoded strictly. A mistyped key in a safety file must not be silently ignored: a -profile with `"sandBox": true` would otherwise gate nothing while looking like it gated +profile with `"sandBox": true` would otherwise guard nothing while looking like it guarded everything. -## The gate +## The guard -Every condition below must hold. A refusal lists **all** of them at once, so a profile gets fixed -in one pass rather than one condition per attempt. +The guard is the admission check in front of every mutating run. Every condition below must +hold. A refusal lists **all** of them at once, so a profile gets fixed in one pass rather than +one condition per attempt. **Static** — checked without issuing a single request: | Condition | Why | |---|---| -| `mode` | mutating probes need `-mode record` | +| `mode` | mutating probes need `probe record` | | `allowMutations` | the flag is required every time; it is a request, not an authorisation | | `sandbox` | the profile must declare it | | `sandboxEvidence` | a human has to have written a reason | @@ -187,8 +204,8 @@ in one pass rather than one condition per attempt. | `https` | a bearer token over plain HTTP is a credential on the wire in clear | | `endpointHostSuffix` | stops a profile pointed at the wrong host | | `canMutate` | the resource must have a create, a delete, a name field and an identifier field | -| `plan` | valid, and declaring at least one fixture | -| `noSnapshotOverwrite` | evidence already committed is not replaced without `-force` | +| `plan` | the scenario must be valid, and declare at least one payload | +| `noSnapshotOverwrite` | a recording already committed is not replaced without `-force` | **Runtime** — read-only requests, attempted only once the static tier is clean: @@ -210,7 +227,7 @@ than a confirmation nothing demonstrated. ### The ledger -`.tfpluginframeworkgen/probe///ledger.jsonl`, gitignored. +`.tfpfgen/probe///ledger.jsonl`, gitignored. Every create writes an intent line and **`fsync`s it before the request is issued**. That ordering is the whole design. The failure that strands an object is not a create that fails — it @@ -245,14 +262,14 @@ Absence from a partial read proves nothing and resolves nothing. and it also catches what a *previous* crashed run left behind. Bounded by the prefix, so it can never touch an object the prober did not create. -Both passes are idempotent, so `-mode sweep` is safe to run again after one fails halfway. +Both passes are idempotent, so `probe sweep` is safe to run again after one fails halfway. A 404 on a delete is **not** taken at face value: on an eventually-consistent API it may mean "not visible yet", and calling that gone is how an orphan gets reported as cleaned up. It is confirmed against the collection first. Paging is not generically implementable, and the sweeper does not pretend. A suspiciously round -item count emits a note and reports `complete: false` rather than claiming a sweep it cannot +item count produces a note and reports `complete: false` rather than claiming a sweep it cannot vouch for. `maxExistingObjects` is what makes a single-page sweep sound in the first place. ### Cleanup happens per probe @@ -273,22 +290,22 @@ into a committed report and a CI step summary. In GitHub Actions it is also appe Then: ```bash -tfpluginframeworkgen probe -mode sweep -resource tag -blueprint blueprints/example +tfpfgen probe sweep -resource tag -blueprint blueprints/example ``` -A sweep is gated more weakly than a record run, deliberately. It does not require -`--allow-mutations` — demanding the mutation flag in order to clean up after yourself is perverse +A sweep is guarded more weakly than a record run, deliberately. It does not require +`-allow-mutations` — demanding the mutation flag in order to clean up after yourself is perverse — and it does not check `maxExistingObjects`, because a tenant that now fails it may be failing it precisely because it is holding your orphans. A ledger with outstanding entries **refuses** the next `record` run. Not only for tidiness: a run against a tenant holding your own orphans makes `maxExistingObjects` measure your own rubbish. -`replay` and `verify` get a note instead — refusing an offline CI gate over a stale local file +`replay` and `verify` get a note instead — refusing an offline CI check over a stale local file buys nothing. ## Budgets -Set per resource in the probe plan; every one has a default, because a plan that forgets a cap +Set per resource in the scenario; every one has a default, because a scenario that forgets a cap must not thereby become unlimited. | Cap | Default | Notes | @@ -299,7 +316,7 @@ must not thereby become unlimited. | `maxSweepSeconds` | 120 | separate from the run's, because the commonest reason to be sweeping is that the run's deadline expired | | `maxDeleteFailures` | 0 | not defaulted — zero is the intended value, and treating zero as "unset" would make the safest setting the one you cannot express | -The pilot's plan sets `maxCreates: 60` rather than the default 25. That is a deliberate choice for +The pilot's scenario sets `maxCreates: 60` rather than the default 25. That is a deliberate choice for a resource with sixteen writable fields and three documented enums, not a workaround: the whole catalogue costs 45 creates, every one of them swept, and per-probe release keeps the number alive at any moment far lower. The default was chosen with no data. @@ -308,11 +325,11 @@ The sweeper spends from its **own** reserve of `4 × maxCreates + 8` requests, n budget. Without that, exceeding the budget would refuse the sweeper's own deletes, and the cap meant to bound the blast radius would manufacture exactly the orphans it exists to prevent. -`probe -list` reports the catalogue's worst-case cost with no credentials, no cassettes and no +`probe list` reports the catalogue's worst-case cost with no credentials, no recordings and no network: ```bash -tfpluginframeworkgen probe -blueprint blueprints/example -resource tag -list +tfpfgen probe list -blueprint blueprints/example -resource tag ``` ## Exit codes @@ -325,7 +342,7 @@ an orphan — and which code CI sees must not depend on the order the errors wer |---|---|---| | `7` | redaction failed | nothing was written, and a secret nearly was | | `5` | objects left behind | something is still live in somebody's tenant | -| `3` | gating refused | nothing ran at all | +| `3` | the guard refused | nothing ran at all | | `4` | budget exceeded | explains why a replay might not match | | `6` | replay mismatch | last of the specific codes | | `1` | anything else | | @@ -334,7 +351,7 @@ Exit `2` means either a usage error or a bug: a panic in a probe is captured, re stack, swept after, and then re-raised — and the Go runtime exits `2` for a panic. A stack in the output means the second; no stack means the first. -## The plan is where the API's own constraints live +## The scenario is where the API's own constraints live A probe synthesises values for the fields it sends, and a synthesised value is refused by any API that constrains the field — which loses the observation for **every** field in that request, not @@ -342,21 +359,21 @@ just the constrained one. Three shapes of constraint turned up in one resource: | Constraint | Where the probe gets a usable value | |---|---| -| a documented enum | the specification, via `AttrType.Enum` — carried through `ingest` for exactly this | -| an undocumented value set (`icon`) | `candidates` in the plan; nothing else can know | -| a documented regex (`color`) | `candidates` in the plan; the IR does not carry patterns | +| a documented enum | the OpenAPI document, via `AttrType.Enum` — carried through `blueprint draft` for exactly this | +| an undocumented value set (`icon`) | `candidates` in the scenario; nothing else can know | +| a documented regex (`color`) | `candidates` in the scenario; the IR does not carry patterns | So `candidates` does more than feed the immutability protocol: it is the general answer to "what value will this API accept here". Declaring two gives the writability protocol its two distinct values as well. A field whose only acceptable value cannot be discovered belongs on `deny`, with the consequence -understood: every probe that would have sent it emits a note, and whatever the blueprint claims +understood: every probe that would have sent it records a note, and whatever the blueprint claims about it stays unprobed. -`deny` gates **experiments, not sends**. A denied field is never probed — never omitted to test -requiredness, never substituted to test immutability — but if a fixture declares a value for it, -that value still goes into every body that needs it. The distinction matters because the two +`deny` withholds **experiments, not sends**. A denied field is never probed — never omitted to +test requiredness, never substituted to test immutability — but if a payload declares a value for +it, that value still goes into every body that needs it. The distinction matters because the two readings diverge exactly when a denied field is also required: strip it from the rehearsal's bodies and every create fails, and the run learns nothing about all the *other* fields. @@ -367,17 +384,17 @@ value-typed request field tagged `omitempty` is a field whose zero value the SDK **structurally unable to send** — `false`, `0` and `""` serialise as an omission, whatever the API would have said about them. Probing for that would be probing the wrong system. -`bindings -facts-out` derives these `zeroValueUnsendable` facts by scanning the pinned SDK's +`bindings facts -out FILE` derives these `zeroValueUnsendable` facts by scanning the pinned SDK's struct tags, and writes them as an ordinary facts document — the pilot commits -`blueprints/thousandeyes/static.facts.json` — that `merge` folds in exactly like probe facts. -They live outside the evidence snapshots because their evidence is a source location, not an -interaction, and they get their own drift gate: `bindings -facts-check` re-derives and fails on -any difference, so an SDK version bump that changes a struct tag cannot leave the committed -facts stale. - -The description marker blocks that `merge` writes keep the two provenances apart: live evidence -writes under its snapshot id, static facts under the id `static`, and within each channel the -newest evidence wins. A fact learned from the SDK's source can never be overwritten by — or +`blueprints/thousandeyes/static.facts.json` — that `blueprint merge` folds in exactly like probe +facts. They live outside the recordings because their evidence is a source location, not an +interaction, and they get their own drift check: `bindings facts -out FILE -check` re-derives and +fails on any difference, so an SDK version bump that changes a struct tag cannot leave the +committed facts stale. + +The description marker blocks that `blueprint merge` writes keep the two provenances apart: live +evidence writes under its recording id, static facts under the id `static`, and within each +channel the newest evidence wins. A fact learned from the SDK's source can never be overwritten by — or masquerade as — one observed on the wire. ## What a probe may not do diff --git a/internal/blueprint/action_test.go b/internal/blueprint/action_test.go index dc31e594..247232ea 100644 --- a/internal/blueprint/action_test.go +++ b/internal/blueprint/action_test.go @@ -54,18 +54,18 @@ func validAction(mutate func(*Action)) Blueprint { func TestUnit_Blueprint_AnActionNeitherExpandsNorFlattens(t *testing.T) { t.Parallel() - if BlockAction.Expands() { + if BlockKindAction.Expands() { t.Error("an action sends arguments, not a request body, so it does not expand") } - if BlockAction.Flattens() { + if BlockKindAction.Flattens() { t.Error("an action writes nothing back, so it does not flatten") } // The kinds that do, still do. - if !BlockResource.Expands() { + if !BlockKindResource.Expands() { t.Error("a resource expands") } - for _, k := range []BlockKind{BlockResource, BlockDataSource, BlockEphemeral, BlockList} { + for _, k := range []BlockKind{BlockKindResource, BlockKindDataSource, BlockKindEphemeral, BlockKindList} { if !k.Flattens() { t.Errorf("%s reads values back, so it flattens", k) } diff --git a/internal/blueprint/binding.go b/internal/blueprint/binding.go index 48c66747..ad0ed019 100644 --- a/internal/blueprint/binding.go +++ b/internal/blueprint/binding.go @@ -274,13 +274,13 @@ type WireBinding struct { SDKGoType string `json:"sdkGoType,omitempty"` // Expand converts Terraform to SDK; Flatten converts SDK to Terraform. - Expand *ConvertCall `json:"expand,omitempty"` + Expand *ConvertCall `json:"expand,omitempty"` // UpdateExpand overrides Expand for the update body, for an SDK whose update // type declares a field differently from create's -- an endpoint label's Name // is string on LabelRequest and *string on Label, and one assignment list // cannot fill both. Meaningful only with a split update body. UpdateExpand *ConvertCall `json:"updateExpand,omitempty"` - Flatten *ConvertCall `json:"flatten,omitempty"` + Flatten *ConvertCall `json:"flatten,omitempty"` // SkipExpand excludes an attribute from the request body. A computed // timestamp is read but never sent. diff --git a/internal/blueprint/blockkind.go b/internal/blueprint/blockkind.go index 39200279..f68c78ed 100644 --- a/internal/blueprint/blockkind.go +++ b/internal/blueprint/blockkind.go @@ -11,18 +11,18 @@ import "fmt" type BlockKind string const ( - // BlockResource is a managed resource: Metadata, Schema, Create, Read, Update, Delete. - BlockResource BlockKind = "resource" - // BlockDataSource is a data source: Metadata, Schema, Read. - BlockDataSource BlockKind = "datasource" - // BlockEphemeral is an ephemeral resource: Metadata, Schema, Open. - BlockEphemeral BlockKind = "ephemeral" - // BlockAction is an action: Metadata, Schema, Invoke. - BlockAction BlockKind = "action" - // BlockList is a list resource, which is a facet of a managed resource rather than an + // BlockKindResource is a managed resource: Metadata, Schema, Create, Read, Update, Delete. + BlockKindResource BlockKind = "resource" + // BlockKindDataSource is a data source: Metadata, Schema, Read. + BlockKindDataSource BlockKind = "dataSource" + // BlockKindEphemeral is an ephemeral resource: Metadata, Schema, Open. + BlockKindEphemeral BlockKind = "ephemeral" + // BlockKindAction is an action: Metadata, Schema, Invoke. + BlockKindAction BlockKind = "action" + // BlockKindList is a list resource, which is a facet of a managed resource rather than an // independent block: its type name must equal the resource's, and it requires that resource to // declare an identity. - BlockList BlockKind = "list" + BlockKindList BlockKind = "list" ) // SchemaPackage is the framework import path suffix this kind's schema types come from. @@ -31,15 +31,15 @@ const ( // this rather than duplicated per kind. func (k BlockKind) SchemaPackage() string { switch k { - case BlockResource: + case BlockKindResource: return "resource/schema" - case BlockDataSource: + case BlockKindDataSource: return "datasource/schema" - case BlockEphemeral: + case BlockKindEphemeral: return "ephemeral/schema" - case BlockAction: + case BlockKindAction: return "action/schema" - case BlockList: + case BlockKindList: return "list/schema" default: return "" @@ -51,7 +51,7 @@ func (k BlockKind) SchemaPackage() string { // Action and list attributes may not. For a list resource that is the structural reason its config // schema is filter-only: there is nowhere to put a result. func (k BlockKind) SupportsComputed() bool { - return k == BlockResource || k == BlockDataSource || k == BlockEphemeral + return k == BlockKindResource || k == BlockKindDataSource || k == BlockKindEphemeral } // SupportsSensitive reports whether this kind's attributes may be Sensitive. @@ -60,13 +60,13 @@ func (k BlockKind) SupportsSensitive() bool { return k.SupportsComputed() } // SupportsPlanModifiers reports whether this kind's attributes may carry plan modifiers. // // Only a managed resource has a plan to modify. -func (k BlockKind) SupportsPlanModifiers() bool { return k == BlockResource } +func (k BlockKind) SupportsPlanModifiers() bool { return k == BlockKindResource } // SupportsDefault reports whether this kind's attributes may carry a default. -func (k BlockKind) SupportsDefault() bool { return k == BlockResource } +func (k BlockKind) SupportsDefault() bool { return k == BlockKindResource } // SupportsWriteOnly reports whether this kind's attributes may be write-only. -func (k BlockKind) SupportsWriteOnly() bool { return k == BlockResource || k == BlockAction } +func (k BlockKind) SupportsWriteOnly() bool { return k == BlockKindResource || k == BlockKindAction } // Expands reports whether this kind sends attribute values to the API through a request // body, and so needs an expand conversion on every attribute a practitioner can set. @@ -81,7 +81,7 @@ func (k BlockKind) SupportsWriteOnly() bool { return k == BlockResource || k == // to build. An action that genuinely POSTs a payload is a deliberate extension rather than // something this should have quietly claimed to support. func (k BlockKind) Expands() bool { - return k == BlockResource + return k == BlockKindResource } // Flattens reports whether this kind reads values back from the API into Terraform. @@ -90,7 +90,7 @@ func (k BlockKind) Expands() bool { // carry a result, so whatever the SDK returns is discarded, and a flatten conversion would be // a conversion into somewhere that does not exist. func (k BlockKind) Flattens() bool { - return k != BlockAction + return k != BlockKindAction } // validateForKind refuses a field the target block kind has no home for. diff --git a/internal/blueprint/blockkind_test.go b/internal/blueprint/blockkind_test.go index 8d214a33..b11a71d8 100644 --- a/internal/blueprint/blockkind_test.go +++ b/internal/blueprint/blockkind_test.go @@ -15,11 +15,11 @@ func TestUnit_BlockKind_SchemaPackage(t *testing.T) { t.Parallel() want := map[BlockKind]string{ - BlockResource: "resource/schema", - BlockDataSource: "datasource/schema", - BlockEphemeral: "ephemeral/schema", - BlockAction: "action/schema", - BlockList: "list/schema", + BlockKindResource: "resource/schema", + BlockKindDataSource: "datasource/schema", + BlockKindEphemeral: "ephemeral/schema", + BlockKindAction: "action/schema", + BlockKindList: "list/schema", BlockKind("nonesuch"): "", } @@ -40,7 +40,7 @@ func TestUnit_BlockKind_SchemaPackage(t *testing.T) { func TestUnit_BlockKind_FieldSupport(t *testing.T) { t.Parallel() - kinds := []BlockKind{BlockResource, BlockDataSource, BlockEphemeral, BlockAction, BlockList} + kinds := []BlockKind{BlockKindResource, BlockKindDataSource, BlockKindEphemeral, BlockKindAction, BlockKindList} tests := []struct { field string @@ -86,28 +86,28 @@ func TestUnit_BlockKind_ValidateRefusesFieldsTheKindHasNoHomeFor(t *testing.T) { }{ { name: "default on a data source attribute", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{Name: "f", Default: &Default{Static: &Literal{Kind: KindString, Raw: `"x"`}}}, wantPath: "attributes[f].default", wantMsg: "resources only", }, { name: "plan modifier on a data source attribute", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{Name: "f", PlanModifiers: []CustomCode{{}}}, wantPath: "attributes[f].planModifiers", wantMsg: "no plan to modify", }, { name: "write-only on a data source attribute", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{Name: "f", WriteOnly: true}, wantPath: "attributes[f].writeOnly", wantMsg: "write-only", }, { name: "computed on a list attribute", - kind: BlockList, + kind: BlockKindList, attr: Attribute{Name: "f", ComputedOptionalRequired: Computed}, wantPath: "attributes[f].computedOptionalRequired", wantMsg: "required and optional", @@ -116,14 +116,14 @@ func TestUnit_BlockKind_ValidateRefusesFieldsTheKindHasNoHomeFor(t *testing.T) { // computed_optional also sets Computed, so it must be refused too -- // checking only for the exact value "computed" would let it through. name: "computed_optional on an action attribute", - kind: BlockAction, + kind: BlockKindAction, attr: Attribute{Name: "f", ComputedOptionalRequired: ComputedOptional}, wantPath: "attributes[f].computedOptionalRequired", wantMsg: "required and optional", }, { name: "sensitive on an action attribute", - kind: BlockAction, + kind: BlockKindAction, attr: Attribute{Name: "f", Sensitive: true}, wantPath: "attributes[f].sensitive", wantMsg: "sensitive", @@ -132,7 +132,7 @@ func TestUnit_BlockKind_ValidateRefusesFieldsTheKindHasNoHomeFor(t *testing.T) { // The refusal has to reach through nesting, because that is where a // hand-authored blueprint is least likely to be read carefully. name: "default on an attribute nested inside a data source attribute", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{ Name: "outer", Type: AttrType{ @@ -208,7 +208,7 @@ func TestUnit_BlockKind_ValidateAcceptsEveryFieldOnAResource(t *testing.T) { } var p problems - a.validateForKind(BlockResource, "attributes[f]", &p) + a.validateForKind(BlockKindResource, "attributes[f]", &p) if len(p) != 0 { t.Errorf("a resource attribute may set all of these; got %v", p) @@ -228,11 +228,11 @@ func TestUnit_BlockKind_Expands(t *testing.T) { // as call arguments and the emitter generates no construct function for one -- so there // is no request body for an expand to build. want := map[BlockKind]bool{ - BlockResource: true, - BlockAction: false, - BlockDataSource: false, - BlockEphemeral: false, - BlockList: false, + BlockKindResource: true, + BlockKindAction: false, + BlockKindDataSource: false, + BlockKindEphemeral: false, + BlockKindList: false, } for kind, w := range want { @@ -251,11 +251,11 @@ func TestUnit_BlockKind_Flattens(t *testing.T) { t.Parallel() want := map[BlockKind]bool{ - BlockResource: true, - BlockDataSource: true, - BlockEphemeral: true, - BlockList: true, - BlockAction: false, + BlockKindResource: true, + BlockKindDataSource: true, + BlockKindEphemeral: true, + BlockKindList: true, + BlockKindAction: false, } for kind, w := range want { @@ -286,7 +286,7 @@ func TestUnit_BlockKind_WireDirectionsAreCheckedPerKind(t *testing.T) { }{ { name: "a writable resource attribute needs an expand", - kind: BlockResource, + kind: BlockKindResource, attr: Attribute{ Name: "f", ComputedOptionalRequired: Required, Wire: WireBinding{Flatten: flatten}, @@ -295,7 +295,7 @@ func TestUnit_BlockKind_WireDirectionsAreCheckedPerKind(t *testing.T) { }, { name: "skipExpand on a writable resource attribute is refused", - kind: BlockResource, + kind: BlockKindResource, attr: Attribute{ Name: "f", ComputedOptionalRequired: Optional, Wire: WireBinding{Flatten: flatten, SkipExpand: true}, @@ -304,7 +304,7 @@ func TestUnit_BlockKind_WireDirectionsAreCheckedPerKind(t *testing.T) { }, { name: "an expand on a data source attribute is refused", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{ Name: "f", ComputedOptionalRequired: Required, Wire: WireBinding{Expand: expand, Flatten: flatten}, @@ -313,13 +313,13 @@ func TestUnit_BlockKind_WireDirectionsAreCheckedPerKind(t *testing.T) { }, { name: "every kind needs a flatten", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{Name: "f", ComputedOptionalRequired: Computed}, wantPath: "attributes[f].wire.flatten", }, { name: "a resource's nested object needs an expand helper", - kind: BlockResource, + kind: BlockKindResource, attr: Attribute{ Name: "outer", ComputedOptionalRequired: Computed, Wire: WireBinding{Flatten: flatten}, @@ -335,7 +335,7 @@ func TestUnit_BlockKind_WireDirectionsAreCheckedPerKind(t *testing.T) { }, { name: "every kind's nested object needs a flatten helper", - kind: BlockDataSource, + kind: BlockKindDataSource, attr: Attribute{ Name: "outer", ComputedOptionalRequired: Computed, Wire: WireBinding{Flatten: flatten}, @@ -383,7 +383,7 @@ func TestUnit_BlockKind_ReadOnlyAttributeNeedsNoExpand(t *testing.T) { } var p problems - lookup.validateForKind(BlockDataSource, "attributes[id]", &p) + lookup.validateForKind(BlockKindDataSource, "attributes[id]", &p) if len(p) != 0 { t.Errorf("a data source's required lookup argument needs no expand; got %v", p) diff --git a/internal/blueprint/blueprint.go b/internal/blueprint/blueprint.go index 0ce7db27..903f77ba 100644 --- a/internal/blueprint/blueprint.go +++ b/internal/blueprint/blueprint.go @@ -5,7 +5,7 @@ // describe a schema and nothing else — it has no representation for CRUD wiring, // for the SDK symbols a resource calls, for observed API behaviour, or for test // scaffolding. Those are most of what a working provider is, so the blueprint -// carries them and the official format is something internal/interop reads and +// carries them and the official format is something internal/spec reads and // writes rather than this package's model. // // Three conventions run through the types and are worth knowing before reading @@ -205,7 +205,7 @@ type Resource struct { // Sweep overrides the prober's name-field inference for this resource. // - // On the resource rather than the probe plan, because `probe -mode sweep` builds its + // On the resource rather than the probe plan, because `probe sweep` builds its // subject from the blueprint alone -- a sweep is exactly the situation where no plan // may be to hand, and the field that finds stranded objects cannot depend on one. // Absent means the prober infers the field itself. @@ -1111,8 +1111,8 @@ func (b Behaviour) IsZero() bool { type UpdateStyle string const ( - // UpdateMergePatch leaves omitted fields alone. - UpdateMergePatch UpdateStyle = "patchMerge" + // UpdatePatchMerge leaves omitted fields alone. + UpdatePatchMerge UpdateStyle = "patchMerge" // UpdatePutFull clears omitted fields, so the request must carry the whole // object. The ThousandEyes tag endpoint is PUT, and getting this wrong // silently erases attributes the practitioner did not mention. diff --git a/internal/blueprint/merge/description.go b/internal/blueprint/merge/description.go index d7e10cba..ed20851a 100644 --- a/internal/blueprint/merge/description.go +++ b/internal/blueprint/merge/description.go @@ -29,8 +29,8 @@ const ( markerOpen = markerPrefix + "%s -->" markerClose = "" - // StaticSnapshotID is the marker id the static-facts channel writes under. - StaticSnapshotID = "static" + // StaticRecordingID is the marker id the static-facts channel writes under. + StaticRecordingID = "static" ) // rewriteDescription replaces one channel's probed block in an attribute's description. @@ -56,7 +56,7 @@ func rewriteDescription( } block := buildBlock(kept, snapshotID) - static := snapshotID == StaticSnapshotID + static := snapshotID == StaticRecordingID existing, hadBlock := channelBlock(attr.MarkdownDescription, static) @@ -153,7 +153,7 @@ func blockID(block string) string { // the live one, whatever recording it came from. func channelBlock(description string, static bool) (string, bool) { for _, b := range blocks(description) { - if (blockID(b) == StaticSnapshotID) == static { + if (blockID(b) == StaticRecordingID) == static { return b, true } } diff --git a/internal/blueprint/merge/merge.go b/internal/blueprint/merge/merge.go index 38a9c82b..798d11ab 100644 --- a/internal/blueprint/merge/merge.go +++ b/internal/blueprint/merge/merge.go @@ -166,9 +166,9 @@ func (r Result) Changed() bool { return len(r.Changes) > 0 } // Options configures a merge. type Options struct { Strategy Strategy - // SnapshotID identifies the evidence, and goes into the regenerable description marker so + // RecordingID identifies the evidence, and goes into the regenerable description marker so // re-merging the same snapshot is idempotent. - SnapshotID string + RecordingID string } // Apply folds facts into a blueprint, returning what changed and what was refused. @@ -345,7 +345,7 @@ func applyConditionalFact( // The same corroboration floor the unconditional path has, for the same reason: a branch // observation still turns an attribute a practitioner can set into one they cannot. if f.Field == probe.FactWritable { - if v := f.Value.Bool; v != nil && !*v && !f.Confidence.AtLeast(probe.Corroborated) { + if v := f.Value.Bool; v != nil && !*v && !f.Confidence.AtLeast(probe.ConfidenceCorroborated) { result.Conflicts = append(result.Conflicts, needsCorroboration(res, path, f, "writable=false "+f.Because())) return true @@ -490,7 +490,7 @@ func applyAttributeFacts( // Suspected facts are report-only, by construction. A suspected fact is a prompt for // somebody to look, not a conclusion, and letting one into the blueprint would put a // claim there that no sequence actually supports. - if !f.Confidence.AtLeast(probe.Inferred) { + if !f.Confidence.AtLeast(probe.ConfidenceInferred) { result.Ignored++ continue } @@ -522,7 +522,7 @@ func applyAttributeFacts( case probe.FactWritable: // Writable=false requires corroboration: it turns an attribute the practitioner // can set into one they cannot, which they have no way to work around. - if v := f.Value.Bool; v != nil && !*v && !f.Confidence.AtLeast(probe.Corroborated) { + if v := f.Value.Bool; v != nil && !*v && !f.Confidence.AtLeast(probe.ConfidenceCorroborated) { result.Conflicts = append(result.Conflicts, needsCorroboration(res, path, f, "writable=false")) continue @@ -531,7 +531,7 @@ func applyAttributeFacts( observations = append(observations, describeWritable(f)) case probe.FactImmutable: - if v := f.Value.Bool; v != nil && *v && !f.Confidence.AtLeast(probe.Corroborated) { + if v := f.Value.Bool; v != nil && *v && !f.Confidence.AtLeast(probe.ConfidenceCorroborated) { result.Conflicts = append(result.Conflicts, needsCorroboration(res, path, f, "immutable=true")) continue @@ -694,7 +694,7 @@ func applyAttributeFacts( case probe.FactServerForced: applyForcedValue(res, attr, path, f, result) - if f.Value.Literal != nil && f.Confidence.AtLeast(probe.Corroborated) { + if f.Value.Literal != nil && f.Confidence.AtLeast(probe.ConfidenceCorroborated) { observations = append(observations, fmt.Sprintf( "The API substitutes %s for whatever is sent here, so a configured "+ "value never takes effect.", f.Value.Literal.Raw)) @@ -755,13 +755,13 @@ func applyAttributeFacts( } if len(observations) > 0 { - rewriteDescription(attr, observations, opts.SnapshotID, res, path, result) + rewriteDescription(attr, observations, opts.RecordingID, res, path, result) } } func applyResourceLevel(res *blueprint.Resource, facts []probe.Fact, result *Result) { for _, f := range facts { - if !f.Confidence.AtLeast(probe.Inferred) { + if !f.Confidence.AtLeast(probe.ConfidenceInferred) { result.Ignored++ continue } @@ -949,7 +949,7 @@ func applyServerDefault( // *static* Default is not: it changes plan output for every existing configuration, which // is a human's call. if opts.Strategy == StrategyApply && attr.ComputedOptionalRequired == blueprint.Optional && - f.Confidence.AtLeast(probe.Corroborated) { + f.Confidence.AtLeast(probe.ConfidenceCorroborated) { result.Changes = append(result.Changes, Change{ Resource: res.Key, JSONPath: path, @@ -1028,7 +1028,7 @@ func applyForcedValue( return } - if !f.Confidence.AtLeast(probe.Corroborated) { + if !f.Confidence.AtLeast(probe.ConfidenceCorroborated) { result.Conflicts = append(result.Conflicts, needsCorroboration(res, path, f, "serverForced="+lit.Raw)) return diff --git a/internal/blueprint/merge/merge_test.go b/internal/blueprint/merge/merge_test.go index a79b043e..50cc216e 100644 --- a/internal/blueprint/merge/merge_test.go +++ b/internal/blueprint/merge/merge_test.go @@ -79,7 +79,7 @@ func TestUnit_Merge_NoServerDefaultConflictsWithComputedOptional(t *testing.T) { facts := []probe.Fact{ // A server-default fact with no literal: the probe looked and found nothing. - fact("colour", probe.FactServerDefault, probe.Value{Text: "none observed"}, probe.Observed), + fact("colour", probe.FactServerDefault, probe.Value{Text: "none observed"}, probe.ConfidenceObserved), } result, err := Apply(&bp, facts, Options{Strategy: StrategyApply}) @@ -129,10 +129,10 @@ func TestUnit_Merge_ConstantDefaultIsRecordedAndDescribed(t *testing.T) { facts := []probe.Fact{ fact("colour", probe.FactServerDefault, probe.LiteralValue(blueprint.Literal{Kind: blueprint.KindString, Raw: `"blue"`}), - probe.Corroborated), + probe.ConfidenceCorroborated), } - result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, SnapshotID: "1.0-t1"}) + result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, RecordingID: "1.0-t1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -184,10 +184,10 @@ func TestUnit_Merge_DerivedDefaultConfirmsTheGuess(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("colour", probe.FactDefaultIsDerived, probe.BoolValue(true), probe.Observed), + fact("colour", probe.FactDefaultIsDerived, probe.BoolValue(true), probe.ConfidenceObserved), } - result, err := Apply(&bp, facts, Options{SnapshotID: "1.0-t1"}) + result, err := Apply(&bp, facts, Options{RecordingID: "1.0-t1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -240,10 +240,10 @@ func TestUnit_Merge_RequiredByAPI(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("key", probe.FactRequiredByAPI, probe.BoolValue(true), probe.Observed), + fact("key", probe.FactRequiredByAPI, probe.BoolValue(true), probe.ConfidenceObserved), } - result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, SnapshotID: "1.0-t1"}) + result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, RecordingID: "1.0-t1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -272,7 +272,7 @@ func TestUnit_Merge_RequiredByAPI(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("key", probe.FactRequiredByAPI, probe.BoolValue(false), probe.Observed), + fact("key", probe.FactRequiredByAPI, probe.BoolValue(false), probe.ConfidenceObserved), } // Widening needs apply; annotate reports it instead. @@ -332,7 +332,7 @@ func TestUnit_Merge_DangerousClaimsNeedCorroboration(t *testing.T) { bp := testBlueprint() // Observed is not enough. - result, err := Apply(&bp, []probe.Fact{fact("colour", tc.field, tc.value, probe.Observed)}, + result, err := Apply(&bp, []probe.Fact{fact("colour", tc.field, tc.value, probe.ConfidenceObserved)}, Options{Strategy: StrategyApply}) if err != nil { t.Fatalf("Apply: %v", err) @@ -349,7 +349,7 @@ func TestUnit_Merge_DangerousClaimsNeedCorroboration(t *testing.T) { // Corroborated is. bp = testBlueprint() - result, err = Apply(&bp, []probe.Fact{fact("colour", tc.field, tc.value, probe.Corroborated)}, + result, err = Apply(&bp, []probe.Fact{fact("colour", tc.field, tc.value, probe.ConfidenceCorroborated)}, Options{Strategy: StrategyApply}) if err != nil { t.Fatalf("Apply: %v", err) @@ -374,7 +374,7 @@ func TestUnit_Merge_ImmutableNeverSetsAPlanModifier(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("colour", probe.FactImmutable, probe.BoolValue(true), probe.Corroborated), + fact("colour", probe.FactImmutable, probe.BoolValue(true), probe.ConfidenceCorroborated), } result, err := Apply(&bp, facts, Options{Strategy: StrategyApply}) @@ -415,8 +415,8 @@ func TestUnit_Merge_SuspectedFactsAreNeverApplied(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("colour", probe.FactWritable, probe.BoolValue(false), probe.Suspected), - fact("colour", probe.FactVolatile, probe.BoolValue(true), probe.Suspected), + fact("colour", probe.FactWritable, probe.BoolValue(false), probe.ConfidenceSuspected), + fact("colour", probe.FactVolatile, probe.BoolValue(true), probe.ConfidenceSuspected), } result, err := Apply(&bp, facts, Options{Strategy: StrategyApply}) @@ -443,7 +443,7 @@ func TestUnit_Merge_ReadBackTurnsOnNeverOff(t *testing.T) { t.Parallel() on := probe.Fact{ - Resource: "thing", Field: probe.FactReadBack, Confidence: probe.Observed, Probe: "test", + Resource: "thing", Field: probe.FactReadBack, Confidence: probe.ConfidenceObserved, Probe: "test", Value: probe.ReadBackValue(blueprint.ReadBack{Enabled: true, MaxRetries: 3, IntervalMS: 250}), Evidence: []string{"002-get-things-1"}, Rationale: "the first read after create answered 404", @@ -506,8 +506,8 @@ func TestUnit_Merge_UpdateStyleIsNotOverwritten(t *testing.T) { t.Parallel() observed := probe.Fact{ - Resource: "thing", Field: probe.FactUpdateStyle, Confidence: probe.Observed, Probe: "test", - Value: probe.TextValue(string(blueprint.UpdateMergePatch)), + Resource: "thing", Field: probe.FactUpdateStyle, Confidence: probe.ConfidenceObserved, Probe: "test", + Value: probe.TextValue(string(blueprint.UpdatePatchMerge)), Evidence: []string{"005-put-things-1"}, Rationale: "a field omitted from an update survived", } @@ -517,7 +517,7 @@ func TestUnit_Merge_UpdateStyleIsNotOverwritten(t *testing.T) { if _, err := Apply(&bp, []probe.Fact{observed}, Options{}); err != nil { t.Fatalf("Apply: %v", err) } - if bp.Resources[0].Policy.UpdateStyle != blueprint.UpdateMergePatch { + if bp.Resources[0].Policy.UpdateStyle != blueprint.UpdatePatchMerge { t.Errorf("updateStyle = %q, want it filled in", bp.Resources[0].Policy.UpdateStyle) } @@ -550,8 +550,8 @@ func TestUnit_Merge_AConditionalResourceLevelFactIsNotApplied(t *testing.T) { t.Parallel() conditional := probe.Fact{ - Resource: "thing", Field: probe.FactUpdateStyle, Confidence: probe.Observed, Probe: "test", - Value: probe.TextValue(string(blueprint.UpdateMergePatch)), + Resource: "thing", Field: probe.FactUpdateStyle, Confidence: probe.ConfidenceObserved, Probe: "test", + Value: probe.TextValue(string(blueprint.UpdatePatchMerge)), Evidence: []string{"005-put-things-1"}, Rationale: "a field omitted from an update survived", When: []probe.Condition{{JSONPath: "type", Equals: "dynamic"}}, @@ -592,9 +592,9 @@ func TestUnit_Merge_AnIntegralFactIsARecommendationOnly(t *testing.T) { t.Fatalf("Marshal: %v", err) } - integral := fact("colour", probe.FactIntegral, probe.BoolValue(true), probe.Inferred) + integral := fact("colour", probe.FactIntegral, probe.BoolValue(true), probe.ConfidenceInferred) - res, err := Apply(&bp, []probe.Fact{integral}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{integral}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -625,7 +625,7 @@ func TestUnit_Merge_NestedFieldsAreReached(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("items.mode", probe.FactVolatile, probe.BoolValue(true), probe.Observed), + fact("items.mode", probe.FactVolatile, probe.BoolValue(true), probe.ConfidenceObserved), } result, err := Apply(&bp, facts, Options{}) @@ -653,10 +653,10 @@ func TestUnit_Merge_UnmatchedFactsAreReported(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("nonexistent", probe.FactVolatile, probe.BoolValue(true), probe.Observed), + fact("nonexistent", probe.FactVolatile, probe.BoolValue(true), probe.ConfidenceObserved), { Resource: "other", Field: probe.FactVolatile, Value: probe.BoolValue(true), - Confidence: probe.Observed, Probe: "test", + Confidence: probe.ConfidenceObserved, Probe: "test", Evidence: []string{"x"}, Rationale: "y", }, } @@ -693,7 +693,7 @@ func TestUnit_Merge_UnrecognisedFactFieldIsReported(t *testing.T) { bp := testBlueprint() - facts := []probe.Fact{fact("colour", "telepathy", probe.BoolValue(true), probe.Observed)} + facts := []probe.Fact{fact("colour", "telepathy", probe.BoolValue(true), probe.ConfidenceObserved)} result, err := Apply(&bp, facts, Options{}) if err != nil { @@ -719,13 +719,13 @@ func TestUnit_Merge_IsIdempotent(t *testing.T) { facts := []probe.Fact{ fact("colour", probe.FactServerDefault, probe.LiteralValue(blueprint.Literal{Kind: blueprint.KindString, Raw: `"blue"`}), - probe.Corroborated), - fact("colour", probe.FactVolatile, probe.BoolValue(false), probe.Observed), - fact("key", probe.FactRequiredByAPI, probe.BoolValue(true), probe.Observed), + probe.ConfidenceCorroborated), + fact("colour", probe.FactVolatile, probe.BoolValue(false), probe.ConfidenceObserved), + fact("key", probe.FactRequiredByAPI, probe.BoolValue(true), probe.ConfidenceObserved), } bp := testBlueprint() - opts := Options{Strategy: StrategyApply, SnapshotID: "1.0-t1785152261691"} + opts := Options{Strategy: StrategyApply, RecordingID: "1.0-t1785152261691"} first, err := Apply(&bp, facts, opts) if err != nil { @@ -753,7 +753,7 @@ func TestUnit_Merge_IsIdempotent(t *testing.T) { // Newer evidence *should* produce a visible one-line diff, so a reader can see which // recording a description came from. - third, err := Apply(&bp, facts, Options{Strategy: StrategyApply, SnapshotID: "1.1-t9"}) + third, err := Apply(&bp, facts, Options{Strategy: StrategyApply, RecordingID: "1.1-t9"}) if err != nil { t.Fatalf("third Apply: %v", err) } @@ -793,7 +793,7 @@ func TestUnit_Merge_DescriptionBlockHandling(t *testing.T) { // The static channel owns its own block beside the live one: the SDK-type facts and a // live recording are different evidence, and one overwriting the other is how re-merging // a snapshot came to read as drift. - both := appendBlock(replaced, buildBlock([]string{"Static: z."}, StaticSnapshotID)) + both := appendBlock(replaced, buildBlock([]string{"Static: z."}, StaticRecordingID)) if s, ok := channelBlock(both, true); !ok || !strings.Contains(s, "Static: z.") { t.Errorf("the static block should be found beside the live one: %q", both) } @@ -841,7 +841,7 @@ func TestUnit_Merge_NotFoundIsSuccessMovesEitherWay(t *testing.T) { f := probe.Fact{ Resource: "thing", Field: probe.FactNotFoundIsSuccess, Value: probe.BoolValue(want), - Confidence: probe.Observed, Probe: "test", + Confidence: probe.ConfidenceObserved, Probe: "test", Evidence: []string{"001-get-things-999"}, Rationale: "observed", } @@ -862,12 +862,12 @@ func TestUnit_Merge_ObservedValueSetsAreStoredAsData(t *testing.T) { facts := []probe.Fact{ fact("colour", probe.FactAcceptedValues, - probe.ListValue([]string{"blue", "red"}), probe.Observed), + probe.ListValue([]string{"blue", "red"}), probe.ConfidenceObserved), fact("colour", probe.FactRejectedValues, - probe.ListValue([]string{"deprecated"}), probe.Observed), + probe.ListValue([]string{"deprecated"}), probe.ConfidenceObserved), } - result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, SnapshotID: "s1"}) + result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, RecordingID: "s1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -925,10 +925,10 @@ func TestUnit_Merge_ValuesClosedLandsOnTheAttribute(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("colour", probe.FactValuesClosed, probe.BoolValue(tc.closed), probe.Observed), + fact("colour", probe.FactValuesClosed, probe.BoolValue(tc.closed), probe.ConfidenceObserved), } - result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, SnapshotID: "s1"}) + result, err := Apply(&bp, facts, Options{Strategy: StrategyApply, RecordingID: "s1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1008,11 +1008,11 @@ func TestUnit_Merge_AConditionalFactBecomesABehaviourVariant(t *testing.T) { bp := testBlueprint() returned := conditional( - fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.Corroborated), + fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.ConfidenceCorroborated), "objectType", "static", ) - res, err := Apply(&bp, []probe.Fact{returned}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{returned}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1080,11 +1080,11 @@ func TestUnit_Merge_AConditionalFactWithNoVariantHomeIsHeldBackAsProse(t *testin bp := testBlueprint() volatile := conditional( - fact("colour", probe.FactVolatile, probe.BoolValue(true), probe.Corroborated), + fact("colour", probe.FactVolatile, probe.BoolValue(true), probe.ConfidenceCorroborated), "objectType", "static", ) - res, err := Apply(&bp, []probe.Fact{volatile}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{volatile}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1121,11 +1121,11 @@ func TestUnit_Merge_AConditionalFactContradictingTheBaseConflicts(t *testing.T) bp.Resources[0].Schema.Attributes[0].Behaviour.ReturnedOnRead = &staleFalse branchTrue := conditional( - fact("colour", probe.FactReturnedOnRead, probe.BoolValue(true), probe.Corroborated), + fact("colour", probe.FactReturnedOnRead, probe.BoolValue(true), probe.ConfidenceCorroborated), "objectType", "dynamic", ) - res, err := Apply(&bp, []probe.Fact{branchTrue}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{branchTrue}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1153,11 +1153,11 @@ func TestUnit_Merge_AConditionalWritableFalseStillNeedsCorroboration(t *testing. bp := testBlueprint() weak := conditional( - fact("colour", probe.FactWritable, probe.BoolValue(false), probe.Observed), + fact("colour", probe.FactWritable, probe.BoolValue(false), probe.ConfidenceObserved), "objectType", "static", ) - res, err := Apply(&bp, []probe.Fact{weak}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{weak}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1179,19 +1179,19 @@ func TestUnit_Merge_VariantOrderDoesNotDependOnFactOrder(t *testing.T) { t.Parallel() forward := []probe.Fact{ - conditional(fact("colour", probe.FactRequiredByAPI, probe.BoolValue(true), probe.Observed), + conditional(fact("colour", probe.FactRequiredByAPI, probe.BoolValue(true), probe.ConfidenceObserved), "objectType", "dynamic"), - conditional(fact("colour", probe.FactRequiredByAPI, probe.BoolValue(false), probe.Observed), + conditional(fact("colour", probe.FactRequiredByAPI, probe.BoolValue(false), probe.ConfidenceObserved), "objectType", "static"), } backward := []probe.Fact{forward[1], forward[0]} one := testBlueprint() - if _, err := Apply(&one, forward, Options{SnapshotID: "snap-1"}); err != nil { + if _, err := Apply(&one, forward, Options{RecordingID: "snap-1"}); err != nil { t.Fatalf("Apply: %v", err) } other := testBlueprint() - if _, err := Apply(&other, backward, Options{SnapshotID: "snap-1"}); err != nil { + if _, err := Apply(&other, backward, Options{RecordingID: "snap-1"}); err != nil { t.Fatalf("Apply: %v", err) } @@ -1219,10 +1219,10 @@ func TestUnit_Merge_TheSameFactWithoutAConditionIsApplied(t *testing.T) { bp := testBlueprint() unconditional := fact( - "colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.Corroborated, + "colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.ConfidenceCorroborated, ) - res, err := Apply(&bp, []probe.Fact{unconditional}, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, []probe.Fact{unconditional}, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1253,16 +1253,16 @@ func TestUnit_Merge_ConditionalFactsFromBothBranchesBecomeSeparateVariants(t *te facts := []probe.Fact{ conditional( - fact("colour", probe.FactRequiredByAPI, probe.BoolValue(true), probe.Observed), + fact("colour", probe.FactRequiredByAPI, probe.BoolValue(true), probe.ConfidenceObserved), "objectType", "dynamic", ), conditional( - fact("colour", probe.FactRequiredByAPI, probe.BoolValue(false), probe.Observed), + fact("colour", probe.FactRequiredByAPI, probe.BoolValue(false), probe.ConfidenceObserved), "objectType", "static", ), } - res, err := Apply(&bp, facts, Options{SnapshotID: "snap-1"}) + res, err := Apply(&bp, facts, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("Apply: %v", err) } @@ -1313,15 +1313,15 @@ func TestUnit_Merge_AConditionalFactIsIdempotentOnASecondMerge(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{conditional( - fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.Corroborated), + fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.ConfidenceCorroborated), "objectType", "static", )} - if _, err := Apply(&bp, facts, Options{SnapshotID: "snap-1"}); err != nil { + if _, err := Apply(&bp, facts, Options{RecordingID: "snap-1"}); err != nil { t.Fatalf("first Apply: %v", err) } - second, err := Apply(&bp, facts, Options{SnapshotID: "snap-1"}) + second, err := Apply(&bp, facts, Options{RecordingID: "snap-1"}) if err != nil { t.Fatalf("second Apply: %v", err) } @@ -1340,9 +1340,9 @@ func TestUnit_Merge_RehearsalEchoFactsLandOnTheAttribute(t *testing.T) { bp := testBlueprint() facts := []probe.Fact{ - fact("colour", probe.FactReturnedOnCreate, probe.BoolValue(false), probe.Observed), - fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.Observed), - fact("colour", probe.FactReturnedOnUpdate, probe.BoolValue(false), probe.Observed), + fact("colour", probe.FactReturnedOnCreate, probe.BoolValue(false), probe.ConfidenceObserved), + fact("colour", probe.FactReturnedOnRead, probe.BoolValue(false), probe.ConfidenceObserved), + fact("colour", probe.FactReturnedOnUpdate, probe.BoolValue(false), probe.ConfidenceObserved), } result, err := Apply(&bp, facts, Options{}) @@ -1378,7 +1378,7 @@ func TestUnit_Merge_AForcedValueNeedsCorroboration(t *testing.T) { bp := testBlueprint() result, err := Apply(&bp, []probe.Fact{ - fact("colour", probe.FactServerForced, lit, probe.Observed), + fact("colour", probe.FactServerForced, lit, probe.ConfidenceObserved), }, Options{}) if err != nil { t.Fatalf("Apply: %v", err) @@ -1392,7 +1392,7 @@ func TestUnit_Merge_AForcedValueNeedsCorroboration(t *testing.T) { bp = testBlueprint() result, err = Apply(&bp, []probe.Fact{ - fact("colour", probe.FactServerForced, lit, probe.Corroborated), + fact("colour", probe.FactServerForced, lit, probe.ConfidenceCorroborated), }, Options{}) if err != nil { t.Fatalf("Apply: %v", err) @@ -1423,7 +1423,7 @@ func TestUnit_Merge_AnUpdateDefaultDisagreeingWithTheCreateDefaultConflicts(t *t result, err := Apply(&bp, []probe.Fact{ fact("colour", probe.FactUpdateDefault, probe.LiteralValue(blueprint.Literal{Kind: blueprint.KindString, Raw: `"red"`}), - probe.Observed), + probe.ConfidenceObserved), }, Options{}) if err != nil { t.Fatalf("Apply: %v", err) @@ -1449,7 +1449,7 @@ func TestUnit_Merge_UpdateResetsIsARecommendationAndProse(t *testing.T) { bp := testBlueprint() result, err := Apply(&bp, []probe.Fact{ - fact("colour", probe.FactUpdateResets, probe.BoolValue(true), probe.Observed), + fact("colour", probe.FactUpdateResets, probe.BoolValue(true), probe.ConfidenceObserved), }, Options{}) if err != nil { t.Fatalf("Apply: %v", err) @@ -1472,7 +1472,7 @@ func TestUnit_Merge_ZeroValueUnsendableIsStaticEvidence(t *testing.T) { t.Parallel() bp := testBlueprint() - f := fact("colour", probe.FactZeroValueUnsendable, probe.BoolValue(true), probe.Corroborated) + f := fact("colour", probe.FactZeroValueUnsendable, probe.BoolValue(true), probe.ConfidenceCorroborated) f.Evidence = []string{"static:things.CreateThingRequest.Colour json:\"colour,omitempty\""} result, err := Apply(&bp, []probe.Fact{f}, Options{}) diff --git a/internal/blueprint/validate.go b/internal/blueprint/validate.go index b64dba4d..9b3d4d85 100644 --- a/internal/blueprint/validate.go +++ b/internal/blueprint/validate.go @@ -188,7 +188,7 @@ func (e Ephemeral) validate(at string, p *problems) { } a.validate(aat, p) - a.validateForKind(BlockEphemeral, aat, p) + a.validateForKind(BlockKindEphemeral, aat, p) dup(p, seenNames, a.Name, aat+".name", "attribute name") dup(p, seenFields, a.GoField, aat+".goField", "model field") @@ -362,7 +362,7 @@ func (a Action) validate(at string, p *problems) { } attr.validate(aat, p) - attr.validateForKind(BlockAction, aat, p) + attr.validateForKind(BlockKindAction, aat, p) dup(p, seenNames, attr.Name, aat+".name", "attribute name") dup(p, seenFields, attr.GoField, aat+".goField", "model field") @@ -421,7 +421,7 @@ func (d DataSource) validate(at string, p *problems) { } a.validate(aat, p) - a.validateForKind(BlockDataSource, aat, p) + a.validateForKind(BlockKindDataSource, aat, p) dup(p, seenNames, a.Name, aat+".name", "attribute name") dup(p, seenFields, a.GoField, aat+".goField", "model field") @@ -484,7 +484,7 @@ func (r Resource) validate(at string, p *problems) { } a.validate(aat, p) - a.validateForKind(BlockResource, aat, p) + a.validateForKind(BlockKindResource, aat, p) dup(p, seenNames, a.Name, aat+".name", "attribute name") // A duplicated Go field is the subtler failure: the schema is fine and @@ -758,7 +758,7 @@ func (r Resource) validateIDBinding(at string, names, fields map[string]bool, p func (r Resource) validatePolicy(at string, hasWritable bool, p *problems) { switch r.Policy.UpdateStyle { - case UpdateMergePatch, UpdatePutFull: + case UpdatePatchMerge, UpdatePutFull: if r.Binding.Update == nil { p.add( at+".policy.updateStyle", @@ -1294,7 +1294,7 @@ func (lf ListFacet) validateFilterSchema(at string, p *problems) { } a.validate(aat, p) - a.validateForKind(BlockList, aat, p) + a.validateForKind(BlockKindList, aat, p) dup(p, seenNames, a.Name, aat+".name", "filter attribute name") dup(p, seenFields, a.GoField, aat+".goField", "filter model field") diff --git a/internal/cassette/redact.go b/internal/cassette/redact.go index 12bbb606..3509e6d4 100644 --- a/internal/cassette/redact.go +++ b/internal/cassette/redact.go @@ -236,8 +236,8 @@ func looksHighEntropy(s string) bool { return false } -// Finding is one thing the scanner objected to. -type Finding struct { +// Leak is one thing the scanner objected to. +type Leak struct { // Interaction is the id the secret was found in, empty when scanning loose bytes. Interaction string // Shape names what matched: a declared secret's name, or a secret-shaped pattern. @@ -246,7 +246,7 @@ type Finding struct { Pointer string } -func (f Finding) String() string { +func (f Leak) String() string { at := f.Pointer if f.Interaction != "" { at = f.Interaction + " " + at @@ -265,8 +265,8 @@ func (f Finding) String() string { // // extraSecrets are values that must not appear whatever their shape -- the token itself, // and the value of every environment variable the profile names. -func Scan(interaction string, data []byte, extraSecrets map[string]string) []Finding { - var findings []Finding +func Scan(interaction string, data []byte, extraSecrets map[string]string) []Leak { + var findings []Leak text := string(data) @@ -282,7 +282,7 @@ func Scan(interaction string, data []byte, extraSecrets map[string]string) []Fin continue } if strings.Contains(text, secret) { - findings = append(findings, Finding{ + findings = append(findings, Leak{ Interaction: interaction, Shape: "declared secret " + name, Pointer: "somewhere in the serialised interaction", @@ -302,7 +302,7 @@ func Scan(interaction string, data []byte, extraSecrets map[string]string) []Fin continue } - findings = append(findings, Finding{ + findings = append(findings, Leak{ Interaction: interaction, Shape: shape.name, Pointer: fmt.Sprintf("at byte offset %d", loc[0]), @@ -313,7 +313,7 @@ func Scan(interaction string, data []byte, extraSecrets map[string]string) []Fin } // ScanInteraction serialises an interaction and scans it. -func ScanInteraction(i Interaction, extraSecrets map[string]string) ([]Finding, error) { +func ScanInteraction(i Interaction, extraSecrets map[string]string) ([]Leak, error) { data, err := json.Marshal(i) if err != nil { return nil, fmt.Errorf("%w: serialising interaction %s: %w", ErrInvalidCassette, i.ID, err) @@ -322,8 +322,8 @@ func ScanInteraction(i Interaction, extraSecrets map[string]string) ([]Finding, return Scan(i.ID, data, extraSecrets), nil } -// FindingsError turns findings into an error carrying ErrSecretFound. -func FindingsError(findings []Finding) error { +// LeaksError turns findings into an error carrying ErrSecretFound. +func LeaksError(findings []Leak) error { if len(findings) == 0 { return nil } diff --git a/internal/cassette/redact_test.go b/internal/cassette/redact_test.go index ec182db0..4cd20957 100644 --- a/internal/cassette/redact_test.go +++ b/internal/cassette/redact_test.go @@ -340,7 +340,7 @@ func TestUnit_Cassette_ScanFindsDeclaredSecrets(t *testing.T) { func TestUnit_Cassette_PlantedTokenWritesNothing(t *testing.T) { t.Parallel() - root := filepath.Join(t.TempDir(), "probe-evidence") + root := filepath.Join(t.TempDir(), "recordings") // A redactor that does not know about the token, standing in for the realistic failure: // the operator declared the wrong value, or the API echoed a credential nobody @@ -353,7 +353,7 @@ func TestUnit_Cassette_PlantedTokenWritesNothing(t *testing.T) { meta := Metadata{Provider: "example", Resource: "thing", Host: "api.example.com"} - _, err := Write(root, meta, interactions, map[string]string{"bearer": testToken}, time.Unix(0, 0)) + _, err := Record(root, meta, interactions, map[string]string{"bearer": testToken}, time.Unix(0, 0)) if !errors.Is(err, ErrSecretFound) { t.Fatalf("error = %v, want ErrSecretFound", err) } @@ -427,11 +427,11 @@ func TestUnit_Cassette_RecordingRequiresARedactor(t *testing.T) { func TestUnit_Cassette_FindingsError(t *testing.T) { t.Parallel() - if err := FindingsError(nil); err != nil { + if err := LeaksError(nil); err != nil { t.Errorf("no findings should give no error, got %v", err) } - err := FindingsError([]Finding{ + err := LeaksError([]Leak{ {Interaction: "001", Shape: "jwt", Pointer: "at byte offset 12"}, {Interaction: "002", Shape: "declared secret bearer", Pointer: "somewhere"}, }) diff --git a/internal/cassette/store.go b/internal/cassette/store.go index 3acbaaf3..0417abca 100644 --- a/internal/cassette/store.go +++ b/internal/cassette/store.go @@ -15,14 +15,14 @@ import ( "time" ) -// The on-disk layout mirrors internal/specstore: +// The on-disk layout mirrors internal/snapshot: // -// probe-evidence///-t/ +// recordings///-t/ // metadata.json // interactions/001-get-tags.json … NNN-*.json // -// Copied rather than generalised from specstore. Two callers do not justify an -// abstraction, specstore's doc comment is specifically about specifications, and the +// Copied rather than generalised from the snapshot store. Two callers do not justify an +// abstraction, the snapshot store's doc comment is specifically about specifications, and the // duplicated part is about 120 lines of directory handling -- against which the cost of a // shared abstraction is that neither caller can change its layout without considering the // other. @@ -41,9 +41,9 @@ const ( FactsFileName = "facts.json" // ReportFileName holds the run report. ReportFileName = "report.json" - // PlanFileName holds the probe plan the recording was made with. Absent for a read-only + // ScenarioFileName holds the probe scenario the recording was made with. Absent for a read-only // recording, which needs no plan. - PlanFileName = "plan.json" + ScenarioFileName = "scenario.json" // SubjectFileName holds the flattened subject the recording was made with. Absent // only for snapshots that predate freezing. SubjectFileName = "subject.json" @@ -58,7 +58,7 @@ var ErrNoSnapshot = errors.New("no cassette snapshot found") // ErrChecksumMismatch marks a snapshot whose interactions no longer match its metadata. var ErrChecksumMismatch = errors.New("cassette checksum does not match its metadata") -// dirPattern matches "-t", the same shape specstore uses. +// dirPattern matches "-t", the same shape the snapshot store uses. var dirPattern = regexp.MustCompile(`^(.+)-t(\d+)$`) // Snapshot is one recorded session on disk. @@ -80,7 +80,7 @@ type Snapshot struct { // // No timestamp field beyond the one in the directory name, and no tool version: the // directory is committed and diffed, so a value that changed without an input changing -// would make the drift check useless. Same rule as internal/blueprint and internal/emit. +// would make the drift check useless. Same rule as internal/blueprint and internal/generate. type Metadata struct { // Provider and Resource identify what was probed. Provider string `json:"provider"` @@ -141,14 +141,14 @@ func (s Snapshot) FactsPath() string { return filepath.Join(s.Dir, FactsFileName // ReportPath is the run report. func (s Snapshot) ReportPath() string { return filepath.Join(s.Dir, ReportFileName) } -// PlanPath is the frozen copy of the probe plan the recording was made with. +// ScenarioPath is the frozen copy of the probe plan the recording was made with. // // Frozen into the snapshot rather than read from the working tree at replay time, and the reason is // specific to the write tier. Facts are derived from the transcript, but *which requests exist in // the transcript* is a function of the plan: its fixtures are the request bodies. Editing a fixture // would then make replay fail with a body mismatch that looks exactly like a probe regression and // is nothing of the kind. -func (s Snapshot) PlanPath() string { return filepath.Join(s.Dir, PlanFileName) } +func (s Snapshot) ScenarioPath() string { return filepath.Join(s.Dir, ScenarioFileName) } // SubjectPath is the frozen copy of the flattened subject the recording was made with. // @@ -239,12 +239,12 @@ func Find(root, name string) (Snapshot, error) { return Snapshot{}, fmt.Errorf("%w: %s under %s", ErrNoSnapshot, name, root) } -// Write creates a snapshot directory and writes its interactions and metadata. +// Record creates a snapshot directory and writes its interactions and metadata. // // The fail-closed order is the important part: every interaction is scanned before // anything is written, and a finding writes nothing at all -- not a partial directory, // not a single file. So a leak cannot be committed; it can only fail the build. -func Write( +func Record( root string, meta Metadata, interactions []Interaction, @@ -259,7 +259,7 @@ func Write( } // Scan first, write second. Nothing below this point can leak. - var findings []Finding + var findings []Leak for _, i := range interactions { found, err := ScanInteraction(i, secrets) if err != nil { @@ -268,7 +268,7 @@ func Write( findings = append(findings, found...) } if len(findings) > 0 { - return Snapshot{}, FindingsError(findings) + return Snapshot{}, LeaksError(findings) } encoded := make(map[string][]byte, len(interactions)) diff --git a/internal/cassette/store_test.go b/internal/cassette/store_test.go index 833226f7..a241c6e3 100644 --- a/internal/cassette/store_test.go +++ b/internal/cassette/store_test.go @@ -40,12 +40,12 @@ func TestUnit_Cassette_WriteAndRead(t *testing.T) { root := t.TempDir() at := time.UnixMilli(1785152261691) - snap, err := Write(root, sampleMetadata(), sampleInteractions(), nil, at) + snap, err := Record(root, sampleMetadata(), sampleInteractions(), nil, at) if err != nil { t.Fatalf("Write: %v", err) } - // The directory name mirrors specstore's, so both stores read the same way. + // The directory name mirrors the snapshot store's, so both stores read the same way. if got := filepath.Base(snap.Dir); got != "7.0.97-t1785152261691" { t.Errorf("directory = %q, want 7.0.97-t1785152261691", got) } @@ -91,7 +91,7 @@ func TestUnit_Cassette_WriteAndRead(t *testing.T) { // identical bytes. Otherwise the drift gate fires on runs that changed nothing, and a gate // that cries wolf gets disabled. // -// Twenty-five iterations for the same reason internal/emit uses that many: map iteration +// Twenty-five iterations for the same reason internal/generate uses that many: map iteration // order is randomised per run, so a single comparison would pass by luck often enough to be // useless. func TestUnit_Cassette_WriteIsDeterministic(t *testing.T) { @@ -104,7 +104,7 @@ func TestUnit_Cassette_WriteIsDeterministic(t *testing.T) { for range 25 { root := t.TempDir() - snap, err := Write(root, sampleMetadata(), sampleInteractions(), nil, at) + snap, err := Record(root, sampleMetadata(), sampleInteractions(), nil, at) if err != nil { t.Fatalf("Write: %v", err) } @@ -172,11 +172,11 @@ func TestUnit_Cassette_KeyOrderProducesNoDiff(t *testing.T) { rootA, rootB := t.TempDir(), t.TempDir() - snapA, err := Write(rootA, sampleMetadata(), oneOrder, nil, at) + snapA, err := Record(rootA, sampleMetadata(), oneOrder, nil, at) if err != nil { t.Fatalf("Write: %v", err) } - snapB, err := Write(rootB, sampleMetadata(), otherOrder, nil, at) + snapB, err := Record(rootB, sampleMetadata(), otherOrder, nil, at) if err != nil { t.Fatalf("Write: %v", err) } @@ -195,7 +195,7 @@ func TestUnit_Cassette_VerifyDetectsTampering(t *testing.T) { root := t.TempDir() - snap, err := Write(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(1)) + snap, err := Record(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(1)) if err != nil { t.Fatalf("Write: %v", err) } @@ -245,7 +245,7 @@ func TestUnit_Cassette_LoadRejectsASequenceGap(t *testing.T) { {ID: "003-get-tags", Seq: 3, Request: Request{Method: "GET", Path: "/tags"}, Response: Response{Status: 200}}, } - snap, err := Write(root, sampleMetadata(), gapped, nil, time.UnixMilli(1)) + snap, err := Record(root, sampleMetadata(), gapped, nil, time.UnixMilli(1)) if err != nil { t.Fatalf("Write: %v", err) } @@ -260,11 +260,11 @@ func TestUnit_Cassette_ListLatestAndFind(t *testing.T) { root := t.TempDir() - older, err := Write(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(1000)) + older, err := Record(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(1000)) if err != nil { t.Fatalf("Write: %v", err) } - newer, err := Write(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(2000)) + newer, err := Record(root, sampleMetadata(), sampleInteractions(), nil, time.UnixMilli(2000)) if err != nil { t.Fatalf("Write: %v", err) } @@ -328,7 +328,7 @@ func TestUnit_Cassette_StoreEdgeCases(t *testing.T) { // Writing nothing is refused: an empty snapshot would satisfy Verify and support no // facts, which is a worse artefact than none. - if _, err := Write(t.TempDir(), sampleMetadata(), nil, nil, time.UnixMilli(1)); !errors.Is(err, ErrInvalidCassette) { + if _, err := Record(t.TempDir(), sampleMetadata(), nil, nil, time.UnixMilli(1)); !errors.Is(err, ErrInvalidCassette) { t.Errorf("error = %v, want ErrInvalidCassette", err) } @@ -337,7 +337,7 @@ func TestUnit_Cassette_StoreEdgeCases(t *testing.T) { meta := sampleMetadata() meta.APIVersion = "" - snap, err := Write(root, meta, sampleInteractions(), nil, time.UnixMilli(5)) + snap, err := Record(root, meta, sampleInteractions(), nil, time.UnixMilli(5)) if err != nil { t.Fatalf("Write: %v", err) } diff --git a/internal/cassette/transport.go b/internal/cassette/transport.go index 26497cd7..dd605ee4 100644 --- a/internal/cassette/transport.go +++ b/internal/cassette/transport.go @@ -49,7 +49,7 @@ type RecordingTransport struct { // findings accumulates redaction failures. A recording with any finding writes // nothing at all, so these are collected rather than returned per request: failing // the first request would leave the operator debugging one symptom at a time. - findings []Finding + findings []Leak } // NewRecordingTransport builds a recorder. @@ -149,7 +149,7 @@ func (t *RecordingTransport) record( // so the finding names the interaction it came from. findings, err := ScanInteraction(i, t.Secrets) if err != nil { - t.findings = append(t.findings, Finding{ + t.findings = append(t.findings, Leak{ Interaction: i.ID, Shape: "unserialisable", Pointer: err.Error(), @@ -184,7 +184,7 @@ func (t *RecordingTransport) Interactions() ([]Interaction, error) { defer t.mu.Unlock() if len(t.findings) > 0 { - return nil, FindingsError(t.findings) + return nil, LeaksError(t.findings) } out := make([]Interaction, len(t.interactions)) diff --git a/internal/fixturespec/fixturespec.go b/internal/fixturespec/fixturespec.go index b75d69e7..05490310 100644 --- a/internal/fixturespec/fixturespec.go +++ b/internal/fixturespec/fixturespec.go @@ -24,17 +24,17 @@ import ( type Source string const ( - // ObservedAccepted is a value the probe watched the API accept. - ObservedAccepted Source = "observed-accepted" - // ServerDefault is the value the API itself applied when the field was omitted. - ServerDefault Source = "server-default" - // Documented is a value the specification declares but nothing has exercised. - Documented Source = "documented" - // Synthesised is a value invented to be recognisable test debris. - Synthesised Source = "synthesised" - // Forced is the value the API substitutes whatever is sent. A fixture must carry + // SourceObservedAccepted is a value the probe watched the API accept. + SourceObservedAccepted Source = "observed-accepted" + // SourceServerDefault is the value the API itself applied when the field was omitted. + SourceServerDefault Source = "server-default" + // SourceDocumented is a value the specification declares but nothing has exercised. + SourceDocumented Source = "documented" + // SourceSynthesised is a value invented to be recognisable test debris. + SourceSynthesised Source = "synthesised" + // SourceForced is the value the API substitutes whatever is sent. A fixture must carry // it: any other value plans a change the apply cannot deliver. - Forced Source = "forced" + SourceForced Source = "forced" ) // Entry is one attribute's derived test value in wire-typed form, or the recorded @@ -122,7 +122,7 @@ func Derive(a blueprint.Attribute, salt string) Entry { return Entry{ Value: parseLiteral(fv.Raw), Verbatim: fv.Raw, - Source: Forced, + Source: SourceForced, Note: "the API forces this value, so no configured value can take effect", } } @@ -160,13 +160,13 @@ func Derive(a blueprint.Attribute, salt string) Entry { return stringEntry(a, salt) case blueprint.KindBool: - return Entry{Value: true, Source: Synthesised} + return Entry{Value: true, Source: SourceSynthesised} case blueprint.KindInt32, blueprint.KindInt64: - return Entry{Value: intWithinBounds(a.Type.Constraints), Source: Synthesised} + return Entry{Value: intWithinBounds(a.Type.Constraints), Source: SourceSynthesised} case blueprint.KindFloat32, blueprint.KindFloat64, blueprint.KindNumber: - return Entry{Value: floatWithinBounds(a.Type.Constraints), Source: Synthesised} + return Entry{Value: floatWithinBounds(a.Type.Constraints), Source: SourceSynthesised} case blueprint.KindList, blueprint.KindSet: return collectionEntry(a) @@ -194,11 +194,11 @@ func enumEntry(a blueprint.Attribute) (Entry, bool) { ) } - return Entry{Value: accepted[0], Source: ObservedAccepted, Note: note}, true + return Entry{Value: accepted[0], Source: SourceObservedAccepted, Note: note}, true } if allowed := a.Type.AllowedValues; len(allowed) > 0 { - return Entry{Value: allowed[0], Source: Documented, Note: "documented; unprobed"}, true + return Entry{Value: allowed[0], Source: SourceDocumented, Note: "documented; unprobed"}, true } return Entry{}, false @@ -240,7 +240,7 @@ func serverDefaultEntry(a blueprint.Attribute) (Entry, bool) { return Entry{ Value: parseLiteral(sd.Raw), Verbatim: sd.Raw, - Source: ServerDefault, + Source: SourceServerDefault, Note: "the API's own default, so a value it is known to accept", }, true } @@ -307,7 +307,7 @@ func stringEntry(a blueprint.Attribute, salt string) Entry { if v, ok := formatValue(c.Format); ok { return Entry{ Value: v, - Source: Synthesised, + Source: SourceSynthesised, Note: fmt.Sprintf("synthesised for the declared %s format", c.Format), } } @@ -347,7 +347,7 @@ func stringEntry(a blueprint.Attribute, salt string) Entry { value += strings.Repeat("x", int(*c.MinLength)-len(value)) } - return Entry{Value: value, Source: Synthesised} + return Entry{Value: value, Source: SourceSynthesised} } // collectionEntry derives a one-element list or set of scalars. @@ -371,7 +371,7 @@ func collectionEntry(a blueprint.Attribute) Entry { } } - return Entry{Value: []any{elem.Value}, Source: Synthesised} + return Entry{Value: []any{elem.Value}, Source: SourceSynthesised} } // mapEntry derives a one-entry map of scalars. @@ -392,7 +392,7 @@ func mapEntry(a blueprint.Attribute) Entry { } } - return Entry{Value: map[string]any{"tfacc": elem.Value}, Source: Synthesised} + return Entry{Value: map[string]any{"tfacc": elem.Value}, Source: SourceSynthesised} } // intWithinBounds picks an integer the declared range actually permits. diff --git a/internal/fixturespec/fixturespec_test.go b/internal/fixturespec/fixturespec_test.go index 75a1277a..9ad774c4 100644 --- a/internal/fixturespec/fixturespec_test.go +++ b/internal/fixturespec/fixturespec_test.go @@ -22,14 +22,14 @@ func TestUnit_Fixturespec_ObservedEvidenceBeatsDocumentation(t *testing.T) { a.Behaviour.RejectedValues = []string{"system"} e := Derive(a, "") - if e.Value != "user" || e.Source != ObservedAccepted { + if e.Value != "user" || e.Source != SourceObservedAccepted { t.Fatalf("want observed-accepted %q, got %+v", "user", e) } a.Behaviour.AcceptedValues = nil a.Behaviour.RejectedValues = nil e = Derive(a, "") - if e.Value != "system" || e.Source != Documented { + if e.Value != "system" || e.Source != SourceDocumented { t.Fatalf("want documented %q, got %+v", "system", e) } } @@ -57,7 +57,7 @@ func TestUnit_Fixturespec_AServerDefaultCarriesBothWireValueAndVerbatimLiteral(t if !reflect.DeepEqual(e.Value, c.want) { t.Fatalf("raw %s: want wire value %#v, got %#v", c.raw, c.want, e.Value) } - if e.Source != ServerDefault { + if e.Source != SourceServerDefault { t.Fatalf("raw %s: want source server-default, got %q", c.raw, e.Source) } } @@ -68,7 +68,7 @@ func TestUnit_Fixturespec_AnEmptyStringDefaultIsNeverAFixtureValue(t *testing.T) a.Behaviour.ServerDefault = &blueprint.Literal{Raw: `""`} e := Derive(a, "") - if e.Source == ServerDefault { + if e.Source == SourceServerDefault { t.Fatal("an empty-string default is indistinguishable from absence and must not be configured") } } diff --git a/internal/render/acctest.go b/internal/generate/acctest.go similarity index 99% rename from internal/render/acctest.go rename to internal/generate/acctest.go index 78a9dba5..8e67e7c6 100644 --- a/internal/render/acctest.go +++ b/internal/generate/acctest.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/acctest_action.go b/internal/generate/acctest_action.go similarity index 96% rename from internal/render/acctest_action.go rename to internal/generate/acctest_action.go index 75623f4d..ee417d3a 100644 --- a/internal/render/acctest_action.go +++ b/internal/generate/acctest_action.go @@ -1,10 +1,11 @@ -package render +package generate import ( "fmt" "strings" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" ) // ActionAccTestView is what the action acceptance test template needs. @@ -79,10 +80,9 @@ func ActionAccTest( actionType := bp.Provider.TerraformType(a.Name) v := ActionAccTestView{ - Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), - Package: a.GoPackage + "_test", - TestName: fmt.Sprintf( - "TestAccAction%s_01_Invoke", trimActionSuffix(a.GoTypeName)), + Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), + Package: a.GoPackage + "_test", + TestName: naming.AccTestName("Action", trimActionSuffix(a.GoTypeName), 1, "Invoke"), ActionType: actionType, } diff --git a/internal/render/acctest_case.go b/internal/generate/acctest_case.go similarity index 97% rename from internal/render/acctest_case.go rename to internal/generate/acctest_case.go index 510a28bd..1349a75d 100644 --- a/internal/render/acctest_case.go +++ b/internal/generate/acctest_case.go @@ -1,4 +1,4 @@ -package render +package generate import ( "errors" @@ -7,6 +7,7 @@ import ( "time" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" ) // The packages a generated acceptance test needs. @@ -125,12 +126,9 @@ func AccTest(bp blueprint.Blueprint, r blueprint.Resource, opts Options) (AccTes patterns := newPatternVars() v := AccTestView{ - Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), - Package: r.GoPackage + "_test", - TestName: fmt.Sprintf( - "TestAccResource%s_01_Lifecycle", - trimResourceSuffix(r.GoTypeName), - ), + Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), + Package: r.GoPackage + "_test", + TestName: naming.AccTestName("Resource", trimResourceSuffix(r.GoTypeName), 1, "Lifecycle"), Address: tfType + "." + fixtureLabel, TerraformType: tfType, TestResourceType: r.GoPackage + "." + testResourceTypeName(r.GoTypeName), diff --git a/internal/render/acctest_case_test.go b/internal/generate/acctest_case_test.go similarity index 99% rename from internal/render/acctest_case_test.go rename to internal/generate/acctest_case_test.go index c4cd047e..26141d18 100644 --- a/internal/render/acctest_case_test.go +++ b/internal/generate/acctest_case_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/acctest_datasource.go b/internal/generate/acctest_datasource.go similarity index 96% rename from internal/render/acctest_datasource.go rename to internal/generate/acctest_datasource.go index f83a3d55..33fa6f4e 100644 --- a/internal/render/acctest_datasource.go +++ b/internal/generate/acctest_datasource.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" @@ -6,6 +6,7 @@ import ( "strings" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" ) // DataSourceAccTestView is what the data source acceptance test template needs. @@ -95,10 +96,9 @@ func DataSourceAccTest( seedType := bp.Provider.TerraformType(seed.Name) v := DataSourceAccTestView{ - Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), - Package: d.GoPackage + "_test", - TestName: fmt.Sprintf( - "TestAccDataSource%s_01_Read", trimDataSourceSuffix(d.GoTypeName)), + Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), + Package: d.GoPackage + "_test", + TestName: naming.AccTestName("DataSource", trimDataSourceSuffix(d.GoTypeName), 1, "Read"), Address: "data." + dsType + "." + fixtureLabel, SeedAddress: seedType + "." + fixtureLabel, SeedTerraformType: seedType, diff --git a/internal/render/acctest_ephemeral.go b/internal/generate/acctest_ephemeral.go similarity index 95% rename from internal/render/acctest_ephemeral.go rename to internal/generate/acctest_ephemeral.go index 52742734..91c63bd7 100644 --- a/internal/render/acctest_ephemeral.go +++ b/internal/generate/acctest_ephemeral.go @@ -1,10 +1,11 @@ -package render +package generate import ( "fmt" "sort" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" ) // EphemeralAccTestView is what the ephemeral acceptance test template needs. @@ -86,10 +87,9 @@ func EphemeralAccTest( seedType := bp.Provider.TerraformType(seed.Name) v := EphemeralAccTestView{ - Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), - Package: e.GoPackage + "_test", - TestName: fmt.Sprintf( - "TestAccEphemeral%s_01_Open", trimEphemeralSuffix(e.GoTypeName)), + Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), + Package: e.GoPackage + "_test", + TestName: naming.AccTestName("Ephemeral", trimEphemeralSuffix(e.GoTypeName), 1, "Open"), EchoAddress: "echo.test", SeedAddress: seedType + "." + fixtureLabel, SeedTerraformType: seedType, diff --git a/internal/render/acctest_list.go b/internal/generate/acctest_list.go similarity index 89% rename from internal/render/acctest_list.go rename to internal/generate/acctest_list.go index f8bf2c26..8d8a4454 100644 --- a/internal/render/acctest_list.go +++ b/internal/generate/acctest_list.go @@ -1,9 +1,10 @@ -package render +package generate import ( "fmt" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" ) // ListAccTestView is what the list acceptance test template needs. @@ -57,10 +58,9 @@ func ListAccTest( tfType := bp.Provider.TerraformType(r.Name) v := ListAccTestView{ - Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), - Package: r.GoPackage + "_test", - TestName: fmt.Sprintf( - "TestAccList%s_01_Query", trimResourceSuffix(r.GoTypeName)), + Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), + Package: r.GoPackage + "_test", + TestName: naming.AccTestName("List", trimResourceSuffix(r.GoTypeName), 1, "Query"), TerraformType: tfType, QueryAddress: tfType + "." + fixtureLabel, } diff --git a/internal/render/acctest_readonly_test.go b/internal/generate/acctest_readonly_test.go similarity index 99% rename from internal/render/acctest_readonly_test.go rename to internal/generate/acctest_readonly_test.go index feecf5ec..49e380dd 100644 --- a/internal/render/acctest_readonly_test.go +++ b/internal/generate/acctest_readonly_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/action.go b/internal/generate/action.go similarity index 98% rename from internal/render/action.go rename to internal/generate/action.go index 3b840b55..20da28d5 100644 --- a/internal/render/action.go +++ b/internal/generate/action.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" @@ -175,7 +175,7 @@ func Action(bp blueprint.Blueprint, a blueprint.Action, opts Options) (ActionVie // actionScope names an action for the error messages attribute rendering produces. func actionScope(a blueprint.Action) schemaScope { return schemaScope{ - kind: blueprint.BlockAction, + kind: blueprint.BlockKindAction, what: fmt.Sprintf("action %q", a.Key), patterns: newPatternVars(), } diff --git a/internal/render/conditional.go b/internal/generate/conditional.go similarity index 99% rename from internal/render/conditional.go rename to internal/generate/conditional.go index cba4c421..6b23ba5a 100644 --- a/internal/render/conditional.go +++ b/internal/generate/conditional.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/constraints_test.go b/internal/generate/constraints_test.go similarity index 99% rename from internal/render/constraints_test.go rename to internal/generate/constraints_test.go index ce2048ae..6fcc9c55 100644 --- a/internal/render/constraints_test.go +++ b/internal/generate/constraints_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/coverage_test.go b/internal/generate/coverage_test.go similarity index 98% rename from internal/render/coverage_test.go rename to internal/generate/coverage_test.go index 524003ab..ce7398c0 100644 --- a/internal/render/coverage_test.go +++ b/internal/generate/coverage_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" @@ -231,7 +231,7 @@ func TestUnit_Render_DataSourcePackagePath(t *testing.T) { ServiceGroup: "agents", APIVersionDir: "v7", }} - v := Registration(bp, KindDataSources, Options{}) + v := Registration(bp, RegistryKindDataSources, Options{}) if len(v.Entries) != 1 || !strings.HasPrefix(v.Entries[0], "v7Agent.") { t.Fatalf("entries = %v", v.Entries) diff --git a/internal/render/datasource.go b/internal/generate/datasource.go similarity index 99% rename from internal/render/datasource.go rename to internal/generate/datasource.go index 1a2f6809..493d4832 100644 --- a/internal/render/datasource.go +++ b/internal/generate/datasource.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/datasource_test.go b/internal/generate/datasource_test.go similarity index 99% rename from internal/render/datasource_test.go rename to internal/generate/datasource_test.go index 5df1a237..753f2c76 100644 --- a/internal/render/datasource_test.go +++ b/internal/generate/datasource_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/depth_test.go b/internal/generate/depth_test.go similarity index 99% rename from internal/render/depth_test.go rename to internal/generate/depth_test.go index 17bb7674..d8cec1f8 100644 --- a/internal/render/depth_test.go +++ b/internal/generate/depth_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/ephemeral.go b/internal/generate/ephemeral.go similarity index 99% rename from internal/render/ephemeral.go rename to internal/generate/ephemeral.go index 3ff3730c..2bf6ebe9 100644 --- a/internal/render/ephemeral.go +++ b/internal/generate/ephemeral.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" @@ -179,7 +179,7 @@ func Ephemeral( // ephemeralScope names an ephemeral for the error messages attribute rendering produces. func ephemeralScope(e blueprint.Ephemeral) schemaScope { return schemaScope{ - kind: blueprint.BlockEphemeral, + kind: blueprint.BlockKindEphemeral, what: fmt.Sprintf("ephemeral %q", e.Key), patterns: newPatternVars(), } diff --git a/internal/render/ephemeral_test.go b/internal/generate/ephemeral_test.go similarity index 99% rename from internal/render/ephemeral_test.go rename to internal/generate/ephemeral_test.go index b281db6d..25cee0c8 100644 --- a/internal/render/ephemeral_test.go +++ b/internal/generate/ephemeral_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/examples.go b/internal/generate/examples.go similarity index 99% rename from internal/render/examples.go rename to internal/generate/examples.go index a68d3bd2..5cbec8e3 100644 --- a/internal/render/examples.go +++ b/internal/generate/examples.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/fixture.go b/internal/generate/fixture.go similarity index 99% rename from internal/render/fixture.go rename to internal/generate/fixture.go index 52be51f4..4009e9fe 100644 --- a/internal/render/fixture.go +++ b/internal/generate/fixture.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/fixture_test.go b/internal/generate/fixture_test.go similarity index 99% rename from internal/render/fixture_test.go rename to internal/generate/fixture_test.go index b50ac9a9..1f21c420 100644 --- a/internal/render/fixture_test.go +++ b/internal/generate/fixture_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/emit/emit.go b/internal/generate/generate.go similarity index 90% rename from internal/emit/emit.go rename to internal/generate/generate.go index 8cf2b6f0..bbb71364 100644 --- a/internal/emit/emit.go +++ b/internal/generate/generate.go @@ -5,7 +5,7 @@ // and does not show up as drift the first time anyone opens it; refusing to // overwrite a file it does not own; and producing a plan that can be inspected // without writing anything. -package emit +package generate import ( "bytes" @@ -22,7 +22,6 @@ import ( "mvdan.cc/gofumpt/format" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/render" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/templates" ) @@ -68,11 +67,11 @@ func (f File) SHA256() string { return hex.EncodeToString(sum[:]) } -// Plan is the full set of files a blueprint produces. +// Fileset is the full set of files a blueprint produces. // // Building a plan touches nothing on disk. Writing is a separate step, so // -dry-run is the same code path as a real run rather than an approximation of it. -type Plan struct { +type Fileset struct { Files []File } @@ -90,8 +89,8 @@ func New() (*Generator, error) { return &Generator{tmpl: tmpl}, nil } -// Options configures a generation run. -type Options struct { +// BuildOptions configures a generation run. +type BuildOptions struct { // BlueprintPath is recorded in each file's generated header. BlueprintPath string // Only, when non-empty, restricts generation to one resource key. It exists @@ -100,15 +99,15 @@ type Options struct { } // Build renders every file the blueprint produces, without writing anything. -func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { +func (g *Generator) Build(bp blueprint.Blueprint, opts BuildOptions) (Fileset, error) { digest := blueprintDigest(bp) - ropts := render.Options{ + ropts := Options{ BlueprintPath: opts.BlueprintPath, BlueprintSHA256: digest, } - var plan Plan + var plan Fileset for _, r := range bp.Resources { if r.Drop || (opts.Only != "" && r.Key != opts.Only) { @@ -117,7 +116,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { files, err := g.resourceFiles(bp, r, ropts) if err != nil { - return Plan{}, fmt.Errorf("resource %q: %w", r.Key, err) + return Fileset{}, fmt.Errorf("resource %q: %w", r.Key, err) } plan.Files = append(plan.Files, files...) } @@ -129,7 +128,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { files, err := g.dataSourceFiles(bp, d, ropts) if err != nil { - return Plan{}, fmt.Errorf("data source %q: %w", d.Key, err) + return Fileset{}, fmt.Errorf("data source %q: %w", d.Key, err) } plan.Files = append(plan.Files, files...) } @@ -141,7 +140,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { files, err := g.actionFiles(bp, a, ropts) if err != nil { - return Plan{}, fmt.Errorf("action %q: %w", a.Key, err) + return Fileset{}, fmt.Errorf("action %q: %w", a.Key, err) } plan.Files = append(plan.Files, files...) } @@ -153,7 +152,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { files, err := g.ephemeralFiles(bp, e, ropts) if err != nil { - return Plan{}, fmt.Errorf("ephemeral %q: %w", e.Key, err) + return Fileset{}, fmt.Errorf("ephemeral %q: %w", e.Key, err) } plan.Files = append(plan.Files, files...) } @@ -164,7 +163,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { if opts.Only == "" { examples, err := g.exampleFiles(bp, ropts) if err != nil { - return Plan{}, err + return Fileset{}, err } plan.Files = append(plan.Files, examples...) } @@ -175,7 +174,7 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { if opts.Only == "" { regs, err := g.registrationFiles(bp, ropts) if err != nil { - return Plan{}, err + return Fileset{}, err } plan.Files = append(plan.Files, regs...) } @@ -189,14 +188,14 @@ func (g *Generator) Build(bp blueprint.Blueprint, opts Options) (Plan, error) { func (g *Generator) resourceFiles( bp blueprint.Blueprint, r blueprint.Resource, - ropts render.Options, + ropts Options, ) ([]File, error) { - view, err := render.Resource(bp, r, ropts) + view, err := Resource(bp, r, ropts) if err != nil { return nil, fmt.Errorf("building the render view: %w", err) } - dir := render.ResourceDir(bp, r) + dir := ResourceDir(bp, r) // Each entry is (output file, template). A template whose driving data is // absent is skipped rather than emitted empty. @@ -254,7 +253,7 @@ func (g *Generator) resourceFiles( // The requiredWhen support type, emitted exactly when resource.go references it -- // both derive from the same rule set, so they cannot disagree. - if cv, ok := render.ConditionalValidatorFile(r, ropts); ok { + if cv, ok := ConditionalValidatorFile(r, ropts); ok { content, err := g.renderFile("conditional_validators.go.tmpl", cv) if err != nil { return nil, fmt.Errorf("conditional_validators.go: %w", err) @@ -286,12 +285,12 @@ func (g *Generator) resourceFiles( func (g *Generator) acceptanceFiles( bp blueprint.Blueprint, r blueprint.Resource, - ropts render.Options, + ropts Options, dir string, ) ([]File, error) { var out []File - helper, err := render.TestHelper(bp, r, ropts) + helper, err := TestHelper(bp, r, ropts) if err != nil { if unsupported(err) { return nil, nil @@ -306,7 +305,7 @@ func (g *Generator) acceptanceFiles( } out = append(out, File{Path: filepath.Join(dir, "test_helper_test.go"), Content: content}) - acc, err := render.AccTest(bp, r, ropts) + acc, err := AccTest(bp, r, ropts) switch { case err == nil: body, rErr := g.renderFile("resource_acceptance_test.go.tmpl", acc) @@ -321,7 +320,7 @@ func (g *Generator) acceptanceFiles( // The list facet's query test leans on the resource test's declarations -- // address, testResource, config() -- so it exists exactly when that file does. if r.List != nil { - listAcc, query, lErr := render.ListAccTest(bp, r, ropts) + listAcc, query, lErr := ListAccTest(bp, r, ropts) if lErr != nil { return nil, fmt.Errorf("list acceptance test: %w", lErr) } @@ -359,7 +358,7 @@ func (g *Generator) acceptanceFiles( } for _, f := range fixtures { - view, vErr := render.Fixture(bp, r, ropts, f.minimal) + view, vErr := Fixture(bp, r, ropts, f.minimal) if vErr != nil { if unsupported(vErr) { continue @@ -382,7 +381,7 @@ func (g *Generator) acceptanceFiles( // The replace fixture exists exactly when the acceptance test has a replace step; // both derive from the same candidate, so they cannot disagree about whether to run. - replace, ok, rErr := render.ReplaceFixture(bp, r, ropts) + replace, ok, rErr := ReplaceFixture(bp, r, ropts) switch { case rErr != nil && !unsupported(rErr): return nil, fmt.Errorf("replace.tf: %w", rErr) @@ -399,7 +398,7 @@ func (g *Generator) acceptanceFiles( // unsupported reports whether an error is a stated refusal rather than a fault. func unsupported(err error) bool { - var u *render.ErrUnsupported + var u *ErrUnsupported return errors.As(err, &u) } @@ -412,14 +411,14 @@ func unsupported(err error) bool { func (g *Generator) dataSourceFiles( bp blueprint.Blueprint, d blueprint.DataSource, - ropts render.Options, + ropts Options, ) ([]File, error) { - view, err := render.DataSource(bp, d, ropts) + view, err := DataSource(bp, d, ropts) if err != nil { return nil, fmt.Errorf("building the render view: %w", err) } - dir := render.DataSourceDir(bp, d) + dir := DataSourceDir(bp, d) wanted := []struct { name, tmpl string @@ -446,7 +445,7 @@ func (g *Generator) dataSourceFiles( // The acceptance test, when the blueprint declares a seed for it. A refusal is a // stated one -- no seed, no test -- surfaced by `emit -v`, and the data source is // still emitted; see acceptanceFiles for the reasoning. - acc, fixture, accErr := render.DataSourceAccTest(bp, d, ropts) + acc, fixture, accErr := DataSourceAccTest(bp, d, ropts) switch { case accErr == nil: body, rErr := g.renderFile("datasource_acceptance_test.go.tmpl", acc) @@ -469,7 +468,7 @@ func (g *Generator) dataSourceFiles( // The seed's existence helper, re-emitted into this package: the seed's own // copy is a _test.go file no other package can import. - helper, hErr := render.SeedHelper(bp, d, ropts) + helper, hErr := SeedHelper(bp, d, ropts) if hErr != nil { return nil, fmt.Errorf("seed helper: %w", hErr) } @@ -496,14 +495,14 @@ func (g *Generator) dataSourceFiles( func (g *Generator) actionFiles( bp blueprint.Blueprint, a blueprint.Action, - ropts render.Options, + ropts Options, ) ([]File, error) { - view, err := render.Action(bp, a, ropts) + view, err := Action(bp, a, ropts) if err != nil { return nil, fmt.Errorf("building the render view: %w", err) } - dir := render.ActionDir(bp, a) + dir := ActionDir(bp, a) wanted := []struct{ name, tmpl string }{ {"action.go", "action.go.tmpl"}, @@ -522,7 +521,7 @@ func (g *Generator) actionFiles( // The acceptance test, when the blueprint declares how to run one. No accTest is a // stated refusal, surfaced by `emit -v`, and the action is still emitted. - acc, fixture, accErr := render.ActionAccTest(bp, a, ropts) + acc, fixture, accErr := ActionAccTest(bp, a, ropts) switch { case accErr == nil: body, rErr := g.renderFile("action_acceptance_test.go.tmpl", acc) @@ -557,14 +556,14 @@ func (g *Generator) actionFiles( func (g *Generator) ephemeralFiles( bp blueprint.Blueprint, e blueprint.Ephemeral, - ropts render.Options, + ropts Options, ) ([]File, error) { - view, err := render.Ephemeral(bp, e, ropts) + view, err := Ephemeral(bp, e, ropts) if err != nil { return nil, fmt.Errorf("building the render view: %w", err) } - dir := render.EphemeralDir(bp, e) + dir := EphemeralDir(bp, e) wanted := []struct { name, tmpl string @@ -590,7 +589,7 @@ func (g *Generator) ephemeralFiles( // The acceptance test, when the blueprint declares a seed for it; a stated refusal // otherwise, and the ephemeral is still emitted. - acc, fixture, accErr := render.EphemeralAccTest(bp, e, ropts) + acc, fixture, accErr := EphemeralAccTest(bp, e, ropts) switch { case accErr == nil: body, rErr := g.renderFile("ephemeral_acceptance_test.go.tmpl", acc) @@ -611,7 +610,7 @@ func (g *Generator) ephemeralFiles( Content: fx, }) - helper, hErr := render.EphemeralSeedHelper(bp, e, ropts) + helper, hErr := EphemeralSeedHelper(bp, e, ropts) if hErr != nil { return nil, fmt.Errorf("seed helper: %w", hErr) } @@ -633,7 +632,7 @@ func (g *Generator) ephemeralFiles( // exampleFiles renders the examples/ tree tfplugindocs copies into registry docs. func (g *Generator) exampleFiles( bp blueprint.Blueprint, - ropts render.Options, + ropts Options, ) ([]File, error) { var out []File @@ -649,7 +648,7 @@ func (g *Generator) exampleFiles( if err := scaffold( "examples/provider/provider.tf", "example_provider.tf.tmpl", - render.ProviderExample(bp), + ProviderExample(bp), ); err != nil { return nil, err } @@ -659,7 +658,7 @@ func (g *Generator) exampleFiles( continue } - view, err := render.ResourceExample(bp, r) + view, err := ResourceExample(bp, r) if err != nil { if unsupported(err) { continue @@ -675,7 +674,7 @@ func (g *Generator) exampleFiles( return nil, err } - if imp, ok := render.ImportExample(r); ok { + if imp, ok := ImportExample(r); ok { if err := scaffold( filepath.Join(dir, "import.sh"), "example_import.sh.tmpl", imp, ); err != nil { @@ -688,7 +687,7 @@ func (g *Generator) exampleFiles( if d.Drop { continue } - view := render.DataSourceExample(bp, d) + view := DataSourceExample(bp, d) if err := scaffold( filepath.Join("examples", "data-sources", view.TerraformType, "data-source.tf"), "example_datasource.tf.tmpl", view, @@ -701,7 +700,7 @@ func (g *Generator) exampleFiles( if e.Drop { continue } - view := render.EphemeralExample(bp, e) + view := EphemeralExample(bp, e) if err := scaffold( filepath.Join("examples", "ephemeral-resources", view.TerraformType, "ephemeral-resource.tf"), "example_ephemeral.tf.tmpl", view, @@ -715,24 +714,24 @@ func (g *Generator) exampleFiles( func (g *Generator) registrationFiles( bp blueprint.Blueprint, - ropts render.Options, + ropts Options, ) ([]File, error) { - dir := render.ProviderDir(bp) + dir := ProviderDir(bp) specs := []struct { name, tmpl string - kind render.Kind + kind RegistryKind }{ - {"resources.go", "provider_resources.go.tmpl", render.KindResources}, - {"datasources.go", "provider_datasources.go.tmpl", render.KindDataSources}, - {"list_resources.go", "provider_list_resources.go.tmpl", render.KindListResources}, - {"actions.go", "provider_actions.go.tmpl", render.KindActions}, - {"ephemerals.go", "provider_ephemerals.go.tmpl", render.KindEphemerals}, + {"resources.go", "provider_resources.go.tmpl", RegistryKindResources}, + {"datasources.go", "provider_datasources.go.tmpl", RegistryKindDataSources}, + {"list_resources.go", "provider_list_resources.go.tmpl", RegistryKindListResources}, + {"actions.go", "provider_actions.go.tmpl", RegistryKindActions}, + {"ephemerals.go", "provider_ephemerals.go.tmpl", RegistryKindEphemerals}, } out := make([]File, 0, len(specs)) for _, s := range specs { - view := render.Registration(bp, s.kind, ropts) + view := Registration(bp, s.kind, ropts) content, err := g.renderFile(s.tmpl, view) if err != nil { @@ -838,7 +837,7 @@ type WriteResult struct { // A file whose content is already identical is left alone and reported as // unchanged, so that regenerating does not churn modification times and a // file-watcher does not rebuild the world on a no-op run. -func Write(plan Plan, opts WriteOptions) (WriteResult, error) { +func Write(plan Fileset, opts WriteOptions) (WriteResult, error) { var res WriteResult for _, f := range plan.Files { diff --git a/internal/emit/coverage_test.go b/internal/generate/generate_coverage_test.go similarity index 81% rename from internal/emit/coverage_test.go rename to internal/generate/generate_coverage_test.go index d232d348..b4158c47 100644 --- a/internal/emit/coverage_test.go +++ b/internal/generate/generate_coverage_test.go @@ -1,4 +1,4 @@ -package emit +package generate import ( "os" @@ -7,7 +7,7 @@ import ( "testing" ) -func TestUnit_Emit_FileSHA256(t *testing.T) { +func TestUnit_Generate_FileSHA256(t *testing.T) { t.Parallel() a := File{Path: "a.go", Content: []byte("package a\n")} @@ -27,9 +27,9 @@ func TestUnit_Emit_FileSHA256(t *testing.T) { } } -// TestUnit_Emit_WriteReportsUnreadableTargets covers the path where the target +// TestUnit_Generate_WriteReportsUnreadableTargets covers the path where the target // exists but cannot be inspected, which must fail rather than overwrite blindly. -func TestUnit_Emit_WriteReportsUnreadableTargets(t *testing.T) { +func TestUnit_Generate_WriteReportsUnreadableTargets(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -38,7 +38,7 @@ func TestUnit_Emit_WriteReportsUnreadableTargets(t *testing.T) { if err != nil { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "b"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "b"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -58,7 +58,7 @@ func TestUnit_Emit_WriteReportsUnreadableTargets(t *testing.T) { } } -func TestUnit_Emit_RenderFileRejectsAnUnknownTemplate(t *testing.T) { +func TestUnit_Generate_RenderFileRejectsAnUnknownTemplate(t *testing.T) { t.Parallel() gen, err := New() @@ -71,7 +71,7 @@ func TestUnit_Emit_RenderFileRejectsAnUnknownTemplate(t *testing.T) { } } -func TestUnit_Emit_NumberLines(t *testing.T) { +func TestUnit_Generate_NumberLines(t *testing.T) { t.Parallel() got := numberLines([]byte("one\ntwo")) diff --git a/internal/emit/emit_test.go b/internal/generate/generate_test.go similarity index 83% rename from internal/emit/emit_test.go rename to internal/generate/generate_test.go index d4dcd146..c5b1599b 100644 --- a/internal/emit/emit_test.go +++ b/internal/generate/generate_test.go @@ -1,4 +1,4 @@ -package emit +package generate import ( "errors" @@ -25,12 +25,12 @@ func pilotBlueprint(t *testing.T) blueprint.Blueprint { return bp } -// TestUnit_Emit_LangVersionIsAccepted pins the gofumpt language version. +// TestUnit_Generate_LangVersionIsAccepted pins the gofumpt language version. // // gofumpt parses it with go/version and *panics* on a value it cannot read, so a // plain "1.25" crashes the generator rather than returning an error. This is the // cheapest possible guard against that, and it has already caught it once. -func TestUnit_Emit_LangVersionIsAccepted(t *testing.T) { +func TestUnit_Generate_LangVersionIsAccepted(t *testing.T) { t.Parallel() defer func() { @@ -44,13 +44,13 @@ func TestUnit_Emit_LangVersionIsAccepted(t *testing.T) { } } -// TestUnit_Emit_IsDeterministic is the property the whole drift gate rests on. +// TestUnit_Generate_IsDeterministic is the property the whole drift gate rests on. // // Anything non-deterministic in emitted output -- a timestamp, a tool version, an // absolute path, Go map iteration order -- makes `verify` fail on a run that // changed nothing, which destroys its usefulness entirely. Map iteration order is // the one that bites in practice, because it is invisible until it isn't. -func TestUnit_Emit_IsDeterministic(t *testing.T) { +func TestUnit_Generate_IsDeterministic(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -60,7 +60,7 @@ func TestUnit_Emit_IsDeterministic(t *testing.T) { t.Fatalf("New: %v", err) } - first, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + first, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -68,7 +68,7 @@ func TestUnit_Emit_IsDeterministic(t *testing.T) { // Repeated rather than run twice: map iteration order varies per iteration, // so two runs can agree by luck. for i := 0; i < 25; i++ { - again, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + again, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -89,10 +89,10 @@ func TestUnit_Emit_IsDeterministic(t *testing.T) { } } -// TestUnit_Emit_CarriesNoTimestampOrVersion guards the two values most likely to +// TestUnit_Generate_CarriesNoTimestampOrVersion guards the two values most likely to // be added later by someone trying to be helpful. Either would make every // regeneration a diff. -func TestUnit_Emit_CarriesNoTimestampOrVersion(t *testing.T) { +func TestUnit_Generate_CarriesNoTimestampOrVersion(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -102,14 +102,14 @@ func TestUnit_Emit_CarriesNoTimestampOrVersion(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } - // Year prefixes catch a date in any common format; "tfpluginframeworkgen v" catches a + // Year prefixes catch a date in any common format; "tfpfgen v" catches a // version stamp. - forbidden := []string{"202", "generated at", "tfpluginframeworkgen v", os.TempDir()} + forbidden := []string{"202", "generated at", "tfpfgen v", os.TempDir()} for _, f := range plan.Files { // The header names the blueprint and its digest, which is intended. Only @@ -127,10 +127,10 @@ func TestUnit_Emit_CarriesNoTimestampOrVersion(t *testing.T) { } } -// TestUnit_Emit_EveryFileIsMarkedGenerated matters because overwrite protection +// TestUnit_Generate_EveryFileIsMarkedGenerated matters because overwrite protection // keys on the marker: a generated file lacking it could never be regenerated // without -force. -func TestUnit_Emit_EveryFileIsMarkedGenerated(t *testing.T) { +func TestUnit_Generate_EveryFileIsMarkedGenerated(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -140,7 +140,7 @@ func TestUnit_Emit_EveryFileIsMarkedGenerated(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -151,7 +151,7 @@ func TestUnit_Emit_EveryFileIsMarkedGenerated(t *testing.T) { for _, f := range plan.Files { // A scaffold is deliberately unmarked -- the marker is what the drift check and the // overwrite refusal key on, and a file the practitioner owns must be policed by - // neither. TestUnit_Emit_AScaffoldCarriesNoGeneratedMarker asserts the converse. + // neither. TestUnit_Generate_AScaffoldCarriesNoGeneratedMarker asserts the converse. if f.Scaffold { continue } @@ -179,9 +179,9 @@ func TestUnit_Emit_EveryFileIsMarkedGenerated(t *testing.T) { } } -// TestUnit_Emit_RefusesToOverwriteHandWrittenFiles is the guard that stops a +// TestUnit_Generate_RefusesToOverwriteHandWrittenFiles is the guard that stops a // mistyped -out from destroying somebody's work with no way to recover it. -func TestUnit_Emit_RefusesToOverwriteHandWrittenFiles(t *testing.T) { +func TestUnit_Generate_RefusesToOverwriteHandWrittenFiles(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -191,7 +191,7 @@ func TestUnit_Emit_RefusesToOverwriteHandWrittenFiles(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -220,10 +220,10 @@ func TestUnit_Emit_RefusesToOverwriteHandWrittenFiles(t *testing.T) { } } -// TestUnit_Emit_WriteIsIdempotent confirms a second write reports everything as +// TestUnit_Generate_WriteIsIdempotent confirms a second write reports everything as // unchanged rather than rewriting it, so regenerating does not churn modification // times and set file watchers rebuilding the world on a no-op. -func TestUnit_Emit_WriteIsIdempotent(t *testing.T) { +func TestUnit_Generate_WriteIsIdempotent(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -233,7 +233,7 @@ func TestUnit_Emit_WriteIsIdempotent(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -268,9 +268,9 @@ func TestUnit_Emit_WriteIsIdempotent(t *testing.T) { } } -// TestUnit_Emit_OnlyRestrictsToOneResource covers the flag used while iterating on +// TestUnit_Generate_OnlyRestrictsToOneResource covers the flag used while iterating on // a template. -func TestUnit_Emit_OnlyRestrictsToOneResource(t *testing.T) { +func TestUnit_Generate_OnlyRestrictsToOneResource(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -280,7 +280,7 @@ func TestUnit_Emit_OnlyRestrictsToOneResource(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "b", Only: "tag"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "b", Only: "tag"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -293,15 +293,15 @@ func TestUnit_Emit_OnlyRestrictsToOneResource(t *testing.T) { } } - if _, err := gen.Build(bp, Options{BlueprintPath: "b", Only: "nonexistent"}); err != nil { + if _, err := gen.Build(bp, BuildOptions{BlueprintPath: "b", Only: "nonexistent"}); err != nil { t.Fatalf("Build with an unmatched -only should succeed and produce nothing: %v", err) } } -// TestUnit_Emit_FormatErrorIncludesNumberedSource exists because a template bug +// TestUnit_Generate_FormatErrorIncludesNumberedSource exists because a template bug // reports a line and column, and matching that against unnumbered output is // needless work. This diagnostic already paid for itself once. -func TestUnit_Emit_FormatErrorIncludesNumberedSource(t *testing.T) { +func TestUnit_Generate_FormatErrorIncludesNumberedSource(t *testing.T) { t.Parallel() _, err := formatGo([]byte("package p\nfunc broken( {\n")) @@ -328,10 +328,10 @@ func withoutProvenance(content []byte) string { return strings.Join(kept, "\n") } -// TestUnit_Emit_AllowedValuesBecomeAValidator is the inverse of the test that used to be +// TestUnit_Generate_AllowedValuesBecomeAValidator is the inverse of the test that used to be // here. // -// TestUnit_Emit_EnumValuesDoNotReachGeneratedCode asserted that AttrType.Enum reached no +// TestUnit_Generate_EnumValuesDoNotReachGeneratedCode asserted that AttrType.Enum reached no // generated code at all, on the reasoning that a validator built from a scraped set rejects // configurations the API would have accepted. The reasoning was half right, and which half // depends on *which* set is used. @@ -341,7 +341,7 @@ func withoutProvenance(content []byte) string { // carrying the API's own message. Built from the observed accepted set it would err toward // blocking, which is the harm the old test was guarding against. So the validator is now // generated, from AllowedValues, and this asserts both halves of that. -func TestUnit_Emit_AllowedValuesBecomeAValidator(t *testing.T) { +func TestUnit_Generate_AllowedValuesBecomeAValidator(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -351,7 +351,7 @@ func TestUnit_Emit_AllowedValuesBecomeAValidator(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -402,13 +402,13 @@ func TestUnit_Emit_AllowedValuesBecomeAValidator(t *testing.T) { } } -// TestUnit_Emit_ASplitUpdateBodyGetsItsOwnConstructFunction. +// TestUnit_Generate_ASplitUpdateBodyGetsItsOwnConstructFunction. // // An SDK that gives update its own request type needs a second construct function over // the same assignment list, and the generated update must call it -- calling // constructResource there would send create's type to a method that takes update's, // which does not compile in someone else's provider. -func TestUnit_Emit_ASplitUpdateBodyGetsItsOwnConstructFunction(t *testing.T) { +func TestUnit_Generate_ASplitUpdateBodyGetsItsOwnConstructFunction(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -425,7 +425,7 @@ func TestUnit_Emit_ASplitUpdateBodyGetsItsOwnConstructFunction(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -459,7 +459,7 @@ func TestUnit_Emit_ASplitUpdateBodyGetsItsOwnConstructFunction(t *testing.T) { // And without the split, no second function appears -- the common shape stays // exactly as it was. - plain, err := gen.Build(pilotBlueprint(t), Options{BlueprintPath: "blueprints/thousandeyes"}) + plain, err := gen.Build(pilotBlueprint(t), BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build (plain): %v", err) } @@ -471,12 +471,12 @@ func TestUnit_Emit_ASplitUpdateBodyGetsItsOwnConstructFunction(t *testing.T) { } } -// TestUnit_Emit_ACuratedFixtureValueRidesWithItsDataBlock. +// TestUnit_Generate_ACuratedFixtureValueRidesWithItsDataBlock. // // End to end through the templates: a hinted value must land verbatim in the emitted // minimal fixture with its declared data block above the resource, or the hint mechanism // exists only in the view layer. -func TestUnit_Emit_ACuratedFixtureValueRidesWithItsDataBlock(t *testing.T) { +func TestUnit_Generate_ACuratedFixtureValueRidesWithItsDataBlock(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -498,7 +498,7 @@ func TestUnit_Emit_ACuratedFixtureValueRidesWithItsDataBlock(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -524,13 +524,13 @@ func TestUnit_Emit_ACuratedFixtureValueRidesWithItsDataBlock(t *testing.T) { } } -// TestUnit_Emit_AGatedResourceSkipsItsTestsByName. +// TestUnit_Generate_AGatedResourceSkipsItsTestsByName. // // The gate rides three tests without being declared three times: the resource's own // lifecycle, its list query (same fixture, same privilege), and any test seeded from it // (a test whose seed cannot be created has already failed for the seed's reason). Each // skip names the variable, so a run against a lesser token reads as gated, not broken. -func TestUnit_Emit_AGatedResourceSkipsItsTestsByName(t *testing.T) { +func TestUnit_Generate_AGatedResourceSkipsItsTestsByName(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -545,7 +545,7 @@ func TestUnit_Emit_AGatedResourceSkipsItsTestsByName(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -592,11 +592,11 @@ func TestUnit_Emit_AGatedResourceSkipsItsTestsByName(t *testing.T) { } } -// TestUnit_Emit_APurelyComputedAttributeGetsNoValidator. +// TestUnit_Generate_APurelyComputedAttributeGetsNoValidator. // // A validator runs against configuration. The pilot's `type` attribute documents two values // and is computed only, so a validator there is code that can never run. -func TestUnit_Emit_APurelyComputedAttributeGetsNoValidator(t *testing.T) { +func TestUnit_Generate_APurelyComputedAttributeGetsNoValidator(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -618,7 +618,7 @@ func TestUnit_Emit_APurelyComputedAttributeGetsNoValidator(t *testing.T) { if err != nil { t.Fatalf("New: %v", err) } - plan, err := gen.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := gen.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -633,12 +633,12 @@ func TestUnit_Emit_APurelyComputedAttributeGetsNoValidator(t *testing.T) { } } -// TestUnit_Emit_DataSourceProducesItsFileSet pins the per-data-source file split. +// TestUnit_Generate_DataSourceProducesItsFileSet pins the per-data-source file split. // // Four rather than the resource's five: a data source sends no request body, so there is // nothing for a construct.go to expand into one. The names match the reference provider's, // where read lives in read.go rather than a crud.go that would be three-quarters empty. -func TestUnit_Emit_DataSourceProducesItsFileSet(t *testing.T) { +func TestUnit_Generate_DataSourceProducesItsFileSet(t *testing.T) { t.Parallel() g, err := New() @@ -651,7 +651,7 @@ func TestUnit_Emit_DataSourceProducesItsFileSet(t *testing.T) { t.Skip("the committed pilot blueprint declares no data sources") } - plan, err := g.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -698,9 +698,9 @@ func TestUnit_Emit_DataSourceProducesItsFileSet(t *testing.T) { } } -// TestUnit_Emit_DataSourcesRegisterInTheProvider checks the generated registry, which is +// TestUnit_Generate_DataSourcesRegisterInTheProvider checks the generated registry, which is // what makes the provider serve them at all. -func TestUnit_Emit_DataSourcesRegisterInTheProvider(t *testing.T) { +func TestUnit_Generate_DataSourcesRegisterInTheProvider(t *testing.T) { t.Parallel() g, err := New() @@ -709,7 +709,7 @@ func TestUnit_Emit_DataSourcesRegisterInTheProvider(t *testing.T) { } bp := pilotBlueprint(t) - plan, err := g.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -738,7 +738,7 @@ func TestUnit_Emit_DataSourcesRegisterInTheProvider(t *testing.T) { // firstGenerated returns the plan's first non-scaffold file. examples/ sorts ahead of // the generated tree and is entirely scaffolds, whose write-once semantics make them the // wrong subject for overwrite and inspection tests. -func firstGenerated(t *testing.T, plan Plan) File { +func firstGenerated(t *testing.T, plan Fileset) File { t.Helper() for _, f := range plan.Files { diff --git a/internal/emit/gomod_test.go b/internal/generate/gomod_test.go similarity index 85% rename from internal/emit/gomod_test.go rename to internal/generate/gomod_test.go index bd0d2fd0..ed89b1aa 100644 --- a/internal/emit/gomod_test.go +++ b/internal/generate/gomod_test.go @@ -1,4 +1,4 @@ -package emit +package generate import ( "os" @@ -7,7 +7,7 @@ import ( "testing" ) -// TestUnit_Emit_ModuleGoVersionsAreCompatible guards a failure that is invisible +// TestUnit_Generate_ModuleGoVersionsAreCompatible guards a failure that is invisible // locally and fatal in CI. // // setup-go reads the *root* module's go directive and then pins GOTOOLCHAIN=local, @@ -20,7 +20,7 @@ import ( // A developer never sees it, because a local toolchain is usually newer than // either. This has already happened once: `go get terraform-plugin-testing` raised // the pilot's requirement and CI broke on the first run of the workflow. -func TestUnit_Emit_ModuleGoVersionsAreCompatible(t *testing.T) { +func TestUnit_Generate_ModuleGoVersionsAreCompatible(t *testing.T) { t.Parallel() root := goDirective(t, filepath.Join("..", "..")) @@ -88,7 +88,7 @@ func atoiOrZero(s string) int { return n } -// TestUnit_Emit_CommittedBlueprintDoesNotClaimAnAbsentSnapshot keeps a committed +// TestUnit_Generate_CommittedBlueprintDoesNotClaimAnAbsentSnapshot keeps a committed // artefact from asserting something untrue. // // A blueprint that names a specification snapshot is saying "this was derived @@ -96,7 +96,7 @@ func atoiOrZero(s string) int { // unverifiable, and worse, it invites a reader to believe the blueprint was // ingested when it was hand-authored. Phase 2 pins real snapshots; until then the // field must stay empty rather than aspirational. -func TestUnit_Emit_CommittedBlueprintDoesNotClaimAnAbsentSnapshot(t *testing.T) { +func TestUnit_Generate_CommittedBlueprintDoesNotClaimAnAbsentSnapshot(t *testing.T) { t.Parallel() bp := pilotBlueprint(t) @@ -115,17 +115,17 @@ func TestUnit_Emit_CommittedBlueprintDoesNotClaimAnAbsentSnapshot(t *testing.T) if c.value == "" { continue } - // A claimed snapshot has to be somewhere under openapi-specs/. - matches, err := filepath.Glob(filepath.Join(repoRoot, "openapi-specs", "*", c.value)) + // A claimed snapshot has to be somewhere under openapi/. + matches, err := filepath.Glob(filepath.Join(repoRoot, "openapi", "*", c.value)) if err != nil { t.Fatalf("Glob: %v", err) } - nested, err := filepath.Glob(filepath.Join(repoRoot, "openapi-specs", "*", "*", c.value)) + nested, err := filepath.Glob(filepath.Join(repoRoot, "openapi", "*", "*", c.value)) if err != nil { t.Fatalf("Glob: %v", err) } if len(matches)+len(nested) == 0 { - t.Errorf("the blueprint's source.%s is %q, but nothing matching it is committed under openapi-specs/. "+ + t.Errorf("the blueprint's source.%s is %q, but nothing matching it is committed under openapi/. "+ "Either commit the snapshot or clear the field.", c.field, c.value) } } diff --git a/internal/render/hooks.go b/internal/generate/hooks.go similarity index 99% rename from internal/render/hooks.go rename to internal/generate/hooks.go index 9e17c864..9b97a6e0 100644 --- a/internal/render/hooks.go +++ b/internal/generate/hooks.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/hooks_test.go b/internal/generate/hooks_test.go similarity index 99% rename from internal/render/hooks_test.go rename to internal/generate/hooks_test.go index dea7e897..4ceadfbf 100644 --- a/internal/render/hooks_test.go +++ b/internal/generate/hooks_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "errors" diff --git a/internal/render/identity.go b/internal/generate/identity.go similarity index 99% rename from internal/render/identity.go rename to internal/generate/identity.go index 1b521a34..de8530e6 100644 --- a/internal/render/identity.go +++ b/internal/generate/identity.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/list.go b/internal/generate/list.go similarity index 99% rename from internal/render/list.go rename to internal/generate/list.go index eded7cbb..69e9e269 100644 --- a/internal/render/list.go +++ b/internal/generate/list.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" @@ -142,7 +142,7 @@ func listView( if lf.Schema != nil { lsc := schemaScope{ - kind: blueprint.BlockList, + kind: blueprint.BlockKindList, what: fmt.Sprintf("list facet of resource %q", r.Key), patterns: newPatternVars(), } diff --git a/internal/render/list_filter_test.go b/internal/generate/list_filter_test.go similarity index 99% rename from internal/render/list_filter_test.go rename to internal/generate/list_filter_test.go index de399340..8a9647d2 100644 --- a/internal/render/list_filter_test.go +++ b/internal/generate/list_filter_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/render/nested.go b/internal/generate/nested.go similarity index 99% rename from internal/render/nested.go rename to internal/generate/nested.go index 47d543fa..a0fdffff 100644 --- a/internal/render/nested.go +++ b/internal/generate/nested.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/nested_test.go b/internal/generate/nested_test.go similarity index 99% rename from internal/render/nested_test.go rename to internal/generate/nested_test.go index dc78f51e..de96e855 100644 --- a/internal/render/nested_test.go +++ b/internal/generate/nested_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" @@ -10,7 +10,7 @@ import ( // testResourceScope is the scope the resource-oriented rendering tests pass. It is named // rather than inlined so a test that means to render as a data source has to say so. var testResourceScope = schemaScope{ - kind: blueprint.BlockResource, + kind: blueprint.BlockKindResource, what: `resource "tag"`, // The identifier, which is the only attribute UseStateForUnknown is applied to. idAttribute: "id", diff --git a/internal/render/provider.go b/internal/generate/provider.go similarity index 90% rename from internal/render/provider.go rename to internal/generate/provider.go index 58df1d11..9c5ee483 100644 --- a/internal/render/provider.go +++ b/internal/generate/provider.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" @@ -26,7 +26,7 @@ type RegistrationView struct { } // Registration builds the view for the resource or data source registration file. -func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationView { +func Registration(bp blueprint.Blueprint, kind RegistryKind, opts Options) RegistrationView { v := RegistrationView{ Header: GeneratedHeader(opts.BlueprintPath, opts.BlueprintSHA256), Package: providerPackage(bp), @@ -36,7 +36,7 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV var entries []entry switch kind { - case KindResources: + case RegistryKindResources: for _, r := range bp.Resources { if r.Drop { continue @@ -47,7 +47,7 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV ctor: "New" + r.GoTypeName, }) } - case KindDataSources: + case RegistryKindDataSources: for _, d := range bp.DataSources { if d.Drop { continue @@ -58,7 +58,7 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV ctor: "New" + d.GoTypeName, }) } - case KindActions: + case RegistryKindActions: for _, a := range bp.Actions { if a.Drop { continue @@ -69,7 +69,7 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV ctor: "New" + a.GoTypeName, }) } - case KindEphemerals: + case RegistryKindEphemerals: for _, e := range bp.Ephemerals { if e.Drop { continue @@ -80,7 +80,7 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV ctor: "New" + e.GoTypeName, }) } - case KindListResources: + case RegistryKindListResources: // From the resources, not from a list of their own: a list resource is a facet, and // it is registered because the resource it lists declares one. The import is the // resource's package, since that is where the generated file lives. @@ -110,15 +110,15 @@ func Registration(bp blueprint.Blueprint, kind Kind, opts Options) RegistrationV return v } -// Kind selects which registration file to render. -type Kind string +// RegistryKind selects which registration file to render. +type RegistryKind string const ( - KindResources Kind = "resources" - KindDataSources Kind = "dataSources" - KindListResources Kind = "listResources" - KindActions Kind = "actions" - KindEphemerals Kind = "ephemerals" + RegistryKindResources RegistryKind = "resources" + RegistryKindDataSources RegistryKind = "dataSources" + RegistryKindListResources RegistryKind = "listResources" + RegistryKindActions RegistryKind = "actions" + RegistryKindEphemerals RegistryKind = "ephemerals" ) // providerPackage is the Go package name of the provider directory. diff --git a/internal/render/render.go b/internal/generate/render.go similarity index 99% rename from internal/render/render.go rename to internal/generate/render.go index 675e14e9..7bd2011b 100644 --- a/internal/render/render.go +++ b/internal/generate/render.go @@ -9,7 +9,7 @@ // // Every exported view field is therefore a finished Go expression, a finished // declaration, or a boolean. -package render +package generate import ( "fmt" @@ -79,7 +79,7 @@ func (sc schemaScope) schemaImport() string { // rendering produces. func resourceScope(r blueprint.Resource) schemaScope { return schemaScope{ - kind: blueprint.BlockResource, + kind: blueprint.BlockKindResource, what: fmt.Sprintf("resource %q", r.Key), patterns: newPatternVars(), idAttribute: r.Binding.ID.Attribute, @@ -89,7 +89,7 @@ func resourceScope(r blueprint.Resource) schemaScope { func dataSourceScope(d blueprint.DataSource) schemaScope { return schemaScope{ - kind: blueprint.BlockDataSource, + kind: blueprint.BlockKindDataSource, what: fmt.Sprintf("data source %q", d.Key), patterns: newPatternVars(), } @@ -339,7 +339,7 @@ type OpView struct { // either would make every regeneration a diff, which would destroy the drift check. func GeneratedHeader(blueprintPath, sha256 string) string { return fmt.Sprintf( - "// Code generated by tfpluginframeworkgen from %s\n// (sha256:%s). DO NOT EDIT.", + "// Code generated by tfpfgen from %s\n// (sha256:%s). DO NOT EDIT.", blueprintPath, sha256) } @@ -350,7 +350,7 @@ func GeneratedHeader(blueprintPath, sha256 string) string { // words would leave an emitted .tf unprotected by both. func GeneratedHeaderHCL(blueprintPath, sha256 string) string { return fmt.Sprintf( - "# Code generated by tfpluginframeworkgen from %s\n# (sha256:%s). DO NOT EDIT.", + "# Code generated by tfpfgen from %s\n# (sha256:%s). DO NOT EDIT.", blueprintPath, sha256) } diff --git a/internal/render/render_test.go b/internal/generate/render_test.go similarity index 98% rename from internal/render/render_test.go rename to internal/generate/render_test.go index b2e38086..f2270a4b 100644 --- a/internal/render/render_test.go +++ b/internal/generate/render_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "errors" @@ -635,7 +635,7 @@ func TestUnit_Render_RegistrationIsSortedAndComplete(t *testing.T) { second.GoTypeName = "AaaResource" bp.Resources = append(bp.Resources, second) - v := Registration(bp, KindResources, Options{BlueprintPath: "b", BlueprintSHA256: "s"}) + v := Registration(bp, RegistryKindResources, Options{BlueprintPath: "b", BlueprintSHA256: "s"}) // The committed blueprint's non-dropped resources plus the one appended above // -- a dropped resource (the SDK-gated dashboard) registers nothing. @@ -658,12 +658,12 @@ func TestUnit_Render_RegistrationIsSortedAndComplete(t *testing.T) { // A dropped resource must not be registered. bp.Resources[len(bp.Resources)-1].Drop = true - if got := Registration(bp, KindResources, Options{}); len(got.Entries) != want-1 { + if got := Registration(bp, RegistryKindResources, Options{}); len(got.Entries) != want-1 { t.Errorf("a dropped resource should not be registered: %v", got.Entries) } // Data sources register through the same path, sorted by the same rule. - ds := Registration(bp, KindDataSources, Options{}) + ds := Registration(bp, RegistryKindDataSources, Options{}) if len(ds.Entries) != 2 { t.Fatalf("got %d data source entries, want 2: %v", len(ds.Entries), ds.Entries) } @@ -678,7 +678,7 @@ func TestUnit_Render_RegistrationIsSortedAndComplete(t *testing.T) { // still render rather than failing. bp.DataSources[0].Drop = true bp.DataSources[1].Drop = true - if got := Registration(bp, KindDataSources, Options{}); len(got.Entries) != 0 { + if got := Registration(bp, RegistryKindDataSources, Options{}); len(got.Entries) != 0 { t.Errorf("dropped data sources should not be registered: %v", got.Entries) } } diff --git a/internal/render/replace_test.go b/internal/generate/replace_test.go similarity index 99% rename from internal/render/replace_test.go rename to internal/generate/replace_test.go index 0e63d49f..2c8be9a4 100644 --- a/internal/render/replace_test.go +++ b/internal/generate/replace_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/emit/statemapper_test.go b/internal/generate/statemapper_test.go similarity index 89% rename from internal/emit/statemapper_test.go rename to internal/generate/statemapper_test.go index b7b7e00c..3036e163 100644 --- a/internal/emit/statemapper_test.go +++ b/internal/generate/statemapper_test.go @@ -1,4 +1,4 @@ -package emit +package generate import ( "bytes" @@ -46,7 +46,7 @@ func callsTo(t *testing.T, path string, src []byte, name string) []string { return at } -// TestUnit_Emit_TheStateMapperHasOneCallSite is the property phase 5.5 exists to establish. +// TestUnit_Generate_TheStateMapperHasOneCallSite is the property phase 5.5 exists to establish. // // Before it, Create mapped the *create* response, Read mapped the *read* response and // Update mapped the *update* response: three call sites for one function, so any change to @@ -60,7 +60,7 @@ func callsTo(t *testing.T, path string, src []byte, name string) []string { // // Create and Update now delegate to readAfterWrite, which retries readState, which is the // one caller. -func TestUnit_Emit_TheStateMapperHasOneCallSite(t *testing.T) { +func TestUnit_Generate_TheStateMapperHasOneCallSite(t *testing.T) { t.Parallel() g, err := New() @@ -70,7 +70,7 @@ func TestUnit_Emit_TheStateMapperHasOneCallSite(t *testing.T) { bp := pilotBlueprint(t) - plan, err := g.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -133,12 +133,12 @@ func TestUnit_Emit_TheStateMapperHasOneCallSite(t *testing.T) { } } -// TestUnit_Emit_CreateAndUpdateDoNotMapTheirOwnResponse is the same property stated the +// TestUnit_Generate_CreateAndUpdateDoNotMapTheirOwnResponse is the same property stated the // other way round, and it is the one that would catch a regression. // // One call site could be satisfied by Create mapping the create response and Read doing // nothing. What must hold is that the write operations delegate. -func TestUnit_Emit_CreateAndUpdateDoNotMapTheirOwnResponse(t *testing.T) { +func TestUnit_Generate_CreateAndUpdateDoNotMapTheirOwnResponse(t *testing.T) { t.Parallel() g, err := New() @@ -146,7 +146,7 @@ func TestUnit_Emit_CreateAndUpdateDoNotMapTheirOwnResponse(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := g.Build(pilotBlueprint(t), Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(pilotBlueprint(t), BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -179,10 +179,10 @@ func TestUnit_Emit_CreateAndUpdateDoNotMapTheirOwnResponse(t *testing.T) { } } -// TestUnit_Emit_AListFacetEmitsItsFileAndRegistration is the end-to-end property of phase +// TestUnit_Generate_AListFacetEmitsItsFileAndRegistration is the end-to-end property of phase // 5.6: a resource declaring a list facet makes the provider serve it, with no hand-written // change anywhere. -func TestUnit_Emit_AListFacetEmitsItsFileAndRegistration(t *testing.T) { +func TestUnit_Generate_AListFacetEmitsItsFileAndRegistration(t *testing.T) { t.Parallel() g, err := New() @@ -202,7 +202,7 @@ func TestUnit_Emit_AListFacetEmitsItsFileAndRegistration(t *testing.T) { t.Skip("the committed pilot blueprint declares no list facet") } - plan, err := g.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -226,8 +226,8 @@ func TestUnit_Emit_AListFacetEmitsItsFileAndRegistration(t *testing.T) { // The type name is read from the same constant the resource uses. That equality is the // entire linkage between the two -- the framework errors from GetMetadata if they // differ -- so it is asserted rather than left to inspection. - if !strings.Contains(listFile, "resp.TypeName = ResourceName") { - t.Error("the list resource should take its type name from ResourceName") + if !strings.Contains(listFile, "resp.TypeName = TypeName") { + t.Error("the list resource should take its type name from TypeName") } // Metadata and Configure take resource.* request types, not list.*. The framework @@ -272,13 +272,13 @@ func TestUnit_Emit_AListFacetEmitsItsFileAndRegistration(t *testing.T) { } } -// TestUnit_Emit_AScaffoldIsWrittenOnceAndThenKept is the escape hatch's defining property. +// TestUnit_Generate_AScaffoldIsWrittenOnceAndThenKept is the escape hatch's defining property. // // A scaffold is not "a file the generator has not overwritten yet" -- it is one it will never // overwrite. Without that, a practitioner's ModifyPlan would be replaced by the stub on the next // emit, or worse, the run would fail with the overwrite refusal and there would be no way to // keep the file at all. -func TestUnit_Emit_AScaffoldIsWrittenOnceAndThenKept(t *testing.T) { +func TestUnit_Generate_AScaffoldIsWrittenOnceAndThenKept(t *testing.T) { t.Parallel() g, err := New() @@ -288,7 +288,7 @@ func TestUnit_Emit_AScaffoldIsWrittenOnceAndThenKept(t *testing.T) { bp := pilotBlueprint(t) - plan, err := g.Build(bp, Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(bp, BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } @@ -352,12 +352,12 @@ func TestUnit_Emit_AScaffoldIsWrittenOnceAndThenKept(t *testing.T) { } } -// TestUnit_Emit_AScaffoldCarriesNoGeneratedMarker. +// TestUnit_Generate_AScaffoldCarriesNoGeneratedMarker. // // The marker is what the drift check and the overwrite refusal both key on. A scaffold carrying // one would be policed as generated code, which is the opposite of the point -- and the // manifest excluding it is only half the job if the file still announces itself as generated. -func TestUnit_Emit_AScaffoldCarriesNoGeneratedMarker(t *testing.T) { +func TestUnit_Generate_AScaffoldCarriesNoGeneratedMarker(t *testing.T) { t.Parallel() g, err := New() @@ -365,7 +365,7 @@ func TestUnit_Emit_AScaffoldCarriesNoGeneratedMarker(t *testing.T) { t.Fatalf("New: %v", err) } - plan, err := g.Build(pilotBlueprint(t), Options{BlueprintPath: "blueprints/thousandeyes"}) + plan, err := g.Build(pilotBlueprint(t), BuildOptions{BlueprintPath: "blueprints/thousandeyes"}) if err != nil { t.Fatalf("Build: %v", err) } diff --git a/internal/render/validators.go b/internal/generate/validators.go similarity index 99% rename from internal/render/validators.go rename to internal/generate/validators.go index a8451e02..4aac207c 100644 --- a/internal/render/validators.go +++ b/internal/generate/validators.go @@ -1,4 +1,4 @@ -package render +package generate import ( "fmt" diff --git a/internal/render/validators_test.go b/internal/generate/validators_test.go similarity index 99% rename from internal/render/validators_test.go rename to internal/generate/validators_test.go index 0079d8a4..a32cbc3a 100644 --- a/internal/render/validators_test.go +++ b/internal/generate/validators_test.go @@ -1,4 +1,4 @@ -package render +package generate import ( "strings" diff --git a/internal/manifest/manifest.go b/internal/manifest/manifest.go index 2127ff79..649f0388 100644 --- a/internal/manifest/manifest.go +++ b/internal/manifest/manifest.go @@ -23,7 +23,7 @@ import ( ) // Name is the manifest's path relative to the provider root. -const Name = ".tfpluginframeworkgen/manifest.json" +const Name = ".tfpfgen/manifest.json" // FormatVersion is the manifest format version. const FormatVersion = "1" diff --git a/internal/naming/naming.go b/internal/naming/naming.go index e93f6ac3..6b6671e9 100644 --- a/internal/naming/naming.go +++ b/internal/naming/naming.go @@ -42,7 +42,7 @@ var nonAlphanumeric = regexp.MustCompile(`[^A-Za-z0-9]+`) // Order matters: a longer entry must precede any entry that is a prefix or // suffix of it, so UUID is matched before ID. var Initialisms = []string{ - "HTTPS", "HTTP", "JSON", "UUID", "YAML", "CIDR", "CSV", "XML", "SKU", + "DNSSEC", "HTTPS", "HTTP", "JSON", "UUID", "YAML", "CIDR", "CSV", "XML", "SKU", "API", "ASN", "BGP", "CPU", "DNS", "FTP", "MTU", "RAM", "SIP", "SSL", "TCP", "TLS", "UDP", "URI", "URL", "VPN", "ARN", "AID", "ID", "IP", "OS", } diff --git a/internal/naming/naming_test.go b/internal/naming/naming_test.go index f66298dd..4a68d6ef 100644 --- a/internal/naming/naming_test.go +++ b/internal/naming/naming_test.go @@ -432,13 +432,10 @@ func TestUnit_Naming_SnakeDirName(t *testing.T) { func TestUnit_Naming_TestNames(t *testing.T) { t.Parallel() - if got := UnitTestName(1, "Tag", "Schema"); got != "TestUnit_Tag_01_Schema" { - t.Errorf("UnitTestName = %q", got) - } - if got := UnitTestName(12, "Tag", "Minimal"); got != "TestUnit_Tag_12_Minimal" { - t.Errorf("UnitTestName = %q", got) + if got := AccTestName("Resource", "Tag", 1, "Lifecycle"); got != "TestAccResourceTag_01_Lifecycle" { + t.Errorf("AccTestName = %q", got) } - if got := AccTestName(1, "Tag", "Minimal"); got != "TestAcc_Tag_01_Minimal" { + if got := AccTestName("DataSource", "Tag", 12, "Read"); got != "TestAccDataSourceTag_12_Read" { t.Errorf("AccTestName = %q", got) } } diff --git a/internal/naming/testnames.go b/internal/naming/testnames.go index ae9f4fb3..253ffda8 100644 --- a/internal/naming/testnames.go +++ b/internal/naming/testnames.go @@ -2,21 +2,13 @@ package naming import "fmt" -// UnitTestName builds the numbered unit-test identifier the archetype provider -// uses. The ordinal makes the intended reading order explicit in the file, and -// the subject is the second underscore-delimited field because the house CI -// workflow's statistics block parses it that way. +// AccTestName builds the acceptance-test identifier every generated test file +// uses. Acceptance tests are prefixed TestAcc so the standard -run filter +// separates them from unit tests that must never touch a network; the block +// kind follows immediately so one resource's tests sort together; the ordinal +// makes the intended reading order explicit in the file. // -// (1, "Tag", "Schema") -> "TestUnit_Tag_01_Schema" -func UnitTestName(ordinal int, subject, kind string) string { - return fmt.Sprintf("TestUnit_%s_%02d_%s", subject, ordinal, kind) -} - -// AccTestName builds the acceptance-test identifier. Acceptance tests are -// prefixed TestAcc so the standard -run filter separates them from unit tests -// that must never touch a network. -// -// (1, "Tag", "Minimal") -> "TestAcc_Tag_01_Minimal" -func AccTestName(ordinal int, subject, kind string) string { - return fmt.Sprintf("TestAcc_%s_%02d_%s", subject, ordinal, kind) +// ("Resource", "Tag", 1, "Lifecycle") -> "TestAccResourceTag_01_Lifecycle" +func AccTestName(blockKind, subject string, ordinal int, scenario string) string { + return fmt.Sprintf("TestAcc%s%s_%02d_%s", blockKind, subject, ordinal, scenario) } diff --git a/internal/ingest/openapi/coverage_test.go b/internal/openapi/coverage_test.go similarity index 100% rename from internal/ingest/openapi/coverage_test.go rename to internal/openapi/coverage_test.go diff --git a/internal/ingest/openapi/discover.go b/internal/openapi/discover.go similarity index 92% rename from internal/ingest/openapi/discover.go rename to internal/openapi/discover.go index 04f16868..7047134f 100644 --- a/internal/ingest/openapi/discover.go +++ b/internal/openapi/discover.go @@ -115,16 +115,16 @@ type Candidate struct { Extra []Operation } -// Kind classifies what a candidate can become. -type Kind string +// CandidateKind classifies what a candidate can become. +type CandidateKind string const ( - // KindResource has enough of a lifecycle for Terraform to own it. - KindResource Kind = "resource" - // KindDataSource can be read but not managed. - KindDataSource Kind = "dataSource" - // KindNeither is reporting, actions or something else Terraform cannot model. - KindNeither Kind = "neither" + // CandidateKindResource has enough of a lifecycle for Terraform to own it. + CandidateKindResource CandidateKind = "resource" + // CandidateKindDataSource can be read but not managed. + CandidateKindDataSource CandidateKind = "dataSource" + // CandidateKindNeither is reporting, actions or something else Terraform cannot model. + CandidateKindNeither CandidateKind = "neither" ) // Classify decides what a candidate can become, and says why. @@ -134,7 +134,7 @@ const ( // and one with no delete is unusual but real. Without create there is nothing to // manage; without read there is no way to refresh state, so a plan can never be // correct. -func (c Candidate) Classify() (Kind, string) { +func (c Candidate) Classify() (CandidateKind, string) { switch { case c.Create != nil && c.Read != nil: var missing []string @@ -145,20 +145,20 @@ func (c Candidate) Classify() (Kind, string) { missing = append(missing, "delete") } if len(missing) > 0 { - return KindResource, "no " + strings.Join(missing, " or ") + return CandidateKindResource, "no " + strings.Join(missing, " or ") } - return KindResource, "full lifecycle" + return CandidateKindResource, "full lifecycle" case c.Read != nil || c.List != nil: - return KindDataSource, "readable but not creatable" + return CandidateKindDataSource, "readable but not creatable" case c.Create != nil: // Create with no read is a job submission, not a resource: Terraform // could make one and would never be able to see it again. - return KindNeither, "create with no read, which Terraform cannot refresh" + return CandidateKindNeither, "create with no read, which Terraform cannot refresh" default: - return KindNeither, "no create and no read" + return CandidateKindNeither, "no create and no read" } } diff --git a/internal/ingest/openapi/discover_test.go b/internal/openapi/discover_test.go similarity index 96% rename from internal/ingest/openapi/discover_test.go rename to internal/openapi/discover_test.go index 1d00da9d..efe570a6 100644 --- a/internal/ingest/openapi/discover_test.go +++ b/internal/openapi/discover_test.go @@ -127,7 +127,7 @@ func TestUnit_Discover_NonCrudOperationsAreKeptNotDiscarded(t *testing.T) { } kind, why := c.Classify() - if kind != KindNeither { + if kind != CandidateKindNeither { t.Errorf("classify = %s (%s), want neither: it can be created and never read", kind, why) } } @@ -139,13 +139,13 @@ func TestUnit_Discover_Classify(t *testing.T) { tests := []struct { key string - want Kind + want CandidateKind }{ - {"tag", KindResource}, - {"usage", KindDataSource}, + {"tag", CandidateKindResource}, + {"usage", CandidateKindDataSource}, // Create with no read is a job submission: Terraform could make one and // never see it again. - {"instant_test", KindNeither}, + {"instant_test", CandidateKindNeither}, } for _, tc := range tests { @@ -168,7 +168,7 @@ func TestUnit_Discover_ClassifyReportsPartialLifecycles(t *testing.T) { op := &Operation{Method: "GET"} kind, why := Candidate{Create: op, Read: op}.Classify() - if kind != KindResource { + if kind != CandidateKindResource { t.Fatalf("kind = %s, want resource", kind) } if why != "no update or delete" { @@ -268,7 +268,7 @@ func TestUnit_Discover_IsDeterministic(t *testing.T) { func TestUnit_Discover_AgainstTheCommittedSpecification(t *testing.T) { t.Parallel() - path := filepath.Join("..", "..", "..", "openapi-specs", "thousandeyes", + path := filepath.Join("..", "..", "..", "openapi", "thousandeyes", "7.0.97-t1785152261691", "api.yaml") if _, err := os.Stat(path); os.IsNotExist(err) { @@ -291,7 +291,7 @@ func TestUnit_Discover_AgainstTheCommittedSpecification(t *testing.T) { tag := find(t, all, "tag") kind, why := tag.Classify() - if kind != KindResource { + if kind != CandidateKindResource { t.Errorf("tag classified as %s (%s), want resource", kind, why) } if why != "full lifecycle" { diff --git a/internal/ingest/openapi/infer.go b/internal/openapi/infer.go similarity index 98% rename from internal/ingest/openapi/infer.go rename to internal/openapi/infer.go index 3210c44c..3dc6e7eb 100644 --- a/internal/ingest/openapi/infer.go +++ b/internal/openapi/infer.go @@ -41,19 +41,19 @@ type InferOptions struct { APIVersionDir string } -// Note records something inference could not do, or did by assumption. +// Caveat records something inference could not do, or did by assumption. // // Notes are the point of the exercise as much as the blueprint is. A generator // that silently drops what it cannot express produces a provider that looks // complete and is not, so everything skipped is reported with the attribute it // belongs to. -type Note struct { +type Caveat struct { Resource string Field string Message string } -func (n Note) String() string { +func (n Caveat) String() string { if n.Field == "" { return fmt.Sprintf("%s: %s", n.Resource, n.Message) } @@ -71,13 +71,13 @@ var namingOpts = naming.Options{StripPrefix: naming.DefaultStripPrefix} // deliberate presence overrides and curated descriptions belong to a person, and // the difference between this output and a curated blueprint is exactly the work // that required judgement. -func (d *Document) Infer(c Candidate, opts InferOptions) (blueprint.Resource, []Note, error) { +func (d *Document) Infer(c Candidate, opts InferOptions) (blueprint.Resource, []Caveat, error) { kind, why := c.Classify() - if kind != KindResource { + if kind != CandidateKindResource { return blueprint.Resource{}, nil, fmt.Errorf("%w: %s: %s", ErrNotAResource, c.Key, why) } - var notes []Note + var notes []Caveat service := namingOpts.GoTypeName(c.Tag) pkgDir := naming.SnakeDirName(c.Key) @@ -154,7 +154,7 @@ func (d *Document) Infer(c Candidate, opts InferOptions) (blueprint.Resource, [] // Without an identifier there is nothing to read, import or delete by. if !hasAttribute(r.Schema.Attributes, "id") { - notes = append(notes, Note{ + notes = append(notes, Caveat{ Resource: c.Key, Message: "no id attribute in the schemas, so the resource cannot be imported or refreshed", }) @@ -174,7 +174,7 @@ func updateStyleOf(op *Operation) blueprint.UpdateStyle { case op == nil: return blueprint.UpdateReplaceOnly case op.Method == "PATCH": - return blueprint.UpdateMergePatch + return blueprint.UpdatePatchMerge default: return blueprint.UpdatePutFull } @@ -237,7 +237,7 @@ func bindOperations(r *blueprint.Resource, c Candidate, resultType string) { // A field in both is configurable; one only in the response is computed. That // merge is the whole of presence inference, and it is why both schemas are read // rather than just one. -func (d *Document) attributes(c Candidate, sdkPkg string) ([]blueprint.Attribute, []Note) { +func (d *Document) attributes(c Candidate, sdkPkg string) ([]blueprint.Attribute, []Caveat) { writable := map[string]Field{} for _, f := range Fields(d.requestSchema(c)) { writable[f.Name] = f diff --git a/internal/ingest/openapi/infer_test.go b/internal/openapi/infer_test.go similarity index 98% rename from internal/ingest/openapi/infer_test.go rename to internal/openapi/infer_test.go index e367195d..90a9fb44 100644 --- a/internal/ingest/openapi/infer_test.go +++ b/internal/openapi/infer_test.go @@ -138,7 +138,7 @@ func inferOptions() InferOptions { } } -func inferWidget(t *testing.T) (blueprint.Resource, []Note) { +func inferWidget(t *testing.T) (blueprint.Resource, []Caveat) { t.Helper() dir := t.TempDir() @@ -445,7 +445,7 @@ func TestUnit_Infer_UpdateStyleComesFromTheVerb(t *testing.T) { op *Operation want blueprint.UpdateStyle }{ - "patch": {&Operation{Method: "PATCH"}, blueprint.UpdateMergePatch}, + "patch": {&Operation{Method: "PATCH"}, blueprint.UpdatePatchMerge}, "put": {&Operation{Method: "PUT"}, blueprint.UpdatePutFull}, "no update": {nil, blueprint.UpdateReplaceOnly}, } @@ -597,7 +597,7 @@ func TestUnit_Infer_IsDeterministic(t *testing.T) { func TestUnit_Infer_AgainstTheCommittedSpecification(t *testing.T) { t.Parallel() - path := filepath.Join("..", "..", "..", "openapi-specs", "thousandeyes", + path := filepath.Join("..", "..", "..", "openapi", "thousandeyes", "7.0.97-t1785152261691", "api.yaml") if _, err := os.Stat(path); os.IsNotExist(err) { t.Skipf("the pinned snapshot is not present at %s", path) @@ -700,7 +700,7 @@ func assertNestedIdentifiers(t *testing.T, res blueprint.Resource, want nestedId } } -func noteStrings(notes []Note) []string { +func noteStrings(notes []Caveat) []string { out := make([]string, 0, len(notes)) for _, n := range notes { out = append(out, n.String()) @@ -711,10 +711,10 @@ func noteStrings(notes []Note) []string { func TestUnit_Infer_NoteString(t *testing.T) { t.Parallel() - if got := (Note{Resource: "tag", Field: "colour", Message: "why"}).String(); got != "tag.colour: why" { + if got := (Caveat{Resource: "tag", Field: "colour", Message: "why"}).String(); got != "tag.colour: why" { t.Errorf("String = %q", got) } - if got := (Note{Resource: "tag", Message: "why"}).String(); got != "tag: why" { + if got := (Caveat{Resource: "tag", Message: "why"}).String(); got != "tag: why" { t.Errorf("String = %q", got) } } diff --git a/internal/ingest/openapi/nested.go b/internal/openapi/nested.go similarity index 98% rename from internal/ingest/openapi/nested.go rename to internal/openapi/nested.go index 25c2906c..24850471 100644 --- a/internal/ingest/openapi/nested.go +++ b/internal/openapi/nested.go @@ -24,7 +24,7 @@ type inferCtx struct { sdkPkg string taken map[string]bool - notes []Note + notes []Caveat } func newInferCtx(resourceKey, sdkPkg string) *inferCtx { @@ -37,7 +37,7 @@ func newInferCtx(resourceKey, sdkPkg string) *inferCtx { } func (ctx *inferCtx) note(path, msg string) { - ctx.notes = append(ctx.notes, Note{Resource: ctx.resource, Field: path, Message: msg}) + ctx.notes = append(ctx.notes, Caveat{Resource: ctx.resource, Field: path, Message: msg}) } // nestedObject builds the generated shape for one nested object, recursing into it. diff --git a/internal/ingest/openapi/nested_test.go b/internal/openapi/nested_test.go similarity index 98% rename from internal/ingest/openapi/nested_test.go rename to internal/openapi/nested_test.go index a5eea0a3..12245ced 100644 --- a/internal/ingest/openapi/nested_test.go +++ b/internal/openapi/nested_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/render" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/generate" ) // nestedSpec is a document whose widget carries every nested shape inference has to @@ -112,7 +112,7 @@ components: items: {$ref: '#/components/schemas/Node'} ` -func inferNested(t *testing.T) (blueprint.Resource, []Note) { +func inferNested(t *testing.T) (blueprint.Resource, []Caveat) { t.Helper() dir := t.TempDir() @@ -352,7 +352,7 @@ func TestUnit_Infer_InferredNestedBlueprintRenders(t *testing.T) { t.Fatalf("an inferred blueprint must validate: %v", err) } - v, err := render.Resource(bp, res, render.Options{BlueprintPath: "b", BlueprintSHA256: "s"}) + v, err := generate.Resource(bp, res, generate.Options{BlueprintPath: "b", BlueprintSHA256: "s"}) if err != nil { t.Fatalf("an inferred blueprint must render: %v", err) } diff --git a/internal/ingest/openapi/schema.go b/internal/openapi/schema.go similarity index 100% rename from internal/ingest/openapi/schema.go rename to internal/openapi/schema.go diff --git a/internal/probe/catalogue.go b/internal/probe/catalogue.go index 342767fa..b987c497 100644 --- a/internal/probe/catalogue.go +++ b/internal/probe/catalogue.go @@ -80,9 +80,9 @@ func init() { // bodies on its own. type unknownParamTolerance struct{} -func (unknownParamTolerance) Name() string { return "read.unknown-param" } -func (unknownParamTolerance) Kind() Kind { return KindRead } -func (unknownParamTolerance) Cost(Scope) int { return 1 } +func (unknownParamTolerance) Name() string { return "read.unknown-param" } +func (unknownParamTolerance) Kind() ProbeKind { return ProbeKindRead } +func (unknownParamTolerance) Cost(Scope) int { return 1 } // notFoundShape sends one GET for a well-formed but absent identifier, and observes the // status and body shape. @@ -98,9 +98,9 @@ func (unknownParamTolerance) Cost(Scope) int { return 1 } // absence. type notFoundShape struct{} -func (notFoundShape) Name() string { return "read.not-found-shape" } -func (notFoundShape) Kind() Kind { return KindRead } -func (notFoundShape) Cost(Scope) int { return 1 } +func (notFoundShape) Name() string { return "read.not-found-shape" } +func (notFoundShape) Kind() ProbeKind { return ProbeKindRead } +func (notFoundShape) Cost(Scope) int { return 1 } // listShape sends one GET to the collection and observes the envelope key, whether a // next-page link is present, and the shape of an item. @@ -114,9 +114,9 @@ func (notFoundShape) Cost(Scope) int { return 1 } // would make a clean sandbox look like a broken one. type listShape struct{} -func (listShape) Name() string { return "read.list-shape" } -func (listShape) Kind() Kind { return KindRead } -func (listShape) Cost(Scope) int { return 1 } +func (listShape) Name() string { return "read.list-shape" } +func (listShape) Kind() ProbeKind { return ProbeKindRead } +func (listShape) Cost(Scope) int { return 1 } // volatileOnRead reads the same item three times, spaced by an interval, and observes // which fields differ. @@ -134,9 +134,9 @@ func (listShape) Cost(Scope) int { return 1 } // the prober created itself, where nothing else has a reason to touch it. type volatileOnRead struct{} -func (volatileOnRead) Name() string { return "read.volatile" } -func (volatileOnRead) Kind() Kind { return KindRead } -func (volatileOnRead) Cost(Scope) int { return 3 } +func (volatileOnRead) Name() string { return "read.volatile" } +func (volatileOnRead) Kind() ProbeKind { return ProbeKindRead } +func (volatileOnRead) Cost(Scope) int { return 3 } // errorEnvelope sends one deliberately malformed read -- a typed query parameter given a // bad value -- and observes which error shape comes back for which status. @@ -152,9 +152,9 @@ func (volatileOnRead) Cost(Scope) int { return 3 } // is scoped to the status actually observed rather than generalised. type errorEnvelope struct{} -func (errorEnvelope) Name() string { return "read.error-envelope" } -func (errorEnvelope) Kind() Kind { return KindRead } -func (errorEnvelope) Cost(Scope) int { return 1 } +func (errorEnvelope) Name() string { return "read.error-envelope" } +func (errorEnvelope) Kind() ProbeKind { return ProbeKindRead } +func (errorEnvelope) Cost(Scope) int { return 1 } // returnedOnReadWeak reads one item and notes which of the schema's JSON paths are absent. // @@ -170,9 +170,9 @@ func (errorEnvelope) Cost(Scope) int { return 1 } // merged. Its output is a prompt to look, not a conclusion. type returnedOnReadWeak struct{} -func (returnedOnReadWeak) Name() string { return "read.returned-weak" } -func (returnedOnReadWeak) Kind() Kind { return KindRead } -func (returnedOnReadWeak) Cost(Scope) int { return 1 } +func (returnedOnReadWeak) Name() string { return "read.returned-weak" } +func (returnedOnReadWeak) Kind() ProbeKind { return ProbeKindRead } +func (returnedOnReadWeak) Cost(Scope) int { return 1 } // --------------------------------------------------------------------------- // Mutating tier @@ -196,8 +196,8 @@ func (returnedOnReadWeak) Cost(Scope) int { return 1 } // a Fact. type requiredByAPI struct{} -func (requiredByAPI) Name() string { return "write.required" } -func (requiredByAPI) Kind() Kind { return KindMutating } +func (requiredByAPI) Name() string { return "write.required" } +func (requiredByAPI) Kind() ProbeKind { return ProbeKindMutating } // Cost is one create for the baseline plus one per key the fixture sets, per fixture. // @@ -229,8 +229,8 @@ func (requiredByAPI) Creates(sc Scope) int { return omissionCreates(sc) } // never as a property of the real system. type readYourWrites struct{} -func (readYourWrites) Name() string { return "write.read-your-writes" } -func (readYourWrites) Kind() Kind { return KindMutating } +func (readYourWrites) Name() string { return "write.read-your-writes" } +func (readYourWrites) Kind() ProbeKind { return ProbeKindMutating } // Nearly free: the first read after a create is one this probe would be doing anyway. // Cost is nothing at all: this probe reports the consistency window the session already @@ -260,8 +260,8 @@ func (readYourWrites) Creates(Scope) int { return 0 } // refresh. So this reads back twice: bare, and with every expansion the plan lists. type writableAndReturned struct{} -func (writableAndReturned) Name() string { return "write.writable-returned" } -func (writableAndReturned) Kind() Kind { return KindMutating } +func (writableAndReturned) Name() string { return "write.writable-returned" } +func (writableAndReturned) Kind() ProbeKind { return ProbeKindMutating } // One create plus a bare read plus one read per expansion. // Cost is one create, read, expansion read and delete per fixture. @@ -288,8 +288,8 @@ func (writableAndReturned) Creates(sc Scope) int { return fixtureCount(sc) } // cannot express the difference. That is why the prober builds bodies as maps. type updateStyle struct{} -func (updateStyle) Name() string { return "write.update-style" } -func (updateStyle) Kind() Kind { return KindMutating } +func (updateStyle) Name() string { return "write.update-style" } +func (updateStyle) Kind() ProbeKind { return ProbeKindMutating } // Cost is one create, then a full update, a partial update and a null update, each followed by a // read, then a delete. @@ -327,8 +327,8 @@ func (updateStyle) Creates(sc Scope) int { return needsUpdate(sc, withFixture(sc // "derived from a field this plan did not vary" as standing alternatives. type serverDefault struct{} -func (serverDefault) Name() string { return "write.server-default" } -func (serverDefault) Kind() Kind { return KindMutating } +func (serverDefault) Name() string { return "write.server-default" } +func (serverDefault) Kind() ProbeKind { return ProbeKindMutating } // The most expensive probe in the catalogue: five creates and five reads per candidate // field. Worth every request, because this is the guess sitting in the committed blueprint. @@ -378,8 +378,8 @@ func (serverDefault) Creates(sc Scope) int { // infrastructure; the toolkit's job is to put the evidence in front of the person making it. type immutability struct{} -func (immutability) Name() string { return "write.immutability" } -func (immutability) Kind() Kind { return KindMutating } +func (immutability) Name() string { return "write.immutability" } +func (immutability) Kind() ProbeKind { return ProbeKindMutating } // Cost is, per candidate field: two creates, three reads, three updates and two deletes. // @@ -431,8 +431,8 @@ func (immutability) Creates(sc Scope) int { return needsUpdate(sc, 2*immutabilit // different from one that found nothing. type enumBoundary struct{} -func (enumBoundary) Name() string { return "write.enum" } -func (enumBoundary) Kind() Kind { return KindMutating } +func (enumBoundary) Name() string { return "write.enum" } +func (enumBoundary) Kind() ProbeKind { return ProbeKindMutating } // Cost is a create and a delete per value tried -- every documented value, two generated // negatives, and one case variant per enum field -- plus the escalation worst case: a @@ -503,8 +503,8 @@ func documentedEnumValues(sc Scope) int { // trigger rather than just noticing the correlation once. type writeSideEffect struct{} -func (writeSideEffect) Name() string { return "write.side-effect" } -func (writeSideEffect) Kind() Kind { return KindMutating } +func (writeSideEffect) Name() string { return "write.side-effect" } +func (writeSideEffect) Kind() ProbeKind { return ProbeKindMutating } // Cost is three creates with their reads and deletes: two carrying the trigger, one without. // @@ -540,8 +540,8 @@ func (writeSideEffect) Creates(sc Scope) int { // under-reports rather than reporting wrongly. type normalisation struct{} -func (normalisation) Name() string { return "write.normalisation" } -func (normalisation) Kind() Kind { return KindMutating } +func (normalisation) Name() string { return "write.normalisation" } +func (normalisation) Kind() ProbeKind { return ProbeKindMutating } // Three awkward values per writable string field, each needing a create and a read. // Cost is one create, read and delete per awkward value, with every string field carrying that @@ -580,7 +580,7 @@ func (normalisation) Creates(sc Scope) int { // honest worst case is "any of them". Reporting zero unplanned would tell an operator the most // expensive probe in the catalogue is free. func immutabilityFields(sc Scope) int { - if !sc.Planned { + if !sc.HasScenario { return len(sc.Sendable()) } @@ -618,7 +618,7 @@ func withFixture(sc Scope, perFixture int) int { return fixtureCount(sc) * perFi // omissionCreates counts the requiredness protocol's creates: a baseline plus one omission per key // the fixture actually sets. func omissionCreates(sc Scope) int { - if !sc.Planned { + if !sc.HasScenario { // No fixture, so no keys are known. The unnarrowed worst case is every sendable field, // which is what -list should report rather than a small number that means nothing. return 1 + len(sc.Sendable()) @@ -673,8 +673,8 @@ const negativeEnumCandidates = 2 // the single-culprit bisection and is reported as the untested combination it is. type rehearsal struct{} -func (rehearsal) Name() string { return "write.rehearsal" } -func (rehearsal) Kind() Kind { return KindMutating } +func (rehearsal) Name() string { return "write.rehearsal" } +func (rehearsal) Kind() ProbeKind { return ProbeKindMutating } // rehearsalMaxRounds is the fixpoint cap when the config does not set one. const rehearsalMaxRounds = 3 diff --git a/internal/probe/conditional_test.go b/internal/probe/conditional_test.go index addca44f..64547206 100644 --- a/internal/probe/conditional_test.go +++ b/internal/probe/conditional_test.go @@ -182,7 +182,7 @@ func TestUnit_Probe_AConditionalFactValidatesLikeAnyOther(t *testing.T) { sound := Fact{ Resource: "tag", JSONPath: "matchType", Field: FactRequiredByAPI, - Value: BoolValue(true), Confidence: Observed, Probe: "write.required", + Value: BoolValue(true), Confidence: ConfidenceObserved, Probe: "write.required", Evidence: []string{"i-1"}, Rationale: "refused", When: []Condition{{JSONPath: "objectType", Equals: "endpoint-agent"}}, } @@ -245,7 +245,7 @@ func TestUnit_Probe_AnUnconditionalFactIsUnchanged(t *testing.T) { f := Fact{ Resource: "tag", JSONPath: "colour", Field: FactServerDefault, - Value: TextValue("#A7EB10"), Confidence: Corroborated, Probe: "write.default", + Value: TextValue("#A7EB10"), Confidence: ConfidenceCorroborated, Probe: "write.default", Evidence: []string{"i-1"}, Rationale: "observed", } diff --git a/internal/probe/fact.go b/internal/probe/fact.go index 1b1ef93d..4e919b51 100644 --- a/internal/probe/fact.go +++ b/internal/probe/fact.go @@ -16,35 +16,35 @@ import ( type Confidence string const ( - // Observed means the fact follows from the responses by one unambiguous reading, + // ConfidenceObserved means the fact follows from the responses by one unambiguous reading, // and the sequence eliminated the alternatives named on the fact. - Observed Confidence = "observed" + ConfidenceObserved Confidence = "observed" - // Corroborated means observed twice, with independent fixtures or values. It is + // ConfidenceCorroborated means observed twice, with independent fixtures or values. It is // *required* for Immutable=true and Writable=false, because both of those drive // changes a practitioner cannot work around. - Corroborated Confidence = "corroborated" + ConfidenceCorroborated Confidence = "corroborated" - // Inferred means the fact follows from the responses plus an assumption, which is + // ConfidenceInferred means the fact follows from the responses plus an assumption, which is // stated in Alternatives. Merge may write it into Behaviour but must never let it // change an attribute's presence. - Inferred Confidence = "inferred" + ConfidenceInferred Confidence = "inferred" - // Suspected means one ambiguous observation. Reported, never written. A suspected + // ConfidenceSuspected means one ambiguous observation. Reported, never written. A suspected // fact is a prompt for a human to look, not a conclusion. - Suspected Confidence = "suspected" + ConfidenceSuspected Confidence = "suspected" ) // rank orders confidence, strongest first. func (c Confidence) rank() int { switch c { - case Corroborated: + case ConfidenceCorroborated: return 0 - case Observed: + case ConfidenceObserved: return 1 - case Inferred: + case ConfidenceInferred: return 2 - case Suspected: + case ConfidenceSuspected: return 3 default: return 4 @@ -425,7 +425,7 @@ var knownFactFields = map[FactField]bool{ } var knownConfidence = map[Confidence]bool{ - Observed: true, Corroborated: true, Inferred: true, Suspected: true, + ConfidenceObserved: true, ConfidenceCorroborated: true, ConfidenceInferred: true, ConfidenceSuspected: true, } // SortFacts orders facts so a committed document is byte-stable. diff --git a/internal/probe/fact_test.go b/internal/probe/fact_test.go index a319110a..a9f11cd7 100644 --- a/internal/probe/fact_test.go +++ b/internal/probe/fact_test.go @@ -14,7 +14,7 @@ func validFact() Fact { JSONPath: "colour", Field: FactWritable, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: "write.writable-returned", Evidence: []string{"004-post-tags"}, Rationale: "the value sent was read back unchanged", @@ -78,19 +78,19 @@ func TestUnit_Probe_FactValidate(t *testing.T) { func TestUnit_Probe_ConfidenceOrdering(t *testing.T) { t.Parallel() - if !Corroborated.AtLeast(Observed) { + if !ConfidenceCorroborated.AtLeast(ConfidenceObserved) { t.Error("corroborated must be at least as strong as observed") } - if Observed.AtLeast(Corroborated) { + if ConfidenceObserved.AtLeast(ConfidenceCorroborated) { t.Error("observed must not satisfy a corroborated floor") } - if !Observed.AtLeast(Inferred) { + if !ConfidenceObserved.AtLeast(ConfidenceInferred) { t.Error("observed must be stronger than inferred") } - if Suspected.AtLeast(Inferred) { + if ConfidenceSuspected.AtLeast(ConfidenceInferred) { t.Error("suspected must be the weakest level") } - if Confidence("invented").AtLeast(Suspected) { + if Confidence("invented").AtLeast(ConfidenceSuspected) { t.Error("an unrecognised confidence must not satisfy any floor") } } @@ -225,7 +225,7 @@ func TestUnit_Probe_ValidateShapeChecksPreconditionsAtAnyConfidence(t *testing.T t.Parallel() f := validFact() - f.Confidence = Suspected + f.Confidence = ConfidenceSuspected f.Evidence = nil f.Rationale = "" diff --git a/internal/probe/findings.go b/internal/probe/factset.go similarity index 87% rename from internal/probe/findings.go rename to internal/probe/factset.go index 014da24f..ee06659f 100644 --- a/internal/probe/findings.go +++ b/internal/probe/factset.go @@ -1,6 +1,6 @@ package probe -// Findings is what earlier probes established, readable by later ones. +// FactSet is what earlier probes established, readable by later ones. // // # Why this and not a dependency graph // @@ -23,17 +23,17 @@ package probe // Read-only plus Retract. A probe adds facts by *returning* them, so the runner stays the only // writer -- otherwise two probes could disagree about what is in the report and the last one to // run would win silently. -type Findings struct { +type FactSet struct { facts []Fact } -// NewFindings builds an accumulator over facts already established. -func NewFindings(facts []Fact) *Findings { - return &Findings{facts: append([]Fact(nil), facts...)} +// NewFactSet builds an accumulator over facts already established. +func NewFactSet(facts []Fact) *FactSet { + return &FactSet{facts: append([]Fact(nil), facts...)} } // Add records facts a probe returned. Called by the runner, not by a probe. -func (f *Findings) Add(facts ...Fact) { +func (f *FactSet) Add(facts ...Fact) { f.facts = append(f.facts, facts...) } @@ -41,7 +41,7 @@ func (f *Findings) Add(facts ...Fact) { // // The floor is the caller's, deliberately. A probe that will create objects on the strength of an // earlier conclusion should demand more of it than one merely deciding whether to emit a note. -func (f *Findings) Settled(jsonPath string, claim FactField, floor Confidence) (Fact, bool) { +func (f *FactSet) Settled(jsonPath string, claim FactField, floor Confidence) (Fact, bool) { var ( best Fact found bool @@ -75,7 +75,7 @@ func (f *Findings) Settled(jsonPath string, claim FactField, floor Confidence) ( // // The convenience the one real dependency needs: server-default asking "is this field writable" // wants a yes or a no, not a Fact. -func (f *Findings) True(jsonPath string, claim FactField, floor Confidence) bool { +func (f *FactSet) True(jsonPath string, claim FactField, floor Confidence) bool { fact, ok := f.Settled(jsonPath, claim, floor) if !ok { return false @@ -97,7 +97,7 @@ func (f *Findings) True(jsonPath string, claim FactField, floor Confidence) bool // Retraction removes every variant of the claim, conditional ones included: a disproof of the // path's claim disproves each branch of it, and keeping a branch alive after its parent claim // fell would leave merge a fact whose foundation is gone. -func (f *Findings) Retract(jsonPath string, claim FactField) int { +func (f *FactSet) Retract(jsonPath string, claim FactField) int { kept := make([]Fact, 0, len(f.facts)) removed := 0 @@ -116,7 +116,7 @@ func (f *Findings) Retract(jsonPath string, claim FactField) int { } // Facts returns everything accumulated, for the report. -func (f *Findings) Facts() []Fact { +func (f *FactSet) Facts() []Fact { if f == nil { return nil } diff --git a/internal/probe/findings_test.go b/internal/probe/factset_test.go similarity index 71% rename from internal/probe/findings_test.go rename to internal/probe/factset_test.go index e083e91c..2c6e713a 100644 --- a/internal/probe/findings_test.go +++ b/internal/probe/factset_test.go @@ -24,18 +24,18 @@ func boolFact(path string, field FactField, value bool, conf Confidence) Fact { func TestUnit_Probe_FindingsAnswersTheOneRealDependency(t *testing.T) { t.Parallel() - f := NewFindings([]Fact{ - boolFact("value", FactWritable, true, Observed), - boolFact("colour", FactWritable, false, Observed), + f := NewFactSet([]Fact{ + boolFact("value", FactWritable, true, ConfidenceObserved), + boolFact("colour", FactWritable, false, ConfidenceObserved), }) - if !f.True("value", FactWritable, Observed) { + if !f.True("value", FactWritable, ConfidenceObserved) { t.Error("value was established as writable") } - if f.True("colour", FactWritable, Observed) { + if f.True("colour", FactWritable, ConfidenceObserved) { t.Error("colour was established as NOT writable, which is not the same as unknown") } - if f.True("absent", FactWritable, Observed) { + if f.True("absent", FactWritable, ConfidenceObserved) { t.Error("a field nothing was established about must not read as true") } } @@ -47,12 +47,12 @@ func TestUnit_Probe_FindingsAnswersTheOneRealDependency(t *testing.T) { func TestUnit_Probe_FindingsRespectsTheCallersConfidenceFloor(t *testing.T) { t.Parallel() - f := NewFindings([]Fact{boolFact("value", FactWritable, true, Suspected)}) + f := NewFactSet([]Fact{boolFact("value", FactWritable, true, ConfidenceSuspected)}) - if _, ok := f.Settled("value", FactWritable, Suspected); !ok { + if _, ok := f.Settled("value", FactWritable, ConfidenceSuspected); !ok { t.Error("a suspected fact should satisfy a suspected floor") } - if _, ok := f.Settled("value", FactWritable, Observed); ok { + if _, ok := f.Settled("value", FactWritable, ConfidenceObserved); ok { t.Error("a suspected fact must not satisfy an observed floor") } } @@ -64,21 +64,21 @@ func TestUnit_Probe_FindingsRespectsTheCallersConfidenceFloor(t *testing.T) { func TestUnit_Probe_FindingsPrefersTheStrongestFact(t *testing.T) { t.Parallel() - weakFirst := NewFindings([]Fact{ - boolFact("value", FactWritable, true, Inferred), - boolFact("value", FactWritable, true, Corroborated), + weakFirst := NewFactSet([]Fact{ + boolFact("value", FactWritable, true, ConfidenceInferred), + boolFact("value", FactWritable, true, ConfidenceCorroborated), }) - strongFirst := NewFindings([]Fact{ - boolFact("value", FactWritable, true, Corroborated), - boolFact("value", FactWritable, true, Inferred), + strongFirst := NewFactSet([]Fact{ + boolFact("value", FactWritable, true, ConfidenceCorroborated), + boolFact("value", FactWritable, true, ConfidenceInferred), }) - for name, f := range map[string]*Findings{"weak first": weakFirst, "strong first": strongFirst} { - got, ok := f.Settled("value", FactWritable, Inferred) + for name, f := range map[string]*FactSet{"weak first": weakFirst, "strong first": strongFirst} { + got, ok := f.Settled("value", FactWritable, ConfidenceInferred) if !ok { t.Fatalf("%s: nothing settled", name) } - if got.Confidence != Corroborated { + if got.Confidence != ConfidenceCorroborated { t.Errorf("%s: confidence = %s, want corroborated", name, got.Confidence) } } @@ -92,25 +92,25 @@ func TestUnit_Probe_FindingsPrefersTheStrongestFact(t *testing.T) { func TestUnit_Probe_RetractRemovesADisprovedFact(t *testing.T) { t.Parallel() - f := NewFindings([]Fact{ - boolFact("value", FactWritable, true, Observed), - boolFact("value", FactReturnedOnRead, true, Observed), - boolFact("colour", FactWritable, true, Observed), + f := NewFactSet([]Fact{ + boolFact("value", FactWritable, true, ConfidenceObserved), + boolFact("value", FactReturnedOnRead, true, ConfidenceObserved), + boolFact("colour", FactWritable, true, ConfidenceObserved), }) if got := f.Retract("value", FactWritable); got != 1 { t.Errorf("Retract removed %d, want 1", got) } - if f.True("value", FactWritable, Suspected) { + if f.True("value", FactWritable, ConfidenceSuspected) { t.Error("the retracted fact is still there") } // Only that claim about that path. A retraction that took the neighbours with it would // quietly discard evidence nobody disproved. - if !f.True("value", FactReturnedOnRead, Suspected) { + if !f.True("value", FactReturnedOnRead, ConfidenceSuspected) { t.Error("a different claim about the same path was removed") } - if !f.True("colour", FactWritable, Suspected) { + if !f.True("colour", FactWritable, ConfidenceSuspected) { t.Error("the same claim about a different path was removed") } @@ -128,21 +128,21 @@ func TestUnit_Probe_RetractRemovesADisprovedFact(t *testing.T) { func TestUnit_Probe_AConditionalFactDoesNotSettleAnUnconditionalQuestion(t *testing.T) { t.Parallel() - conditional := boolFact("value", FactWritable, true, Corroborated) + conditional := boolFact("value", FactWritable, true, ConfidenceCorroborated) conditional.When = []Condition{{JSONPath: "type", Equals: "dynamic"}} - f := NewFindings([]Fact{conditional}) + f := NewFactSet([]Fact{conditional}) - if _, ok := f.Settled("value", FactWritable, Inferred); ok { + if _, ok := f.Settled("value", FactWritable, ConfidenceInferred); ok { t.Error("a conditional fact must not settle an unconditional question") } - if f.True("value", FactWritable, Inferred) { + if f.True("value", FactWritable, ConfidenceInferred) { t.Error("True answered an unconditional question from a conditional fact") } // Retract still removes every variant: a disproof of the path's claim disproves each // branch, and a surviving branch would hand merge a fact whose foundation is gone. - other := boolFact("value", FactWritable, true, Corroborated) + other := boolFact("value", FactWritable, true, ConfidenceCorroborated) other.When = []Condition{{JSONPath: "type", Equals: "static"}} f.Add(other) @@ -158,13 +158,13 @@ func TestUnit_Probe_AConditionalFactDoesNotSettleAnUnconditionalQuestion(t *test func TestUnit_Probe_FindingsIsTheRunnersToWrite(t *testing.T) { t.Parallel() - f := NewFindings(nil) + f := NewFactSet(nil) if len(f.Facts()) != 0 { t.Error("a fresh accumulator holds nothing") } - f.Add(boolFact("value", FactWritable, true, Observed)) + f.Add(boolFact("value", FactWritable, true, ConfidenceObserved)) if len(f.Facts()) != 1 { t.Errorf("Facts = %v", f.Facts()) @@ -180,15 +180,15 @@ func TestUnit_Probe_FindingsIsTheRunnersToWrite(t *testing.T) { } // And the constructor copies its input, so the caller's slice is not aliased either. - source := []Fact{boolFact("value", FactWritable, true, Observed)} - built := NewFindings(source) + source := []Fact{boolFact("value", FactWritable, true, ConfidenceObserved)} + built := NewFactSet(source) source[0].JSONPath = "mutated" if built.Facts()[0].JSONPath != "value" { t.Error("NewFindings aliased its argument") } - var none *Findings + var none *FactSet if none.Facts() != nil { t.Error("a nil accumulator must answer safely") } diff --git a/internal/probe/gate.go b/internal/probe/guard.go similarity index 92% rename from internal/probe/gate.go rename to internal/probe/guard.go index ec88d45c..d34ca867 100644 --- a/internal/probe/gate.go +++ b/internal/probe/guard.go @@ -62,16 +62,16 @@ func (m MapEnviron) Lookup(name string) (string, bool) { return v, ok } -// GateOptions is what the caller asked for, as distinct from what the profile allows. -type GateOptions struct { +// GuardOptions is what the caller asked for, as distinct from what the profile allows. +type GuardOptions struct { Mode Mode // AllowMutations is the flag. A request, not an authorisation. AllowMutations bool - Subject Subject - Plan Plan + Subject Subject + Scenario Scenario - // EquivalentSnapshotExists is true when committed evidence was already recorded with an + // EquivalentRecordingExists is true when committed evidence was already recorded with an // identical plan. // // Equivalent, not merely present, and the distinction is the whole condition. A recording @@ -83,17 +83,17 @@ type GateOptions struct { // // A run whose plan differs is new evidence and is allowed. The first write-tier recording // against a resource that only has read-tier evidence is exactly that case. - EquivalentSnapshotExists bool - Force bool + EquivalentRecordingExists bool + Force bool } -// gateInput is everything a condition may look at. +// guardInput is everything a condition may look at. // // One struct rather than a closure over locals, so the table's entries are pure functions of // their input and a test can build any combination it likes. -type gateInput struct { +type guardInput struct { profile Profile - opts GateOptions + opts GuardOptions // token is resolved once, and is the only place the credential appears in this file. token string @@ -109,7 +109,7 @@ type condition struct { // AuthoriseSweep. modes []Mode // check returns "" when satisfied, and otherwise the sentence an operator reads. - check func(gateInput) string + check func(guardInput) string } // minSecretLength is the shortest value worth looking for verbatim. Below it, a match is far @@ -139,11 +139,11 @@ var staticConditions = []condition{ { name: "mode", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { + check: func(in guardInput) string { if in.opts.Mode == ModeRecord { return "" } - return fmt.Sprintf("mutating probes need -mode record, and this is %s; "+ + return fmt.Sprintf("mutating probes need probe record, and this is probe %s; "+ "replay and verify derive facts from a transcript and must never write", in.opts.Mode) }, @@ -151,18 +151,18 @@ var staticConditions = []condition{ { name: "allowMutations", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { + check: func(in guardInput) string { if in.opts.AllowMutations { return "" } - return "--allow-mutations was not given; mutating probes create real objects in " + + return "-allow-mutations was not given; mutating probes create real objects in " + "the tenant the profile points at, so the flag is required every time" }, }, { name: "sandbox", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { + check: func(in guardInput) string { if in.profile.Sandbox { return "" } @@ -172,7 +172,7 @@ var staticConditions = []condition{ { name: "sandboxEvidence", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { + check: func(in guardInput) string { evidence := strings.TrimSpace(in.profile.SandboxEvidence) switch { @@ -194,7 +194,7 @@ var staticConditions = []condition{ { name: "namePrefix", modes: []Mode{ModeRecord, ModeSweep}, - check: func(in gateInput) string { + check: func(in guardInput) string { prefix := in.profile.NamePrefix switch { @@ -214,7 +214,7 @@ var staticConditions = []condition{ { name: "tokenEnv", modes: []Mode{ModeRecord, ModeSweep}, - check: func(in gateInput) string { + check: func(in guardInput) string { if in.profile.TokenEnv == "" { return "the profile names no tokenEnv; the credential is read from an " + "environment variable and must never be in the profile or on a command line" @@ -230,12 +230,12 @@ var staticConditions = []condition{ { name: "noCredentialInProfile", modes: []Mode{ModeRecord, ModeSweep}, - check: func(in gateInput) string { return credentialShaped(in.profile, in.token) }, + check: func(in guardInput) string { return credentialShaped(in.profile, in.token) }, }, { name: "https", modes: []Mode{ModeRecord, ModeSweep}, - check: func(in gateInput) string { + check: func(in guardInput) string { if in.endpoint == nil { return fmt.Sprintf("the endpoint %q is not a URL", in.profile.Endpoint) } @@ -250,7 +250,7 @@ var staticConditions = []condition{ { name: "endpointHostSuffix", modes: []Mode{ModeRecord, ModeSweep}, - check: func(in gateInput) string { + check: func(in guardInput) string { want := in.profile.Assertions.EndpointHostSuffix if want == "" || in.endpoint == nil { return "" @@ -268,7 +268,7 @@ var staticConditions = []condition{ { name: "canMutate", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { + check: func(in guardInput) string { if can, why := in.opts.Subject.CanMutate(); !can { return why } @@ -278,8 +278,8 @@ var staticConditions = []condition{ { name: "plan", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { - if err := in.opts.Plan.Validate(in.opts.Subject); err != nil { + check: func(in guardInput) string { + if err := in.opts.Scenario.Validate(in.opts.Subject); err != nil { return "the probe plan is not usable: " + err.Error() } @@ -287,7 +287,7 @@ var staticConditions = []condition{ // works with no fixture at all -- it reports the unnarrowed worst case. A mutating // run cannot: a fixture is the only source of a body the API will accept, and // without one every probe would abandon its protocol on the first create. - if len(in.opts.Plan.Fixtures) == 0 { + if len(in.opts.Scenario.Fixtures) == 0 { return "the plan declares no fixtures; a mutating probe has no valid request " + "body to build on without at least one" } @@ -298,8 +298,8 @@ var staticConditions = []condition{ { name: "noSnapshotOverwrite", modes: []Mode{ModeRecord}, - check: func(in gateInput) string { - if !in.opts.EquivalentSnapshotExists || in.opts.Force { + check: func(in guardInput) string { + if !in.opts.EquivalentRecordingExists || in.opts.Force { return "" } @@ -438,7 +438,7 @@ func Authorise( ctx context.Context, read ReadSession, p Profile, - opts GateOptions, + opts GuardOptions, env Environ, ) (*Grant, []string, error) { if env == nil { @@ -483,11 +483,11 @@ func Authorise( // AuthoriseSweep is the same table, filtered to what cleaning up needs. // -// Deliberately does not require --allow-mutations: demanding the mutation flag in order to clean +// Deliberately does not require -allow-mutations: demanding the mutation flag in order to clean // up after yourself is perverse, and an operator staring at an orphan table should not have to // re-read the documentation. Deliberately does not check maxExistingObjects either: a tenant // that now fails it may be failing it *because* it is holding your orphans. -func AuthoriseSweep(p Profile, opts GateOptions, env Environ) (*Grant, error) { +func AuthoriseSweep(p Profile, opts GuardOptions, env Environ) (*Grant, error) { if env == nil { env = OSEnviron{} } @@ -517,8 +517,8 @@ func AuthoriseSweep(p Profile, opts GateOptions, env Environ) (*Grant, error) { // The token is read here and held nowhere else in this file: it exists only so the tokenEnv // condition can tell "no variable named" from "named but unset", which are different mistakes // with different fixes. -func inputFor(p Profile, opts GateOptions, env Environ) gateInput { - in := gateInput{profile: p, opts: opts} +func inputFor(p Profile, opts GuardOptions, env Environ) guardInput { + in := guardInput{profile: p, opts: opts} in.token, _ = env.Lookup(p.TokenEnv) // A URL that does not parse leaves endpoint nil, which the https condition reports. Parsed @@ -532,7 +532,7 @@ func inputFor(p Profile, opts GateOptions, env Environ) gateInput { } // checkRuntime performs the assertions that need the tenant to answer. -func checkRuntime(ctx context.Context, read ReadSession, in gateInput) (passed, refusals []string) { +func checkRuntime(ctx context.Context, read ReadSession, in guardInput) (passed, refusals []string) { if read == nil { return nil, []string{"maxExistingObjects: no session was available to check the " + "tenant with, and an unchecked assertion must not read as a passed one"} @@ -582,7 +582,7 @@ func checkRuntime(ctx context.Context, read ReadSession, in gateInput) (passed, // On an empty tenant no object can confirm the scope, and the weaker outcome is recorded // verbatim rather than upgraded. A gate that recorded the strong claim from the weak evidence // would be worse than one that recorded nothing. -func checkAccountGroup(ctx context.Context, read ReadSession, in gateInput) (string, string) { +func checkAccountGroup(ctx context.Context, read ReadSession, in guardInput) (string, string) { want := in.profile.Assertions.AccountGroupID if want == "" { return "", "" diff --git a/internal/probe/gate_test.go b/internal/probe/guard_test.go similarity index 95% rename from internal/probe/gate_test.go rename to internal/probe/guard_test.go index 44050452..daff07ec 100644 --- a/internal/probe/gate_test.go +++ b/internal/probe/guard_test.go @@ -42,12 +42,12 @@ func goodEnv() MapEnviron { return MapEnviron{"TFPFGEN_PROBE_TOKEN": "a-token-value"} } -func goodOptions() GateOptions { - return GateOptions{ +func goodOptions() GuardOptions { + return GuardOptions{ Mode: ModeRecord, AllowMutations: true, Subject: quirkSubject(), - Plan: Plan{Fixtures: []Fixture{ + Scenario: Scenario{Fixtures: []Fixture{ {Name: "minimal", Body: map[string]any{"key": "x"}}, }}, } @@ -64,16 +64,16 @@ func TestUnit_Probe_GateRefusesEachConditionOnItsOwn(t *testing.T) { tests := []struct { condition string profile func(*Profile) - opts func(*GateOptions) + opts func(*GuardOptions) env MapEnviron }{ { condition: "mode", - opts: func(o *GateOptions) { o.Mode = ModeReplay }, + opts: func(o *GuardOptions) { o.Mode = ModeReplay }, }, { condition: "allowMutations", - opts: func(o *GateOptions) { o.AllowMutations = false }, + opts: func(o *GuardOptions) { o.AllowMutations = false }, }, { condition: "sandbox", @@ -132,26 +132,26 @@ func TestUnit_Probe_GateRefusesEachConditionOnItsOwn(t *testing.T) { }, { condition: "canMutate", - opts: func(o *GateOptions) { o.Subject.Create = nil }, + opts: func(o *GuardOptions) { o.Subject.Create = nil }, }, { condition: "canMutate", - opts: func(o *GateOptions) { o.Subject.IDField = "" }, + opts: func(o *GuardOptions) { o.Subject.IDField = "" }, }, { condition: "plan", - opts: func(o *GateOptions) { - o.Plan.Deny = []string{"nonexistent-field"} + opts: func(o *GuardOptions) { + o.Scenario.Deny = []string{"nonexistent-field"} }, }, { // `probe -list` works with no fixture; a mutating run cannot. condition: "plan", - opts: func(o *GateOptions) { o.Plan.Fixtures = nil }, + opts: func(o *GuardOptions) { o.Scenario.Fixtures = nil }, }, { condition: "noSnapshotOverwrite", - opts: func(o *GateOptions) { o.EquivalentSnapshotExists = true }, + opts: func(o *GuardOptions) { o.EquivalentRecordingExists = true }, }, } @@ -202,7 +202,7 @@ func TestUnit_Probe_GateReportsEveryUnmetConditionAtOnce(t *testing.T) { t.Parallel() // Nothing set at all, which is what running the command with no profile looks like. - _, _, err := Authorise(context.Background(), nil, Profile{}, GateOptions{ + _, _, err := Authorise(context.Background(), nil, Profile{}, GuardOptions{ Mode: ModeReplay, Subject: Subject{}, }, MapEnviron{}) @@ -517,7 +517,7 @@ func TestUnit_Probe_AuthoriseSweepIsDeliberatelyWeaker(t *testing.T) { profile := goodProfile() profile.Assertions.MaxExistingObjects = 1 - opts := GateOptions{Mode: ModeSweep, AllowMutations: false} + opts := GuardOptions{Mode: ModeSweep, AllowMutations: false} grant, err := AuthoriseSweep(profile, opts, goodEnv()) if err != nil { @@ -642,19 +642,19 @@ func TestUnit_Probe_ACredentialInTheProfileIsRefused(t *testing.T) { // TestUnit_Probe_OSEnvironReadsTheProcess: the production Environ, checked once so the interface // is not the only thing ever exercised. func TestUnit_Probe_OSEnvironReadsTheProcess(t *testing.T) { - t.Setenv("TFPFGEN_TEST_GATE_VAR", "present") + t.Setenv("TFPFGEN_TEST_GUARD_VAR", "present") - if v, ok := (OSEnviron{}).Lookup("TFPFGEN_TEST_GATE_VAR"); !ok || v != "present" { + if v, ok := (OSEnviron{}).Lookup("TFPFGEN_TEST_GUARD_VAR"); !ok || v != "present" { t.Errorf("Lookup = %q, %v", v, ok) } - if _, ok := (OSEnviron{}).Lookup("TFPFGEN_TEST_GATE_ABSENT"); ok { + if _, ok := (OSEnviron{}).Lookup("TFPFGEN_TEST_GUARD_ABSENT"); ok { t.Error("an unset variable must report absent") } // A nil Environ falls back to the process, so a caller cannot accidentally build a gate // that reads nothing and passes. profile := goodProfile() - profile.TokenEnv = "TFPFGEN_TEST_GATE_VAR" + profile.TokenEnv = "TFPFGEN_TEST_GUARD_VAR" if _, _, err := Authorise(context.Background(), nil, profile, goodOptions(), nil); err == nil { t.Fatal("this should still be refused on the runtime tier") diff --git a/internal/probe/ledger.go b/internal/probe/ledger.go index 22ba985c..28b7838e 100644 --- a/internal/probe/ledger.go +++ b/internal/probe/ledger.go @@ -39,20 +39,20 @@ import ( type EntryKind string const ( - // KindIntent is written before a create request is sent. - KindIntent EntryKind = "intent" - // KindCreated resolves an intent: the object exists and we know its identifier. - KindCreated EntryKind = "created" - // KindRejected resolves an intent with no object having been made. + // EntryKindIntent is written before a create request is sent. + EntryKindIntent EntryKind = "intent" + // EntryKindCreated resolves an intent: the object exists and we know its identifier. + EntryKindCreated EntryKind = "created" + // EntryKindRejected resolves an intent with no object having been made. // // A 4xx is reliable evidence of that. A 5xx is not, which is why it resolves to nothing // at all -- see MutatingSession.Create. - KindRejected EntryKind = "rejected" - // KindDeleted resolves a created object: it is gone. - KindDeleted EntryKind = "deleted" - // KindFailed records an attempt that neither created nor cleanly failed. The intent it + EntryKindRejected EntryKind = "rejected" + // EntryKindDeleted resolves a created object: it is gone. + EntryKindDeleted EntryKind = "deleted" + // EntryKindFailed records an attempt that neither created nor cleanly failed. The intent it // belongs to stays outstanding, deliberately. - KindFailed EntryKind = "failed" + EntryKindFailed EntryKind = "failed" ) // LedgerEntry is one ledger line. @@ -100,7 +100,7 @@ func LedgerPath(root, provider, resource string) string { // OpenLedger reads any existing entries and then opens the file for appending. // -// Reading first is what lets `probe -mode sweep` resume a previous run's ledger through the +// Reading first is what lets `probe sweep` resume a previous run's ledger through the // same constructor: a sweep is not a fresh start, it is the continuation of a run that did // not finish. func OpenLedger(path string) (*Ledger, error) { @@ -182,7 +182,7 @@ func ReadLedger(path string) ([]LedgerEntry, error) { // unable to sweep, which is the one thing they need to be able to do. if i == len(lines)-1 { out = append(out, LedgerEntry{ - Kind: KindIntent, Seq: nextSeq(out), Probe: "unknown", + Kind: EntryKindIntent, Seq: nextSeq(out), Probe: "unknown", Reason: "the final ledger line was truncated, so this run may have created " + "an object it never recorded", }) @@ -220,7 +220,7 @@ func (l *Ledger) Intent(probe, path, name string) (int, error) { l.seq++ - e := LedgerEntry{Kind: KindIntent, Seq: l.seq, Probe: probe, Path: path, Name: name} + e := LedgerEntry{Kind: EntryKindIntent, Seq: l.seq, Probe: probe, Path: path, Name: name} if err := l.append(e); err != nil { // The sequence is not rolled back. A gap is harmless; a reused number would make two @@ -274,7 +274,7 @@ func (l *Ledger) append(e LedgerEntry) error { func (l *Ledger) findLocked(seq int) (LedgerEntry, bool) { for _, e := range l.entries { - if e.Seq == seq && e.Kind == KindIntent { + if e.Seq == seq && e.Kind == EntryKindIntent { return e, true } } @@ -354,7 +354,7 @@ func Unresolved(entries []LedgerEntry) []Outstanding { } switch e.Kind { - case KindIntent: + case EntryKindIntent: s.intent = e // An intent almost never carries a reason of its own. The exception is the // synthetic one ReadLedger manufactures for a truncated final line, and that @@ -363,13 +363,13 @@ func Unresolved(entries []LedgerEntry) []Outstanding { if e.Reason != "" { s.reason = e.Reason } - case KindCreated: - s.resolved = KindCreated + case EntryKindCreated: + s.resolved = EntryKindCreated s.id = e.ID - case KindDeleted, KindRejected: + case EntryKindDeleted, EntryKindRejected: s.resolved = e.Kind - case KindFailed: - s.resolved = KindFailed + case EntryKindFailed: + s.resolved = EntryKindFailed s.reason = e.Reason if e.ID != "" { s.id = e.ID @@ -385,14 +385,14 @@ func Unresolved(entries []LedgerEntry) []Outstanding { s := bySeq[seq] switch s.resolved { - case KindDeleted, KindRejected: + case EntryKindDeleted, EntryKindRejected: continue } reason := s.reason switch { case reason != "": - case s.resolved == KindCreated: + case s.resolved == EntryKindCreated: reason = "created and not deleted" default: reason = "the create was issued and its outcome was never recorded, so an object " + @@ -438,7 +438,7 @@ func DirtyError(path, resource string, outstanding []Outstanding) error { } fmt.Fprintf(&b, " %s %s %s\n", id, o.Name, o.Reason) } - fmt.Fprintf(&b, "\nsweep them first:\n tfpluginframeworkgen probe -mode sweep -resource %s "+ + fmt.Fprintf(&b, "\nsweep them first:\n tfpfgen probe sweep -resource %s "+ "-profile \n\nthe ledger is at %s", resource, path) return fmt.Errorf("%w: %s", ErrDirtyLedger, b.String()) diff --git a/internal/probe/ledger_test.go b/internal/probe/ledger_test.go index 72a4edc4..7fd1c6a4 100644 --- a/internal/probe/ledger_test.go +++ b/internal/probe/ledger_test.go @@ -53,7 +53,7 @@ func TestUnit_Probe_LedgerIntentIsDurableBeforeItReturns(t *testing.T) { } got := onDisk[0] - if got.Kind != KindIntent || got.Probe != "write.required" || got.Name == "" { + if got.Kind != EntryKindIntent || got.Probe != "write.required" || got.Name == "" { t.Errorf("entry = %+v", got) } // The name is what the prefix pass matches on, so its absence would make the whole @@ -73,10 +73,10 @@ func TestUnit_Probe_LedgerReconcilesRatherThanEmptying(t *testing.T) { l, _ := tempLedger(t) created, _ := l.Intent("p", "/things", "n1") - if err := l.Resolve(created, KindCreated, "1", 201, ""); err != nil { + if err := l.Resolve(created, EntryKindCreated, "1", 201, ""); err != nil { t.Fatalf("Resolve: %v", err) } - if err := l.Resolve(created, KindDeleted, "1", 204, ""); err != nil { + if err := l.Resolve(created, EntryKindDeleted, "1", 204, ""); err != nil { t.Fatalf("Resolve: %v", err) } @@ -104,18 +104,18 @@ func TestUnit_Probe_LedgerOutstandingCases(t *testing.T) { }{ { // A 4xx is reliable evidence that nothing was created. - name: "rejected", resolve: kind(KindRejected), outstanding: false, + name: "rejected", resolve: kind(EntryKindRejected), outstanding: false, }, { - name: "deleted", resolve: kind(KindDeleted), id: "1", outstanding: false, + name: "deleted", resolve: kind(EntryKindDeleted), id: "1", outstanding: false, }, { - name: "created and not deleted", resolve: kind(KindCreated), id: "1", + name: "created and not deleted", resolve: kind(EntryKindCreated), id: "1", outstanding: true, wantID: "1", wantReason: "created and not deleted", }, { // A 5xx, or a transport error. The object may well exist. - name: "failed", resolve: kind(KindFailed), outstanding: true, + name: "failed", resolve: kind(EntryKindFailed), outstanding: true, }, { // The signature of a crash between sending and reading. No id was ever learned, @@ -181,11 +181,11 @@ func TestUnit_Probe_LedgerSurvivesATruncatedFinalLine(t *testing.T) { t.Fatalf("MkdirAll: %v", err) } - good, err := json.Marshal(LedgerEntry{Kind: KindIntent, Seq: 1, Probe: "p", Name: "n1"}) + good, err := json.Marshal(LedgerEntry{Kind: EntryKindIntent, Seq: 1, Probe: "p", Name: "n1"}) if err != nil { t.Fatalf("Marshal: %v", err) } - resolved, err := json.Marshal(LedgerEntry{Kind: KindDeleted, Seq: 1, Probe: "p"}) + resolved, err := json.Marshal(LedgerEntry{Kind: EntryKindDeleted, Seq: 1, Probe: "p"}) if err != nil { t.Fatalf("Marshal: %v", err) } @@ -223,7 +223,7 @@ func TestUnit_Probe_LedgerSurvivesATruncatedFinalLine(t *testing.T) { } } -// TestUnit_Probe_OpenLedgerResumesAPreviousRun: -mode sweep continues a run that did not +// TestUnit_Probe_OpenLedgerResumesAPreviousRun: probe sweep continues a run that did not // finish, so it must see what that run recorded. func TestUnit_Probe_OpenLedgerResumesAPreviousRun(t *testing.T) { t.Parallel() @@ -236,7 +236,7 @@ func TestUnit_Probe_OpenLedgerResumesAPreviousRun(t *testing.T) { t.Fatalf("OpenLedger: %v", err) } seq, _ := first.Intent("p", "/things", "n1") - if err := first.Resolve(seq, KindCreated, "42", 201, ""); err != nil { + if err := first.Resolve(seq, EntryKindCreated, "42", 201, ""); err != nil { t.Fatalf("Resolve: %v", err) } if err := first.Close(); err != nil { @@ -265,10 +265,10 @@ func TestUnit_Probe_OpenLedgerResumesAPreviousRun(t *testing.T) { } // And resolving the resumed object works, which is what a sweep does. - if err := second.Resolve(42, KindDeleted, "42", 204, ""); err == nil { + if err := second.Resolve(42, EntryKindDeleted, "42", 204, ""); err == nil { t.Error("resolving a sequence that is not an intent should fail") } - if err := second.Resolve(seq, KindDeleted, "42", 204, ""); err != nil { + if err := second.Resolve(seq, EntryKindDeleted, "42", 204, ""); err != nil { t.Errorf("resolving the resumed intent: %v", err) } if !Clean(second.Entries()) { @@ -290,7 +290,7 @@ func TestUnit_Probe_MemoryLedgerWritesNothing(t *testing.T) { if err != nil { t.Fatalf("Intent: %v", err) } - if err := l.Resolve(seq, KindCreated, "1", 201, ""); err != nil { + if err := l.Resolve(seq, EntryKindCreated, "1", 201, ""); err != nil { t.Fatalf("Resolve: %v", err) } @@ -343,7 +343,7 @@ func TestUnit_Probe_DirtyErrorNamesTheFix(t *testing.T) { msg := err.Error() for _, want := range []string{ "2 object(s)", "42", "identifier never recorded", - "-mode sweep", "-resource tag", "/tmp/x/ledger.jsonl", + "probe sweep", "-resource tag", "/tmp/x/ledger.jsonl", } { if !strings.Contains(msg, want) { t.Errorf("the message omits %q:\n%s", want, msg) @@ -354,8 +354,8 @@ func TestUnit_Probe_DirtyErrorNamesTheFix(t *testing.T) { func TestUnit_Probe_LedgerPath(t *testing.T) { t.Parallel() - got := LedgerPath(".tfpluginframeworkgen/probe", "thousandeyes", "tag") - want := filepath.Join(".tfpluginframeworkgen/probe", "thousandeyes", "tag", "ledger.jsonl") + got := LedgerPath(".tfpfgen/probe", "thousandeyes", "tag") + want := filepath.Join(".tfpfgen/probe", "thousandeyes", "tag", "ledger.jsonl") if got != want { t.Errorf("LedgerPath = %q, want %q", got, want) diff --git a/internal/probe/mutate.go b/internal/probe/mutate.go index 6195863a..97b6e4d4 100644 --- a/internal/probe/mutate.go +++ b/internal/probe/mutate.go @@ -123,7 +123,7 @@ func runMutatingProbes( // Seeded with what the read tier established, so a mutating probe's precondition can be // satisfied by a read-tier fact as readily as by an earlier mutating one -- and, later, by a // committed facts document. The precondition is a fact, not a probe. - findings := NewFindings(report.Facts) + findings := NewFactSet(report.Facts) s.cfg.Findings = findings var halt error @@ -134,7 +134,7 @@ func runMutatingProbes( // finish and why. Silence would read as "these probes had nothing to say". report.Probes = append(report.Probes, ProbeOutcome{ Name: p.Name(), - Kind: KindMutating, + Kind: ProbeKindMutating, Status: "skipped", Reason: "the run stopped earlier: " + halt.Error(), }) @@ -176,7 +176,7 @@ func runOneMutating( sc Scope, opts RunOptions, ) (ProbeOutcome, Result, error) { - outcome := ProbeOutcome{Name: p.Name(), Kind: KindMutating} + outcome := ProbeOutcome{Name: p.Name(), Kind: ProbeKindMutating} result, err := exercise(ctx, s, p, sc) diff --git a/internal/probe/mutate_test.go b/internal/probe/mutate_test.go index 0a226386..c0942e3e 100644 --- a/internal/probe/mutate_test.go +++ b/internal/probe/mutate_test.go @@ -77,7 +77,7 @@ func TestUnit_Probe_LedgerWritesIntentBeforeTheRequest(t *testing.T) { t.Errorf("reading the ledger from inside the handler: %v", readErr) } for _, e := range entries { - if e.Kind == KindIntent { + if e.Kind == EntryKindIntent { sawIntent = true sawName = e.Name } @@ -186,13 +186,13 @@ func TestUnit_Probe_CreateStatusClassification(t *testing.T) { outstanding bool wantKind EntryKind }{ - {"created", http.StatusCreated, `{"id":"1"}`, true, KindCreated}, - {"bad request", http.StatusBadRequest, `{"title":"nope"}`, false, KindRejected}, - {"conflict", http.StatusConflict, `{"title":"exists"}`, false, KindRejected}, - {"server error", http.StatusInternalServerError, `{}`, true, KindFailed}, - {"bad gateway", http.StatusBadGateway, ``, true, KindFailed}, + {"created", http.StatusCreated, `{"id":"1"}`, true, EntryKindCreated}, + {"bad request", http.StatusBadRequest, `{"title":"nope"}`, false, EntryKindRejected}, + {"conflict", http.StatusConflict, `{"title":"exists"}`, false, EntryKindRejected}, + {"server error", http.StatusInternalServerError, `{}`, true, EntryKindFailed}, + {"bad gateway", http.StatusBadGateway, ``, true, EntryKindFailed}, // A 2xx whose body carries no identifier: the object exists and cannot be addressed. - {"created with no id", http.StatusCreated, `{"key":"x"}`, true, KindFailed}, + {"created with no id", http.StatusCreated, `{"key":"x"}`, true, EntryKindFailed}, } for _, tc := range tests { @@ -226,7 +226,7 @@ func TestUnit_Probe_CreateStatusClassification(t *testing.T) { var kinds []EntryKind for _, e := range l.Entries() { - if e.Kind != KindIntent { + if e.Kind != EntryKindIntent { kinds = append(kinds, e.Kind) } } @@ -313,7 +313,7 @@ func TestUnit_Probe_InFlightContextIgnoresCancellation(t *testing.T) { type panicProbe struct{} func (panicProbe) Name() string { return "write.panics" } -func (panicProbe) Kind() Kind { return KindMutating } +func (panicProbe) Kind() ProbeKind { return ProbeKindMutating } func (panicProbe) Cost(Scope) int { return 1 } func (panicProbe) Creates(Scope) int { return 1 } @@ -326,7 +326,7 @@ func (panicProbe) Exercise(_ context.Context, _ *MutatingSession, _ Scope) (Resu type createThenPanicProbe struct{} func (createThenPanicProbe) Name() string { return "write.creates-then-panics" } -func (createThenPanicProbe) Kind() Kind { return KindMutating } +func (createThenPanicProbe) Kind() ProbeKind { return ProbeKindMutating } func (createThenPanicProbe) Cost(Scope) int { return 2 } func (createThenPanicProbe) Creates(Scope) int { return 1 } @@ -787,7 +787,7 @@ func TestUnit_Probe_RunWithAGrantSweepsAndReportsIt(t *testing.T) { // skipped. A run where the write tier did nothing must not read as a complete one. var mutating int for _, p := range out.Report.Probes { - if p.Kind != KindMutating { + if p.Kind != ProbeKindMutating { continue } diff --git a/internal/probe/probe.go b/internal/probe/probe.go index 0bd35854..ac8c21d7 100644 --- a/internal/probe/probe.go +++ b/internal/probe/probe.go @@ -3,7 +3,7 @@ // // An OpenAPI document does not record the facts that decide whether a provider // works: which fields are genuinely writable, which are immutable, what the server -// normalises, what it defaults. internal/ingest is faithful to the specification and +// normalises, what it defaults. internal/openapi is faithful to the specification and // therefore inherits its gaps, and the gaps are where perpetual diffs and spurious // replacements come from. This package settles them empirically and commits the HTTP // evidence. @@ -51,19 +51,19 @@ import ( // failure modes are reviewable before any request is issued. var errNotImplemented = errors.New("probe not implemented yet") -// Kind separates probes that only read from probes that change things. +// ProbeKind separates probes that only read from probes that change things. // // It exists for reporting and for -list. The actual enforcement is in the type // system: the two probe interfaces take different session types, so a read-only probe // cannot be given the means to mutate. -type Kind string +type ProbeKind string const ( - // KindRead issues GET requests only. Safe against any API, including production. - KindRead Kind = "read" - // KindMutating creates, updates or deletes. Runs only behind the full gating - // conjunction in gate.go. - KindMutating Kind = "mutating" + // ProbeKindRead issues GET requests only. Safe against any API, including production. + ProbeKindRead ProbeKind = "read" + // ProbeKindMutating creates, updates or deletes. Runs only behind the full gating + // conjunction in guard.go. + ProbeKindMutating ProbeKind = "mutating" ) // Response is one HTTP response, as much of it as a probe is allowed to see. @@ -120,7 +120,7 @@ type ReadProbe interface { // Kind is always KindRead. Stated rather than assumed so -list and the runner // need no type switch. - Kind() Kind + Kind() ProbeKind // Cost is the worst-case number of requests this probe will issue against the // scope. It is what lets a plan be budgeted before anything is sent, and it is @@ -146,7 +146,7 @@ type ReadProbe interface { // adding a call, and the session type it receives can only be constructed from a Grant. type MutatingProbe interface { Name() string - Kind() Kind + Kind() ProbeKind Cost(Scope) int // Creates is the worst-case number of objects this probe brings into existence. @@ -215,7 +215,7 @@ func mustBeNamed(name string) { // probe do not have to care which interface it implements. type Entry struct { Name string - Kind Kind + Kind ProbeKind // Cost is the worst-case request count against a given subject. Cost int // Creates is the worst-case number of objects created. Zero for every read probe, @@ -232,12 +232,12 @@ func Catalogue(sc Scope) []Entry { out := make([]Entry, 0, len(readProbes)+len(mutatingProbes)) for _, p := range readProbes { - out = append(out, Entry{Name: p.Name(), Kind: KindRead, Cost: p.Cost(sc)}) + out = append(out, Entry{Name: p.Name(), Kind: ProbeKindRead, Cost: p.Cost(sc)}) } for _, p := range mutatingProbes { out = append(out, Entry{ Name: p.Name(), - Kind: KindMutating, + Kind: ProbeKindMutating, Cost: p.Cost(sc), Creates: p.Creates(sc), }) @@ -245,7 +245,7 @@ func Catalogue(sc Scope) []Entry { sort.SliceStable(out, func(i, j int) bool { if out[i].Kind != out[j].Kind { - return out[i].Kind == KindRead + return out[i].Kind == ProbeKindRead } return out[i].Name < out[j].Name }) @@ -257,12 +257,12 @@ func Catalogue(sc Scope) []Entry { func Lookup(name string) (Entry, bool) { for _, p := range readProbes { if p.Name() == name { - return Entry{Name: p.Name(), Kind: KindRead}, true + return Entry{Name: p.Name(), Kind: ProbeKindRead}, true } } for _, p := range mutatingProbes { if p.Name() == name { - return Entry{Name: p.Name(), Kind: KindMutating}, true + return Entry{Name: p.Name(), Kind: ProbeKindMutating}, true } } return Entry{}, false diff --git a/internal/probe/probe_test.go b/internal/probe/probe_test.go index 2c516596..b68e1712 100644 --- a/internal/probe/probe_test.go +++ b/internal/probe/probe_test.go @@ -56,7 +56,7 @@ func TestUnit_Probe_CatalogueIsWellFormed(t *testing.T) { } seen[e.Name] = true - if e.Kind != KindRead && e.Kind != KindMutating { + if e.Kind != ProbeKindRead && e.Kind != ProbeKindMutating { t.Errorf("%s: kind = %q, want read or mutating", e.Name, e.Kind) } if e.Cost < 0 || e.Creates < 0 { @@ -64,7 +64,7 @@ func TestUnit_Probe_CatalogueIsWellFormed(t *testing.T) { } // A read probe that reports creating something would be a registration error // with real consequences: it would be run without the gate. - if e.Kind == KindRead && e.Creates != 0 { + if e.Kind == ProbeKindRead && e.Creates != 0 { t.Errorf("%s is registered as read-only but claims %d creates", e.Name, e.Creates) } } @@ -72,7 +72,7 @@ func TestUnit_Probe_CatalogueIsWellFormed(t *testing.T) { // Read-first ordering, because that is the order they run in. sawMutating := false for _, e := range entries { - if e.Kind == KindMutating { + if e.Kind == ProbeKindMutating { sawMutating = true } else if sawMutating { t.Errorf("%s (read) is listed after a mutating probe; the catalogue must be read-first", e.Name) @@ -90,12 +90,12 @@ func TestUnit_Probe_KindMatchesRegistration(t *testing.T) { t.Parallel() for _, p := range ReadProbes("") { - if p.Kind() != KindRead { + if p.Kind() != ProbeKindRead { t.Errorf("%s is registered as read-only but reports Kind %q", p.Name(), p.Kind()) } } for _, p := range MutatingProbes("") { - if p.Kind() != KindMutating { + if p.Kind() != ProbeKindMutating { t.Errorf("%s is registered as mutating but reports Kind %q", p.Name(), p.Kind()) } } diff --git a/internal/probe/probes_read.go b/internal/probe/probes_read.go index f4a87c3c..85fb95f4 100644 --- a/internal/probe/probes_read.go +++ b/internal/probe/probes_read.go @@ -51,7 +51,7 @@ func (p unknownParamTolerance) Observe( Resource: subj.Resource, Field: FactUnknownParamTolerated, Value: BoolValue(tolerated), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{evidenceID(1, "GET", s.CollectionPath())}, Rationale: fmt.Sprintf( @@ -107,7 +107,7 @@ func (p notFoundShape) Observe(ctx context.Context, s ReadSession, sc Scope) (Re Resource: subj.Resource, Field: FactNotFoundIsSuccess, Value: BoolValue(resp.Status == 404), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, Rationale: fmt.Sprintf("reading an absent object answered %d with a %s error body", @@ -121,7 +121,7 @@ func (p notFoundShape) Observe(ctx context.Context, s ReadSession, sc Scope) (Re Resource: subj.Resource, Field: FactErrorEnvelope, Value: TextValue(fmt.Sprintf("%d=%s", resp.Status, e.Envelope)), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, Rationale: fmt.Sprintf("a %d response used the %s error shape", resp.Status, e.Envelope), @@ -191,7 +191,7 @@ func (p listShape) Observe(ctx context.Context, s ReadSession, sc Scope) (Result Resource: subj.Resource, Field: FactErrorEnvelope, Value: TextValue("listEnvelopeKey=" + key), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{evidenceID(1, "GET", s.CollectionPath())}, Rationale: fmt.Sprintf("the list response wraps its items under %q", key), @@ -303,7 +303,7 @@ func (p volatileOnRead) Observe(ctx context.Context, s ReadSession, sc Scope) (R JSONPath: field, Field: FactVolatile, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, Rationale: fmt.Sprintf( @@ -377,7 +377,7 @@ func integralFacts(sc Scope, probeName string, objects []map[string]any, evidenc JSONPath: f.JSONPath, Field: FactIntegral, Value: BoolValue(true), - Confidence: Inferred, + Confidence: ConfidenceInferred, Probe: probeName, Evidence: evidence, Rationale: fmt.Sprintf( @@ -479,7 +479,7 @@ func (p errorEnvelope) Observe(ctx context.Context, s ReadSession, sc Scope) (Re Resource: subj.Resource, Field: FactErrorEnvelope, Value: TextValue(fmt.Sprintf("%d=%s", resp.Status, e.Envelope)), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{evidenceID(i+1, "GET", s.CollectionPath())}, Rationale: fmt.Sprintf( @@ -500,7 +500,7 @@ func (p errorEnvelope) Observe(ctx context.Context, s ReadSession, sc Scope) (Re Resource: subj.Resource, Field: FactErrorEnvelope, Value: TextValue(fmt.Sprintf("namesOffendingField=%t", e.Detail != "")), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{evidenceID(i+1, "GET", s.CollectionPath())}, Rationale: "whether the error body carries a detail naming what was wrong decides " + @@ -579,7 +579,7 @@ func (p returnedOnReadWeak) Observe( JSONPath: path, Field: FactReturnedOnRead, Value: BoolValue(false), - Confidence: Suspected, + Confidence: ConfidenceSuspected, Probe: p.Name(), Evidence: []string{evidenceID(2, "GET", s.ItemPath(id))}, Rationale: "the field was absent from a read of one existing object", diff --git a/internal/probe/probes_rehearsal.go b/internal/probe/probes_rehearsal.go index 28b491a3..0e2afb74 100644 --- a/internal/probe/probes_rehearsal.go +++ b/internal/probe/probes_rehearsal.go @@ -378,7 +378,7 @@ func (p rehearsal) contrast( } held, outcome := current.LookupField(k) - if outcome != Present || fmt.Sprint(held) != fmt.Sprint(v) { + if outcome != OutcomePresent || fmt.Sprint(held) != fmt.Sprint(v) { continue } @@ -486,7 +486,7 @@ func (p rehearsal) concludeNeverRead(sc Scope, path string, a, b *hopSet, out *R return false, "" } v, outcome := h.afterMax.LookupField(path) - return outcome == Absent || (outcome == Present && v == nil), h.afterMax.Interaction + return outcome == OutcomeAbsent || (outcome == OutcomePresent && v == nil), h.afterMax.Interaction } nulledA, evA := nulled(a) @@ -494,10 +494,10 @@ func (p rehearsal) concludeNeverRead(sc Scope, path string, a, b *hopSet, out *R return } - confidence := Observed + confidence := ConfidenceObserved evidence := []string{evA} if nulledB, evB := nulled(b); nulledB { - confidence = Corroborated + confidence = ConfidenceCorroborated evidence = appendUnique(evidence, evB) } @@ -521,11 +521,11 @@ func (p rehearsal) concludeUpdateEcho(sc Scope, path string, sent any, a *hopSet } value, outcome := a.updateEcho.LookupField(path) - if outcome == Ambiguous { + if outcome == OutcomeAmbiguous { return } - echoed := outcome == Present && value != nil + echoed := outcome == OutcomePresent && value != nil rationale := "the update response carried the field it was sent" if !echoed { rationale = "the update response did not carry this field although the update sent it" @@ -536,7 +536,7 @@ func (p rehearsal) concludeUpdateEcho(sc Scope, path string, sent any, a *hopSet JSONPath: path, Field: FactReturnedOnUpdate, Value: BoolValue(echoed), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{a.updateEcho.Interaction}, Rationale: rationale, @@ -560,7 +560,7 @@ func (p rehearsal) concludeForced( return nil, false } v, outcome := h.afterMax.LookupField(path) - return v, outcome == Present && v != nil + return v, outcome == OutcomePresent && v != nil } va, okA := stored(a) @@ -573,10 +573,10 @@ func (p rehearsal) concludeForced( // separator: a transform of a string still contains or resembles it, but the // decisive evidence is the second path storing the identical value. evidence := []string{a.afterMax.Interaction} - confidence := Observed + confidence := ConfidenceObserved if vb, okB := stored(b); okB && fmt.Sprint(vb) == fmt.Sprint(va) { - confidence = Corroborated + confidence = ConfidenceCorroborated evidence = appendUnique(evidence, b.afterMax.Interaction) } @@ -599,7 +599,7 @@ func (p rehearsal) concludeForced( } func corroboratedSuffix(c Confidence) string { - if c == Corroborated { + if c == ConfidenceCorroborated { return " and the create path stored the same value" } return "" @@ -624,11 +624,11 @@ func (p rehearsal) concludeDowngrade( before, outcomeBefore := a.afterMax.LookupField(path) after, outcomeAfter := a.afterDown.LookupField(path) - if outcomeBefore != Present || outcomeAfter == Ambiguous { + if outcomeBefore != OutcomePresent || outcomeAfter == OutcomeAmbiguous { return } - held := outcomeAfter == Present && after != nil + held := outcomeAfter == OutcomePresent && after != nil if held && fmt.Sprint(after) == fmt.Sprint(before) { return // preserved: merge semantics, updateStyle's fact already covers it } @@ -637,12 +637,12 @@ func (p rehearsal) concludeDowngrade( } // Reverted to a constant that is neither the stored value nor absence. - confidence := Inferred + confidence := ConfidenceInferred evidence := []string{a.afterDown.Interaction} if b != nil && b.afterDown != nil { - if vb, outcome := b.afterDown.LookupField(path); outcome == Present && + if vb, outcome := b.afterDown.LookupField(path); outcome == OutcomePresent && fmt.Sprint(vb) == fmt.Sprint(after) { - confidence = Corroborated + confidence = ConfidenceCorroborated evidence = appendUnique(evidence, b.afterDown.Interaction) } } @@ -652,7 +652,7 @@ func (p rehearsal) concludeDowngrade( JSONPath: path, Field: FactUpdateResets, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{a.afterDown.Interaction}, Rationale: fmt.Sprintf("held %v, was omitted from an update, and read back %v "+ @@ -757,7 +757,7 @@ func (p rehearsal) suppressedCandidates(sc Scope, round RehearsalRound, a *hopSe if f, ok := sc.Subject.Field(path); !ok || f.Kind.IsNested() || f.Kind.IsCollection() { continue } - if v, outcome := a.afterMax.LookupField(path); outcome == Present && v != nil { + if v, outcome := a.afterMax.LookupField(path); outcome == OutcomePresent && v != nil { continue } out = append(out, path) @@ -807,7 +807,7 @@ func (p rehearsal) bisectOne( return false, "", nil } v, outcome := resp.LookupField(path) - return outcome == Present && v != nil, resp.Interaction, nil + return outcome == OutcomePresent && v != nil, resp.Interaction, nil } // Alone first: if the field does not come back even by itself, no sibling did @@ -874,7 +874,7 @@ func (p rehearsal) bisectOne( JSONPath: path, Field: FactInteractionSuppressed, Value: TextValue(fmt.Sprintf("suppressed when %s is present", culprit)), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{interaction}, When: []Condition{{ diff --git a/internal/probe/probes_rehearsal_test.go b/internal/probe/probes_rehearsal_test.go index 18a5b060..c6030861 100644 --- a/internal/probe/probes_rehearsal_test.go +++ b/internal/probe/probes_rehearsal_test.go @@ -55,7 +55,7 @@ func runRehearsal(t *testing.T, srv *quirkserver.Server, cfg *RehearsalConfig) R out, err := Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: rehearsalSubject(), - Plan: writePlan(), + Scenario: writePlan(), Only: "write.rehearsal", BaseURL: srv.BaseURL(), Redactor: testRedactor(t), @@ -87,7 +87,7 @@ func TestUnit_Probe_RehearsalObservesTheForcedValue(t *testing.T) { if fact.Value.Literal == nil || fact.Value.Literal.Raw != "true" { t.Errorf("forced value = %v, want true", fact.Value) } - if fact.Confidence != Corroborated { + if fact.Confidence != ConfidenceCorroborated { t.Errorf("both write paths stored the same value; want Corroborated, got %s", fact.Confidence) } @@ -121,7 +121,7 @@ func TestUnit_Probe_RehearsalObservesTheUpdateReset(t *testing.T) { if fact.Value.Literal == nil || fact.Value.Literal.Raw != `"grey"` { t.Errorf("updateDefault = %v, want \"grey\"", fact.Value) } - if fact.Confidence != Corroborated { + if fact.Confidence != ConfidenceCorroborated { t.Errorf("both directions' downgrades agreed; want Corroborated, got %s", fact.Confidence) } } @@ -146,7 +146,7 @@ func TestUnit_Probe_RehearsalBisectsTheSuppressingSibling(t *testing.T) { if len(fact.When) != 1 || fact.When[0].JSONPath != "requestMethod" { t.Errorf("the fact must name the culprit as a precondition: %+v", fact.When) } - if fact.Confidence != Observed { + if fact.Confidence != ConfidenceObserved { t.Errorf("a bisected culprit is Observed, got %s", fact.Confidence) } @@ -187,7 +187,7 @@ func TestUnit_Probe_RehearsalEchoesFeedReturnedOnUpdate(t *testing.T) { if fact.Value.Bool == nil || *fact.Value.Bool { t.Errorf("explicit null for a sent value is not returned; got %v", fact.Value) } - if fact.Confidence != Corroborated { + if fact.Confidence != ConfidenceCorroborated { t.Errorf("both directions read null; want Corroborated, got %s", fact.Confidence) } } diff --git a/internal/probe/probes_write.go b/internal/probe/probes_write.go index 0174560d..86fefc16 100644 --- a/internal/probe/probes_write.go +++ b/internal/probe/probes_write.go @@ -227,8 +227,8 @@ func observeEcho(resp *Response, path string) createEcho { value, outcome := resp.LookupField(path) return createEcho{ - echoed: outcome == Present && value != nil, - ambiguous: outcome == Ambiguous, + echoed: outcome == OutcomePresent && value != nil, + ambiguous: outcome == OutcomeAmbiguous, evidence: resp.Interaction, } } @@ -293,7 +293,7 @@ func (p writableAndReturned) concludeCreateEcho( JSONPath: path, Field: FactReturnedOnCreate, Value: BoolValue(rounds[0].echoed), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, Rationale: rationale, @@ -415,7 +415,7 @@ func (p writableAndReturned) readExpanded( func expansionQuery(sc Scope) url.Values { query := url.Values{} - for _, raw := range sc.Plan.Expansions { + for _, raw := range sc.Scenario.Expansions { key, value, found := strings.Cut(raw, "=") if !found { continue @@ -437,14 +437,14 @@ func observe(fixture string, f Field, sent any, bare, expanded *Response) observ value, outcome := bare.LookupField(f.JSONPath) o.readBack, o.outcome = value, outcome - if outcome == Present || expanded == nil { + if outcome == OutcomePresent || expanded == nil { return o } // Absent bare, so try the expansion. A field that appears only here is the trap this probe // exists to catch, and it is recorded as gated rather than as returned: the generated // provider has to ask for it. - if value, outcome := expanded.LookupField(f.JSONPath); outcome == Present { + if value, outcome := expanded.LookupField(f.JSONPath); outcome == OutcomePresent { o.readBack, o.outcome, o.gated = value, outcome, true o.evidence = expanded.Interaction } @@ -544,7 +544,7 @@ func (p writableAndReturned) concludeMixed( ) { outcomes := make([]gatedOutcome, len(rounds)) for i, o := range rounds { - outcomes[i] = gatedOutcome{gates: o.gates, pass: o.outcome == Present} + outcomes[i] = gatedOutcome{gates: o.gates, pass: o.outcome == OutcomePresent} } separator, branches, ok := attributeToGate(outcomes) @@ -630,7 +630,7 @@ func (p writableAndReturned) absentFact(sc Scope, path string, rounds []observat JSONPath: path, Field: FactReturnedOnRead, Value: BoolValue(false), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidenceOf(rounds), Rationale: fmt.Sprintf( @@ -645,9 +645,9 @@ func (p writableAndReturned) absentFact(sc Scope, path string, rounds []observat // returnedFact records a field that came back. func (p writableAndReturned) returnedFact(sc Scope, path string, rounds []observation) Fact { - confidence := Observed + confidence := ConfidenceObserved if len(rounds) > 1 && allPresent(rounds) { - confidence = Corroborated + confidence = ConfidenceCorroborated } return Fact{ @@ -693,7 +693,7 @@ func (p writableAndReturned) writableFact( JSONPath: path, Field: FactWritable, Value: BoolValue(false), - Confidence: Corroborated, + Confidence: ConfidenceCorroborated, Probe: p.Name(), Evidence: evidenceOf(rounds), Rationale: fmt.Sprintf( @@ -709,7 +709,7 @@ func (p writableAndReturned) writableFact( echoed := allEchoed(rounds) - confidence := Corroborated + confidence := ConfidenceCorroborated rationale := "two creates sent distinct values and each read back the value it sent" if !echoed { @@ -741,7 +741,7 @@ func (p writableAndReturned) writableFact( // field is denied -- it is writable and has consequences -- is exactly the reason its existing // guess deserves scrutiny. func (p writableAndReturned) noteDenied(sc Scope, out *Result) { - for _, path := range sc.Plan.Deny { + for _, path := range sc.Scenario.Deny { out.Notes = append(out.Notes, Note{ Resource: sc.Subject.Resource, JSONPath: path, Probe: p.Name(), Message: "the plan denies this field, so nothing was sent for it and whatever the " + @@ -867,7 +867,7 @@ func (p updateStyle) Exercise( // The interstitial read is what makes this settle anything: without it, "the field was never // set" and "the field was cleared" are the same observation. - if _, outcome := before.LookupField(victim.JSONPath); outcome != Present { + if _, outcome := before.LookupField(victim.JSONPath); outcome != OutcomePresent { out.Notes = append(out.Notes, Note{ Resource: sc.Subject.Resource, JSONPath: victim.JSONPath, Probe: p.Name(), Message: "the field chosen to omit did not come back on the read before the update, " + @@ -898,7 +898,7 @@ func (p updateStyle) Exercise( Resource: sc.Subject.Resource, Field: FactUpdateStyle, Value: TextValue(string(blueprint.UpdatePutFull)), - Confidence: Inferred, + Confidence: ConfidenceInferred, Probe: p.Name(), Evidence: []string{update.Interaction}, Rationale: fmt.Sprintf("an update carrying only %s was refused with %d (%s), so a "+ @@ -967,7 +967,7 @@ func (p updateStyle) styleFact(sc Scope, victim Field, before, after *Response) was, _ := before.LookupField(victim.JSONPath) now, outcome := after.LookupField(victim.JSONPath) - survived := outcome == Present && reflect.DeepEqual(was, now) + survived := outcome == OutcomePresent && reflect.DeepEqual(was, now) style := blueprint.UpdatePutFull rationale := fmt.Sprintf( @@ -975,7 +975,7 @@ func (p updateStyle) styleFact(sc Scope, victim Field, before, after *Response) victim.JSONPath) if survived { - style = blueprint.UpdateMergePatch + style = blueprint.UpdatePatchMerge rationale = fmt.Sprintf( "an update omitting %s left it unchanged, so the API merges", victim.JSONPath) } @@ -984,7 +984,7 @@ func (p updateStyle) styleFact(sc Scope, victim Field, before, after *Response) Resource: sc.Subject.Resource, Field: FactUpdateStyle, Value: TextValue(string(style)), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{before.Interaction, after.Interaction}, Rationale: rationale, @@ -1007,7 +1007,7 @@ func (p updateStyle) ignoredFact(sc Scope, sent string, after *Response) (Fact, // returning it -- while the fact below joins on the write field, because that is the // schema attribute the finding is about. got, outcome := after.LookupField(sc.Subject.SweepNameField()) - if outcome != Present { + if outcome != OutcomePresent { return Fact{}, false } @@ -1020,7 +1020,7 @@ func (p updateStyle) ignoredFact(sc Scope, sent string, after *Response) (Fact, JSONPath: sc.Subject.NameField, Field: FactSilentlyIgnoredOnUpdate, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{after.Interaction}, Rationale: fmt.Sprintf( @@ -1066,13 +1066,13 @@ func (p readYourWrites) Exercise( // enabled=false is only Inferred, because one fast success does not prove consistency. So // merge may add a read-back and never remove one: a needless re-read costs a request, and a // missing one costs a failed apply. - confidence := Inferred + confidence := ConfidenceInferred rationale := fmt.Sprintf( "%d object(s) were read immediately after creation and every first read succeeded", measured.Objects) if needed { - confidence = Observed + confidence = ConfidenceObserved rationale = fmt.Sprintf( "%d of %d object(s) were not readable on the first attempt (statuses %s) and became "+ "readable after up to %d retry(ies) at %s", @@ -1137,7 +1137,7 @@ func statusList(statuses []int) string { func anyAmbiguous(rounds []observation) bool { for _, o := range rounds { - if o.outcome == Ambiguous { + if o.outcome == OutcomeAmbiguous { return true } } @@ -1147,7 +1147,7 @@ func anyAmbiguous(rounds []observation) bool { func allAbsent(rounds []observation) bool { for _, o := range rounds { - if o.outcome != Absent { + if o.outcome != OutcomeAbsent { return false } } @@ -1157,7 +1157,7 @@ func allAbsent(rounds []observation) bool { func allPresent(rounds []observation) bool { for _, o := range rounds { - if o.outcome != Present { + if o.outcome != OutcomePresent { return false } } @@ -1168,7 +1168,7 @@ func allPresent(rounds []observation) bool { // allEchoed reports whether every round read back exactly what it sent. func allEchoed(rounds []observation) bool { for _, o := range rounds { - if o.outcome != Present || !reflect.DeepEqual(o.sent, o.readBack) { + if o.outcome != OutcomePresent || !reflect.DeepEqual(o.sent, o.readBack) { return false } } @@ -1734,9 +1734,9 @@ func (p requiredByAPI) requiredFact( } if accepted { - confidence := Observed + confidence := ConfidenceObserved if len(rounds) > 1 { - confidence = Corroborated + confidence = ConfidenceCorroborated } return Fact{ @@ -1760,15 +1760,15 @@ func (p requiredByAPI) requiredFact( } } - confidence := Inferred + confidence := ConfidenceInferred rationale := fmt.Sprintf("a create omitting this field was refused with %d, but the error "+ "body did not name the field, so the refusal may have had another cause", rounds[0].status) if named { - confidence = Observed + confidence = ConfidenceObserved if len(rounds) > 1 { - confidence = Corroborated + confidence = ConfidenceCorroborated } rationale = fmt.Sprintf("a create omitting this field was refused with %d and the error "+ "named the field", rounds[0].status) @@ -1889,7 +1889,7 @@ func (p serverDefault) Exercise( // three outcomes applies. func (p serverDefault) concludeDefaults( sc Scope, - findings *Findings, + findings *FactSet, reads []*Response, out *Result, ) { @@ -1906,14 +1906,14 @@ func (p serverDefault) concludeDefaults( } switch { - case anyOutcome(outcomes, Ambiguous): + case anyOutcome(outcomes, OutcomeAmbiguous): out.Notes = append(out.Notes, Note{ Resource: sc.Subject.Resource, JSONPath: f.JSONPath, Probe: p.Name(), Message: "the read crossed a collection holding more than one element, so no " + "default could be attributed to this path", }) - case !anyOutcome(outcomes, Present): + case !anyOutcome(outcomes, OutcomePresent): // Omitted and still absent: there is nothing to default to. Not a fact -- the API // may simply not return the field, which write.writable-returned reports. out.Notes = append(out.Notes, Note{ @@ -1941,7 +1941,7 @@ func (p serverDefault) concludeDefaults( // all because the field was never settable. func (p serverDefault) classify( sc Scope, - findings *Findings, + findings *FactSet, f Field, values []any, outcomes []FieldOutcome, @@ -1972,7 +1972,7 @@ func (p serverDefault) classify( } stable := len(values) >= 2 && sameValue(values[0], values[1]) && - outcomes[0] == Present && outcomes[1] == Present + outcomes[0] == OutcomePresent && outcomes[1] == OutcomePresent if !stable { out.Facts = append(out.Facts, Fact{ @@ -1980,7 +1980,7 @@ func (p serverDefault) classify( JSONPath: f.JSONPath, Field: FactDefaultIsDerived, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, Rationale: "two byte-identical creates produced different values for this omitted " + @@ -2003,7 +2003,7 @@ func (p serverDefault) classify( JSONPath: f.JSONPath, Field: FactDefaultIsDerived, Value: BoolValue(true), - Confidence: Corroborated, + Confidence: ConfidenceCorroborated, Probe: p.Name(), Evidence: evidence, Rationale: "the value was identical across two byte-identical creates and different " + @@ -2013,9 +2013,9 @@ func (p serverDefault) classify( return } - confidence := Observed + confidence := ConfidenceObserved if len(values) > 2 { - confidence = Corroborated + confidence = ConfidenceCorroborated } out.Facts = append(out.Facts, Fact{ @@ -2039,14 +2039,14 @@ func (p serverDefault) classify( // notADefault reports whether an earlier fact rules this value out as a practitioner-settable // default, and says which fact did it. -func notADefault(findings *Findings, jsonPath string) (string, bool) { - if fact, settled := findings.Settled(jsonPath, FactWritable, Observed); settled { +func notADefault(findings *FactSet, jsonPath string) (string, bool) { + if fact, settled := findings.Settled(jsonPath, FactWritable, ConfidenceObserved); settled { if fact.Value.Bool != nil && !*fact.Value.Bool { return fact.Probe + " established that the API does not store what is sent for it", true } } - if fact, settled := findings.Settled(jsonPath, FactReturnedOnRead, Observed); settled { + if fact, settled := findings.Settled(jsonPath, FactReturnedOnRead, ConfidenceObserved); settled { if fact.Value.Bool != nil && !*fact.Value.Bool { return fact.Probe + " sent a value for it and never saw one come back, so the API " + "assigns this field rather than accepting it", true @@ -2208,7 +2208,7 @@ func (p immutability) probeField( } stored, outcome := before.LookupField(f.JSONPath) - if outcome != Present { + if outcome != OutcomePresent { out.Notes = append(out.Notes, Note{ Resource: sc.Subject.Resource, JSONPath: f.JSONPath, Probe: p.Name(), Message: "the field did not come back on the read after create, so a refused update " + @@ -2296,13 +2296,13 @@ func (p immutability) attempt( if first < 400 { got, outcome := firstRead.LookupField(f.JSONPath) - if outcome == Present && sameValue(got, candidates[0]) { + if outcome == OutcomePresent && sameValue(got, candidates[0]) { out.Facts = append(out.Facts, Fact{ Resource: sc.Subject.Resource, JSONPath: f.JSONPath, Field: FactImmutable, Value: BoolValue(false), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{firstRead.Interaction}, Rationale: fmt.Sprintf("an update changed this field from %v to %v and the read "+ @@ -2319,7 +2319,7 @@ func (p immutability) attempt( JSONPath: f.JSONPath, Field: FactSilentlyIgnoredOnUpdate, Value: BoolValue(true), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{firstRead.Interaction}, Rationale: fmt.Sprintf("an update to %v answered %d and the field still read back "+ @@ -2355,7 +2355,7 @@ func (p immutability) attempt( JSONPath: f.JSONPath, Field: FactImmutable, Value: BoolValue(false), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: []string{secondRead.Interaction}, Rationale: fmt.Sprintf("an update to %v was refused but an update to %v succeeded, "+ @@ -2378,7 +2378,7 @@ func (p immutability) attempt( JSONPath: f.JSONPath, Field: FactImmutable, Value: BoolValue(true), - Confidence: Corroborated, + Confidence: ConfidenceCorroborated, Probe: p.Name(), Evidence: []string{firstRead.Interaction, secondRead.Interaction}, Rationale: fmt.Sprintf("two distinct values were refused on update (%d and %d) after a "+ @@ -2752,7 +2752,7 @@ func (p enumBoundary) probeEnum( fact := Fact{ Resource: sc.Subject.Resource, JSONPath: f.JSONPath, Field: FactAcceptedValues, Value: ListValue(values), - Confidence: Observed, Probe: p.Name(), Evidence: evidence, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, When: branchWhen[key], } fact.Rationale = fmt.Sprintf( @@ -2763,7 +2763,7 @@ func (p enumBoundary) probeEnum( fact := Fact{ Resource: sc.Subject.Resource, JSONPath: f.JSONPath, Field: FactRejectedValues, Value: ListValue(values), - Confidence: Observed, Probe: p.Name(), Evidence: evidence, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: evidence, When: branchWhen[key], } fact.Rationale = fmt.Sprintf( @@ -2861,7 +2861,7 @@ func (p enumBoundary) concludeEnum(sc Scope, f Field, o enumOutcome, out *Result JSONPath: f.JSONPath, Field: FactAcceptedValues, Value: ListValue(o.accepted), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: o.evidence, Rationale: fmt.Sprintf("%d of the %d documented value(s) were accepted on create", @@ -2877,7 +2877,7 @@ func (p enumBoundary) concludeEnum(sc Scope, f Field, o enumOutcome, out *Result JSONPath: f.JSONPath, Field: FactRejectedValues, Value: ListValue(o.rejected), - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: o.evidence, Rationale: fmt.Sprintf("the specification documents %s but this API refused %s", @@ -2921,7 +2921,7 @@ func (p enumBoundary) concludeEnum(sc Scope, f Field, o enumOutcome, out *Result Value: BoolValue(closed), // Observed either way: both answers rest on what the API did with values this probe // chose, and neither needs a second fixture to be believable. - Confidence: Observed, + Confidence: ConfidenceObserved, Probe: p.Name(), Evidence: o.evidence, Rationale: rationale, @@ -3237,7 +3237,7 @@ func (p normalisation) compare( for _, path := range paths { got, outcome := read.LookupField(path) - if outcome != Present { + if outcome != OutcomePresent { // Absent is write.writable-returned's finding, not this probe's. continue } @@ -3248,12 +3248,12 @@ func (p normalisation) compare( named, identified := t.recognise(sent[path], got) - confidence := Suspected + confidence := ConfidenceSuspected description := fmt.Sprintf("the value came back changed by %q, in a way this probe could "+ "not identify", t.name) if identified { - confidence = Observed + confidence = ConfidenceObserved description = named } @@ -3491,10 +3491,10 @@ func (p writeSideEffect) compareCoupling( b, bOutcome := second.LookupField(f.JSONPath) c, cOutcome := without.LookupField(f.JSONPath) - if aOutcome == Ambiguous || bOutcome == Ambiguous || cOutcome == Ambiguous { + if aOutcome == OutcomeAmbiguous || bOutcome == OutcomeAmbiguous || cOutcome == OutcomeAmbiguous { continue } - if aOutcome == Absent && bOutcome == Absent && cOutcome == Absent { + if aOutcome == OutcomeAbsent && bOutcome == OutcomeAbsent && cOutcome == OutcomeAbsent { continue } @@ -3540,7 +3540,7 @@ func (p writeSideEffect) compareCoupling( JSONPath: trigger.JSONPath, Field: FactSideEffect, Value: TextValue(strings.Join(affected, ", ")), - Confidence: Inferred, + Confidence: ConfidenceInferred, Probe: p.Name(), Evidence: []string{first.Interaction, second.Interaction, without.Interaction}, Rationale: fmt.Sprintf("%s was identical across two byte-identical creates carrying %s "+ diff --git a/internal/probe/probes_write_test.go b/internal/probe/probes_write_test.go index d5b03af7..c7964489 100644 --- a/internal/probe/probes_write_test.go +++ b/internal/probe/probes_write_test.go @@ -18,8 +18,8 @@ import ( // Two fixtures because that is what separates "the server stored what I sent" from "the server // returned its own value" -- the second fixture's differing value is the whole basis of every // writability conclusion below. -func writePlan() Plan { - return Plan{ +func writePlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "a"}}, {Name: "second", Body: map[string]any{"key": "stamped", "value": "b"}}, @@ -38,7 +38,7 @@ func writePlan() Plan { func runWriteProbes( t *testing.T, srv *quirkserver.Server, - plan Plan, + plan Scenario, only string, ) (Report, []cassette.Interaction) { t.Helper() @@ -46,7 +46,7 @@ func runWriteProbes( out, err := Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: quirkSubject(), - Plan: plan, + Scenario: plan, Only: only, BaseURL: srv.BaseURL(), Redactor: testRedactor(t), @@ -105,7 +105,7 @@ func TestUnit_Probe_WritableIsSettledByTwoDistinctValues(t *testing.T) { { name: "a field the API stores", quirks: quirkserver.Quirks{}, - found: true, wantWritable: true, wantAtLeast: Corroborated, + found: true, wantWritable: true, wantAtLeast: ConfidenceCorroborated, }, { // Accepted and thrown away -- and deliberately *no* writability fact. From outside, @@ -121,7 +121,7 @@ func TestUnit_Probe_WritableIsSettledByTwoDistinctValues(t *testing.T) { // conflating the two would mark a perfectly writable field as computed. name: "a field the API normalises", quirks: quirkserver.Quirks{NormalisesCase: []string{"value"}}, - found: true, wantWritable: true, wantAtLeast: Corroborated, + found: true, wantWritable: true, wantAtLeast: ConfidenceCorroborated, }, } @@ -195,7 +195,7 @@ func TestUnit_Probe_OneFixtureCannotSettleWritability(t *testing.T) { // But what the read *did* show is still recorded: the field came back. if fact, ok := factFor(t, report, "value", FactReturnedOnRead); !ok { t.Error("returnedOnRead is observable from one round and should still be recorded") - } else if fact.Confidence != Observed { + } else if fact.Confidence != ConfidenceObserved { t.Errorf("confidence = %s, want observed from a single round", fact.Confidence) } @@ -287,7 +287,7 @@ func TestUnit_Probe_UpdateStyleIsSettledByTheInterstitialRead(t *testing.T) { if fact.Value.Text != tc.want { t.Errorf("updateStyle = %q, want %q (%s)", fact.Value.Text, tc.want, fact.Rationale) } - if fact.Confidence != Observed { + if fact.Confidence != ConfidenceObserved { t.Errorf("confidence = %s, want observed", fact.Confidence) } @@ -391,13 +391,13 @@ func TestUnit_Probe_ReadYourWritesIsAsymmetric(t *testing.T) { name: "a consistent API", quirks: quirkserver.Quirks{}, // Inferred, deliberately: nothing here proves the next write will be visible. - wantEnabled: false, wantConf: Inferred, + wantEnabled: false, wantConf: ConfidenceInferred, }, { name: "an eventually consistent API", quirks: quirkserver.Quirks{EventuallyConsistentReads: 1}, // Observed: the failure was seen. - wantEnabled: true, wantConf: Observed, + wantEnabled: true, wantConf: ConfidenceObserved, }, } @@ -489,7 +489,7 @@ func TestUnit_Probe_ReadYourWritesCreatesNothing(t *testing.T) { func runWriteProbesFast( t *testing.T, srv *quirkserver.Server, - plan Plan, + plan Scenario, only string, ) (Report, []cassette.Interaction) { t.Helper() @@ -497,7 +497,7 @@ func runWriteProbesFast( out, err := Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: quirkSubject(), - Plan: plan, + Scenario: plan, Only: only, BaseURL: srv.BaseURL(), Redactor: testRedactor(t), @@ -544,7 +544,7 @@ func TestUnit_Probe_AMutatingRunReplaysToTheSameFacts(t *testing.T) { replayed, err := Run(context.Background(), RunOptions{ Mode: ModeReplay, Subject: quirkSubject(), - Plan: writePlan(), + Scenario: writePlan(), BaseURL: "https://replay.invalid", Interactions: interactions, // A replay grant: nothing is created, the transport answers from the cassette, and the @@ -579,7 +579,7 @@ func TestUnit_Probe_AMutatingReplayNeedsAGrant(t *testing.T) { out, err := Run(context.Background(), RunOptions{ Mode: ModeReplay, Subject: quirkSubject(), - Plan: writePlan(), + Scenario: writePlan(), BaseURL: "https://replay.invalid", Interactions: interactions, }) @@ -588,7 +588,7 @@ func TestUnit_Probe_AMutatingReplayNeedsAGrant(t *testing.T) { } for _, p := range out.Report.Probes { - if p.Kind == KindMutating && p.Status != "skipped" { + if p.Kind == ProbeKindMutating && p.Status != "skipped" { t.Errorf("%s ran without a grant, status %q", p.Name, p.Status) } } @@ -598,7 +598,7 @@ func TestUnit_Probe_AMutatingReplayNeedsAGrant(t *testing.T) { _, err = Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: quirkSubject(), - Plan: writePlan(), + Scenario: writePlan(), BaseURL: srv.BaseURL(), Redactor: testRedactor(t), Grant: ReplayGrant(testPrefix), @@ -698,8 +698,8 @@ func TestUnit_Probe_TheDeclaredCostIsNeverExceeded(t *testing.T) { // defaultsPlan omits two fields from every fixture, so both are in the omitted set the // server-default protocol observes, and varies one field between fixtures so a derived value can // be told from a constant. -func defaultsPlan() Plan { - return Plan{ +func defaultsPlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "a"}}, {Name: "second", Body: map[string]any{"key": "stamped", "value": "b"}}, @@ -732,7 +732,7 @@ func runAgainst( t *testing.T, srv *quirkserver.Server, subj Subject, - plan Plan, + plan Scenario, only string, ) Report { t.Helper() @@ -740,7 +740,7 @@ func runAgainst( out, err := Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: subj, - Plan: plan, + Scenario: plan, Only: only, BaseURL: srv.BaseURL(), Redactor: testRedactor(t), @@ -779,13 +779,13 @@ func TestUnit_Probe_RequirednessIsAsymmetric(t *testing.T) { // declares no required list. name: "a field the API does not enforce", quirks: quirkserver.Quirks{}, - want: false, wantConf: Corroborated, + want: false, wantConf: ConfidenceCorroborated, }, { // The quirk server names the offending field, which is what earns Observed. name: "a field the API enforces and names", quirks: quirkserver.Quirks{RequiredButUndeclared: []string{"value"}}, - want: true, wantConf: Corroborated, + want: true, wantConf: ConfidenceCorroborated, }, } @@ -866,7 +866,7 @@ func TestUnit_Probe_ConditionalRequirementIsANoteWhenNothingExplainsIt(t *testin Kind: blueprint.KindString, ComputedOptionalRequired: blueprint.Required, Writable: true, }) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "plain", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "ordinary", @@ -913,7 +913,7 @@ func TestUnit_Probe_ADeclaredGateTurnsTheDisagreementIntoFacts(t *testing.T) { Kind: blueprint.KindString, ComputedOptionalRequired: blueprint.Required, Writable: true, }) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "plain", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "ordinary", @@ -994,7 +994,7 @@ func TestUnit_Probe_MixedPresenceWithAGateBecomesBranchFacts(t *testing.T) { AllowedValues: []string{"static", "dynamic"}, }) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "static", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "static", @@ -1068,7 +1068,7 @@ func TestUnit_Probe_MixedPresenceWithoutAGateStaysANote(t *testing.T) { AllowedValues: []string{"static", "dynamic"}, }) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "static", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "static", @@ -1281,7 +1281,7 @@ func TestUnit_Probe_OneFixtureCannotRuleOutDerivation(t *testing.T) { t.Fatalf("no fact: %v (notes %v)", report.Facts, report.Notes) } - if fact.Confidence != Observed { + if fact.Confidence != ConfidenceObserved { t.Errorf("confidence = %s, want observed: one fixture cannot rule out derivation from "+ "the request", fact.Confidence) } @@ -1321,7 +1321,7 @@ func TestUnit_Probe_TheFiveOpenPilotGuessesAreSettled(t *testing.T) { // The fixtures set key and objectType and omit the three computed_optional fields, which is // what makes the two groups observable at all -- exactly how the committed pilot plan is // built. - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "test", @@ -1392,8 +1392,8 @@ func TestUnit_Probe_TheFiveOpenPilotGuessesAreSettled(t *testing.T) { // immutablePlan declares two candidate values for one field, which is the minimum the // immutability fact requires: two distinct values, both refused. -func immutablePlan() Plan { - return Plan{ +func immutablePlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "original"}}, }, @@ -1423,13 +1423,13 @@ func TestUnit_Probe_ImmutabilityRequiresTwoRefusals(t *testing.T) { { name: "a field that cannot be changed", quirks: quirkserver.Quirks{ImmutableAfterCreate: []string{"value"}}, - found: true, wantImmutable: true, wantConf: Corroborated, + found: true, wantImmutable: true, wantConf: ConfidenceCorroborated, }, { // One demonstration is enough for false: it recommends nothing. name: "a field that can be changed", quirks: quirkserver.Quirks{}, - found: true, wantImmutable: false, wantConf: Observed, + found: true, wantImmutable: false, wantConf: ConfidenceObserved, }, } @@ -1597,8 +1597,8 @@ func enumSubject() Subject { return subj } -func enumPlan() Plan { - return Plan{ +func enumPlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "a", "mode": "and"}}, }, @@ -1709,7 +1709,7 @@ func TestUnit_Probe_TheNegativesAreShapedLikeTheDocumentedValues(t *testing.T) { out, err := Run(context.Background(), RunOptions{ Mode: ModeRecord, Subject: enumSubject(), - Plan: enumPlan(), + Scenario: enumPlan(), Only: "write.enum", BaseURL: srv.BaseURL(), Redactor: testRedactor(t), @@ -1875,7 +1875,7 @@ func TestUnit_Probe_AnIdentifiedTransformIsObservedAndAVagueOneIsSuspected(t *te if !strings.Contains(fact.Value.Text, tc.wantSay) { t.Errorf("fact says %q, want it to mention %q", fact.Value.Text, tc.wantSay) } - if fact.Confidence != Observed { + if fact.Confidence != ConfidenceObserved { t.Errorf("confidence = %s, want observed for an identified transform", fact.Confidence) } @@ -1983,8 +1983,8 @@ func sideEffectSubject() Subject { return subj } -func sideEffectPlan() Plan { - return Plan{ +func sideEffectPlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "a"}}, }, @@ -2018,7 +2018,7 @@ func TestUnit_Probe_ASideEffectIsConfirmedByPerturbingTheTrigger(t *testing.T) { // Inferred even after confirmation: "the server set it in response to this request" and "the // server always sets it" are different claims, and one perturbation establishes only the first. - if fact.Confidence != Inferred { + if fact.Confidence != ConfidenceInferred { t.Errorf("confidence = %s, want inferred", fact.Confidence) } if len(fact.Alternatives) < 2 { @@ -2111,7 +2111,7 @@ func TestUnit_Probe_TheWholeCatalogueRunsAndSweepsClean(t *testing.T) { Kind: blueprint.KindString, ComputedOptionalRequired: blueprint.Optional, Writable: true, }) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "first", Body: map[string]any{"key": "stamped", "value": "a"}}, {Name: "second", Body: map[string]any{"key": "stamped", "value": "b"}}, @@ -2181,7 +2181,7 @@ func TestUnit_Probe_ARefusedEnumCandidateEscalatesIntoOtherFixtures(t *testing.T }, ) - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{ {Name: "static", Body: map[string]any{ "key": "stamped", "value": "a", "objectType": "static", "mode": "and", @@ -2249,7 +2249,7 @@ func TestUnit_Probe_TheCreateResponseIsEvidenceUnderTheCurrentRevision(t *testin subj.EvidenceRev = CurrentEvidenceRev out, err := Run(context.Background(), RunOptions{ - Mode: ModeRecord, Subject: subj, Plan: writePlan(), + Mode: ModeRecord, Subject: subj, Scenario: writePlan(), Only: "write.writable-returned", BaseURL: srv.BaseURL(), Redactor: testRedactor(t), Grant: &Grant{namePrefix: testPrefix}, Ledger: MemoryLedger(), @@ -2279,7 +2279,7 @@ func TestUnit_Probe_TheCreateResponseIsEvidenceUnderTheCurrentRevision(t *testin subj.EvidenceRev = CurrentEvidenceRev out, err := Run(context.Background(), RunOptions{ - Mode: ModeRecord, Subject: subj, Plan: writePlan(), + Mode: ModeRecord, Subject: subj, Scenario: writePlan(), Only: "write.writable-returned", BaseURL: srv.BaseURL(), Redactor: testRedactor(t), Grant: &Grant{namePrefix: testPrefix}, Ledger: MemoryLedger(), diff --git a/internal/probe/quirkserver/quirkserver.go b/internal/probe/quirkserver/quirkserver.go index e7461bd8..ffc4f878 100644 --- a/internal/probe/quirkserver/quirkserver.go +++ b/internal/probe/quirkserver/quirkserver.go @@ -26,27 +26,16 @@ import ( "strconv" "strings" "sync" -) - -// EnvelopeKind is one of the error body shapes a real API uses. -// -// Four, because an API can genuinely use all four across one endpoint family -- see -// internal/probe/apierr. A prober that assumed one shape could not tell "rejected because the -// field is immutable" from "rejected because the token expired", and that distinction is what -// makes the immutability protocol possible at all. -type EnvelopeKind string -const ( - // EnvelopeProblem is RFC 7807 application/problem+json, used for validation failures. - EnvelopeProblem EnvelopeKind = "problem" - // EnvelopeOAuth is {"error","error_description"}, returned for an invalid token. - EnvelopeOAuth EnvelopeKind = "oauth" - // EnvelopeLegacy is {"errorMessage"}, returned when no credentials are supplied. - EnvelopeLegacy EnvelopeKind = "legacy" - // EnvelopeEmpty is no body at all, which is what a 404 returns. - EnvelopeEmpty EnvelopeKind = "empty" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe/apierr" ) +// The error body shapes this server can answer with are apierr's Envelope enum: +// the server and the classifier must agree on the shapes, so they are defined once, +// in apierr. A prober that assumed one shape could not tell "rejected because the +// field is immutable" from "rejected because the token expired", and that distinction +// is what makes the immutability protocol possible at all. + // Conditional describes a requirement that depends on another field's value. // // The archetypal case is a port field that matters only when a protocol field says tcp. It is @@ -152,7 +141,7 @@ type Quirks struct { EventuallyConsistentReads int // ErrorEnvelope selects which shape errors take. Defaults to problem+json. - ErrorEnvelope EnvelopeKind + ErrorEnvelope apierr.Envelope // ClosedEnum rejects values outside the listed set, per field. ClosedEnum map[string][]string @@ -844,12 +833,12 @@ func (s *Server) notFound(w http.ResponseWriter) { // fail writes an error in whichever envelope the quirks select. func (s *Server) fail(w http.ResponseWriter, status int, title, detail string) { switch s.quirks.ErrorEnvelope { - case EnvelopeEmpty: + case apierr.EnvelopeEmpty: // No body at all, which is what a real 404 returns and what the error classifier // has to have a fallback for. w.WriteHeader(status) - case EnvelopeOAuth: + case apierr.EnvelopeOAuth: w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(map[string]any{ @@ -857,14 +846,14 @@ func (s *Server) fail(w http.ResponseWriter, status int, title, detail string) { "error_description": joinDetail(title, detail), }) - case EnvelopeLegacy: + case apierr.EnvelopeLegacy: w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(map[string]any{ "errorMessage": joinDetail(title, detail), }) - case EnvelopeProblem, "": + case apierr.EnvelopeProblem, "": w.Header().Set("Content-Type", "application/problem+json") w.WriteHeader(status) body := map[string]any{ diff --git a/internal/probe/quirkserver/quirkserver_test.go b/internal/probe/quirkserver/quirkserver_test.go index 60e071b8..96524cb5 100644 --- a/internal/probe/quirkserver/quirkserver_test.go +++ b/internal/probe/quirkserver/quirkserver_test.go @@ -8,6 +8,8 @@ import ( "net/http" "strings" "testing" + + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe/apierr" ) // client is a plain HTTP client; these tests are about the server. @@ -406,11 +408,11 @@ func TestUnit_Quirkserver_EachQuirkIsExhibited(t *testing.T) { // All four shapes the real API uses. A prober that assumed one could not tell // "rejected because immutable" from "rejected because the token expired". - tests := map[EnvelopeKind]func(map[string]any) bool{ - EnvelopeProblem: func(b map[string]any) bool { _, ok := b["title"]; return ok }, - EnvelopeOAuth: func(b map[string]any) bool { _, ok := b["error_description"]; return ok }, - EnvelopeLegacy: func(b map[string]any) bool { _, ok := b["errorMessage"]; return ok }, - EnvelopeEmpty: func(b map[string]any) bool { return len(b) == 0 }, + tests := map[apierr.Envelope]func(map[string]any) bool{ + apierr.EnvelopeProblem: func(b map[string]any) bool { _, ok := b["title"]; return ok }, + apierr.EnvelopeOAuth: func(b map[string]any) bool { _, ok := b["error_description"]; return ok }, + apierr.EnvelopeLegacy: func(b map[string]any) bool { _, ok := b["errorMessage"]; return ok }, + apierr.EnvelopeEmpty: func(b map[string]any) bool { return len(b) == 0 }, } for kind, check := range tests { diff --git a/internal/probe/report.go b/internal/probe/report.go index f4c89536..da5c070f 100644 --- a/internal/probe/report.go +++ b/internal/probe/report.go @@ -59,8 +59,8 @@ type ProfileSummary struct { // ProbeOutcome is what one probe did. type ProbeOutcome struct { - Name string `json:"name"` - Kind Kind `json:"kind"` + Name string `json:"name"` + Kind ProbeKind `json:"kind"` // Status is one of "ok", "skipped", "abandoned" or "failed". // @@ -155,7 +155,7 @@ func (r *Report) Sort() { sort.SliceStable(r.Probes, func(i, j int) bool { if r.Probes[i].Kind != r.Probes[j].Kind { - return r.Probes[i].Kind == KindRead + return r.Probes[i].Kind == ProbeKindRead } return r.Probes[i].Name < r.Probes[j].Name }) diff --git a/internal/probe/report_test.go b/internal/probe/report_test.go index 1bcf9435..ea1eb6a0 100644 --- a/internal/probe/report_test.go +++ b/internal/probe/report_test.go @@ -17,10 +17,10 @@ func TestUnit_Probe_ReportSummary(t *testing.T) { r := Report{ Probes: []ProbeOutcome{ - {Name: "read.volatile", Kind: KindRead, Status: "ok", Requests: 3, Facts: 1}, - {Name: "read.list-shape", Kind: KindRead, Status: "skipped", Reason: "empty collection"}, - {Name: "write.immutability", Kind: KindMutating, Status: "abandoned", Reason: "control request failed"}, - {Name: "write.enum", Kind: KindMutating, Status: "failed", Reason: "429"}, + {Name: "read.volatile", Kind: ProbeKindRead, Status: "ok", Requests: 3, Facts: 1}, + {Name: "read.list-shape", Kind: ProbeKindRead, Status: "skipped", Reason: "empty collection"}, + {Name: "write.immutability", Kind: ProbeKindMutating, Status: "abandoned", Reason: "control request failed"}, + {Name: "write.enum", Kind: ProbeKindMutating, Status: "failed", Reason: "429"}, }, Facts: []Fact{validFact()}, Notes: []Note{{Resource: "tag", Message: "no fixtures"}}, @@ -70,9 +70,9 @@ func TestUnit_Probe_ReportSortIsDeterministic(t *testing.T) { {Resource: "agent", Message: "z"}, }, Probes: []ProbeOutcome{ - {Name: "write.enum", Kind: KindMutating}, - {Name: "read.volatile", Kind: KindRead}, - {Name: "read.list-shape", Kind: KindRead}, + {Name: "write.enum", Kind: ProbeKindMutating}, + {Name: "read.volatile", Kind: ProbeKindRead}, + {Name: "read.list-shape", Kind: ProbeKindRead}, }, Orphans: []Orphan{{ID: "9"}, {ID: "1"}}, } @@ -86,7 +86,7 @@ func TestUnit_Probe_ReportSortIsDeterministic(t *testing.T) { t.Errorf("notes are not sorted: %v", r.Notes) } // Read probes first, matching the catalogue and the order they run in. - if r.Probes[0].Kind != KindRead || r.Probes[0].Name != "read.list-shape" { + if r.Probes[0].Kind != ProbeKindRead || r.Probes[0].Name != "read.list-shape" { t.Errorf("probes are not sorted read-first by name: %v", r.Probes) } if r.Orphans[0].ID != "1" { @@ -100,19 +100,19 @@ func TestUnit_Probe_FactsAtLeast(t *testing.T) { t.Parallel() r := Report{Facts: []Fact{ - {Resource: "a", Confidence: Corroborated}, - {Resource: "b", Confidence: Observed}, - {Resource: "c", Confidence: Inferred}, - {Resource: "d", Confidence: Suspected}, + {Resource: "a", Confidence: ConfidenceCorroborated}, + {Resource: "b", Confidence: ConfidenceObserved}, + {Resource: "c", Confidence: ConfidenceInferred}, + {Resource: "d", Confidence: ConfidenceSuspected}, }} - if got := len(r.FactsAtLeast(Corroborated)); got != 1 { + if got := len(r.FactsAtLeast(ConfidenceCorroborated)); got != 1 { t.Errorf("corroborated floor gave %d facts, want 1", got) } - if got := len(r.FactsAtLeast(Observed)); got != 2 { + if got := len(r.FactsAtLeast(ConfidenceObserved)); got != 2 { t.Errorf("observed floor gave %d facts, want 2", got) } - if got := len(r.FactsAtLeast(Suspected)); got != 4 { + if got := len(r.FactsAtLeast(ConfidenceSuspected)); got != 4 { t.Errorf("suspected floor gave %d facts, want 4", got) } } diff --git a/internal/probe/run.go b/internal/probe/run.go index 0275337b..889a22ab 100644 --- a/internal/probe/run.go +++ b/internal/probe/run.go @@ -28,9 +28,9 @@ const ( // RunOptions is what a run needs. type RunOptions struct { - Mode Mode - Subject Subject - Plan Plan + Mode Mode + Subject Subject + Scenario Scenario // Only restricts the run to one probe by name. Only string @@ -143,7 +143,7 @@ func Run(ctx context.Context, opts RunOptions) (RunResult, error) { Token: opts.Token, CollectionTemplate: opts.Subject.CollectionTemplate, ItemTemplate: opts.Subject.ItemTemplate, - Budget: opts.Plan.Budget, + Budget: opts.Scenario.Budget, }) if err != nil { return out, err @@ -225,7 +225,7 @@ func runMutatingTier( // A separate context, because the commonest reason to be here with something to clean up // is that the run's own context is already done. - sweepCtx, cancel := SweepContext(ctx, opts.Plan.Budget.MaxSweepSeconds) + sweepCtx, cancel := SweepContext(ctx, opts.Scenario.Budget.MaxSweepSeconds) defer cancel() summary, sweepErr := Sweep(sweepCtx, SweepOptions{ @@ -235,7 +235,7 @@ func runMutatingTier( // the list response actually says, and an API may rename on the way out. NameField: opts.Subject.SweepNameField(), PageParams: opts.SweepPageParams, - MaxSeconds: opts.Plan.Budget.MaxSweepSeconds, + MaxSeconds: opts.Scenario.Budget.MaxSweepSeconds, }) report.Sweep = &summary @@ -259,7 +259,7 @@ func updateMethodOf(subj Subject) string { // read-only tier needs no plan at all, and the gate has already refused a mutating run whose plan // is unusable. Failing here would make one bad fixture stop six probes that never looked at it. func (opts RunOptions) scope() Scope { - if sc, err := NewScope(opts.Subject, opts.Plan); err == nil { + if sc, err := NewScope(opts.Subject, opts.Scenario); err == nil { return sc } @@ -308,7 +308,7 @@ func runReadProbes(ctx context.Context, s ReadSession, opts RunOptions, report * sc := opts.scope() for _, p := range ReadProbes(opts.Only) { - outcome := ProbeOutcome{Name: p.Name(), Kind: KindRead} + outcome := ProbeOutcome{Name: p.Name(), Kind: ProbeKindRead} result, err := p.Observe(ctx, s, sc) @@ -378,7 +378,7 @@ func reportSkippedMutating(opts RunOptions, report *Report) { return } - reason := "no grant: mutating probes need -mode record, --allow-mutations and a sandbox profile" + reason := "no grant: mutating probes need probe record, -allow-mutations and a sandbox profile" if can, why := opts.Subject.CanMutate(); !can { reason = why } @@ -386,7 +386,7 @@ func reportSkippedMutating(opts RunOptions, report *Report) { for _, p := range MutatingProbes(opts.Only) { report.Probes = append(report.Probes, ProbeOutcome{ Name: p.Name(), - Kind: KindMutating, + Kind: ProbeKindMutating, Status: "skipped", Reason: reason, }) @@ -440,8 +440,8 @@ func attachEvidence(report *Report, transcript []cassette.Interaction) { // transcript. Downgraded rather than dropped, so the observation survives for a // human while being ineligible for merge. fact.Evidence = []string{} - if fact.Confidence.AtLeast(Observed) { - fact.Confidence = Suspected + if fact.Confidence.AtLeast(ConfidenceObserved) { + fact.Confidence = ConfidenceSuspected } fact.Alternatives = append(fact.Alternatives, "no cassette interaction could be matched to this observation, so it cannot be "+ diff --git a/internal/probe/run_test.go b/internal/probe/run_test.go index f5348b61..cbcf0e1e 100644 --- a/internal/probe/run_test.go +++ b/internal/probe/run_test.go @@ -10,6 +10,7 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/cassette" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe/apierr" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/probe/quirkserver" ) @@ -247,10 +248,10 @@ func TestUnit_Probe_NotFoundShape(t *testing.T) { func TestUnit_Probe_ErrorEnvelopeIsIdentified(t *testing.T) { t.Parallel() - for _, kind := range []quirkserver.EnvelopeKind{ - quirkserver.EnvelopeProblem, - quirkserver.EnvelopeLegacy, - quirkserver.EnvelopeEmpty, + for _, kind := range []apierr.Envelope{ + apierr.EnvelopeProblem, + apierr.EnvelopeLegacy, + apierr.EnvelopeEmpty, } { t.Run(string(kind), func(t *testing.T) { t.Parallel() @@ -280,7 +281,7 @@ func TestUnit_Probe_ErrorEnvelopeIsIdentified(t *testing.T) { t.Parallel() srv := quirkserver.New(t, quirkserver.Quirks{ - ErrorEnvelope: quirkserver.EnvelopeOAuth, + ErrorEnvelope: apierr.EnvelopeOAuth, NotFoundStatus: http.StatusUnauthorized, }) @@ -315,7 +316,7 @@ func TestUnit_Probe_VolatileOnRead(t *testing.T) { if fact.Value.Bool == nil || !*fact.Value.Bool { t.Errorf("modifiedDate should be volatile: %v", fact.Value) } - if fact.Confidence != Observed { + if fact.Confidence != ConfidenceObserved { t.Errorf("confidence = %s, want observed", fact.Confidence) } }) @@ -397,7 +398,7 @@ func TestUnit_Probe_IntegralNumbersAreReported(t *testing.T) { if f.Value.Bool == nil || !*f.Value.Bool { t.Errorf("value = %v, want true", f.Value) } - if f.Confidence != Inferred { + if f.Confidence != ConfidenceInferred { t.Errorf("confidence = %s, want inferred -- JSON cannot distinguish 5 from 5.0, so "+ "this must never rise above an assumption", f.Confidence) } @@ -426,7 +427,7 @@ func TestUnit_Probe_ReturnedOnReadWeakIsAlwaysSuspected(t *testing.T) { continue } seen++ - if f.Confidence != Suspected { + if f.Confidence != ConfidenceSuspected { t.Errorf("%s: confidence = %s, want suspected", f.JSONPath, f.Confidence) } if len(f.Alternatives) < 2 { @@ -502,7 +503,7 @@ func TestUnit_Probe_MutatingTierIsReportedAsSkipped(t *testing.T) { var skipped int for _, p := range got.Report.Probes { - if p.Kind == KindMutating { + if p.Kind == ProbeKindMutating { if p.Status != "skipped" { t.Errorf("%s: status = %s, want skipped", p.Name, p.Status) } @@ -547,7 +548,7 @@ func TestUnit_Probe_EvidenceCitesRealInteractions(t *testing.T) { } // An observed-or-better fact with no evidence would fail Fact.Validate, so the // downgrade has to have happened. - if len(f.Evidence) == 0 && f.Confidence.AtLeast(Observed) { + if len(f.Evidence) == 0 && f.Confidence.AtLeast(ConfidenceObserved) { t.Errorf("%s has no evidence but claims %s", factKey(f), f.Confidence) } } @@ -568,7 +569,7 @@ func TestUnit_Probe_EveryDerivedFactValidates(t *testing.T) { got := recordAgainst(t, srv, "") for _, f := range got.Report.Facts { - if f.Confidence == Suspected { + if f.Confidence == ConfidenceSuspected { // Suspected facts are report-only and may legitimately lack evidence after a // downgrade. continue @@ -605,7 +606,7 @@ func TestUnit_Probe_VerifyFactsDetectsDrift(t *testing.T) { base := []Fact{{ Resource: "tag", JSONPath: "colour", Field: FactWritable, - Value: BoolValue(true), Confidence: Observed, + Value: BoolValue(true), Confidence: ConfidenceObserved, }} if err := VerifyFacts(base, base); err != nil { @@ -616,15 +617,15 @@ func TestUnit_Probe_VerifyFactsDetectsDrift(t *testing.T) { "a missing fact": {}, "a changed value": {{ Resource: "tag", JSONPath: "colour", Field: FactWritable, - Value: BoolValue(false), Confidence: Observed, + Value: BoolValue(false), Confidence: ConfidenceObserved, }}, "a changed confidence": {{ Resource: "tag", JSONPath: "colour", Field: FactWritable, - Value: BoolValue(true), Confidence: Suspected, + Value: BoolValue(true), Confidence: ConfidenceSuspected, }}, "a different field": {{ Resource: "tag", JSONPath: "colour", Field: FactImmutable, - Value: BoolValue(true), Confidence: Observed, + Value: BoolValue(true), Confidence: ConfidenceObserved, }}, } @@ -649,11 +650,11 @@ func TestUnit_Probe_VerifyFactsDetectsAPreconditionMismatch(t *testing.T) { committed := []Fact{{ Resource: "tag", JSONPath: "matchType", Field: FactReturnedOnRead, - Value: BoolValue(false), Confidence: Observed, + Value: BoolValue(false), Confidence: ConfidenceObserved, }} derived := []Fact{{ Resource: "tag", JSONPath: "matchType", Field: FactReturnedOnRead, - Value: BoolValue(false), Confidence: Observed, + Value: BoolValue(false), Confidence: ConfidenceObserved, When: []Condition{{JSONPath: "type", Equals: "static"}}, }} @@ -771,7 +772,7 @@ func TestUnit_Probe_EvidenceResolvesAcrossABasePath(t *testing.T) { t.Errorf("%s cites %q, which is not in the transcript", factKey(f), cited) } } - if f.Confidence.AtLeast(Observed) { + if f.Confidence.AtLeast(ConfidenceObserved) { observed++ if len(f.Evidence) == 0 { t.Errorf("%s claims %s with no evidence", factKey(f), f.Confidence) @@ -852,48 +853,48 @@ func TestUnit_Probe_ANestedFieldInsideAnArrayIsReadable(t *testing.T) { { name: "an object inside a single-element array", body: `{"filters":[{"mode":"and","key":"network"}]}`, - path: "filters.mode", want: Present, val: "and", + path: "filters.mode", want: OutcomePresent, val: "and", }, { // The array is how a great many APIs model a nested object, so this is the common // case rather than an exotic one. name: "a plain nested object still works", body: `{"filters":{"mode":"or"}}`, - path: "filters.mode", want: Present, val: "or", + path: "filters.mode", want: OutcomePresent, val: "or", }, { // Which element did the caller mean? Taking the first would produce a fact about // element zero and label it a fact about the field. name: "two elements is ambiguous, not absent", body: `{"filters":[{"mode":"and"},{"mode":"or"}]}`, - path: "filters.mode", want: Ambiguous, + path: "filters.mode", want: OutcomeAmbiguous, }, { name: "an empty array is ambiguous too", body: `{"filters":[]}`, - path: "filters.mode", want: Ambiguous, + path: "filters.mode", want: OutcomeAmbiguous, }, { name: "a genuinely absent field is absent", body: `{"filters":[{"key":"network"}]}`, - path: "filters.mode", want: Absent, + path: "filters.mode", want: OutcomeAbsent, }, { // Present-and-null is a different observation from not-returned, and the whole // writability protocol turns on the difference. name: "present and null is present", body: `{"filters":[{"mode":null}]}`, - path: "filters.mode", want: Present, val: nil, + path: "filters.mode", want: OutcomePresent, val: nil, }, { name: "two levels of single-element array", body: `{"a":[{"b":[{"c":"deep"}]}]}`, - path: "a.b.c", want: Present, val: "deep", + path: "a.b.c", want: OutcomePresent, val: "deep", }, { name: "a scalar where an object was expected", body: `{"filters":"not-an-object"}`, - path: "filters.mode", want: Absent, + path: "filters.mode", want: OutcomeAbsent, }, } @@ -907,22 +908,22 @@ func TestUnit_Probe_ANestedFieldInsideAnArrayIsReadable(t *testing.T) { if outcome != tc.want { t.Fatalf("outcome = %s, want %s", outcome, tc.want) } - if outcome == Present && got != tc.val { + if outcome == OutcomePresent && got != tc.val { t.Errorf("value = %v, want %v", got, tc.val) } // Field folds Ambiguous into false, which is the safe direction for a caller that // has not thought about arrays. _, ok := resp.Field(tc.path) - if ok != (tc.want == Present) { - t.Errorf("Field ok = %v, want %v", ok, tc.want == Present) + if ok != (tc.want == OutcomePresent) { + t.Errorf("Field ok = %v, want %v", ok, tc.want == OutcomePresent) } }) } // A nil response answers safely: every probe reads a response it may not have got. var none *Response - if _, outcome := none.LookupField("a.b"); outcome != Absent { + if _, outcome := none.LookupField("a.b"); outcome != OutcomeAbsent { t.Errorf("a nil response gave %s", outcome) } } @@ -985,7 +986,7 @@ func TestUnit_Probe_AFactCitesTheExactInteractionItRestsOn(t *testing.T) { // back into all three. report := Report{Facts: []Fact{{ Resource: "thing", JSONPath: "key", Field: FactReturnedOnRead, - Value: BoolValue(true), Confidence: Observed, Probe: "read.returned-weak", + Value: BoolValue(true), Confidence: ConfidenceObserved, Probe: "read.returned-weak", Evidence: []string{ids[1]}, Rationale: "for the test", }}} @@ -1000,7 +1001,7 @@ func TestUnit_Probe_AFactCitesTheExactInteractionItRestsOn(t *testing.T) { // change: they cite the path they asked for. byPath := Report{Facts: []Fact{{ Resource: "thing", JSONPath: "key", Field: FactReturnedOnRead, - Value: BoolValue(true), Confidence: Observed, Probe: "read.returned-weak", + Value: BoolValue(true), Confidence: ConfidenceObserved, Probe: "read.returned-weak", // A probe's own citation: a sequence number local to *that probe*, plus the method and // path it asked for. Seq 7 rather than 1 deliberately -- a probe's first request in a // run that begins with it produces a citation that happens to equal the real id diff --git a/internal/probe/plan.go b/internal/probe/scenario.go similarity index 96% rename from internal/probe/plan.go rename to internal/probe/scenario.go index cc103d91..2fbef26e 100644 --- a/internal/probe/plan.go +++ b/internal/probe/scenario.go @@ -5,7 +5,7 @@ import ( "fmt" ) -// Plan is the operator-supplied knowledge a probe cannot discover. +// Scenario is the operator-supplied knowledge a probe cannot discover. // // The prober can find out what an API does to values it is given. It cannot invent a // valid object, know which fields co-vary, or guess which alternative value for an enum @@ -14,7 +14,7 @@ import ( // constraints in particular are out of reach without this -- one-field-at-a-time // perturbation cannot find "port is required unless protocol is icmp" without being // told the two are related. -type Plan struct { +type Scenario struct { // Fixtures are complete, valid request bodies. At least one is required for any // mutating probe. // @@ -116,7 +116,7 @@ var ErrInvalidPlan = errors.New("invalid probe plan") // Collects every problem rather than stopping at the first, following // blueprint.Validate: a plan is hand-authored, and being told about one missing field // at a time is a poor way to write one. -func (p Plan) Validate(subj Subject) error { +func (p Scenario) Validate(subj Subject) error { var problems []string for i, f := range p.Fixtures { @@ -175,7 +175,7 @@ func (p Plan) Validate(subj Subject) error { } // Denied reports whether a JSON path is on the deny list. -func (p Plan) Denied(jsonPath string) bool { +func (p Scenario) Denied(jsonPath string) bool { for _, d := range p.Deny { if d == jsonPath { return true @@ -185,6 +185,6 @@ func (p Plan) Denied(jsonPath string) bool { } // CandidatesFor returns the alternative values declared for a path. -func (p Plan) CandidatesFor(jsonPath string) []any { +func (p Scenario) CandidatesFor(jsonPath string) []any { return p.Candidates[jsonPath] } diff --git a/internal/probe/plan_test.go b/internal/probe/scenario_test.go similarity index 90% rename from internal/probe/plan_test.go rename to internal/probe/scenario_test.go index 83dfe4a1..7a1e11e4 100644 --- a/internal/probe/plan_test.go +++ b/internal/probe/scenario_test.go @@ -13,7 +13,7 @@ func TestUnit_Probe_PlanValidate(t *testing.T) { subj := testSubject() - good := Plan{ + good := Scenario{ Fixtures: []Fixture{{ Name: "minimal", Body: map[string]any{"key": "probe", "value": "x"}, @@ -31,37 +31,37 @@ func TestUnit_Probe_PlanValidate(t *testing.T) { // That is a false fact produced by a plan mistake, so it is caught rather than run. tests := []struct { name string - plan Plan + plan Scenario want string }{ { name: "fixture with no name", - plan: Plan{Fixtures: []Fixture{{Body: map[string]any{"key": "x"}}}}, + plan: Scenario{Fixtures: []Fixture{{Body: map[string]any{"key": "x"}}}}, want: "fixtures[0].name", }, { name: "fixture with no body", - plan: Plan{Fixtures: []Fixture{{Name: "empty"}}}, + plan: Scenario{Fixtures: []Fixture{{Name: "empty"}}}, want: "body: is required", }, { name: "fixture key that is not an attribute", - plan: Plan{Fixtures: []Fixture{{Name: "typo", Body: map[string]any{"colour": "blue"}}}}, + plan: Scenario{Fixtures: []Fixture{{Name: "typo", Body: map[string]any{"colour": "blue"}}}}, want: "no attribute has this JSON path", }, { name: "candidate for an unknown path", - plan: Plan{Candidates: map[string][]any{"nope": {1}}}, + plan: Scenario{Candidates: map[string][]any{"nope": {1}}}, want: "candidates[nope]", }, { name: "influencer for an unknown path", - plan: Plan{DefaultInfluencers: []string{"nope"}}, + plan: Scenario{DefaultInfluencers: []string{"nope"}}, want: "defaultInfluencers[nope]", }, { name: "deny for an unknown path", - plan: Plan{Deny: []string{"nope"}}, + plan: Scenario{Deny: []string{"nope"}}, want: "deny[nope]", }, } @@ -87,7 +87,7 @@ func TestUnit_Probe_PlanValidate(t *testing.T) { func TestUnit_Probe_PlanValidateCollectsEveryProblem(t *testing.T) { t.Parallel() - plan := Plan{ + plan := Scenario{ Fixtures: []Fixture{{Body: map[string]any{"nope": 1}}}, Candidates: map[string][]any{"also-nope": {1}}, DefaultInfluencers: []string{"still-nope"}, @@ -147,7 +147,7 @@ func TestUnit_Probe_BudgetDefaults(t *testing.T) { func TestUnit_Probe_PlanLookups(t *testing.T) { t.Parallel() - plan := Plan{ + plan := Scenario{ Candidates: map[string][]any{"value": {"a", "b"}}, Deny: []string{"webhook_url"}, } diff --git a/internal/probe/plandraft.go b/internal/probe/scenariodraft.go similarity index 96% rename from internal/probe/plandraft.go rename to internal/probe/scenariodraft.go index 89805f6d..8a0615cf 100644 --- a/internal/probe/plandraft.go +++ b/internal/probe/scenariodraft.go @@ -9,7 +9,7 @@ import ( // these is a line item the curator has to replace before promoting the file. const CurateMe = "CURATE_ME" -// DraftPlan scaffolds a probe plan for one subject. +// DraftScenario scaffolds a probe plan for one subject. // // The output is a starting point for curation, never something to record against as // it stands -- which is why the caller writes it under a .draft.json name no loader @@ -21,8 +21,8 @@ const CurateMe = "CURATE_ME" // It deliberately does not guess influencers. A gate nobody declares is a branch // nobody measures, and a guessed gate would look declared while measuring nothing a // human chose. The empty list in the draft is the prompt to think about it. -func DraftPlan(subj Subject) Plan { - plan := Plan{ +func DraftScenario(subj Subject) Scenario { + plan := Scenario{ Fixtures: []Fixture{{Name: "minimal", Body: map[string]any{}}}, Candidates: map[string][]any{}, DefaultInfluencers: []string{}, diff --git a/internal/probe/plandraft_test.go b/internal/probe/scenariodraft_test.go similarity index 99% rename from internal/probe/plandraft_test.go rename to internal/probe/scenariodraft_test.go index 4822ed50..2ff9b1c5 100644 --- a/internal/probe/plandraft_test.go +++ b/internal/probe/scenariodraft_test.go @@ -53,7 +53,7 @@ func TestUnit_Probe_DraftPlanScaffoldsAWorksheet(t *testing.T) { }, } - plan := DraftPlan(subj) + plan := DraftScenario(subj) if err := plan.Validate(subj); err != nil { t.Fatalf("a draft the plan loader would refuse is a broken worksheet: %v", err) diff --git a/internal/probe/scope.go b/internal/probe/scope.go index 3c1db473..c34a7bfa 100644 --- a/internal/probe/scope.go +++ b/internal/probe/scope.go @@ -30,16 +30,16 @@ type Scope struct { // Subject is the resource, flattened to paths and JSON keys. Subject Subject - // Plan is the operator-supplied knowledge a probe cannot discover. - Plan Plan + // Scenario is the operator-supplied knowledge a probe cannot discover. + Scenario Scenario - // Planned is false when no plan was supplied. + // HasScenario is false when no plan was supplied. // // It is what lets `probe -list` report the *unnarrowed* worst case honestly. Without it, a // catalogue listing with no plan would report a small number -- not because the run is // cheap but because nobody said which fields to exercise -- and an operator would budget // against a figure that means nothing. - Planned bool + HasScenario bool // The precomputed sets. Unexported with accessors, so a probe cannot append to one and // thereby exercise a field the cost model never counted. @@ -57,7 +57,7 @@ type Scope struct { // Validates the plan, because every set below is derived from it and a plan naming a field that // does not exist would silently produce an empty set -- which reads exactly like "this API has no // writable fields". -func NewScope(subj Subject, plan Plan) (Scope, error) { +func NewScope(subj Subject, plan Scenario) (Scope, error) { if err := plan.Validate(subj); err != nil { return Scope{}, err } @@ -66,7 +66,7 @@ func NewScope(subj Subject, plan Plan) (Scope, error) { // -- or one carrying only a budget -- narrows nothing and cannot support a mutating probe, so // treating it as a plan would report the narrowed cost of an empty narrowing: zero, for every // mutating probe, which is the most misleading number this command could print. - sc := Scope{Subject: subj, Plan: plan, Planned: len(plan.Fixtures) > 0} + sc := Scope{Subject: subj, Scenario: plan, HasScenario: len(plan.Fixtures) > 0} sc.compute() return sc, nil @@ -85,8 +85,8 @@ func UnplannedScope(subj Subject) Scope { // compute derives every set once. func (sc *Scope) compute() { - sc.denied = make(map[string]bool, len(sc.Plan.Deny)) - for _, path := range sc.Plan.Deny { + sc.denied = make(map[string]bool, len(sc.Scenario.Deny)) + for _, path := range sc.Scenario.Deny { sc.denied[path] = true } @@ -102,7 +102,7 @@ func (sc *Scope) compute() { // A field the fixture does not set is what the server-default protocol observes. Only // meaningful with a fixture: with none, every field is "omitted" and the set says // nothing. - if sc.Planned && !setByFixture[f.JSONPath] { + if sc.HasScenario && !setByFixture[f.JSONPath] { sc.omitted = append(sc.omitted, f) } @@ -112,7 +112,7 @@ func (sc *Scope) compute() { // two *distinct* values -- so a field with one alternative cannot reach the confidence // the fact requires, and probing it would only produce a note. Making the candidate // count the gate means the plan controls this field set precisely, with no new schema. - if len(sc.Plan.Candidates[f.JSONPath]) >= 2 { + if len(sc.Scenario.Candidates[f.JSONPath]) >= 2 { sc.immutable = append(sc.immutable, f) } @@ -125,7 +125,7 @@ func (sc *Scope) compute() { } } - for _, path := range sc.Plan.DefaultInfluencers { + for _, path := range sc.Scenario.DefaultInfluencers { if f, ok := sc.Subject.Field(path); ok { sc.influencers = append(sc.influencers, f) } @@ -146,7 +146,7 @@ func (sc *Scope) compute() { func (sc Scope) fixtureKeys() map[string]bool { out := map[string]bool{} - for _, f := range sc.Plan.Fixtures { + for _, f := range sc.Scenario.Fixtures { for key := range f.Body { out[key] = true } @@ -201,7 +201,7 @@ func (sc Scope) Normalisable() []Field { return sc.normalisable } func (sc Scope) Influencers() []Field { return sc.influencers } // Fixtures is the plan's fixtures. -func (sc Scope) Fixtures() []Fixture { return sc.Plan.Fixtures } +func (sc Scope) Fixtures() []Fixture { return sc.Scenario.Fixtures } // Fixture returns one fixture by index, with its body copied. // @@ -213,11 +213,11 @@ func (sc Scope) Fixtures() []Fixture { return sc.Plan.Fixtures } // and a top-level copy would share every nested map with the plan, so a probe reaching one level // down would corrupt the plan just as surely as one mutating the top. func (sc Scope) Fixture(i int) (Fixture, bool) { - if i < 0 || i >= len(sc.Plan.Fixtures) { + if i < 0 || i >= len(sc.Scenario.Fixtures) { return Fixture{}, false } - src := sc.Plan.Fixtures[i] + src := sc.Scenario.Fixtures[i] body, _ := deepCopyValue(src.Body).(map[string]any) @@ -259,7 +259,7 @@ func (sc Scope) HostFixture(jsonPath string) (Fixture, bool) { // body declares. head, _, _ := strings.Cut(jsonPath, ".") - for i, f := range sc.Plan.Fixtures { + for i, f := range sc.Scenario.Fixtures { if _, ok := f.Body[head]; ok { return sc.Fixture(i) } @@ -294,7 +294,7 @@ func (sc Scope) Omittable(fixture Fixture) []string { // Candidates returns the alternative values declared for a path. func (sc Scope) Candidates(jsonPath string) []any { - src := sc.Plan.Candidates[jsonPath] + src := sc.Scenario.Candidates[jsonPath] if len(src) == 0 { return nil } @@ -311,7 +311,7 @@ func (sc Scope) CanMutate() (bool, string) { return false, why } - if !sc.Planned || len(sc.Plan.Fixtures) == 0 { + if !sc.HasScenario || len(sc.Scenario.Fixtures) == 0 { return false, "no probe plan with a fixture was supplied, so there is no valid request " + "body for a mutating probe to build on" } @@ -321,13 +321,13 @@ func (sc Scope) CanMutate() (bool, string) { // String describes the narrowing, for -list and for a report. func (sc Scope) String() string { - if !sc.Planned { + if !sc.HasScenario { return fmt.Sprintf("no plan, so costs are the unnarrowed worst case over %d writable "+ "field(s)", len(sc.sendable)) } return fmt.Sprintf("%d fixture(s), %d sendable, %d omitted by every fixture, "+ "%d with candidates, %d documented enum(s), %d denied", - len(sc.Plan.Fixtures), len(sc.sendable), len(sc.omitted), + len(sc.Scenario.Fixtures), len(sc.sendable), len(sc.omitted), len(sc.immutable), len(sc.enums), len(sc.denied)) } diff --git a/internal/probe/scope_test.go b/internal/probe/scope_test.go index 5430d919..7a5b93ee 100644 --- a/internal/probe/scope_test.go +++ b/internal/probe/scope_test.go @@ -26,8 +26,8 @@ func scopeSubject() Subject { return subj } -func scopePlan() Plan { - return Plan{ +func scopePlan() Scenario { + return Scenario{ Fixtures: []Fixture{ {Name: "minimal", Body: map[string]any{"key": "x", "value": "v"}}, {Name: "full", Body: map[string]any{"key": "x", "value": "v", "mode": "and"}}, @@ -55,7 +55,7 @@ func TestUnit_Probe_ScopeNarrowsByThePlan(t *testing.T) { t.Fatalf("NewScope: %v", err) } - if !sc.Planned { + if !sc.HasScenario { t.Error("a plan with fixtures is a plan") } @@ -136,7 +136,7 @@ func TestUnit_Probe_UnplannedScopeReportsTheWorstCase(t *testing.T) { sc := UnplannedScope(scopeSubject()) - if sc.Planned { + if sc.HasScenario { t.Error("no plan is not a plan") } if len(sc.Sendable()) == 0 { @@ -149,11 +149,11 @@ func TestUnit_Probe_UnplannedScopeReportsTheWorstCase(t *testing.T) { } // A zero Plan is not a plan either, which is the case `probe -list` with no -plan hits. - zero, err := NewScope(scopeSubject(), Plan{}) + zero, err := NewScope(scopeSubject(), Scenario{}) if err != nil { t.Fatalf("NewScope: %v", err) } - if zero.Planned { + if zero.HasScenario { t.Error("a plan with no fixtures narrows nothing and must not read as planned") } @@ -172,7 +172,7 @@ func TestUnit_Probe_UnplannedScopeReportsTheWorstCase(t *testing.T) { func TestUnit_Probe_ScopeRefusesAPlanThatNamesNothing(t *testing.T) { t.Parallel() - _, err := NewScope(scopeSubject(), Plan{ + _, err := NewScope(scopeSubject(), Scenario{ Fixtures: []Fixture{{Name: "typo", Body: map[string]any{"keyy": "x"}}}, }) if !errors.Is(err, ErrInvalidPlan) { @@ -327,7 +327,7 @@ func TestUnit_Probe_CostAlwaysCoversCreates(t *testing.T) { t.Errorf("%s: declares %d creates but only %d requests; every created "+ "object costs at least a create and a delete", e.Name, e.Creates, e.Cost) } - if e.Kind == KindRead && e.Creates != 0 { + if e.Kind == ProbeKindRead && e.Creates != 0 { t.Errorf("%s is read-only but claims %d creates", e.Name, e.Creates) } } @@ -367,7 +367,7 @@ func TestUnit_Probe_PlanNarrowingActuallyReducesTheCost(t *testing.T) { } } -func mustScope(t *testing.T, subj Subject, plan Plan) Scope { +func mustScope(t *testing.T, subj Subject, plan Scenario) Scope { t.Helper() sc, err := NewScope(subj, plan) diff --git a/internal/probe/session.go b/internal/probe/session.go index d6b300f4..f4c002ef 100644 --- a/internal/probe/session.go +++ b/internal/probe/session.go @@ -18,7 +18,7 @@ import ( // Grant is proof that mutating probes were authorised. // // It has no exported fields and exactly one constructor, which performs the whole -// gating conjunction: record mode, the --allow-mutations flag, a profile declaring +// gating conjunction: the record verb, the -allow-mutations flag, a profile declaring // sandbox with human-written evidence, every runtime assertion passing against the live // tenant, the token present in the environment, and nothing credential-shaped in the // profile itself. @@ -176,7 +176,7 @@ type MutationConfig struct { // probe's window onto the run -- it carries the ledger and the read-back measurement for the // same reason. Read-only from a probe's side: the runner adds to it after each probe // returns, so there is exactly one writer. - Findings *Findings + Findings *FactSet // Rehearsal is write.rehearsal's configuration, carried the same way Findings is // and for the same reason: the session is a probe's window onto the run. @@ -275,13 +275,13 @@ func (s *MutatingSession) Create( // A transport error is the ambiguous case, and it is left outstanding deliberately: a // timeout is indistinguishable from a create that succeeded on a connection that then // dropped. - _ = s.cfg.Ledger.Resolve(seq, KindFailed, "", 0, err.Error()) + _ = s.cfg.Ledger.Resolve(seq, EntryKindFailed, "", 0, err.Error()) return nil, "", err } switch { case resp.Status >= 400 && resp.Status < 500: - if rErr := s.cfg.Ledger.Resolve(seq, KindRejected, "", resp.Status, ""); rErr != nil { + if rErr := s.cfg.Ledger.Resolve(seq, EntryKindRejected, "", resp.Status, ""); rErr != nil { return resp, "", rErr } // Not an error: a refused create is an observation, and several probes exist to @@ -289,7 +289,7 @@ func (s *MutatingSession) Create( return resp, "", nil case resp.Status >= 500: - _ = s.cfg.Ledger.Resolve(seq, KindFailed, "", resp.Status, "server error") + _ = s.cfg.Ledger.Resolve(seq, EntryKindFailed, "", resp.Status, "server error") return resp, "", nil } @@ -297,14 +297,14 @@ func (s *MutatingSession) Create( if id == "" { // The object exists and the intent stays outstanding with only a name, which is // precisely the case the prefix pass of the sweeper is for. - _ = s.cfg.Ledger.Resolve(seq, KindFailed, "", resp.Status, + _ = s.cfg.Ledger.Resolve(seq, EntryKindFailed, "", resp.Status, "created, but no identifier could be read from the response") return resp, "", fmt.Errorf("%w: %s created an object but the response carried no %q; "+ "the prefix sweep will remove it", ErrNoIdentifier, probe, s.cfg.IDField) } - if err := s.cfg.Ledger.Resolve(seq, KindCreated, id, resp.Status, ""); err != nil { + if err := s.cfg.Ledger.Resolve(seq, EntryKindCreated, id, resp.Status, ""); err != nil { return resp, id, err } @@ -440,7 +440,7 @@ func (s *MutatingSession) failedDelete(id, why string) error { func (s *MutatingSession) markDeleted(id string, status int) error { for _, o := range Unresolved(s.cfg.Ledger.Entries()) { if o.ID == id { - return s.cfg.Ledger.Resolve(o.Seq, KindDeleted, id, status, "") + return s.cfg.Ledger.Resolve(o.Seq, EntryKindDeleted, id, status, "") } } @@ -570,9 +570,9 @@ func (s *MutatingSession) ReadBack() ReadBackMeasurement { return s.readBack } // // Never nil, so a probe need not guard: a run with nothing established yet answers "not settled" // to every question, which is the correct answer. -func (s *MutatingSession) Findings() *Findings { +func (s *MutatingSession) Findings() *FactSet { if s.cfg.Findings == nil { - return NewFindings(nil) + return NewFactSet(nil) } return s.cfg.Findings @@ -589,7 +589,7 @@ func (s *MutatingSession) resolveByName(name, id string) { for _, o := range Unresolved(s.cfg.Ledger.Entries()) { if o.Name == name { - _ = s.cfg.Ledger.Resolve(o.Seq, KindDeleted, id, 0, "removed by the prefix sweep") + _ = s.cfg.Ledger.Resolve(o.Seq, EntryKindDeleted, id, 0, "removed by the prefix sweep") return } } diff --git a/internal/probe/subject.go b/internal/probe/subject.go index ae499ec7..1603440c 100644 --- a/internal/probe/subject.go +++ b/internal/probe/subject.go @@ -184,7 +184,7 @@ func SubjectOf(bp blueprint.Blueprint, res blueprint.Resource) (Subject, error) item := res.Binding.Read.PathTemplate if item == "" { return Subject{}, fmt.Errorf("%w: %s records no path template on its read operation; "+ - "run `tfpluginframeworkgen ingest` against a snapshot, or author binding.read.pathTemplate", + "run `tfpfgen blueprint draft` against a snapshot, or author binding.read.pathTemplate", ErrNotProbeable, res.Key) } diff --git a/internal/probe/sweep.go b/internal/probe/sweep.go index 1e5c6d2d..4f8fd99b 100644 --- a/internal/probe/sweep.go +++ b/internal/probe/sweep.go @@ -107,7 +107,7 @@ func SweepContext(parent context.Context, maxSeconds int) (context.Context, cont ) } -// SweepRunOptions is what `probe -mode sweep` needs. +// SweepRunOptions is what `probe sweep` needs. // // A separate entry point rather than an exported constructor, because newMutatingSession is // unexported on purpose: a caller that could build one could write to an API without a grant. @@ -308,7 +308,7 @@ func (opts SweepOptions) sweepByPrefix(ctx context.Context, summary *SweepSummar if o.ID != "" || present[o.Name] || !strings.HasPrefix(o.Name, opts.NamePrefix) { continue } - _ = opts.Session.cfg.Ledger.Resolve(o.Seq, KindRejected, "", 0, + _ = opts.Session.cfg.Ledger.Resolve(o.Seq, EntryKindRejected, "", 0, "absent from a complete collection read: the create never took effect") summary.Notes = append(summary.Notes, Note{ Probe: "sweep.prefix", diff --git a/internal/probe/sweep_test.go b/internal/probe/sweep_test.go index b3db3ad9..fdc967d8 100644 --- a/internal/probe/sweep_test.go +++ b/internal/probe/sweep_test.go @@ -257,7 +257,7 @@ func TestUnit_Probe_SweepConfirmsA404BeforeBelievingIt(t *testing.T) { if err != nil { t.Fatalf("Intent: %v", err) } - if err := l.Resolve(seq, KindCreated, "1", 201, ""); err != nil { + if err := l.Resolve(seq, EntryKindCreated, "1", 201, ""); err != nil { t.Fatalf("Resolve: %v", err) } diff --git a/internal/probe/transport.go b/internal/probe/transport.go index 3103bc6e..ed286b89 100644 --- a/internal/probe/transport.go +++ b/internal/probe/transport.go @@ -280,27 +280,27 @@ func (r *Response) Error() apierr.Error { type FieldOutcome int const ( - // Absent means no such path. Distinct from present-and-null, which is the whole basis of + // OutcomeAbsent means no such path. Distinct from present-and-null, which is the whole basis of // the writability and default protocols: a field that came back null is a very different // observation from one that did not come back at all. - Absent FieldOutcome = iota - // Present means the path resolved, possibly to null. - Present - // Ambiguous means the path crossed an array holding more than one element, so which + OutcomeAbsent FieldOutcome = iota + // OutcomePresent means the path resolved, possibly to null. + OutcomePresent + // OutcomeAmbiguous means the path crossed an array holding more than one element, so which // element the probe meant cannot be known. // // Its own outcome rather than folded into Absent, because the two demand opposite - // responses. Absent is an observation a probe may build a fact on; Ambiguous is a note, + // responses. Absent is an observation a probe may build a fact on; OutcomeAmbiguous is a note, // and treating it as absence would emit ReturnedOnRead=false at Observed for a field that // was demonstrably returned. - Ambiguous + OutcomeAmbiguous ) func (o FieldOutcome) String() string { switch o { - case Present: + case OutcomePresent: return "present" - case Ambiguous: + case OutcomeAmbiguous: return "ambiguous" default: return "absent" @@ -318,13 +318,13 @@ func (o FieldOutcome) String() string { func (r *Response) Field(jsonPath string) (any, bool) { v, outcome := r.LookupField(jsonPath) - return v, outcome == Present + return v, outcome == OutcomePresent } // LookupField reads a dotted path and distinguishes all three outcomes. func (r *Response) LookupField(jsonPath string) (any, FieldOutcome) { if r == nil || r.Body == nil { - return nil, Absent + return nil, OutcomeAbsent } return lookupIn(r.Body, jsonPath) @@ -333,7 +333,7 @@ func (r *Response) LookupField(jsonPath string) (any, FieldOutcome) { func fieldIn(body any, jsonPath string) (any, bool) { v, outcome := lookupIn(body, jsonPath) - return v, outcome == Present + return v, outcome == OutcomePresent } // lookupIn walks a dotted path, descending into a single-element array. @@ -356,24 +356,24 @@ func lookupIn(body any, jsonPath string) (any, FieldOutcome) { case 1: current = arr[0] default: - return nil, Ambiguous + return nil, OutcomeAmbiguous } } obj, ok := current.(map[string]any) if !ok { - return nil, Absent + return nil, OutcomeAbsent } v, present := obj[segment] if !present { - return nil, Absent + return nil, OutcomeAbsent } current = v } - return current, Present + return current, OutcomePresent } // Items pulls a collection out of a list response. diff --git a/internal/sdkbind/facts.go b/internal/sdkbind/facts.go index 0e9a5909..e4234041 100644 --- a/internal/sdkbind/facts.go +++ b/internal/sdkbind/facts.go @@ -71,7 +71,7 @@ func StaticFacts(l *Loader, bp blueprint.Blueprint) ([]probe.Fact, error) { JSONPath: a.Wire.JSONPath, Field: probe.FactZeroValueUnsendable, Value: probe.BoolValue(true), - Confidence: probe.Corroborated, + Confidence: probe.ConfidenceCorroborated, Probe: "static.sdkbind", Evidence: ev, Rationale: "the SDK declares this field value-typed with omitempty, so its " + diff --git a/internal/sdkbind/facts_test.go b/internal/sdkbind/facts_test.go index 7b685560..f4b7d7ef 100644 --- a/internal/sdkbind/facts_test.go +++ b/internal/sdkbind/facts_test.go @@ -40,7 +40,7 @@ func TestUnit_SDKBind_StaticFactsFindTheOmitemptyClass(t *testing.T) { if f == nil { t.Fatal("networkMeasurements on tests_api is the proven live case and must be found") } - if f.Confidence != probe.Corroborated { + if f.Confidence != probe.ConfidenceCorroborated { t.Errorf("a mechanical claim about the pinned SDK is Corroborated, got %s", f.Confidence) } if err := f.Validate(); err != nil { diff --git a/internal/specstore/coverage_test.go b/internal/snapshot/coverage_test.go similarity index 98% rename from internal/specstore/coverage_test.go rename to internal/snapshot/coverage_test.go index ef01c08c..26fb20e7 100644 --- a/internal/specstore/coverage_test.go +++ b/internal/snapshot/coverage_test.go @@ -1,4 +1,4 @@ -package specstore +package snapshot import ( "os" diff --git a/internal/specstore/specstore.go b/internal/snapshot/snapshot.go similarity index 98% rename from internal/specstore/specstore.go rename to internal/snapshot/snapshot.go index 4ed1d37b..a586044b 100644 --- a/internal/specstore/specstore.go +++ b/internal/snapshot/snapshot.go @@ -1,4 +1,4 @@ -// Package specstore manages pinned copies of an API specification. +// Package snapshot manages pinned copies of an API specification. // // Generation must be reproducible offline. If ingestion read a specification // from the network, two runs a week apart could produce different providers with @@ -9,14 +9,14 @@ // The layout is inherited from go-sdk-thousandeyes, which pins specifications the // same way for the same reason: // -// openapi-specs//-t/ +// openapi//-t/ // api.yaml the document // metadata.json version, checksum, source and counts // // A directory is never rewritten. Fetching an upstream change adds a new one, so // the history of what was generated from what stays intact and a regression can // be bisected against the specification as well as the generator. -package specstore +package snapshot import ( "crypto/sha256" diff --git a/internal/specstore/specstore_test.go b/internal/snapshot/snapshot_test.go similarity index 98% rename from internal/specstore/specstore_test.go rename to internal/snapshot/snapshot_test.go index 7cc31196..1d450fde 100644 --- a/internal/specstore/specstore_test.go +++ b/internal/snapshot/snapshot_test.go @@ -1,4 +1,4 @@ -package specstore +package snapshot import ( "encoding/json" @@ -216,7 +216,7 @@ func TestUnit_SpecStore_DirName(t *testing.T) { func TestUnit_SpecStore_CommittedSnapshotVerifies(t *testing.T) { t.Parallel() - root := filepath.Join("..", "..", "openapi-specs", "thousandeyes") + root := filepath.Join("..", "..", "openapi", "thousandeyes") snap, err := Latest(root) if err != nil { diff --git a/internal/interop/coverage_test.go b/internal/spec/coverage_test.go similarity index 91% rename from internal/interop/coverage_test.go rename to internal/spec/coverage_test.go index 5a5a1a2b..cc813799 100644 --- a/internal/interop/coverage_test.go +++ b/internal/spec/coverage_test.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "context" @@ -35,14 +35,14 @@ func attr(name string, kind blueprint.TypeKind, presence blueprint.ComputedOptio return blueprint.Attribute{Name: name, ComputedOptionalRequired: presence, Type: blueprint.AttrType{Kind: kind}} } -// TestUnit_Interop_Conformance is the assertion that pays for this package. +// TestUnit_Spec_Conformance is the assertion that pays for this package. // // Every kind the blueprint can express is exported and then checked against // HashiCorp's own embedded JSON schema. That is a claim no test written inside this // repository can make on its own: it says the blueprint's schema slice describes a // schema Terraform can actually have, verified by a party that does not share this // repository's assumptions about what a valid schema is. -func TestUnit_Interop_Conformance(t *testing.T) { +func TestUnit_Spec_Conformance(t *testing.T) { t.Parallel() ctx := context.Background() @@ -155,14 +155,14 @@ func nested(name string, kind blueprint.TypeKind) blueprint.Attribute { } } -// TestUnit_Interop_Presence covers all four spellings and the case a cast would +// TestUnit_Spec_Presence covers all four spellings and the case a cast would // have laundered. // // The two formats spell these identically, which makes schema.ComputedOptionalRequired(p) // look like a free conversion. It is not: an unrecognised value would reach the JSON // and be caught, if at all, as an opaque enum violation from upstream's validator, // a long way from the attribute that caused it. -func TestUnit_Interop_Presence(t *testing.T) { +func TestUnit_Spec_Presence(t *testing.T) { t.Parallel() for _, p := range []blueprint.ComputedOptionalRequired{ @@ -196,7 +196,7 @@ func TestUnit_Interop_Presence(t *testing.T) { }) } -// TestUnit_Interop_Defaults covers the one place in the mapping that needs a real +// TestUnit_Spec_Defaults covers the one place in the mapping that needs a real // parser rather than a copy. // // The blueprint stores a default as the Go literal the emitter will write; the @@ -204,7 +204,7 @@ func TestUnit_Interop_Presence(t *testing.T) { // unparsed literal would land in the document as a string, or worse be rerouted // into a custom default that expects a full expression and generates code that does // not compile. -func TestUnit_Interop_Defaults(t *testing.T) { +func TestUnit_Spec_Defaults(t *testing.T) { t.Parallel() tests := []struct { @@ -256,7 +256,7 @@ func TestUnit_Interop_Defaults(t *testing.T) { } } -func TestUnit_Interop_DefaultValuesAreTyped(t *testing.T) { +func TestUnit_Spec_DefaultValuesAreTyped(t *testing.T) { t.Parallel() a := attr("f", blueprint.KindString, blueprint.ComputedOptional) @@ -278,9 +278,9 @@ func TestUnit_Interop_DefaultValuesAreTyped(t *testing.T) { } } -// TestUnit_Interop_Downgrade covers the widening cases and asserts they are +// TestUnit_Spec_Downgrade covers the widening cases and asserts they are // reported rather than silent. -func TestUnit_Interop_Downgrade(t *testing.T) { +func TestUnit_Spec_Downgrade(t *testing.T) { t.Parallel() s, report, err := FromBlueprint(bp( @@ -316,9 +316,9 @@ func TestUnit_Interop_Downgrade(t *testing.T) { } } -// TestUnit_Interop_BehaviourReportedOnlyWhenPopulated: an unprobed blueprint must +// TestUnit_Spec_BehaviourReportedOnlyWhenPopulated: an unprobed blueprint must // not produce a note per attribute saying nothing was observed. -func TestUnit_Interop_BehaviourReportedOnlyWhenPopulated(t *testing.T) { +func TestUnit_Spec_BehaviourReportedOnlyWhenPopulated(t *testing.T) { t.Parallel() _, quiet, err := FromBlueprint(bp(attr("f", blueprint.KindString, blueprint.Optional))) @@ -351,12 +351,12 @@ func TestUnit_Interop_BehaviourReportedOnlyWhenPopulated(t *testing.T) { } } -// TestUnit_Interop_UniformLossesAreAggregated pins the readability decision. +// TestUnit_Spec_UniformLossesAreAggregated pins the readability decision. // // Wire bindings and model field names exist on every attribute, so reporting them // individually turns the pilot's report into sixty-odd lines of which forty-five are // identical. The aggregate carries a count so nothing is hidden. -func TestUnit_Interop_UniformLossesAreAggregated(t *testing.T) { +func TestUnit_Spec_UniformLossesAreAggregated(t *testing.T) { t.Parallel() var attrs []blueprint.Attribute @@ -390,12 +390,12 @@ func TestUnit_Interop_UniformLossesAreAggregated(t *testing.T) { } } -// TestUnit_Interop_Severities asserts the loss taxonomy is total. +// TestUnit_Spec_Severities asserts the loss taxonomy is total. // // The expected list is written out rather than derived, so that adding a blueprint // field with no upstream counterpart and forgetting to classify it fails here. That // is the whole mechanism keeping the report from going stale as the IR grows. -func TestUnit_Interop_Severities(t *testing.T) { +func TestUnit_Spec_Severities(t *testing.T) { t.Parallel() want := map[string]Severity{ @@ -468,10 +468,10 @@ func TestUnit_Interop_Severities(t *testing.T) { } } -// TestUnit_Interop_UnclassifiedLossDegrades: an unknown taxonomy key must produce a +// TestUnit_Spec_UnclassifiedLossDegrades: an unknown taxonomy key must produce a // note rather than kill the run. A missing classification is a bug in this package, // and losing the whole export over it would be a worse outcome than a vague note. -func TestUnit_Interop_UnclassifiedLossDegrades(t *testing.T) { +func TestUnit_Spec_UnclassifiedLossDegrades(t *testing.T) { t.Parallel() var r Report @@ -489,7 +489,7 @@ func TestUnit_Interop_UnclassifiedLossDegrades(t *testing.T) { } } -func TestUnit_Interop_ExportRefusals(t *testing.T) { +func TestUnit_Spec_ExportRefusals(t *testing.T) { t.Parallel() tests := []struct { @@ -559,10 +559,10 @@ func TestUnit_Interop_ExportRefusals(t *testing.T) { } } -// TestUnit_Interop_DataSourceLosesModifiersAndDefaults: the datasource package has +// TestUnit_Spec_DataSourceLosesModifiersAndDefaults: the datasource package has // no plan modifiers and no defaults, and a blueprint carrying them must be told so // rather than have them vanish. -func TestUnit_Interop_DataSourceLosesModifiersAndDefaults(t *testing.T) { +func TestUnit_Spec_DataSourceLosesModifiersAndDefaults(t *testing.T) { t.Parallel() a := attr("f", blueprint.KindString, blueprint.Computed) @@ -609,10 +609,10 @@ func TestUnit_Interop_DataSourceLosesModifiersAndDefaults(t *testing.T) { } } -// TestUnit_Interop_DropIsCountedNotSilent: an attribute the blueprint asked to be +// TestUnit_Spec_DropIsCountedNotSilent: an attribute the blueprint asked to be // left out is legitimately absent, but a node-count difference between the two // documents would alarm anyone comparing them, so it is stated. -func TestUnit_Interop_DropIsCountedNotSilent(t *testing.T) { +func TestUnit_Spec_DropIsCountedNotSilent(t *testing.T) { t.Parallel() keep := attr("keep", blueprint.KindString, blueprint.Optional) @@ -648,7 +648,7 @@ func TestUnit_Interop_DropIsCountedNotSilent(t *testing.T) { } } -func TestUnit_Interop_ReportRendering(t *testing.T) { +func TestUnit_Spec_ReportRendering(t *testing.T) { t.Parallel() var r Report @@ -704,10 +704,10 @@ func TestUnit_Interop_ReportRendering(t *testing.T) { } } -func TestUnit_Interop_NoteString(t *testing.T) { +func TestUnit_Spec_NoteString(t *testing.T) { t.Parallel() - got := Note{Severity: SeverityDropped, Path: "resources[tag].binding", Message: "no counterpart"}.String() + got := Loss{Severity: SeverityDropped, Path: "resources[tag].binding", Message: "no counterpart"}.String() for _, want := range []string{"dropped", "resources[tag].binding", "no counterpart"} { if !strings.Contains(got, want) { @@ -716,7 +716,7 @@ func TestUnit_Interop_NoteString(t *testing.T) { } } -func TestUnit_Interop_SeverityRank(t *testing.T) { +func TestUnit_Spec_SeverityRank(t *testing.T) { t.Parallel() // An unknown severity sorts last rather than crashing or sorting first. @@ -725,7 +725,7 @@ func TestUnit_Interop_SeverityRank(t *testing.T) { } } -func TestUnit_Interop_PointerHelpers(t *testing.T) { +func TestUnit_Spec_PointerHelpers(t *testing.T) { t.Parallel() if strPtr("") != nil { @@ -751,10 +751,10 @@ func TestUnit_Interop_PointerHelpers(t *testing.T) { } } -// TestUnit_Interop_NestedSDKTypeCrosses: associated_external_type is the one +// TestUnit_Spec_NestedSDKTypeCrosses: associated_external_type is the one // upstream field carrying part of the blueprint's binding, so a round trip can // recover the SDK struct rather than asking a human to retype it. -func TestUnit_Interop_NestedSDKTypeCrosses(t *testing.T) { +func TestUnit_Spec_NestedSDKTypeCrosses(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(nested("items", blueprint.KindSetNested))) @@ -780,11 +780,11 @@ func TestUnit_Interop_NestedSDKTypeCrosses(t *testing.T) { } } -// TestUnit_Interop_SingleNestedCarriesItsAttributes guards the one upstream +// TestUnit_Spec_SingleNestedCarriesItsAttributes guards the one upstream // irregularity: SingleNestedAttribute holds Attributes directly rather than a // NestedObject, so a copy-paste from the list case would silently produce an // attribute with no children. -func TestUnit_Interop_SingleNestedCarriesItsAttributes(t *testing.T) { +func TestUnit_Spec_SingleNestedCarriesItsAttributes(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(nested("config", blueprint.KindSingleNested))) @@ -804,11 +804,11 @@ func TestUnit_Interop_SingleNestedCarriesItsAttributes(t *testing.T) { } } -// TestUnit_Interop_ResourcesAreSortedByExportedName: LoadDir sorts by blueprint +// TestUnit_Spec_ResourcesAreSortedByExportedName: LoadDir sorts by blueprint // key, which need not agree with the name the document carries. Sorting on the // exported field is what makes the output independent of how the blueprint is split // across files. -func TestUnit_Interop_ResourcesAreSortedByExportedName(t *testing.T) { +func TestUnit_Spec_ResourcesAreSortedByExportedName(t *testing.T) { t.Parallel() in := bp(attr("f", blueprint.KindString, blueprint.Optional)) diff --git a/internal/interop/export.go b/internal/spec/export.go similarity index 97% rename from internal/interop/export.go rename to internal/spec/export.go index 75e68b1c..f608c936 100644 --- a/internal/interop/export.go +++ b/internal/spec/export.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "fmt" @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-codegen-spec/datasource" "github.com/hashicorp/terraform-plugin-codegen-spec/provider" "github.com/hashicorp/terraform-plugin-codegen-spec/resource" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" ) @@ -21,10 +21,10 @@ import ( // presence, a nested object with no attributes. Everything else becomes a note, and // a heavily downgraded export is a success: the format has no way to express a CRUD // binding, and a tool that failed for that reason would never export anything. -func FromBlueprint(bp blueprint.Blueprint) (spec.Specification, Report, error) { +func FromBlueprint(bp blueprint.Blueprint) (hcspec.Specification, Report, error) { var r Report - out := spec.Specification{ + out := hcspec.Specification{ Version: SpecVersion, Provider: exportProvider(bp.Provider, &r), } @@ -50,7 +50,7 @@ func FromBlueprint(bp blueprint.Blueprint) (spec.Specification, Report, error) { converted, err := exportResource(res, &r) if err != nil { - return spec.Specification{}, r, err + return hcspec.Specification{}, r, err } out.Resources = append(out.Resources, converted) @@ -65,7 +65,7 @@ func FromBlueprint(bp blueprint.Blueprint) (spec.Specification, Report, error) { converted, err := exportDataSource(ds, &r) if err != nil { - return spec.Specification{}, r, err + return hcspec.Specification{}, r, err } out.DataSources = append(out.DataSources, converted) diff --git a/internal/interop/export_datasource.go b/internal/spec/export_datasource.go similarity index 99% rename from internal/interop/export_datasource.go rename to internal/spec/export_datasource.go index 63f26c28..43deb7a7 100644 --- a/internal/interop/export_datasource.go +++ b/internal/spec/export_datasource.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "fmt" diff --git a/internal/interop/export_resource.go b/internal/spec/export_resource.go similarity index 99% rename from internal/interop/export_resource.go rename to internal/spec/export_resource.go index 2193cd59..bf726c78 100644 --- a/internal/interop/export_resource.go +++ b/internal/spec/export_resource.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "fmt" diff --git a/internal/interop/import.go b/internal/spec/import.go similarity index 97% rename from internal/interop/import.go rename to internal/spec/import.go index 40364c35..8d4d80aa 100644 --- a/internal/interop/import.go +++ b/internal/spec/import.go @@ -1,11 +1,11 @@ -package interop +package spec import ( "fmt" "sort" "github.com/hashicorp/terraform-plugin-codegen-spec/resource" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/naming" @@ -68,7 +68,7 @@ func (o Options) typePrefix() string { // // The result is a draft. It has a schema and no bindings, so it cannot be emitted, // and Unauthored lists what a human has to write before it can be. -func ToBlueprint(s spec.Specification, opts Options) (blueprint.Blueprint, Report, error) { +func ToBlueprint(s hcspec.Specification, opts Options) (blueprint.Blueprint, Report, error) { var r Report if opts.Provider == "" { @@ -125,7 +125,7 @@ func ToBlueprint(s spec.Specification, opts Options) (blueprint.Blueprint, Repor return out, r, nil } -// namingOpts matches internal/ingest/openapi's, so a blueprint imported from a +// namingOpts matches internal/openapi's, so a blueprint imported from a // specification and one inferred from OpenAPI name things the same way. var namingOpts = naming.Options{StripPrefix: naming.DefaultStripPrefix} diff --git a/internal/interop/import_resource.go b/internal/spec/import_resource.go similarity index 99% rename from internal/interop/import_resource.go rename to internal/spec/import_resource.go index 883641fc..ac979ec1 100644 --- a/internal/interop/import_resource.go +++ b/internal/spec/import_resource.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "fmt" diff --git a/internal/interop/import_test.go b/internal/spec/import_test.go similarity index 90% rename from internal/interop/import_test.go rename to internal/spec/import_test.go index cd5cb94a..dd6454cf 100644 --- a/internal/interop/import_test.go +++ b/internal/spec/import_test.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "errors" @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-codegen-spec/provider" "github.com/hashicorp/terraform-plugin-codegen-spec/resource" "github.com/hashicorp/terraform-plugin-codegen-spec/schema" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" "github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint" ) @@ -26,7 +26,7 @@ func importOpts() Options { } } -// TestUnit_Interop_Roundtrip asserts the schema slice survives export and import +// TestUnit_Spec_Roundtrip asserts the schema slice survives export and import // unchanged. // // Only the schema slice: the round trip is lossy by construction, and asserting @@ -34,8 +34,8 @@ func importOpts() Options { // cannot carry is zeroed before the comparison, and the list of what gets zeroed is // itself the interesting part -- it is the same list the downgrade report produces, // so if a field is added to the IR and not classified, this test and -// TestUnit_Interop_Severities disagree with each other. -func TestUnit_Interop_Roundtrip(t *testing.T) { +// TestUnit_Spec_Severities disagree with each other. +func TestUnit_Spec_Roundtrip(t *testing.T) { t.Parallel() original := bp(everyKind()...) @@ -169,10 +169,10 @@ func normaliseDefault(d *blueprint.Default, kind blueprint.TypeKind) *blueprint. return &out } -// TestUnit_Interop_RoundtripStaticDefaults covers each static default type through +// TestUnit_Spec_RoundtripStaticDefaults covers each static default type through // both directions, which the every-kind fixture cannot: it uses custom defaults, // because only four kinds accept a static one. -func TestUnit_Interop_RoundtripStaticDefaults(t *testing.T) { +func TestUnit_Spec_RoundtripStaticDefaults(t *testing.T) { t.Parallel() tests := []struct { @@ -219,13 +219,13 @@ func TestUnit_Interop_RoundtripStaticDefaults(t *testing.T) { } } -// TestUnit_Interop_ExportImportExportIsByteStable is the property the milestone +// TestUnit_Spec_ExportImportExportIsByteStable is the property the milestone // names. // // Stronger than the struct comparison above and for a different reason: it catches an // asymmetry that happens to cancel out in the IR but shows up in the document -- an // import that drops a field the export re-derives, say. -func TestUnit_Interop_ExportImportExportIsByteStable(t *testing.T) { +func TestUnit_Spec_ExportImportExportIsByteStable(t *testing.T) { t.Parallel() first, _, err := FromBlueprint(bp(everyKind()...)) @@ -258,13 +258,13 @@ func TestUnit_Interop_ExportImportExportIsByteStable(t *testing.T) { } } -// TestUnit_Interop_Drafts is the guard on the whole draft mechanism. +// TestUnit_Spec_Drafts is the guard on the whole draft mechanism. // // DraftExt keeps an unemittable blueprint out of the pipeline by being a filename the // loader does not match. That is invisible: it depends entirely on findBlueprints // using a suffix test, and loosening it to a substring test would make every draft // loadable by emit in one line, with nothing failing nearby. -func TestUnit_Interop_Drafts(t *testing.T) { +func TestUnit_Spec_Drafts(t *testing.T) { t.Parallel() if strings.HasSuffix(DraftExt, blueprint.Ext) { @@ -277,7 +277,7 @@ func TestUnit_Interop_Drafts(t *testing.T) { } } -func TestUnit_Interop_ImportRequiresAProviderName(t *testing.T) { +func TestUnit_Spec_ImportRequiresAProviderName(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(attr("f", blueprint.KindString, blueprint.Optional))) @@ -302,18 +302,18 @@ func TestUnit_Interop_ImportRequiresAProviderName(t *testing.T) { } } -func TestUnit_Interop_ImportRefusals(t *testing.T) { +func TestUnit_Spec_ImportRefusals(t *testing.T) { t.Parallel() tests := []struct { name string - in spec.Specification + in hcspec.Specification want string is error }{ { name: "no resources", - in: spec.Specification{Version: SpecVersion}, + in: hcspec.Specification{Version: SpecVersion}, want: "no resources", is: ErrInvalidSpec, }, @@ -456,8 +456,8 @@ func TestUnit_Interop_ImportRefusals(t *testing.T) { } } -func specOf(res resource.Resource) spec.Specification { - return spec.Specification{Version: SpecVersion, Resources: resource.Resources{res}} +func specOf(res resource.Resource) hcspec.Specification { + return hcspec.Specification{Version: SpecVersion, Resources: resource.Resources{res}} } func resourceWith(attrs ...resource.Attribute) resource.Resource { @@ -467,11 +467,11 @@ func resourceWith(attrs ...resource.Attribute) resource.Resource { } } -// TestUnit_Interop_ImportConvertsBlocks: a block and a nested attribute are the same +// TestUnit_Spec_ImportConvertsBlocks: a block and a nested attribute are the same // data with different configuration syntax, so importing a hand-authored // specification that uses blocks must work -- and must say what it did, because the // choice is permanent once a provider is published. -func TestUnit_Interop_ImportConvertsBlocks(t *testing.T) { +func TestUnit_Spec_ImportConvertsBlocks(t *testing.T) { t.Parallel() child := resource.Attributes{{ @@ -534,10 +534,10 @@ func TestUnit_Interop_ImportConvertsBlocks(t *testing.T) { } } -// TestUnit_Interop_ImportPromotesAPlainDescription: a document that sets only the +// TestUnit_Spec_ImportPromotesAPlainDescription: a document that sets only the // plain description has its text reinterpreted as markdown, which is nearly always // harmless and occasionally not, so it is reported. -func TestUnit_Interop_ImportPromotesAPlainDescription(t *testing.T) { +func TestUnit_Spec_ImportPromotesAPlainDescription(t *testing.T) { t.Parallel() plain := "a_field_with_underscores" @@ -569,13 +569,13 @@ func TestUnit_Interop_ImportPromotesAPlainDescription(t *testing.T) { } } -// TestUnit_Interop_ImportedBlueprintIsNotEmittable is the point of the draft +// TestUnit_Spec_ImportedBlueprintIsNotEmittable is the point of the draft // mechanism, asserted rather than asserted-in-a-comment. // // An imported blueprint has a schema and no bindings. blueprint.Validate must refuse // it, because a blueprint that validated and then failed at emission would be a much // worse thing to hand somebody. -func TestUnit_Interop_ImportedBlueprintIsNotEmittable(t *testing.T) { +func TestUnit_Spec_ImportedBlueprintIsNotEmittable(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(everyKind()...)) @@ -603,10 +603,10 @@ func TestUnit_Interop_ImportedBlueprintIsNotEmittable(t *testing.T) { } } -// TestUnit_Interop_ImportReportsWhatMustBeAuthored: the unauthored fields are the +// TestUnit_Spec_ImportReportsWhatMustBeAuthored: the unauthored fields are the // whole output a human acts on, so their absence is reported rather than left to be // discovered by running emit. -func TestUnit_Interop_ImportReportsWhatMustBeAuthored(t *testing.T) { +func TestUnit_Spec_ImportReportsWhatMustBeAuthored(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(nested("items", blueprint.KindSetNested))) @@ -633,7 +633,7 @@ func TestUnit_Interop_ImportReportsWhatMustBeAuthored(t *testing.T) { } } -func TestUnit_Interop_ImportSkipsDataSourcesAndProviderSchema(t *testing.T) { +func TestUnit_Spec_ImportSkipsDataSourcesAndProviderSchema(t *testing.T) { t.Parallel() in := specOf(resourceWith(resource.Attribute{ @@ -661,10 +661,10 @@ func TestUnit_Interop_ImportSkipsDataSourcesAndProviderSchema(t *testing.T) { } } -// TestUnit_Interop_ImportCustomTypeIsReported: the blueprint has no field for a +// TestUnit_Spec_ImportCustomTypeIsReported: the blueprint has no field for a // custom type and value, so it is dropped -- loudly, because it is a deliberate // choice somebody made in the source document. -func TestUnit_Interop_ImportCustomTypeIsReported(t *testing.T) { +func TestUnit_Spec_ImportCustomTypeIsReported(t *testing.T) { t.Parallel() in := specOf(resourceWith(resource.Attribute{ @@ -693,10 +693,10 @@ func TestUnit_Interop_ImportCustomTypeIsReported(t *testing.T) { } } -func TestUnit_Interop_ImportSortsResourcesByKey(t *testing.T) { +func TestUnit_Spec_ImportSortsResourcesByKey(t *testing.T) { t.Parallel() - in := spec.Specification{Version: SpecVersion, Resources: resource.Resources{ + in := hcspec.Specification{Version: SpecVersion, Resources: resource.Resources{ resourceNamed("zebra"), resourceNamed("antelope"), }} @@ -719,7 +719,7 @@ func resourceNamed(name string) resource.Resource { }} } -func TestUnit_Interop_LowerFirstRune(t *testing.T) { +func TestUnit_Spec_LowerFirstRune(t *testing.T) { t.Parallel() tests := map[string]string{ @@ -735,7 +735,7 @@ func TestUnit_Interop_LowerFirstRune(t *testing.T) { } } -func TestUnit_Interop_PresenceFromToleratesAnUnknownValue(t *testing.T) { +func TestUnit_Spec_PresenceFromToleratesAnUnknownValue(t *testing.T) { t.Parallel() // Carried through rather than rejected: blueprint.Validate refuses it with a @@ -745,14 +745,14 @@ func TestUnit_Interop_PresenceFromToleratesAnUnknownValue(t *testing.T) { } } -// TestUnit_Interop_ImportDefaultsCarryBothForms covers a default that has a custom +// TestUnit_Spec_ImportDefaultsCarryBothForms covers a default that has a custom // definition and a static value at once. // // Upstream allows both on the same field, and the readers build the blueprint default // incrementally, so "custom present, static absent" and "both present" take different // paths through the same function. Getting the second wrong would drop one of them // silently. -func TestUnit_Interop_ImportDefaultsCarryBothForms(t *testing.T) { +func TestUnit_Spec_ImportDefaultsCarryBothForms(t *testing.T) { t.Parallel() custom := &schema.CustomDefault{ @@ -809,10 +809,10 @@ func TestUnit_Interop_ImportDefaultsCarryBothForms(t *testing.T) { } } -// TestUnit_Interop_ImportSkipsNilValidators: upstream's slice elements hold a pointer, +// TestUnit_Spec_ImportSkipsNilValidators: upstream's slice elements hold a pointer, // so a document can declare a validator entry with nothing in it. Dereferencing that // would panic on input a schema-valid document can legitimately contain. -func TestUnit_Interop_ImportSkipsNilValidators(t *testing.T) { +func TestUnit_Spec_ImportSkipsNilValidators(t *testing.T) { t.Parallel() in := specOf(resourceWith(resource.Attribute{ @@ -835,9 +835,9 @@ func TestUnit_Interop_ImportSkipsNilValidators(t *testing.T) { } } -// TestUnit_Interop_ImportCollectionsOfCollections covers the recursive element walk in +// TestUnit_Spec_ImportCollectionsOfCollections covers the recursive element walk in // the import direction, which the pilot only exercises one level deep. -func TestUnit_Interop_ImportCollectionsOfCollections(t *testing.T) { +func TestUnit_Spec_ImportCollectionsOfCollections(t *testing.T) { t.Parallel() in := specOf(resourceWith(resource.Attribute{ @@ -865,8 +865,8 @@ func TestUnit_Interop_ImportCollectionsOfCollections(t *testing.T) { } } -// TestUnit_Interop_ImportEveryScalarElementType covers the remaining element branches. -func TestUnit_Interop_ImportEveryScalarElementType(t *testing.T) { +// TestUnit_Spec_ImportEveryScalarElementType covers the remaining element branches. +func TestUnit_Spec_ImportEveryScalarElementType(t *testing.T) { t.Parallel() elems := map[blueprint.TypeKind]schema.ElementType{ @@ -900,7 +900,7 @@ func TestUnit_Interop_ImportEveryScalarElementType(t *testing.T) { } } -func TestUnit_Interop_Unauthored(t *testing.T) { +func TestUnit_Spec_Unauthored(t *testing.T) { t.Parallel() s, _, err := FromBlueprint(bp(nested("items", blueprint.KindSetNested))) diff --git a/internal/interop/kinds_test.go b/internal/spec/kinds_test.go similarity index 94% rename from internal/interop/kinds_test.go rename to internal/spec/kinds_test.go index 0fc23518..25392497 100644 --- a/internal/interop/kinds_test.go +++ b/internal/spec/kinds_test.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "context" @@ -23,7 +23,7 @@ import ( // // A custom default rather than a static one, because every kind accepts a custom // default while only four accept a static one. Static defaults are covered -// separately in TestUnit_Interop_Defaults. +// separately in TestUnit_Spec_Defaults. func everyKind() []blueprint.Attribute { kinds := []blueprint.TypeKind{ blueprint.KindBool, blueprint.KindString, @@ -83,9 +83,9 @@ func everyKind() []blueprint.Attribute { return out } -// TestUnit_Interop_EveryKindExportsAsAResource drives all thirteen branches of the +// TestUnit_Spec_EveryKindExportsAsAResource drives all thirteen branches of the // resource switch, with validators, modifiers and defaults attached to each. -func TestUnit_Interop_EveryKindExportsAsAResource(t *testing.T) { +func TestUnit_Spec_EveryKindExportsAsAResource(t *testing.T) { t.Parallel() attrs := everyKind() @@ -167,13 +167,13 @@ func resourceExtras(a resource.Attribute) (validators, modifiers int, hasDefault } } -// TestUnit_Interop_EveryKindExportsAsADataSource drives the datasource switch. +// TestUnit_Spec_EveryKindExportsAsADataSource drives the datasource switch. // // The same thirteen kinds, and the same assertion that each landed in exactly one // field with its validator. Plan modifiers and defaults are expected to be *absent* // here -- the datasource package has no such fields -- and reported as losses, which // is asserted rather than assumed. -func TestUnit_Interop_EveryKindExportsAsADataSource(t *testing.T) { +func TestUnit_Spec_EveryKindExportsAsADataSource(t *testing.T) { t.Parallel() attrs := everyKind() @@ -253,9 +253,9 @@ func datasourceValidators(a datasource.Attribute) int { } } -// TestUnit_Interop_ElementTypesOfEveryScalar covers the element-type walk, which is +// TestUnit_Spec_ElementTypesOfEveryScalar covers the element-type walk, which is // a separate switch from the attribute one and equally unreachable from the pilot. -func TestUnit_Interop_ElementTypesOfEveryScalar(t *testing.T) { +func TestUnit_Spec_ElementTypesOfEveryScalar(t *testing.T) { t.Parallel() scalars := []blueprint.TypeKind{ @@ -289,13 +289,13 @@ func TestUnit_Interop_ElementTypesOfEveryScalar(t *testing.T) { } } -// TestUnit_Interop_NestedObjectInAnElementType covers the branch that flattens a +// TestUnit_Spec_NestedObjectInAnElementType covers the branch that flattens a // nested shape reached through Elem into a plain object type. // // The blueprint does not produce this today -- nested shapes live on the attribute, // not in Elem -- so the branch exists to report a real loss rather than panic if // that ever changes. Testing it now is what makes that promise true. -func TestUnit_Interop_NestedObjectInAnElementType(t *testing.T) { +func TestUnit_Spec_NestedObjectInAnElementType(t *testing.T) { t.Parallel() in := bp(blueprint.Attribute{ @@ -352,7 +352,7 @@ func TestUnit_Interop_NestedObjectInAnElementType(t *testing.T) { } } -func TestUnit_Interop_ObjectTypeRefusals(t *testing.T) { +func TestUnit_Spec_ObjectTypeRefusals(t *testing.T) { t.Parallel() // A dropped child inside a flattened object is omitted and counted. @@ -422,9 +422,9 @@ func TestUnit_Interop_ObjectTypeRefusals(t *testing.T) { } } -// TestUnit_Interop_ResourceLossesAreSelective: the resource-level sections are +// TestUnit_Spec_ResourceLossesAreSelective: the resource-level sections are // reported only when populated, for the same reason Behaviour is. -func TestUnit_Interop_ResourceLossesAreSelective(t *testing.T) { +func TestUnit_Spec_ResourceLossesAreSelective(t *testing.T) { t.Parallel() bare := bp(attr("f", blueprint.KindString, blueprint.Optional)) diff --git a/internal/interop/note.go b/internal/spec/note.go similarity index 96% rename from internal/interop/note.go rename to internal/spec/note.go index 6b3405d0..c5cb4d03 100644 --- a/internal/interop/note.go +++ b/internal/spec/note.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "encoding/json" @@ -48,19 +48,19 @@ func (s Severity) rank() int { } } -// Note is one thing the official format could not carry. +// Loss is one thing the official format could not carry. // // Path addresses a node in the blueprint using the same dotted form // blueprint.Validate uses, because interop losses happen at depths a // resource-plus-field pair cannot reach: an unrepresentable default inside a // nested object needs to be named, not described. -type Note struct { +type Loss struct { Severity Severity `json:"severity"` Path string `json:"path"` Message string `json:"message"` } -func (n Note) String() string { +func (n Loss) String() string { return fmt.Sprintf("%-7s %s: %s", n.Severity, n.Path, n.Message) } @@ -70,7 +70,7 @@ func (n Note) String() string { // that converted everything both produce an empty error, and without the counts // they are indistinguishable in a log. type Report struct { - Notes []Note `json:"notes,omitempty"` + Notes []Loss `json:"notes,omitempty"` Resources int `json:"resources"` DataSources int `json:"dataSources"` @@ -89,7 +89,7 @@ type Report struct { func (r *Report) add(sev Severity, path, format string, args ...any) { r.Notes = append( r.Notes, - Note{Severity: sev, Path: path, Message: fmt.Sprintf(format, args...)}, + Loss{Severity: sev, Path: path, Message: fmt.Sprintf(format, args...)}, ) } @@ -129,8 +129,8 @@ func (r Report) Err(strict bool) error { // // Sorting by path rather than by discovery order means the report of a given // blueprint is byte-stable, which is what lets a CI job diff it. -func (r Report) Sorted() []Note { - out := make([]Note, len(r.Notes)) +func (r Report) Sorted() []Loss { + out := make([]Loss, len(r.Notes)) copy(out, r.Notes) sort.SliceStable(out, func(i, j int) bool { @@ -188,7 +188,7 @@ func (r Report) MarshalJSON() ([]byte, error) { // // Keys are the dotted path suffix the note is addressed at, relative to whatever // node is being converted. -var taxonomy = map[string]Note{ +var taxonomy = map[string]Loss{ // Provider-level. The official provider block carries a name and a // configuration schema, and nothing else. "provider.schema": { @@ -365,7 +365,7 @@ func (r *Report) note(key, at string) { path = entry.Path } - r.Notes = append(r.Notes, Note{Severity: entry.Severity, Path: path, Message: entry.Message}) + r.Notes = append(r.Notes, Loss{Severity: entry.Severity, Path: path, Message: entry.Message}) } // noteCount records an aggregated loss, stating how many nodes it covers. @@ -380,7 +380,7 @@ func (r *Report) noteCount(key, at string, n int) { return } - r.Notes = append(r.Notes, Note{ + r.Notes = append(r.Notes, Loss{ Severity: entry.Severity, Path: at, Message: fmt.Sprintf("%s (%d affected)", entry.Message, n), diff --git a/internal/interop/prepared.go b/internal/spec/prepared.go similarity index 99% rename from internal/interop/prepared.go rename to internal/spec/prepared.go index 1c42362c..be6046f2 100644 --- a/internal/interop/prepared.go +++ b/internal/spec/prepared.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "fmt" @@ -21,7 +21,7 @@ import ( // type holds all of that, converted once, and the per-package assembler does // nothing but choose which pointer field to set. // -// It is the same division the house draws between internal/render and +// It is the same division the house draws between internal/generate's views and // internal/templates: every decision happens here, and reading export_resource.go // should tell you the shape of the output without containing any logic to reason // about. It carries no JSON tags because it is never serialised, which is also why diff --git a/internal/interop/interop.go b/internal/spec/spec.go similarity index 90% rename from internal/interop/interop.go rename to internal/spec/spec.go index 59f1a8c3..c2be4e3a 100644 --- a/internal/interop/interop.go +++ b/internal/spec/spec.go @@ -23,7 +23,7 @@ // tagliatelle with a camelCase default, so redeclaring the upstream structs here // would put a linter exclusion on every field. Using HashiCorp's types directly // means there are no local tags to lint, and no second definition to drift. -package interop +package spec import ( "bytes" @@ -32,18 +32,18 @@ import ( "errors" "fmt" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" ) // SpecVersion is the Provider Code Specification version this package reads and // writes. // // It is taken from upstream rather than written out here, because a literal would -// drift silently. The value matters more than it looks: spec.Validate switches on +// drift silently. The value matters more than it looks: hcspec.Validate switches on // the document's version string exactly, so "0.1" is accepted and "0.1.0" is // rejected -- despite the published documentation showing the three-part form. // TestUnit_Interop_Version pins both halves of that. -const SpecVersion = spec.Version0_1 +const SpecVersion = hcspec.Version0_1 var ( // ErrUnrepresentable is returned for a value the official format has no way to @@ -71,7 +71,7 @@ const jsonIndent = " " // The spec package has no marshalling helper, so this is encoding/json with the // same settings blueprint.Marshal uses. Canonical means byte-stable for a given // value, which is what lets CI commit the export and fail on any diff. -func Marshal(s spec.Specification) ([]byte, error) { +func Marshal(s hcspec.Specification) ([]byte, error) { var buf bytes.Buffer enc := json.NewEncoder(&buf) @@ -90,15 +90,15 @@ func Marshal(s spec.Specification) ([]byte, error) { // Parse validates a document against the embedded JSON schema for its declared // version, then decodes it. // -// spec.Parse already does both, in that order; this wraps it so the failure +// hcspec.Parse already does both, in that order; this wraps it so the failure // carries ErrInvalidSpec and the caller can tell "your input is wrong" from "I // could not write the output". Note that upstream's schema-error collection keeps // only the last violation, so a document with several problems reports one -- the // message is still specific enough to act on, but it is not exhaustive. -func Parse(ctx context.Context, data []byte) (spec.Specification, error) { - s, err := spec.Parse(ctx, data) +func Parse(ctx context.Context, data []byte) (hcspec.Specification, error) { + s, err := hcspec.Parse(ctx, data) if err != nil { - return spec.Specification{}, fmt.Errorf("%w: %w", ErrInvalidSpec, err) + return hcspec.Specification{}, fmt.Errorf("%w: %w", ErrInvalidSpec, err) } return s, nil @@ -106,7 +106,7 @@ func Parse(ctx context.Context, data []byte) (spec.Specification, error) { // Validate reports whether a document satisfies the embedded JSON schema. func Validate(ctx context.Context, data []byte) error { - if err := spec.Validate(ctx, data); err != nil { + if err := hcspec.Validate(ctx, data); err != nil { return fmt.Errorf("%w: %w", ErrInvalidSpec, err) } diff --git a/internal/interop/interop_test.go b/internal/spec/spec_test.go similarity index 89% rename from internal/interop/interop_test.go rename to internal/spec/spec_test.go index ca1b2d0a..1448d630 100644 --- a/internal/interop/interop_test.go +++ b/internal/spec/spec_test.go @@ -1,4 +1,4 @@ -package interop +package spec import ( "context" @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-codegen-spec/provider" "github.com/hashicorp/terraform-plugin-codegen-spec/resource" "github.com/hashicorp/terraform-plugin-codegen-spec/schema" - "github.com/hashicorp/terraform-plugin-codegen-spec/spec" + hcspec "github.com/hashicorp/terraform-plugin-codegen-spec/spec" ) // minimalSpec is the smallest document that satisfies the embedded schema, used by @@ -18,8 +18,8 @@ import ( // "version" as the two required top-level keys, so a document without a provider // block is invalid however little it has to say about the provider. Only "name" is // required within it, which is what makes the name-only projection legitimate. -func minimalSpec() spec.Specification { - return spec.Specification{ +func minimalSpec() hcspec.Specification { + return hcspec.Specification{ Version: SpecVersion, Provider: &provider.Provider{Name: "thousandeyes"}, Resources: resource.Resources{{ @@ -36,7 +36,7 @@ func minimalSpec() spec.Specification { } } -// TestUnit_Interop_Version pins the version string. +// TestUnit_Spec_Version pins the version string. // // Four assertions, because each catches a different mistake. The published // documentation for this format shows "0.1.0"; upstream's validator switches on the @@ -44,7 +44,7 @@ func minimalSpec() spec.Specification { // from the docs produces a document no tool will read, and the failure is a bare // "version is unsupported" a long way from the cause. So the trap is recorded here // rather than in a comment. -func TestUnit_Interop_Version(t *testing.T) { +func TestUnit_Spec_Version(t *testing.T) { t.Parallel() ctx := context.Background() @@ -78,14 +78,14 @@ func TestUnit_Interop_Version(t *testing.T) { } } -// TestUnit_Interop_Bytes covers byte-stability and the pointer discipline. +// TestUnit_Spec_Bytes covers byte-stability and the pointer discipline. // // The pointer half is the part worth having: every optional string and bool in the // official format is a pointer, and writing a zero value rather than nil produces a // document full of `"sensitive": false` lines that say nothing. On a seventeen // attribute resource that is the difference between a reviewable document and one // nobody reads. -func TestUnit_Interop_Bytes(t *testing.T) { +func TestUnit_Spec_Bytes(t *testing.T) { t.Parallel() first, err := Marshal(minimalSpec()) @@ -116,10 +116,10 @@ func TestUnit_Interop_Bytes(t *testing.T) { } } -// TestUnit_Interop_MarshalEscaping: descriptions carry angle brackets and +// TestUnit_Spec_MarshalEscaping: descriptions carry angle brackets and // ampersands, and Go's encoder escapes them by default. In a document meant to be // read by a human that turns "a < b" into "a < b" for no benefit. -func TestUnit_Interop_MarshalEscaping(t *testing.T) { +func TestUnit_Spec_MarshalEscaping(t *testing.T) { t.Parallel() s := minimalSpec() @@ -136,7 +136,7 @@ func TestUnit_Interop_MarshalEscaping(t *testing.T) { } } -func TestUnit_Interop_ParseRejectsBadInput(t *testing.T) { +func TestUnit_Spec_ParseRejectsBadInput(t *testing.T) { t.Parallel() ctx := context.Background() diff --git a/internal/templates/action.go.tmpl b/internal/templates/action.go.tmpl index e991bd03..44cfd1b5 100644 --- a/internal/templates/action.go.tmpl +++ b/internal/templates/action.go.tmpl @@ -9,8 +9,8 @@ import ( ) const ( - // ActionName is the Terraform type this action registers as. - ActionName = "{{ .ActionName }}" + // TypeName is the Terraform type this action registers as. + TypeName = "{{ .ActionName }}" // InvokeTimeout is the deadline in seconds. One operation, one deadline -- and unlike a // resource there is no timeouts block to override it, because the framework's action @@ -50,7 +50,7 @@ type {{ .GoTypeName }} struct { // Metadata returns the action type name. func (a *{{ .GoTypeName }}) Metadata(_ context.Context, _ action.MetadataRequest, resp *action.MetadataResponse) { - resp.TypeName = ActionName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. @@ -58,7 +58,7 @@ func (a *{{ .GoTypeName }}) Metadata(_ context.Context, _ action.MetadataRequest // action.ConfigureRequest, which is its own type: the framework gives each block kind a // distinct one, so this cannot share the resource's helper. func (a *{{ .GoTypeName }}) Configure(ctx context.Context, req action.ConfigureRequest, resp *action.ConfigureResponse) { - a.client = client.ForAction(ctx, req, resp, ActionName) + a.client = client.ForAction(ctx, req, resp, TypeName) } // Schema returns the action schema. diff --git a/internal/templates/action_invoke.go.tmpl b/internal/templates/action_invoke.go.tmpl index 4cec291d..066169b6 100644 --- a/internal/templates/action_invoke.go.tmpl +++ b/internal/templates/action_invoke.go.tmpl @@ -20,7 +20,7 @@ func (a *{{ $.GoTypeName }}) Invoke(ctx context.Context, req action.InvokeReques return } - tflog.Debug(ctx, "invoking action", map[string]any{"action": ActionName}) + tflog.Debug(ctx, "invoking action", map[string]any{"action": TypeName}) // A nil client is a provider bug -- Configure must populate ActionData -- and the // first live run proved the failure mode is a segfault that kills the whole provider @@ -48,11 +48,11 @@ func (a *{{ $.GoTypeName }}) Invoke(ctx context.Context, req action.InvokeReques {{ .Assign }} {{ .Call }} if err != nil { - errors.Handle(&resp.Diagnostics, ActionName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } - tflog.Debug(ctx, "action completed", map[string]any{"action": ActionName}) + tflog.Debug(ctx, "action completed", map[string]any{"action": TypeName}) } {{ end }} diff --git a/internal/templates/construct.go.tmpl b/internal/templates/construct.go.tmpl index 901c7c6c..7b2d4622 100644 --- a/internal/templates/construct.go.tmpl +++ b/internal/templates/construct.go.tmpl @@ -19,7 +19,7 @@ func constructResource(ctx context.Context, data *{{ .ModelTypeName }}) (*{{ .Co {{- else }} func constructResource(ctx context.Context, data *{{ .ModelTypeName }}) *{{ .Construct.RequestType }} { {{- end }} - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := {{ .Construct.ConstructorExpr }} {{ range .Construct.Assignments }} @@ -48,7 +48,7 @@ func constructResourceUpdate(ctx context.Context, data *{{ .ModelTypeName }}) (* {{- else }} func constructResourceUpdate(ctx context.Context, data *{{ .ModelTypeName }}) *{{ .Construct.Update.RequestType }} { {{- end }} - tflog.Debug(ctx, "constructing update request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing update request body", map[string]any{"resource": TypeName}) body := {{ .Construct.Update.ConstructorExpr }} {{ range .Construct.Update.Assignments }} diff --git a/internal/templates/crud.go.tmpl b/internal/templates/crud.go.tmpl index 1ba178c9..ea5729b0 100644 --- a/internal/templates/crud.go.tmpl +++ b/internal/templates/crud.go.tmpl @@ -16,7 +16,7 @@ func (r *{{ $.GoTypeName }}) Create(ctx context.Context, req resource.CreateRequ return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, {{ .Phase }}, {{ .TimeoutConst }}*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -37,7 +37,7 @@ func (r *{{ $.GoTypeName }}) Create(ctx context.Context, req resource.CreateRequ {{ .Assign }} {{ .Call }} if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } @@ -79,7 +79,7 @@ func (r *{{ $.GoTypeName }}) Read(ctx context.Context, req resource.ReadRequest, return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, {{ .Phase }}, {{ .TimeoutConst }}*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -98,7 +98,7 @@ func (r *{{ $.GoTypeName }}) Read(ctx context.Context, req resource.ReadRequest, // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -140,7 +140,7 @@ func (r *{{ $.GoTypeName }}) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -184,7 +184,7 @@ func (r *{{ $.GoTypeName }}) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: {{ $.CRUD.ReadBackMaxRetries }}, Interval: {{ $.CRUD.ReadBackIntervalMS }} * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), {{- if $.CRUD.ReadBackReason }} Reason: {{ printf "%q" $.CRUD.ReadBackReason }}, @@ -215,7 +215,7 @@ func (r *{{ $.GoTypeName }}) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -232,7 +232,7 @@ func (r *{{ $.GoTypeName }}) Update(ctx context.Context, req resource.UpdateRequ return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, {{ .Phase }}, {{ .TimeoutConst }}*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -265,7 +265,7 @@ func (r *{{ $.GoTypeName }}) Update(ctx context.Context, req resource.UpdateRequ {{ .Assign }} {{ .Call }} if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } @@ -318,7 +318,7 @@ func (r *{{ $.GoTypeName }}) Delete(ctx context.Context, req resource.DeleteRequ return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, {{ .Phase }}, {{ .TimeoutConst }}*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -335,7 +335,7 @@ func (r *{{ $.GoTypeName }}) Delete(ctx context.Context, req resource.DeleteRequ return } {{- end }} - errors.Handle(&resp.Diagnostics, ResourceName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } diff --git a/internal/templates/datasource.go.tmpl b/internal/templates/datasource.go.tmpl index ad93b844..4bb57d87 100644 --- a/internal/templates/datasource.go.tmpl +++ b/internal/templates/datasource.go.tmpl @@ -7,8 +7,8 @@ import ( ) const ( - // DataSourceName is the Terraform type this data source registers as. - DataSourceName = "{{ .DataSourceName }}" + // TypeName is the Terraform type this data source registers as. + TypeName = "{{ .DataSourceName }}" // ReadTimeout is the default read deadline in seconds. A practitioner overrides it // with the data source's timeouts block. Read is the only operation a data source @@ -45,12 +45,12 @@ type {{ .GoTypeName }} struct { // Metadata returns the data source type name. func (d *{{ .GoTypeName }}) Metadata(_ context.Context, _ datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = DataSourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (d *{{ .GoTypeName }}) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - d.client = client.ForDataSource(ctx, req, resp, DataSourceName) + d.client = client.ForDataSource(ctx, req, resp, TypeName) } // Schema returns the data source schema. diff --git a/internal/templates/datasource_read.go.tmpl b/internal/templates/datasource_read.go.tmpl index aa899f7c..60240119 100644 --- a/internal/templates/datasource_read.go.tmpl +++ b/internal/templates/datasource_read.go.tmpl @@ -19,7 +19,7 @@ func (d *{{ $.GoTypeName }}) Read(ctx context.Context, req datasource.ReadReques return } - tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": TypeName}) ctx, cancel := crud.HandleTimeout(ctx, data.Timeouts.Read, ReadTimeout*time.Second, &resp.Diagnostics) if cancel == nil { @@ -33,7 +33,7 @@ func (d *{{ $.GoTypeName }}) Read(ctx context.Context, req datasource.ReadReques // drop state: the practitioner named something that is not there, and silently // returning nothing would leave whatever referenced it failing further on with // no indication of why. - errors.Handle(&resp.Diagnostics, DataSourceName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } diff --git a/internal/templates/datasource_state.go.tmpl b/internal/templates/datasource_state.go.tmpl index cb1275d0..4e326f33 100644 --- a/internal/templates/datasource_state.go.tmpl +++ b/internal/templates/datasource_state.go.tmpl @@ -20,7 +20,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving state untouched", map[string]any{ - "dataSource": DataSourceName, + "dataSource": TypeName, }) return diags } @@ -28,7 +28,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, remote *{{ .State.ResponseType }}) { if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving state untouched", map[string]any{ - "dataSource": DataSourceName, + "dataSource": TypeName, }) return } @@ -37,7 +37,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, {{ . }} {{- end }} - tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": TypeName}) {{- if .State.NeedsDiagnostics }} return diags diff --git a/internal/templates/ephemeral.go.tmpl b/internal/templates/ephemeral.go.tmpl index affa339b..539b2f7f 100644 --- a/internal/templates/ephemeral.go.tmpl +++ b/internal/templates/ephemeral.go.tmpl @@ -7,8 +7,8 @@ import ( ) const ( - // EphemeralName is the Terraform type this ephemeral resource registers as. - EphemeralName = "{{ .EphemeralName }}" + // TypeName is the Terraform type this ephemeral resource registers as. + TypeName = "{{ .EphemeralName }}" // OpenTimeout is the open deadline in seconds. Open is the one operation this // ephemeral has, and an ephemeral schema carries no timeouts block for a @@ -45,12 +45,12 @@ type {{ .GoTypeName }} struct { // Metadata returns the ephemeral resource type name. func (e *{{ .GoTypeName }}) Metadata(_ context.Context, _ ephemeral.MetadataRequest, resp *ephemeral.MetadataResponse) { - resp.TypeName = EphemeralName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (e *{{ .GoTypeName }}) Configure(ctx context.Context, req ephemeral.ConfigureRequest, resp *ephemeral.ConfigureResponse) { - e.client = client.ForEphemeral(ctx, req, resp, EphemeralName) + e.client = client.ForEphemeral(ctx, req, resp, TypeName) } // Schema returns the ephemeral resource schema. diff --git a/internal/templates/ephemeral_open.go.tmpl b/internal/templates/ephemeral_open.go.tmpl index c5a67385..d0a97499 100644 --- a/internal/templates/ephemeral_open.go.tmpl +++ b/internal/templates/ephemeral_open.go.tmpl @@ -20,7 +20,7 @@ func (e *{{ $.GoTypeName }}) Open(ctx context.Context, req ephemeral.OpenRequest return } - tflog.Debug(ctx, "opening ephemeral resource", map[string]any{"ephemeral": EphemeralName}) + tflog.Debug(ctx, "opening ephemeral resource", map[string]any{"ephemeral": TypeName}) // A nil client is a provider bug -- Configure must populate EphemeralResourceData -- // and the first live run proved the failure mode is a segfault that kills the whole @@ -43,7 +43,7 @@ func (e *{{ $.GoTypeName }}) Open(ctx context.Context, req ephemeral.OpenRequest // A missing object is an error rather than an empty result: the practitioner // named something that is not there, and whatever was going to consume the value // would fail further on with no indication of why. - errors.Handle(&resp.Diagnostics, EphemeralName, {{ .ErrorOp }}, err) + errors.Handle(&resp.Diagnostics, TypeName, {{ .ErrorOp }}, err) return } diff --git a/internal/templates/ephemeral_state.go.tmpl b/internal/templates/ephemeral_state.go.tmpl index 245c7321..fd3041a8 100644 --- a/internal/templates/ephemeral_state.go.tmpl +++ b/internal/templates/ephemeral_state.go.tmpl @@ -19,7 +19,7 @@ func mapRemoteToResult(ctx context.Context, data *{{ .ModelTypeName }}, remote * if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving the result untouched", map[string]any{ - "ephemeral": EphemeralName, + "ephemeral": TypeName, }) return diags } @@ -27,7 +27,7 @@ func mapRemoteToResult(ctx context.Context, data *{{ .ModelTypeName }}, remote * func mapRemoteToResult(ctx context.Context, data *{{ .ModelTypeName }}, remote *{{ .State.ResponseType }}) { if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving the result untouched", map[string]any{ - "ephemeral": EphemeralName, + "ephemeral": TypeName, }) return } @@ -36,7 +36,7 @@ func mapRemoteToResult(ctx context.Context, data *{{ .ModelTypeName }}, remote * {{ . }} {{- end }} - tflog.Debug(ctx, "mapped remote result", map[string]any{"ephemeral": EphemeralName}) + tflog.Debug(ctx, "mapped remote result", map[string]any{"ephemeral": TypeName}) {{- if .State.NeedsDiagnostics }} return diags diff --git a/internal/templates/list_resource.go.tmpl b/internal/templates/list_resource.go.tmpl index 62aeb64f..fddc6422 100644 --- a/internal/templates/list_resource.go.tmpl +++ b/internal/templates/list_resource.go.tmpl @@ -30,20 +30,20 @@ type {{ .List.GoTypeName }} struct { // // That equality is the entire linkage between a list resource and the resource it lists -- // there is no import from one to the other -- and the framework returns an error diagnostic -// from GetMetadata if they differ. Both read ResourceName for exactly that reason. +// from GetMetadata if they differ. Both read TypeName for exactly that reason. // // The request and response types are resource.* and not list.*. The framework declares them // that way so one implementation can satisfy both interfaces, and reaching for list.Metadata // here is the mistake that shape invites. func (l *{{ .List.GoTypeName }}) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. // // resource.ConfigureRequest again, not a list-specific type. func (l *{{ .List.GoTypeName }}) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - l.client = client.ForResource(ctx, req, resp, ResourceName) + l.client = client.ForResource(ctx, req, resp, TypeName) } // ListResourceConfigSchema returns the schema for a query block. @@ -87,7 +87,7 @@ type {{ .List.FilterModelType }} struct { // per element for data the query may not use. {{- end }} func (l *{{ $.List.GoTypeName }}) List(ctx context.Context, req list.ListRequest, stream *list.ListResultsStream) { - tflog.Debug(ctx, "listing resources", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "listing resources", map[string]any{"resource": TypeName}) // A nil client is a provider bug -- Configure must populate ListResourceData -- and // the failure mode without this guard is a segfault that kills the whole provider @@ -117,7 +117,7 @@ func (l *{{ $.List.GoTypeName }}) List(ctx context.Context, req list.ListRequest {{ .Assign }} {{ .Call }} if err != nil { var diags diag.Diagnostics - errors.Handle(&diags, ResourceName, {{ .ErrorOp }}, err) + errors.Handle(&diags, TypeName, {{ .ErrorOp }}, err) stream.Results = list.ListResultsStreamDiagnostics(diags) diff --git a/internal/templates/predicate.go.tmpl b/internal/templates/predicate.go.tmpl index d4af6fa1..287a4293 100644 --- a/internal/templates/predicate.go.tmpl +++ b/internal/templates/predicate.go.tmpl @@ -34,7 +34,7 @@ import ( // touches on write. func readBackLanded(ctx context.Context, state *{{ .ModelTypeName }}) bool { tflog.Trace(ctx, "read-back predicate not implemented, accepting the first read", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return true diff --git a/internal/templates/resource.go.tmpl b/internal/templates/resource.go.tmpl index 5d1d7077..acd4a4b7 100644 --- a/internal/templates/resource.go.tmpl +++ b/internal/templates/resource.go.tmpl @@ -7,8 +7,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "{{ .ResourceName }}" + // TypeName is the Terraform type this resource registers as. + TypeName = "{{ .ResourceName }}" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -47,12 +47,12 @@ type {{ .GoTypeName }} struct { // Metadata returns the resource type name. func (r *{{ .GoTypeName }}) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *{{ .GoTypeName }}) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } {{ if .ImportState }} // ImportState maps a terraform import into state. diff --git a/internal/templates/state.go.tmpl b/internal/templates/state.go.tmpl index f6262e3f..a486bd90 100644 --- a/internal/templates/state.go.tmpl +++ b/internal/templates/state.go.tmpl @@ -20,7 +20,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -28,7 +28,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, remote *{{ .State.ResponseType }}) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -37,7 +37,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *{{ .ModelTypeName }}, {{ . }} {{- end }} - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) {{- if .State.NeedsDiagnostics }} return diags diff --git a/internal/templates/templates.go b/internal/templates/templates.go index f22af742..96cc9ef7 100644 --- a/internal/templates/templates.go +++ b/internal/templates/templates.go @@ -5,7 +5,7 @@ // without reading the generator that drives it. That is the same reasoning the // sibling SDK generator uses, and it is the reason these files contain no logic: // every value they interpolate is a finished string precomputed in -// internal/render, and the only conditionals are over presence. +// internal/generate, and the only conditionals are over presence. // // If a template needs to decide something, the decision belongs in render. package templates diff --git a/openapi-specs/thousandeyes/7.0.97-t1785152261691/api.yaml b/openapi/thousandeyes/7.0.97-t1785152261691/api.yaml similarity index 100% rename from openapi-specs/thousandeyes/7.0.97-t1785152261691/api.yaml rename to openapi/thousandeyes/7.0.97-t1785152261691/api.yaml diff --git a/openapi-specs/thousandeyes/7.0.97-t1785152261691/metadata.json b/openapi/thousandeyes/7.0.97-t1785152261691/metadata.json similarity index 100% rename from openapi-specs/thousandeyes/7.0.97-t1785152261691/metadata.json rename to openapi/thousandeyes/7.0.97-t1785152261691/metadata.json diff --git a/openapi-specs/thousandeyes/7.0.98-t1785502133469/api.yaml b/openapi/thousandeyes/7.0.98-t1785502133469/api.yaml similarity index 100% rename from openapi-specs/thousandeyes/7.0.98-t1785502133469/api.yaml rename to openapi/thousandeyes/7.0.98-t1785502133469/api.yaml diff --git a/openapi-specs/thousandeyes/7.0.98-t1785502133469/metadata.json b/openapi/thousandeyes/7.0.98-t1785502133469/metadata.json similarity index 100% rename from openapi-specs/thousandeyes/7.0.98-t1785502133469/metadata.json rename to openapi/thousandeyes/7.0.98-t1785502133469/metadata.json diff --git a/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json b/pilot/thousandeyes/.tfpfgen/manifest.json similarity index 61% rename from pilot/thousandeyes/.tfpluginframeworkgen/manifest.json rename to pilot/thousandeyes/.tfpfgen/manifest.json index 6f888d69..61c5521f 100644 --- a/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json +++ b/pilot/thousandeyes/.tfpfgen/manifest.json @@ -4,1207 +4,1187 @@ "files": [ { "path": "internal/provider/actions.go", - "sha256": "f86efac52eb001296b204e43c52e2a383bdf1d78505aafa61cad55641fca30c7", + "sha256": "0ef058453af609404381b9fbe84bfba5f43fb8ecd77c8ceb9120dc32830c3968", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/provider/datasources.go", - "sha256": "246628d7d311ec1f8bd039b99595a61b900ffb97de40142bff0bf10452359f65", + "sha256": "41994de1e002a7b0fad437958f39dfd9378803fbdb96541d0d453cbf3a6d0afa", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/provider/ephemerals.go", - "sha256": "ead4096ffd096f7e061dfacfda3cf327c5918f8b520f26212ce6bf92951296f1", + "sha256": "a116c47277392c7ed46be53c8d708a64b052e19601455d80661e8377efafeab3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/provider/list_resources.go", - "sha256": "3c5a89520d0c923d840b956fb448483af091b4018a0a15d2f3b37465b0f48948", + "sha256": "7404ed8ccf2f806572e4e2f066c0b88583d326a6a089857ac1e5d713cdb1e351", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/provider/resources.go", - "sha256": "6612247f1172e7864fb13b9748a720a11d50fb2bd713638719451e2a7a4d70a2", + "sha256": "b99cff1fe80e4bf54ce231a95a34c7a69192d667f875a5030c45bccf8ed716b2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go", - "sha256": "95f25052086eb3663240a37cbbe1b41d66e2275351719c6fe9554ca745a00498", + "sha256": "327e7a42e71a4a09286deb98be2934a8dcbc06552bdd2b787e43d1d9b271decf", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go", - "sha256": "3c2f0019a4c9f7b017cb424ad9322f89dbdb5dbb787337cc04519eb28b294228", + "sha256": "f227c940fc31745cd1ba2a0bba16c1e431e47e623082a634010ec64ea8688283", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go", - "sha256": "e42cb7427e7ab1f8c0f5a1d33e3d7f2ca2d12eba55221df4396e739961724e44", + "sha256": "af89b0f6b076d330ee8d3dde8f7a404e21d843efc450b933f9c1f0ac89d39fc7", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go", - "sha256": "a85af5f03d483c67665762029ed1bed8abf183235ff474ba66bfe0a64227f09f", + "sha256": "ad747916f0d8ee16b7157136886563fb58d4068c158e749ee903819326987ea7", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf", - "sha256": "145e2072962747e5a539cc37ccf39c4f054cf5bc859c33f7c068ed076f501d44", + "sha256": "c4244c35981de561ca54afd170c0e5b71652e2e20108b37ac1a1154a4fdf4df9", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/datasource.go", - "sha256": "a8d28709f6b9886dc24328c208185c4c7688e48d19abc5ed4f34935d6d894f80", + "sha256": "031eaefd8e122c197279949472a9a9ce802b529688bf17da69a412138644df28", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go", - "sha256": "5a241ac9e2769f20dc9cc6fcab83f304cdfafa29ff9adf87bf5532045f5adeae", + "sha256": "e212ddd07cc1d7acb9a14722729dfed3838da76c38acefda1796d4c0ab4cc469", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/model.go", - "sha256": "a53c80e07d14be28027921f2a04f307c70bd47ce4ef78025716bea7d4ef0f8ac", + "sha256": "3bbdf68f000033588ae5876ecb780b0b7e540cfa3ab2ee46f7ad7cf4607af507", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/read.go", - "sha256": "fe508161e1a395c3aa07b81409ab5411595f022504e048a7c657ee401a2b4ba1", + "sha256": "de701ad857b74d01204c5e7b75a001498f135c5a5cbc22a691a7e2751412edb6", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/seed_helper_test.go", - "sha256": "59648e9be726a61f991b7529250a83aa0dc439280b6236bb2e92692ace52bffe", + "sha256": "a206c48a50e156cb6cba98f87287e6e928efb50e8fdf39dfece8677f3284737c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/state.go", - "sha256": "61147f6f11a0ee0ee68072fbc3071f5407f4208fb08654dc0b4577efd30c5e54", + "sha256": "18b05f2029deb54f241227219e7cfe47107b819eac9863aba7257e6948c7569b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tag/testdata/datasource.tf", - "sha256": "6a3e343961a149489e5b0854696a58378ae1db867952d759104e111c1ffcd656", + "sha256": "d9a1011db466712c1aabe598d770cd9737b46eeb34e912369877eb81cbecf61c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/datasource.go", - "sha256": "b222c04949bb0671dd2a28cfd5f94ac2483b4277e1232a68970698b0958d1978", + "sha256": "c8e3a91c46336ec33a068d6d90f0b5a9836f080517726a739c7c8f584910835c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go", - "sha256": "6235c6385afa7dd5af3a611000f2f9f56e4b28e44cca35e76926c31ddfa6b77f", + "sha256": "8c7cc4362f22d900995921fcf8b0c783ca9840499f5ab387d16987ffe177631a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/model.go", - "sha256": "ff1aa22c58d77229d0884faf89358cd33b127b1790e03028b636c874407ffc0b", + "sha256": "db2e4c4e65d5187bb7205991830cfb6b265c916903c29a3ca09c3622b6e22cb0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/read.go", - "sha256": "779892d55034807adc9f56e0826603e4b5430886190079f381531ffd467a29e2", + "sha256": "f1cb9904507ef54a577a8fc6e2ca667aa0c13f1f551fd4639f25bb23bf64e424", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/seed_helper_test.go", - "sha256": "0287cf5cbdc3d62a187e2499887101229b6af5a4505c43cae02999e7153cd49b", + "sha256": "54848ecf1d70aab8c728cb07a9eec7ae7d686aa823cc8c37acbd96ffec0b6727", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/state.go", - "sha256": "a4ad682232e45ebda1756c730af5d1e3f4eb721f8afe9ed926c75b45ed249b3d", + "sha256": "f69e3f1f01f292274c9b39d9d59c3515a663efc0753f648dfd582b3acc0a36a6", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/datasources/tags/v7/tags/testdata/datasource.tf", - "sha256": "d2516414faa44bc14dccef0f78612525014140c1aca78e245175b32f43780258", + "sha256": "209696354d6c687ca2d83f659e3a3410e20ef688691017325a0352dd74367506", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/ephemeral.go", - "sha256": "45ba1368092e0f7e039d87f90fc48685a9d48c512f518cf93b6b05bee9004ff1", + "sha256": "57d9f7f90e8d667ba1052c9acda75372f4c61471ef6e7e33ed5c101ffeebad43", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go", - "sha256": "89a9724320537d889100e6cbb7889354b09dae246344d62d128f1e5c69cbb2d2", + "sha256": "9f8d286455f79163413756fe8c4b01c7de41f11a6b6de410b1b0b45814608dc7", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/model.go", - "sha256": "b64d24b8360270d37da57e7454226b79c84ad4712567efa7c517cf3833bcee81", + "sha256": "4f2b916129197a183043ecbf5ffdf9a0315497f8303273d8f088ef63c64f1211", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/open.go", - "sha256": "68d9878df11bca013150f2eae27b2277f3f3a1236906bd1593e1ead6bb75bc92", + "sha256": "c890eeea82c2cf85a4a469ddd02235ec6d2313b7d9002227ca438f6232ca5697", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go", - "sha256": "ff2305a8a5a0741cc6596e18503bfb0e094692145d9d5e7c54e06eee407c7181", + "sha256": "0d34b014567a569828bc38e7286d8db009fa99e1f3ba09fe658a29bb47303a7d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/state.go", - "sha256": "0b5f2796edbc68009fc970bf22b0be2c98e4be8dcfeb2223945e40ffc76a6f2f", + "sha256": "3ccf23c4e402f4494841c95d4cd0b76bdd3176035d1a1b75e0cf9ebddc8bd53b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf", - "sha256": "5359d32db518add4822b6b0ac0ebbd75bffe62ae5a93b8cae1e70967dcb4c64a", + "sha256": "e6dd58a2eb723617e6bb01ab0433546f637aec2f3f07082fcfbb76e2747375d9", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/construct.go", - "sha256": "6c0c183251335b1fd7f4fdbd701558be5cdd4222017a8014a217bfdc86ac49aa", + "sha256": "2bb06b33e690a78a48e432ceaf1b08e6de6c63abbc09d282a55c78d72b04a1aa", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/crud.go", - "sha256": "a6197348dba72f50cb53bead63a17a61f1a05d328828c16198f9c54a106fc86c", + "sha256": "7038667942b701cc25f4e705b1c17175ecd1b818369dee7a14cd847fd05cca53", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/model.go", - "sha256": "9740f87acf0241aecf6555aef477599f57c065758778572ecf353860dc55f2d1", + "sha256": "9ea164d7eb989d82e16c95498c5ec07bf23c1cc62d41245cec7d4e5d1b62f6c8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/resource.go", - "sha256": "1dcd509bfe95ad76635537243b8cbf37afc957e429e85c9eae76e67328340729", + "sha256": "a3a640395871a98d6ee2c28c3dea2fa47c333becfaa41a2944e34f22203524dd", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go", - "sha256": "433dd72138e6679943322ae3cf95c7706f516cda42f68e331173daa181e151c3", + "sha256": "3d7ae61ec2eae2e4f46c7eeda78979dfd24b2f4f9ba0bfa963fca5d8df797b22", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/state.go", - "sha256": "a0eb7940a88d27cf5e79bce3c2191b5e58a21c1057af21fa621941f21b16d1ec", + "sha256": "b05be20a09321c942400069f1b12407299537f70300424477a589cb68bfaec70", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/test_helper_test.go", - "sha256": "270861c04c074e3bb55c1c9c92fcfcb5ab67a3fb2854fc0ed2a8c20b588602d1", + "sha256": "63ac9925c3bf34bdc02966284ed55dfe92748fccfe6068b10df8d1dac417e513", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf", - "sha256": "c7c2336f54ba5481c55825cb094faac07a86975b081ed34cf1234ce50591c04b", + "sha256": "2cdccae14a6f35c5210934a06c9ea7394d81f9bba83c3be9086e985795a579e3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf", - "sha256": "ca0057bbcae9ef894859c7eb00dad3fc48421cfe82325a5d921ad214c5efe5de", + "sha256": "d49a70b8f9d1d38f95b0b8d6af4cfd59eb316fadc9373b694880e25689db4e25", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go", - "sha256": "fc477b52798eb5c51c41d0893c4350c57b8c4733d90cbce42eaf7378a74b0a5d", + "sha256": "0fd995518da26d0ff963d248e46eac9cb2f61b9c1a90825f6571c8dcfa949a63", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go", - "sha256": "16666b22c6c5dcc48f37e89f351a697661ee8aa26dfa7165842a1f84a712658b", + "sha256": "6d993d069b637ac9838f7f5a6c593219058b277fb7e730deca4ca876f575f23a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go", - "sha256": "1d4d315f39936c5f72df44a5fc4b084901d03b364489150365d826a3ee7ca693", + "sha256": "a75605b477902335eed9711ec84483a36b532eb07ef97b9ddfb9aeb9cfaaba47", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go", - "sha256": "653fe97af49a18e87a9ddaaaa2bef8cc5ef245d810e1a4c180397c5215d8149c", + "sha256": "8313c3921e23049896dd10a103935550bf8329a8982d5129fcd6265ebaf15373", "blueprint": "blueprints/thousandeyes" }, - { - "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource_acceptance_test.go", - "sha256": "", - "blueprint": "orphaned" - }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go", - "sha256": "daf254ee270b49ad3d63333cab37a20afe95614063bf007de5026e4d472ed85a", + "sha256": "1829cc9b0823c44f114c4804d4ed9e8e98bfee62288bae60127bb5e3aa74b2a8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go", - "sha256": "dd002594d275456ae9c123f44836bd85f79591966a1ae9aa35adfe4bc6c211f1", + "sha256": "316d5322fdb418ca061dffd779f61c655675abf62cae083a28138c708147954c", "blueprint": "blueprints/thousandeyes" }, - { - "path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/testdata/minimal.tf", - "sha256": "", - "blueprint": "orphaned" - }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go", - "sha256": "dfc18f619dafacb0a43991f1ae4174bc0de767c134f5ff0da5fbdc2487933af6", + "sha256": "3b050993fc213251cbdd490904c865215aaa8c7769c5f0f24b2e6763a4d4dfd8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go", - "sha256": "4b64b7a6ebce0a84de265a54647d373606d324dcdfa4ab3d147cda43b378dc86", + "sha256": "114202ef7510afab2e3dd7a5a456fcc274a03ae244c2c373e0b834a8a65a122a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go", - "sha256": "5b297825fc51efeb8febcb1c1cd9dcced74ed7068344b37946a570677ce9eb25", + "sha256": "a29efb46d5ffe26b0d6406173736d89c4b1b6ea58b5d5861b6e4175412381630", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go", - "sha256": "b9b0ff129f07c5c285be36434be16f72e25231ed34396cf563442eab86c5c4f0", + "sha256": "505ee7ac7dd43611626336ceb8998a202a4a5d4b29460f2b6d68e9055b8e76fb", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go", - "sha256": "2b1efa4f5158c2a71091682ad8148162e33110faf5be1e43f74869449984b9b4", + "sha256": "f5d1bad68b8d291682be014dcfb12f0cb8933087f36867f629e0d4bfd1294b2d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go", - "sha256": "51a1a021cc1eef23ad267a46dc8383df82c5af9917626020f2214eeb801f4a2c", + "sha256": "028b551f81c7744f82769469931174780a7105e4e2372cb9669c7090f58e22c5", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go", - "sha256": "84512861dd9b47c12e7bc47e9d16ec3fcfcd3ae30503c1f0f5fa228b3c44dae5", + "sha256": "4da6c52b375e233e4e199c22568b8b93753c6908a41522a27f5191c8576f6a9b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf", - "sha256": "e7ffc3f947e4381b19ac18ddb704c87013a656f94f80d5c4ff36b0c60c060488", + "sha256": "fba2107a4962bf65848bc770f1f13f927b50d0f572614872f1102915680c35bd", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf", - "sha256": "71b102ebe1145e4ae26f4df13ab912d5a78f884ca061dc95a67187c4693aa81e", + "sha256": "38625b1d515671257ea397b1350a21e298ac397db214ced0e5cee33fc5aa0030", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/construct.go", - "sha256": "e025e0ae957288422bc649fa1f3100345d672a64cdeef8d348ad09d6825f9d12", + "path": "internal/services/resources/alert_rules/v7/alert_rule/construct.go", + "sha256": "bf73fe044a7687ed6e1677b2ce3f8e71cb71230872bc77494c937f6c12828c3d", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/crud.go", - "sha256": "8241ffba17d76a9f5138c7844957b40d2e75cbb471847ccf32487b9711d67455", + "path": "internal/services/resources/alert_rules/v7/alert_rule/crud.go", + "sha256": "35a025727945a76315cf1f25f86c3a10c24d8aadf1ebb9dda19793efbde21d5e", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/model.go", - "sha256": "2c64afe366893a4d7a7a6e4a902d0064a2711c5ca7435258562b621acdfdfc9d", + "path": "internal/services/resources/alert_rules/v7/alert_rule/model.go", + "sha256": "9b9251df15456a77b5365a5c536fcbb3f2416f4acdef9cfd9e5a8769988dc616", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/resource.go", - "sha256": "da891e8104729e88763a613ab0df92a742ba1b7c79555d16917ee1649db44b25", + "path": "internal/services/resources/alert_rules/v7/alert_rule/resource.go", + "sha256": "f88b229f4b8d8e048ae925e3cd225c5741d5e93402a1a4685aca733660c07652", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/resource_acceptance_test.go", - "sha256": "ab89261e15508bab216875b07a197e1600228b7f4d94631787f3a4bc344aeaf7", + "path": "internal/services/resources/alert_rules/v7/alert_rule/resource_acceptance_test.go", + "sha256": "cbf88281b94a623b8658bcdf59e4c9e95adb911df8c7a15ce51cf09235f64b5e", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/state.go", - "sha256": "91677aaea5c4cf43076a0d76e4c120e8c877c37b790c3a460bdc9342b1deb97b", + "path": "internal/services/resources/alert_rules/v7/alert_rule/state.go", + "sha256": "cf0eda843b95365b9dc997d637c5242f586350faac4bc0865b2a6b6897c315c7", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/test_helper_test.go", - "sha256": "e597404023a8e08fb72524f490d7b1459ee46aa6c7f5e635ca6986aaf849c423", + "path": "internal/services/resources/alert_rules/v7/alert_rule/test_helper_test.go", + "sha256": "26cbd5411a8b4f21e339a60037a9b28cd55edfc992b7480fa9d25baf65e9edef", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf", - "sha256": "58cc0750ae6a77d96dbfcbc04c3a3b2bba260e9c10d5857b33c26da9af86729f", + "path": "internal/services/resources/alert_rules/v7/alert_rule/testdata/maximal.tf", + "sha256": "254ed8afcbf689e4d82784fc79ba7ea1ed088f72d030c1171463087c5e9c27ea", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf", - "sha256": "53a15ca664bc3c6c5b23a257fbe8cc8701997ac218e56ef41ab29a93c01f30f1", + "path": "internal/services/resources/alert_rules/v7/alert_rule/testdata/minimal.tf", + "sha256": "81196aa65dd201a7aad19c65f5569f2b18e516ed5be1153091753f7b76930204", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go", - "sha256": "98c5477dc20372c62efc92312449afed0c1bfd85f20fa43ad90b68f4df706444", + "sha256": "1df0fc5335a84ac31f587f7e0122ecc5a0e73be4c1a6fe507c8f0ac0ede19422", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go", - "sha256": "f1f9217bf4d79bfbf5a8c1f1fde7ea98b5fe5017d93a99ce2ae2483c3a0614ac", + "sha256": "6d1362658f42f152e77ae15fbad7b1e4416a70947717bd96a48e1e3e3798bfde", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go", - "sha256": "c6fd58ab6e00dd46c1ff42f78733ab7aaceacf4ac065039adede705c4b69b4a5", + "sha256": "4b8451867c2608d47cf791edda28f0d3ef1911e91b23627258dc31b1d687730f", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go", - "sha256": "4a55c7d4ab8254116793e9bc4aa6692acc7f3fe249567698738fb8bbe09cf86c", + "sha256": "5f57b33a089e1ee9219f496de3644d97225cb01b4fe97d0c5f0442155e7253d3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go", - "sha256": "f1c37afc9fa171b9ff7d63b2504518e1faa0f22bc8077f7ed96ecce9832b323f", + "sha256": "d4a3418eee12fb3afcaa0814c723f6818c261b4ef61bc47500ba01dd8ae5933d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go", - "sha256": "ca0c6074d0df2ecc60883f88faf5bde6383a3c9018e580667af53b7e00bb974f", + "sha256": "c78fbd625c3185cfed4019ebf0c9435f1ae8d440419ebe8e57d05a82eb90abe0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go", - "sha256": "7c8f745c92812996b7a94b69949a059654f5cabfda1dea67da9b50b8b0f06d07", + "sha256": "000262c66edbc8b12f713a8a12d9c9d146ef6a3ce6c1b7b03603aca0b668015e", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf", - "sha256": "b3ade8c8b5c241d0be6e31b715454638b3883e78b5e307f6b55363a5b02052f4", + "sha256": "dae5406794fe7f7afdf4acb8051b2d75e3341d67b9bb7bd13410a385930c4af1", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf", - "sha256": "d971e98972b680f0a9882d80a8349daaa90a26399bf3bb42fb768ecc5d596955", + "sha256": "7af0862414aa51430a0640c14eb3b21e8acf7d393524e8b27232f1db8c2e2770", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/construct.go", - "sha256": "19e712c893d5f320e9d31f2cb70b1cb44007b335d08ad39554cffecc0ce1ffa7", + "sha256": "26b32edc35e88c9f61c88c5a6cdd4a75513691ac74a6a8cce3f1939547967670", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/crud.go", - "sha256": "08f3e56701893633d65cac7ce2788473b61ac5239fab1ded167b9cea21e62df1", + "sha256": "841b43502dbd093bc0fe484b18bfd4f19d7e9b3d66533aaa90f4724158977332", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/model.go", - "sha256": "f66c6039e5cc6e68a94d431ec96b6d0bf6b15b18304e3485b457c3f119c3451c", + "sha256": "af49a525697565fe9a3119e56e51307d0b44fce353ca66c4044725c32883a136", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/resource.go", - "sha256": "8a6102d02bfbec8ab391e4d962efe578f41442df8bc2754507369970b247ba4b", + "sha256": "69c6667a046498a038770b007e7ff7c4ad93d7867eae8774b9569f70f5caacfa", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go", - "sha256": "4112a7008301baebb25ab874f9bfd34a4423b280e90020ac1f4a95831dd82394", + "sha256": "8b8b69a66f2416758bf863eda6a8eaf70cb87bf08985dde0ec4df13c87e69052", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/state.go", - "sha256": "3f77d189668f8916f44b6a59a9726807c8583f2cf99da1198ddf133e4ff8960e", + "sha256": "8e1ea0135ec70d4076b891aaeec345e9bc454a37798021262505434fca56e959", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/test_helper_test.go", - "sha256": "48eed2ddc97380a746083d0f4a56a2113a603618476e89faf7a4dbf0ae2fc28e", + "sha256": "bd6c0f753843e9cd60036bf83dc5d5c0c9185b7754fd77f1458c32095d1e97b8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf", - "sha256": "2d09cbd4ba3b74bf283e829088f10d39639469689d7fa4556d66de492f92d9c0", + "sha256": "abd967127a8ed4c307af012130af2dec3d2f767cba2b71aee92356517766fe95", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf", - "sha256": "7fb54a0c3054c6e1bec4c5eef38ac4203382f9278bc3219ad4cbc60529fbb51f", + "sha256": "fb29a5b4ddf8d888014ec06847fe450e5e59bcf9521cb3fbc29b72c6c7574fc5", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/construct.go", - "sha256": "7d213b1e3ca160039aee378d97cd694072777f0cd32447e670efdfc347fed558", + "sha256": "b28f513444136571aa97c8e59bd8a3dde2aba84a5c4234368089f8c93d8e40cd", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/crud.go", - "sha256": "d2a257978419e0a6deae9763b14ea5e196f1529680fd07331ca3175aeab0c2ab", + "sha256": "6c1ecd0e4c3514f8064152b2afbd4dc79b4582eff0ab7219cbef2c411b1af6df", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/model.go", - "sha256": "b9438b74831b39b04eac235964c54769c1a434593ec8847f1a09ee9aa02a0c97", + "sha256": "fe7957a54ee5b75e46522c39b0c2a1be174b122ee97c7f62a3de246ab005d9c2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/resource.go", - "sha256": "a9825aaf513fe2092ccbc1df682e8087fec6e38504ed10786b4489ac7d421d8f", + "sha256": "85d7cd9e171af9beea3d1fec0268b441e60645d9254405270941c48aff68b4fa", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go", - "sha256": "91fa55fb920815b95086dd7668f98073db5f1f8fe219cd1814a08d3b110ff4a5", + "sha256": "9823c6ca921c1b559212dc6c16a67807d3339171934e8ede4a18bdcd53aa5535", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/state.go", - "sha256": "6473b13a75ec82d02b8a713aba451ebbf58960b2891e0326988e581409e589f4", + "sha256": "46c6ab25ee1d06aaa76f3a414e4d847bc2f1313bbe96ee419ecf06cfc60438a8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go", - "sha256": "0f1f416f62b628e69b604e2c74e51dae4fb6e3355982313c268e694b0c65426f", + "sha256": "71757e5bd5f1ba6f2a8f596d42c2f3c6ee61324f91d0a9257a5df1d4d31adc88", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf", - "sha256": "3b8618707ae185eac8c32987e77e6d7906072ffee5605e95d9d4dff769883371", + "sha256": "78bb6fb6be78574340c0dae3f78b08e6865dfba6edb2160d247ad29c9aa0f7f2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf", - "sha256": "6495beed5b56072817330f5312a4fd30e6678d2641d706c9ac88c61b0a4e6490", + "sha256": "7bff410e684355b948bc1451bcd8f36ed8263f52f5790f5bb1ca2a94f93ef77e", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/construct.go", - "sha256": "8a38e376f780edb14c3bb4e8caf31597a0084378f32ca989b38f7d8b240f7500", + "sha256": "861cebd98c947dd596bfc65994ce93b97db1f76163da7c02f099a6bd55af97c0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/crud.go", - "sha256": "c3a7e30a70373d99f9d6bbe69c37bb8d08f3bfa2fe787b922c3131cbf6a058d2", + "sha256": "9614b48b1eb9a0c96f4fdc24d5517d8cd4df94954e1971b977ceb9118a0c897e", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/model.go", - "sha256": "14ecc76a144a7fce31b99a6c5481826c569069daa73c9ca0b30b05b4a25250a2", + "sha256": "99bfcd72ee02c0c6463fc856c4f89ed8066c839c8e404a5ac18ff553a761fdf0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/resource.go", - "sha256": "085ed2c3b54bf1953ae37b7b78e3e5ecbf1b6eac47f8fcf9da920059ae42e8be", + "sha256": "6468e7429d7d8bb9cc61a57da30a9f4f1c879951e0b118a57383ccb7c36499e2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/resource_acceptance_test.go", - "sha256": "73fe8bb1672caac9966365136d58814a8fb08535ed787d133ec495ad6f535992", + "sha256": "4c63d6099c8d5cbda4506e3ba234cba865f9706030a0acad8dc4434cd5f4d3e3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/state.go", - "sha256": "56d9387aa2547b6f5b058a036e88e406ee0b8dbd54752c63a05e21dc327ba666", + "sha256": "3eb1b8f78563b5814c056c9db6730ced41f8faeb05aa9e21164f068afec18364", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/test_helper_test.go", - "sha256": "ff2305a8a5a0741cc6596e18503bfb0e094692145d9d5e7c54e06eee407c7181", + "sha256": "0d34b014567a569828bc38e7286d8db009fa99e1f3ba09fe658a29bb47303a7d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/testdata/maximal.tf", - "sha256": "69c6a78aac95893233c0fc0669dafe35f674ce52206c9b51d43d1e036725c5c3", + "sha256": "7cf22b0803d6d5f8f293c5ec896d6f21454b7178b48b749e01c4bd3433b6dd10", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/credentials/v7/credential/testdata/minimal.tf", - "sha256": "1905804550f4d00c498e5f9867f08b037cdfb2b61cdf4c32e0eea55b29c00b6d", + "sha256": "74f5f30ad72859e6bea4455b97da80fb44f6666a96375a744d70d9c235d3639d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/construct.go", - "sha256": "724adbde5aed0ea108234c59dccbf79afcf324e91640108a94a7b70e78987bfa", + "sha256": "f0be9114445dd4417f3c23e344df9a2f2eac5ef73ece1975a5d974d2ae84028f", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/crud.go", - "sha256": "0a5033c846d328a1fdcf3be80098e6d34f2dbcd93696b4ce63c01f9ec811d8fa", + "sha256": "1ad400fc01de099600f89ed02f3d77cf0edb8107525381489c354dd38cc4dc03", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/model.go", - "sha256": "5e8e455fa4c872f793e32ba865da18497d5c869f1dcc1703451f109bfb37d57e", + "sha256": "3cbcfb4bb1a05db5f9b552109e651a999b287a4ccb1904a11ab2370665b54cb5", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/resource.go", - "sha256": "2dd8c85f4269e066f40f2a509ddff6352703c5b79ba31f7ed96fd255de000319", + "sha256": "bf80dfe1db2921897a2f9b83b5d9fe1af6f4125d67233f6be91d3053131c5754", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/resource_acceptance_test.go", - "sha256": "e5ce1aa46072b8d0c9049bf9e71624908bd38689d9492beec83e955ab1d190d0", + "sha256": "569fb4b6989d49988f40c9876b2987a8a62fdaa48239237f50ac5ecd7496540c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/state.go", - "sha256": "8fc812247e175253af03e0e1e6376acb9c7f706a53cd39c32776e5bc204431cc", + "sha256": "0ecc4dc24d1d13cf6ecd7a5626f082e1370c92505fe3e408f90cb4e720b4ecfc", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/test_helper_test.go", - "sha256": "bc80f2ec17b377cec96613cf35103e01212c9d307a69e1924b9ce10893214c52", + "sha256": "7f5541724428ac97bf7758b8c6fbd52910ce1096f9c96ecad6e7e47e54a7352d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/testdata/maximal.tf", - "sha256": "5266995df952e87a9f5c77ff9b241d79252562e590907b779d74265ce62d9fe5", + "sha256": "0423ed586c7baff106b75f7df6510460a5da2e5c4dd2de614cc7d4da874d0e3b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dashboards/v7/dashboard/testdata/minimal.tf", - "sha256": "747672a434abbec509cf0f1b5d6ba8d7b3fe0148c055769b3b54a0aded52340c", + "sha256": "ff5b1bf067e3d1c0858db9cb4c22707f5f8ffeeca84ba6f3e52340d986653024", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go", - "sha256": "59d18a9e982f8bbacdacc72376f8ec56f64162719d423809f7f37a2cc7b1aedf", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/construct.go", + "sha256": "b38aec2ec399ce83ce76353eee876cfc4e111cd4d036317b34c8a12ddf53a793", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go", - "sha256": "96b23475fbfa26ab5012f3b2324ebfa1c5ed2c79da8083ea833d6044b86f4ebd", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/crud.go", + "sha256": "6ac7817a0c08d716e43e9345cf9cabe5b3ee5d1c605be6cc2a3b4d981df7b135", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go", - "sha256": "ee5cebbc891a2171337d3c7e2b0d4d3c1391cb59895725fb5a94c4f70b2f3912", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/model.go", + "sha256": "c3aebfe3ecef093dce9b1f45066be19261ee0b00f2e3de9df3c368d19316bf6c", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go", - "sha256": "69b1f37ead74010517b339f8623ca174090827f19e9611b730a72588e59142a8", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/resource.go", + "sha256": "a4e16461200f58dc3b80d4f11dcd75edfc6121b07cde6fadf7cae35d282a443d", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/resource_acceptance_test.go", - "sha256": "c33a43185a8d1a7dceadc62158ef60e1fdbeef518f244186052d2d963d01a1ea", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/resource_acceptance_test.go", + "sha256": "704f51eb9f23cc40f64c1a9d714d0c7fddfb7b835daad0e6afee19827f1f1a10", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go", - "sha256": "09bffaabd317467266862b8a9a76108ae6c9c1fb420f3127746c0d32bc0e0d64", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/state.go", + "sha256": "5fa59ba5a41f8daec6e4a0054bbdb2fc4407c5340aa986d69e9cce0f9d3bbf89", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/test_helper_test.go", - "sha256": "23d3c10109a9aeca7013c52a22f536981b8f07c6b4fb055866a76f57b6ba72fb", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/test_helper_test.go", + "sha256": "1460587b13a35ae12d7c5edcb10a40a6425fa42c10e26a554748cc235f735cfb", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf", - "sha256": "f6f1fba7c8e2582e30b80939c36b528255279a24256bfb6838b5767eedd87690", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/maximal.tf", + "sha256": "794f088ec7748f90dca2700e175f8edf444069f8b038d22b172124cd4ac5a4a5", "blueprint": "blueprints/thousandeyes" }, { - "path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf", - "sha256": "0a362b2f0552f4beb6201b1aae7b29e9b31b628982404cb6f17028b0758ecbe1", + "path": "internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/minimal.tf", + "sha256": "d28ce4390494d911eb29160b0030df7cd061b9cb7509e6b5b162e29d0b4698df", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go", - "sha256": "5cfc897523e92dfb1d0920c32518e63bf92d4a2ef3bf8c304af61932a9f4485b", + "sha256": "dcc0c58081824a353c1e46baaca8e454f63b53ca817b4606e89e3d3631f2b23d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go", - "sha256": "4f7c17abe65aaad78cd0b9a84aca642d5601abb7946543397dbe6262eb03c189", + "sha256": "1b421708f0d1ca0f099470f78608c819b5fb94ccf6ac16c2670416d62d69b254", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go", - "sha256": "cfbf818c8b3b20538a029f0777c70fc2f9fc9606af7e3b64bd84cf5df31c922b", + "sha256": "53e0e82c90d650b2c52189fa173009c5137864e48abb25544322fa53c9676093", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go", - "sha256": "fd1b0cab738aa8f4414ac3b616cc1f2658adc7732033f6571adad6df0a096be8", + "sha256": "be126be25529cd0d0aaec34628cc999bbf4af1267c0ac13b9ad8aa7b6a427d37", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go", - "sha256": "29f6f5fa99db9ab5bdbae63b5edd43dc1ec266965ab1dee8fa208af6c9670f9c", + "sha256": "1c3eb5ea645e828f336837d9a9ae8e8c984c5bfa0f4dd5faa3ca4d23668ab967", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go", - "sha256": "628556ad0392d4e57b4a51cc1006a2a92baa04882fc35ea722ace27927b7cbf5", + "sha256": "ec1747485bcaf6c5893b1fdc852f7dc9c8be111807d7ba649ebb66abf8ef1c6c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go", - "sha256": "eebaa35077764c55e9bb6cf91838c8d19574b4a5429e35bad28d3d316ec11d79", + "sha256": "5af9c41c6e48dd8294ceef2f88e1d9e6a7cb51c60a9c7a7adbdda06da393487c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf", - "sha256": "ddbab8a6a3b4f0a8825471ca0072edea5c472c07372b52f99b206b5b806eb4fa", + "sha256": "bf26284d9fe5720160334f0272c2da2cec71cca3512cdc931674daab04cd7c79", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf", - "sha256": "a9f80bf3dc50dac8dbdb179bad47ee22b9154fdcd0a85ce757a17b388cf46a3b", + "sha256": "db861e9ed3deb994ae2611151082d7a3af5249f9a0997c87e6f8df49232d097b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go", - "sha256": "e51ec2a25f4c1556e855c961082ea1ef7f9724e53a73f85b355fc8cfc415c7fe", + "sha256": "44686874b4128e18d1c82975f1ea7f0a33f0b87c02b30aca2b984ba43a546eed", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go", - "sha256": "98cecc23d2f39a8f9d988acffbf26241f6d3dc190111cb0d16ddd7d052c29d6d", + "sha256": "dd60b7e84084e5c838530193b01b8243499abdb7bf900754629f2556b9ddb06d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go", - "sha256": "63ec3110a89e723a1e923bb0ade39d07b9934fcc0a2e88180c0f4b0acafa380d", + "sha256": "e3a22caaa1741599e2e98aa7c17f27450b54a5532f41044d04c871059e388096", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go", - "sha256": "e3f713a777928c8de367954b215b5b773f5f0c25462e6ebdf0483e0a2f6b2d56", + "sha256": "a3f0f4c7f458605011fbba7f559582aee1a3afb8c7a10636518dbf5b6a29ecdc", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go", - "sha256": "77f80a797d70f0566b570f8a386cb514b956aa3a70fb10b006fec6634b3fc6a0", + "sha256": "8e747475f018fdc0dfe2cf7d4f30b49b00b4119d6e440207372caf531d5483df", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go", - "sha256": "f649a013e30a369818869af0290bc2c0277b76c5d276c0feebdfa1fb442151af", + "sha256": "8e15f5c4e012e8a35948b5c072b52c0604daeb36946f601d3922dd0c46bf4297", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go", - "sha256": "a49fa6f990da5e81ad8986cac02d7ed820bf79864607a49e8a8b61bf0e548442", + "sha256": "9a36c16146dd908f3a600ac350dbe56ceac8d6176402ce72287fa76dcc289716", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf", - "sha256": "e284ec65068fc27806bf62d74443581b0198dd95a0f2752eb7d42a2585d27877", + "sha256": "8f54f2152931797bcba3d62e4db8816273e8357c0b7bfc53f7f8683b2d19d57e", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf", - "sha256": "4f961a617a6410c65ec9e45f8e81c5dd35d5cb72f39ba524d2791b3c89a6eacb", + "sha256": "8f356dc04690122d9296c2b4c6fbfc9eb479f558a8fcddd090ac9234f91d3289", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go", - "sha256": "c4e6c18d1d885a0ebcb4ed8b2b94f0509e35f731da82cf92cedb687f033110e8", + "sha256": "933500cacc03159585217e0e23027fb3071af596223216cdf1980395fcf54fc5", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go", - "sha256": "525eea88eb836166357d4352a17990b353d3550233ef0493a2485a459fe4e239", + "sha256": "87e82a371150d7d0f9df258077efd534b617a237222f3cd339ddd2bfc53d7c60", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go", - "sha256": "8fa509f9c48bccf3495bba31f38efd307e3a3342f40d6ca237857cf166e41c22", + "sha256": "f8fc13693b4c0335811a3ba6966e141efdc15632d2ed856259409ccbe1c06e36", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go", - "sha256": "b6b05204f773c24c3bd29971585580fc4ec195a3cdfc686e64fa6365919a46c8", + "sha256": "3e44e266aa43ea379e5a0a8a7d10c937edfdcd65f5a13feb53cd932d55f5a739", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go", - "sha256": "3bc57822eb6861eea29290c42ef8e34072ece78023d74dbc625418df215136a1", + "sha256": "68f58f7c1e76e646be17191437695dcc5bb1d2644b995ca429c6e6c44d8953b3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go", - "sha256": "81ab2de3af2772c54de29c83748de5030615eca844c01828ebaef9c321877f7b", + "sha256": "73f49a080b2f9c9901642e0041ad4ce9bc1bfdc03da12c2ca1d3087199faf1c0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go", - "sha256": "08d2f71e6b0edc5d1539c3b4a3e59cee502e30be76bcf64ef699d6c580f6dc44", + "sha256": "27092bcdba49c87049be20a1da7e794e959bab41d90dd2fa7489f26675fba0a9", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf", - "sha256": "b7f4b72c12bf8e1ff6d31223739bc0905ea9ca8259c57a84053cf6b7f3d56099", + "sha256": "3687e94644066cbe4de5ca3463c89858cd96fb232195ca6d1f412c031e381a6a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf", - "sha256": "28395e525aaa99847e4c4293a400a112e399b3ac594d46d342d7582df6ab0d86", + "sha256": "ee3b587cf4522a9f6e00ad78c95551267307f890a9a4238533e3f1c3cef7b176", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/construct.go", - "sha256": "a9c3d468503ea751ed89ff8e17e3cb1e6e84da1e7ef22acaf49ed3391b4983d4", + "sha256": "b6fbca8ea109a3369e0021605059d779e81dd2a82e24afbf6a89806f83fbe29e", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/crud.go", - "sha256": "2530a77725b04d7f668d0fa6243c490b7224943dfbd95810deb707f88a88f4ba", + "sha256": "79f5a767342e433b4208895254c6c292298c6be5dbb651a4cc9ff5e4ba3fe51d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/model.go", - "sha256": "7342038a3c9e6985d093a40aad972622c15731e4e085914819fe184b06c54de1", + "sha256": "28bdef509b7cac3b2f9b75dd329b9b1ef8c70e6b6a5980300fbe8de71778b967", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource.go", - "sha256": "fa2e7c5619b4da697151ea5bca1532a37459cc4473f3e6b4813d8641706746c6", + "sha256": "32ea71c028b183fd47a74e044a4cd16f96131515eff69fba81dcc8e96e266801", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource_acceptance_test.go", - "sha256": "bad876aa4ae61f70f69cc711848b5a07d722ba6269ff12355da1693539d3f052", + "sha256": "19a52f12bf402e668c8a652b653323f506ffa959cc2455728deb6fab3ab82b8b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/state.go", - "sha256": "69a01480697a1b9e906aed19f5e0aaa701cb1c5fdc431f4e767f58bb32db5ab4", + "sha256": "5432c31219c3941100424a03d8c0eadf8edb3b0103850939c8af83f916f33bd2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/test_helper_test.go", - "sha256": "ef137ed658b7c5b2481a0acf19253abb32049ee0d5e75de451005df5ea2a466b", + "sha256": "6042f7401262dd6bc0ade914a4a1ff0f1721546d2edacb90ceee3c8189a5c36a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/maximal.tf", - "sha256": "809d852166f64e2d2548ba617b73d9b8c74ab17b005ae472536b949809c102ca", + "sha256": "63f030f3f78a40241845f27e65e52c073765a4745d8d16381a013d983eac26c4", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/minimal.tf", - "sha256": "d12ab968f8d3d7f8524130162e10a502762ffaaa1487c4bab3713baeaca5aa08", + "sha256": "59d7f511817d3f0b3b71b0793577368c1c20f2b87140540adb30e5e904df2abf", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go", - "sha256": "58bc59e1b0580159c136b914cedcf7e2d9c173e6be28704de7a8bc151b78c604", + "sha256": "303ccc449592203d6d85f88d2367923e1ee0c787c6d9a84179319d984a56cf68", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go", - "sha256": "5d5555372bfbc6636d6e8d246f38fc86ac043f7f88ee6c5244e69a961c167409", + "sha256": "c9a50a123f68dbae9270f9d77d122a75c0593feeaafaa33153ca8455bed8c237", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go", - "sha256": "b113a0dd2dfd49ff36b9af834b7180c3a58a115bb7380f766a77cf358d16f670", + "sha256": "f517da38e42bd8064df672bf9e2033ea3e8118a9027ab6160d49c28e3ff71e05", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go", - "sha256": "13003fe2a7079c104dc7f4f0d07b94f54779c533b2e721f3141872ae8a6f9494", + "sha256": "1de8511bc98bcbcadeeb4784b763612781178495028629418e102da61f551c8a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go", - "sha256": "96265326cda8254601c410f1d3542000ec3e7fb1aa741f4edd20d0da809e6b7e", + "sha256": "9876bb3ff5e0144fe1d3c85b4b54a44ac991a1ca4c61f3542cc4653f24360b40", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go", - "sha256": "c46530541e997de7dd9f8076080a2df85562e3db51b73eb2d600ea67ad534074", + "sha256": "19f3e365485c9840c1b2b3ca1ef9e2689c828dfd0241eeab40f3f4437d62b3e1", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go", - "sha256": "1ffd369ea8f84ae50711f959b93948cf1ade687831ef0dd4ff76681447185b8b", + "sha256": "a577354cc645243f90e59d5aa8db965b3e46338522d2c54f2d2d9cc0daacee4f", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf", - "sha256": "134a11d413101aa8866f4c894e908e71197dd0cd959896b9a80a6ae57a06edf0", + "sha256": "18640cf1e14850e79e9e7c9514cfd5990acee0f6cbd3fdf76416711494a9dec4", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf", - "sha256": "efe72c18a64031fc0d3eb4d17f54bec53d2ecd7c647e6cd37885d78da15ed48f", + "sha256": "fe31b1ea4c49e962b6164f161f981c618a292b3f966def4194da0d95d62dc001", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/construct.go", - "sha256": "04e7ed6805f2ae40e16229ff7541c37f7e53f8c03253233e2034e39096b07b23", + "sha256": "70219dfac4a5647e30c56ce08e1a06c7f04f52635407411bd83f2fbdcdc97041", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/crud.go", - "sha256": "b779778f93c45711f07e03eda4058ba7b05ea575f2296098eec22ee0ab477262", + "sha256": "e72d4e580bcdf00b93ce47b2086bb7431991a3a225be451845feace1fe4fc2ae", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/model.go", - "sha256": "c9d3d1e615ce598d9ac8416cae53c197b233110e5d2fb9881262b655548c4db3", + "sha256": "6f7f21033159665f979c27cce11b632ea78193cf97b9a0e0bfa2f1afeefb42ad", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/resource.go", - "sha256": "19ab37898645693a7f436ad0d50f5207671bdecd2e1d21d31b44c9bdc713ea68", + "sha256": "ffb45be4b573438479f7cade52e5ccee58a42d4d7d29ae8d5b73f00720d72102", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go", - "sha256": "5451d62e9fab2a684a5163f70b007e96a1a70da9d496edd78139b9754e4f2594", + "sha256": "23c70f5dd2d68a02149dc4c99b99f549fdfdfbfa3e31e0001854cfc694457b15", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/state.go", - "sha256": "accfd404a9f00f6a9fdb4d788ba2a4486f5f00eeafd4bb67cbe3fa80a2722885", + "sha256": "b0a58342419f0da03798704c97872d314e4e063fbf96635a0cecdef8c0f56b45", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go", - "sha256": "f671acea2e9aa5023f712b2431b6d54f3c26eb40c4cfc5cb40ccabbd8695fc92", + "sha256": "4e042aa30ec2a338740827071a5e3c1e4845cebd0e36a300fbefb397b5f88963", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf", - "sha256": "90c2b97ca8bb15f27bbe385d09ee4b3a23d3afee38ccaef26e9268493e5a1dff", + "sha256": "fae8de857fad30548584dc58d1709322be31816687d84444060e580c24c983f9", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf", - "sha256": "e32e1d5d3cc65344e00a72ae5be5ba0b319bb0d5de64b8dd86373e2f49b233e0", + "sha256": "f2fece7fef3c65dbd6f1c0612a4be7a9fd2b668d256954d0b13ec89386bdc4a8", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/construct.go", - "sha256": "44f6fcdafb803618ff4fc1dafafb3c0a872997529044a28618b0a8f85548233d", + "sha256": "ab22ba88d6db84c13b75b257abe5dfd2e967cb10d200aa741cd705166a138b50", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/crud.go", - "sha256": "6b216ce4e0c3ed705057490bdc1f1f8762b646f71123b71d924a1974f3b02300", + "sha256": "ff8254b49277b301aaaf2d9c89c59cff1c0a9c1c80d7f13af204a38bf8a03f3d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/model.go", - "sha256": "3f3e17ebba0a0a6032359de779a703d8fa660ba524f2e04300849ed126147883", + "sha256": "36aaf3f06fd6eb54d5e9475695bd9a6e44264fafb126f400e912a091d9a83a35", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/resource.go", - "sha256": "e692c88e34508aeec3afc4bf75eadd5361db6df7d32391fb82f9bf51ddddce20", + "sha256": "93df9436c9fc363c9c8bb46a3bda953c10fe6f504974c463ba200641a67af5cc", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go", - "sha256": "38198d97b3ac25551e2f10afc6a086c460488231b20cdb39b16c15a6b9ae26b2", + "sha256": "84eb8aff880a14adbe12dffe832d1dd7f2db1195af201f390fb0c5d6018e5f56", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/state.go", - "sha256": "edf7879ddc3878a196a7473d2ed555a7fff37b6bbf5369f46e69cf94b28467c4", + "sha256": "2c47de7361ab03ddde0c40cb6d93fccbcb4c3e5271ed2d47113e600ef28586d5", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go", - "sha256": "bd21695d93a7184cbe4cc1f5798f5b68ca0f1084cd4e99f57e30d9f994da42d5", + "sha256": "13e5184fef64f6ddb94f3c03b5c76c2392d022000ff139b20c8f23d26e3e639d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf", - "sha256": "3f6bbf0b401d09dafe19f4de617c3df20ea507d2a4b98e832c86939f9a14f0ac", + "sha256": "f19ca910247b628803890aebd34a2b6331c80dad1c0209dd6640e4b444e308c6", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf", - "sha256": "0fc28ab8483bcf9ca9567b726aa0082f2722de4e96a26b2fc7536035faa612bb", + "sha256": "ddc9961615e5b92e7715ee3aa54837c1fad65fd1603e784548c4cfe667c147bd", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/construct.go", - "sha256": "730414ec0fe6e95a5831cba83a45a39f8161369dec9bb76d1c535e7306f0abf7", + "sha256": "5ca7342528f566f4959dea787ee7ec30e34cd89c1df7d1037c06361bf625c300", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/crud.go", - "sha256": "d93de8b301e7c47a023e4ce54f763d89f6ad4da2c62d9fb228e4fd7577938a61", + "sha256": "f4fc020bc71ec259b673dbccc3bc134f184ddbbfa0f82233cf53732b2849c4b3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/model.go", - "sha256": "e9110661c827118e91403721f0d0740c719ba8aacc7829976e2ca565e23b67d0", + "sha256": "6807b24bc1111daa0328ef3ba768db6398f853620636a3fd741b8f1285047528", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/resource.go", - "sha256": "f95488fe5a295ad8962494202c7459b7323b2f4e865092a20e25a3c5eba58726", + "sha256": "fe140fa89152b44e143e0182a7c684f460b04b791bddefedf0704254185cf563", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/resource_acceptance_test.go", - "sha256": "0ac406bef830bb109be72d91c4f8a5ec0b1f85bc47435f9268ed39d6ba8460c0", + "sha256": "8b25fd20ded66ef5d12a083c1bb369abe32879cb89d1e041c991f1fbc9498e64", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/state.go", - "sha256": "1b389145e9996d5d162ad7509eb0e956d274deb07bca6f0380e22b762f4e97b1", + "sha256": "4f610e7bfa0081ca9999711120dddc6489645e56f5585b6f0169bc2627047701", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/test_helper_test.go", - "sha256": "a955dcf27dd817e8fdc48893f8a45564eff6921d448fee167c7c5cbd76bdcde3", + "sha256": "ebe21c8da428058d692b2aab09ac6f0da8cf659eca46cc736582431c1a60b857", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/testdata/maximal.tf", - "sha256": "821c8d0c0842232f5f760b86f3c014717fb44cc0c9b19a5e62fa88a578ecfcf8", + "sha256": "bc53f875ec5914a1ec32c0208adc26f624e7deb28329a47c29b3ddbccc7e6e49", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/roles/v7/role/testdata/minimal.tf", - "sha256": "d30d0569bdfc14842be74423e5e94e93b9bfc8647def1458c98d2eab7930876b", + "sha256": "861d5aed0aab37a7ffafd8864de4e92c0d96dc5c091c834e14d1a1eac3187706", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go", - "sha256": "557bb54a8f1cfc2acce8d42809d4a5225d7695f355159b16a053901ba0b55ab5", + "sha256": "4b50febbf8287b0de17844283f2e9895a7f23eaf2a23aa50b6ed9f42712d89d1", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go", - "sha256": "514c00f94e9d3e3d7c67d6380849c5dfddd6ce2416492363df7e588f4b538f17", + "sha256": "018723799ed5749ab1fe5829a0abe81cfba7b13d21386b83fd58c0316ec05d07", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go", - "sha256": "17cee8a1e1124b5af36f5e3723a55a107ee855fb79b43189cf60c68d534b74a8", + "sha256": "7e321c9077267ad49ba68d70e26fd06e792ac1ef569894da88f02a225df1735d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go", - "sha256": "07d5168cd8f3655564c8b9f50b3da87788c18e64a67a575b0cbebff029e8af03", + "sha256": "f2dee9f74d80db55571c032dd018ac64cb3ec9db5d871b5e1573de2a0f6b9c17", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go", - "sha256": "41de523c7d88351149434d7046be462ee86623ff1ba45a1cfd2a0837c23b432b", + "sha256": "e6529bbb2d47117c348b1a2d131e6b68e7d9e2caf3744bd85d3c1098b96b425d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go", - "sha256": "146a5ed6ce6a59a3ce3897b4a79e83122b23fce67637cc669bb16e641bcfed16", + "sha256": "14460b5b03df49edff9ceae0a39568685a4764d0cc35748c6f38cb8a55ee0f75", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go", - "sha256": "2585020341f0933836a6fdf3e6426d330bc66bbe856c13f1e10bfd41f0d55ce0", + "sha256": "773223b2fbb1b9e571fa3dfd84784399e3b3b000aadc96511c5b763a276cf1ff", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf", - "sha256": "9650c7049ffe61ea73349fd29f49fcfc9a55f0f136120def70f12e97d251616e", + "sha256": "b3f79ab473158a58ee0a915dc7860c53c9017a1e9a6a3024d4382d58a81450c1", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf", - "sha256": "58d29a706933549b697e25186f99fa56945480bdb5e078224318c024ff2096e7", + "sha256": "9f67157c4f993f1427f65fa401355aaf6c5f7f7a4167d2515e7b0da9fa450836", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/conditional_validators.go", - "sha256": "698ce39260c53bb1f2c9184f61ac1f1cc809d586bc9c13e781a57168f69c638e", + "sha256": "86dc5d0920e0b072f2a1898efaa0dcd6f4a595dc2ddfa1b38c0f4ecb046476bb", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/construct.go", - "sha256": "02bff914d26edd29265128bc476c30a3d62c6817e42e5b8306fbe4d3a8f9cbf8", + "sha256": "03f1b7a751860d3533bf2cb7943b816d78e487eacd906d221543c58f8174c26d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/crud.go", - "sha256": "a612a9ce99b69d44bd6773a50a9b0b0e28c28a66923a5391256444dba1580ca1", + "sha256": "a86b4403b3b69ff572d626da7cb07206839e6f3fc51c6a03081429cea21c0f04", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/list_acceptance_test.go", - "sha256": "98999085c120dcbed97b9a64be642502e4538e324df13e191711b4da4f4aa901", + "sha256": "e654b4337d8b311c9f60ab0abb0e6f2fa71f31515ebd803bc17fe94ceb810d6a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/list_resource.go", - "sha256": "485000a3facac004deec42d8d568adbebcf246256b8e711d07fc0b5092c36313", + "sha256": "664146bef00ebda32a672e6441c116c87a2c6f743653881e91bc5ed65bdf4ed3", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/model.go", - "sha256": "b557dae2016de3eeb3cac7c06416fc6bb9ed1381230d9e1280d614ea31ea4fd0", + "sha256": "8e308bb571670e28aac1eeacb4b912d1885a9dd74d0365eeea01f519537d445a", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/resource.go", - "sha256": "00c45126d1366abb5ffd9d2ff8ee62e6c52f42d24e0c0c06fdd4fdf7da4a3785", + "sha256": "283dae441c6e074a4d1270f2b5cb92be50157ea272001481969ec792e99ddd38", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/resource_acceptance_test.go", - "sha256": "38ff172b37ff5962bdf3bccccf3c5b5ad81893cb3c842f85abe55d0504b59f1e", + "sha256": "41385c9e294b683dba1c099d7764915feb384ffb61316ed2ec72f0c612cfca82", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/state.go", - "sha256": "1893174e903e470c4c926e979ad77419d25f4209974bb2112dac342f595d3376", + "sha256": "5be66fca441388d2c65807d0246c08eef45fece32d9563cbdc45082941c8862d", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/test_helper_test.go", - "sha256": "59648e9be726a61f991b7529250a83aa0dc439280b6236bb2e92692ace52bffe", + "sha256": "a206c48a50e156cb6cba98f87287e6e928efb50e8fdf39dfece8677f3284737c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/testdata/maximal.tf", - "sha256": "921f7402d4f5e66b5aa2968debd93aa2ce811fa4ffad23c535a789ebcfe7bf13", + "sha256": "5b7138d2b3695923b807f20ac6d21d16b567a525f8a169a322621d20420c7eea", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/testdata/minimal.tf", - "sha256": "8096b2d7f4993bf51a4d0ffb660d6e009f25d3b077e402aecb2a46d398940aaa", + "sha256": "4a94d63f3c5e8a22747091c6ff5804b13f10ec5614d1c45e5baa670b09607cae", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/testdata/query.tf", - "sha256": "aaec18d5ef84f203708f99a70a6527d1f173c239f77d9ab4fbfa69f9702ebaeb", + "sha256": "376f2ffe2012a64baef16d3426a80466719ec314d73650db545edd3021b7ac03", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/tags/v7/tag/testdata/replace.tf", - "sha256": "3344057b1656a21a0f02d1dd87d820a8c22536b497b2ec546d8895d52f3b4055", + "sha256": "2abca31e571a82e2919b87719fe4968bd3f1683dff20fa7a116aa6a5b731cd89", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/construct.go", - "sha256": "0cf0767e452f39ea9ee97b50255d2b59d3d1ef723ef203e69f009183ac87e891", + "sha256": "97602ddd922da7925e8bc30faf1fd6d358417ac20310488ffcbb4a2be83062d2", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/crud.go", - "sha256": "eab3ffa59c1f81b1ab185834654f98bdc7172559229839b7094cdc7c6a05a918", + "sha256": "1a62b1ebcf920209de3f328f5ff6c108a75d68fbbb670c9399dd58a66f521611", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/model.go", - "sha256": "e2575f9346d4d08a8e071f6d06da5e66cac2f2edd9ace8bc703d321106a91006", + "sha256": "b53eb4a1c60f93dc9fee89c798db3e9274685d2a953832ba605afae349ee1623", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/resource.go", - "sha256": "1f231f380d2e54b4033d9eafa1ea7e978742307f17f1c8aa263c3358d551727f", + "sha256": "cf25d7b5327f8d95bbef1072e75ce4628a81c0bfa6cfd9e2bff0d7339eed153c", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/resource_acceptance_test.go", - "sha256": "3f3e7bf34e680541378b227fbec5336e11ffea4116bc53b58edf361ca027194f", + "sha256": "fd4ffda82fb9ce4ffb6ca5c4407fe6893ca65ed38dacd53dd507179bf71c0d20", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/state.go", - "sha256": "22365e29603b1b253ecb8a7f8a29a86d75b691e034dd8df2312ac04df3a38f22", + "sha256": "85db6e068b793006db68b1a052c5d8024d6b8e6fcf5599943ece1e2f12064c81", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/test_helper_test.go", - "sha256": "d732651528b1fd30a1dfc000cb4060c99647262113e4339ea71b47091e4a7046", + "sha256": "f2daa2297693d814e47a0072cbc46803794b936fb90883b4eeed6a91dd89515b", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/testdata/maximal.tf", - "sha256": "1a131c34bae011ccc4a28c2b313613225e02968ea12dbbed18111499f031d6dc", + "sha256": "73cfbe612eef61702f7e86179dd7060f4d9728b4a2939bb76f2c6016fe081af1", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/users/v7/user/testdata/minimal.tf", - "sha256": "80301b3013c8ba22369e718e59824d24d9c0f37bac1a953d894fdfb704b6838d", + "sha256": "b657b134bdc85b00eacea83395dc6b0fa8cba34be29512f207399b25c3599790", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/construct.go", - "sha256": "f978e0414504463909b50947dd693fd859fbb0479673c59b65eccdefa56a4cf9", + "sha256": "2945451baba24be66c13701683fa5f2b81998c3b967af3531ee033a081fd28b0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/crud.go", - "sha256": "0408687d63ca18f9d23d37206a7941c5c36a3b9bc00bce3e23f935f5b5079d1b", + "sha256": "4f91ac0416ce50fd8caf05bb8509f17b9e07af531bece7e1177596b3fb3d3852", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/model.go", - "sha256": "7c56c6a1a1b9af77e1e0f6c0ef15a490949c048cacc9b4a118f59368b1554585", + "sha256": "7d9730d3b9d24e4119ea01720e307d93ace2c10d6c85d93badbbd98675edf870", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/resource.go", - "sha256": "44dfee77dbc79d9edffed99c32f2d2d7d40731c925d4ba4252ea332facfa3d62", + "sha256": "fe0107a7b1bdfddde973a933fc9bf923b30d53a53a427615e6cf3f7787c70a57", "blueprint": "blueprints/thousandeyes" }, - { - "path": "internal/services/resources/voice_tests/v7/tests_voice/resource_acceptance_test.go", - "sha256": "", - "blueprint": "orphaned" - }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/state.go", - "sha256": "b965e71e9a49097ab841d140bc28b410f81fa4b31532024acd6371314986489b", + "sha256": "565adb048d1cc66d2591967e4501a813af6fc3c8a8701f4182cf4424b66963e0", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go", - "sha256": "32f042cc20b8858964e90ebf808f2137967c08a03bf66b0d31bc016a7b9bdfc1", + "sha256": "a021957efafa2414c30fd48da6e5985573e16b18b2114e5458717455ca601d7d", "blueprint": "blueprints/thousandeyes" }, - { - "path": "internal/services/resources/voice_tests/v7/tests_voice/testdata/minimal.tf", - "sha256": "", - "blueprint": "orphaned" - }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go", - "sha256": "ae698a9c145a99009a5aaaa3743ae55f6a27f92e28f8c30bf80aed55d09a1bed", + "sha256": "d38c187a5385f34aaa62d1322889a9272a97605fc5fbdd546107ca61a64d8661", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go", - "sha256": "c31f78b047a882b6f1550dfa0e3aefe904a457c1fbe5fe3d342826f589d8eb5b", + "sha256": "2d92d87a1c5b855619381a7e5c55b17d3c580344c7bc8e6fb17c1867d02aef76", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go", - "sha256": "ae23b5390b57f6d50ae0a14a8d54e92995bc53852d0876d1b32fdef5d5a6bc62", + "sha256": "f96acadc0b6d6c6011f550a829ac2e9ccfbd918bad73669ccc6923d766c9d2de", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go", - "sha256": "dd80f860f891214e37c11aac63e7f8126424b239bdf4dd8738de75dda5742ad1", + "sha256": "0e4e070bbb074ec22f26df2f9f7395b10da0b30bc1ec62dfae6faf17045477cf", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go", - "sha256": "8c2cbb8ad96fce3db2961c40d806ce2c92360392dacb5ad36165d8af60511a70", + "sha256": "72d58e1c74ad180b299a65c93328cdc46cf11d9752f91668b0826da1f369b065", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go", - "sha256": "fe0a44c7d8f1d036fed68b2a310c7c96eed0f1589214ed50cdd2ad2bac50df68", + "sha256": "1310cc18efe1a7d46792bd257330b877f8caa5da9ff724c1362c196140963cd6", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go", - "sha256": "19986cf26dfd4ae943dccc09f730af5193eba6764242187d9887584cd42fc79d", + "sha256": "86d2d219cd8d6cea88bfda5688b8f46786abe2725f20ff2280e74c624f7ccbfa", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf", - "sha256": "529a6d6ccd0e8203dc259fdbbfe4f41b575be92b955cc1d2eded77e095b42aa1", + "sha256": "712118b75de074527829baab61286176c0cd765a571235c4c92f348a090874cf", "blueprint": "blueprints/thousandeyes" }, { "path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf", - "sha256": "cd1d646e9ebd4d5cb208405ecb8009e71bc7f72ebf3b4cfc7b4fad7348d5bcc3", + "sha256": "522fd0d0f98e31f1ace14ad47c0943385d7d9b9681c71ab82c0db947c88dca19", "blueprint": "blueprints/thousandeyes" } ] diff --git a/pilot/thousandeyes/README.md b/pilot/thousandeyes/README.md index 763eb6f1..c4dde428 100644 --- a/pilot/thousandeyes/README.md +++ b/pilot/thousandeyes/README.md @@ -19,31 +19,31 @@ generated, built, unit-tested and live-tested; publishing is out of scope. | `internal/services/common/{convert,crud,errors,schema}/` | shared helpers the generated code calls | hand-written | | `internal/acceptance/` | the acceptance harness (exists/destroy checks, logging) | hand-written | | `docs/` | registry documentation, rendered by tfplugindocs — **do not hand-edit**; `go generate .` rewrites it | -| `examples/` | emit-scaffolded example configurations a human may enrich | +| `examples/` | scaffolded example configurations a human may enrich | The full ownership story, including the per-file header that marks generated code, is in [docs/generated-boundary.md](../../docs/generated-boundary.md). The one rule: **fix the blueprint, not the Go** — every generated file here is -overwritten by the next `emit`. +overwritten by the next `provider generate`. ## The surface Every resource is backed by a committed blueprint in [`blueprints/thousandeyes/`](../../blueprints/thousandeyes/), and every probed -resource by evidence in [`probe-evidence/thousandeyes/`](../../probe-evidence/thousandeyes/): +resource by a recording in [`recordings/thousandeyes/`](../../recordings/thousandeyes/): the test lifecycles were rehearsed against the live API before this code was generated (see [docs/fixtures-and-rehearsal.md](../../docs/fixtures-and-rehearsal.md)). -Some acceptance tests gate on environment variables rather than running +Some acceptance tests are guarded by environment variables rather than running unconditionally, because a disposable tenant cannot hold every prerequisite: -| Gate | Covers | +| Variable | Covers | |---|---| | `TFPFGEN_ACC_ADMIN` | account groups, roles, users — need an admin-scoped token | | `TFPFGEN_ACC_ENTERPRISE` | agent-to-agent and voice tests — need enterprise agents (lab hardware) | | `TFPFGEN_ACC_SIP` | SIP server tests — need a reachable SIP target | -The hardware-gated variables stay unset in CI, so those tests skip with a stated +The hardware-dependent variables stay unset in CI, so those tests skip with a stated reason rather than failing. The dashboard `layout` attribute is dropped pending a widgets model. @@ -64,8 +64,8 @@ TF_ACC=1 go test -count=1 -p 1 -run TestAcc ./... ``` `-p 1` matters: packages otherwise run concurrently against one tenant. In CI, -acceptance is a weekly and on-dispatch workflow gated on a GitHub environment — -see [docs/gates.md](../../docs/gates.md). +acceptance is a weekly and on-dispatch workflow, admitted through a GitHub +environment — see [docs/checks.md](../../docs/checks.md). To try the provider against local Terraform configuration, build it and point Terraform at the binary with `dev_overrides` (no `terraform init`): @@ -86,11 +86,12 @@ TF_CLI_CONFIG_FILE=/tmp/dev.tfrc terraform plan From the repository root: ```bash -go run ./cmd/tfpluginframeworkgen emit -blueprint blueprints/thousandeyes -out pilot/thousandeyes +go run ./cmd/tfpfgen provider generate -blueprint blueprints/thousandeyes -out pilot/thousandeyes ``` -`emit` finishes with the postcheck battery (compile, tfplugindocs, +`provider generate` finishes with the postcheck battery (compile, tfplugindocs, `terraform fmt`), so the tree it leaves is the tree CI accepts. The SDK version everything is checked against is pinned in this module's `go.mod` and named in -the provider blueprint; bump both together and re-run `bindings` with -`-facts-check` (see the [onboarding runbook](../../docs/onboarding-a-new-api.md)). +the provider blueprint; bump both together and re-run `bindings check` and +`bindings facts -check` (see the +[onboarding runbook](../../docs/onboarding-a-new-api.md)). diff --git a/pilot/thousandeyes/docs/resources/alerts_rule.md b/pilot/thousandeyes/docs/resources/alert_rule.md similarity index 94% rename from pilot/thousandeyes/docs/resources/alerts_rule.md rename to pilot/thousandeyes/docs/resources/alert_rule.md index 7568b53d..31b35030 100644 --- a/pilot/thousandeyes/docs/resources/alerts_rule.md +++ b/pilot/thousandeyes/docs/resources/alert_rule.md @@ -1,23 +1,25 @@ --- # generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "thousandeyes_alerts_rule Resource - ThousandEyes" +page_title: "thousandeyes_alert_rule Resource - ThousandEyes" subcategory: "" description: |- Retrieve alert rule. --- -# thousandeyes_alerts_rule (Resource) +# thousandeyes_alert_rule (Resource) Retrieve alert rule. ## Example Usage ```terraform -resource "thousandeyes_alerts_rule" "example" { - alert_type = "http-server" - expression = "((responseTime >= 1000 ms))" - rounds_violating_out_of = 2 - rule_name = "tfacc-rule-name" +resource "thousandeyes_alert_rule" "example" { + alert_type = "http-server" + expression = "((responseTime >= 1000 ms))" + minimum_sources = 1 + rounds_violating_out_of = 2 + rounds_violating_required = 1 + rule_name = "tfacc-rule-name" } ``` diff --git a/pilot/thousandeyes/docs/resources/dashboards_filter.md b/pilot/thousandeyes/docs/resources/dashboard_filter.md similarity index 95% rename from pilot/thousandeyes/docs/resources/dashboards_filter.md rename to pilot/thousandeyes/docs/resources/dashboard_filter.md index 7f76b342..58d82e98 100644 --- a/pilot/thousandeyes/docs/resources/dashboards_filter.md +++ b/pilot/thousandeyes/docs/resources/dashboard_filter.md @@ -1,19 +1,19 @@ --- # generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "thousandeyes_dashboards_filter Resource - ThousandEyes" +page_title: "thousandeyes_dashboard_filter Resource - ThousandEyes" subcategory: "" description: |- Get dashboard filter. --- -# thousandeyes_dashboards_filter (Resource) +# thousandeyes_dashboard_filter (Resource) Get dashboard filter. ## Example Usage ```terraform -resource "thousandeyes_dashboards_filter" "example" { +resource "thousandeyes_dashboard_filter" "example" { context = [{ data_source_id = "VIRTUAL_AGENT", filters = [{ filter_id = "TEST", metric_ids = [], values = ["281474976977085"] }] }] name = "tfacc-name" } diff --git a/pilot/thousandeyes/examples/resources/thousandeyes_alert_rule/resource.tf b/pilot/thousandeyes/examples/resources/thousandeyes_alert_rule/resource.tf new file mode 100644 index 00000000..acdc1f07 --- /dev/null +++ b/pilot/thousandeyes/examples/resources/thousandeyes_alert_rule/resource.tf @@ -0,0 +1,8 @@ +resource "thousandeyes_alert_rule" "example" { + alert_type = "http-server" + expression = "((responseTime >= 1000 ms))" + minimum_sources = 1 + rounds_violating_out_of = 2 + rounds_violating_required = 1 + rule_name = "tfacc-rule-name" +} diff --git a/pilot/thousandeyes/examples/resources/thousandeyes_dashboard_filter/resource.tf b/pilot/thousandeyes/examples/resources/thousandeyes_dashboard_filter/resource.tf new file mode 100644 index 00000000..cbbd9f38 --- /dev/null +++ b/pilot/thousandeyes/examples/resources/thousandeyes_dashboard_filter/resource.tf @@ -0,0 +1,4 @@ +resource "thousandeyes_dashboard_filter" "example" { + context = [{ data_source_id = "VIRTUAL_AGENT", filters = [{ filter_id = "TEST", metric_ids = [], values = ["281474976977085"] }] }] + name = "tfacc-name" +} diff --git a/pilot/thousandeyes/internal/provider/actions.go b/pilot/thousandeyes/internal/provider/actions.go index 5fa4dcd3..f95686f2 100644 --- a/pilot/thousandeyes/internal/provider/actions.go +++ b/pilot/thousandeyes/internal/provider/actions.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package provider diff --git a/pilot/thousandeyes/internal/provider/datasources.go b/pilot/thousandeyes/internal/provider/datasources.go index cffb2fe1..4b59ef11 100644 --- a/pilot/thousandeyes/internal/provider/datasources.go +++ b/pilot/thousandeyes/internal/provider/datasources.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package provider diff --git a/pilot/thousandeyes/internal/provider/ephemerals.go b/pilot/thousandeyes/internal/provider/ephemerals.go index 98dd7202..53a36c2d 100644 --- a/pilot/thousandeyes/internal/provider/ephemerals.go +++ b/pilot/thousandeyes/internal/provider/ephemerals.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package provider @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/ephemeral" - ephV7Credential "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential" + v7CredentialEph "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential" ) // EphemeralResources returns every ephemeral resource this provider serves. @@ -17,6 +17,6 @@ import ( // regenerating, not by editing here. func (p *Provider) EphemeralResources(_ context.Context) []func() ephemeral.EphemeralResource { return []func() ephemeral.EphemeralResource{ - ephV7Credential.NewCredentialEphemeral, + v7CredentialEph.NewCredentialEphemeral, } } diff --git a/pilot/thousandeyes/internal/provider/list_resources.go b/pilot/thousandeyes/internal/provider/list_resources.go index 543b326b..39086304 100644 --- a/pilot/thousandeyes/internal/provider/list_resources.go +++ b/pilot/thousandeyes/internal/provider/list_resources.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package provider diff --git a/pilot/thousandeyes/internal/provider/resources.go b/pilot/thousandeyes/internal/provider/resources.go index 7822b6f1..249db381 100644 --- a/pilot/thousandeyes/internal/provider/resources.go +++ b/pilot/thousandeyes/internal/provider/resources.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package provider @@ -11,16 +11,16 @@ import ( v7AccountGroup "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group" v7TestsAgentToAgent "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent" v7TestsAgentToServer "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server" - v7AlertsRule "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule" + v7AlertRule "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule" v7AlertSuppressionWindow "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window" v7TestsAPI "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api" v7TestsBGP "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp" v7Credential "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/credentials/v7/credential" v7Dashboard "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard" - v7DashboardsFilter "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter" + v7DashboardFilter "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter" v7TestsDNSServer "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server" v7TestsDNSTrace "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace" - v7TestsDnssec "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec" + v7TestsDNSSEC "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec" v7EndpointLabel "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label" v7TestsFTPServer "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server" v7TestsHTTPServer "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server" @@ -40,11 +40,11 @@ import ( func (p *Provider) Resources(_ context.Context) []func() resource.Resource { return []func() resource.Resource{ v7AccountGroup.NewAccountGroupResource, + v7AlertRule.NewAlertRuleResource, v7AlertSuppressionWindow.NewAlertSuppressionWindowResource, - v7AlertsRule.NewAlertsRuleResource, v7Credential.NewCredentialResource, v7Dashboard.NewDashboardResource, - v7DashboardsFilter.NewDashboardsFilterResource, + v7DashboardFilter.NewDashboardFilterResource, v7EndpointLabel.NewEndpointLabelResource, v7Role.NewRoleResource, v7Tag.NewTagResource, @@ -52,9 +52,9 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource { v7TestsAgentToAgent.NewTestsAgentToAgentResource, v7TestsAgentToServer.NewTestsAgentToServerResource, v7TestsBGP.NewTestsBGPResource, + v7TestsDNSSEC.NewTestsDNSSECResource, v7TestsDNSServer.NewTestsDNSServerResource, v7TestsDNSTrace.NewTestsDNSTraceResource, - v7TestsDnssec.NewTestsDnssecResource, v7TestsFTPServer.NewTestsFTPServerResource, v7TestsHTTPServer.NewTestsHTTPServerResource, v7TestsPageLoad.NewTestsPageLoadResource, diff --git a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go index d5b3e1c4..14d60d1c 100644 --- a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go +++ b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/disable-endpoint-agent/ package disable_endpoint_agent @@ -15,8 +15,8 @@ import ( ) const ( - // ActionName is the Terraform type this action registers as. - ActionName = "thousandeyes_disable_endpoint_agent" + // TypeName is the Terraform type this action registers as. + TypeName = "thousandeyes_disable_endpoint_agent" // InvokeTimeout is the deadline in seconds. One operation, one deadline -- and unlike a // resource there is no timeouts block to override it, because the framework's action @@ -46,7 +46,7 @@ type DisableEndpointAgentAction struct { // Metadata returns the action type name. func (a *DisableEndpointAgentAction) Metadata(_ context.Context, _ action.MetadataRequest, resp *action.MetadataResponse) { - resp.TypeName = ActionName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. @@ -54,7 +54,7 @@ func (a *DisableEndpointAgentAction) Metadata(_ context.Context, _ action.Metada // action.ConfigureRequest, which is its own type: the framework gives each block kind a // distinct one, so this cannot share the resource's helper. func (a *DisableEndpointAgentAction) Configure(ctx context.Context, req action.ConfigureRequest, resp *action.ConfigureResponse) { - a.client = client.ForAction(ctx, req, resp, ActionName) + a.client = client.ForAction(ctx, req, resp, TypeName) } // Schema returns the action schema. diff --git a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go index 9215282d..22ca89cc 100644 --- a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package disable_endpoint_agent_test diff --git a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go index 5009965c..1695fdc3 100644 --- a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go +++ b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package disable_endpoint_agent @@ -26,7 +26,7 @@ func (a *DisableEndpointAgentAction) Invoke(ctx context.Context, req action.Invo return } - tflog.Debug(ctx, "invoking action", map[string]any{"action": ActionName}) + tflog.Debug(ctx, "invoking action", map[string]any{"action": TypeName}) // A nil client is a provider bug -- Configure must populate ActionData -- and the // first live run proved the failure mode is a segfault that kills the whole provider @@ -54,10 +54,10 @@ func (a *DisableEndpointAgentAction) Invoke(ctx context.Context, req action.Invo _, _, err := a.client.API.EndpointAgents.DisableEndpointAgent(ctx, data.AgentID.ValueString()) if err != nil { - errors.Handle(&resp.Diagnostics, ActionName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } - tflog.Debug(ctx, "action completed", map[string]any{"action": ActionName}) + tflog.Debug(ctx, "action completed", map[string]any{"action": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go index 7f631620..74e63047 100644 --- a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go +++ b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package disable_endpoint_agent diff --git a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf index c811f4b4..e253350d 100644 --- a/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf +++ b/pilot/thousandeyes/internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The action under test, invoked once by a terraform_data trigger on create. The # subject's identifier arrives as a variable, supplied by the generated test from the diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource.go index 9a88bf19..641c745c 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -16,8 +16,8 @@ import ( ) const ( - // DataSourceName is the Terraform type this data source registers as. - DataSourceName = "thousandeyes_tag" + // TypeName is the Terraform type this data source registers as. + TypeName = "thousandeyes_tag" // ReadTimeout is the default read deadline in seconds. A practitioner overrides it // with the data source's timeouts block. Read is the only operation a data source @@ -44,12 +44,12 @@ type TagDataSource struct { // Metadata returns the data source type name. func (d *TagDataSource) Metadata(_ context.Context, _ datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = DataSourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (d *TagDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - d.client = client.ForDataSource(ctx, req, resp, DataSourceName) + d.client = client.ForDataSource(ctx, req, resp, TypeName) } // Schema returns the data source schema. diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go index fe35ac07..b65ebdc5 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag_test diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/model.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/model.go index 0fe93540..f3718b81 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/model.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/get-tag/ package tag diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/read.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/read.go index 51fecd06..29502dbb 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/read.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/read.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -26,7 +26,7 @@ func (d *TagDataSource) Read(ctx context.Context, req datasource.ReadRequest, re return } - tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": TypeName}) ctx, cancel := crud.HandleTimeout(ctx, data.Timeouts.Read, ReadTimeout*time.Second, &resp.Diagnostics) if cancel == nil { @@ -40,7 +40,7 @@ func (d *TagDataSource) Read(ctx context.Context, req datasource.ReadRequest, re // drop state: the practitioner named something that is not there, and silently // returning nothing would leave whatever referenced it failing further on with // no indication of why. - errors.Handle(&resp.Diagnostics, DataSourceName, errors.OpRead, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpRead, err) return } resp.Diagnostics.Append(mapRemoteStateToTerraform(ctx, &data, remote)...) diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/seed_helper_test.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/seed_helper_test.go index 98ab466e..2cda8035 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/seed_helper_test.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/seed_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/state.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/state.go index 1272fe13..0a79d792 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/state.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagDataSourceModel, re if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving state untouched", map[string]any{ - "dataSource": DataSourceName, + "dataSource": TypeName, }) return diags } @@ -52,7 +52,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagDataSourceModel, re data.Filters, d = flattenTagFilters(ctx, remote.Filters) diags.Append(d...) - tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/testdata/datasource.tf b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/testdata/datasource.tf index 69a883f3..5c19b07b 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/testdata/datasource.tf +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tag/testdata/datasource.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The seed resource this data source reads back, then the data block itself. One file, # because the reference below only resolves against the resource above it. diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource.go index e721e365..d84be543 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tags @@ -16,8 +16,8 @@ import ( ) const ( - // DataSourceName is the Terraform type this data source registers as. - DataSourceName = "thousandeyes_tags" + // TypeName is the Terraform type this data source registers as. + TypeName = "thousandeyes_tags" // ReadTimeout is the default read deadline in seconds. A practitioner overrides it // with the data source's timeouts block. Read is the only operation a data source @@ -44,12 +44,12 @@ type TagsDataSource struct { // Metadata returns the data source type name. func (d *TagsDataSource) Metadata(_ context.Context, _ datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = DataSourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (d *TagsDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - d.client = client.ForDataSource(ctx, req, resp, DataSourceName) + d.client = client.ForDataSource(ctx, req, resp, TypeName) } // Schema returns the data source schema. diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go index 8d28cc88..ff5eb3d1 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tags_test diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/model.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/model.go index 55be38f5..a78ca288 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/model.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/list-tags/ package tags diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/read.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/read.go index eec19ee0..8f9d7af1 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/read.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/read.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tags @@ -26,7 +26,7 @@ func (d *TagsDataSource) Read(ctx context.Context, req datasource.ReadRequest, r return } - tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "reading data source", map[string]any{"dataSource": TypeName}) ctx, cancel := crud.HandleTimeout(ctx, data.Timeouts.Read, ReadTimeout*time.Second, &resp.Diagnostics) if cancel == nil { @@ -40,7 +40,7 @@ func (d *TagsDataSource) Read(ctx context.Context, req datasource.ReadRequest, r // drop state: the practitioner named something that is not there, and silently // returning nothing would leave whatever referenced it failing further on with // no indication of why. - errors.Handle(&resp.Diagnostics, DataSourceName, errors.OpRead, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpRead, err) return } resp.Diagnostics.Append(mapRemoteStateToTerraform(ctx, &data, remote)...) diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/seed_helper_test.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/seed_helper_test.go index 0d2e09b7..a4d45eaf 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/seed_helper_test.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/seed_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tags diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/state.go b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/state.go index c35b2604..562e754e 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/state.go +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tags @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagsDataSourceModel, r if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving state untouched", map[string]any{ - "dataSource": DataSourceName, + "dataSource": TypeName, }) return diags } @@ -35,7 +35,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagsDataSourceModel, r data.Tags, d = flattenTagSummaries(ctx, remote.Tags) diags.Append(d...) - tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": DataSourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"dataSource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/testdata/datasource.tf b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/testdata/datasource.tf index 6c3ebb7a..9bd5e164 100644 --- a/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/testdata/datasource.tf +++ b/pilot/thousandeyes/internal/services/datasources/tags/v7/tags/testdata/datasource.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The seed resource this data source reads back, then the data block itself. One file, # because the reference below only resolves against the resource above it. diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral.go index 387ea7ef..6c4e6b84 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -14,8 +14,8 @@ import ( ) const ( - // EphemeralName is the Terraform type this ephemeral resource registers as. - EphemeralName = "thousandeyes_credential" + // TypeName is the Terraform type this ephemeral resource registers as. + TypeName = "thousandeyes_credential" // OpenTimeout is the open deadline in seconds. Open is the one operation this // ephemeral has, and an ephemeral schema carries no timeouts block for a @@ -45,12 +45,12 @@ type CredentialEphemeral struct { // Metadata returns the ephemeral resource type name. func (e *CredentialEphemeral) Metadata(_ context.Context, _ ephemeral.MetadataRequest, resp *ephemeral.MetadataResponse) { - resp.TypeName = EphemeralName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (e *CredentialEphemeral) Configure(ctx context.Context, req ephemeral.ConfigureRequest, resp *ephemeral.ConfigureResponse) { - e.client = client.ForEphemeral(ctx, req, resp, EphemeralName) + e.client = client.ForEphemeral(ctx, req, resp, TypeName) } // Schema returns the ephemeral resource schema. diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go index ac35333a..d109eec6 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential_test diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/model.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/model.go index 2b3d9133..e3d72465 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/model.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/get-credential/ package credential diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/open.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/open.go index 3d263e94..0dc880ab 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/open.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/open.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -26,7 +26,7 @@ func (e *CredentialEphemeral) Open(ctx context.Context, req ephemeral.OpenReques return } - tflog.Debug(ctx, "opening ephemeral resource", map[string]any{"ephemeral": EphemeralName}) + tflog.Debug(ctx, "opening ephemeral resource", map[string]any{"ephemeral": TypeName}) // A nil client is a provider bug -- Configure must populate EphemeralResourceData -- // and the first live run proved the failure mode is a segfault that kills the whole @@ -49,7 +49,7 @@ func (e *CredentialEphemeral) Open(ctx context.Context, req ephemeral.OpenReques // A missing object is an error rather than an empty result: the practitioner // named something that is not there, and whatever was going to consume the value // would fail further on with no indication of why. - errors.Handle(&resp.Diagnostics, EphemeralName, errors.OpRead, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpRead, err) return } mapRemoteToResult(ctx, &data, remote) diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go index b87ff700..e633bd3d 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/state.go b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/state.go index 3002de60..361ceecb 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/state.go +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -19,7 +19,7 @@ import ( func mapRemoteToResult(ctx context.Context, data *CredentialEphemeralModel, remote *credentials.Credential) { if remote == nil { tflog.Debug(ctx, "remote object is nil, leaving the result untouched", map[string]any{ - "ephemeral": EphemeralName, + "ephemeral": TypeName, }) return } @@ -27,5 +27,5 @@ func mapRemoteToResult(ctx context.Context, data *CredentialEphemeralModel, remo data.Name = convert.PtrStringToFramework(remote.Name) data.Value = convert.PtrStringToFramework(remote.Value) - tflog.Debug(ctx, "mapped remote result", map[string]any{"ephemeral": EphemeralName}) + tflog.Debug(ctx, "mapped remote result", map[string]any{"ephemeral": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf index bcbb1cd6..e6cef43b 100644 --- a/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf +++ b/pilot/thousandeyes/internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The seed resource, the ephemeral that opens it, and the echo that makes the opened # value observable. One file, because each reference only resolves against the block diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/construct.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/construct.go index 9c8bda09..3625b832 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/construct.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group @@ -17,7 +17,7 @@ import ( // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. func constructResource(ctx context.Context, data *AccountGroupResourceModel) *account_groups.AccountGroupRequest { - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &account_groups.AccountGroupRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/crud.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/crud.go index 4d7aeba3..fce0354e 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/crud.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group @@ -26,7 +26,7 @@ func (r *AccountGroupResource) Create(ctx context.Context, req resource.CreateRe return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -38,7 +38,7 @@ func (r *AccountGroupResource) Create(ctx context.Context, req resource.CreateRe created, _, err := r.client.API.AccountGroups.CreateAccountGroup(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -68,7 +68,7 @@ func (r *AccountGroupResource) Read(ctx context.Context, req resource.ReadReques return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -87,7 +87,7 @@ func (r *AccountGroupResource) Read(ctx context.Context, req resource.ReadReques // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -117,7 +117,7 @@ func (r *AccountGroupResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -151,7 +151,7 @@ func (r *AccountGroupResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -169,7 +169,7 @@ func (r *AccountGroupResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -185,7 +185,7 @@ func (r *AccountGroupResource) Update(ctx context.Context, req resource.UpdateRe return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -197,7 +197,7 @@ func (r *AccountGroupResource) Update(ctx context.Context, req resource.UpdateRe _, _, err := r.client.API.AccountGroups.UpdateAccountGroup(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -223,7 +223,7 @@ func (r *AccountGroupResource) Delete(ctx context.Context, req resource.DeleteRe return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -238,7 +238,7 @@ func (r *AccountGroupResource) Delete(ctx context.Context, req resource.DeleteRe if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/model.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/model.go index aa3a9379..8f3502a7 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/model.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource.go index 5bdedbaf..f473917b 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group @@ -18,8 +18,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_account_group" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_account_group" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -49,12 +49,12 @@ type AccountGroupResource struct { // Metadata returns the resource type name. func (r *AccountGroupResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *AccountGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go index f16a0c91..eb68b928 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group_test diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go index a13f6db1..49b759df 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AccountGroupResourceMo if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -41,7 +41,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AccountGroupResourceMo data.Users, d = flattenAccountGroupUserAccountGroups(ctx, remote.Users) diags.Append(d...) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/test_helper_test.go index 88c01d7a..c784bea9 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package account_group diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf index a1e8b46e..068c3652 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf index 19982d56..7deb07e6 100644 --- a/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go index c77876f5..8f3a5e15 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsAgentToAgentResourceModel diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &agent_to_agent_tests.AgentToAgentTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go index 1ffc2fca..5beb858e 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent @@ -25,7 +25,7 @@ func (r *TestsAgentToAgentResource) Create(ctx context.Context, req resource.Cre return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsAgentToAgentResource) Create(ctx context.Context, req resource.Cre created, _, err := r.client.API.AgentToAgentTests.CreateAgentToAgentTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsAgentToAgentResource) Read(ctx context.Context, req resource.ReadR return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsAgentToAgentResource) Read(ctx context.Context, req resource.ReadR // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsAgentToAgentResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsAgentToAgentResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsAgentToAgentResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsAgentToAgentResource) Update(ctx context.Context, req resource.Upd return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsAgentToAgentResource) Update(ctx context.Context, req resource.Upd _, _, err := r.client.API.AgentToAgentTests.UpdateAgentToAgentTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsAgentToAgentResource) Delete(ctx context.Context, req resource.Del return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsAgentToAgentResource) Delete(ctx context.Context, req resource.Del if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go index 20d4eced..a08eb535 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go index 02dd3cb0..4eead609 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_agent_to_agent" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_agent_to_agent" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type TestsAgentToAgentResource struct { // Metadata returns the resource type name. func (r *TestsAgentToAgentResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsAgentToAgentResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource_acceptance_test.go deleted file mode 100644 index ba7acf95..00000000 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource_acceptance_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:3a39a25649423800e368a92f6e4267039ede78bbe19d20c0829fb5056f1e03b4). DO NOT EDIT. - -package tests_agent_to_agent_test - -import ( - "os" - "path/filepath" - "testing" - "time" - - "github.com/hashicorp/terraform-plugin-testing/helper/resource" - - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/check" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/destroy" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent" -) - -// The resource under test, and the helper that asks the API whether it is really there. -const address = "thousandeyes_tests_agent_to_agent.test" - -var testResource = tests_agent_to_agent.TestsAgentToAgentTestResource{} - -// TestAccResourceTestsAgentToAgent_01_Lifecycle exercises the whole lifecycle against a live API. -// -// Guarded by TF_ACC, which terraform-plugin-testing requires, so `go test ./...` never reaches a -// live tenant by accident. The credential comes from the environment; see internal/acceptance. -// -// Every step ends with an implicit plan, and terraform-plugin-testing fails the step if that plan -// is not empty. That is the single strongest signal available that state mapping is right: an -// attribute the provider stores differently from how the API reports it shows up here as a diff on -// a resource nobody touched, and no amount of compiling or schema checking can see it. -func TestAccResourceTestsAgentToAgent_01_Lifecycle(t *testing.T) { - // This resource needs more privilege than the ordinary credential carries, so the - // gate is its own variable: a run against a lesser token skips it by name here, - // stated, instead of failing red for a reason that is about the token. - if os.Getenv("TFPFGEN_ACC_ENTERPRISE") == "" { - t.Skipf("set TFPFGEN_ACC_ENTERPRISE to run this test; it needs a more privileged credential") - } - resource.Test(t, resource.TestCase{ - PreCheck: func() { acceptance.PreCheck(t) }, - ProtoV6ProviderFactories: acceptance.ProtoV6ProviderFactories, - // Destroy is verified against the API rather than against state, because Terraform - // considers a destroy done when the provider's Delete returns no error -- which is a - // statement about the request, not about the object. - // - // The wait is the built-in default; this API's consistency after delete was never measured, - // so this is a budget rather than an observation - CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_tests_agent_to_agent", 20*time.Second), - Steps: []resource.TestStep{ - // Create, from the smallest configuration the schema permits. - { - Config: config(t, "minimal.tf"), - Check: resource.ComposeAggregateTestCheckFunc( - check.That(address).ExistsInAPI(testResource), - check.That(address).Key("id").Exists(), - check.That(address).Key("interval").Exists(), - check.That(address).Key("target_agent_id").HasValue("tfacc-target-agent-id"), - ), - }, - // Import, then compare every attribute against the state the apply produced. - // - // This is what catches a read that populates state differently from a create, which - // is the most common way a generated provider is subtly wrong. - { - ResourceName: address, - ImportState: true, - ImportStateVerify: true, - // Skipped, with the reason for each. An attribute the API never returns is - // absent after an import and present before it, so comparing it fails for a - // reason that has nothing to do with import being broken. - // agents: it is write-only, carried from configuration, which an import does not have - ImportStateVerifyIgnore: []string{"agents"}, - }, - // Update in place, to a configuration that sets the optional attributes too. - { - Config: config(t, "maximal.tf"), - Check: resource.ComposeAggregateTestCheckFunc( - check.That(address).ExistsInAPI(testResource), - check.That(address).Key("id").Exists(), - check.That(address).Key("alerts_enabled").HasValue("true"), - check.That(address).Key("bgp_measurements").HasValue("true"), - check.That(address).Key("description").HasValue("tfacc-description"), - check.That(address).Key("direction").HasValue("to-target"), - check.That(address).Key("dscp_id").HasValue("0"), - check.That(address).Key("enabled").HasValue("true"), - check.That(address).Key("fixed_packet_rate").Exists(), - check.That(address).Key("interval").Exists(), - check.That(address).Key("mss").HasValue("20"), - check.That(address).Key("num_path_traces").HasValue("1"), - check.That(address).Key("path_trace_mode").HasValue("classic"), - check.That(address).Key("port").HasValue("1"), - check.That(address).Key("protocol").HasValue("tcp"), - check.That(address).Key("randomized_start_time").HasValue("true"), - check.That(address).Key("target_agent_id").HasValue("tfacc-target-agent-id"), - check.That(address).Key("test_name").HasValue("tfacc-test-name"), - check.That(address).Key("throughput_duration").HasValue("5000"), - check.That(address).Key("throughput_measurements").HasValue("true"), - check.That(address).Key("throughput_rate").HasValue("8"), - check.That(address).Key("use_public_bgp").HasValue("true"), - ), - }, - }, - }) -} - -// config reads one of the committed fixtures. -// -// From testdata rather than from a string constant in this file, so the configuration can be -// edited and re-run without recompiling, and so `terraform fmt` can police it. -func config(t *testing.T, name string) string { - t.Helper() - - body, err := os.ReadFile(filepath.Join("testdata", name)) - if err != nil { - t.Fatalf("reading fixture %s: %v", name, err) - } - - return string(body) -} diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go index 31498c72..6bb264ff 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsAgentToAgentResourceModel, remote *agent_to_agent_tests.AgentToAgentTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -55,5 +55,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsAgentToAgentResou data.Type = convert.PtrStringToFramework(remote.Type) data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go index a2ef0dc6..363603a0 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_agent diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/testdata/minimal.tf deleted file mode 100644 index d459043d..00000000 --- a/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/testdata/minimal.tf +++ /dev/null @@ -1,22 +0,0 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:3a39a25649423800e368a92f6e4267039ede78bbe19d20c0829fb5056f1e03b4). DO NOT EDIT. - -# The smallest configuration this resource accepts: its required attributes and nothing else. -# -# Regenerated, so it follows the schema. If the API starts requiring a field, this file gains it -# on the next emit rather than an acceptance run discovering it. - -resource "thousandeyes_tests_agent_to_agent" "test" { - # Where a value came from. A fixture takes what the API was observed to accept, not the first - # value the specification documents -- which is the opposite of how a generated validator is - # built. A validator errs toward permitting, because blocking a configuration the API would - # have taken is a harm nobody can work around; a fixture errs toward working, because it is an - # input rather than a contract. - # - # interval: curated in the blueprint's accFixture; the generator cannot derive it - # - # agents: curated in the blueprint's accFixture; the generator cannot derive it - interval = 3600 - target_agent_id = "tfacc-target-agent-id" - agents = [{ agent_id = "3" }] -} diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go index d0dedcb7..c10d477c 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsAgentToServerResourceMode diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &agent_to_server_tests.AgentToServerTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go index 09a4e9ac..5a756658 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server @@ -25,7 +25,7 @@ func (r *TestsAgentToServerResource) Create(ctx context.Context, req resource.Cr return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsAgentToServerResource) Create(ctx context.Context, req resource.Cr created, _, err := r.client.API.AgentToServerTests.CreateAgentToServerTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsAgentToServerResource) Read(ctx context.Context, req resource.Read return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsAgentToServerResource) Read(ctx context.Context, req resource.Read // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsAgentToServerResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsAgentToServerResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsAgentToServerResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -201,7 +201,7 @@ func (r *TestsAgentToServerResource) Delete(ctx context.Context, req resource.De return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -216,7 +216,7 @@ func (r *TestsAgentToServerResource) Delete(ctx context.Context, req resource.De if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go index 0d3bcb05..d1e4633e 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go index dab423b2..b34262f3 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server @@ -24,8 +24,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_agent_to_server" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_agent_to_server" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -55,12 +55,12 @@ type TestsAgentToServerResource struct { // Metadata returns the resource type name. func (r *TestsAgentToServerResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsAgentToServerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go index 3bb9e1ad..6dbac226 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server_test diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go index 471b8f81..edade117 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsAgentToServerResourceModel, remote *agent_to_server_tests.AgentToServerTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -55,5 +55,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsAgentToServerReso data.Type = convert.EnumToFramework(remote.Type) data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go index 04f79c35..954cd622 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_agent_to_server diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf index 2f9c3046..efbba039 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf index b5cd5b49..ba8ee91d 100644 --- a/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/construct.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/construct.go similarity index 86% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/construct.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/construct.go index d611995f..181ab4d0 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/construct.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/construct.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "context" @@ -17,12 +17,12 @@ import ( // // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. -func constructResource(ctx context.Context, data *AlertsRuleResourceModel) (*alert_rules.RuleDetailUpdate, diag.Diagnostics) { +func constructResource(ctx context.Context, data *AlertRuleResourceModel) (*alert_rules.RuleDetailUpdate, diag.Diagnostics) { var ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &alert_rules.RuleDetailUpdate{} diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/crud.go similarity index 81% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/crud.go index a119673b..5a717e5d 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/crud.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "context" @@ -17,16 +17,16 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/errors" ) -// Create provisions a new thousandeyes_alerts_rule. -func (r *AlertsRuleResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { - var plan AlertsRuleResourceModel +// Create provisions a new thousandeyes_alert_rule. +func (r *AlertRuleResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan AlertRuleResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -42,7 +42,7 @@ func (r *AlertsRuleResource) Create(ctx context.Context, req resource.CreateRequ created, _, err := r.client.API.AlertRules.CreateAlertRule(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -63,16 +63,16 @@ func (r *AlertsRuleResource) Create(ctx context.Context, req resource.CreateRequ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) } -// Read refreshes thousandeyes_alerts_rule state from the API. -func (r *AlertsRuleResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { - var state AlertsRuleResourceModel +// Read refreshes thousandeyes_alert_rule state from the API. +func (r *AlertRuleResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state AlertRuleResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -91,7 +91,7 @@ func (r *AlertsRuleResource) Read(ctx context.Context, req resource.ReadRequest, // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -100,7 +100,7 @@ func (r *AlertsRuleResource) Read(ctx context.Context, req resource.ReadRequest, resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) } -// readState fetches thousandeyes_alerts_rule and maps it onto state. +// readState fetches thousandeyes_alert_rule and maps it onto state. // // The single call site of mapRemoteStateToTerraform. Create, Update and Read all arrive // here, so a change to state mapping is one edit rather than three that have to agree. @@ -108,9 +108,9 @@ func (r *AlertsRuleResource) Read(ctx context.Context, req resource.ReadRequest, // The bool distinguishes "not there" from "the request failed", which need different // handling and used to be conflated: Read turns absence into a recreate, while a read // after a write treats it as not-yet-consistent and tries again. -func (r *AlertsRuleResource) readState( +func (r *AlertRuleResource) readState( ctx context.Context, - state *AlertsRuleResourceModel, + state *AlertRuleResourceModel, op errors.Operation, ) (bool, diag.Diagnostics) { var diags diag.Diagnostics @@ -121,7 +121,7 @@ func (r *AlertsRuleResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -145,9 +145,9 @@ func (r *AlertsRuleResource) readState( // The budget is the built-in default: this API's consistency has not been measured, so // there is no observation to size it from. An API that is consistent succeeds on the first // attempt and pays nothing for the loop. -func (r *AlertsRuleResource) readAfterWrite( +func (r *AlertRuleResource) readAfterWrite( ctx context.Context, - state *AlertsRuleResourceModel, + state *AlertRuleResourceModel, op errors.Operation, ) diag.Diagnostics { var diags diag.Diagnostics @@ -155,7 +155,7 @@ func (r *AlertsRuleResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -173,15 +173,15 @@ func (r *AlertsRuleResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags } -// Update applies configuration changes to an existing thousandeyes_alerts_rule. -func (r *AlertsRuleResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - var plan, state AlertsRuleResourceModel +// Update applies configuration changes to an existing thousandeyes_alert_rule. +func (r *AlertRuleResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan, state AlertRuleResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) resp.Diagnostics.Append(req.State.Get(ctx, &state)...) @@ -189,7 +189,7 @@ func (r *AlertsRuleResource) Update(ctx context.Context, req resource.UpdateRequ return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -205,7 +205,7 @@ func (r *AlertsRuleResource) Update(ctx context.Context, req resource.UpdateRequ _, _, err := r.client.API.AlertRules.UpdateAlertRule(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -222,16 +222,16 @@ func (r *AlertsRuleResource) Update(ctx context.Context, req resource.UpdateRequ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) } -// Delete removes a thousandeyes_alerts_rule. -func (r *AlertsRuleResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { - var state AlertsRuleResourceModel +// Delete removes a thousandeyes_alert_rule. +func (r *AlertRuleResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var state AlertRuleResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -246,7 +246,7 @@ func (r *AlertsRuleResource) Delete(ctx context.Context, req resource.DeleteRequ if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/model.go similarity index 84% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/model.go index dd31079b..4233f33f 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/model.go @@ -1,17 +1,17 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "github.com/hashicorp/terraform-plugin-framework/types" ) -// AlertsRuleResourceModel is the Terraform state for a thousandeyes_alerts_rule. +// AlertRuleResourceModel is the Terraform state for a thousandeyes_alert_rule. // // Field order follows the schema, and the timeouts value is last. -type AlertsRuleResourceModel struct { +type AlertRuleResourceModel struct { AlertGroupType types.String `tfsdk:"alert_group_type"` AlertType types.String `tfsdk:"alert_type"` Description types.String `tfsdk:"description"` diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource.go similarity index 89% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource.go index 963d9b1b..f7a71d36 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "context" @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_alerts_rule" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_alert_rule" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -35,38 +35,38 @@ const ( // Compile-time assertions that this resource implements what it claims to. They // turn a missing method into a build failure rather than a runtime surprise. var ( - _ resource.Resource = (*AlertsRuleResource)(nil) - _ resource.ResourceWithConfigure = (*AlertsRuleResource)(nil) - _ resource.ResourceWithImportState = (*AlertsRuleResource)(nil) + _ resource.Resource = (*AlertRuleResource)(nil) + _ resource.ResourceWithConfigure = (*AlertRuleResource)(nil) + _ resource.ResourceWithImportState = (*AlertRuleResource)(nil) ) -// NewAlertsRuleResource returns the thousandeyes_alerts_rule resource. -func NewAlertsRuleResource() resource.Resource { - return &AlertsRuleResource{} +// NewAlertRuleResource returns the thousandeyes_alert_rule resource. +func NewAlertRuleResource() resource.Resource { + return &AlertRuleResource{} } -// AlertsRuleResource implements the thousandeyes_alerts_rule resource. -type AlertsRuleResource struct { +// AlertRuleResource implements the thousandeyes_alert_rule resource. +type AlertRuleResource struct { client *thousandeyes.Client } // Metadata returns the resource type name. -func (r *AlertsRuleResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName +func (r *AlertRuleResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. -func (r *AlertsRuleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) +func (r *AlertRuleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. -func (r *AlertsRuleResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { +func (r *AlertRuleResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) } // Schema returns the resource schema. -func (r *AlertsRuleResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *AlertRuleResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ MarkdownDescription: "Retrieve alert rule.", Attributes: map[string]schema.Attribute{ diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource_acceptance_test.go similarity index 91% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource_acceptance_test.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource_acceptance_test.go index e19fc0ca..5a933b69 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/resource_acceptance_test.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule_test +package alert_rule_test import ( "os" @@ -14,15 +14,15 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance" "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/check" "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/destroy" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule" ) // The resource under test, and the helper that asks the API whether it is really there. -const address = "thousandeyes_alerts_rule.test" +const address = "thousandeyes_alert_rule.test" -var testResource = alerts_rule.AlertsRuleTestResource{} +var testResource = alert_rule.AlertRuleTestResource{} -// TestAccResourceAlertsRule_01_Lifecycle exercises the whole lifecycle against a live API. +// TestAccResourceAlertRule_01_Lifecycle exercises the whole lifecycle against a live API. // // Guarded by TF_ACC, which terraform-plugin-testing requires, so `go test ./...` never reaches a // live tenant by accident. The credential comes from the environment; see internal/acceptance. @@ -31,7 +31,7 @@ var testResource = alerts_rule.AlertsRuleTestResource{} // is not empty. That is the single strongest signal available that state mapping is right: an // attribute the provider stores differently from how the API reports it shows up here as a diff on // a resource nobody touched, and no amount of compiling or schema checking can see it. -func TestAccResourceAlertsRule_01_Lifecycle(t *testing.T) { +func TestAccResourceAlertRule_01_Lifecycle(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, ProtoV6ProviderFactories: acceptance.ProtoV6ProviderFactories, @@ -41,7 +41,7 @@ func TestAccResourceAlertsRule_01_Lifecycle(t *testing.T) { // // The wait is the built-in default; this API's consistency after delete was never measured, // so this is a budget rather than an observation - CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_alerts_rule", 20*time.Second), + CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_alert_rule", 20*time.Second), Steps: []resource.TestStep{ // Create, from the smallest configuration the schema permits. { diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/state.go similarity index 91% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/state.go index 8bd0b992..93156567 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/state.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "context" @@ -19,7 +19,7 @@ import ( // This function replaces what a reflection-based provider does at runtime. Being // generated code, a field whose conversion is wrong is a compile error rather // than a surprise during apply. -func mapRemoteStateToTerraform(ctx context.Context, data *AlertsRuleResourceModel, remote *alert_rules.RuleDetail) diag.Diagnostics { +func mapRemoteStateToTerraform(ctx context.Context, data *AlertRuleResourceModel, remote *alert_rules.RuleDetail) diag.Diagnostics { var ( diags diag.Diagnostics d diag.Diagnostics @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AlertsRuleResourceMode if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -85,7 +85,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AlertsRuleResourceMode data.VisitedSitesFilter = types.SetNull(types.StringType) } - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/test_helper_test.go similarity index 77% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/test_helper_test.go rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/test_helper_test.go index 5037aa84..64fb52a6 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/test_helper_test.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package alerts_rule +package alert_rule import ( "context" @@ -12,19 +12,19 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists" ) -// AlertsRuleTestResource answers whether a thousandeyes_alerts_rule is really in the API. +// AlertRuleTestResource answers whether a thousandeyes_alert_rule is really in the API. // // In a _test.go file rather than an ordinary one, so no test scaffolding reaches a built // provider. An external _test package still sees the exported identifiers of a package's own // test files, which is what lets the generated acceptance test refer to this. -type AlertsRuleTestResource struct{} +type AlertRuleTestResource struct{} // Exists reads the object back through the same operation the resource's Read uses. // // Deliberately the same call rather than an equivalent one. A check that asked a list endpoint // instead could report an object present while the read the provider actually depends on was // broken, which is the failure an acceptance test exists to catch. -func (AlertsRuleTestResource) Exists( +func (AlertRuleTestResource) Exists( ctx context.Context, state *terraform.InstanceState, ) (*bool, error) { diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/maximal.tf similarity index 92% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/maximal.tf index 16b2873c..eb9faff4 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. @@ -10,7 +10,7 @@ # something only a human knows, recorded behaviour for everything the probe observed. What # could not be derived is listed inside the block, each with the reason. -resource "thousandeyes_alerts_rule" "test" { +resource "thousandeyes_alert_rule" "test" { # Where a value came from. # # alert_type: curated in the blueprint's accFixture; the generator cannot derive it diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/minimal.tf similarity index 87% rename from pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf rename to pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/minimal.tf index f43ff52a..90688019 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alert_rule/testdata/minimal.tf @@ -1,12 +1,12 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # # Regenerated, so it follows the schema. If the API starts requiring a field, this file gains it # on the next emit rather than an acceptance run discovering it. -resource "thousandeyes_alerts_rule" "test" { +resource "thousandeyes_alert_rule" "test" { # Where a value came from. A fixture takes what the API was observed to accept, not the first # value the specification documents -- which is the opposite of how a generated validator is # built. A validator errs toward permitting, because blocking a configuration the API would diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go index 3d16cb32..f55098bd 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window @@ -24,7 +24,7 @@ func constructResource(ctx context.Context, data *AlertSuppressionWindowResource diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &alert_suppression_windows.AlertSuppressionWindowRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go index b02f33cf..81da21bc 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window @@ -25,7 +25,7 @@ func (r *AlertSuppressionWindowResource) Create(ctx context.Context, req resourc return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *AlertSuppressionWindowResource) Create(ctx context.Context, req resourc created, _, err := r.client.API.AlertSuppressionWindows.CreateAlertSuppressionWindow(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *AlertSuppressionWindowResource) Read(ctx context.Context, req resource. return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *AlertSuppressionWindowResource) Read(ctx context.Context, req resource. // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *AlertSuppressionWindowResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *AlertSuppressionWindowResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *AlertSuppressionWindowResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *AlertSuppressionWindowResource) Update(ctx context.Context, req resourc return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *AlertSuppressionWindowResource) Update(ctx context.Context, req resourc _, _, err := r.client.API.AlertSuppressionWindows.UpdateAlertSuppressionWindow(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *AlertSuppressionWindowResource) Delete(ctx context.Context, req resourc return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *AlertSuppressionWindowResource) Delete(ctx context.Context, req resourc if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go index 1ba39e4e..3060b43e 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go index c30692bf..7a67cc48 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window @@ -19,8 +19,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_alert_suppression_window" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_alert_suppression_window" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -50,12 +50,12 @@ type AlertSuppressionWindowResource struct { // Metadata returns the resource type name. func (r *AlertSuppressionWindowResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *AlertSuppressionWindowResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go index d21067fc..bd79fef6 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window_test diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go index 73307415..31ec4823 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AlertSuppressionWindow if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -43,7 +43,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *AlertSuppressionWindow data.StartDate = convert.PtrStringToFramework(remote.StartDate) data.Status = convert.EnumToFramework(remote.Status) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go index b23409d3..567bff61 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package alert_suppression_window diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf index 5ffa86fa..c64b2f0c 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf index 8974d696..424e0f1a 100644 --- a/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/construct.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/construct.go index dc65457e..c19ac5bb 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/construct.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsAPIResourceModel) (*api_t diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &api_tests.ApiTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/crud.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/crud.go index f3a3b6f9..9ef5fba2 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/crud.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api @@ -25,7 +25,7 @@ func (r *TestsAPIResource) Create(ctx context.Context, req resource.CreateReques return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsAPIResource) Create(ctx context.Context, req resource.CreateReques created, _, err := r.client.API.APITests.CreateApiTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsAPIResource) Read(ctx context.Context, req resource.ReadRequest, r return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsAPIResource) Read(ctx context.Context, req resource.ReadRequest, r // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsAPIResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsAPIResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsAPIResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsAPIResource) Update(ctx context.Context, req resource.UpdateReques return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsAPIResource) Update(ctx context.Context, req resource.UpdateReques _, _, err := r.client.API.APITests.UpdateApiTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsAPIResource) Delete(ctx context.Context, req resource.DeleteReques return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsAPIResource) Delete(ctx context.Context, req resource.DeleteReques if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/model.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/model.go index 6ce28c90..2c7368b0 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/model.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource.go index a0d45a1b..7cf3c440 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api @@ -22,8 +22,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_api" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_api" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -53,12 +53,12 @@ type TestsAPIResource struct { // Metadata returns the resource type name. func (r *TestsAPIResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsAPIResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go index 4a7dd263..985740f5 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api_test diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/state.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/state.go index b441f01e..4c119a32 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/state.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsAPIResourceModel, if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -92,7 +92,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsAPIResourceModel, data.VaultCredentials, d = flattenTestsAPITestVaultCredentials(ctx, remote.VaultCredentials) diags.Append(d...) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/test_helper_test.go index e5eacf02..33aeae75 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_api diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf index c0fd7b1c..d39b105f 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf index 5effbb1a..bf9522c0 100644 --- a/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/construct.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/construct.go index 1fc8b689..71c71b39 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/construct.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp @@ -17,7 +17,7 @@ import ( // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. func constructResource(ctx context.Context, data *TestsBGPResourceModel) *bgp_tests.BgpTestRequest { - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &bgp_tests.BgpTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/crud.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/crud.go index 19c69448..64486c96 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/crud.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp @@ -25,7 +25,7 @@ func (r *TestsBGPResource) Create(ctx context.Context, req resource.CreateReques return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -37,7 +37,7 @@ func (r *TestsBGPResource) Create(ctx context.Context, req resource.CreateReques created, _, err := r.client.API.BGPTests.CreateBgpTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -67,7 +67,7 @@ func (r *TestsBGPResource) Read(ctx context.Context, req resource.ReadRequest, r return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -86,7 +86,7 @@ func (r *TestsBGPResource) Read(ctx context.Context, req resource.ReadRequest, r // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -116,7 +116,7 @@ func (r *TestsBGPResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -150,7 +150,7 @@ func (r *TestsBGPResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -168,7 +168,7 @@ func (r *TestsBGPResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -197,7 +197,7 @@ func (r *TestsBGPResource) Delete(ctx context.Context, req resource.DeleteReques return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -212,7 +212,7 @@ func (r *TestsBGPResource) Delete(ctx context.Context, req resource.DeleteReques if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/model.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/model.go index 127cec64..cd7d8373 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/model.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource.go index 5c490593..e10afe51 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp @@ -19,8 +19,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_bgp" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_bgp" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -50,12 +50,12 @@ type TestsBGPResource struct { // Metadata returns the resource type name. func (r *TestsBGPResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsBGPResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go index 42185c3b..630366f0 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp_test diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/state.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/state.go index cc2f00e8..ee51b804 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/state.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsBGPResourceModel, remote *bgp_tests.BgpTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -41,5 +41,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsBGPResourceModel, data.Type = convert.EnumToFramework(remote.Type) data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go index 807511cf..df328452 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_bgp diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf index 89e8b796..b83e3187 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf index 2ba95b46..f9bef367 100644 --- a/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/construct.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/construct.go index 533f3434..acaf6bf2 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/construct.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -17,7 +17,7 @@ import ( // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. func constructResource(ctx context.Context, data *CredentialResourceModel) *credentials.CredentialRequest { - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &credentials.CredentialRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/crud.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/crud.go index a5b5ef62..e2b96a3b 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/crud.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -25,7 +25,7 @@ func (r *CredentialResource) Create(ctx context.Context, req resource.CreateRequ return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -37,7 +37,7 @@ func (r *CredentialResource) Create(ctx context.Context, req resource.CreateRequ created, _, err := r.client.API.Credentials.CreateCredential(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -67,7 +67,7 @@ func (r *CredentialResource) Read(ctx context.Context, req resource.ReadRequest, return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -86,7 +86,7 @@ func (r *CredentialResource) Read(ctx context.Context, req resource.ReadRequest, // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -116,7 +116,7 @@ func (r *CredentialResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -150,7 +150,7 @@ func (r *CredentialResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -168,7 +168,7 @@ func (r *CredentialResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -184,7 +184,7 @@ func (r *CredentialResource) Update(ctx context.Context, req resource.UpdateRequ return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -196,7 +196,7 @@ func (r *CredentialResource) Update(ctx context.Context, req resource.UpdateRequ _, _, err := r.client.API.Credentials.UpdateCredential(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -222,7 +222,7 @@ func (r *CredentialResource) Delete(ctx context.Context, req resource.DeleteRequ return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -237,7 +237,7 @@ func (r *CredentialResource) Delete(ctx context.Context, req resource.DeleteRequ if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/model.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/model.go index 6007a85b..254dbe67 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/model.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/create-credential/ package credential diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource.go index 5efdfffd..ec017514 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -18,8 +18,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_credential" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_credential" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -49,12 +49,12 @@ type CredentialResource struct { // Metadata returns the resource type name. func (r *CredentialResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *CredentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource_acceptance_test.go index 00f29336..f8bdfa14 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential_test diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/state.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/state.go index 79ed8cec..35db49b0 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/state.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *CredentialResourceModel, remote *credentials.Credential) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -29,5 +29,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *CredentialResourceMode data.Name = convert.PtrStringToFramework(remote.Name) data.Value = convert.PtrStringToFramework(remote.Value) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/test_helper_test.go index b87ff700..e633bd3d 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package credential diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/maximal.tf index 175cc5cc..fd3445a8 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/minimal.tf index c0b0f456..db9d9d8c 100644 --- a/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/credentials/v7/credential/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/construct.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/construct.go index f7d89fb6..b001d7fd 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/construct.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard @@ -17,7 +17,7 @@ import ( // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. func constructResource(ctx context.Context, data *DashboardResourceModel) *dashboards.Dashboard { - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &dashboards.Dashboard{} diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/crud.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/crud.go index f5b7d9b3..807afc1d 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/crud.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard @@ -25,7 +25,7 @@ func (r *DashboardResource) Create(ctx context.Context, req resource.CreateReque return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -37,7 +37,7 @@ func (r *DashboardResource) Create(ctx context.Context, req resource.CreateReque created, _, err := r.client.API.Dashboards.CreateDashboard(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -67,7 +67,7 @@ func (r *DashboardResource) Read(ctx context.Context, req resource.ReadRequest, return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -86,7 +86,7 @@ func (r *DashboardResource) Read(ctx context.Context, req resource.ReadRequest, // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -116,7 +116,7 @@ func (r *DashboardResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -150,7 +150,7 @@ func (r *DashboardResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -168,7 +168,7 @@ func (r *DashboardResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -184,7 +184,7 @@ func (r *DashboardResource) Update(ctx context.Context, req resource.UpdateReque return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -196,7 +196,7 @@ func (r *DashboardResource) Update(ctx context.Context, req resource.UpdateReque _, _, err := r.client.API.Dashboards.UpdateDashboard(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -222,7 +222,7 @@ func (r *DashboardResource) Delete(ctx context.Context, req resource.DeleteReque return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -237,7 +237,7 @@ func (r *DashboardResource) Delete(ctx context.Context, req resource.DeleteReque if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/model.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/model.go index ae2f653c..8fd1e4a5 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/model.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource.go index 93f779f6..7eee0e69 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard @@ -18,8 +18,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_dashboard" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_dashboard" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -49,12 +49,12 @@ type DashboardResource struct { // Metadata returns the resource type name. func (r *DashboardResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *DashboardResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource_acceptance_test.go index a47d68db..4f00e3ec 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard_test diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/state.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/state.go index be2f8de5..1b476054 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/state.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *DashboardResourceModel, remote *dashboards.ApiDashboard) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -46,5 +46,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *DashboardResourceModel data.ModifiedDate = convert.PtrStringToFramework(remote.ModifiedDate) data.Title = convert.PtrStringToFramework(remote.Title) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/test_helper_test.go index b4eb121a..b10e488b 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package dashboard diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/maximal.tf index 3cf2486a..e082bb88 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/minimal.tf index daefd721..8b1f3029 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/dashboards/v7/dashboard/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/construct.go similarity index 68% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/construct.go index 7ab48672..d2823a8b 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/construct.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "context" @@ -18,16 +18,16 @@ import ( // // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. -func constructResource(ctx context.Context, data *DashboardsFilterResourceModel) (*dashboards_filters.ApiContextFilterRequest, diag.Diagnostics) { +func constructResource(ctx context.Context, data *DashboardFilterResourceModel) (*dashboards_filters.ApiContextFilterRequest, diag.Diagnostics) { var ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &dashboards_filters.ApiContextFilterRequest{} - contextRaw, d := expandDashboardsFilterApiContextFilterses(ctx, data.Context) + contextRaw, d := expandDashboardFilterApiContextFilterses(ctx, data.Context) diags.Append(d...) body.Context = dashboards_filters.ApiContextFilters(contextRaw) body.Description = convert.FrameworkToEnum[dashboards_filters.ApiDashboardFilterDescription](data.Description) @@ -36,8 +36,8 @@ func constructResource(ctx context.Context, data *DashboardsFilterResourceModel) return body, diags } -// expandDashboardsFilterApiContextFilterses converts the configured DashboardsFilterApiContextFiltersModel values into SDK structs. -func expandDashboardsFilterApiContextFilterses(ctx context.Context, v types.Set) ([]dashboards_filters.ApiDataSourceFilters, diag.Diagnostics) { +// expandDashboardFilterApiContextFilterses converts the configured DashboardFilterApiContextFiltersModel values into SDK structs. +func expandDashboardFilterApiContextFilterses(ctx context.Context, v types.Set) ([]dashboards_filters.ApiDataSourceFilters, diag.Diagnostics) { var diags diag.Diagnostics var d diag.Diagnostics @@ -47,7 +47,7 @@ func expandDashboardsFilterApiContextFilterses(ctx context.Context, v types.Set) return nil, diags } - var models []DashboardsFilterApiContextFiltersModel + var models []DashboardFilterApiContextFiltersModel diags.Append(v.ElementsAs(ctx, &models, false)...) if diags.HasError() { return nil, diags @@ -58,7 +58,7 @@ func expandDashboardsFilterApiContextFilterses(ctx context.Context, v types.Set) var item dashboards_filters.ApiDataSourceFilters item.DataSourceID = convert.FrameworkToString(m.DataSourceID) - item.Filters, d = expandDashboardsFilterApiDataSourceFilters(ctx, m.Filters) + item.Filters, d = expandDashboardFilterApiDataSourceFilters(ctx, m.Filters) diags.Append(d...) out = append(out, item) } @@ -66,8 +66,8 @@ func expandDashboardsFilterApiContextFilterses(ctx context.Context, v types.Set) return out, diags } -// expandDashboardsFilterApiDataSourceFilters converts the configured DashboardsFilterApiDataSourceFilterModel values into SDK structs. -func expandDashboardsFilterApiDataSourceFilters(ctx context.Context, v types.Set) ([]dashboards_filters.ApiDataSourceFilter, diag.Diagnostics) { +// expandDashboardFilterApiDataSourceFilters converts the configured DashboardFilterApiDataSourceFilterModel values into SDK structs. +func expandDashboardFilterApiDataSourceFilters(ctx context.Context, v types.Set) ([]dashboards_filters.ApiDataSourceFilter, diag.Diagnostics) { var diags diag.Diagnostics var d diag.Diagnostics @@ -77,7 +77,7 @@ func expandDashboardsFilterApiDataSourceFilters(ctx context.Context, v types.Set return nil, diags } - var models []DashboardsFilterApiDataSourceFilterModel + var models []DashboardFilterApiDataSourceFilterModel diags.Append(v.ElementsAs(ctx, &models, false)...) if diags.HasError() { return nil, diags diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/crud.go similarity index 80% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/crud.go index 1d80d668..b4e18388 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/crud.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "context" @@ -16,16 +16,16 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/errors" ) -// Create provisions a new thousandeyes_dashboards_filter. -func (r *DashboardsFilterResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { - var plan DashboardsFilterResourceModel +// Create provisions a new thousandeyes_dashboard_filter. +func (r *DashboardFilterResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan DashboardFilterResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *DashboardsFilterResource) Create(ctx context.Context, req resource.Crea created, _, err := r.client.API.DashboardsFilters.CreateDashboardFilter(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -62,16 +62,16 @@ func (r *DashboardsFilterResource) Create(ctx context.Context, req resource.Crea resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) } -// Read refreshes thousandeyes_dashboards_filter state from the API. -func (r *DashboardsFilterResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { - var state DashboardsFilterResourceModel +// Read refreshes thousandeyes_dashboard_filter state from the API. +func (r *DashboardFilterResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state DashboardFilterResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *DashboardsFilterResource) Read(ctx context.Context, req resource.ReadRe // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -99,7 +99,7 @@ func (r *DashboardsFilterResource) Read(ctx context.Context, req resource.ReadRe resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) } -// readState fetches thousandeyes_dashboards_filter and maps it onto state. +// readState fetches thousandeyes_dashboard_filter and maps it onto state. // // The single call site of mapRemoteStateToTerraform. Create, Update and Read all arrive // here, so a change to state mapping is one edit rather than three that have to agree. @@ -107,9 +107,9 @@ func (r *DashboardsFilterResource) Read(ctx context.Context, req resource.ReadRe // The bool distinguishes "not there" from "the request failed", which need different // handling and used to be conflated: Read turns absence into a recreate, while a read // after a write treats it as not-yet-consistent and tries again. -func (r *DashboardsFilterResource) readState( +func (r *DashboardFilterResource) readState( ctx context.Context, - state *DashboardsFilterResourceModel, + state *DashboardFilterResourceModel, op errors.Operation, ) (bool, diag.Diagnostics) { var diags diag.Diagnostics @@ -120,7 +120,7 @@ func (r *DashboardsFilterResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -144,9 +144,9 @@ func (r *DashboardsFilterResource) readState( // The budget is the built-in default: this API's consistency has not been measured, so // there is no observation to size it from. An API that is consistent succeeds on the first // attempt and pays nothing for the loop. -func (r *DashboardsFilterResource) readAfterWrite( +func (r *DashboardFilterResource) readAfterWrite( ctx context.Context, - state *DashboardsFilterResourceModel, + state *DashboardFilterResourceModel, op errors.Operation, ) diag.Diagnostics { var diags diag.Diagnostics @@ -154,7 +154,7 @@ func (r *DashboardsFilterResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,15 +172,15 @@ func (r *DashboardsFilterResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags } -// Update applies configuration changes to an existing thousandeyes_dashboards_filter. -func (r *DashboardsFilterResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - var plan, state DashboardsFilterResourceModel +// Update applies configuration changes to an existing thousandeyes_dashboard_filter. +func (r *DashboardFilterResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan, state DashboardFilterResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) resp.Diagnostics.Append(req.State.Get(ctx, &state)...) @@ -188,7 +188,7 @@ func (r *DashboardsFilterResource) Update(ctx context.Context, req resource.Upda return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *DashboardsFilterResource) Update(ctx context.Context, req resource.Upda _, _, err := r.client.API.DashboardsFilters.UpdateDashboardFilter(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -221,16 +221,16 @@ func (r *DashboardsFilterResource) Update(ctx context.Context, req resource.Upda resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) } -// Delete removes a thousandeyes_dashboards_filter. -func (r *DashboardsFilterResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { - var state DashboardsFilterResourceModel +// Delete removes a thousandeyes_dashboard_filter. +func (r *DashboardFilterResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var state DashboardFilterResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *DashboardsFilterResource) Delete(ctx context.Context, req resource.Dele if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/model.go similarity index 77% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/model.go index d810b436..b153b3cd 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/model.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" @@ -9,10 +9,10 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" ) -// DashboardsFilterResourceModel is the Terraform state for a thousandeyes_dashboards_filter. +// DashboardFilterResourceModel is the Terraform state for a thousandeyes_dashboard_filter. // // Field order follows the schema, and the timeouts value is last. -type DashboardsFilterResourceModel struct { +type DashboardFilterResourceModel struct { AID types.String `tfsdk:"aid"` Context types.Set `tfsdk:"context"` CreatedBy types.Object `tfsdk:"created_by"` @@ -25,16 +25,16 @@ type DashboardsFilterResourceModel struct { Timeouts timeouts.Value `tfsdk:"timeouts"` } -// DashboardsFilterApiContextFiltersModel is one element of a nested attribute. +// DashboardFilterApiContextFiltersModel is one element of a nested attribute. // // It is a sibling of the resource model rather than an inner type, because the // framework decodes collection elements into a named type. -type DashboardsFilterApiContextFiltersModel struct { +type DashboardFilterApiContextFiltersModel struct { DataSourceID types.String `tfsdk:"data_source_id"` Filters types.Set `tfsdk:"filters"` } -// dashboardsFilterApiContextFiltersAttrTypes describes DashboardsFilterApiContextFiltersModel to the framework. +// dashboardsFilterApiContextFiltersAttrTypes describes DashboardFilterApiContextFiltersModel to the framework. // // It is declared once and referenced by both conversion helpers, so the shape // cannot drift between the direction that reads it and the direction that writes it. @@ -45,17 +45,17 @@ var dashboardsFilterApiContextFiltersAttrTypes = map[string]attr.Type{ var dashboardsFilterApiContextFiltersObjectType = types.ObjectType{AttrTypes: dashboardsFilterApiContextFiltersAttrTypes} -// DashboardsFilterApiDataSourceFilterModel is one element of a nested attribute. +// DashboardFilterApiDataSourceFilterModel is one element of a nested attribute. // // It is a sibling of the resource model rather than an inner type, because the // framework decodes collection elements into a named type. -type DashboardsFilterApiDataSourceFilterModel struct { +type DashboardFilterApiDataSourceFilterModel struct { FilterID types.String `tfsdk:"filter_id"` MetricIDs types.Set `tfsdk:"metric_ids"` Values types.Set `tfsdk:"values"` } -// dashboardsFilterApiDataSourceFilterAttrTypes describes DashboardsFilterApiDataSourceFilterModel to the framework. +// dashboardsFilterApiDataSourceFilterAttrTypes describes DashboardFilterApiDataSourceFilterModel to the framework. // // It is declared once and referenced by both conversion helpers, so the shape // cannot drift between the direction that reads it and the direction that writes it. @@ -67,16 +67,16 @@ var dashboardsFilterApiDataSourceFilterAttrTypes = map[string]attr.Type{ var dashboardsFilterApiDataSourceFilterObjectType = types.ObjectType{AttrTypes: dashboardsFilterApiDataSourceFilterAttrTypes} -// DashboardsFilterApiDashboardFilterUserDetailsModel is one element of a nested attribute. +// DashboardFilterApiDashboardFilterUserDetailsModel is one element of a nested attribute. // // It is a sibling of the resource model rather than an inner type, because the // framework decodes collection elements into a named type. -type DashboardsFilterApiDashboardFilterUserDetailsModel struct { +type DashboardFilterApiDashboardFilterUserDetailsModel struct { Name types.String `tfsdk:"name"` Uid types.String `tfsdk:"uid"` } -// dashboardsFilterApiDashboardFilterUserDetailsAttrTypes describes DashboardsFilterApiDashboardFilterUserDetailsModel to the framework. +// dashboardsFilterApiDashboardFilterUserDetailsAttrTypes describes DashboardFilterApiDashboardFilterUserDetailsModel to the framework. // // It is declared once and referenced by both conversion helpers, so the shape // cannot drift between the direction that reads it and the direction that writes it. @@ -87,16 +87,16 @@ var dashboardsFilterApiDashboardFilterUserDetailsAttrTypes = map[string]attr.Typ var dashboardsFilterApiDashboardFilterUserDetailsObjectType = types.ObjectType{AttrTypes: dashboardsFilterApiDashboardFilterUserDetailsAttrTypes} -// DashboardsFilterApiDashboardFilterUserDetailsModel2 is one element of a nested attribute. +// DashboardFilterApiDashboardFilterUserDetailsModel2 is one element of a nested attribute. // // It is a sibling of the resource model rather than an inner type, because the // framework decodes collection elements into a named type. -type DashboardsFilterApiDashboardFilterUserDetailsModel2 struct { +type DashboardFilterApiDashboardFilterUserDetailsModel2 struct { Name types.String `tfsdk:"name"` Uid types.String `tfsdk:"uid"` } -// dashboardsFilterApiDashboardFilterUserDetailsAttrTypes2 describes DashboardsFilterApiDashboardFilterUserDetailsModel2 to the framework. +// dashboardsFilterApiDashboardFilterUserDetailsAttrTypes2 describes DashboardFilterApiDashboardFilterUserDetailsModel2 to the framework. // // It is declared once and referenced by both conversion helpers, so the shape // cannot drift between the direction that reads it and the direction that writes it. diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource.go similarity index 79% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource.go index 094d0055..a3dee0af 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "context" @@ -19,8 +19,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_dashboards_filter" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_dashboard_filter" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -33,38 +33,38 @@ const ( // Compile-time assertions that this resource implements what it claims to. They // turn a missing method into a build failure rather than a runtime surprise. var ( - _ resource.Resource = (*DashboardsFilterResource)(nil) - _ resource.ResourceWithConfigure = (*DashboardsFilterResource)(nil) - _ resource.ResourceWithImportState = (*DashboardsFilterResource)(nil) + _ resource.Resource = (*DashboardFilterResource)(nil) + _ resource.ResourceWithConfigure = (*DashboardFilterResource)(nil) + _ resource.ResourceWithImportState = (*DashboardFilterResource)(nil) ) -// NewDashboardsFilterResource returns the thousandeyes_dashboards_filter resource. -func NewDashboardsFilterResource() resource.Resource { - return &DashboardsFilterResource{} +// NewDashboardFilterResource returns the thousandeyes_dashboard_filter resource. +func NewDashboardFilterResource() resource.Resource { + return &DashboardFilterResource{} } -// DashboardsFilterResource implements the thousandeyes_dashboards_filter resource. -type DashboardsFilterResource struct { +// DashboardFilterResource implements the thousandeyes_dashboard_filter resource. +type DashboardFilterResource struct { client *thousandeyes.Client } // Metadata returns the resource type name. -func (r *DashboardsFilterResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName +func (r *DashboardFilterResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. -func (r *DashboardsFilterResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) +func (r *DashboardFilterResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. -func (r *DashboardsFilterResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { +func (r *DashboardFilterResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) } // Schema returns the resource schema. -func (r *DashboardsFilterResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *DashboardFilterResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ MarkdownDescription: "Get dashboard filter.", Attributes: map[string]schema.Attribute{ diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource_acceptance_test.go similarity index 86% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource_acceptance_test.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource_acceptance_test.go index 2e1662a3..f09c0612 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/resource_acceptance_test.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter_test +package dashboard_filter_test import ( "os" @@ -14,15 +14,15 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance" "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/check" "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/destroy" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter" + "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter" ) // The resource under test, and the helper that asks the API whether it is really there. -const address = "thousandeyes_dashboards_filter.test" +const address = "thousandeyes_dashboard_filter.test" -var testResource = dashboards_filter.DashboardsFilterTestResource{} +var testResource = dashboard_filter.DashboardFilterTestResource{} -// TestAccResourceDashboardsFilter_01_Lifecycle exercises the whole lifecycle against a live API. +// TestAccResourceDashboardFilter_01_Lifecycle exercises the whole lifecycle against a live API. // // Guarded by TF_ACC, which terraform-plugin-testing requires, so `go test ./...` never reaches a // live tenant by accident. The credential comes from the environment; see internal/acceptance. @@ -31,7 +31,7 @@ var testResource = dashboards_filter.DashboardsFilterTestResource{} // is not empty. That is the single strongest signal available that state mapping is right: an // attribute the provider stores differently from how the API reports it shows up here as a diff on // a resource nobody touched, and no amount of compiling or schema checking can see it. -func TestAccResourceDashboardsFilter_01_Lifecycle(t *testing.T) { +func TestAccResourceDashboardFilter_01_Lifecycle(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, ProtoV6ProviderFactories: acceptance.ProtoV6ProviderFactories, @@ -41,7 +41,7 @@ func TestAccResourceDashboardsFilter_01_Lifecycle(t *testing.T) { // // The wait is the built-in default; this API's consistency after delete was never measured, // so this is a budget rather than an observation - CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_dashboards_filter", 20*time.Second), + CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_dashboard_filter", 20*time.Second), Steps: []resource.TestStep{ // Create, from the smallest configuration the schema permits. { diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/state.go similarity index 66% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/state.go index 08aebec1..40f6f5f1 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/state.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "context" @@ -19,7 +19,7 @@ import ( // This function replaces what a reflection-based provider does at runtime. Being // generated code, a field whose conversion is wrong is a compile error rather // than a surprise during apply. -func mapRemoteStateToTerraform(ctx context.Context, data *DashboardsFilterResourceModel, remote *dashboards_filters.ApiContextFilterResponse) diag.Diagnostics { +func mapRemoteStateToTerraform(ctx context.Context, data *DashboardFilterResourceModel, remote *dashboards_filters.ApiContextFilterResponse) diag.Diagnostics { var ( diags diag.Diagnostics d diag.Diagnostics @@ -27,31 +27,31 @@ func mapRemoteStateToTerraform(ctx context.Context, data *DashboardsFilterResour if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } data.AID = convert.StringToFramework(remote.AID) - data.Context, d = flattenDashboardsFilterApiContextFilterses(ctx, remote.Context) + data.Context, d = flattenDashboardFilterApiContextFilterses(ctx, remote.Context) diags.Append(d...) - data.CreatedBy, d = flattenDashboardsFilterApiDashboardFilterUserDetails(ctx, remote.CreatedBy) + data.CreatedBy, d = flattenDashboardFilterApiDashboardFilterUserDetails(ctx, remote.CreatedBy) diags.Append(d...) data.CreatedDate = convert.PtrStringToFramework(remote.CreatedDate) data.Description = convert.EnumToFramework[dashboards_filters.ApiDashboardFilterDescription](remote.Description) data.ID = convert.StringToFramework(remote.ID) - data.ModifiedBy, d = flattenDashboardsFilterApiDashboardFilterUserDetails2(ctx, remote.ModifiedBy) + data.ModifiedBy, d = flattenDashboardFilterApiDashboardFilterUserDetails2(ctx, remote.ModifiedBy) diags.Append(d...) data.ModifiedDate = convert.PtrStringToFramework(remote.ModifiedDate) data.Name = convert.EnumToFramework[dashboards_filters.ApiDashboardFilterName](remote.Name) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } -// flattenDashboardsFilterApiContextFilterses converts SDK structs into the framework value state holds. -func flattenDashboardsFilterApiContextFilterses(ctx context.Context, in []dashboards_filters.ApiDataSourceFilters) (types.Set, diag.Diagnostics) { +// flattenDashboardFilterApiContextFilterses converts SDK structs into the framework value state holds. +func flattenDashboardFilterApiContextFilterses(ctx context.Context, in []dashboards_filters.ApiDataSourceFilters) (types.Set, diag.Diagnostics) { var diags diag.Diagnostics var d diag.Diagnostics @@ -61,12 +61,12 @@ func flattenDashboardsFilterApiContextFilterses(ctx context.Context, in []dashbo return types.SetNull(dashboardsFilterApiContextFiltersObjectType), diags } - models := make([]DashboardsFilterApiContextFiltersModel, 0, len(in)) + models := make([]DashboardFilterApiContextFiltersModel, 0, len(in)) for _, item := range in { - var m DashboardsFilterApiContextFiltersModel + var m DashboardFilterApiContextFiltersModel m.DataSourceID = convert.StringToFramework(item.DataSourceID) - m.Filters, d = flattenDashboardsFilterApiDataSourceFilters(ctx, item.Filters) + m.Filters, d = flattenDashboardFilterApiDataSourceFilters(ctx, item.Filters) diags.Append(d...) models = append(models, m) } @@ -77,8 +77,8 @@ func flattenDashboardsFilterApiContextFilterses(ctx context.Context, in []dashbo return out, diags } -// flattenDashboardsFilterApiDataSourceFilters converts SDK structs into the framework value state holds. -func flattenDashboardsFilterApiDataSourceFilters(ctx context.Context, in []dashboards_filters.ApiDataSourceFilter) (types.Set, diag.Diagnostics) { +// flattenDashboardFilterApiDataSourceFilters converts SDK structs into the framework value state holds. +func flattenDashboardFilterApiDataSourceFilters(ctx context.Context, in []dashboards_filters.ApiDataSourceFilter) (types.Set, diag.Diagnostics) { var diags diag.Diagnostics var d diag.Diagnostics @@ -88,9 +88,9 @@ func flattenDashboardsFilterApiDataSourceFilters(ctx context.Context, in []dashb return types.SetNull(dashboardsFilterApiDataSourceFilterObjectType), diags } - models := make([]DashboardsFilterApiDataSourceFilterModel, 0, len(in)) + models := make([]DashboardFilterApiDataSourceFilterModel, 0, len(in)) for _, item := range in { - var m DashboardsFilterApiDataSourceFilterModel + var m DashboardFilterApiDataSourceFilterModel m.FilterID = convert.StringToFramework(item.FilterID) m.MetricIDs, d = convert.StringSliceToFrameworkSet(ctx, item.MetricIds) @@ -106,8 +106,8 @@ func flattenDashboardsFilterApiDataSourceFilters(ctx context.Context, in []dashb return out, diags } -// flattenDashboardsFilterApiDashboardFilterUserDetails converts SDK structs into the framework value state holds. -func flattenDashboardsFilterApiDashboardFilterUserDetails(ctx context.Context, in *dashboards_filters.ApiDashboardFilterUserDetails) (types.Object, diag.Diagnostics) { +// flattenDashboardFilterApiDashboardFilterUserDetails converts SDK structs into the framework value state holds. +func flattenDashboardFilterApiDashboardFilterUserDetails(ctx context.Context, in *dashboards_filters.ApiDashboardFilterUserDetails) (types.Object, diag.Diagnostics) { var diags diag.Diagnostics if in == nil { @@ -116,7 +116,7 @@ func flattenDashboardsFilterApiDashboardFilterUserDetails(ctx context.Context, i item := *in - var m DashboardsFilterApiDashboardFilterUserDetailsModel + var m DashboardFilterApiDashboardFilterUserDetailsModel m.Name = convert.PtrStringToFramework(item.Name) m.Uid = convert.PtrStringToFramework(item.Uid) @@ -127,8 +127,8 @@ func flattenDashboardsFilterApiDashboardFilterUserDetails(ctx context.Context, i return out, diags } -// flattenDashboardsFilterApiDashboardFilterUserDetails2 converts SDK structs into the framework value state holds. -func flattenDashboardsFilterApiDashboardFilterUserDetails2(ctx context.Context, in *dashboards_filters.ApiDashboardFilterUserDetails) (types.Object, diag.Diagnostics) { +// flattenDashboardFilterApiDashboardFilterUserDetails2 converts SDK structs into the framework value state holds. +func flattenDashboardFilterApiDashboardFilterUserDetails2(ctx context.Context, in *dashboards_filters.ApiDashboardFilterUserDetails) (types.Object, diag.Diagnostics) { var diags diag.Diagnostics if in == nil { @@ -137,7 +137,7 @@ func flattenDashboardsFilterApiDashboardFilterUserDetails2(ctx context.Context, item := *in - var m DashboardsFilterApiDashboardFilterUserDetailsModel2 + var m DashboardFilterApiDashboardFilterUserDetailsModel2 m.Name = convert.PtrStringToFramework(item.Name) m.Uid = convert.PtrStringToFramework(item.Uid) diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/test_helper_test.go similarity index 76% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/test_helper_test.go rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/test_helper_test.go index ccc7d331..360d59fa 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/test_helper_test.go @@ -1,7 +1,7 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. -package dashboards_filter +package dashboard_filter import ( "context" @@ -12,19 +12,19 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists" ) -// DashboardsFilterTestResource answers whether a thousandeyes_dashboards_filter is really in the API. +// DashboardFilterTestResource answers whether a thousandeyes_dashboard_filter is really in the API. // // In a _test.go file rather than an ordinary one, so no test scaffolding reaches a built // provider. An external _test package still sees the exported identifiers of a package's own // test files, which is what lets the generated acceptance test refer to this. -type DashboardsFilterTestResource struct{} +type DashboardFilterTestResource struct{} // Exists reads the object back through the same operation the resource's Read uses. // // Deliberately the same call rather than an equivalent one. A check that asked a list endpoint // instead could report an object present while the read the provider actually depends on was // broken, which is the failure an acceptance test exists to catch. -func (DashboardsFilterTestResource) Exists( +func (DashboardFilterTestResource) Exists( ctx context.Context, state *terraform.InstanceState, ) (*bool, error) { diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/maximal.tf similarity index 81% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/maximal.tf index bb601633..be35f59f 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. @@ -10,7 +10,7 @@ # something only a human knows, recorded behaviour for everything the probe observed. What # could not be derived is listed inside the block, each with the reason. -resource "thousandeyes_dashboards_filter" "test" { +resource "thousandeyes_dashboard_filter" "test" { # Where a value came from. # # context: curated in the blueprint's accFixture; the generator cannot derive it diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/minimal.tf similarity index 81% rename from pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf rename to pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/minimal.tf index d782a41b..43650134 100644 --- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboard_filter/testdata/minimal.tf @@ -1,12 +1,12 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # # Regenerated, so it follows the schema. If the API starts requiring a field, this file gains it # on the next emit rather than an acceptance run discovering it. -resource "thousandeyes_dashboards_filter" "test" { +resource "thousandeyes_dashboard_filter" "test" { # Where a value came from. A fixture takes what the API was observed to accept, not the first # value the specification documents -- which is the opposite of how a generated validator is # built. A validator errs toward permitting, because blocking a configuration the API would diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go index b955ab09..9ac98381 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsDNSServerResourceModel) ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &dns_server_tests.DnsServerTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go index 37d0a515..5b969be1 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server @@ -25,7 +25,7 @@ func (r *TestsDNSServerResource) Create(ctx context.Context, req resource.Create return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsDNSServerResource) Create(ctx context.Context, req resource.Create created, _, err := r.client.API.DNSServerTests.CreateDnsServerTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsDNSServerResource) Read(ctx context.Context, req resource.ReadRequ return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsDNSServerResource) Read(ctx context.Context, req resource.ReadRequ // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsDNSServerResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsDNSServerResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsDNSServerResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsDNSServerResource) Update(ctx context.Context, req resource.Update return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsDNSServerResource) Update(ctx context.Context, req resource.Update _, _, err := r.client.API.DNSServerTests.UpdateDnsServerTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsDNSServerResource) Delete(ctx context.Context, req resource.Delete return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsDNSServerResource) Delete(ctx context.Context, req resource.Delete if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go index fac66ce8..ba80e6df 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go index 6a547a53..6d1a17c7 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server @@ -22,8 +22,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_dns_server" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_dns_server" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -53,12 +53,12 @@ type TestsDNSServerResource struct { // Metadata returns the resource type name. func (r *TestsDNSServerResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsDNSServerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go index 8a26bca4..b8d188f9 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server_test diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go index d54c57ab..ee1754cd 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsDNSServerResourceModel, remote *dns_server_tests.DnsServerTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -54,5 +54,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsDNSServerResource data.Type = convert.PtrStringToFramework(remote.Type) data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go index 35fafcea..9d45cc21 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_server diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf index 2f32e1db..3b529668 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf index 30e00885..b5804ab9 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go index fbb04cfa..cf2074bd 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsDNSTraceResourceModel) (* diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &dns_trace_tests.DnsTraceTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go index ca7e0bb1..6ad50016 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace @@ -25,7 +25,7 @@ func (r *TestsDNSTraceResource) Create(ctx context.Context, req resource.CreateR return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsDNSTraceResource) Create(ctx context.Context, req resource.CreateR created, _, err := r.client.API.DNSTraceTests.CreateDnsTraceTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsDNSTraceResource) Read(ctx context.Context, req resource.ReadReque return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsDNSTraceResource) Read(ctx context.Context, req resource.ReadReque // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsDNSTraceResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsDNSTraceResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsDNSTraceResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsDNSTraceResource) Update(ctx context.Context, req resource.UpdateR return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsDNSTraceResource) Update(ctx context.Context, req resource.UpdateR _, _, err := r.client.API.DNSTraceTests.UpdateDnsTraceTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsDNSTraceResource) Delete(ctx context.Context, req resource.DeleteR return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsDNSTraceResource) Delete(ctx context.Context, req resource.DeleteR if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go index 159ab82e..3ba8d094 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go index fbbf2605..59c1ce18 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace @@ -20,8 +20,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_dns_trace" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_dns_trace" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -51,12 +51,12 @@ type TestsDNSTraceResource struct { // Metadata returns the resource type name. func (r *TestsDNSTraceResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsDNSTraceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go index 3334a6a8..1110a413 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace_test diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go index 8d0d0919..0f9e19c9 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsDNSTraceResourceModel, remote *dns_trace_tests.DnsTraceTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -42,5 +42,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsDNSTraceResourceM data.TestName = convert.PtrStringToFramework(remote.TestName) data.Type = convert.PtrStringToFramework(remote.Type) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go index 9146b5cb..84ba6d7f 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dns_trace diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf index ec682470..0725f176 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf index 5e717f1e..7dc6f2a7 100644 --- a/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go index b51f1909..8c9d86ad 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -18,12 +18,12 @@ import ( // // Only writable attributes appear here. A computed attribute has no expand // conversion, so it cannot be sent by construction rather than by discipline. -func constructResource(ctx context.Context, data *TestsDnssecResourceModel) (*dnssec_tests.DnsSecTestRequest, diag.Diagnostics) { +func constructResource(ctx context.Context, data *TestsDNSSECResourceModel) (*dnssec_tests.DnsSecTestRequest, diag.Diagnostics) { var ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &dnssec_tests.DnsSecTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go index 62fade39..fdd5f881 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -17,15 +17,15 @@ import ( ) // Create provisions a new thousandeyes_tests_dnssec. -func (r *TestsDnssecResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { - var plan TestsDnssecResourceModel +func (r *TestsDNSSECResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan TestsDNSSECResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsDnssecResource) Create(ctx context.Context, req resource.CreateReq created, _, err := r.client.API.DNSSECTests.CreateDnsSecTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -63,15 +63,15 @@ func (r *TestsDnssecResource) Create(ctx context.Context, req resource.CreateReq } // Read refreshes thousandeyes_tests_dnssec state from the API. -func (r *TestsDnssecResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { - var state TestsDnssecResourceModel +func (r *TestsDNSSECResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state TestsDNSSECResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsDnssecResource) Read(ctx context.Context, req resource.ReadRequest // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -107,9 +107,9 @@ func (r *TestsDnssecResource) Read(ctx context.Context, req resource.ReadRequest // The bool distinguishes "not there" from "the request failed", which need different // handling and used to be conflated: Read turns absence into a recreate, while a read // after a write treats it as not-yet-consistent and tries again. -func (r *TestsDnssecResource) readState( +func (r *TestsDNSSECResource) readState( ctx context.Context, - state *TestsDnssecResourceModel, + state *TestsDNSSECResourceModel, op errors.Operation, ) (bool, diag.Diagnostics) { var diags diag.Diagnostics @@ -120,7 +120,7 @@ func (r *TestsDnssecResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -144,9 +144,9 @@ func (r *TestsDnssecResource) readState( // The budget is the built-in default: this API's consistency has not been measured, so // there is no observation to size it from. An API that is consistent succeeds on the first // attempt and pays nothing for the loop. -func (r *TestsDnssecResource) readAfterWrite( +func (r *TestsDNSSECResource) readAfterWrite( ctx context.Context, - state *TestsDnssecResourceModel, + state *TestsDNSSECResourceModel, op errors.Operation, ) diag.Diagnostics { var diags diag.Diagnostics @@ -154,7 +154,7 @@ func (r *TestsDnssecResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,15 +172,15 @@ func (r *TestsDnssecResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags } // Update applies configuration changes to an existing thousandeyes_tests_dnssec. -func (r *TestsDnssecResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - var plan, state TestsDnssecResourceModel +func (r *TestsDNSSECResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan, state TestsDNSSECResourceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) resp.Diagnostics.Append(req.State.Get(ctx, &state)...) @@ -188,7 +188,7 @@ func (r *TestsDnssecResource) Update(ctx context.Context, req resource.UpdateReq return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsDnssecResource) Update(ctx context.Context, req resource.UpdateReq _, _, err := r.client.API.DNSSECTests.UpdateDnsSecTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -222,15 +222,15 @@ func (r *TestsDnssecResource) Update(ctx context.Context, req resource.UpdateReq } // Delete removes a thousandeyes_tests_dnssec. -func (r *TestsDnssecResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { - var state TestsDnssecResourceModel +func (r *TestsDNSSECResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var state TestsDNSSECResourceModel resp.Diagnostics.Append(req.State.Get(ctx, &state)...) if resp.Diagnostics.HasError() { return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsDnssecResource) Delete(ctx context.Context, req resource.DeleteReq if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go index 8bda9230..3416e92a 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -9,10 +9,10 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" ) -// TestsDnssecResourceModel is the Terraform state for a thousandeyes_tests_dnssec. +// TestsDNSSECResourceModel is the Terraform state for a thousandeyes_tests_dnssec. // // Field order follows the schema, and the timeouts value is last. -type TestsDnssecResourceModel struct { +type TestsDNSSECResourceModel struct { AlertsEnabled types.Bool `tfsdk:"alerts_enabled"` CreatedBy types.String `tfsdk:"created_by"` CreatedDate types.String `tfsdk:"created_date"` diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go index 2b14a090..e3b052f6 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -20,8 +20,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_dnssec" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_dnssec" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -34,38 +34,38 @@ const ( // Compile-time assertions that this resource implements what it claims to. They // turn a missing method into a build failure rather than a runtime surprise. var ( - _ resource.Resource = (*TestsDnssecResource)(nil) - _ resource.ResourceWithConfigure = (*TestsDnssecResource)(nil) - _ resource.ResourceWithImportState = (*TestsDnssecResource)(nil) + _ resource.Resource = (*TestsDNSSECResource)(nil) + _ resource.ResourceWithConfigure = (*TestsDNSSECResource)(nil) + _ resource.ResourceWithImportState = (*TestsDNSSECResource)(nil) ) -// NewTestsDnssecResource returns the thousandeyes_tests_dnssec resource. -func NewTestsDnssecResource() resource.Resource { - return &TestsDnssecResource{} +// NewTestsDNSSECResource returns the thousandeyes_tests_dnssec resource. +func NewTestsDNSSECResource() resource.Resource { + return &TestsDNSSECResource{} } -// TestsDnssecResource implements the thousandeyes_tests_dnssec resource. -type TestsDnssecResource struct { +// TestsDNSSECResource implements the thousandeyes_tests_dnssec resource. +type TestsDNSSECResource struct { client *thousandeyes.Client } // Metadata returns the resource type name. -func (r *TestsDnssecResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName +func (r *TestsDNSSECResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. -func (r *TestsDnssecResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) +func (r *TestsDNSSECResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. -func (r *TestsDnssecResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { +func (r *TestsDNSSECResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) } // Schema returns the resource schema. -func (r *TestsDnssecResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *TestsDNSSECResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ MarkdownDescription: "Get DNSSEC test.", Attributes: map[string]schema.Attribute{ diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go index 1ffdac1e..39dc521a 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec_test @@ -20,9 +20,9 @@ import ( // The resource under test, and the helper that asks the API whether it is really there. const address = "thousandeyes_tests_dnssec.test" -var testResource = tests_dnssec.TestsDnssecTestResource{} +var testResource = tests_dnssec.TestsDNSSECTestResource{} -// TestAccResourceTestsDnssec_01_Lifecycle exercises the whole lifecycle against a live API. +// TestAccResourceTestsDNSSEC_01_Lifecycle exercises the whole lifecycle against a live API. // // Guarded by TF_ACC, which terraform-plugin-testing requires, so `go test ./...` never reaches a // live tenant by accident. The credential comes from the environment; see internal/acceptance. @@ -31,7 +31,7 @@ var testResource = tests_dnssec.TestsDnssecTestResource{} // is not empty. That is the single strongest signal available that state mapping is right: an // attribute the provider stores differently from how the API reports it shows up here as a diff on // a resource nobody touched, and no amount of compiling or schema checking can see it. -func TestAccResourceTestsDnssec_01_Lifecycle(t *testing.T) { +func TestAccResourceTestsDNSSEC_01_Lifecycle(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, ProtoV6ProviderFactories: acceptance.ProtoV6ProviderFactories, diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go index c7c578fe..9cb54e26 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -17,10 +17,10 @@ import ( // This function replaces what a reflection-based provider does at runtime. Being // generated code, a field whose conversion is wrong is a compile error rather // than a surprise during apply. -func mapRemoteStateToTerraform(ctx context.Context, data *TestsDnssecResourceModel, remote *dnssec_tests.DnsSecTestResponse) { +func mapRemoteStateToTerraform(ctx context.Context, data *TestsDNSSECResourceModel, remote *dnssec_tests.DnsSecTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -41,5 +41,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsDnssecResourceMod data.TestName = convert.PtrStringToFramework(remote.TestName) data.Type = convert.PtrStringToFramework(remote.Type) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go index 7a2f7a4c..86c8ad29 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_dnssec @@ -12,19 +12,19 @@ import ( "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists" ) -// TestsDnssecTestResource answers whether a thousandeyes_tests_dnssec is really in the API. +// TestsDNSSECTestResource answers whether a thousandeyes_tests_dnssec is really in the API. // // In a _test.go file rather than an ordinary one, so no test scaffolding reaches a built // provider. An external _test package still sees the exported identifiers of a package's own // test files, which is what lets the generated acceptance test refer to this. -type TestsDnssecTestResource struct{} +type TestsDNSSECTestResource struct{} // Exists reads the object back through the same operation the resource's Read uses. // // Deliberately the same call rather than an equivalent one. A check that asked a list endpoint // instead could report an object present while the read the provider actually depends on was // broken, which is the failure an acceptance test exists to catch. -func (TestsDnssecTestResource) Exists( +func (TestsDNSSECTestResource) Exists( ctx context.Context, state *terraform.InstanceState, ) (*bool, error) { diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf index da834767..d1ab4ec5 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf index e5c82b43..039187f5 100644 --- a/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/construct.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/construct.go index 4ef3513c..1c75a374 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/construct.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *EndpointLabelResourceModel) (* diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &endpoint_agent_labels.LabelRequest{} @@ -47,7 +47,7 @@ func constructResourceUpdate(ctx context.Context, data *EndpointLabelResourceMod diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing update request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing update request body", map[string]any{"resource": TypeName}) body := &endpoint_agent_labels.Label{} diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/crud.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/crud.go index db167e4e..8f711c00 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/crud.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label @@ -27,7 +27,7 @@ func (r *EndpointLabelResource) Create(ctx context.Context, req resource.CreateR return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -43,7 +43,7 @@ func (r *EndpointLabelResource) Create(ctx context.Context, req resource.CreateR created, _, err := r.client.API.EndpointAgentLabels.CreateEndpointLabel(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -73,7 +73,7 @@ func (r *EndpointLabelResource) Read(ctx context.Context, req resource.ReadReque return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -92,7 +92,7 @@ func (r *EndpointLabelResource) Read(ctx context.Context, req resource.ReadReque // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -122,7 +122,7 @@ func (r *EndpointLabelResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -156,7 +156,7 @@ func (r *EndpointLabelResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -174,7 +174,7 @@ func (r *EndpointLabelResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -190,7 +190,7 @@ func (r *EndpointLabelResource) Update(ctx context.Context, req resource.UpdateR return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -206,7 +206,7 @@ func (r *EndpointLabelResource) Update(ctx context.Context, req resource.UpdateR _, _, err := r.client.API.EndpointAgentLabels.UpdateEndpointLabel(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -232,7 +232,7 @@ func (r *EndpointLabelResource) Delete(ctx context.Context, req resource.DeleteR return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -247,7 +247,7 @@ func (r *EndpointLabelResource) Delete(ctx context.Context, req resource.DeleteR if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/model.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/model.go index 18026dd2..7f55a49d 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/model.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource.go index 3b5d5e9e..f009a101 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_endpoint_label" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_endpoint_label" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type EndpointLabelResource struct { // Metadata returns the resource type name. func (r *EndpointLabelResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *EndpointLabelResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource_acceptance_test.go index cf137d2a..11c37979 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label_test diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/state.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/state.go index f8f7155a..ee03e4bc 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/state.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *EndpointLabelResourceM if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -39,7 +39,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *EndpointLabelResourceM data.MatchType = convert.EnumToFramework(remote.MatchType) data.Name = convert.PtrStringToFramework(remote.Name) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/test_helper_test.go index ea4a7ee0..30d153eb 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package endpoint_label diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/maximal.tf index 8f3d5a98..ec2d06b2 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/minimal.tf index 0647d949..74b88738 100644 --- a/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/endpoint_agent_labels/v7/endpoint_label/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go index 8a21776d..e602a23a 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsFTPServerResourceModel) ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &ftp_server_tests.FtpServerTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go index 8cd0f206..920f7114 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server @@ -25,7 +25,7 @@ func (r *TestsFTPServerResource) Create(ctx context.Context, req resource.Create return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsFTPServerResource) Create(ctx context.Context, req resource.Create created, _, err := r.client.API.FTPServerTests.CreateFtpServerTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsFTPServerResource) Read(ctx context.Context, req resource.ReadRequ return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsFTPServerResource) Read(ctx context.Context, req resource.ReadRequ // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsFTPServerResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsFTPServerResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsFTPServerResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsFTPServerResource) Update(ctx context.Context, req resource.Update return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsFTPServerResource) Update(ctx context.Context, req resource.Update _, _, err := r.client.API.FTPServerTests.UpdateFtpServerTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsFTPServerResource) Delete(ctx context.Context, req resource.Delete return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsFTPServerResource) Delete(ctx context.Context, req resource.Delete if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go index 7150eff8..0292b03d 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go index 09361b7b..73e4d182 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_ftp_server" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_ftp_server" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type TestsFTPServerResource struct { // Metadata returns the resource type name. func (r *TestsFTPServerResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsFTPServerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go index 53f8a170..280c991e 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server_test diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go index f814cc0a..a20897e6 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server @@ -21,7 +21,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsFTPServerResourceModel, remote *ftp_server_tests.FtpServerTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -77,5 +77,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsFTPServerResource data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) data.Username = convert.EnumToFramework(remote.Username) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go index 5cb097b7..92277332 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_ftp_server diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf index 2e0c3be0..25323103 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf index 4eda12a0..1e42001f 100644 --- a/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/construct.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/construct.go index 5a56dfe0..b188043c 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/construct.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsHTTPServerResourceModel) diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &http_server_tests.HttpServerTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/crud.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/crud.go index 37be8d97..41c5d758 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/crud.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server @@ -25,7 +25,7 @@ func (r *TestsHTTPServerResource) Create(ctx context.Context, req resource.Creat return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsHTTPServerResource) Create(ctx context.Context, req resource.Creat created, _, err := r.client.API.HTTPServerTests.CreateHttpServerTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsHTTPServerResource) Read(ctx context.Context, req resource.ReadReq return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsHTTPServerResource) Read(ctx context.Context, req resource.ReadReq // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsHTTPServerResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsHTTPServerResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsHTTPServerResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsHTTPServerResource) Update(ctx context.Context, req resource.Updat return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsHTTPServerResource) Update(ctx context.Context, req resource.Updat _, _, err := r.client.API.HTTPServerTests.UpdateHttpServerTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsHTTPServerResource) Delete(ctx context.Context, req resource.Delet return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsHTTPServerResource) Delete(ctx context.Context, req resource.Delet if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/model.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/model.go index 413533f4..5b97f46c 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/model.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource.go index c42ea1e3..4ca2e840 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server @@ -22,8 +22,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_http_server" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_http_server" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -53,12 +53,12 @@ type TestsHTTPServerResource struct { // Metadata returns the resource type name. func (r *TestsHTTPServerResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsHTTPServerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go index adb75304..1884569a 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server_test diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/state.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/state.go index 3633c9af..b6897105 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/state.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsHTTPServerResourc if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -141,7 +141,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsHTTPServerResourc diags.Append(d...) data.VerifyCertificate = convert.NamedBoolToFramework(remote.VerifyCertificate) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go index 9739c4eb..54c3f10d 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_http_server diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf index 71c9f5d9..78a4168b 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf index 59499582..3558aa97 100644 --- a/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/construct.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/construct.go index fca05a3c..59ccf301 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/construct.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsPageLoadResourceModel) (* diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &page_load_tests.PageLoadTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/crud.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/crud.go index 46953435..0b1ee217 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/crud.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load @@ -25,7 +25,7 @@ func (r *TestsPageLoadResource) Create(ctx context.Context, req resource.CreateR return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsPageLoadResource) Create(ctx context.Context, req resource.CreateR created, _, err := r.client.API.PageLoadTests.CreatePageLoadTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsPageLoadResource) Read(ctx context.Context, req resource.ReadReque return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsPageLoadResource) Read(ctx context.Context, req resource.ReadReque // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsPageLoadResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsPageLoadResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsPageLoadResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsPageLoadResource) Update(ctx context.Context, req resource.UpdateR return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsPageLoadResource) Update(ctx context.Context, req resource.UpdateR _, _, err := r.client.API.PageLoadTests.UpdatePageLoadTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsPageLoadResource) Delete(ctx context.Context, req resource.DeleteR return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsPageLoadResource) Delete(ctx context.Context, req resource.DeleteR if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/model.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/model.go index 0a30fbc4..ca074218 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/model.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource.go index 78fcfce3..45e87d96 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_page_load" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_page_load" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type TestsPageLoadResource struct { // Metadata returns the resource type name. func (r *TestsPageLoadResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsPageLoadResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go index a0022075..f21cd6e1 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load_test diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/state.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/state.go index 2ef2a6e5..480b9731 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/state.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsPageLoadResourceM if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -94,7 +94,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsPageLoadResourceM diags.Append(d...) data.VerifyCertificate = convert.NamedBoolToFramework(remote.VerifyCertificate) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go index defbd0e3..00c3b58b 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_page_load diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf index 5283959e..bbea4fd9 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf index 8fc2ddde..3ce018bf 100644 --- a/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/construct.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/construct.go index 735c3a0e..f2896c4e 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/construct.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role @@ -22,7 +22,7 @@ func constructResource(ctx context.Context, data *RoleResourceModel) (*roles.Rol diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &roles.RoleRequestBody{} diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go index 62fac83a..32f8b644 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role @@ -25,7 +25,7 @@ func (r *RoleResource) Create(ctx context.Context, req resource.CreateRequest, r return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *RoleResource) Create(ctx context.Context, req resource.CreateRequest, r created, _, err := r.client.API.Roles.CreateRole(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *RoleResource) Read(ctx context.Context, req resource.ReadRequest, resp return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *RoleResource) Read(ctx context.Context, req resource.ReadRequest, resp // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *RoleResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *RoleResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *RoleResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *RoleResource) Update(ctx context.Context, req resource.UpdateRequest, r return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *RoleResource) Update(ctx context.Context, req resource.UpdateRequest, r _, _, err := r.client.API.Roles.UpdateRole(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *RoleResource) Delete(ctx context.Context, req resource.DeleteRequest, r return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *RoleResource) Delete(ctx context.Context, req resource.DeleteRequest, r if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go index 6f56de07..c2526284 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go index 98abdca0..bc105356 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role @@ -19,8 +19,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_role" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_role" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -50,12 +50,12 @@ type RoleResource struct { // Metadata returns the resource type name. func (r *RoleResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *RoleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource_acceptance_test.go index de48837e..9f6869b5 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role_test diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go index 152ffa16..a0842abc 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *RoleResourceModel, remote *roles.RoleDetail) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -29,5 +29,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *RoleResourceModel, rem data.Name = convert.PtrStringToFramework(remote.Name) data.ID = convert.PtrStringToFramework(remote.RoleID) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/test_helper_test.go index c1311610..361ceb2c 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package role diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/maximal.tf index a8b77ed8..72ef85de 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/minimal.tf index af9a52a8..2a2dd695 100644 --- a/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go index fa37327a..9dd88d53 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsSIPServerResourceModel) ( diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &sip_server_tests.SipServerTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go index c46a762a..a48be611 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server @@ -25,7 +25,7 @@ func (r *TestsSIPServerResource) Create(ctx context.Context, req resource.Create return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsSIPServerResource) Create(ctx context.Context, req resource.Create created, _, err := r.client.API.SIPServerTests.CreateSipServerTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsSIPServerResource) Read(ctx context.Context, req resource.ReadRequ return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsSIPServerResource) Read(ctx context.Context, req resource.ReadRequ // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsSIPServerResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsSIPServerResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsSIPServerResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsSIPServerResource) Update(ctx context.Context, req resource.Update return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsSIPServerResource) Update(ctx context.Context, req resource.Update _, _, err := r.client.API.SIPServerTests.UpdateSipServerTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsSIPServerResource) Delete(ctx context.Context, req resource.Delete return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsSIPServerResource) Delete(ctx context.Context, req resource.Delete if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go index f85999f1..f00dee9f 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go index b68fbde6..e3e62889 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_sip_server" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_sip_server" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type TestsSIPServerResource struct { // Metadata returns the resource type name. func (r *TestsSIPServerResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsSIPServerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go index b1aa5fce..3bf1b3fe 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server_test diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go index 8589e86e..69ec47d0 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsSIPServerResourceModel, remote *sip_server_tests.SipServerTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -59,5 +59,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsSIPServerResource data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) data.User = convert.EnumToFramework(remote.User) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go index 08039219..cf30a470 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_sip_server diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf index 3fe756b1..3afd841d 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf index ecb87090..e18d5f7d 100644 --- a/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/conditional_validators.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/conditional_validators.go index faf58f7c..4084c867 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/conditional_validators.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/conditional_validators.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/construct.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/construct.go index 208c9e38..158aaca9 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/construct.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TagResourceModel) (*tags.TagIn diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &tags.TagInfo{} diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/crud.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/crud.go index 6dea6142..6dbea641 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/crud.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -25,7 +25,7 @@ func (r *TagResource) Create(ctx context.Context, req resource.CreateRequest, re return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TagResource) Create(ctx context.Context, req resource.CreateRequest, re created, _, err := r.client.API.Tags.CreateTag(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -79,7 +79,7 @@ func (r *TagResource) Read(ctx context.Context, req resource.ReadRequest, resp * return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -98,7 +98,7 @@ func (r *TagResource) Read(ctx context.Context, req resource.ReadRequest, resp * // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -136,7 +136,7 @@ func (r *TagResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -170,7 +170,7 @@ func (r *TagResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -196,7 +196,7 @@ func (r *TagResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -212,7 +212,7 @@ func (r *TagResource) Update(ctx context.Context, req resource.UpdateRequest, re return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -228,7 +228,7 @@ func (r *TagResource) Update(ctx context.Context, req resource.UpdateRequest, re _, _, err := r.client.API.Tags.UpdateTag(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -262,7 +262,7 @@ func (r *TagResource) Delete(ctx context.Context, req resource.DeleteRequest, re return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -277,7 +277,7 @@ func (r *TagResource) Delete(ctx context.Context, req resource.DeleteRequest, re if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_acceptance_test.go index 4ba8ddde..52174563 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag_test diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_resource.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_resource.go index 8d43e5b6..e923775c 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_resource.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/list_resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -44,20 +44,20 @@ type TagListResource struct { // // That equality is the entire linkage between a list resource and the resource it lists -- // there is no import from one to the other -- and the framework returns an error diagnostic -// from GetMetadata if they differ. Both read ResourceName for exactly that reason. +// from GetMetadata if they differ. Both read TypeName for exactly that reason. // // The request and response types are resource.* and not list.*. The framework declares them // that way so one implementation can satisfy both interfaces, and reaching for list.Metadata // here is the mistake that shape invites. func (l *TagListResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. // // resource.ConfigureRequest again, not a list-specific type. func (l *TagListResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - l.client = client.ForResource(ctx, req, resp, ResourceName) + l.client = client.ForResource(ctx, req, resp, TypeName) } // ListResourceConfigSchema returns the schema for a query block. @@ -78,7 +78,7 @@ func (l *TagListResource) ListResourceConfigSchema(_ context.Context, _ list.Lis // collection read already returned -- the element is the same SDK type the resource's own // read yields, so serving --include-resource costs no request per element. func (l *TagListResource) List(ctx context.Context, req list.ListRequest, stream *list.ListResultsStream) { - tflog.Debug(ctx, "listing resources", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "listing resources", map[string]any{"resource": TypeName}) // A nil client is a provider bug -- Configure must populate ListResourceData -- and // the failure mode without this guard is a segfault that kills the whole provider @@ -99,7 +99,7 @@ func (l *TagListResource) List(ctx context.Context, req list.ListRequest, stream remote, _, err := l.client.API.Tags.GetTags(ctx) if err != nil { var diags diag.Diagnostics - errors.Handle(&diags, ResourceName, errors.OpRead, err) + errors.Handle(&diags, TypeName, errors.OpRead, err) stream.Results = list.ListResultsStreamDiagnostics(diags) diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/model.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/model.go index fd6af59f..124392fc 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/model.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. // REF: https://developer.cisco.com/docs/thousandeyes/list-tags/ package tag diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/predicate.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/predicate.go index fdc68c79..fd97c23f 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/predicate.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/predicate.go @@ -34,7 +34,7 @@ import ( // touches on write. func readBackLanded(ctx context.Context, state *TagResourceModel) bool { tflog.Trace(ctx, "read-back predicate not implemented, accepting the first read", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return true diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource.go index c2049286..9832e156 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -22,8 +22,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tag" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tag" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -56,12 +56,12 @@ type TagResource struct { // Metadata returns the resource type name. func (r *TagResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TagResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource_acceptance_test.go index ef9a90cf..b231259a 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag_test diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/state.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/state.go index b82428b0..fef52c87 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/state.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagResourceModel, remo if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -58,7 +58,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TagResourceModel, remo data.Filters, d = flattenTagFilters(ctx, remote.Filters) diags.Append(d...) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/test_helper_test.go index 98ab466e..2cda8035 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tag diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/maximal.tf index 51b016a6..dd0b6695 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/minimal.tf index 87ee7802..f3bb2232 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/query.tf b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/query.tf index 386eae9e..2062a0de 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/query.tf +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/query.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The query configuration: one list block over the whole collection. The provider block # is explicit because the list block references it by symbol, unlike a resource step diff --git a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/replace.tf b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/replace.tf index 51d9bc88..451b3ead 100644 --- a/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/replace.tf +++ b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/testdata/replace.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/construct.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/construct.go index 218670ef..9536740e 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/construct.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *UserResourceModel) (*users.Use diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &users.UserRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go index 113f0292..1c6be612 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user @@ -25,7 +25,7 @@ func (r *UserResource) Create(ctx context.Context, req resource.CreateRequest, r return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *UserResource) Create(ctx context.Context, req resource.CreateRequest, r created, _, err := r.client.API.Users.CreateUser(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *UserResource) Read(ctx context.Context, req resource.ReadRequest, resp return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *UserResource) Read(ctx context.Context, req resource.ReadRequest, resp // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *UserResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *UserResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *UserResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *UserResource) Update(ctx context.Context, req resource.UpdateRequest, r return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *UserResource) Update(ctx context.Context, req resource.UpdateRequest, r _, _, err := r.client.API.Users.UpdateUser(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *UserResource) Delete(ctx context.Context, req resource.DeleteRequest, r return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *UserResource) Delete(ctx context.Context, req resource.DeleteRequest, r if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go index c1766ec1..4434dc84 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go index 64a8208b..a53e6153 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user @@ -19,8 +19,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_user" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_user" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -50,12 +50,12 @@ type UserResource struct { // Metadata returns the resource type name. func (r *UserResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *UserResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource_acceptance_test.go index 42813f2d..946495b0 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user_test diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go index a8aaaad0..aba81c72 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *UserResourceModel, remote *users.UserDetail) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -31,5 +31,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *UserResourceModel, rem data.Name = convert.PtrStringToFramework(remote.Name) data.ID = convert.PtrStringToFramework(remote.Uid) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/test_helper_test.go index 7ef91db1..21200a29 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package user diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/maximal.tf index 286815cc..fb5cdbf6 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/minimal.tf index e32ccdeb..11397a15 100644 --- a/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/construct.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/construct.go index 6c634cad..f85a4e03 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/construct.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsVoiceResourceModel) (*voi diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &voice_tests.VoiceTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/crud.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/crud.go index 3c154076..ff39dd81 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/crud.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice @@ -25,7 +25,7 @@ func (r *TestsVoiceResource) Create(ctx context.Context, req resource.CreateRequ return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsVoiceResource) Create(ctx context.Context, req resource.CreateRequ created, _, err := r.client.API.VoiceTests.CreateVoiceTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsVoiceResource) Read(ctx context.Context, req resource.ReadRequest, return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsVoiceResource) Read(ctx context.Context, req resource.ReadRequest, // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsVoiceResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsVoiceResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsVoiceResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsVoiceResource) Update(ctx context.Context, req resource.UpdateRequ return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsVoiceResource) Update(ctx context.Context, req resource.UpdateRequ _, _, err := r.client.API.VoiceTests.UpdateVoiceTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsVoiceResource) Delete(ctx context.Context, req resource.DeleteRequ return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsVoiceResource) Delete(ctx context.Context, req resource.DeleteRequ if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/model.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/model.go index d93a6ee5..135ac29b 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/model.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource.go index 0eb7febb..4922e15b 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice @@ -21,8 +21,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_voice" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_voice" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -52,12 +52,12 @@ type TestsVoiceResource struct { // Metadata returns the resource type name. func (r *TestsVoiceResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsVoiceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource_acceptance_test.go deleted file mode 100644 index e0edf880..00000000 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/resource_acceptance_test.go +++ /dev/null @@ -1,116 +0,0 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:3a39a25649423800e368a92f6e4267039ede78bbe19d20c0829fb5056f1e03b4). DO NOT EDIT. - -package tests_voice_test - -import ( - "os" - "path/filepath" - "testing" - "time" - - "github.com/hashicorp/terraform-plugin-testing/helper/resource" - - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/check" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/destroy" - "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice" -) - -// The resource under test, and the helper that asks the API whether it is really there. -const address = "thousandeyes_tests_voice.test" - -var testResource = tests_voice.TestsVoiceTestResource{} - -// TestAccResourceTestsVoice_01_Lifecycle exercises the whole lifecycle against a live API. -// -// Guarded by TF_ACC, which terraform-plugin-testing requires, so `go test ./...` never reaches a -// live tenant by accident. The credential comes from the environment; see internal/acceptance. -// -// Every step ends with an implicit plan, and terraform-plugin-testing fails the step if that plan -// is not empty. That is the single strongest signal available that state mapping is right: an -// attribute the provider stores differently from how the API reports it shows up here as a diff on -// a resource nobody touched, and no amount of compiling or schema checking can see it. -func TestAccResourceTestsVoice_01_Lifecycle(t *testing.T) { - // This resource needs more privilege than the ordinary credential carries, so the - // gate is its own variable: a run against a lesser token skips it by name here, - // stated, instead of failing red for a reason that is about the token. - if os.Getenv("TFPFGEN_ACC_ENTERPRISE") == "" { - t.Skipf("set TFPFGEN_ACC_ENTERPRISE to run this test; it needs a more privileged credential") - } - resource.Test(t, resource.TestCase{ - PreCheck: func() { acceptance.PreCheck(t) }, - ProtoV6ProviderFactories: acceptance.ProtoV6ProviderFactories, - // Destroy is verified against the API rather than against state, because Terraform - // considers a destroy done when the provider's Delete returns no error -- which is a - // statement about the request, not about the object. - // - // The wait is the built-in default; this API's consistency after delete was never measured, - // so this is a budget rather than an observation - CheckDestroy: destroy.CheckDestroyed(testResource, "thousandeyes_tests_voice", 20*time.Second), - Steps: []resource.TestStep{ - // Create, from the smallest configuration the schema permits. - { - Config: config(t, "minimal.tf"), - Check: resource.ComposeAggregateTestCheckFunc( - check.That(address).ExistsInAPI(testResource), - check.That(address).Key("id").Exists(), - check.That(address).Key("interval").Exists(), - check.That(address).Key("target_agent_id").HasValue("tfacc-target-agent-id"), - ), - }, - // Import, then compare every attribute against the state the apply produced. - // - // This is what catches a read that populates state differently from a create, which - // is the most common way a generated provider is subtly wrong. - { - ResourceName: address, - ImportState: true, - ImportStateVerify: true, - // Skipped, with the reason for each. An attribute the API never returns is - // absent after an import and present before it, so comparing it fails for a - // reason that has nothing to do with import being broken. - // agents: it is write-only, carried from configuration, which an import does not have - ImportStateVerifyIgnore: []string{"agents"}, - }, - // Update in place, to a configuration that sets the optional attributes too. - { - Config: config(t, "maximal.tf"), - Check: resource.ComposeAggregateTestCheckFunc( - check.That(address).ExistsInAPI(testResource), - check.That(address).Key("id").Exists(), - check.That(address).Key("alerts_enabled").HasValue("true"), - check.That(address).Key("bgp_measurements").HasValue("true"), - check.That(address).Key("codec_id").HasValue("tfacc-codec-id"), - check.That(address).Key("description").HasValue("tfacc-description"), - check.That(address).Key("dscp_id").HasValue("0"), - check.That(address).Key("duration").HasValue("5"), - check.That(address).Key("enabled").HasValue("true"), - check.That(address).Key("interval").Exists(), - check.That(address).Key("jitter_buffer").HasValue("1"), - check.That(address).Key("num_path_traces").HasValue("1"), - check.That(address).Key("port").HasValue("1024"), - check.That(address).Key("randomized_start_time").HasValue("true"), - check.That(address).Key("target_agent_id").HasValue("tfacc-target-agent-id"), - check.That(address).Key("test_name").HasValue("tfacc-test-name"), - check.That(address).Key("use_public_bgp").HasValue("true"), - ), - }, - }, - }) -} - -// config reads one of the committed fixtures. -// -// From testdata rather than from a string constant in this file, so the configuration can be -// edited and re-run without recompiling, and so `terraform fmt` can police it. -func config(t *testing.T, name string) string { - t.Helper() - - body, err := os.ReadFile(filepath.Join("testdata", name)) - if err != nil { - t.Fatalf("reading fixture %s: %v", name, err) - } - - return string(body) -} diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/state.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/state.go index fbba7f83..3154d5aa 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/state.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice @@ -20,7 +20,7 @@ import ( func mapRemoteStateToTerraform(ctx context.Context, data *TestsVoiceResourceModel, remote *voice_tests.VoiceTestResponse) { if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return } @@ -51,5 +51,5 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsVoiceResourceMode data.Type = convert.PtrStringToFramework(remote.Type) data.UsePublicBGP = convert.NamedBoolToFramework(remote.UsePublicBGP) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) } diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go index b1ffcca1..5f0cacf6 100644 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_voice diff --git a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/testdata/minimal.tf deleted file mode 100644 index 059ddcc1..00000000 --- a/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice/testdata/minimal.tf +++ /dev/null @@ -1,22 +0,0 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:3a39a25649423800e368a92f6e4267039ede78bbe19d20c0829fb5056f1e03b4). DO NOT EDIT. - -# The smallest configuration this resource accepts: its required attributes and nothing else. -# -# Regenerated, so it follows the schema. If the API starts requiring a field, this file gains it -# on the next emit rather than an acceptance run discovering it. - -resource "thousandeyes_tests_voice" "test" { - # Where a value came from. A fixture takes what the API was observed to accept, not the first - # value the specification documents -- which is the opposite of how a generated validator is - # built. A validator errs toward permitting, because blocking a configuration the API would - # have taken is a harm nobody can work around; a fixture errs toward working, because it is an - # input rather than a contract. - # - # interval: curated in the blueprint's accFixture; the generator cannot derive it - # - # agents: curated in the blueprint's accFixture; the generator cannot derive it - interval = 3600 - target_agent_id = "tfacc-target-agent-id" - agents = [{ agent_id = "3" }] -} diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go index 6109a9d5..841cd8c1 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction @@ -23,7 +23,7 @@ func constructResource(ctx context.Context, data *TestsWebTransactionResourceMod diags diag.Diagnostics d diag.Diagnostics ) - tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "constructing request body", map[string]any{"resource": TypeName}) body := &web_transaction_tests.WebTransactionTestRequest{} diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go index c0cbba6c..72676d4e 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction @@ -25,7 +25,7 @@ func (r *TestsWebTransactionResource) Create(ctx context.Context, req resource.C return } - tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "creating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -41,7 +41,7 @@ func (r *TestsWebTransactionResource) Create(ctx context.Context, req resource.C created, _, err := r.client.API.WebTransactionTests.CreateWebTransactionsTest(ctx, body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpCreate, err) return } @@ -71,7 +71,7 @@ func (r *TestsWebTransactionResource) Read(ctx context.Context, req resource.Rea return } - tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "reading resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -90,7 +90,7 @@ func (r *TestsWebTransactionResource) Read(ctx context.Context, req resource.Rea // error the practitioner has no way to clear. if !found { tflog.Debug(ctx, "resource no longer exists, removing it from state", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) resp.State.RemoveResource(ctx) return @@ -120,7 +120,7 @@ func (r *TestsWebTransactionResource) readState( return false, diags } - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) return false, diags } @@ -154,7 +154,7 @@ func (r *TestsWebTransactionResource) readAfterWrite( opts := crud.ReadBackOptions{ MaxRetries: 10, Interval: 2000 * time.Millisecond, - ResourceType: ResourceName, + ResourceType: TypeName, Operation: string(op), } @@ -172,7 +172,7 @@ func (r *TestsWebTransactionResource) readAfterWrite( // A stop signal means readState has already produced the diagnostic, so reporting // here as well would say the same thing twice. if err != nil && !crud.IsStopRetrying(err) { - errors.Handle(&diags, ResourceName, op, err) + errors.Handle(&diags, TypeName, op, err) } return diags @@ -188,7 +188,7 @@ func (r *TestsWebTransactionResource) Update(ctx context.Context, req resource.U return } - tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "updating resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -204,7 +204,7 @@ func (r *TestsWebTransactionResource) Update(ctx context.Context, req resource.U _, _, err := r.client.API.WebTransactionTests.UpdateWebTransactionsTest(ctx, state.ID.ValueString(), body) if err != nil { - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpUpdate, err) return } @@ -230,7 +230,7 @@ func (r *TestsWebTransactionResource) Delete(ctx context.Context, req resource.D return } - tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "deleting resource", map[string]any{"resource": TypeName}) timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics) if resp.Diagnostics.HasError() { @@ -245,7 +245,7 @@ func (r *TestsWebTransactionResource) Delete(ctx context.Context, req resource.D if errors.IsNotFound(err) { return } - errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err) + errors.Handle(&resp.Diagnostics, TypeName, errors.OpDelete, err) return } diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go index 83a1381e..c48c67b3 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go index db45e849..e666f1b5 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction @@ -22,8 +22,8 @@ import ( ) const ( - // ResourceName is the Terraform type this resource registers as. - ResourceName = "thousandeyes_tests_web_transaction" + // TypeName is the Terraform type this resource registers as. + TypeName = "thousandeyes_tests_web_transaction" // Default per-operation timeouts, in seconds. A practitioner overrides them // with the resource's timeouts block. @@ -53,12 +53,12 @@ type TestsWebTransactionResource struct { // Metadata returns the resource type name. func (r *TestsWebTransactionResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = ResourceName + resp.TypeName = TypeName } // Configure receives the configured SDK client from the provider. func (r *TestsWebTransactionResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - r.client = client.ForResource(ctx, req, resp, ResourceName) + r.client = client.ForResource(ctx, req, resp, TypeName) } // ImportState maps a terraform import into state. diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go index efb85321..e03bb45b 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction_test diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go index fa54bc3f..f850e78d 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction @@ -27,7 +27,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsWebTransactionRes if remote == nil { tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{ - "resource": ResourceName, + "resource": TypeName, }) return diags } @@ -95,7 +95,7 @@ func mapRemoteStateToTerraform(ctx context.Context, data *TestsWebTransactionRes diags.Append(d...) data.VerifyCertificate = convert.NamedBoolToFramework(remote.VerifyCertificate) - tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName}) + tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": TypeName}) return diags } diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go index bdcdb389..beaed9f5 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go @@ -1,5 +1,5 @@ -// Code generated by tfpluginframeworkgen from blueprints/thousandeyes -// (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +// Code generated by tfpfgen from blueprints/thousandeyes +// (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. package tests_web_transaction diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf index 9b2da385..e7925911 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The widest configuration the evidence supports: every writable attribute with a derivable # value, chosen by the same derivation the rehearsal probe sends to the live API. diff --git a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf index 5d84d6fd..521587c1 100644 --- a/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf +++ b/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf @@ -1,5 +1,5 @@ -# Code generated by tfpluginframeworkgen from blueprints/thousandeyes -# (sha256:e9fc089728e964a2ce1adf1c51444126c782ff30e172933b5177fd9a4982f6db). DO NOT EDIT. +# Code generated by tfpfgen from blueprints/thousandeyes +# (sha256:03f1a9d1deee1e76e51e48dbbc071404c0737e7a841d85bcad5a9c27643a1e84). DO NOT EDIT. # The smallest configuration this resource accepts: its required attributes and nothing else. # diff --git a/pilot/thousandeyes/main.go b/pilot/thousandeyes/main.go index aae80cbb..2a3d40fe 100644 --- a/pilot/thousandeyes/main.go +++ b/pilot/thousandeyes/main.go @@ -1,6 +1,6 @@ // Command terraform-provider-thousandeyes serves the ThousandEyes provider. // -// Most of this provider is generated by tfpluginframeworkgen from the blueprints in the +// Most of this provider is generated by tfpfgen from the blueprints in the // parent repository. Files carrying a "Code generated ... DO NOT EDIT." header are // rewritten on every generation; change the blueprint and regenerate instead. // Registry documentation is rendered from the provider schema plus the examples/ tree. diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/facts.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/facts.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/facts.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/facts.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/report.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/report.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/report.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/report.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/plan.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/plan.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/scenario.json diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/subject.json b/recordings/thousandeyes/account_group/7.0.98-t1785772648205/subject.json similarity index 100% rename from probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/subject.json rename to recordings/thousandeyes/account_group/7.0.98-t1785772648205/subject.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/facts.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/facts.json similarity index 93% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/facts.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/facts.json index 48351ad8..f5a47b75 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/facts.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/facts.json @@ -1,6 +1,6 @@ [ { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "errorEnvelope", "value": { "text": "404=problem" @@ -13,7 +13,7 @@ "rationale": "a 404 response used the problem error shape" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "errorEnvelope", "value": { "text": "listEnvelopeKey=alertRules" @@ -34,7 +34,7 @@ "rationale": "the list response wraps its items under \"alertRules\"" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "policy.delete.notFoundIsSuccess", "value": { "bool": true @@ -50,7 +50,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "policy.readBack", "value": { "readBack": { @@ -74,7 +74,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "unknownParamTolerated", "value": { "bool": true @@ -98,7 +98,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "field": "acceptedValues", "value": { @@ -122,7 +122,7 @@ "rationale": "4 of the 4 documented value(s) were accepted on create" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "field": "serverDefault", "value": { @@ -144,7 +144,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertType", "field": "requiredByApi", "value": { @@ -158,7 +158,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "requiredByApi", "value": { @@ -172,7 +172,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "expression", "field": "requiredByApi", "value": { @@ -186,7 +186,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "serverDefault", "value": { @@ -208,7 +208,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "minimumSources", "field": "requiredByApi", "value": { @@ -222,7 +222,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "requiredByApi", "value": { @@ -236,7 +236,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingOutOf", "field": "requiredByApi", "value": { @@ -250,7 +250,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingRequired", "field": "requiredByApi", "value": { @@ -264,7 +264,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "acceptedValues", "value": { @@ -289,7 +289,7 @@ "rationale": "4 of the 5 documented value(s) were accepted on create" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "immutable", "value": { @@ -303,7 +303,7 @@ "rationale": "an update changed this field from major to major and the read confirmed it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "rejectedValues", "value": { @@ -328,7 +328,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "requiredByApi", "value": { diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/001-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/001-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/001-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/001-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/002-get-v7-alerts-rules-999999999.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/002-get-v7-alerts-rules-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/002-get-v7-alerts-rules-999999999.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/002-get-v7-alerts-rules-999999999.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/003-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/003-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/003-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/003-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/004-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/004-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/004-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/004-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/005-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/005-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/005-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/005-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/006-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/006-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/006-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/006-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/007-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/007-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/007-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/007-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/008-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/008-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/008-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/008-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/009-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/009-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/009-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/009-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/010-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/010-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/010-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/010-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/011-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/011-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/011-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/011-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/012-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/012-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/012-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/012-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/013-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/013-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/013-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/013-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/014-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/014-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/014-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/014-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/015-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/015-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/015-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/015-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/016-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/016-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/016-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/016-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/017-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/017-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/017-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/017-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/018-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/018-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/018-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/018-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/019-delete-v7-alerts-rules-281474977454652.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/019-delete-v7-alerts-rules-281474977454652.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/019-delete-v7-alerts-rules-281474977454652.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/019-delete-v7-alerts-rules-281474977454652.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/020-delete-v7-alerts-rules-281474977454653.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/020-delete-v7-alerts-rules-281474977454653.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/020-delete-v7-alerts-rules-281474977454653.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/020-delete-v7-alerts-rules-281474977454653.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/021-delete-v7-alerts-rules-281474977454654.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/021-delete-v7-alerts-rules-281474977454654.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/021-delete-v7-alerts-rules-281474977454654.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/021-delete-v7-alerts-rules-281474977454654.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/022-delete-v7-alerts-rules-281474977454655.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/022-delete-v7-alerts-rules-281474977454655.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/022-delete-v7-alerts-rules-281474977454655.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/022-delete-v7-alerts-rules-281474977454655.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/023-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/023-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/023-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/023-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/024-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/024-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/024-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/024-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/025-get-v7-alerts-rules-281474977454656.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/025-get-v7-alerts-rules-281474977454656.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/025-get-v7-alerts-rules-281474977454656.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/025-get-v7-alerts-rules-281474977454656.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/026-delete-v7-alerts-rules-281474977454656.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/026-delete-v7-alerts-rules-281474977454656.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/026-delete-v7-alerts-rules-281474977454656.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/026-delete-v7-alerts-rules-281474977454656.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/027-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/027-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/027-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/027-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/028-get-v7-alerts-rules-281474977454657.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/028-get-v7-alerts-rules-281474977454657.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/028-get-v7-alerts-rules-281474977454657.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/028-get-v7-alerts-rules-281474977454657.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/029-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/029-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/029-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/029-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/030-get-v7-alerts-rules-281474977454658.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/030-get-v7-alerts-rules-281474977454658.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/030-get-v7-alerts-rules-281474977454658.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/030-get-v7-alerts-rules-281474977454658.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/031-delete-v7-alerts-rules-281474977454657.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/031-delete-v7-alerts-rules-281474977454657.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/031-delete-v7-alerts-rules-281474977454657.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/031-delete-v7-alerts-rules-281474977454657.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/032-delete-v7-alerts-rules-281474977454658.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/032-delete-v7-alerts-rules-281474977454658.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/032-delete-v7-alerts-rules-281474977454658.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/032-delete-v7-alerts-rules-281474977454658.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/033-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/033-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/033-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/033-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/034-get-v7-alerts-rules-281474977454659.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/034-get-v7-alerts-rules-281474977454659.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/034-get-v7-alerts-rules-281474977454659.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/034-get-v7-alerts-rules-281474977454659.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/035-put-v7-alerts-rules-281474977454659.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/035-put-v7-alerts-rules-281474977454659.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/035-put-v7-alerts-rules-281474977454659.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/035-put-v7-alerts-rules-281474977454659.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/036-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/036-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/036-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/036-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/037-put-v7-alerts-rules-281474977454659.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/037-put-v7-alerts-rules-281474977454659.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/037-put-v7-alerts-rules-281474977454659.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/037-put-v7-alerts-rules-281474977454659.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/038-get-v7-alerts-rules-281474977454659.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/038-get-v7-alerts-rules-281474977454659.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/038-get-v7-alerts-rules-281474977454659.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/038-get-v7-alerts-rules-281474977454659.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/039-delete-v7-alerts-rules-281474977454659.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/039-delete-v7-alerts-rules-281474977454659.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/039-delete-v7-alerts-rules-281474977454659.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/039-delete-v7-alerts-rules-281474977454659.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/040-delete-v7-alerts-rules-281474977454660.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/040-delete-v7-alerts-rules-281474977454660.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/040-delete-v7-alerts-rules-281474977454660.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/040-delete-v7-alerts-rules-281474977454660.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/041-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/041-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/041-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/041-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/042-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/042-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/042-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/042-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/043-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/043-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/043-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/043-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/044-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/044-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/044-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/044-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/045-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/045-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/045-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/045-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/046-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/046-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/046-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/046-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/047-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/047-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/047-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/047-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/048-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/048-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/048-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/048-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/049-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/049-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/049-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/049-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/050-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/050-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/050-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/050-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/051-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/051-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/051-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/051-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/052-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/052-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/052-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/052-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/053-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/053-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/053-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/053-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/054-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/054-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/054-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/054-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/055-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/055-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/055-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/055-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/056-delete-v7-alerts-rules-281474977454661.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/056-delete-v7-alerts-rules-281474977454661.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/056-delete-v7-alerts-rules-281474977454661.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/056-delete-v7-alerts-rules-281474977454661.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/057-delete-v7-alerts-rules-281474977454662.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/057-delete-v7-alerts-rules-281474977454662.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/057-delete-v7-alerts-rules-281474977454662.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/057-delete-v7-alerts-rules-281474977454662.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/058-delete-v7-alerts-rules-281474977454663.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/058-delete-v7-alerts-rules-281474977454663.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/058-delete-v7-alerts-rules-281474977454663.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/058-delete-v7-alerts-rules-281474977454663.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/059-delete-v7-alerts-rules-281474977454664.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/059-delete-v7-alerts-rules-281474977454664.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/059-delete-v7-alerts-rules-281474977454664.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/059-delete-v7-alerts-rules-281474977454664.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/060-delete-v7-alerts-rules-281474977454665.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/060-delete-v7-alerts-rules-281474977454665.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/060-delete-v7-alerts-rules-281474977454665.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/060-delete-v7-alerts-rules-281474977454665.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/061-delete-v7-alerts-rules-281474977454666.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/061-delete-v7-alerts-rules-281474977454666.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/061-delete-v7-alerts-rules-281474977454666.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/061-delete-v7-alerts-rules-281474977454666.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/062-delete-v7-alerts-rules-281474977454667.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/062-delete-v7-alerts-rules-281474977454667.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/062-delete-v7-alerts-rules-281474977454667.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/062-delete-v7-alerts-rules-281474977454667.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/063-delete-v7-alerts-rules-281474977454668.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/063-delete-v7-alerts-rules-281474977454668.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/063-delete-v7-alerts-rules-281474977454668.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/063-delete-v7-alerts-rules-281474977454668.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/064-delete-v7-alerts-rules-281474977454669.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/064-delete-v7-alerts-rules-281474977454669.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/064-delete-v7-alerts-rules-281474977454669.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/064-delete-v7-alerts-rules-281474977454669.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/065-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/065-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/065-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/065-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/066-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/066-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/066-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/066-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/067-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/067-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/067-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/067-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/068-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/068-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/068-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/068-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/069-get-v7-alerts-rules-281474977454670.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/069-get-v7-alerts-rules-281474977454670.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/069-get-v7-alerts-rules-281474977454670.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/069-get-v7-alerts-rules-281474977454670.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/070-delete-v7-alerts-rules-281474977454670.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/070-delete-v7-alerts-rules-281474977454670.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/070-delete-v7-alerts-rules-281474977454670.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/070-delete-v7-alerts-rules-281474977454670.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/071-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/071-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/071-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/071-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/072-get-v7-alerts-rules-281474977454671.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/072-get-v7-alerts-rules-281474977454671.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/072-get-v7-alerts-rules-281474977454671.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/072-get-v7-alerts-rules-281474977454671.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/073-put-v7-alerts-rules-281474977454671.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/073-put-v7-alerts-rules-281474977454671.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/073-put-v7-alerts-rules-281474977454671.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/073-put-v7-alerts-rules-281474977454671.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/074-put-v7-alerts-rules-281474977454671.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/074-put-v7-alerts-rules-281474977454671.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/074-put-v7-alerts-rules-281474977454671.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/074-put-v7-alerts-rules-281474977454671.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/075-delete-v7-alerts-rules-281474977454671.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/075-delete-v7-alerts-rules-281474977454671.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/075-delete-v7-alerts-rules-281474977454671.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/075-delete-v7-alerts-rules-281474977454671.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/076-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/076-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/076-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/076-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/077-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/077-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/interactions/077-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/interactions/077-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/metadata.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/metadata.json similarity index 90% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/metadata.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/metadata.json index 7ad7a6f3..637ee787 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/metadata.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/metadata.json @@ -1,6 +1,6 @@ { "provider": "thousandeyes", - "resource": "alerts_rule", + "resource": "alert_rule", "apiVersion": "7.0.98", "host": "api.thousandeyes.com", "basePath": "/v7", diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/rehearsal.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/rehearsal.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/rehearsal.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/report.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/report.json similarity index 93% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/report.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/report.json index 0eda1b4f..92c93f5a 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/report.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/report.json @@ -21,7 +21,7 @@ }, "facts": [ { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "errorEnvelope", "value": { "text": "404=problem" @@ -34,7 +34,7 @@ "rationale": "a 404 response used the problem error shape" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "errorEnvelope", "value": { "text": "listEnvelopeKey=alertRules" @@ -55,7 +55,7 @@ "rationale": "the list response wraps its items under \"alertRules\"" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "policy.delete.notFoundIsSuccess", "value": { "bool": true @@ -71,7 +71,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "policy.readBack", "value": { "readBack": { @@ -95,7 +95,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "field": "unknownParamTolerated", "value": { "bool": true @@ -119,7 +119,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "field": "acceptedValues", "value": { @@ -143,7 +143,7 @@ "rationale": "4 of the 4 documented value(s) were accepted on create" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "field": "serverDefault", "value": { @@ -165,7 +165,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertType", "field": "requiredByApi", "value": { @@ -179,7 +179,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "requiredByApi", "value": { @@ -193,7 +193,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "expression", "field": "requiredByApi", "value": { @@ -207,7 +207,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "serverDefault", "value": { @@ -229,7 +229,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "minimumSources", "field": "requiredByApi", "value": { @@ -243,7 +243,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "requiredByApi", "value": { @@ -257,7 +257,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingOutOf", "field": "requiredByApi", "value": { @@ -271,7 +271,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingRequired", "field": "requiredByApi", "value": { @@ -285,7 +285,7 @@ "rationale": "a create omitting this field was refused with 400 and the error named the field" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "acceptedValues", "value": { @@ -310,7 +310,7 @@ "rationale": "4 of the 5 documented value(s) were accepted on create" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "immutable", "value": { @@ -324,7 +324,7 @@ "rationale": "an update changed this field from major to major and the read confirmed it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "rejectedValues", "value": { @@ -349,7 +349,7 @@ ] }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "requiredByApi", "value": { @@ -365,165 +365,165 @@ ], "notes": [ { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.writable-returned", "message": "fixture http-response-time was refused with 400 (), so nothing was observed about writability from it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "read.error-envelope", "message": "no candidate query parameter (limit, max, offset, page) was validated, so no error shape was observed without mutating anything" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "read.volatile", "message": "no existing object to read repeatedly, so volatility was not observed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "read.returned-weak", "message": "no existing object to read, so no field presence was observed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.rehearsal", "message": "the contrasted maximal update was refused with 400 (); retrying with the derived values alone -- equality writes observe less, but a refusal the contrast manufactured must not silence the round" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.normalisation", "message": "the create carrying \"letter case is changed\" was refused with 400 (), so nothing was observed about that transform" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.normalisation", "message": "the create carrying \"surrounding whitespace is stripped\" was refused with 400 (), so nothing was observed about that transform" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.side-effect", "message": "the create carrying the first value for alertType was refused with 400 (), so no coupling was observed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.rehearsal", "message": "the derived maximal body was refused as a create with 400 (); a maximal-first acceptance configuration would fail exactly like this" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "probe": "write.rehearsal", "message": "the derived maximal update was refused with 400 (); the generated acceptance test's update step would fail exactly like this" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "probe": "write.enum", "message": "only 0 value(s) outside the documented set could be generated, and 2 are required before the set can be called closed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "probe": "write.enum", "message": "the create carrying \"qqqqqqqqqqqqqqq\" (generated, shaped like the documented values) was refused with 400 (Failed to read request), and the error does not name this field, so the refusal says nothing about its value set and this candidate was not counted" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "probe": "write.enum", "message": "the create carrying \"zzzzzzzzzzzzzzz\" (generated, shaped like the documented values) was refused with 400 (Failed to read request), and the error does not name this field, so the refusal says nothing about its value set and this candidate was not counted" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertGroupType", "probe": "write.enum", "message": "the documented value \"bgp\" was accepted and \"BGP\" was refused with 400, so the API treats this set case-sensitively" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertType", "probe": "write.writable-returned", "message": "the plan denies this field, so nothing was sent for it and whatever the blueprint currently claims about it is still unprobed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "probe": "write.update-style", "message": "the field chosen to omit did not come back on the read before the update, so a cleared value and a never-stored one cannot be told apart and no update style was recorded" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "direction", "probe": "write.writable-returned", "message": "the plan denies this field, so nothing was sent for it and whatever the blueprint currently claims about it is still unprobed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointAgentIds", "probe": "write.server-default", "message": "the field was omitted and did not appear in the read, so the API assigns no value a generated default could carry" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointLabelIds", "probe": "write.server-default", "message": "the field was omitted and did not appear in the read, so the API assigns no value a generated default could carry" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "includeCoveredPrefixes", "probe": "write.writable-returned", "message": "the plan denies this field, so nothing was sent for it and whatever the blueprint currently claims about it is still unprobed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "minimumSourcesPct", "probe": "write.server-default", "message": "the field was omitted and did not appear in the read, so the API assigns no value a generated default could carry" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "ruleName", "probe": "write.normalisation", "message": "\"letter case is changed\" could not be sent for this field because it carries the sweeper's name prefix and the awkward shape would destroy it, so this transform is unprobed for it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "ruleName", "probe": "write.normalisation", "message": "\"surrounding whitespace is stripped\" could not be sent for this field because it carries the sweeper's name prefix and the awkward shape would destroy it, so this transform is unprobed for it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "ruleName", "probe": "write.required", "message": "this field carries the sweeper's name prefix, so a create omitting it would produce an object that could not be found again and is refused before it is sent; its requiredness is therefore unprobed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "probe": "write.enum", "message": "only 0 value(s) outside the documented set could be generated, and 2 are required before the set can be called closed" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "probe": "write.enum", "message": "the API accepted \"INFO\" for a value the specification documents as \"info\", so the documented set is not the whole of what it takes and a validator built from it would reject configurations the API allows" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "probe": "write.enum", "message": "the create carrying \"qqqqq\" (generated, shaped like the documented values) was refused with 400 (Failed to read request), and the error does not name this field, so the refusal says nothing about its value set and this candidate was not counted" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "probe": "write.enum", "message": "the create carrying \"zzzzz\" (generated, shaped like the documented values) was refused with 400 (Failed to read request), and the error does not name this field, so the refusal says nothing about its value set and this candidate was not counted" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "visitedSitesFilter", "probe": "write.writable-returned", "message": "the plan denies this field, so nothing was sent for it and whatever the blueprint currently claims about it is still unprobed" diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/plan.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/plan.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/scenario.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/subject.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/subject.json similarity index 99% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/subject.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/subject.json index 64826536..c0a1e875 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764456095/subject.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764456095/subject.json @@ -1,5 +1,5 @@ { - "resource": "alerts_rule", + "resource": "alert_rule", "collectionTemplate": "/alerts/rules", "itemTemplate": "/alerts/rules/{ruleId}", "create": { diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/facts.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/facts.json similarity index 92% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/facts.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/facts.json index e46fbfdd..9f40a1fd 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/facts.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/facts.json @@ -1,6 +1,6 @@ [ { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertType", "field": "returnedOnUpdate", "value": { @@ -14,7 +14,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "returnedOnRead", "value": { @@ -29,7 +29,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "returnedOnUpdate", "value": { @@ -43,7 +43,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointAgentIds", "field": "returnedOnRead", "value": { @@ -58,7 +58,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointAgentIds", "field": "returnedOnUpdate", "value": { @@ -72,7 +72,7 @@ "rationale": "the update response did not carry this field although the update sent it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointLabelIds", "field": "returnedOnRead", "value": { @@ -87,7 +87,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointLabelIds", "field": "returnedOnUpdate", "value": { @@ -101,7 +101,7 @@ "rationale": "the update response did not carry this field although the update sent it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "expression", "field": "returnedOnUpdate", "value": { @@ -115,7 +115,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "includeCoveredPrefixes", "field": "returnedOnRead", "value": { @@ -130,7 +130,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "includeCoveredPrefixes", "field": "returnedOnUpdate", "value": { @@ -144,7 +144,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "returnedOnUpdate", "value": { @@ -158,7 +158,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "updateDefault", "value": { @@ -176,7 +176,7 @@ "rationale": "the constant an omitted-on-update field reverts to; a derived value remains the open alternative until a second downgrade agrees" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "updateResets", "value": { @@ -190,7 +190,7 @@ "rationale": "held true, was omitted from an update, and read back false rather than the held value" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "minimumSources", "field": "returnedOnUpdate", "value": { @@ -204,7 +204,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "returnedOnUpdate", "value": { @@ -218,7 +218,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "updateDefault", "value": { @@ -236,7 +236,7 @@ "rationale": "the constant an omitted-on-update field reverts to; a derived value remains the open alternative until a second downgrade agrees" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "updateResets", "value": { @@ -250,7 +250,7 @@ "rationale": "held false, was omitted from an update, and read back true rather than the held value" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingOutOf", "field": "returnedOnUpdate", "value": { @@ -264,7 +264,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingRequired", "field": "returnedOnUpdate", "value": { @@ -278,7 +278,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "returnedOnUpdate", "value": { @@ -292,7 +292,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "visitedSitesFilter", "field": "returnedOnRead", "value": { @@ -307,7 +307,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "visitedSitesFilter", "field": "returnedOnUpdate", "value": { diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/001-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/001-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/001-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/001-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/002-get-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/002-get-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/002-get-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/002-get-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/003-put-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/003-put-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/003-put-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/003-put-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/004-get-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/004-get-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/004-get-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/004-get-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/005-put-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/005-put-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/005-put-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/005-put-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/006-get-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/006-get-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/006-get-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/006-get-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/007-delete-v7-alerts-rules-281474977454693.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/007-delete-v7-alerts-rules-281474977454693.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/007-delete-v7-alerts-rules-281474977454693.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/007-delete-v7-alerts-rules-281474977454693.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/008-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/008-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/008-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/008-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/009-get-v7-alerts-rules-281474977454696.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/009-get-v7-alerts-rules-281474977454696.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/009-get-v7-alerts-rules-281474977454696.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/009-get-v7-alerts-rules-281474977454696.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/010-put-v7-alerts-rules-281474977454696.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/010-put-v7-alerts-rules-281474977454696.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/010-put-v7-alerts-rules-281474977454696.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/010-put-v7-alerts-rules-281474977454696.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/011-get-v7-alerts-rules-281474977454696.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/011-get-v7-alerts-rules-281474977454696.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/011-get-v7-alerts-rules-281474977454696.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/011-get-v7-alerts-rules-281474977454696.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/012-delete-v7-alerts-rules-281474977454696.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/012-delete-v7-alerts-rules-281474977454696.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/012-delete-v7-alerts-rules-281474977454696.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/012-delete-v7-alerts-rules-281474977454696.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/013-post-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/013-post-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/013-post-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/013-post-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/014-put-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/014-put-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/014-put-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/014-put-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/015-put-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/015-put-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/015-put-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/015-put-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/016-put-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/016-put-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/016-put-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/016-put-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/017-put-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/017-put-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/017-put-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/017-put-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/018-put-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/018-put-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/018-put-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/018-put-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/019-delete-v7-alerts-rules-281474977454698.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/019-delete-v7-alerts-rules-281474977454698.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/019-delete-v7-alerts-rules-281474977454698.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/019-delete-v7-alerts-rules-281474977454698.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/020-get-v7-alerts-rules.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/020-get-v7-alerts-rules.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/interactions/020-get-v7-alerts-rules.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/interactions/020-get-v7-alerts-rules.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/metadata.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/metadata.json similarity index 91% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/metadata.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/metadata.json index 921c9dbe..81df2508 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/metadata.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/metadata.json @@ -1,6 +1,6 @@ { "provider": "thousandeyes", - "resource": "alerts_rule", + "resource": "alert_rule", "apiVersion": "7.0.98", "host": "api.thousandeyes.com", "basePath": "/v7", diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/rehearsal.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/rehearsal.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/rehearsal.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/report.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/report.json similarity index 93% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/report.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/report.json index 5716d7be..a28b0524 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/report.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/report.json @@ -21,7 +21,7 @@ }, "facts": [ { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "alertType", "field": "returnedOnUpdate", "value": { @@ -35,7 +35,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "returnedOnRead", "value": { @@ -50,7 +50,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "field": "returnedOnUpdate", "value": { @@ -64,7 +64,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointAgentIds", "field": "returnedOnRead", "value": { @@ -79,7 +79,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointAgentIds", "field": "returnedOnUpdate", "value": { @@ -93,7 +93,7 @@ "rationale": "the update response did not carry this field although the update sent it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointLabelIds", "field": "returnedOnRead", "value": { @@ -108,7 +108,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "endpointLabelIds", "field": "returnedOnUpdate", "value": { @@ -122,7 +122,7 @@ "rationale": "the update response did not carry this field although the update sent it" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "expression", "field": "returnedOnUpdate", "value": { @@ -136,7 +136,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "includeCoveredPrefixes", "field": "returnedOnRead", "value": { @@ -151,7 +151,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "includeCoveredPrefixes", "field": "returnedOnUpdate", "value": { @@ -165,7 +165,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "returnedOnUpdate", "value": { @@ -179,7 +179,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "updateDefault", "value": { @@ -197,7 +197,7 @@ "rationale": "the constant an omitted-on-update field reverts to; a derived value remains the open alternative until a second downgrade agrees" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "isDefault", "field": "updateResets", "value": { @@ -211,7 +211,7 @@ "rationale": "held true, was omitted from an update, and read back false rather than the held value" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "minimumSources", "field": "returnedOnUpdate", "value": { @@ -225,7 +225,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "returnedOnUpdate", "value": { @@ -239,7 +239,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "updateDefault", "value": { @@ -257,7 +257,7 @@ "rationale": "the constant an omitted-on-update field reverts to; a derived value remains the open alternative until a second downgrade agrees" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "notifyOnClear", "field": "updateResets", "value": { @@ -271,7 +271,7 @@ "rationale": "held false, was omitted from an update, and read back true rather than the held value" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingOutOf", "field": "returnedOnUpdate", "value": { @@ -285,7 +285,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "roundsViolatingRequired", "field": "returnedOnUpdate", "value": { @@ -299,7 +299,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "severity", "field": "returnedOnUpdate", "value": { @@ -313,7 +313,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "visitedSitesFilter", "field": "returnedOnRead", "value": { @@ -328,7 +328,7 @@ "rationale": "sent a value and read back null or nothing, so state must carry the configured value rather than flatten an empty read" }, { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "visitedSitesFilter", "field": "returnedOnUpdate", "value": { @@ -344,7 +344,7 @@ ], "notes": [ { - "resource": "alerts_rule", + "resource": "alert_rule", "jsonPath": "description", "probe": "write.rehearsal", "message": "the bisection converged on \"visitedSitesFilter\", but the pair alone does not reproduce the suppression; the combination is untested" diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/plan.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/plan.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/scenario.json diff --git a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/subject.json b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/subject.json similarity index 99% rename from probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/subject.json rename to recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/subject.json index 565c6d36..1a313ab4 100644 --- a/probe-evidence/thousandeyes/alerts_rule/7.0.98-t1785764967601/subject.json +++ b/recordings/thousandeyes/alert_rule/7.0.98-t1785764967601/subject.json @@ -1,5 +1,5 @@ { - "resource": "alerts_rule", + "resource": "alert_rule", "collectionTemplate": "/alerts/rules", "itemTemplate": "/alerts/rules/{ruleId}", "create": { diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/facts.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/facts.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/facts.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/facts.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/001-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/001-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/001-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/001-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/002-get-v7-alert-suppression-windows-999999999.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/002-get-v7-alert-suppression-windows-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/002-get-v7-alert-suppression-windows-999999999.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/002-get-v7-alert-suppression-windows-999999999.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/003-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/003-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/003-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/003-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/004-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/004-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/004-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/004-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/005-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/005-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/005-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/005-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/006-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/006-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/006-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/006-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/007-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/007-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/007-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/007-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/008-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/008-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/008-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/008-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/009-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/009-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/009-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/009-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/010-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/010-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/010-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/010-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/011-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/011-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/011-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/011-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/012-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/012-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/012-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/012-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/013-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/013-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/013-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/013-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/014-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/014-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/014-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/014-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/015-delete-v7-alert-suppression-windows-281474976711116.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/015-delete-v7-alert-suppression-windows-281474976711116.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/015-delete-v7-alert-suppression-windows-281474976711116.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/015-delete-v7-alert-suppression-windows-281474976711116.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/016-delete-v7-alert-suppression-windows-281474976711117.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/016-delete-v7-alert-suppression-windows-281474976711117.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/016-delete-v7-alert-suppression-windows-281474976711117.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/016-delete-v7-alert-suppression-windows-281474976711117.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/017-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/017-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/017-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/017-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/018-get-v7-alert-suppression-windows-281474976711118.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/018-get-v7-alert-suppression-windows-281474976711118.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/018-get-v7-alert-suppression-windows-281474976711118.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/018-get-v7-alert-suppression-windows-281474976711118.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/019-delete-v7-alert-suppression-windows-281474976711118.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/019-delete-v7-alert-suppression-windows-281474976711118.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/019-delete-v7-alert-suppression-windows-281474976711118.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/019-delete-v7-alert-suppression-windows-281474976711118.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/020-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/020-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/020-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/020-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/021-get-v7-alert-suppression-windows-281474976711119.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/021-get-v7-alert-suppression-windows-281474976711119.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/021-get-v7-alert-suppression-windows-281474976711119.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/021-get-v7-alert-suppression-windows-281474976711119.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/022-put-v7-alert-suppression-windows-281474976711119.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/022-put-v7-alert-suppression-windows-281474976711119.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/022-put-v7-alert-suppression-windows-281474976711119.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/022-put-v7-alert-suppression-windows-281474976711119.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/023-get-v7-alert-suppression-windows-281474976711119.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/023-get-v7-alert-suppression-windows-281474976711119.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/023-get-v7-alert-suppression-windows-281474976711119.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/023-get-v7-alert-suppression-windows-281474976711119.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/024-delete-v7-alert-suppression-windows-281474976711119.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/024-delete-v7-alert-suppression-windows-281474976711119.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/024-delete-v7-alert-suppression-windows-281474976711119.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/024-delete-v7-alert-suppression-windows-281474976711119.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/025-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/025-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/025-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/025-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/026-get-v7-alert-suppression-windows-281474976711120.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/026-get-v7-alert-suppression-windows-281474976711120.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/026-get-v7-alert-suppression-windows-281474976711120.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/026-get-v7-alert-suppression-windows-281474976711120.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/027-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/027-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/027-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/027-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/028-get-v7-alert-suppression-windows-281474976711121.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/028-get-v7-alert-suppression-windows-281474976711121.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/028-get-v7-alert-suppression-windows-281474976711121.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/028-get-v7-alert-suppression-windows-281474976711121.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/029-delete-v7-alert-suppression-windows-281474976711120.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/029-delete-v7-alert-suppression-windows-281474976711120.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/029-delete-v7-alert-suppression-windows-281474976711120.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/029-delete-v7-alert-suppression-windows-281474976711120.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/030-delete-v7-alert-suppression-windows-281474976711121.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/030-delete-v7-alert-suppression-windows-281474976711121.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/030-delete-v7-alert-suppression-windows-281474976711121.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/030-delete-v7-alert-suppression-windows-281474976711121.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/031-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/031-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/031-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/031-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/032-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/032-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/032-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/032-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/033-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/033-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/033-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/033-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/034-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/034-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/034-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/034-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/035-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/035-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/035-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/035-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/036-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/036-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/036-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/036-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/037-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/037-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/037-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/037-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/038-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/038-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/038-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/038-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/039-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/039-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/039-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/039-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/040-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/040-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/040-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/040-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/041-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/041-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/041-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/041-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/042-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/042-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/042-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/042-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/043-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/043-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/043-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/043-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/044-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/044-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/044-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/044-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/045-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/045-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/045-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/045-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/046-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/046-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/046-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/046-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/047-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/047-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/047-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/047-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/048-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/048-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/048-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/048-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/049-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/049-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/049-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/049-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/050-delete-v7-alert-suppression-windows-281474976711122.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/050-delete-v7-alert-suppression-windows-281474976711122.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/050-delete-v7-alert-suppression-windows-281474976711122.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/050-delete-v7-alert-suppression-windows-281474976711122.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/051-delete-v7-alert-suppression-windows-281474976711123.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/051-delete-v7-alert-suppression-windows-281474976711123.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/051-delete-v7-alert-suppression-windows-281474976711123.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/051-delete-v7-alert-suppression-windows-281474976711123.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/052-delete-v7-alert-suppression-windows-281474976711124.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/052-delete-v7-alert-suppression-windows-281474976711124.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/052-delete-v7-alert-suppression-windows-281474976711124.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/052-delete-v7-alert-suppression-windows-281474976711124.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/053-delete-v7-alert-suppression-windows-281474976711125.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/053-delete-v7-alert-suppression-windows-281474976711125.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/053-delete-v7-alert-suppression-windows-281474976711125.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/053-delete-v7-alert-suppression-windows-281474976711125.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/054-delete-v7-alert-suppression-windows-281474976711126.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/054-delete-v7-alert-suppression-windows-281474976711126.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/054-delete-v7-alert-suppression-windows-281474976711126.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/054-delete-v7-alert-suppression-windows-281474976711126.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/055-delete-v7-alert-suppression-windows-281474976711127.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/055-delete-v7-alert-suppression-windows-281474976711127.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/055-delete-v7-alert-suppression-windows-281474976711127.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/055-delete-v7-alert-suppression-windows-281474976711127.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/056-delete-v7-alert-suppression-windows-281474976711128.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/056-delete-v7-alert-suppression-windows-281474976711128.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/056-delete-v7-alert-suppression-windows-281474976711128.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/056-delete-v7-alert-suppression-windows-281474976711128.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/057-delete-v7-alert-suppression-windows-281474976711129.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/057-delete-v7-alert-suppression-windows-281474976711129.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/057-delete-v7-alert-suppression-windows-281474976711129.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/057-delete-v7-alert-suppression-windows-281474976711129.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/058-delete-v7-alert-suppression-windows-281474976711130.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/058-delete-v7-alert-suppression-windows-281474976711130.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/058-delete-v7-alert-suppression-windows-281474976711130.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/058-delete-v7-alert-suppression-windows-281474976711130.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/059-delete-v7-alert-suppression-windows-281474976711131.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/059-delete-v7-alert-suppression-windows-281474976711131.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/059-delete-v7-alert-suppression-windows-281474976711131.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/059-delete-v7-alert-suppression-windows-281474976711131.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/060-delete-v7-alert-suppression-windows-281474976711132.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/060-delete-v7-alert-suppression-windows-281474976711132.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/060-delete-v7-alert-suppression-windows-281474976711132.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/060-delete-v7-alert-suppression-windows-281474976711132.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/061-delete-v7-alert-suppression-windows-281474976711133.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/061-delete-v7-alert-suppression-windows-281474976711133.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/061-delete-v7-alert-suppression-windows-281474976711133.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/061-delete-v7-alert-suppression-windows-281474976711133.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/062-delete-v7-alert-suppression-windows-281474976711134.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/062-delete-v7-alert-suppression-windows-281474976711134.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/062-delete-v7-alert-suppression-windows-281474976711134.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/062-delete-v7-alert-suppression-windows-281474976711134.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/063-delete-v7-alert-suppression-windows-281474976711135.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/063-delete-v7-alert-suppression-windows-281474976711135.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/063-delete-v7-alert-suppression-windows-281474976711135.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/063-delete-v7-alert-suppression-windows-281474976711135.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/064-delete-v7-alert-suppression-windows-281474976711136.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/064-delete-v7-alert-suppression-windows-281474976711136.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/064-delete-v7-alert-suppression-windows-281474976711136.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/064-delete-v7-alert-suppression-windows-281474976711136.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/065-delete-v7-alert-suppression-windows-281474976711137.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/065-delete-v7-alert-suppression-windows-281474976711137.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/065-delete-v7-alert-suppression-windows-281474976711137.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/065-delete-v7-alert-suppression-windows-281474976711137.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/066-delete-v7-alert-suppression-windows-281474976711138.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/066-delete-v7-alert-suppression-windows-281474976711138.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/066-delete-v7-alert-suppression-windows-281474976711138.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/066-delete-v7-alert-suppression-windows-281474976711138.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/067-delete-v7-alert-suppression-windows-281474976711139.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/067-delete-v7-alert-suppression-windows-281474976711139.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/067-delete-v7-alert-suppression-windows-281474976711139.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/067-delete-v7-alert-suppression-windows-281474976711139.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/068-delete-v7-alert-suppression-windows-281474976711140.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/068-delete-v7-alert-suppression-windows-281474976711140.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/068-delete-v7-alert-suppression-windows-281474976711140.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/068-delete-v7-alert-suppression-windows-281474976711140.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/069-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/069-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/069-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/069-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/070-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/070-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/070-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/070-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/071-get-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/071-get-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/071-get-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/071-get-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/072-put-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/072-put-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/072-put-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/072-put-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/073-get-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/073-get-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/073-get-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/073-get-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/074-put-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/074-put-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/074-put-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/074-put-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/075-get-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/075-get-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/075-get-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/075-get-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/076-delete-v7-alert-suppression-windows-281474976711141.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/076-delete-v7-alert-suppression-windows-281474976711141.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/076-delete-v7-alert-suppression-windows-281474976711141.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/076-delete-v7-alert-suppression-windows-281474976711141.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/077-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/077-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/077-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/077-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/078-get-v7-alert-suppression-windows-281474976711142.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/078-get-v7-alert-suppression-windows-281474976711142.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/078-get-v7-alert-suppression-windows-281474976711142.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/078-get-v7-alert-suppression-windows-281474976711142.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/079-put-v7-alert-suppression-windows-281474976711142.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/079-put-v7-alert-suppression-windows-281474976711142.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/079-put-v7-alert-suppression-windows-281474976711142.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/079-put-v7-alert-suppression-windows-281474976711142.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/080-get-v7-alert-suppression-windows-281474976711142.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/080-get-v7-alert-suppression-windows-281474976711142.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/080-get-v7-alert-suppression-windows-281474976711142.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/080-get-v7-alert-suppression-windows-281474976711142.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/081-delete-v7-alert-suppression-windows-281474976711142.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/081-delete-v7-alert-suppression-windows-281474976711142.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/081-delete-v7-alert-suppression-windows-281474976711142.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/081-delete-v7-alert-suppression-windows-281474976711142.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/082-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/082-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/082-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/interactions/082-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/metadata.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/metadata.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/metadata.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/rehearsal.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/rehearsal.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/rehearsal.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/report.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/report.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/report.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/report.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/plan.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/plan.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/scenario.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/subject.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/subject.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/subject.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764488786/subject.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/facts.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/facts.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/facts.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/facts.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/001-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/001-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/001-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/001-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/002-get-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/002-get-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/002-get-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/002-get-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/003-put-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/003-put-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/003-put-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/003-put-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/004-get-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/004-get-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/004-get-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/004-get-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/005-put-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/005-put-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/005-put-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/005-put-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/006-get-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/006-get-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/006-get-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/006-get-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/007-delete-v7-alert-suppression-windows-281474976711144.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/007-delete-v7-alert-suppression-windows-281474976711144.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/007-delete-v7-alert-suppression-windows-281474976711144.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/007-delete-v7-alert-suppression-windows-281474976711144.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/008-post-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/008-post-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/008-post-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/008-post-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/009-get-v7-alert-suppression-windows-281474976711145.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/009-get-v7-alert-suppression-windows-281474976711145.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/009-get-v7-alert-suppression-windows-281474976711145.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/009-get-v7-alert-suppression-windows-281474976711145.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/010-put-v7-alert-suppression-windows-281474976711145.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/010-put-v7-alert-suppression-windows-281474976711145.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/010-put-v7-alert-suppression-windows-281474976711145.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/010-put-v7-alert-suppression-windows-281474976711145.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/011-get-v7-alert-suppression-windows-281474976711145.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/011-get-v7-alert-suppression-windows-281474976711145.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/011-get-v7-alert-suppression-windows-281474976711145.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/011-get-v7-alert-suppression-windows-281474976711145.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/012-delete-v7-alert-suppression-windows-281474976711145.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/012-delete-v7-alert-suppression-windows-281474976711145.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/012-delete-v7-alert-suppression-windows-281474976711145.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/012-delete-v7-alert-suppression-windows-281474976711145.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/013-get-v7-alert-suppression-windows.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/013-get-v7-alert-suppression-windows.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/013-get-v7-alert-suppression-windows.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/interactions/013-get-v7-alert-suppression-windows.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/metadata.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/metadata.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/metadata.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/rehearsal.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/rehearsal.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/rehearsal.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/report.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/report.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/report.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/report.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/plan.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/plan.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/scenario.json diff --git a/probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/subject.json b/recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/subject.json similarity index 100% rename from probe-evidence/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/subject.json rename to recordings/thousandeyes/alert_suppression_window/7.0.98-t1785764972866/subject.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/facts.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/facts.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/facts.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/facts.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/001-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/001-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/001-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/001-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/002-get-v7-credentials-999999999.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/002-get-v7-credentials-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/002-get-v7-credentials-999999999.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/002-get-v7-credentials-999999999.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/003-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/003-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/003-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/003-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/004-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/004-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/004-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/004-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/005-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/005-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/005-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/005-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/006-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/006-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/006-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/006-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/007-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/007-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/007-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/007-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/008-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/008-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/008-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/008-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/009-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/009-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/009-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/009-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/010-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/010-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/010-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/010-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/011-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/011-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/011-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/011-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/012-delete-v7-credentials-281474976711478.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/012-delete-v7-credentials-281474976711478.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/012-delete-v7-credentials-281474976711478.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/012-delete-v7-credentials-281474976711478.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/013-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/013-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/013-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/013-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/014-get-v7-credentials-281474976711479.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/014-get-v7-credentials-281474976711479.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/014-get-v7-credentials-281474976711479.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/014-get-v7-credentials-281474976711479.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/015-delete-v7-credentials-281474976711479.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/015-delete-v7-credentials-281474976711479.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/015-delete-v7-credentials-281474976711479.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/015-delete-v7-credentials-281474976711479.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/016-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/016-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/016-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/016-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/017-get-v7-credentials-281474976711480.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/017-get-v7-credentials-281474976711480.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/017-get-v7-credentials-281474976711480.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/017-get-v7-credentials-281474976711480.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/018-put-v7-credentials-281474976711480.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/018-put-v7-credentials-281474976711480.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/018-put-v7-credentials-281474976711480.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/018-put-v7-credentials-281474976711480.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/019-get-v7-credentials-281474976711480.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/019-get-v7-credentials-281474976711480.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/019-get-v7-credentials-281474976711480.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/019-get-v7-credentials-281474976711480.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/020-delete-v7-credentials-281474976711480.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/020-delete-v7-credentials-281474976711480.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/020-delete-v7-credentials-281474976711480.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/020-delete-v7-credentials-281474976711480.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/021-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/021-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/021-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/021-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/022-get-v7-credentials-281474976711481.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/022-get-v7-credentials-281474976711481.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/022-get-v7-credentials-281474976711481.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/022-get-v7-credentials-281474976711481.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/023-put-v7-credentials-281474976711481.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/023-put-v7-credentials-281474976711481.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/023-put-v7-credentials-281474976711481.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/023-put-v7-credentials-281474976711481.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/024-post-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/024-post-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/024-post-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/024-post-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/025-put-v7-credentials-281474976711481.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/025-put-v7-credentials-281474976711481.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/025-put-v7-credentials-281474976711481.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/025-put-v7-credentials-281474976711481.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/026-get-v7-credentials-281474976711481.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/026-get-v7-credentials-281474976711481.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/026-get-v7-credentials-281474976711481.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/026-get-v7-credentials-281474976711481.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/027-delete-v7-credentials-281474976711481.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/027-delete-v7-credentials-281474976711481.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/027-delete-v7-credentials-281474976711481.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/027-delete-v7-credentials-281474976711481.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/028-delete-v7-credentials-281474976711482.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/028-delete-v7-credentials-281474976711482.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/028-delete-v7-credentials-281474976711482.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/028-delete-v7-credentials-281474976711482.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/029-get-v7-credentials.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/029-get-v7-credentials.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/interactions/029-get-v7-credentials.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/interactions/029-get-v7-credentials.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/metadata.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/metadata.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/metadata.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/report.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/report.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/report.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/report.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/plan.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/plan.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/scenario.json diff --git a/probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/subject.json b/recordings/thousandeyes/credential/7.0.97-t1785500668022/subject.json similarity index 100% rename from probe-evidence/thousandeyes/credential/7.0.97-t1785500668022/subject.json rename to recordings/thousandeyes/credential/7.0.97-t1785500668022/subject.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/facts.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/facts.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/facts.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/facts.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/001-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/001-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/001-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/001-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/002-get-v7-dashboards-999999999.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/002-get-v7-dashboards-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/002-get-v7-dashboards-999999999.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/002-get-v7-dashboards-999999999.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/003-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/003-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/003-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/003-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/004-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/004-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/004-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/004-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/005-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/005-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/005-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/005-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/006-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/006-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/006-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/006-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/007-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/007-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/007-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/007-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/008-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/008-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/008-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/008-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/009-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/009-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/009-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/009-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/010-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/010-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/010-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/010-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/011-delete-v7-dashboards-6a70acf00a9af02cfed906fc.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/011-delete-v7-dashboards-6a70acf00a9af02cfed906fc.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/011-delete-v7-dashboards-6a70acf00a9af02cfed906fc.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/011-delete-v7-dashboards-6a70acf00a9af02cfed906fc.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/012-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/012-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/012-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/012-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/013-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/013-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/013-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/013-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/014-get-v7-dashboards-6a70acf40a9af02cfed906fd.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/014-get-v7-dashboards-6a70acf40a9af02cfed906fd.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/014-get-v7-dashboards-6a70acf40a9af02cfed906fd.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/014-get-v7-dashboards-6a70acf40a9af02cfed906fd.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/015-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/015-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/015-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/015-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/016-get-v7-dashboards-6a70acf423c6477f30b56edf.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/016-get-v7-dashboards-6a70acf423c6477f30b56edf.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/016-get-v7-dashboards-6a70acf423c6477f30b56edf.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/016-get-v7-dashboards-6a70acf423c6477f30b56edf.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/017-delete-v7-dashboards-6a70acf40a9af02cfed906fd.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/017-delete-v7-dashboards-6a70acf40a9af02cfed906fd.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/017-delete-v7-dashboards-6a70acf40a9af02cfed906fd.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/017-delete-v7-dashboards-6a70acf40a9af02cfed906fd.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/018-delete-v7-dashboards-6a70acf423c6477f30b56edf.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/018-delete-v7-dashboards-6a70acf423c6477f30b56edf.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/018-delete-v7-dashboards-6a70acf423c6477f30b56edf.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/018-delete-v7-dashboards-6a70acf423c6477f30b56edf.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/019-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/019-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/019-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/019-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/020-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/020-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/020-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/020-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/021-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/021-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/021-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/021-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/022-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/022-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/022-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/022-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/023-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/023-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/023-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/023-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/024-delete-v7-dashboards-6a70acf70fca20f23552cd00.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/024-delete-v7-dashboards-6a70acf70fca20f23552cd00.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/024-delete-v7-dashboards-6a70acf70fca20f23552cd00.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/024-delete-v7-dashboards-6a70acf70fca20f23552cd00.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/025-delete-v7-dashboards-6a70acf723c6477f30b56efc.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/025-delete-v7-dashboards-6a70acf723c6477f30b56efc.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/025-delete-v7-dashboards-6a70acf723c6477f30b56efc.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/025-delete-v7-dashboards-6a70acf723c6477f30b56efc.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/026-delete-v7-dashboards-6a70acf80fca20f23552cd01.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/026-delete-v7-dashboards-6a70acf80fca20f23552cd01.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/026-delete-v7-dashboards-6a70acf80fca20f23552cd01.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/026-delete-v7-dashboards-6a70acf80fca20f23552cd01.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/027-delete-v7-dashboards-6a70acf8cc53e1360226110f.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/027-delete-v7-dashboards-6a70acf8cc53e1360226110f.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/027-delete-v7-dashboards-6a70acf8cc53e1360226110f.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/027-delete-v7-dashboards-6a70acf8cc53e1360226110f.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/028-delete-v7-dashboards-6a70acf90fca20f23552cd05.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/028-delete-v7-dashboards-6a70acf90fca20f23552cd05.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/028-delete-v7-dashboards-6a70acf90fca20f23552cd05.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/028-delete-v7-dashboards-6a70acf90fca20f23552cd05.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/029-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/029-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/029-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/029-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/030-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/030-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/030-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/030-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/031-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/031-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/031-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/031-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/032-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/032-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/032-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/032-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/033-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/033-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/033-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/033-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/034-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/034-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/034-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/034-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/035-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/035-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/035-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/035-put-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/036-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/036-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/036-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/036-get-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/037-delete-v7-dashboards-6a70acfc0fca20f23552cd0a.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/037-delete-v7-dashboards-6a70acfc0fca20f23552cd0a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/037-delete-v7-dashboards-6a70acfc0fca20f23552cd0a.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/037-delete-v7-dashboards-6a70acfc0fca20f23552cd0a.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/038-post-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/038-post-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/038-post-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/038-post-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/039-get-v7-dashboards-6a70ad000a9af02cfed90713.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/039-get-v7-dashboards-6a70ad000a9af02cfed90713.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/039-get-v7-dashboards-6a70ad000a9af02cfed90713.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/039-get-v7-dashboards-6a70ad000a9af02cfed90713.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/040-put-v7-dashboards-6a70ad000a9af02cfed90713.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/040-put-v7-dashboards-6a70ad000a9af02cfed90713.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/040-put-v7-dashboards-6a70ad000a9af02cfed90713.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/040-put-v7-dashboards-6a70ad000a9af02cfed90713.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/041-get-v7-dashboards-6a70ad000a9af02cfed90713.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/041-get-v7-dashboards-6a70ad000a9af02cfed90713.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/041-get-v7-dashboards-6a70ad000a9af02cfed90713.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/041-get-v7-dashboards-6a70ad000a9af02cfed90713.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/042-delete-v7-dashboards-6a70ad000a9af02cfed90713.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/042-delete-v7-dashboards-6a70ad000a9af02cfed90713.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/042-delete-v7-dashboards-6a70ad000a9af02cfed90713.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/042-delete-v7-dashboards-6a70ad000a9af02cfed90713.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/043-get-v7-dashboards.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/043-get-v7-dashboards.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/043-get-v7-dashboards.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/interactions/043-get-v7-dashboards.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/metadata.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/metadata.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/metadata.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/rehearsal.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/rehearsal.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/rehearsal.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/report.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/report.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/report.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/report.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/plan.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/plan.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/scenario.json diff --git a/probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/subject.json b/recordings/thousandeyes/dashboard/7.0.98-t1785769218413/subject.json similarity index 100% rename from probe-evidence/thousandeyes/dashboard/7.0.98-t1785769218413/subject.json rename to recordings/thousandeyes/dashboard/7.0.98-t1785769218413/subject.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/facts.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/facts.json similarity index 92% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/facts.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/facts.json index 8d9022c2..011de9f2 100644 --- a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/facts.json +++ b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/facts.json @@ -1,6 +1,6 @@ [ { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "errorEnvelope", "value": { "text": "404=problem" @@ -13,7 +13,7 @@ "rationale": "a 404 response used the problem error shape" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.delete.notFoundIsSuccess", "value": { "bool": true @@ -29,7 +29,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.readBack", "value": { "readBack": { @@ -57,7 +57,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.updateStyle", "value": { "text": "putFull" @@ -74,7 +74,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "unknownParamTolerated", "value": { "bool": true @@ -98,7 +98,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "requiredByApi", "value": { @@ -115,7 +115,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnCreate", "value": { @@ -129,7 +129,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnRead", "value": { @@ -143,7 +143,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnUpdate", "value": { @@ -157,7 +157,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "returnedOnCreate", "value": { @@ -171,7 +171,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "returnedOnRead", "value": { @@ -185,7 +185,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "serverDefault", "value": { @@ -207,7 +207,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "returnedOnCreate", "value": { @@ -221,7 +221,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "returnedOnRead", "value": { @@ -235,7 +235,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "serverDefault", "value": { @@ -254,7 +254,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "returnedOnCreate", "value": { @@ -268,7 +268,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "returnedOnRead", "value": { @@ -282,7 +282,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "serverDefault", "value": { @@ -304,7 +304,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "returnedOnCreate", "value": { @@ -318,7 +318,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "returnedOnRead", "value": { @@ -332,7 +332,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "serverDefault", "value": { @@ -351,7 +351,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "returnedOnCreate", "value": { @@ -365,7 +365,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "returnedOnRead", "value": { @@ -379,7 +379,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "serverDefault", "value": { @@ -398,7 +398,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "requiredByApi", "value": { @@ -412,7 +412,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnCreate", "value": { @@ -426,7 +426,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnRead", "value": { @@ -440,7 +440,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnUpdate", "value": { @@ -454,7 +454,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "field": "returnedOnCreate", "value": { @@ -468,7 +468,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "field": "returnedOnRead", "value": { diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/001-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/001-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/001-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/001-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/002-get-v7-dashboards-filters-999999999.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/002-get-v7-dashboards-filters-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/002-get-v7-dashboards-filters-999999999.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/002-get-v7-dashboards-filters-999999999.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/003-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/003-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/003-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/003-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/004-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/004-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/004-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/004-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/005-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/005-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/005-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/005-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/006-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/006-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/006-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/006-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/007-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/007-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/007-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/007-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/008-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/008-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/008-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/008-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/009-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/009-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/009-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/009-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/010-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/010-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/010-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/010-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/011-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/011-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/011-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/011-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/012-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/012-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/012-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/012-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/013-delete-v7-dashboards-filters-6a70ad060a9af02cfed9071a.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/013-delete-v7-dashboards-filters-6a70ad060a9af02cfed9071a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/013-delete-v7-dashboards-filters-6a70ad060a9af02cfed9071a.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/013-delete-v7-dashboards-filters-6a70ad060a9af02cfed9071a.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/014-delete-v7-dashboards-filters-6a70ad070fca20f23552cd22.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/014-delete-v7-dashboards-filters-6a70ad070fca20f23552cd22.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/014-delete-v7-dashboards-filters-6a70ad070fca20f23552cd22.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/014-delete-v7-dashboards-filters-6a70ad070fca20f23552cd22.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/015-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/015-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/015-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/015-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/016-get-v7-dashboards-filters-6a70ad08cc53e1360226111f.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/016-get-v7-dashboards-filters-6a70ad08cc53e1360226111f.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/016-get-v7-dashboards-filters-6a70ad08cc53e1360226111f.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/016-get-v7-dashboards-filters-6a70ad08cc53e1360226111f.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/017-delete-v7-dashboards-filters-6a70ad08cc53e1360226111f.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/017-delete-v7-dashboards-filters-6a70ad08cc53e1360226111f.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/017-delete-v7-dashboards-filters-6a70ad08cc53e1360226111f.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/017-delete-v7-dashboards-filters-6a70ad08cc53e1360226111f.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/018-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/018-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/018-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/018-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/019-get-v7-dashboards-filters-6a70ad09cc53e13602261129.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/019-get-v7-dashboards-filters-6a70ad09cc53e13602261129.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/019-get-v7-dashboards-filters-6a70ad09cc53e13602261129.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/019-get-v7-dashboards-filters-6a70ad09cc53e13602261129.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/020-put-v7-dashboards-filters-6a70ad09cc53e13602261129.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/020-put-v7-dashboards-filters-6a70ad09cc53e13602261129.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/020-put-v7-dashboards-filters-6a70ad09cc53e13602261129.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/020-put-v7-dashboards-filters-6a70ad09cc53e13602261129.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/021-delete-v7-dashboards-filters-6a70ad09cc53e13602261129.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/021-delete-v7-dashboards-filters-6a70ad09cc53e13602261129.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/021-delete-v7-dashboards-filters-6a70ad09cc53e13602261129.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/021-delete-v7-dashboards-filters-6a70ad09cc53e13602261129.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/022-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/022-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/022-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/022-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/023-get-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/023-get-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/023-get-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/023-get-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/024-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/024-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/024-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/024-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/025-get-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/025-get-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/025-get-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/025-get-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/026-delete-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/026-delete-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/026-delete-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/026-delete-v7-dashboards-filters-6a70ad0a0fca20f23552cd30.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/027-delete-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/027-delete-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/027-delete-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/027-delete-v7-dashboards-filters-6a70ad0b23c6477f30b56f3f.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/028-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/028-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/028-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/028-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/029-get-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/029-get-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/029-get-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/029-get-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/030-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/030-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/030-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/030-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/031-get-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/031-get-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/031-get-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/031-get-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/032-delete-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/032-delete-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/032-delete-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/032-delete-v7-dashboards-filters-6a70ad0c23c6477f30b56f4a.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/033-delete-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/033-delete-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/033-delete-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/033-delete-v7-dashboards-filters-6a70ad0d23c6477f30b56f4b.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/034-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/034-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/034-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/034-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/035-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/035-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/035-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/035-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/036-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/036-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/036-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/036-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/037-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/037-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/037-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/037-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/038-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/038-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/038-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/038-put-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/039-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/039-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/039-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/039-get-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/040-delete-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/040-delete-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/040-delete-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/040-delete-v7-dashboards-filters-6a70ad0e23c6477f30b56f57.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/041-post-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/041-post-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/041-post-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/041-post-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/042-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/042-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/042-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/042-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/043-put-v7-dashboards-filters-6a70ad110a9af02cfed90743.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/043-put-v7-dashboards-filters-6a70ad110a9af02cfed90743.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/043-put-v7-dashboards-filters-6a70ad110a9af02cfed90743.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/043-put-v7-dashboards-filters-6a70ad110a9af02cfed90743.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/044-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/044-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/044-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/044-get-v7-dashboards-filters-6a70ad110a9af02cfed90743.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/045-delete-v7-dashboards-filters-6a70ad110a9af02cfed90743.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/045-delete-v7-dashboards-filters-6a70ad110a9af02cfed90743.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/045-delete-v7-dashboards-filters-6a70ad110a9af02cfed90743.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/045-delete-v7-dashboards-filters-6a70ad110a9af02cfed90743.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/046-get-v7-dashboards-filters.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/046-get-v7-dashboards-filters.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/interactions/046-get-v7-dashboards-filters.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/interactions/046-get-v7-dashboards-filters.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/metadata.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/metadata.json similarity index 88% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/metadata.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/metadata.json index e34f39aa..89540929 100644 --- a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/metadata.json +++ b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/metadata.json @@ -1,6 +1,6 @@ { "provider": "thousandeyes", - "resource": "dashboards_filter", + "resource": "dashboard_filter", "apiVersion": "7.0.98", "host": "api.thousandeyes.com", "basePath": "/v7", diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/rehearsal.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/rehearsal.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/rehearsal.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/report.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/report.json similarity index 92% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/report.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/report.json index a217052d..51d5655b 100644 --- a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/report.json +++ b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/report.json @@ -21,7 +21,7 @@ }, "facts": [ { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "errorEnvelope", "value": { "text": "404=problem" @@ -34,7 +34,7 @@ "rationale": "a 404 response used the problem error shape" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.delete.notFoundIsSuccess", "value": { "bool": true @@ -50,7 +50,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.readBack", "value": { "readBack": { @@ -78,7 +78,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "policy.updateStyle", "value": { "text": "putFull" @@ -95,7 +95,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "field": "unknownParamTolerated", "value": { "bool": true @@ -119,7 +119,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "requiredByApi", "value": { @@ -136,7 +136,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnCreate", "value": { @@ -150,7 +150,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnRead", "value": { @@ -164,7 +164,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "field": "returnedOnUpdate", "value": { @@ -178,7 +178,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "returnedOnCreate", "value": { @@ -192,7 +192,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "returnedOnRead", "value": { @@ -206,7 +206,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "field": "serverDefault", "value": { @@ -228,7 +228,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "returnedOnCreate", "value": { @@ -242,7 +242,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "returnedOnRead", "value": { @@ -256,7 +256,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "field": "serverDefault", "value": { @@ -275,7 +275,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "returnedOnCreate", "value": { @@ -289,7 +289,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "returnedOnRead", "value": { @@ -303,7 +303,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "field": "serverDefault", "value": { @@ -325,7 +325,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "returnedOnCreate", "value": { @@ -339,7 +339,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "returnedOnRead", "value": { @@ -353,7 +353,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "field": "serverDefault", "value": { @@ -372,7 +372,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "returnedOnCreate", "value": { @@ -386,7 +386,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "returnedOnRead", "value": { @@ -400,7 +400,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "field": "serverDefault", "value": { @@ -419,7 +419,7 @@ ] }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "requiredByApi", "value": { @@ -433,7 +433,7 @@ "rationale": "a create omitting this field succeeded in 1 fixture(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnCreate", "value": { @@ -447,7 +447,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnRead", "value": { @@ -461,7 +461,7 @@ "rationale": "the field appeared in the read after 1 create(s)" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "field": "returnedOnUpdate", "value": { @@ -475,7 +475,7 @@ "rationale": "the update response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "field": "returnedOnCreate", "value": { @@ -489,7 +489,7 @@ "rationale": "every create response carried the field it was sent" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "field": "returnedOnRead", "value": { @@ -505,102 +505,102 @@ ], "notes": [ { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "read.error-envelope", "message": "no candidate query parameter (limit, max, offset, page) was validated, so no error shape was observed without mutating anything" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "read.volatile", "message": "no existing object to read repeatedly, so volatility was not observed" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "read.returned-weak", "message": "no existing object to read, so no field presence was observed" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "write.immutability", "message": "no field carries two or more candidate values, so no field can be probed for immutability: the fact requires two distinct values both refused, and one candidate cannot supply that" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "write.enum", "message": "no sendable field carries documented enum values, so there is no specification claim to check against the API" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "read.list-shape", "message": "the collection is empty, so no item shape was observed and later probes have no fixture to draw on" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "probe": "write.side-effect", "message": "the plan declares no field whose value might affect another, so there is no suspected trigger to perturb; declare one under defaultInfluencers" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.dataSourceId", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.filterId", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.metricIds", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "context.filters.values", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "description", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "probe": "write.normalisation", "message": "\"letter case is changed\" could not be sent for this field because it carries the sweeper's name prefix and the awkward shape would destroy it, so this transform is unprobed for it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "probe": "write.normalisation", "message": "\"surrounding whitespace is stripped\" could not be sent for this field because it carries the sweeper's name prefix and the awkward shape would destroy it, so this transform is unprobed for it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "probe": "write.writable-returned", "message": "the field was returned, but one round cannot separate \"the server stored what was sent\" from \"the server returned its own value\"; a second fixture sending a different value would settle it" }, { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "jsonPath": "name", "probe": "write.required", "message": "this field carries the sweeper's name prefix, so a create omitting it would produce an object that could not be found again and is refused before it is sent; its requiredness is therefore unprobed" diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/plan.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/plan.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/scenario.json diff --git a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/subject.json b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/subject.json similarity index 99% rename from probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/subject.json rename to recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/subject.json index c390ed7b..78d58c46 100644 --- a/probe-evidence/thousandeyes/dashboards_filter/7.0.98-t1785769235108/subject.json +++ b/recordings/thousandeyes/dashboard_filter/7.0.98-t1785769235108/subject.json @@ -1,5 +1,5 @@ { - "resource": "dashboards_filter", + "resource": "dashboard_filter", "collectionTemplate": "/dashboards/filters", "itemTemplate": "/dashboards/filters/{id}", "create": { diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/facts.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/facts.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/facts.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/facts.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/001-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/001-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/001-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/001-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/002-get-v7-endpoint-labels-999999999.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/002-get-v7-endpoint-labels-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/002-get-v7-endpoint-labels-999999999.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/002-get-v7-endpoint-labels-999999999.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/003-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/003-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/003-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/003-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/004-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/004-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/004-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/004-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/005-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/005-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/005-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/005-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/006-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/006-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/006-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/006-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/007-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/007-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/007-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/007-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/008-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/008-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/008-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/008-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/009-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/009-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/009-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/009-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/010-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/010-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/010-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/010-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/011-delete-v7-endpoint-labels-422212465108188.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/011-delete-v7-endpoint-labels-422212465108188.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/011-delete-v7-endpoint-labels-422212465108188.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/011-delete-v7-endpoint-labels-422212465108188.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/012-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/012-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/012-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/012-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/013-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/013-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/013-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/013-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/014-get-v7-endpoint-labels-422212465108189.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/014-get-v7-endpoint-labels-422212465108189.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/014-get-v7-endpoint-labels-422212465108189.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/014-get-v7-endpoint-labels-422212465108189.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/015-patch-v7-endpoint-labels-422212465108189.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/015-patch-v7-endpoint-labels-422212465108189.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/015-patch-v7-endpoint-labels-422212465108189.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/015-patch-v7-endpoint-labels-422212465108189.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/016-get-v7-endpoint-labels-422212465108189.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/016-get-v7-endpoint-labels-422212465108189.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/016-get-v7-endpoint-labels-422212465108189.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/016-get-v7-endpoint-labels-422212465108189.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/017-delete-v7-endpoint-labels-422212465108189.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/017-delete-v7-endpoint-labels-422212465108189.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/017-delete-v7-endpoint-labels-422212465108189.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/017-delete-v7-endpoint-labels-422212465108189.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/018-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/018-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/018-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/018-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/019-get-v7-endpoint-labels-422212465108190.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/019-get-v7-endpoint-labels-422212465108190.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/019-get-v7-endpoint-labels-422212465108190.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/019-get-v7-endpoint-labels-422212465108190.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/020-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/020-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/020-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/020-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/021-get-v7-endpoint-labels-422212465108191.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/021-get-v7-endpoint-labels-422212465108191.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/021-get-v7-endpoint-labels-422212465108191.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/021-get-v7-endpoint-labels-422212465108191.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/022-delete-v7-endpoint-labels-422212465108190.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/022-delete-v7-endpoint-labels-422212465108190.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/022-delete-v7-endpoint-labels-422212465108190.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/022-delete-v7-endpoint-labels-422212465108190.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/023-delete-v7-endpoint-labels-422212465108191.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/023-delete-v7-endpoint-labels-422212465108191.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/023-delete-v7-endpoint-labels-422212465108191.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/023-delete-v7-endpoint-labels-422212465108191.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/024-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/024-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/024-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/024-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/025-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/025-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/025-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/025-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/026-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/026-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/026-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/026-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/027-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/027-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/027-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/027-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/028-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/028-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/028-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/028-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/029-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/029-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/029-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/029-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/030-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/030-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/030-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/030-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/031-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/031-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/031-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/031-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/032-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/032-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/032-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/032-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/033-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/033-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/033-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/033-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/034-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/034-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/034-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/034-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/035-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/035-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/035-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/035-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/036-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/036-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/036-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/036-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/037-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/037-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/037-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/037-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/038-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/038-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/038-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/038-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/039-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/039-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/039-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/039-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/040-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/040-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/040-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/040-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/041-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/041-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/041-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/041-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/042-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/042-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/042-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/042-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/043-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/043-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/043-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/043-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/044-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/044-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/044-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/044-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/045-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/045-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/045-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/045-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/046-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/046-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/046-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/046-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/047-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/047-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/047-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/047-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/048-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/048-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/048-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/048-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/049-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/049-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/049-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/049-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/050-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/050-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/050-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/050-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/051-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/051-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/051-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/051-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/052-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/052-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/052-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/052-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/053-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/053-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/053-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/053-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/054-delete-v7-endpoint-labels-422212465108192.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/054-delete-v7-endpoint-labels-422212465108192.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/054-delete-v7-endpoint-labels-422212465108192.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/054-delete-v7-endpoint-labels-422212465108192.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/055-delete-v7-endpoint-labels-422212465108193.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/055-delete-v7-endpoint-labels-422212465108193.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/055-delete-v7-endpoint-labels-422212465108193.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/055-delete-v7-endpoint-labels-422212465108193.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/056-delete-v7-endpoint-labels-422212465108194.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/056-delete-v7-endpoint-labels-422212465108194.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/056-delete-v7-endpoint-labels-422212465108194.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/056-delete-v7-endpoint-labels-422212465108194.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/057-delete-v7-endpoint-labels-422212465108195.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/057-delete-v7-endpoint-labels-422212465108195.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/057-delete-v7-endpoint-labels-422212465108195.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/057-delete-v7-endpoint-labels-422212465108195.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/058-delete-v7-endpoint-labels-422212465108196.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/058-delete-v7-endpoint-labels-422212465108196.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/058-delete-v7-endpoint-labels-422212465108196.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/058-delete-v7-endpoint-labels-422212465108196.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/059-delete-v7-endpoint-labels-422212465108197.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/059-delete-v7-endpoint-labels-422212465108197.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/059-delete-v7-endpoint-labels-422212465108197.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/059-delete-v7-endpoint-labels-422212465108197.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/060-delete-v7-endpoint-labels-422212465108198.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/060-delete-v7-endpoint-labels-422212465108198.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/060-delete-v7-endpoint-labels-422212465108198.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/060-delete-v7-endpoint-labels-422212465108198.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/061-delete-v7-endpoint-labels-422212465108199.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/061-delete-v7-endpoint-labels-422212465108199.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/061-delete-v7-endpoint-labels-422212465108199.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/061-delete-v7-endpoint-labels-422212465108199.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/062-delete-v7-endpoint-labels-422212465108200.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/062-delete-v7-endpoint-labels-422212465108200.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/062-delete-v7-endpoint-labels-422212465108200.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/062-delete-v7-endpoint-labels-422212465108200.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/063-delete-v7-endpoint-labels-422212465108201.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/063-delete-v7-endpoint-labels-422212465108201.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/063-delete-v7-endpoint-labels-422212465108201.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/063-delete-v7-endpoint-labels-422212465108201.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/064-delete-v7-endpoint-labels-422212465108202.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/064-delete-v7-endpoint-labels-422212465108202.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/064-delete-v7-endpoint-labels-422212465108202.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/064-delete-v7-endpoint-labels-422212465108202.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/065-delete-v7-endpoint-labels-422212465108203.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/065-delete-v7-endpoint-labels-422212465108203.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/065-delete-v7-endpoint-labels-422212465108203.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/065-delete-v7-endpoint-labels-422212465108203.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/066-delete-v7-endpoint-labels-422212465108204.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/066-delete-v7-endpoint-labels-422212465108204.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/066-delete-v7-endpoint-labels-422212465108204.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/066-delete-v7-endpoint-labels-422212465108204.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/067-delete-v7-endpoint-labels-422212465108205.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/067-delete-v7-endpoint-labels-422212465108205.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/067-delete-v7-endpoint-labels-422212465108205.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/067-delete-v7-endpoint-labels-422212465108205.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/068-delete-v7-endpoint-labels-422212465108206.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/068-delete-v7-endpoint-labels-422212465108206.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/068-delete-v7-endpoint-labels-422212465108206.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/068-delete-v7-endpoint-labels-422212465108206.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/069-delete-v7-endpoint-labels-422212465108207.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/069-delete-v7-endpoint-labels-422212465108207.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/069-delete-v7-endpoint-labels-422212465108207.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/069-delete-v7-endpoint-labels-422212465108207.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/070-delete-v7-endpoint-labels-422212465108208.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/070-delete-v7-endpoint-labels-422212465108208.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/070-delete-v7-endpoint-labels-422212465108208.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/070-delete-v7-endpoint-labels-422212465108208.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/071-delete-v7-endpoint-labels-422212465108209.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/071-delete-v7-endpoint-labels-422212465108209.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/071-delete-v7-endpoint-labels-422212465108209.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/071-delete-v7-endpoint-labels-422212465108209.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/072-delete-v7-endpoint-labels-422212465108210.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/072-delete-v7-endpoint-labels-422212465108210.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/072-delete-v7-endpoint-labels-422212465108210.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/072-delete-v7-endpoint-labels-422212465108210.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/073-delete-v7-endpoint-labels-422212465108211.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/073-delete-v7-endpoint-labels-422212465108211.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/073-delete-v7-endpoint-labels-422212465108211.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/073-delete-v7-endpoint-labels-422212465108211.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/074-delete-v7-endpoint-labels-422212465108212.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/074-delete-v7-endpoint-labels-422212465108212.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/074-delete-v7-endpoint-labels-422212465108212.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/074-delete-v7-endpoint-labels-422212465108212.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/075-delete-v7-endpoint-labels-422212465108213.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/075-delete-v7-endpoint-labels-422212465108213.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/075-delete-v7-endpoint-labels-422212465108213.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/075-delete-v7-endpoint-labels-422212465108213.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/076-delete-v7-endpoint-labels-422212465108214.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/076-delete-v7-endpoint-labels-422212465108214.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/076-delete-v7-endpoint-labels-422212465108214.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/076-delete-v7-endpoint-labels-422212465108214.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/077-delete-v7-endpoint-labels-422212465108215.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/077-delete-v7-endpoint-labels-422212465108215.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/077-delete-v7-endpoint-labels-422212465108215.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/077-delete-v7-endpoint-labels-422212465108215.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/078-delete-v7-endpoint-labels-422212465108216.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/078-delete-v7-endpoint-labels-422212465108216.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/078-delete-v7-endpoint-labels-422212465108216.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/078-delete-v7-endpoint-labels-422212465108216.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/079-delete-v7-endpoint-labels-422212465108217.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/079-delete-v7-endpoint-labels-422212465108217.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/079-delete-v7-endpoint-labels-422212465108217.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/079-delete-v7-endpoint-labels-422212465108217.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/080-delete-v7-endpoint-labels-422212465108218.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/080-delete-v7-endpoint-labels-422212465108218.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/080-delete-v7-endpoint-labels-422212465108218.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/080-delete-v7-endpoint-labels-422212465108218.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/081-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/081-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/081-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/081-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/082-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/082-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/082-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/082-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/083-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/083-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/083-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/083-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/084-get-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/084-get-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/084-get-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/084-get-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/085-patch-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/085-patch-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/085-patch-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/085-patch-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/086-get-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/086-get-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/086-get-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/086-get-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/087-patch-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/087-patch-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/087-patch-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/087-patch-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/088-get-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/088-get-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/088-get-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/088-get-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/089-delete-v7-endpoint-labels-422212465108219.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/089-delete-v7-endpoint-labels-422212465108219.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/089-delete-v7-endpoint-labels-422212465108219.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/089-delete-v7-endpoint-labels-422212465108219.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/090-post-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/090-post-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/090-post-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/090-post-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/091-get-v7-endpoint-labels-422212465108220.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/091-get-v7-endpoint-labels-422212465108220.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/091-get-v7-endpoint-labels-422212465108220.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/091-get-v7-endpoint-labels-422212465108220.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/092-patch-v7-endpoint-labels-422212465108220.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/092-patch-v7-endpoint-labels-422212465108220.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/092-patch-v7-endpoint-labels-422212465108220.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/092-patch-v7-endpoint-labels-422212465108220.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/093-get-v7-endpoint-labels-422212465108220.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/093-get-v7-endpoint-labels-422212465108220.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/093-get-v7-endpoint-labels-422212465108220.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/093-get-v7-endpoint-labels-422212465108220.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/094-delete-v7-endpoint-labels-422212465108220.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/094-delete-v7-endpoint-labels-422212465108220.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/094-delete-v7-endpoint-labels-422212465108220.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/094-delete-v7-endpoint-labels-422212465108220.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/095-get-v7-endpoint-labels.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/095-get-v7-endpoint-labels.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/095-get-v7-endpoint-labels.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/interactions/095-get-v7-endpoint-labels.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/metadata.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/metadata.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/metadata.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/rehearsal.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/rehearsal.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/rehearsal.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/report.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/report.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/report.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/report.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/plan.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/plan.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/scenario.json diff --git a/probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/subject.json b/recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/subject.json similarity index 100% rename from probe-evidence/thousandeyes/endpoint_label/7.0.98-t1785833092712/subject.json rename to recordings/thousandeyes/endpoint_label/7.0.98-t1785833092712/subject.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/facts.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/facts.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/facts.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/facts.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/metadata.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/metadata.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/metadata.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/report.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/report.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/report.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/report.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/plan.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/plan.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/scenario.json diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/subject.json b/recordings/thousandeyes/role/7.0.98-t1785772662063/subject.json similarity index 100% rename from probe-evidence/thousandeyes/role/7.0.98-t1785772662063/subject.json rename to recordings/thousandeyes/role/7.0.98-t1785772662063/subject.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/facts.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/facts.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/facts.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/001-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/001-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/001-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/001-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/002-get-v7-tags-999999999.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/002-get-v7-tags-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/002-get-v7-tags-999999999.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/002-get-v7-tags-999999999.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/003-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/003-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/003-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/003-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/004-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/004-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/004-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/004-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/005-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/005-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/005-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/005-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/006-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/006-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/006-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/006-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/007-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/007-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/007-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/007-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/008-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/008-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/008-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/008-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/009-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/009-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/009-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/009-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/010-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/010-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/010-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/010-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/011-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/011-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/011-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/011-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/012-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/012-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/012-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/012-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/013-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/013-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/013-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/013-get-v7-tags-a77bf985-e99c-4317-838d-eabfbc81feb2.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/014-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/014-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/014-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/014-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/015-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/015-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/015-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/015-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/016-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/016-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/016-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/016-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/017-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/017-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/017-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/017-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/018-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/018-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/018-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/018-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/019-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/019-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/019-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/019-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/020-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/020-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/020-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/020-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/021-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/021-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/021-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/021-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/022-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/022-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/022-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/022-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/023-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/023-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/023-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/023-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/024-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/024-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/024-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/024-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/025-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/025-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/025-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/025-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/026-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/026-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/026-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/026-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/027-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/027-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/027-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/027-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/028-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/028-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/028-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/028-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/029-delete-v7-tags-6756bec4-d09b-44d9-841d-559ddf24f9fa.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/029-delete-v7-tags-6756bec4-d09b-44d9-841d-559ddf24f9fa.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/029-delete-v7-tags-6756bec4-d09b-44d9-841d-559ddf24f9fa.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/029-delete-v7-tags-6756bec4-d09b-44d9-841d-559ddf24f9fa.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/030-delete-v7-tags-b1c4a105-d558-4232-a183-83cc61fb9941.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/030-delete-v7-tags-b1c4a105-d558-4232-a183-83cc61fb9941.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/030-delete-v7-tags-b1c4a105-d558-4232-a183-83cc61fb9941.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/030-delete-v7-tags-b1c4a105-d558-4232-a183-83cc61fb9941.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/031-delete-v7-tags-9c0b36e4-57ef-4ca5-b008-872f8588f1a5.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/031-delete-v7-tags-9c0b36e4-57ef-4ca5-b008-872f8588f1a5.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/031-delete-v7-tags-9c0b36e4-57ef-4ca5-b008-872f8588f1a5.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/031-delete-v7-tags-9c0b36e4-57ef-4ca5-b008-872f8588f1a5.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/032-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/032-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/032-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/032-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/033-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/033-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/033-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/033-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/034-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/034-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/034-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/034-get-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/035-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/035-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/035-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/035-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/036-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/036-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/036-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/036-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/037-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/037-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/037-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/037-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/038-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/038-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/038-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/038-get-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/039-delete-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/039-delete-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/039-delete-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/039-delete-v7-tags-cc4876e1-0590-4f92-9cf0-6eeb5b8cd3e0.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/040-delete-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/040-delete-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/040-delete-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/040-delete-v7-tags-e9d496fa-339f-44ec-a9c4-f1fa0e66d219.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/041-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/041-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/041-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/041-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/042-get-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/042-get-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/042-get-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/042-get-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/043-put-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/043-put-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/043-put-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/043-put-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/044-delete-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/044-delete-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/044-delete-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/044-delete-v7-tags-adf344f4-02cf-439d-84b7-9dc830a86a26.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/045-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/045-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/045-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/045-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/046-get-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/046-get-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/046-get-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/046-get-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/047-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/047-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/047-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/047-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/048-get-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/048-get-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/048-get-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/048-get-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/049-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/049-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/049-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/049-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/050-get-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/050-get-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/050-get-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/050-get-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/051-delete-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/051-delete-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/051-delete-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/051-delete-v7-tags-06d73295-69f9-4efe-a656-ff135480d059.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/052-delete-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/052-delete-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/052-delete-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/052-delete-v7-tags-249951a7-c76e-4789-834f-47b80cdf1409.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/053-delete-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/053-delete-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/053-delete-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/053-delete-v7-tags-39206999-5104-4091-80e6-150da8420b7b.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/054-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/054-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/054-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/054-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/055-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/055-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/055-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/055-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/056-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/056-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/056-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/056-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/057-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/057-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/057-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/057-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/058-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/058-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/058-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/058-put-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/059-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/059-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/059-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/059-get-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/060-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/060-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/060-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/060-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/061-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/061-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/061-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/061-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/062-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/062-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/062-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/062-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/063-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/063-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/063-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/063-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/064-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/064-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/064-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/064-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/065-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/065-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/065-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/065-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/066-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/066-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/066-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/066-put-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/067-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/067-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/067-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/067-get-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/068-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/068-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/068-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/068-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/069-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/069-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/069-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/069-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/070-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/070-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/070-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/070-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/071-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/071-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/071-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/071-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/072-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/072-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/072-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/072-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/073-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/073-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/073-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/073-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/074-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/074-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/074-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/074-put-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/075-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/075-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/075-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/075-get-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/076-delete-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/076-delete-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/076-delete-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/076-delete-v7-tags-0fae749c-7cb5-418c-9641-7bcd4844eac4.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/077-delete-v7-tags-32bb772f-577c-47be-9990-fa047b673ae0.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/077-delete-v7-tags-32bb772f-577c-47be-9990-fa047b673ae0.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/077-delete-v7-tags-32bb772f-577c-47be-9990-fa047b673ae0.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/077-delete-v7-tags-32bb772f-577c-47be-9990-fa047b673ae0.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/078-delete-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/078-delete-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/078-delete-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/078-delete-v7-tags-ded128e9-00ae-43ad-9b39-324c38e41dfe.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/079-delete-v7-tags-2fb8bac5-331c-4d45-bb47-2d65859f57de.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/079-delete-v7-tags-2fb8bac5-331c-4d45-bb47-2d65859f57de.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/079-delete-v7-tags-2fb8bac5-331c-4d45-bb47-2d65859f57de.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/079-delete-v7-tags-2fb8bac5-331c-4d45-bb47-2d65859f57de.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/080-delete-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/080-delete-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/080-delete-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/080-delete-v7-tags-a8cb0ab8-9ab0-41ce-9281-9ef263e73b71.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/081-delete-v7-tags-fec75c57-6175-48c0-8fd5-bf9d03e5eede.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/081-delete-v7-tags-fec75c57-6175-48c0-8fd5-bf9d03e5eede.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/081-delete-v7-tags-fec75c57-6175-48c0-8fd5-bf9d03e5eede.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/081-delete-v7-tags-fec75c57-6175-48c0-8fd5-bf9d03e5eede.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/082-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/082-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/082-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/082-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/083-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/083-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/083-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/083-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/084-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/084-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/084-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/084-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/085-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/085-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/085-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/085-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/086-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/086-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/086-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/086-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/087-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/087-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/087-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/087-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/088-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/088-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/088-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/088-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/089-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/089-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/089-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/089-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/090-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/090-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/090-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/090-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/091-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/091-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/091-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/091-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/092-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/092-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/092-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/092-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/093-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/093-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/093-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/093-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/094-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/094-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/094-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/094-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/095-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/095-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/095-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/095-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/096-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/096-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/096-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/096-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/097-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/097-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/097-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/097-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/098-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/098-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/098-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/098-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/099-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/099-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/099-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/099-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/100-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/100-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/100-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/100-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/101-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/101-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/101-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/101-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/102-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/102-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/102-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/102-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/103-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/103-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/103-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/103-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/104-delete-v7-tags-d84f9860-c520-4833-8184-ab9e51ea33bf.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/104-delete-v7-tags-d84f9860-c520-4833-8184-ab9e51ea33bf.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/104-delete-v7-tags-d84f9860-c520-4833-8184-ab9e51ea33bf.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/104-delete-v7-tags-d84f9860-c520-4833-8184-ab9e51ea33bf.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/105-delete-v7-tags-de4cebb2-a124-4d95-98f0-ff62e0cd6419.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/105-delete-v7-tags-de4cebb2-a124-4d95-98f0-ff62e0cd6419.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/105-delete-v7-tags-de4cebb2-a124-4d95-98f0-ff62e0cd6419.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/105-delete-v7-tags-de4cebb2-a124-4d95-98f0-ff62e0cd6419.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/106-delete-v7-tags-63cc1a5c-0b59-4301-ac73-64aeb1da3d54.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/106-delete-v7-tags-63cc1a5c-0b59-4301-ac73-64aeb1da3d54.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/106-delete-v7-tags-63cc1a5c-0b59-4301-ac73-64aeb1da3d54.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/106-delete-v7-tags-63cc1a5c-0b59-4301-ac73-64aeb1da3d54.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/107-delete-v7-tags-1a4679fe-dcd9-4ec7-a63a-953de7191d42.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/107-delete-v7-tags-1a4679fe-dcd9-4ec7-a63a-953de7191d42.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/107-delete-v7-tags-1a4679fe-dcd9-4ec7-a63a-953de7191d42.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/107-delete-v7-tags-1a4679fe-dcd9-4ec7-a63a-953de7191d42.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/108-delete-v7-tags-18d797b4-4d9a-40a8-9c4e-2fba961ca540.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/108-delete-v7-tags-18d797b4-4d9a-40a8-9c4e-2fba961ca540.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/108-delete-v7-tags-18d797b4-4d9a-40a8-9c4e-2fba961ca540.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/108-delete-v7-tags-18d797b4-4d9a-40a8-9c4e-2fba961ca540.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/109-delete-v7-tags-d689e082-8d7d-44a9-aaf9-4cafcd4e9a57.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/109-delete-v7-tags-d689e082-8d7d-44a9-aaf9-4cafcd4e9a57.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/109-delete-v7-tags-d689e082-8d7d-44a9-aaf9-4cafcd4e9a57.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/109-delete-v7-tags-d689e082-8d7d-44a9-aaf9-4cafcd4e9a57.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/110-delete-v7-tags-928f67ce-eee5-409f-bae5-5e7b9f60a069.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/110-delete-v7-tags-928f67ce-eee5-409f-bae5-5e7b9f60a069.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/110-delete-v7-tags-928f67ce-eee5-409f-bae5-5e7b9f60a069.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/110-delete-v7-tags-928f67ce-eee5-409f-bae5-5e7b9f60a069.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/111-delete-v7-tags-7611246c-c822-4ac4-84ba-d8e20177c9c6.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/111-delete-v7-tags-7611246c-c822-4ac4-84ba-d8e20177c9c6.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/111-delete-v7-tags-7611246c-c822-4ac4-84ba-d8e20177c9c6.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/111-delete-v7-tags-7611246c-c822-4ac4-84ba-d8e20177c9c6.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/112-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/112-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/112-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/112-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/113-get-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/113-get-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/113-get-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/113-get-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/114-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/114-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/114-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/114-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/115-get-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/115-get-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/115-get-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/115-get-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/116-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/116-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/116-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/116-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/117-get-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/117-get-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/117-get-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/117-get-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/118-delete-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/118-delete-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/118-delete-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/118-delete-v7-tags-fe9a8559-f20b-4866-bfca-9a38295b7717.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/119-delete-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/119-delete-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/119-delete-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/119-delete-v7-tags-19318e58-bcce-4934-8357-6a60dd43bc5f.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/120-delete-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/120-delete-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/120-delete-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/120-delete-v7-tags-612786db-ddc4-4363-af88-15f0e3aa5952.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/121-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/121-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/121-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/121-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/122-get-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/122-get-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/122-get-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/122-get-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/123-post-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/123-post-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/123-post-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/123-post-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/124-get-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/124-get-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/124-get-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/124-get-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/125-delete-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/125-delete-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/125-delete-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/125-delete-v7-tags-105bb743-1df9-450d-b0c5-08cae8c0ab95.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/126-delete-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/126-delete-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/126-delete-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/126-delete-v7-tags-bb532b4e-ef82-4d82-b13e-45e03d7a50f9.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/127-get-v7-tags.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/127-get-v7-tags.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/interactions/127-get-v7-tags.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/interactions/127-get-v7-tags.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/metadata.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/metadata.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/metadata.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/report.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/report.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/report.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/report.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/plan.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/plan.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/scenario.json diff --git a/probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/subject.json b/recordings/thousandeyes/tag/7.0.97-t1785500655892/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tag/7.0.97-t1785500655892/subject.json rename to recordings/thousandeyes/tag/7.0.97-t1785500655892/subject.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/facts.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/facts.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/facts.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/001-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/001-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/001-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/001-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/002-get-v7-tests-agent-to-server-999999999.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/002-get-v7-tests-agent-to-server-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/002-get-v7-tests-agent-to-server-999999999.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/002-get-v7-tests-agent-to-server-999999999.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/003-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/003-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/003-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/003-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/004-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/004-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/004-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/004-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/005-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/005-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/005-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/005-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/006-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/006-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/006-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/006-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/007-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/007-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/007-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/007-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/008-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/008-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/008-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/008-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/009-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/009-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/009-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/009-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/010-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/010-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/010-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/010-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/011-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/011-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/011-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/011-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/012-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/012-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/012-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/012-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/013-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/013-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/013-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/013-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/014-delete-v7-tests-agent-to-server-281474976976787.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/014-delete-v7-tests-agent-to-server-281474976976787.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/014-delete-v7-tests-agent-to-server-281474976976787.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/014-delete-v7-tests-agent-to-server-281474976976787.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/015-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/015-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/015-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/015-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/016-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/016-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/016-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/016-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/017-get-v7-tests-agent-to-server-281474976976788.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/017-get-v7-tests-agent-to-server-281474976976788.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/017-get-v7-tests-agent-to-server-281474976976788.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/017-get-v7-tests-agent-to-server-281474976976788.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/018-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/018-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/018-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/018-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/019-get-v7-tests-agent-to-server-281474976976789.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/019-get-v7-tests-agent-to-server-281474976976789.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/019-get-v7-tests-agent-to-server-281474976976789.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/019-get-v7-tests-agent-to-server-281474976976789.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/020-delete-v7-tests-agent-to-server-281474976976788.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/020-delete-v7-tests-agent-to-server-281474976976788.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/020-delete-v7-tests-agent-to-server-281474976976788.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/020-delete-v7-tests-agent-to-server-281474976976788.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/021-delete-v7-tests-agent-to-server-281474976976789.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/021-delete-v7-tests-agent-to-server-281474976976789.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/021-delete-v7-tests-agent-to-server-281474976976789.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/021-delete-v7-tests-agent-to-server-281474976976789.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/022-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/022-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/022-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/022-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/023-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/023-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/023-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/023-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/024-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/024-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/024-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/024-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/025-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/025-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/025-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/025-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/026-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/026-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/026-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/026-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/027-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/027-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/027-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/027-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/028-delete-v7-tests-agent-to-server-281474976976790.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/028-delete-v7-tests-agent-to-server-281474976976790.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/028-delete-v7-tests-agent-to-server-281474976976790.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/028-delete-v7-tests-agent-to-server-281474976976790.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/029-delete-v7-tests-agent-to-server-281474976976791.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/029-delete-v7-tests-agent-to-server-281474976976791.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/029-delete-v7-tests-agent-to-server-281474976976791.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/029-delete-v7-tests-agent-to-server-281474976976791.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/030-delete-v7-tests-agent-to-server-281474976976792.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/030-delete-v7-tests-agent-to-server-281474976976792.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/030-delete-v7-tests-agent-to-server-281474976976792.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/030-delete-v7-tests-agent-to-server-281474976976792.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/031-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/031-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/031-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/031-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/032-post-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/032-post-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/032-post-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/032-post-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/033-get-v7-tests-agent-to-server-281474976976793.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/033-get-v7-tests-agent-to-server-281474976976793.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/033-get-v7-tests-agent-to-server-281474976976793.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/033-get-v7-tests-agent-to-server-281474976976793.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/034-delete-v7-tests-agent-to-server-281474976976793.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/034-delete-v7-tests-agent-to-server-281474976976793.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/034-delete-v7-tests-agent-to-server-281474976976793.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/034-delete-v7-tests-agent-to-server-281474976976793.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/035-get-v7-tests-agent-to-server.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/035-get-v7-tests-agent-to-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/035-get-v7-tests-agent-to-server.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/interactions/035-get-v7-tests-agent-to-server.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/metadata.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/metadata.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/metadata.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/report.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/report.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/report.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/plan.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/plan.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/scenario.json diff --git a/probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/subject.json b/recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/subject.json rename to recordings/thousandeyes/tests_agent_to_server/7.0.98-t1785744716524/subject.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/facts.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/facts.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/facts.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/001-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/001-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/001-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/001-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/002-get-v7-tests-api-999999999.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/002-get-v7-tests-api-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/002-get-v7-tests-api-999999999.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/002-get-v7-tests-api-999999999.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/003-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/003-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/003-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/003-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/004-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/004-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/004-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/004-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/005-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/005-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/005-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/005-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/006-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/006-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/006-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/006-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/007-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/007-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/007-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/007-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/008-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/008-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/008-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/008-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/009-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/009-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/009-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/009-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/010-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/010-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/010-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/010-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/011-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/011-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/011-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/011-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/012-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/012-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/012-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/012-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/013-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/013-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/013-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/013-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/014-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/014-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/014-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/014-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/015-delete-v7-tests-api-281474976976794.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/015-delete-v7-tests-api-281474976976794.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/015-delete-v7-tests-api-281474976976794.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/015-delete-v7-tests-api-281474976976794.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/016-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/016-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/016-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/016-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/017-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/017-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/017-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/017-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/018-get-v7-tests-api-281474976976795.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/018-get-v7-tests-api-281474976976795.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/018-get-v7-tests-api-281474976976795.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/018-get-v7-tests-api-281474976976795.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/019-put-v7-tests-api-281474976976795.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/019-put-v7-tests-api-281474976976795.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/019-put-v7-tests-api-281474976976795.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/019-put-v7-tests-api-281474976976795.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/020-get-v7-tests-api-281474976976795.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/020-get-v7-tests-api-281474976976795.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/020-get-v7-tests-api-281474976976795.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/020-get-v7-tests-api-281474976976795.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/021-delete-v7-tests-api-281474976976795.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/021-delete-v7-tests-api-281474976976795.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/021-delete-v7-tests-api-281474976976795.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/021-delete-v7-tests-api-281474976976795.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/022-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/022-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/022-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/022-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/023-get-v7-tests-api-281474976976796.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/023-get-v7-tests-api-281474976976796.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/023-get-v7-tests-api-281474976976796.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/023-get-v7-tests-api-281474976976796.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/024-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/024-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/024-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/024-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/025-get-v7-tests-api-281474976976797.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/025-get-v7-tests-api-281474976976797.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/025-get-v7-tests-api-281474976976797.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/025-get-v7-tests-api-281474976976797.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/026-delete-v7-tests-api-281474976976796.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/026-delete-v7-tests-api-281474976976796.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/026-delete-v7-tests-api-281474976976796.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/026-delete-v7-tests-api-281474976976796.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/027-delete-v7-tests-api-281474976976797.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/027-delete-v7-tests-api-281474976976797.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/027-delete-v7-tests-api-281474976976797.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/027-delete-v7-tests-api-281474976976797.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/028-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/028-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/028-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/028-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/029-get-v7-tests-api-281474976976798.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/029-get-v7-tests-api-281474976976798.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/029-get-v7-tests-api-281474976976798.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/029-get-v7-tests-api-281474976976798.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/030-put-v7-tests-api-281474976976798.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/030-put-v7-tests-api-281474976976798.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/030-put-v7-tests-api-281474976976798.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/030-put-v7-tests-api-281474976976798.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/031-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/031-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/031-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/031-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/032-put-v7-tests-api-281474976976798.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/032-put-v7-tests-api-281474976976798.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/032-put-v7-tests-api-281474976976798.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/032-put-v7-tests-api-281474976976798.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/033-get-v7-tests-api-281474976976798.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/033-get-v7-tests-api-281474976976798.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/033-get-v7-tests-api-281474976976798.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/033-get-v7-tests-api-281474976976798.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/034-delete-v7-tests-api-281474976976798.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/034-delete-v7-tests-api-281474976976798.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/034-delete-v7-tests-api-281474976976798.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/034-delete-v7-tests-api-281474976976798.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/035-delete-v7-tests-api-281474976976799.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/035-delete-v7-tests-api-281474976976799.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/035-delete-v7-tests-api-281474976976799.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/035-delete-v7-tests-api-281474976976799.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/036-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/036-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/036-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/036-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/037-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/037-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/037-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/037-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/038-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/038-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/038-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/038-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/039-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/039-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/039-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/039-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/040-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/040-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/040-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/040-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/041-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/041-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/041-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/041-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/042-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/042-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/042-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/042-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/043-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/043-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/043-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/043-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/044-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/044-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/044-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/044-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/045-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/045-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/045-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/045-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/046-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/046-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/046-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/046-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/047-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/047-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/047-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/047-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/048-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/048-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/048-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/048-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/049-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/049-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/049-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/049-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/050-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/050-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/050-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/050-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/051-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/051-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/051-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/051-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/052-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/052-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/052-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/052-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/053-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/053-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/053-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/053-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/054-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/054-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/054-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/054-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/055-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/055-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/055-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/055-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/056-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/056-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/056-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/056-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/057-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/057-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/057-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/057-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/058-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/058-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/058-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/058-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/059-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/059-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/059-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/059-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/060-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/060-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/060-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/060-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/061-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/061-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/061-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/061-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/062-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/062-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/062-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/062-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/063-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/063-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/063-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/063-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/064-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/064-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/064-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/064-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/065-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/065-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/065-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/065-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/066-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/066-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/066-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/066-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/067-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/067-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/067-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/067-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/068-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/068-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/068-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/068-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/069-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/069-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/069-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/069-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/070-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/070-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/070-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/070-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/071-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/071-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/071-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/071-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/072-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/072-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/072-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/072-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/073-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/073-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/073-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/073-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/074-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/074-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/074-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/074-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/075-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/075-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/075-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/075-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/076-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/076-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/076-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/076-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/077-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/077-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/077-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/077-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/078-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/078-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/078-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/078-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/079-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/079-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/079-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/079-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/080-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/080-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/080-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/080-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/081-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/081-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/081-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/081-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/082-delete-v7-tests-api-281474976976800.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/082-delete-v7-tests-api-281474976976800.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/082-delete-v7-tests-api-281474976976800.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/082-delete-v7-tests-api-281474976976800.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/083-delete-v7-tests-api-281474976976801.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/083-delete-v7-tests-api-281474976976801.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/083-delete-v7-tests-api-281474976976801.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/083-delete-v7-tests-api-281474976976801.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/084-delete-v7-tests-api-281474976976802.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/084-delete-v7-tests-api-281474976976802.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/084-delete-v7-tests-api-281474976976802.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/084-delete-v7-tests-api-281474976976802.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/085-delete-v7-tests-api-281474976976803.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/085-delete-v7-tests-api-281474976976803.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/085-delete-v7-tests-api-281474976976803.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/085-delete-v7-tests-api-281474976976803.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/086-delete-v7-tests-api-281474976976804.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/086-delete-v7-tests-api-281474976976804.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/086-delete-v7-tests-api-281474976976804.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/086-delete-v7-tests-api-281474976976804.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/087-delete-v7-tests-api-281474976976805.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/087-delete-v7-tests-api-281474976976805.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/087-delete-v7-tests-api-281474976976805.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/087-delete-v7-tests-api-281474976976805.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/088-delete-v7-tests-api-281474976976806.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/088-delete-v7-tests-api-281474976976806.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/088-delete-v7-tests-api-281474976976806.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/088-delete-v7-tests-api-281474976976806.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/089-delete-v7-tests-api-281474976976807.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/089-delete-v7-tests-api-281474976976807.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/089-delete-v7-tests-api-281474976976807.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/089-delete-v7-tests-api-281474976976807.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/090-delete-v7-tests-api-281474976976808.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/090-delete-v7-tests-api-281474976976808.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/090-delete-v7-tests-api-281474976976808.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/090-delete-v7-tests-api-281474976976808.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/091-delete-v7-tests-api-281474976976809.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/091-delete-v7-tests-api-281474976976809.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/091-delete-v7-tests-api-281474976976809.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/091-delete-v7-tests-api-281474976976809.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/092-delete-v7-tests-api-281474976976810.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/092-delete-v7-tests-api-281474976976810.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/092-delete-v7-tests-api-281474976976810.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/092-delete-v7-tests-api-281474976976810.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/093-delete-v7-tests-api-281474976976811.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/093-delete-v7-tests-api-281474976976811.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/093-delete-v7-tests-api-281474976976811.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/093-delete-v7-tests-api-281474976976811.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/094-delete-v7-tests-api-281474976976812.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/094-delete-v7-tests-api-281474976976812.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/094-delete-v7-tests-api-281474976976812.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/094-delete-v7-tests-api-281474976976812.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/095-delete-v7-tests-api-281474976976813.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/095-delete-v7-tests-api-281474976976813.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/095-delete-v7-tests-api-281474976976813.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/095-delete-v7-tests-api-281474976976813.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/096-delete-v7-tests-api-281474976976814.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/096-delete-v7-tests-api-281474976976814.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/096-delete-v7-tests-api-281474976976814.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/096-delete-v7-tests-api-281474976976814.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/097-delete-v7-tests-api-281474976976815.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/097-delete-v7-tests-api-281474976976815.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/097-delete-v7-tests-api-281474976976815.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/097-delete-v7-tests-api-281474976976815.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/098-delete-v7-tests-api-281474976976816.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/098-delete-v7-tests-api-281474976976816.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/098-delete-v7-tests-api-281474976976816.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/098-delete-v7-tests-api-281474976976816.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/099-delete-v7-tests-api-281474976976817.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/099-delete-v7-tests-api-281474976976817.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/099-delete-v7-tests-api-281474976976817.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/099-delete-v7-tests-api-281474976976817.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/100-delete-v7-tests-api-281474976976818.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/100-delete-v7-tests-api-281474976976818.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/100-delete-v7-tests-api-281474976976818.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/100-delete-v7-tests-api-281474976976818.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/101-delete-v7-tests-api-281474976976819.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/101-delete-v7-tests-api-281474976976819.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/101-delete-v7-tests-api-281474976976819.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/101-delete-v7-tests-api-281474976976819.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/102-delete-v7-tests-api-281474976976820.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/102-delete-v7-tests-api-281474976976820.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/102-delete-v7-tests-api-281474976976820.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/102-delete-v7-tests-api-281474976976820.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/103-delete-v7-tests-api-281474976976821.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/103-delete-v7-tests-api-281474976976821.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/103-delete-v7-tests-api-281474976976821.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/103-delete-v7-tests-api-281474976976821.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/104-delete-v7-tests-api-281474976976822.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/104-delete-v7-tests-api-281474976976822.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/104-delete-v7-tests-api-281474976976822.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/104-delete-v7-tests-api-281474976976822.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/105-delete-v7-tests-api-281474976976823.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/105-delete-v7-tests-api-281474976976823.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/105-delete-v7-tests-api-281474976976823.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/105-delete-v7-tests-api-281474976976823.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/106-delete-v7-tests-api-281474976976824.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/106-delete-v7-tests-api-281474976976824.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/106-delete-v7-tests-api-281474976976824.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/106-delete-v7-tests-api-281474976976824.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/107-delete-v7-tests-api-281474976976825.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/107-delete-v7-tests-api-281474976976825.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/107-delete-v7-tests-api-281474976976825.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/107-delete-v7-tests-api-281474976976825.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/108-delete-v7-tests-api-281474976976826.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/108-delete-v7-tests-api-281474976976826.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/108-delete-v7-tests-api-281474976976826.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/108-delete-v7-tests-api-281474976976826.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/109-delete-v7-tests-api-281474976976827.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/109-delete-v7-tests-api-281474976976827.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/109-delete-v7-tests-api-281474976976827.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/109-delete-v7-tests-api-281474976976827.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/110-delete-v7-tests-api-281474976976828.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/110-delete-v7-tests-api-281474976976828.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/110-delete-v7-tests-api-281474976976828.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/110-delete-v7-tests-api-281474976976828.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/111-delete-v7-tests-api-281474976976829.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/111-delete-v7-tests-api-281474976976829.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/111-delete-v7-tests-api-281474976976829.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/111-delete-v7-tests-api-281474976976829.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/112-delete-v7-tests-api-281474976976830.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/112-delete-v7-tests-api-281474976976830.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/112-delete-v7-tests-api-281474976976830.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/112-delete-v7-tests-api-281474976976830.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/113-delete-v7-tests-api-281474976976831.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/113-delete-v7-tests-api-281474976976831.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/113-delete-v7-tests-api-281474976976831.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/113-delete-v7-tests-api-281474976976831.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/114-delete-v7-tests-api-281474976976832.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/114-delete-v7-tests-api-281474976976832.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/114-delete-v7-tests-api-281474976976832.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/114-delete-v7-tests-api-281474976976832.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/115-delete-v7-tests-api-281474976976833.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/115-delete-v7-tests-api-281474976976833.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/115-delete-v7-tests-api-281474976976833.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/115-delete-v7-tests-api-281474976976833.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/116-delete-v7-tests-api-281474976976834.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/116-delete-v7-tests-api-281474976976834.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/116-delete-v7-tests-api-281474976976834.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/116-delete-v7-tests-api-281474976976834.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/117-delete-v7-tests-api-281474976976835.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/117-delete-v7-tests-api-281474976976835.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/117-delete-v7-tests-api-281474976976835.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/117-delete-v7-tests-api-281474976976835.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/118-delete-v7-tests-api-281474976976836.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/118-delete-v7-tests-api-281474976976836.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/118-delete-v7-tests-api-281474976976836.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/118-delete-v7-tests-api-281474976976836.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/119-delete-v7-tests-api-281474976976837.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/119-delete-v7-tests-api-281474976976837.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/119-delete-v7-tests-api-281474976976837.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/119-delete-v7-tests-api-281474976976837.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/120-delete-v7-tests-api-281474976976838.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/120-delete-v7-tests-api-281474976976838.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/120-delete-v7-tests-api-281474976976838.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/120-delete-v7-tests-api-281474976976838.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/121-delete-v7-tests-api-281474976976839.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/121-delete-v7-tests-api-281474976976839.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/121-delete-v7-tests-api-281474976976839.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/121-delete-v7-tests-api-281474976976839.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/122-delete-v7-tests-api-281474976976840.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/122-delete-v7-tests-api-281474976976840.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/122-delete-v7-tests-api-281474976976840.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/122-delete-v7-tests-api-281474976976840.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/123-delete-v7-tests-api-281474976976841.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/123-delete-v7-tests-api-281474976976841.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/123-delete-v7-tests-api-281474976976841.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/123-delete-v7-tests-api-281474976976841.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/124-delete-v7-tests-api-281474976976842.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/124-delete-v7-tests-api-281474976976842.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/124-delete-v7-tests-api-281474976976842.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/124-delete-v7-tests-api-281474976976842.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/125-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/125-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/125-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/125-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/126-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/126-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/126-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/126-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/127-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/127-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/127-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/127-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/128-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/128-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/128-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/interactions/128-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/metadata.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/metadata.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/metadata.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/report.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/report.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/report.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/plan.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/plan.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/scenario.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/subject.json b/recordings/thousandeyes/tests_api/7.0.98-t1785744867250/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785744867250/subject.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785744867250/subject.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/facts.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/facts.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/facts.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/001-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/001-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/001-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/001-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/002-get-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/002-get-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/002-get-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/002-get-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/003-put-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/003-put-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/003-put-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/003-put-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/004-get-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/004-get-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/004-get-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/004-get-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/005-put-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/005-put-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/005-put-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/005-put-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/006-get-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/006-get-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/006-get-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/006-get-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/007-delete-v7-tests-api-281474976977116.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/007-delete-v7-tests-api-281474976977116.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/007-delete-v7-tests-api-281474976977116.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/007-delete-v7-tests-api-281474976977116.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/008-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/008-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/008-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/008-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/009-post-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/009-post-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/009-post-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/009-post-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/010-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/010-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/010-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/010-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/011-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/011-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/011-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/011-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/012-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/012-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/012-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/012-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/013-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/013-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/013-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/013-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/014-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/014-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/014-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/014-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/015-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/015-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/015-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/015-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/016-put-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/016-put-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/016-put-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/016-put-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/017-delete-v7-tests-api-281474976977117.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/017-delete-v7-tests-api-281474976977117.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/017-delete-v7-tests-api-281474976977117.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/017-delete-v7-tests-api-281474976977117.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/018-get-v7-tests-api.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/018-get-v7-tests-api.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/018-get-v7-tests-api.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/interactions/018-get-v7-tests-api.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/metadata.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/metadata.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/metadata.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/rehearsal.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/rehearsal.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/rehearsal.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/report.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/report.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/report.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/plan.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/plan.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/scenario.json diff --git a/probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/subject.json b/recordings/thousandeyes/tests_api/7.0.98-t1785758194545/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_api/7.0.98-t1785758194545/subject.json rename to recordings/thousandeyes/tests_api/7.0.98-t1785758194545/subject.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/facts.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/facts.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/facts.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/001-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/001-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/001-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/001-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/002-get-v7-tests-bgp-999999999.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/002-get-v7-tests-bgp-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/002-get-v7-tests-bgp-999999999.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/002-get-v7-tests-bgp-999999999.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/003-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/003-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/003-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/003-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/004-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/004-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/004-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/004-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/005-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/005-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/005-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/005-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/006-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/006-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/006-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/006-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/007-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/007-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/007-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/007-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/008-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/008-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/008-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/008-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/009-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/009-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/009-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/009-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/010-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/010-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/010-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/010-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/011-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/011-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/011-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/011-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/012-delete-v7-tests-bgp-281474976976843.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/012-delete-v7-tests-bgp-281474976976843.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/012-delete-v7-tests-bgp-281474976976843.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/012-delete-v7-tests-bgp-281474976976843.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/013-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/013-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/013-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/013-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/014-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/014-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/014-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/014-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/015-get-v7-tests-bgp-281474976976844.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/015-get-v7-tests-bgp-281474976976844.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/015-get-v7-tests-bgp-281474976976844.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/015-get-v7-tests-bgp-281474976976844.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/016-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/016-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/016-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/016-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/017-get-v7-tests-bgp-281474976976845.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/017-get-v7-tests-bgp-281474976976845.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/017-get-v7-tests-bgp-281474976976845.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/017-get-v7-tests-bgp-281474976976845.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/018-delete-v7-tests-bgp-281474976976844.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/018-delete-v7-tests-bgp-281474976976844.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/018-delete-v7-tests-bgp-281474976976844.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/018-delete-v7-tests-bgp-281474976976844.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/019-delete-v7-tests-bgp-281474976976845.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/019-delete-v7-tests-bgp-281474976976845.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/019-delete-v7-tests-bgp-281474976976845.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/019-delete-v7-tests-bgp-281474976976845.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/020-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/020-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/020-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/020-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/021-post-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/021-post-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/021-post-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/021-post-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/022-get-v7-tests-bgp.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/022-get-v7-tests-bgp.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/022-get-v7-tests-bgp.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/interactions/022-get-v7-tests-bgp.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/metadata.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/metadata.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/metadata.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/report.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/report.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/report.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/plan.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/plan.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/scenario.json diff --git a/probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/subject.json b/recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_bgp/7.0.98-t1785744878231/subject.json rename to recordings/thousandeyes/tests_bgp/7.0.98-t1785744878231/subject.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/facts.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/facts.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/facts.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/001-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/001-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/001-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/001-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/002-get-v7-tests-dns-server-999999999.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/002-get-v7-tests-dns-server-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/002-get-v7-tests-dns-server-999999999.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/002-get-v7-tests-dns-server-999999999.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/003-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/003-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/003-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/003-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/004-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/004-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/004-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/004-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/005-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/005-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/005-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/005-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/006-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/006-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/006-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/006-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/007-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/007-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/007-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/007-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/008-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/008-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/008-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/008-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/009-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/009-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/009-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/009-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/010-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/010-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/010-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/010-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/011-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/011-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/011-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/011-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/012-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/012-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/012-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/012-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/013-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/013-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/013-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/013-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/014-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/014-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/014-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/014-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/015-delete-v7-tests-dns-server-281474976976846.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/015-delete-v7-tests-dns-server-281474976976846.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/015-delete-v7-tests-dns-server-281474976976846.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/015-delete-v7-tests-dns-server-281474976976846.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/016-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/016-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/016-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/016-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/017-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/017-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/017-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/017-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/018-get-v7-tests-dns-server-281474976976847.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/018-get-v7-tests-dns-server-281474976976847.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/018-get-v7-tests-dns-server-281474976976847.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/018-get-v7-tests-dns-server-281474976976847.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/019-put-v7-tests-dns-server-281474976976847.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/019-put-v7-tests-dns-server-281474976976847.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/019-put-v7-tests-dns-server-281474976976847.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/019-put-v7-tests-dns-server-281474976976847.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/020-get-v7-tests-dns-server-281474976976847.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/020-get-v7-tests-dns-server-281474976976847.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/020-get-v7-tests-dns-server-281474976976847.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/020-get-v7-tests-dns-server-281474976976847.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/021-delete-v7-tests-dns-server-281474976976847.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/021-delete-v7-tests-dns-server-281474976976847.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/021-delete-v7-tests-dns-server-281474976976847.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/021-delete-v7-tests-dns-server-281474976976847.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/022-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/022-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/022-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/022-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/023-get-v7-tests-dns-server-281474976976848.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/023-get-v7-tests-dns-server-281474976976848.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/023-get-v7-tests-dns-server-281474976976848.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/023-get-v7-tests-dns-server-281474976976848.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/024-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/024-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/024-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/024-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/025-get-v7-tests-dns-server-281474976976849.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/025-get-v7-tests-dns-server-281474976976849.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/025-get-v7-tests-dns-server-281474976976849.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/025-get-v7-tests-dns-server-281474976976849.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/026-delete-v7-tests-dns-server-281474976976848.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/026-delete-v7-tests-dns-server-281474976976848.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/026-delete-v7-tests-dns-server-281474976976848.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/026-delete-v7-tests-dns-server-281474976976848.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/027-delete-v7-tests-dns-server-281474976976849.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/027-delete-v7-tests-dns-server-281474976976849.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/027-delete-v7-tests-dns-server-281474976976849.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/027-delete-v7-tests-dns-server-281474976976849.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/028-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/028-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/028-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/028-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/029-get-v7-tests-dns-server-281474976976850.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/029-get-v7-tests-dns-server-281474976976850.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/029-get-v7-tests-dns-server-281474976976850.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/029-get-v7-tests-dns-server-281474976976850.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/030-put-v7-tests-dns-server-281474976976850.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/030-put-v7-tests-dns-server-281474976976850.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/030-put-v7-tests-dns-server-281474976976850.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/030-put-v7-tests-dns-server-281474976976850.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/031-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/031-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/031-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/031-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/032-put-v7-tests-dns-server-281474976976850.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/032-put-v7-tests-dns-server-281474976976850.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/032-put-v7-tests-dns-server-281474976976850.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/032-put-v7-tests-dns-server-281474976976850.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/033-get-v7-tests-dns-server-281474976976850.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/033-get-v7-tests-dns-server-281474976976850.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/033-get-v7-tests-dns-server-281474976976850.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/033-get-v7-tests-dns-server-281474976976850.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/034-delete-v7-tests-dns-server-281474976976850.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/034-delete-v7-tests-dns-server-281474976976850.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/034-delete-v7-tests-dns-server-281474976976850.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/034-delete-v7-tests-dns-server-281474976976850.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/035-delete-v7-tests-dns-server-281474976976851.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/035-delete-v7-tests-dns-server-281474976976851.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/035-delete-v7-tests-dns-server-281474976976851.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/035-delete-v7-tests-dns-server-281474976976851.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/036-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/036-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/036-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/036-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/037-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/037-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/037-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/037-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/038-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/038-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/038-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/038-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/039-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/039-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/039-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/039-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/040-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/040-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/040-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/040-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/041-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/041-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/041-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/041-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/042-delete-v7-tests-dns-server-281474976976852.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/042-delete-v7-tests-dns-server-281474976976852.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/042-delete-v7-tests-dns-server-281474976976852.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/042-delete-v7-tests-dns-server-281474976976852.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/043-delete-v7-tests-dns-server-281474976976853.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/043-delete-v7-tests-dns-server-281474976976853.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/043-delete-v7-tests-dns-server-281474976976853.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/043-delete-v7-tests-dns-server-281474976976853.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/044-delete-v7-tests-dns-server-281474976976854.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/044-delete-v7-tests-dns-server-281474976976854.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/044-delete-v7-tests-dns-server-281474976976854.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/044-delete-v7-tests-dns-server-281474976976854.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/045-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/045-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/045-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/045-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/046-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/046-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/046-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/046-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/047-get-v7-tests-dns-server-281474976976855.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/047-get-v7-tests-dns-server-281474976976855.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/047-get-v7-tests-dns-server-281474976976855.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/047-get-v7-tests-dns-server-281474976976855.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/048-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/048-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/048-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/048-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/049-get-v7-tests-dns-server-281474976976856.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/049-get-v7-tests-dns-server-281474976976856.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/049-get-v7-tests-dns-server-281474976976856.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/049-get-v7-tests-dns-server-281474976976856.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/050-delete-v7-tests-dns-server-281474976976855.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/050-delete-v7-tests-dns-server-281474976976855.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/050-delete-v7-tests-dns-server-281474976976855.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/050-delete-v7-tests-dns-server-281474976976855.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/051-delete-v7-tests-dns-server-281474976976856.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/051-delete-v7-tests-dns-server-281474976976856.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/051-delete-v7-tests-dns-server-281474976976856.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/051-delete-v7-tests-dns-server-281474976976856.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/052-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/052-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/052-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/interactions/052-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/metadata.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/metadata.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/metadata.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/report.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/report.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/report.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/plan.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/plan.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/scenario.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/subject.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785744994227/subject.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785744994227/subject.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/facts.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/facts.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/facts.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/001-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/001-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/001-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/001-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/002-get-v7-tests-dns-server-281474976977118.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/002-get-v7-tests-dns-server-281474976977118.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/002-get-v7-tests-dns-server-281474976977118.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/002-get-v7-tests-dns-server-281474976977118.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/003-put-v7-tests-dns-server-281474976977118.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/003-put-v7-tests-dns-server-281474976977118.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/003-put-v7-tests-dns-server-281474976977118.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/003-put-v7-tests-dns-server-281474976977118.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/004-put-v7-tests-dns-server-281474976977118.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/004-put-v7-tests-dns-server-281474976977118.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/004-put-v7-tests-dns-server-281474976977118.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/004-put-v7-tests-dns-server-281474976977118.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/005-delete-v7-tests-dns-server-281474976977118.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/005-delete-v7-tests-dns-server-281474976977118.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/005-delete-v7-tests-dns-server-281474976977118.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/005-delete-v7-tests-dns-server-281474976977118.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/006-post-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/006-post-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/006-post-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/006-post-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/007-get-v7-tests-dns-server.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/007-get-v7-tests-dns-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/007-get-v7-tests-dns-server.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/interactions/007-get-v7-tests-dns-server.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/metadata.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/metadata.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/metadata.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/rehearsal.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/rehearsal.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/rehearsal.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/report.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/report.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/report.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/plan.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/plan.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/scenario.json diff --git a/probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/subject.json b/recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_server/7.0.98-t1785758206839/subject.json rename to recordings/thousandeyes/tests_dns_server/7.0.98-t1785758206839/subject.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/facts.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/facts.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/facts.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/001-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/001-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/001-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/001-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/002-get-v7-tests-dns-trace-999999999.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/002-get-v7-tests-dns-trace-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/002-get-v7-tests-dns-trace-999999999.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/002-get-v7-tests-dns-trace-999999999.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/003-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/003-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/003-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/003-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/004-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/004-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/004-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/004-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/005-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/005-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/005-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/005-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/006-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/006-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/006-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/006-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/007-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/007-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/007-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/007-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/008-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/008-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/008-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/008-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/009-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/009-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/009-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/009-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/010-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/010-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/010-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/010-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/011-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/011-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/011-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/011-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/012-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/012-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/012-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/012-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/013-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/013-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/013-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/013-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/014-delete-v7-tests-dns-trace-281474976976857.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/014-delete-v7-tests-dns-trace-281474976976857.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/014-delete-v7-tests-dns-trace-281474976976857.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/014-delete-v7-tests-dns-trace-281474976976857.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/015-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/015-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/015-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/015-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/016-get-v7-tests-dns-trace-281474976976858.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/016-get-v7-tests-dns-trace-281474976976858.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/016-get-v7-tests-dns-trace-281474976976858.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/016-get-v7-tests-dns-trace-281474976976858.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/017-delete-v7-tests-dns-trace-281474976976858.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/017-delete-v7-tests-dns-trace-281474976976858.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/017-delete-v7-tests-dns-trace-281474976976858.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/017-delete-v7-tests-dns-trace-281474976976858.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/018-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/018-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/018-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/018-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/019-get-v7-tests-dns-trace-281474976976859.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/019-get-v7-tests-dns-trace-281474976976859.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/019-get-v7-tests-dns-trace-281474976976859.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/019-get-v7-tests-dns-trace-281474976976859.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/020-put-v7-tests-dns-trace-281474976976859.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/020-put-v7-tests-dns-trace-281474976976859.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/020-put-v7-tests-dns-trace-281474976976859.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/020-put-v7-tests-dns-trace-281474976976859.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/021-get-v7-tests-dns-trace-281474976976859.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/021-get-v7-tests-dns-trace-281474976976859.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/021-get-v7-tests-dns-trace-281474976976859.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/021-get-v7-tests-dns-trace-281474976976859.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/022-delete-v7-tests-dns-trace-281474976976859.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/022-delete-v7-tests-dns-trace-281474976976859.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/022-delete-v7-tests-dns-trace-281474976976859.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/022-delete-v7-tests-dns-trace-281474976976859.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/023-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/023-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/023-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/023-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/024-get-v7-tests-dns-trace-281474976976860.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/024-get-v7-tests-dns-trace-281474976976860.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/024-get-v7-tests-dns-trace-281474976976860.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/024-get-v7-tests-dns-trace-281474976976860.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/025-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/025-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/025-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/025-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/026-get-v7-tests-dns-trace-281474976976861.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/026-get-v7-tests-dns-trace-281474976976861.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/026-get-v7-tests-dns-trace-281474976976861.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/026-get-v7-tests-dns-trace-281474976976861.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/027-delete-v7-tests-dns-trace-281474976976860.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/027-delete-v7-tests-dns-trace-281474976976860.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/027-delete-v7-tests-dns-trace-281474976976860.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/027-delete-v7-tests-dns-trace-281474976976860.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/028-delete-v7-tests-dns-trace-281474976976861.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/028-delete-v7-tests-dns-trace-281474976976861.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/028-delete-v7-tests-dns-trace-281474976976861.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/028-delete-v7-tests-dns-trace-281474976976861.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/029-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/029-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/029-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/029-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/030-post-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/030-post-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/030-post-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/030-post-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/031-get-v7-tests-dns-trace-281474976976862.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/031-get-v7-tests-dns-trace-281474976976862.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/031-get-v7-tests-dns-trace-281474976976862.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/031-get-v7-tests-dns-trace-281474976976862.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/032-delete-v7-tests-dns-trace-281474976976862.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/032-delete-v7-tests-dns-trace-281474976976862.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/032-delete-v7-tests-dns-trace-281474976976862.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/032-delete-v7-tests-dns-trace-281474976976862.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/033-get-v7-tests-dns-trace.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/033-get-v7-tests-dns-trace.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/033-get-v7-tests-dns-trace.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/interactions/033-get-v7-tests-dns-trace.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/metadata.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/metadata.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/metadata.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/report.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/report.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/report.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/plan.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/plan.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/scenario.json diff --git a/probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/subject.json b/recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/subject.json rename to recordings/thousandeyes/tests_dns_trace/7.0.98-t1785745019896/subject.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/facts.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/facts.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/facts.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/001-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/001-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/001-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/001-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/002-get-v7-tests-dnssec-999999999.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/002-get-v7-tests-dnssec-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/002-get-v7-tests-dnssec-999999999.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/002-get-v7-tests-dnssec-999999999.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/003-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/003-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/003-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/003-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/004-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/004-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/004-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/004-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/005-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/005-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/005-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/005-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/006-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/006-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/006-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/006-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/007-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/007-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/007-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/007-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/008-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/008-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/008-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/008-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/009-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/009-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/009-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/009-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/010-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/010-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/010-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/010-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/011-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/011-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/011-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/011-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/012-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/012-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/012-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/012-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/013-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/013-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/013-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/013-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/014-delete-v7-tests-dnssec-281474976976863.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/014-delete-v7-tests-dnssec-281474976976863.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/014-delete-v7-tests-dnssec-281474976976863.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/014-delete-v7-tests-dnssec-281474976976863.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/015-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/015-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/015-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/015-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/016-get-v7-tests-dnssec-281474976976864.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/016-get-v7-tests-dnssec-281474976976864.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/016-get-v7-tests-dnssec-281474976976864.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/016-get-v7-tests-dnssec-281474976976864.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/017-delete-v7-tests-dnssec-281474976976864.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/017-delete-v7-tests-dnssec-281474976976864.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/017-delete-v7-tests-dnssec-281474976976864.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/017-delete-v7-tests-dnssec-281474976976864.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/018-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/018-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/018-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/018-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/019-get-v7-tests-dnssec-281474976976865.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/019-get-v7-tests-dnssec-281474976976865.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/019-get-v7-tests-dnssec-281474976976865.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/019-get-v7-tests-dnssec-281474976976865.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/020-put-v7-tests-dnssec-281474976976865.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/020-put-v7-tests-dnssec-281474976976865.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/020-put-v7-tests-dnssec-281474976976865.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/020-put-v7-tests-dnssec-281474976976865.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/021-get-v7-tests-dnssec-281474976976865.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/021-get-v7-tests-dnssec-281474976976865.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/021-get-v7-tests-dnssec-281474976976865.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/021-get-v7-tests-dnssec-281474976976865.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/022-delete-v7-tests-dnssec-281474976976865.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/022-delete-v7-tests-dnssec-281474976976865.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/022-delete-v7-tests-dnssec-281474976976865.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/022-delete-v7-tests-dnssec-281474976976865.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/023-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/023-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/023-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/023-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/024-get-v7-tests-dnssec-281474976976866.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/024-get-v7-tests-dnssec-281474976976866.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/024-get-v7-tests-dnssec-281474976976866.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/024-get-v7-tests-dnssec-281474976976866.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/025-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/025-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/025-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/025-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/026-get-v7-tests-dnssec-281474976976867.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/026-get-v7-tests-dnssec-281474976976867.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/026-get-v7-tests-dnssec-281474976976867.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/026-get-v7-tests-dnssec-281474976976867.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/027-delete-v7-tests-dnssec-281474976976866.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/027-delete-v7-tests-dnssec-281474976976866.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/027-delete-v7-tests-dnssec-281474976976866.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/027-delete-v7-tests-dnssec-281474976976866.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/028-delete-v7-tests-dnssec-281474976976867.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/028-delete-v7-tests-dnssec-281474976976867.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/028-delete-v7-tests-dnssec-281474976976867.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/028-delete-v7-tests-dnssec-281474976976867.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/029-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/029-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/029-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/029-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/030-post-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/030-post-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/030-post-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/030-post-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/031-get-v7-tests-dnssec-281474976976868.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/031-get-v7-tests-dnssec-281474976976868.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/031-get-v7-tests-dnssec-281474976976868.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/031-get-v7-tests-dnssec-281474976976868.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/032-delete-v7-tests-dnssec-281474976976868.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/032-delete-v7-tests-dnssec-281474976976868.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/032-delete-v7-tests-dnssec-281474976976868.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/032-delete-v7-tests-dnssec-281474976976868.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/033-get-v7-tests-dnssec.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/033-get-v7-tests-dnssec.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/033-get-v7-tests-dnssec.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/interactions/033-get-v7-tests-dnssec.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/metadata.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/metadata.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/metadata.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/report.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/report.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/report.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/plan.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/plan.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/scenario.json diff --git a/probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/subject.json b/recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_dnssec/7.0.98-t1785745046061/subject.json rename to recordings/thousandeyes/tests_dnssec/7.0.98-t1785745046061/subject.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/facts.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/facts.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/facts.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/001-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/001-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/001-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/001-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/002-get-v7-tests-ftp-server-999999999.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/002-get-v7-tests-ftp-server-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/002-get-v7-tests-ftp-server-999999999.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/002-get-v7-tests-ftp-server-999999999.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/003-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/003-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/003-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/003-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/004-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/004-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/004-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/004-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/005-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/005-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/005-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/005-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/006-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/006-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/006-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/006-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/007-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/007-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/007-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/007-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/008-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/008-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/008-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/008-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/009-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/009-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/009-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/009-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/010-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/010-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/010-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/010-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/011-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/011-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/011-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/011-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/012-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/012-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/012-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/012-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/013-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/013-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/013-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/013-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/014-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/014-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/014-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/014-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/015-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/015-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/015-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/015-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/016-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/016-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/016-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/016-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/017-delete-v7-tests-ftp-server-281474976976869.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/017-delete-v7-tests-ftp-server-281474976976869.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/017-delete-v7-tests-ftp-server-281474976976869.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/017-delete-v7-tests-ftp-server-281474976976869.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/018-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/018-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/018-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/018-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/019-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/019-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/019-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/019-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/020-get-v7-tests-ftp-server-281474976976870.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/020-get-v7-tests-ftp-server-281474976976870.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/020-get-v7-tests-ftp-server-281474976976870.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/020-get-v7-tests-ftp-server-281474976976870.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/021-delete-v7-tests-ftp-server-281474976976870.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/021-delete-v7-tests-ftp-server-281474976976870.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/021-delete-v7-tests-ftp-server-281474976976870.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/021-delete-v7-tests-ftp-server-281474976976870.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/022-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/022-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/022-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/022-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/023-get-v7-tests-ftp-server-281474976976871.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/023-get-v7-tests-ftp-server-281474976976871.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/023-get-v7-tests-ftp-server-281474976976871.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/023-get-v7-tests-ftp-server-281474976976871.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/024-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/024-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/024-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/024-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/025-get-v7-tests-ftp-server-281474976976872.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/025-get-v7-tests-ftp-server-281474976976872.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/025-get-v7-tests-ftp-server-281474976976872.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/025-get-v7-tests-ftp-server-281474976976872.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/026-delete-v7-tests-ftp-server-281474976976871.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/026-delete-v7-tests-ftp-server-281474976976871.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/026-delete-v7-tests-ftp-server-281474976976871.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/026-delete-v7-tests-ftp-server-281474976976871.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/027-delete-v7-tests-ftp-server-281474976976872.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/027-delete-v7-tests-ftp-server-281474976976872.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/027-delete-v7-tests-ftp-server-281474976976872.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/027-delete-v7-tests-ftp-server-281474976976872.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/028-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/028-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/028-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/028-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/029-get-v7-tests-ftp-server-281474976976873.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/029-get-v7-tests-ftp-server-281474976976873.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/029-get-v7-tests-ftp-server-281474976976873.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/029-get-v7-tests-ftp-server-281474976976873.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/030-put-v7-tests-ftp-server-281474976976873.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/030-put-v7-tests-ftp-server-281474976976873.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/030-put-v7-tests-ftp-server-281474976976873.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/030-put-v7-tests-ftp-server-281474976976873.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/031-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/031-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/031-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/031-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/032-put-v7-tests-ftp-server-281474976976873.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/032-put-v7-tests-ftp-server-281474976976873.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/032-put-v7-tests-ftp-server-281474976976873.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/032-put-v7-tests-ftp-server-281474976976873.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/033-get-v7-tests-ftp-server-281474976976873.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/033-get-v7-tests-ftp-server-281474976976873.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/033-get-v7-tests-ftp-server-281474976976873.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/033-get-v7-tests-ftp-server-281474976976873.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/034-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/034-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/034-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/034-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/035-get-v7-tests-ftp-server-281474976976875.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/035-get-v7-tests-ftp-server-281474976976875.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/035-get-v7-tests-ftp-server-281474976976875.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/035-get-v7-tests-ftp-server-281474976976875.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/036-put-v7-tests-ftp-server-281474976976875.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/036-put-v7-tests-ftp-server-281474976976875.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/036-put-v7-tests-ftp-server-281474976976875.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/036-put-v7-tests-ftp-server-281474976976875.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/037-delete-v7-tests-ftp-server-281474976976873.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/037-delete-v7-tests-ftp-server-281474976976873.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/037-delete-v7-tests-ftp-server-281474976976873.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/037-delete-v7-tests-ftp-server-281474976976873.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/038-delete-v7-tests-ftp-server-281474976976874.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/038-delete-v7-tests-ftp-server-281474976976874.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/038-delete-v7-tests-ftp-server-281474976976874.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/038-delete-v7-tests-ftp-server-281474976976874.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/039-delete-v7-tests-ftp-server-281474976976875.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/039-delete-v7-tests-ftp-server-281474976976875.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/039-delete-v7-tests-ftp-server-281474976976875.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/039-delete-v7-tests-ftp-server-281474976976875.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/040-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/040-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/040-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/040-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/041-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/041-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/041-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/041-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/042-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/042-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/042-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/042-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/043-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/043-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/043-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/043-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/044-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/044-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/044-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/044-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/045-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/045-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/045-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/045-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/046-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/046-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/046-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/046-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/047-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/047-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/047-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/047-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/048-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/048-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/048-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/048-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/049-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/049-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/049-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/049-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/050-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/050-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/050-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/050-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/051-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/051-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/051-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/051-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/052-delete-v7-tests-ftp-server-281474976976876.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/052-delete-v7-tests-ftp-server-281474976976876.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/052-delete-v7-tests-ftp-server-281474976976876.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/052-delete-v7-tests-ftp-server-281474976976876.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/053-delete-v7-tests-ftp-server-281474976976877.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/053-delete-v7-tests-ftp-server-281474976976877.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/053-delete-v7-tests-ftp-server-281474976976877.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/053-delete-v7-tests-ftp-server-281474976976877.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/054-delete-v7-tests-ftp-server-281474976976878.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/054-delete-v7-tests-ftp-server-281474976976878.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/054-delete-v7-tests-ftp-server-281474976976878.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/054-delete-v7-tests-ftp-server-281474976976878.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/055-delete-v7-tests-ftp-server-281474976976879.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/055-delete-v7-tests-ftp-server-281474976976879.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/055-delete-v7-tests-ftp-server-281474976976879.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/055-delete-v7-tests-ftp-server-281474976976879.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/056-delete-v7-tests-ftp-server-281474976976880.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/056-delete-v7-tests-ftp-server-281474976976880.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/056-delete-v7-tests-ftp-server-281474976976880.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/056-delete-v7-tests-ftp-server-281474976976880.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/057-delete-v7-tests-ftp-server-281474976976881.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/057-delete-v7-tests-ftp-server-281474976976881.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/057-delete-v7-tests-ftp-server-281474976976881.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/057-delete-v7-tests-ftp-server-281474976976881.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/058-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/058-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/058-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/058-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/059-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/059-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/059-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/059-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/060-get-v7-tests-ftp-server-281474976976882.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/060-get-v7-tests-ftp-server-281474976976882.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/060-get-v7-tests-ftp-server-281474976976882.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/060-get-v7-tests-ftp-server-281474976976882.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/061-delete-v7-tests-ftp-server-281474976976882.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/061-delete-v7-tests-ftp-server-281474976976882.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/061-delete-v7-tests-ftp-server-281474976976882.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/061-delete-v7-tests-ftp-server-281474976976882.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/062-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/062-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/062-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/interactions/062-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/metadata.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/metadata.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/metadata.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/report.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/report.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/report.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/plan.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/plan.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/scenario.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/subject.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/subject.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785745105202/subject.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/facts.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/facts.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/facts.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/001-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/001-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/001-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/001-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/002-get-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/002-get-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/002-get-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/002-get-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/003-put-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/003-put-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/003-put-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/003-put-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/004-get-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/004-get-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/004-get-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/004-get-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/005-put-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/005-put-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/005-put-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/005-put-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/006-get-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/006-get-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/006-get-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/006-get-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/007-delete-v7-tests-ftp-server-281474976977119.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/007-delete-v7-tests-ftp-server-281474976977119.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/007-delete-v7-tests-ftp-server-281474976977119.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/007-delete-v7-tests-ftp-server-281474976977119.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/008-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/008-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/008-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/008-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/009-post-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/009-post-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/009-post-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/009-post-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/010-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/010-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/010-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/010-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/011-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/011-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/011-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/011-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/012-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/012-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/012-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/012-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/013-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/013-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/013-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/013-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/014-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/014-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/014-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/014-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/015-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/015-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/015-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/015-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/016-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/016-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/016-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/016-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/017-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/017-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/017-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/017-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/018-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/018-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/018-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/018-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/019-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/019-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/019-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/019-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/020-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/020-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/020-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/020-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/021-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/021-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/021-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/021-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/022-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/022-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/022-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/022-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/023-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/023-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/023-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/023-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/024-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/024-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/024-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/024-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/025-put-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/025-put-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/025-put-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/025-put-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/026-delete-v7-tests-ftp-server-281474976977120.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/026-delete-v7-tests-ftp-server-281474976977120.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/026-delete-v7-tests-ftp-server-281474976977120.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/026-delete-v7-tests-ftp-server-281474976977120.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/027-get-v7-tests-ftp-server.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/027-get-v7-tests-ftp-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/027-get-v7-tests-ftp-server.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/interactions/027-get-v7-tests-ftp-server.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/metadata.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/metadata.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/metadata.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/rehearsal.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/rehearsal.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/rehearsal.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/report.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/report.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/report.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/plan.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/plan.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/scenario.json diff --git a/probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/subject.json b/recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/subject.json rename to recordings/thousandeyes/tests_ftp_server/7.0.98-t1785758238083/subject.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/facts.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/facts.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/facts.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/001-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/001-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/001-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/001-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/002-get-v7-tests-http-server-999999999.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/002-get-v7-tests-http-server-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/002-get-v7-tests-http-server-999999999.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/002-get-v7-tests-http-server-999999999.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/003-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/003-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/003-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/003-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/004-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/004-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/004-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/004-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/005-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/005-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/005-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/005-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/006-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/006-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/006-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/006-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/007-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/007-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/007-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/007-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/008-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/008-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/008-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/008-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/009-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/009-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/009-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/009-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/010-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/010-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/010-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/010-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/011-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/011-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/011-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/011-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/012-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/012-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/012-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/012-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/013-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/013-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/013-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/013-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/014-delete-v7-tests-http-server-281474976976775.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/014-delete-v7-tests-http-server-281474976976775.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/014-delete-v7-tests-http-server-281474976976775.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/014-delete-v7-tests-http-server-281474976976775.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/015-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/015-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/015-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/015-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/016-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/016-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/016-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/016-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/017-get-v7-tests-http-server-281474976976776.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/017-get-v7-tests-http-server-281474976976776.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/017-get-v7-tests-http-server-281474976976776.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/017-get-v7-tests-http-server-281474976976776.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/018-put-v7-tests-http-server-281474976976776.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/018-put-v7-tests-http-server-281474976976776.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/018-put-v7-tests-http-server-281474976976776.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/018-put-v7-tests-http-server-281474976976776.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/019-get-v7-tests-http-server-281474976976776.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/019-get-v7-tests-http-server-281474976976776.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/019-get-v7-tests-http-server-281474976976776.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/019-get-v7-tests-http-server-281474976976776.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/020-delete-v7-tests-http-server-281474976976776.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/020-delete-v7-tests-http-server-281474976976776.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/020-delete-v7-tests-http-server-281474976976776.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/020-delete-v7-tests-http-server-281474976976776.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/021-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/021-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/021-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/021-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/022-get-v7-tests-http-server-281474976976777.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/022-get-v7-tests-http-server-281474976976777.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/022-get-v7-tests-http-server-281474976976777.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/022-get-v7-tests-http-server-281474976976777.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/023-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/023-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/023-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/023-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/024-get-v7-tests-http-server-281474976976778.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/024-get-v7-tests-http-server-281474976976778.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/024-get-v7-tests-http-server-281474976976778.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/024-get-v7-tests-http-server-281474976976778.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/025-delete-v7-tests-http-server-281474976976777.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/025-delete-v7-tests-http-server-281474976976777.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/025-delete-v7-tests-http-server-281474976976777.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/025-delete-v7-tests-http-server-281474976976777.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/026-delete-v7-tests-http-server-281474976976778.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/026-delete-v7-tests-http-server-281474976976778.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/026-delete-v7-tests-http-server-281474976976778.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/026-delete-v7-tests-http-server-281474976976778.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/027-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/027-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/027-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/027-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/028-get-v7-tests-http-server-281474976976779.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/028-get-v7-tests-http-server-281474976976779.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/028-get-v7-tests-http-server-281474976976779.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/028-get-v7-tests-http-server-281474976976779.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/029-put-v7-tests-http-server-281474976976779.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/029-put-v7-tests-http-server-281474976976779.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/029-put-v7-tests-http-server-281474976976779.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/029-put-v7-tests-http-server-281474976976779.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/030-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/030-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/030-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/030-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/031-put-v7-tests-http-server-281474976976779.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/031-put-v7-tests-http-server-281474976976779.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/031-put-v7-tests-http-server-281474976976779.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/031-put-v7-tests-http-server-281474976976779.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/032-get-v7-tests-http-server-281474976976779.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/032-get-v7-tests-http-server-281474976976779.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/032-get-v7-tests-http-server-281474976976779.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/032-get-v7-tests-http-server-281474976976779.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/033-delete-v7-tests-http-server-281474976976779.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/033-delete-v7-tests-http-server-281474976976779.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/033-delete-v7-tests-http-server-281474976976779.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/033-delete-v7-tests-http-server-281474976976779.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/034-delete-v7-tests-http-server-281474976976780.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/034-delete-v7-tests-http-server-281474976976780.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/034-delete-v7-tests-http-server-281474976976780.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/034-delete-v7-tests-http-server-281474976976780.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/035-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/035-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/035-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/035-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/036-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/036-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/036-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/036-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/037-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/037-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/037-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/037-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/038-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/038-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/038-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/038-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/039-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/039-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/039-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/039-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/040-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/040-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/040-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/040-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/041-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/041-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/041-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/041-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/042-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/042-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/042-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/042-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/043-delete-v7-tests-http-server-281474976976783.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/043-delete-v7-tests-http-server-281474976976783.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/043-delete-v7-tests-http-server-281474976976783.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/043-delete-v7-tests-http-server-281474976976783.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/044-delete-v7-tests-http-server-281474976976784.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/044-delete-v7-tests-http-server-281474976976784.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/044-delete-v7-tests-http-server-281474976976784.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/044-delete-v7-tests-http-server-281474976976784.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/045-delete-v7-tests-http-server-281474976976785.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/045-delete-v7-tests-http-server-281474976976785.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/045-delete-v7-tests-http-server-281474976976785.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/045-delete-v7-tests-http-server-281474976976785.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/046-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/046-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/046-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/046-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/047-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/047-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/047-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/047-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/048-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/048-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/048-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/048-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/049-delete-v7-tests-http-server-281474976976781.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/049-delete-v7-tests-http-server-281474976976781.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/049-delete-v7-tests-http-server-281474976976781.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/049-delete-v7-tests-http-server-281474976976781.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/050-delete-v7-tests-http-server-281474976976782.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/050-delete-v7-tests-http-server-281474976976782.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/050-delete-v7-tests-http-server-281474976976782.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/050-delete-v7-tests-http-server-281474976976782.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/051-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/051-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/051-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/051-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/052-delete-v7-tests-http-server-281474976976786.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/052-delete-v7-tests-http-server-281474976976786.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/052-delete-v7-tests-http-server-281474976976786.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/interactions/052-delete-v7-tests-http-server-281474976976786.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/metadata.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/metadata.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/metadata.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/report.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/report.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/report.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/plan.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/plan.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/scenario.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/subject.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785744687658/subject.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785744687658/subject.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/facts.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/facts.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/facts.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/001-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/001-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/001-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/001-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/002-get-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/002-get-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/002-get-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/002-get-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/003-put-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/003-put-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/003-put-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/003-put-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/004-get-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/004-get-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/004-get-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/004-get-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/005-put-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/005-put-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/005-put-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/005-put-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/006-get-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/006-get-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/006-get-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/006-get-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/007-delete-v7-tests-http-server-281474976977121.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/007-delete-v7-tests-http-server-281474976977121.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/007-delete-v7-tests-http-server-281474976977121.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/007-delete-v7-tests-http-server-281474976977121.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/008-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/008-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/008-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/008-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/009-post-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/009-post-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/009-post-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/009-post-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/010-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/010-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/010-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/010-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/011-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/011-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/011-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/011-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/012-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/012-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/012-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/012-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/013-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/013-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/013-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/013-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/014-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/014-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/014-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/014-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/015-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/015-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/015-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/015-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/016-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/016-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/016-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/016-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/017-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/017-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/017-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/017-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/018-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/018-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/018-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/018-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/019-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/019-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/019-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/019-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/020-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/020-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/020-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/020-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/021-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/021-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/021-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/021-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/022-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/022-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/022-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/022-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/023-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/023-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/023-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/023-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/024-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/024-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/024-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/024-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/025-put-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/025-put-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/025-put-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/025-put-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/026-delete-v7-tests-http-server-281474976977122.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/026-delete-v7-tests-http-server-281474976977122.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/026-delete-v7-tests-http-server-281474976977122.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/026-delete-v7-tests-http-server-281474976977122.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/027-get-v7-tests-http-server.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/027-get-v7-tests-http-server.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/027-get-v7-tests-http-server.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/interactions/027-get-v7-tests-http-server.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/metadata.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/metadata.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/metadata.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/rehearsal.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/rehearsal.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/rehearsal.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/report.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/report.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/report.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/plan.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/plan.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/scenario.json diff --git a/probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/subject.json b/recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_http_server/7.0.98-t1785758268502/subject.json rename to recordings/thousandeyes/tests_http_server/7.0.98-t1785758268502/subject.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/facts.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/facts.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/facts.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/001-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/001-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/001-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/001-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/002-get-v7-tests-page-load-999999999.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/002-get-v7-tests-page-load-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/002-get-v7-tests-page-load-999999999.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/002-get-v7-tests-page-load-999999999.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/003-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/003-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/003-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/003-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/004-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/004-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/004-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/004-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/005-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/005-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/005-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/005-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/006-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/006-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/006-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/006-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/007-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/007-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/007-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/007-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/008-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/008-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/008-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/008-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/009-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/009-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/009-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/009-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/010-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/010-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/010-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/010-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/011-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/011-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/011-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/011-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/012-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/012-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/012-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/012-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/013-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/013-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/013-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/013-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/014-delete-v7-tests-page-load-281474976976883.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/014-delete-v7-tests-page-load-281474976976883.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/014-delete-v7-tests-page-load-281474976976883.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/014-delete-v7-tests-page-load-281474976976883.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/015-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/015-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/015-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/015-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/016-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/016-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/016-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/016-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/017-get-v7-tests-page-load-281474976976884.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/017-get-v7-tests-page-load-281474976976884.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/017-get-v7-tests-page-load-281474976976884.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/017-get-v7-tests-page-load-281474976976884.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/018-put-v7-tests-page-load-281474976976884.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/018-put-v7-tests-page-load-281474976976884.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/018-put-v7-tests-page-load-281474976976884.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/018-put-v7-tests-page-load-281474976976884.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/019-get-v7-tests-page-load-281474976976884.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/019-get-v7-tests-page-load-281474976976884.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/019-get-v7-tests-page-load-281474976976884.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/019-get-v7-tests-page-load-281474976976884.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/020-delete-v7-tests-page-load-281474976976884.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/020-delete-v7-tests-page-load-281474976976884.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/020-delete-v7-tests-page-load-281474976976884.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/020-delete-v7-tests-page-load-281474976976884.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/021-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/021-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/021-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/021-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/022-get-v7-tests-page-load-281474976976885.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/022-get-v7-tests-page-load-281474976976885.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/022-get-v7-tests-page-load-281474976976885.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/022-get-v7-tests-page-load-281474976976885.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/023-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/023-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/023-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/023-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/024-get-v7-tests-page-load-281474976976886.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/024-get-v7-tests-page-load-281474976976886.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/024-get-v7-tests-page-load-281474976976886.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/024-get-v7-tests-page-load-281474976976886.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/025-delete-v7-tests-page-load-281474976976885.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/025-delete-v7-tests-page-load-281474976976885.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/025-delete-v7-tests-page-load-281474976976885.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/025-delete-v7-tests-page-load-281474976976885.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/026-delete-v7-tests-page-load-281474976976886.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/026-delete-v7-tests-page-load-281474976976886.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/026-delete-v7-tests-page-load-281474976976886.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/026-delete-v7-tests-page-load-281474976976886.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/027-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/027-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/027-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/027-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/028-get-v7-tests-page-load-281474976976887.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/028-get-v7-tests-page-load-281474976976887.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/028-get-v7-tests-page-load-281474976976887.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/028-get-v7-tests-page-load-281474976976887.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/029-put-v7-tests-page-load-281474976976887.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/029-put-v7-tests-page-load-281474976976887.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/029-put-v7-tests-page-load-281474976976887.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/029-put-v7-tests-page-load-281474976976887.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/030-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/030-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/030-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/030-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/031-put-v7-tests-page-load-281474976976887.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/031-put-v7-tests-page-load-281474976976887.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/031-put-v7-tests-page-load-281474976976887.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/031-put-v7-tests-page-load-281474976976887.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/032-get-v7-tests-page-load-281474976976887.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/032-get-v7-tests-page-load-281474976976887.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/032-get-v7-tests-page-load-281474976976887.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/032-get-v7-tests-page-load-281474976976887.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/033-delete-v7-tests-page-load-281474976976887.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/033-delete-v7-tests-page-load-281474976976887.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/033-delete-v7-tests-page-load-281474976976887.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/033-delete-v7-tests-page-load-281474976976887.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/034-delete-v7-tests-page-load-281474976976888.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/034-delete-v7-tests-page-load-281474976976888.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/034-delete-v7-tests-page-load-281474976976888.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/034-delete-v7-tests-page-load-281474976976888.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/035-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/035-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/035-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/035-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/036-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/036-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/036-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/036-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/037-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/037-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/037-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/037-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/038-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/038-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/038-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/038-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/039-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/039-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/039-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/039-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/040-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/040-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/040-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/040-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/041-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/041-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/041-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/041-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/042-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/042-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/042-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/042-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/043-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/043-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/043-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/043-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/044-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/044-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/044-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/044-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/045-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/045-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/045-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/045-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/046-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/046-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/046-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/046-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/047-delete-v7-tests-page-load-281474976976889.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/047-delete-v7-tests-page-load-281474976976889.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/047-delete-v7-tests-page-load-281474976976889.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/047-delete-v7-tests-page-load-281474976976889.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/048-delete-v7-tests-page-load-281474976976890.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/048-delete-v7-tests-page-load-281474976976890.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/048-delete-v7-tests-page-load-281474976976890.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/048-delete-v7-tests-page-load-281474976976890.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/049-delete-v7-tests-page-load-281474976976891.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/049-delete-v7-tests-page-load-281474976976891.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/049-delete-v7-tests-page-load-281474976976891.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/049-delete-v7-tests-page-load-281474976976891.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/050-delete-v7-tests-page-load-281474976976892.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/050-delete-v7-tests-page-load-281474976976892.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/050-delete-v7-tests-page-load-281474976976892.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/050-delete-v7-tests-page-load-281474976976892.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/051-delete-v7-tests-page-load-281474976976893.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/051-delete-v7-tests-page-load-281474976976893.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/051-delete-v7-tests-page-load-281474976976893.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/051-delete-v7-tests-page-load-281474976976893.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/052-delete-v7-tests-page-load-281474976976894.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/052-delete-v7-tests-page-load-281474976976894.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/052-delete-v7-tests-page-load-281474976976894.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/052-delete-v7-tests-page-load-281474976976894.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/053-delete-v7-tests-page-load-281474976976895.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/053-delete-v7-tests-page-load-281474976976895.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/053-delete-v7-tests-page-load-281474976976895.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/053-delete-v7-tests-page-load-281474976976895.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/054-delete-v7-tests-page-load-281474976976896.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/054-delete-v7-tests-page-load-281474976976896.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/054-delete-v7-tests-page-load-281474976976896.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/054-delete-v7-tests-page-load-281474976976896.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/055-delete-v7-tests-page-load-281474976976897.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/055-delete-v7-tests-page-load-281474976976897.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/055-delete-v7-tests-page-load-281474976976897.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/055-delete-v7-tests-page-load-281474976976897.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/056-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/056-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/056-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/056-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/057-post-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/057-post-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/057-post-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/057-post-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/058-get-v7-tests-page-load.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/058-get-v7-tests-page-load.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/058-get-v7-tests-page-load.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/interactions/058-get-v7-tests-page-load.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/metadata.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/metadata.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/metadata.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/report.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/report.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/report.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/plan.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/plan.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/scenario.json diff --git a/probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/subject.json b/recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_page_load/7.0.98-t1785745161014/subject.json rename to recordings/thousandeyes/tests_page_load/7.0.98-t1785745161014/subject.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/facts.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/facts.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/facts.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/facts.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/001-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/001-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/001-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/001-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/002-get-v7-tests-web-transactions-999999999.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/002-get-v7-tests-web-transactions-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/002-get-v7-tests-web-transactions-999999999.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/002-get-v7-tests-web-transactions-999999999.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/003-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/003-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/003-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/003-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/004-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/004-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/004-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/004-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/005-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/005-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/005-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/005-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/006-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/006-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/006-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/006-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/007-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/007-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/007-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/007-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/008-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/008-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/008-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/008-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/009-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/009-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/009-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/009-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/010-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/010-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/010-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/010-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/011-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/011-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/011-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/011-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/012-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/012-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/012-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/012-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/013-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/013-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/013-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/013-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/014-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/014-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/014-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/014-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/015-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/015-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/015-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/015-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/016-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/016-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/016-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/016-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/017-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/017-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/017-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/017-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/018-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/018-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/018-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/018-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/019-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/019-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/019-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/019-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/020-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/020-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/020-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/020-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/021-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/021-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/021-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/021-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/022-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/022-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/022-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/022-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/023-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/023-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/023-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/023-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/024-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/024-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/024-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/024-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/025-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/025-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/025-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/025-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/026-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/026-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/026-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/026-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/027-post-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/027-post-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/027-post-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/027-post-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/028-get-v7-tests-web-transactions.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/028-get-v7-tests-web-transactions.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/028-get-v7-tests-web-transactions.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/interactions/028-get-v7-tests-web-transactions.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/metadata.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/metadata.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/metadata.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/report.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/report.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/report.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/report.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/plan.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/plan.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/scenario.json diff --git a/probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/subject.json b/recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/subject.json similarity index 100% rename from probe-evidence/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/subject.json rename to recordings/thousandeyes/tests_web_transaction/7.0.98-t1785745177323/subject.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/facts.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/facts.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/facts.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/facts.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/metadata.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/metadata.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/metadata.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/metadata.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/report.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/report.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/report.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/report.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/plan.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/scenario.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/plan.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/scenario.json diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/subject.json b/recordings/thousandeyes/user/7.0.98-t1785772809774/subject.json similarity index 100% rename from probe-evidence/thousandeyes/user/7.0.98-t1785772809774/subject.json rename to recordings/thousandeyes/user/7.0.98-t1785772809774/subject.json diff --git a/release-please-config.json b/release-please-config.json index a0c625b7..e0059615 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -5,7 +5,7 @@ "include-component-in-tag": false, "packages": { ".": { - "package-name": "tfpluginframeworkgen", + "package-name": "tfpfgen", "changelog-path": "CHANGELOG.md" } }, diff --git a/interop-specs/thousandeyes/provider-code-spec.json b/specs/thousandeyes/provider-code-spec.json similarity index 99% rename from interop-specs/thousandeyes/provider-code-spec.json rename to specs/thousandeyes/provider-code-spec.json index 5177f00b..2bb9185d 100644 --- a/interop-specs/thousandeyes/provider-code-spec.json +++ b/specs/thousandeyes/provider-code-spec.json @@ -531,142 +531,7 @@ } }, { - "name": "alert_suppression_window", - "schema": { - "attributes": [ - { - "name": "id", - "string": { - "computed_optional_required": "computed", - "description": "Unique ID of the alert suppression window.\n\nNamed `id` because terraform-plugin-testing populates import state only from an attribute literally called id; the wire field stays alertSuppressionWindowId." - } - }, - { - "name": "duration", - "int64": { - "computed_optional_required": "optional", - "description": "Duration in seconds the suppression window is active.\n\nThe API refuses a window without a duration (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" - } - }, - { - "name": "end_repeat", - "single_nested": { - "computed_optional_required": "computed_optional", - "attributes": [ - { - "name": "count", - "int64": { - "computed_optional_required": "optional", - "description": "End repeat after number of occurrences, only valid with count type option." - } - }, - { - "name": "date", - "string": { - "computed_optional_required": "optional", - "description": "End repeat after specific date, only valid with date type option (ISO date format)." - } - }, - { - "name": "type", - "string": { - "computed_optional_required": "computed_optional", - "description": "End repeat options type.\n\n\nValues accepted here: `count`, `never`, `date`.\nObserved: the API assigns \"never\" when this is omitted.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" - } - } - ], - "associated_external_type": { - "type": "alert_suppression_windows.EndRepeat" - }, - "description": "End repeat options.\n\nThe API assigns { type = \"never\" } when omitted (live acceptance, 2026-08-03)." - } - }, - { - "name": "is_enabled", - "bool": { - "computed_optional_required": "computed_optional", - "description": "Set to `false` for `disabled`, `true` for `enabled`." - } - }, - { - "name": "name", - "string": { - "computed_optional_required": "optional", - "description": "Name of the alert suppression window.\n\nThe API refuses a window without a name (live acceptance, 2026-08-03); the probe cannot test this itself because name carries the sweeper's prefix." - } - }, - { - "name": "repeat", - "single_nested": { - "computed_optional_required": "optional", - "attributes": [ - { - "name": "days_of_week", - "set": { - "computed_optional_required": "optional", - "element_type": { - "string": {} - } - } - }, - { - "name": "interval_length", - "int64": { - "computed_optional_required": "optional", - "description": "Number of `intervalTypes` to wait before reactivating the alert suppression window." - } - }, - { - "name": "interval_type", - "string": { - "computed_optional_required": "optional", - "description": "Repeat options interval type\n\n\nValues accepted here: `day`, `week`, `month`.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" - } - }, - { - "name": "type", - "string": { - "computed_optional_required": "computed_optional", - "description": "Repeat options type.\n\n\nValues accepted here: `day`, `week`, `month`, `custom`.\nObserved: the API assigns \"none\" when this is omitted.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" - } - } - ], - "associated_external_type": { - "type": "alert_suppression_windows.Repeat" - }, - "description": "Repeat options.\n\nThe API requires repeat conditions on every window; a one-off window carries `type = \"none\"` (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" - } - }, - { - "name": "start_date", - "string": { - "computed_optional_required": "optional", - "description": "The date/time when the alert suppression window starts (ISO date-time format).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" - } - }, - { - "name": "status", - "string": { - "computed_optional_required": "computed", - "description": "Indicates the current status of the suppression window." - } - }, - { - "name": "test_ids", - "set": { - "computed_optional_required": "optional", - "element_type": { - "string": {} - }, - "description": "List of test IDs to assign to the alert suppression window.\n\nThe response never carries testIds -- it echoes the linked tests as a nested collection instead -- so state carries the configured value.\n\n\nNeither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.\n" - } - } - ], - "markdown_description": "Retrieve alert suppression window." - } - }, - { - "name": "alerts_rule", + "name": "alert_rule", "schema": { "attributes": [ { @@ -832,6 +697,141 @@ "markdown_description": "Retrieve alert rule." } }, + { + "name": "alert_suppression_window", + "schema": { + "attributes": [ + { + "name": "id", + "string": { + "computed_optional_required": "computed", + "description": "Unique ID of the alert suppression window.\n\nNamed `id` because terraform-plugin-testing populates import state only from an attribute literally called id; the wire field stays alertSuppressionWindowId." + } + }, + { + "name": "duration", + "int64": { + "computed_optional_required": "optional", + "description": "Duration in seconds the suppression window is active.\n\nThe API refuses a window without a duration (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" + } + }, + { + "name": "end_repeat", + "single_nested": { + "computed_optional_required": "computed_optional", + "attributes": [ + { + "name": "count", + "int64": { + "computed_optional_required": "optional", + "description": "End repeat after number of occurrences, only valid with count type option." + } + }, + { + "name": "date", + "string": { + "computed_optional_required": "optional", + "description": "End repeat after specific date, only valid with date type option (ISO date format)." + } + }, + { + "name": "type", + "string": { + "computed_optional_required": "computed_optional", + "description": "End repeat options type.\n\n\nValues accepted here: `count`, `never`, `date`.\nObserved: the API assigns \"never\" when this is omitted.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" + } + } + ], + "associated_external_type": { + "type": "alert_suppression_windows.EndRepeat" + }, + "description": "End repeat options.\n\nThe API assigns { type = \"never\" } when omitted (live acceptance, 2026-08-03)." + } + }, + { + "name": "is_enabled", + "bool": { + "computed_optional_required": "computed_optional", + "description": "Set to `false` for `disabled`, `true` for `enabled`." + } + }, + { + "name": "name", + "string": { + "computed_optional_required": "optional", + "description": "Name of the alert suppression window.\n\nThe API refuses a window without a name (live acceptance, 2026-08-03); the probe cannot test this itself because name carries the sweeper's prefix." + } + }, + { + "name": "repeat", + "single_nested": { + "computed_optional_required": "optional", + "attributes": [ + { + "name": "days_of_week", + "set": { + "computed_optional_required": "optional", + "element_type": { + "string": {} + } + } + }, + { + "name": "interval_length", + "int64": { + "computed_optional_required": "optional", + "description": "Number of `intervalTypes` to wait before reactivating the alert suppression window." + } + }, + { + "name": "interval_type", + "string": { + "computed_optional_required": "optional", + "description": "Repeat options interval type\n\n\nValues accepted here: `day`, `week`, `month`.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" + } + }, + { + "name": "type", + "string": { + "computed_optional_required": "computed_optional", + "description": "Repeat options type.\n\n\nValues accepted here: `day`, `week`, `month`, `custom`.\nObserved: the API assigns \"none\" when this is omitted.\nThe API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.\n" + } + } + ], + "associated_external_type": { + "type": "alert_suppression_windows.Repeat" + }, + "description": "Repeat options.\n\nThe API requires repeat conditions on every window; a one-off window carries `type = \"none\"` (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" + } + }, + { + "name": "start_date", + "string": { + "computed_optional_required": "optional", + "description": "The date/time when the alert suppression window starts (ISO date-time format).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n" + } + }, + { + "name": "status", + "string": { + "computed_optional_required": "computed", + "description": "Indicates the current status of the suppression window." + } + }, + { + "name": "test_ids", + "set": { + "computed_optional_required": "optional", + "element_type": { + "string": {} + }, + "description": "List of test IDs to assign to the alert suppression window.\n\nThe response never carries testIds -- it echoes the linked tests as a nested collection instead -- so state carries the configured value.\n\n\nNeither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.\n" + } + } + ], + "markdown_description": "Retrieve alert suppression window." + } + }, { "name": "credential", "schema": { @@ -1017,7 +1017,7 @@ } }, { - "name": "dashboards_filter", + "name": "dashboard_filter", "schema": { "attributes": [ {