diff --git a/blueprints/thousandeyes/account_group.probe.plan.json b/blueprints/thousandeyes/account_group.probe.plan.json
new file mode 100644
index 00000000..dcc549f0
--- /dev/null
+++ b/blueprints/thousandeyes/account_group.probe.plan.json
@@ -0,0 +1,16 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "accountGroupName": "CURATE_ME-stamped-by-probe"
+ }
+ }
+ ],
+ "candidates": {},
+ "deny": [],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 25
+ }
+}
diff --git a/blueprints/thousandeyes/resources/account_group.blueprint.json b/blueprints/thousandeyes/resources/account_group.blueprint.json
new file mode 100644
index 00000000..7e2a2574
--- /dev/null
+++ b/blueprints/thousandeyes/resources/account_group.blueprint.json
@@ -0,0 +1,473 @@
+{
+ "formatVersion": "4",
+ "resources": [
+ {
+ "key": "account_group",
+ "name": "account_group",
+ "goPackage": "account_group",
+ "goPackageAlias": "v7AccountGroup",
+ "goTypeName": "AccountGroupResource",
+ "modelTypeName": "AccountGroupResourceModel",
+ "serviceGroup": "account_groups",
+ "apiVersionDir": "v7",
+ "schema": {
+ "attributes": [
+ {
+ "name": "account_group_name",
+ "goField": "AccountGroupName",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Account group name\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission.",
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": true,
+ "returnedOnCreate": true
+ },
+ "wire": {
+ "jsonPath": "accountGroupName",
+ "sdkField": "AccountGroupName",
+ "sdkGoType": "string",
+ "expand": {
+ "func": "convert.FrameworkToString"
+ },
+ "flatten": {
+ "func": "convert.PtrStringToFramework",
+ "typeArgs": [
+ "string"
+ ]
+ }
+ }
+ },
+ {
+ "name": "id",
+ "goField": "ID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint.\n\nNamed `id` per the import convention; the wire field stays aid.",
+ "wire": {
+ "jsonPath": "aid",
+ "sdkField": "AID",
+ "sdkGoType": "account_groups.AccountGroupId",
+ "flatten": {
+ "func": "convert.EnumToFramework",
+ "typeArgs": [
+ "account_groups.AccountGroupId"
+ ]
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "is_current_account_group",
+ "goField": "IsCurrentAccountGroup",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Indicates whether the requested aid is the context of the current account.",
+ "wire": {
+ "jsonPath": "isCurrentAccountGroup",
+ "sdkField": "IsCurrentAccountGroup",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "is_default_account_group",
+ "goField": "IsDefaultAccountGroup",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Indicates whether the aid is the default one for the requesting user.",
+ "wire": {
+ "jsonPath": "isDefaultAccountGroup",
+ "sdkField": "IsDefaultAccountGroup",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "org_id",
+ "goField": "OrgID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "(Optional) The ID for the organization associated with the account group.",
+ "wire": {
+ "jsonPath": "orgId",
+ "sdkField": "OrgID",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "organization_name",
+ "goField": "OrganizationName",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "(Optional) The name of the organization associated with the account group.",
+ "wire": {
+ "jsonPath": "organizationName",
+ "sdkField": "OrganizationName",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "users",
+ "goField": "Users",
+ "type": {
+ "kind": "set_nested",
+ "nestedObject": {
+ "goTypeName": "AccountGroupUserAccountGroupModel",
+ "sdkType": "account_groups.UserAccountGroup",
+ "attrTypesVar": "accountGroupUserAccountGroupAttrTypes",
+ "objectTypeVar": "accountGroupUserAccountGroupObjectType",
+ "expandFunc": "expandAccountGroupUserAccountGroups",
+ "flattenFunc": "flattenAccountGroupUserAccountGroups",
+ "attributes": [
+ {
+ "name": "date_registered",
+ "goField": "DateRegistered",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "User's UTC registration date (ISO date-time format).",
+ "wire": {
+ "jsonPath": "dateRegistered",
+ "sdkField": "DateRegistered",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "email",
+ "goField": "Email",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "email"
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "User's email address.",
+ "wire": {
+ "jsonPath": "email",
+ "sdkField": "Email",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "last_login",
+ "goField": "LastLogin",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "User's UTC last login date (ISO date-time format).",
+ "wire": {
+ "jsonPath": "lastLogin",
+ "sdkField": "LastLogin",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "name",
+ "goField": "Name",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "User's display name.",
+ "wire": {
+ "jsonPath": "name",
+ "sdkField": "Name",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "roles",
+ "goField": "Roles",
+ "type": {
+ "kind": "set_nested",
+ "nestedObject": {
+ "goTypeName": "AccountGroupRoleModel",
+ "sdkType": "account_groups.Role",
+ "attrTypesVar": "accountGroupRoleAttrTypes",
+ "objectTypeVar": "accountGroupRoleObjectType",
+ "expandFunc": "expandAccountGroupRoles",
+ "flattenFunc": "flattenAccountGroupRoles",
+ "attributes": [
+ {
+ "name": "has_management_permissions",
+ "goField": "HasManagementPermissions",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Flag indicating whether the user has management permissions.",
+ "wire": {
+ "jsonPath": "hasManagementPermissions",
+ "sdkField": "HasManagementPermissions",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "is_builtin",
+ "goField": "IsBuiltin",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).",
+ "wire": {
+ "jsonPath": "isBuiltin",
+ "sdkField": "IsBuiltin",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "name",
+ "goField": "Name",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Name of the role.",
+ "wire": {
+ "jsonPath": "name",
+ "sdkField": "Name",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "role_id",
+ "goField": "RoleID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Unique ID representing the role.",
+ "wire": {
+ "jsonPath": "roleId",
+ "sdkField": "RoleID",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ]
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "wire": {
+ "jsonPath": "roles",
+ "sdkField": "Roles",
+ "sdkGoType": "[]account_groups.Role",
+ "flatten": {
+ "func": "flattenAccountGroupRoles",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "uid",
+ "goField": "Uid",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Unique ID representing the user.",
+ "wire": {
+ "jsonPath": "uid",
+ "sdkField": "Uid",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ]
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "wire": {
+ "jsonPath": "users",
+ "sdkField": "Users",
+ "sdkGoType": "[]account_groups.UserAccountGroup",
+ "flatten": {
+ "func": "flattenAccountGroupUserAccountGroups",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipExpand": true
+ }
+ }
+ ],
+ "markdownDescription": "Retrieve account group."
+ },
+ "binding": {
+ "service": {
+ "importPath": "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/account_groups",
+ "typeName": "AccountGroups",
+ "accessor": "r.client.API.AccountGroups"
+ },
+ "create": {
+ "style": "method",
+ "method": "CreateAccountGroup",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "account_groups.CreatedAccountGroup",
+ "httpMethod": "POST",
+ "pathTemplate": "/account-groups"
+ },
+ "read": {
+ "style": "method",
+ "method": "GetAccountGroup",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "account_groups.AccountGroupDetail",
+ "httpMethod": "GET",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "update": {
+ "style": "method",
+ "method": "UpdateAccountGroup",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "account_groups.AccountGroupDetail",
+ "httpMethod": "PUT",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "delete": {
+ "style": "method",
+ "method": "DeleteAccountGroup",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "transportError",
+ "httpMethod": "DELETE",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "id": {
+ "attribute": "id",
+ "goField": "ID",
+ "fromCreate": "created.AID"
+ },
+ "body": {
+ "requestType": "account_groups.AccountGroupRequest",
+ "responseType": "account_groups.AccountGroupDetail",
+ "constructorExpr": "&account_groups.AccountGroupRequest{}",
+ "accessStyle": "structField"
+ }
+ },
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "import": {
+ "style": "passthroughId",
+ "attribute": "id"
+ },
+ "sweep": {
+ "nameField": "accountGroupName"
+ },
+ "accTest": {
+ "skipUnlessEnv": "TFPFGEN_ACC_ADMIN"
+ }
+ }
+ ]
+}
diff --git a/blueprints/thousandeyes/resources/dashboard.blueprint.json b/blueprints/thousandeyes/resources/dashboard.blueprint.json
index 84546612..a3fb0aad 100644
--- a/blueprints/thousandeyes/resources/dashboard.blueprint.json
+++ b/blueprints/thousandeyes/resources/dashboard.blueprint.json
@@ -693,6 +693,9 @@
},
"computedOptionalRequired": "optional",
"markdownDescription": "Title of a dashboard.\n\nMarked required-by-API by curation: title is the sweeper's field, so the probe cannot test omitting it, and a titleless dashboard is unaddressable in the UI either way.",
+ "behaviour": {
+ "requiredByApi": true
+ },
"wire": {
"jsonPath": "title",
"sdkField": "Title",
@@ -703,9 +706,6 @@
"flatten": {
"func": "convert.PtrStringToFramework"
}
- },
- "behaviour": {
- "requiredByApi": true
}
}
],
diff --git a/blueprints/thousandeyes/resources/role.blueprint.json b/blueprints/thousandeyes/resources/role.blueprint.json
new file mode 100644
index 00000000..2945736f
--- /dev/null
+++ b/blueprints/thousandeyes/resources/role.blueprint.json
@@ -0,0 +1,223 @@
+{
+ "formatVersion": "4",
+ "resources": [
+ {
+ "key": "role",
+ "name": "role",
+ "goPackage": "role",
+ "goPackageAlias": "v7Role",
+ "goTypeName": "RoleResource",
+ "modelTypeName": "RoleResourceModel",
+ "serviceGroup": "roles",
+ "apiVersionDir": "v7",
+ "schema": {
+ "attributes": [
+ {
+ "name": "is_builtin",
+ "goField": "IsBuiltin",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).",
+ "wire": {
+ "jsonPath": "isBuiltin",
+ "sdkField": "IsBuiltin",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "name",
+ "goField": "Name",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Name of the role.\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission.",
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": true,
+ "returnedOnCreate": true
+ },
+ "wire": {
+ "jsonPath": "name",
+ "sdkField": "Name",
+ "sdkGoType": "*string",
+ "expand": {
+ "func": "convert.FrameworkToPtrString"
+ },
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ }
+ }
+ },
+ {
+ "name": "permissions",
+ "goField": "Permissions",
+ "type": {
+ "kind": "set",
+ "elementType": {
+ "kind": "string"
+ }
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "List of permission ids to grant (permissionId values from the permissions API). The response echoes permissions as expanded objects, never this id list, so state carries the configured value.\n\nEffectively required: a permission-less role create answers 500 (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n",
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": true,
+ "returnedOnCreate": true,
+ "returnedOnUpdate": true
+ },
+ "wire": {
+ "jsonPath": "permissions",
+ "sdkField": "Permissions",
+ "sdkGoType": "[]string",
+ "expand": {
+ "func": "convert.FrameworkSetToStringSlice",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipFlatten": true
+ }
+ },
+ {
+ "name": "id",
+ "goField": "ID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Unique ID representing the role.\n\nNamed `id` per the import convention; the wire field stays roleId.",
+ "wire": {
+ "jsonPath": "roleId",
+ "sdkField": "RoleID",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ],
+ "markdownDescription": "Retrieve role."
+ },
+ "binding": {
+ "service": {
+ "importPath": "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/roles",
+ "typeName": "Roles",
+ "accessor": "r.client.API.Roles"
+ },
+ "create": {
+ "style": "method",
+ "method": "CreateRole",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "roles.RoleDetail",
+ "httpMethod": "POST",
+ "pathTemplate": "/roles"
+ },
+ "read": {
+ "style": "method",
+ "method": "GetRole",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "roles.RoleDetail",
+ "httpMethod": "GET",
+ "pathTemplate": "/roles/{id}"
+ },
+ "update": {
+ "style": "method",
+ "method": "UpdateRole",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "roles.RoleDetail",
+ "httpMethod": "PUT",
+ "pathTemplate": "/roles/{id}"
+ },
+ "delete": {
+ "style": "method",
+ "method": "DeleteRole",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "transportError",
+ "httpMethod": "DELETE",
+ "pathTemplate": "/roles/{id}"
+ },
+ "id": {
+ "attribute": "id",
+ "goField": "ID",
+ "fromCreate": "created.RoleID",
+ "fromCreateIsPointer": true
+ },
+ "body": {
+ "requestType": "roles.RoleRequestBody",
+ "responseType": "roles.RoleDetail",
+ "constructorExpr": "&roles.RoleRequestBody{}",
+ "accessStyle": "structField"
+ }
+ },
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "import": {
+ "style": "passthroughId",
+ "attribute": "id"
+ },
+ "accFixture": {
+ "values": [
+ {
+ "attr": "permissions",
+ "hcl": "[\"1\", \"2\"]",
+ "wire": [
+ "1",
+ "2"
+ ]
+ }
+ ]
+ },
+ "accTest": {
+ "skipUnlessEnv": "TFPFGEN_ACC_ADMIN"
+ }
+ }
+ ]
+}
diff --git a/blueprints/thousandeyes/resources/user.blueprint.json b/blueprints/thousandeyes/resources/user.blueprint.json
new file mode 100644
index 00000000..2ff17d64
--- /dev/null
+++ b/blueprints/thousandeyes/resources/user.blueprint.json
@@ -0,0 +1,553 @@
+{
+ "formatVersion": "4",
+ "resources": [
+ {
+ "key": "user",
+ "name": "user",
+ "goPackage": "user",
+ "goPackageAlias": "v7User",
+ "goTypeName": "UserResource",
+ "modelTypeName": "UserResourceModel",
+ "serviceGroup": "users",
+ "apiVersionDir": "v7",
+ "schema": {
+ "attributes": [
+ {
+ "name": "account_group_roles",
+ "goField": "AccountGroupRoles",
+ "type": {
+ "kind": "set_nested",
+ "nestedObject": {
+ "goTypeName": "UserAccountGroupRoleModel",
+ "sdkType": "users.UserAccountGroupRole",
+ "attrTypesVar": "userAccountGroupRoleAttrTypes",
+ "objectTypeVar": "userAccountGroupRoleObjectType",
+ "expandFunc": "expandUserAccountGroupRoles",
+ "flattenFunc": "flattenUserAccountGroupRoles",
+ "attributes": [
+ {
+ "name": "account_group_id",
+ "goField": "AccountGroupID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Unique ID of the account group.",
+ "wire": {
+ "jsonPath": "accountGroupId",
+ "sdkField": "AccountGroupID",
+ "sdkGoType": "*string",
+ "expand": {
+ "func": "convert.FrameworkToPtrString"
+ },
+ "skipFlatten": true
+ }
+ },
+ {
+ "name": "role_ids",
+ "goField": "RoleIds",
+ "type": {
+ "kind": "set",
+ "elementType": {
+ "kind": "string"
+ }
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Unique role IDs to grant in the account group.",
+ "wire": {
+ "jsonPath": "roleIds",
+ "sdkField": "RoleIds",
+ "sdkGoType": "[]string",
+ "expand": {
+ "func": "convert.FrameworkSetToStringSlice",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipFlatten": true
+ }
+ }
+ ]
+ }
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Role assignments to write: account group id plus role ids. The response echoes assignments as expanded objects under allAccountGroupRoles, never in this shape, so state carries the configured value.\n\nThe API refuses a user without at least one role (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n",
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": false
+ },
+ "wire": {
+ "jsonPath": "accountGroupRoles",
+ "sdkField": "AccountGroupRoles",
+ "sdkGoType": "[]users.UserAccountGroupRole",
+ "expand": {
+ "func": "expandUserAccountGroupRoles",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipFlatten": true
+ }
+ },
+ {
+ "name": "all_account_group_role_ids",
+ "goField": "AllAccountGroupRoleIDs",
+ "type": {
+ "kind": "set",
+ "elementType": {
+ "kind": "string"
+ }
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Unique IDs representing the roles.\n\nThe response echoes roles as nested objects, never as this flat id list; state carries the configured value.\n\nOmitted from generated fixtures: its members are live role ids, and account_group_roles already carries the assignment the fixtures exercise.",
+ "behaviour": {
+ "returnedOnRead": false
+ },
+ "wire": {
+ "jsonPath": "allAccountGroupRoleIds",
+ "sdkField": "AllAccountGroupRoleIds",
+ "sdkGoType": "[]string",
+ "expand": {
+ "func": "convert.FrameworkSetToStringSlice",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipFlatten": true
+ }
+ },
+ {
+ "name": "all_account_group_roles",
+ "goField": "AllAccountGroupRoles",
+ "type": {
+ "kind": "set_nested",
+ "nestedObject": {
+ "goTypeName": "UserRoleModel2",
+ "sdkType": "users.Role",
+ "attrTypesVar": "userRoleAttrTypes2",
+ "objectTypeVar": "userRoleObjectType2",
+ "expandFunc": "expandUserRoles2",
+ "flattenFunc": "flattenUserRoles2",
+ "attributes": [
+ {
+ "name": "has_management_permissions",
+ "goField": "HasManagementPermissions",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Flag indicating whether the user has management permissions.",
+ "wire": {
+ "jsonPath": "hasManagementPermissions",
+ "sdkField": "HasManagementPermissions",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "is_builtin",
+ "goField": "IsBuiltin",
+ "type": {
+ "kind": "bool"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).",
+ "wire": {
+ "jsonPath": "isBuiltin",
+ "sdkField": "IsBuiltin",
+ "sdkGoType": "*bool",
+ "flatten": {
+ "func": "convert.PtrBoolToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "name",
+ "goField": "Name",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Name of the role.",
+ "wire": {
+ "jsonPath": "name",
+ "sdkField": "Name",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "role_id",
+ "goField": "RoleID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Unique ID representing the role.",
+ "wire": {
+ "jsonPath": "roleId",
+ "sdkField": "RoleID",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ]
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Dropped in v1: read-only echo of accountGroupRoles in a different shape (expanded objects with value-typed nesting); mirroring it would drift against the writable half.",
+ "wire": {
+ "jsonPath": "allAccountGroupRoles",
+ "sdkField": "AllAccountGroupRoles",
+ "sdkGoType": "[]users.Role",
+ "flatten": {
+ "func": "flattenUserRoles2",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipExpand": true
+ },
+ "drop": true
+ },
+ {
+ "name": "date_registered",
+ "goField": "DateRegistered",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "UTC date the user registered their account (ISO date-time format).",
+ "wire": {
+ "jsonPath": "dateRegistered",
+ "sdkField": "DateRegistered",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "email",
+ "goField": "Email",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "email"
+ }
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "User's email address.\n\n\nThe API enforces this field's presence, which the specification does not declare.\n",
+ "behaviour": {
+ "requiredByApi": true
+ },
+ "wire": {
+ "jsonPath": "email",
+ "sdkField": "Email",
+ "sdkGoType": "*string",
+ "expand": {
+ "func": "convert.FrameworkToPtrString"
+ },
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ }
+ }
+ },
+ {
+ "name": "last_login",
+ "goField": "LastLogin",
+ "type": {
+ "kind": "string",
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "UTC last login of the user (ISO date-time format).",
+ "wire": {
+ "jsonPath": "lastLogin",
+ "sdkField": "LastLogin",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "login_account_group",
+ "goField": "LoginAccountGroup",
+ "type": {
+ "kind": "single_nested",
+ "nestedObject": {
+ "goTypeName": "UserAccountGroupModel2",
+ "sdkType": "users.AccountGroup",
+ "attrTypesVar": "userAccountGroupAttrTypes2",
+ "objectTypeVar": "userAccountGroupObjectType2",
+ "expandFunc": "expandUserAccountGroup2",
+ "flattenFunc": "flattenUserAccountGroup2",
+ "attributes": [
+ {
+ "name": "account_group_name",
+ "goField": "AccountGroupName",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Account group name",
+ "wire": {
+ "jsonPath": "accountGroupName",
+ "sdkField": "AccountGroupName",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ },
+ {
+ "name": "aid",
+ "goField": "AID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint.",
+ "wire": {
+ "jsonPath": "aid",
+ "sdkField": "AID",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ]
+ }
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Dropped in v1: read-only echo of loginAccountGroupId as a value-typed nested object.",
+ "wire": {
+ "jsonPath": "loginAccountGroup",
+ "sdkField": "LoginAccountGroup",
+ "sdkGoType": "*users.AccountGroup",
+ "flatten": {
+ "func": "flattenUserAccountGroup2",
+ "needsCtx": true,
+ "returnsError": true
+ },
+ "skipExpand": true
+ },
+ "drop": true
+ },
+ {
+ "name": "login_account_group_id",
+ "goField": "LoginAccountGroupID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "Unique ID of the login account group.\n\nThe response echoes loginAccountGroup as a nested object, never this id; state carries the configured value.\n\nThe API refuses a user without a login account group (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n",
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": false
+ },
+ "wire": {
+ "jsonPath": "loginAccountGroupId",
+ "sdkField": "LoginAccountGroupID",
+ "sdkGoType": "*string",
+ "expand": {
+ "func": "convert.FrameworkToPtrString"
+ },
+ "skipFlatten": true
+ }
+ },
+ {
+ "name": "name",
+ "goField": "Name",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "optional",
+ "markdownDescription": "User's display name.\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission.",
+ "behaviour": {
+ "requiredByApi": true
+ },
+ "wire": {
+ "jsonPath": "name",
+ "sdkField": "Name",
+ "sdkGoType": "*string",
+ "expand": {
+ "func": "convert.FrameworkToPtrString"
+ },
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ }
+ }
+ },
+ {
+ "name": "id",
+ "goField": "ID",
+ "type": {
+ "kind": "string"
+ },
+ "computedOptionalRequired": "computed",
+ "markdownDescription": "Unique ID of the user.\n\nNamed `id` per the import convention; the wire field stays uid.",
+ "wire": {
+ "jsonPath": "uid",
+ "sdkField": "Uid",
+ "sdkGoType": "*string",
+ "flatten": {
+ "func": "convert.PtrStringToFramework"
+ },
+ "skipExpand": true
+ }
+ }
+ ],
+ "markdownDescription": "Retrieve user."
+ },
+ "binding": {
+ "service": {
+ "importPath": "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/users",
+ "typeName": "Users",
+ "accessor": "r.client.API.Users"
+ },
+ "create": {
+ "style": "method",
+ "method": "CreateUser",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "users.CreatedUser",
+ "httpMethod": "POST",
+ "pathTemplate": "/users"
+ },
+ "read": {
+ "style": "method",
+ "method": "GetUser",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "users.UserDetail",
+ "httpMethod": "GET",
+ "pathTemplate": "/users/{id}"
+ },
+ "update": {
+ "style": "method",
+ "method": "UpdateUser",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ },
+ {
+ "kind": "body"
+ }
+ ],
+ "return": "resultTransportError",
+ "resultType": "users.UserDetail",
+ "httpMethod": "PUT",
+ "pathTemplate": "/users/{id}"
+ },
+ "delete": {
+ "style": "method",
+ "method": "DeleteUser",
+ "args": [
+ {
+ "kind": "ctx"
+ },
+ {
+ "kind": "stateField",
+ "field": "ID"
+ }
+ ],
+ "return": "transportError",
+ "httpMethod": "DELETE",
+ "pathTemplate": "/users/{id}"
+ },
+ "id": {
+ "attribute": "id",
+ "goField": "ID",
+ "fromCreate": "created.Uid",
+ "fromCreateIsPointer": true
+ },
+ "body": {
+ "requestType": "users.UserRequest",
+ "responseType": "users.UserDetail",
+ "constructorExpr": "&users.UserRequest{}",
+ "accessStyle": "structField"
+ }
+ },
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "import": {
+ "style": "passthroughId",
+ "attribute": "id"
+ },
+ "accFixture": {
+ "values": [
+ {
+ "attr": "account_group_roles",
+ "hcl": "[{ account_group_id = \"281474976742769\", role_ids = [\"281474976759598\"] }]",
+ "wire": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ]
+ },
+ {
+ "attr": "all_account_group_role_ids",
+ "omit": true
+ },
+ {
+ "attr": "email",
+ "hcl": "\"dafydd.watkins+tfacc@deploymenttheory.com\"",
+ "wire": "dafydd.watkins+tfacc@deploymenttheory.com"
+ },
+ {
+ "attr": "login_account_group_id",
+ "hcl": "\"281474976742769\"",
+ "wire": "281474976742769"
+ }
+ ]
+ },
+ "accTest": {
+ "skipUnlessEnv": "TFPFGEN_ACC_ADMIN"
+ }
+ }
+ ]
+}
diff --git a/blueprints/thousandeyes/role.probe.plan.json b/blueprints/thousandeyes/role.probe.plan.json
new file mode 100644
index 00000000..16760437
--- /dev/null
+++ b/blueprints/thousandeyes/role.probe.plan.json
@@ -0,0 +1,20 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "name": "CURATE_ME-stamped-by-probe",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ }
+ ],
+ "candidates": {},
+ "deny": [],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 25
+ }
+}
diff --git a/blueprints/thousandeyes/user.probe.plan.json b/blueprints/thousandeyes/user.probe.plan.json
new file mode 100644
index 00000000..b99b4e6c
--- /dev/null
+++ b/blueprints/thousandeyes/user.probe.plan.json
@@ -0,0 +1,26 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "name": "CURATE_ME-stamped-by-probe",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "candidates": {},
+ "deny": [],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 22
+ }
+}
diff --git a/cmd/tfpluginframeworkgen/emit.go b/cmd/tfpluginframeworkgen/emit.go
index 4b08c62c..51b5765b 100644
--- a/cmd/tfpluginframeworkgen/emit.go
+++ b/cmd/tfpluginframeworkgen/emit.go
@@ -4,7 +4,9 @@ import (
"fmt"
"log"
"os"
+ "os/exec"
"path/filepath"
+ "strings"
"github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/blueprint"
"github.com/deploymenttheory/terraform-plugin-framework-codegen/internal/emit"
@@ -13,6 +15,7 @@ import (
)
type emitOptions struct {
+ skipPostcheck bool
blueprintPath string
out string
only string
@@ -41,6 +44,9 @@ func parseEmitFlags(args []string) (emitOptions, error) {
fs.BoolVar(&o.list, "list", false, "list the files that would be written and exit")
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.BoolVar(&o.skipPostcheck, "skip-postcheck", false,
+ "skip the post-emit 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
@@ -89,7 +95,96 @@ func runEmit(args []string) error {
return nil
}
- return writePlan(plan, o)
+ if err := writePlan(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
+ // 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.
+ if o.skipPostcheck {
+ log.Printf("postcheck skipped by flag; run it before committing")
+ return nil
+ }
+
+ return postcheck(o.out)
+}
+
+// postcheck holds emitted 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
+// 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.
+func postcheck(out string) error {
+ // A scratch emit -- a test's temp dir, an -only 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 {
+ log.Printf("postcheck: %s is not a module root; skipped", out)
+ return nil
+ }
+
+ log.Printf("postcheck: go build ./...")
+ 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)
+ }
+
+ if hasGenerateDirective(out) {
+ log.Printf("postcheck: go generate . (registry docs)")
+ docs := exec.Command("go", "generate", ".")
+ docs.Dir = out
+ if msg, err := docs.CombinedOutput(); err != nil {
+ return fmt.Errorf("postcheck: docs generation failed:\n%s", msg)
+ }
+ }
+
+ if _, err := exec.LookPath("terraform"); err != nil {
+ log.Printf("postcheck: terraform not on PATH; fmt check skipped -- CI runs it")
+ return nil
+ }
+
+ log.Printf("postcheck: terraform fmt -recursive")
+ tfmt := exec.Command("terraform", "fmt", "-recursive", "-list=true", ".")
+ tfmt.Dir = out
+ msg, err := tfmt.CombinedOutput()
+ if err != nil {
+ return fmt.Errorf("postcheck: terraform fmt failed:\n%s", msg)
+ }
+ if rewritten := strings.TrimSpace(string(msg)); rewritten != "" {
+ // 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 nil
+}
+
+// hasGenerateDirective reports whether the out module regenerates docs.
+func hasGenerateDirective(out string) bool {
+ entries, err := os.ReadDir(out)
+ if err != nil {
+ return false
+ }
+ for _, e := range entries {
+ if e.IsDir() || !strings.HasSuffix(e.Name(), ".go") {
+ continue
+ }
+ src, err := os.ReadFile(filepath.Join(out, e.Name()))
+ if err == nil && strings.Contains(string(src), "//go:generate") {
+ return true
+ }
+ }
+ return false
}
// printPlan lists what would be written, for -list and -dry-run.
diff --git a/cmd/tfpluginframeworkgen/interop_test.go b/cmd/tfpluginframeworkgen/interop_test.go
index b96232fd..d21b43fe 100644
--- a/cmd/tfpluginframeworkgen/interop_test.go
+++ b/cmd/tfpluginframeworkgen/interop_test.go
@@ -90,8 +90,8 @@ func TestUnit_CLI_Interop_TheCommittedSpecIsValid(t *testing.T) {
}
// Sorted by name in the export, so the alerts pair precedes credential, the
// tests_* family and tag.
- if len(doc.Resources) != 18 || doc.Resources[0].Name != "alert_suppression_window" {
- t.Fatalf("got %d resources starting %q, want 18 starting with alert_suppression_window",
+ if len(doc.Resources) != 21 || doc.Resources[0].Name != "account_group" {
+ t.Fatalf("got %d resources starting %q, want 21 starting with account_group",
len(doc.Resources), firstName(doc.Resources))
}
byName := map[string]int{}
@@ -250,7 +250,7 @@ func TestUnit_CLI_Interop_ImportWritesInvisibleDrafts(t *testing.T) {
t.Fatalf("walking the output: %v", err)
}
- if len(found) != 19 {
+ if len(found) != 22 {
t.Errorf("wrote %d drafts (%v), want a provider draft and one per resource", len(found), found)
}
diff --git a/cmd/tfpluginframeworkgen/merge.go b/cmd/tfpluginframeworkgen/merge.go
index 59ada0a4..9ee242b6 100644
--- a/cmd/tfpluginframeworkgen/merge.go
+++ b/cmd/tfpluginframeworkgen/merge.go
@@ -65,6 +65,14 @@ func runMerge(args []string) error {
}
if len(facts) == 0 {
+ // Under -check, an empty facts document is trivially reflected: there is
+ // nothing to fold, so nothing can have drifted. A rehearse-only recording
+ // whose bodies were refused legitimately commits one -- the transcript and
+ // its notes are the evidence, and the gate must not fail over their honesty.
+ if *check {
+ log.Printf("✅ %s holds no facts, which any blueprint reflects", *factsPath)
+ return nil
+ }
return fmt.Errorf("%w: %s holds no facts", errNothingToDo, *factsPath)
}
diff --git a/cmd/tfpluginframeworkgen/probe.go b/cmd/tfpluginframeworkgen/probe.go
index 73a32740..d2e1b5e0 100644
--- a/cmd/tfpluginframeworkgen/probe.go
+++ b/cmd/tfpluginframeworkgen/probe.go
@@ -1012,7 +1012,13 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo
printProbeReport(subj.Resource, result.Report)
reportOrphans(subj.Resource, result.Report)
- if runErr != nil {
+ // In verify mode a reproduced run error must not pre-empt the fact comparison.
+ // A recording may legitimately contain a stopping error -- the account_group
+ // snapshot holds a delete the API refused, later resolved by the ledger sweep --
+ // and replay reproducing that error is replay working. What verify asserts is
+ // that the facts are a pure function of the transcript; the error is part of the
+ // transcript. Any other mode surfaces it as before.
+ if runErr != nil && mode != modeVerify {
return runErr
}
@@ -1032,6 +1038,11 @@ func replayProbe(mode string, subj probe.Subject, only, root string, rederive bo
return err
}
+ if runErr != nil {
+ log.Printf("note: the recorded run stopped early (%v); its facts reproduce, "+
+ "which is what verify asserts", runErr)
+ }
+
log.Printf("✅ %s: %d fact(s) reproduced from the committed cassette", subj.Resource, len(committed))
return nil
diff --git a/internal/blueprint/merge/merge_test.go b/internal/blueprint/merge/merge_test.go
index 5a5e350c..a79b043e 100644
--- a/internal/blueprint/merge/merge_test.go
+++ b/internal/blueprint/merge/merge_test.go
@@ -1418,8 +1418,7 @@ func TestUnit_Merge_AnUpdateDefaultDisagreeingWithTheCreateDefaultConflicts(t *t
t.Parallel()
bp := testBlueprint()
- bp.Resources[0].Schema.Attributes[0].Behaviour.ServerDefault =
- &blueprint.Literal{Kind: blueprint.KindString, Raw: `"blue"`}
+ bp.Resources[0].Schema.Attributes[0].Behaviour.ServerDefault = &blueprint.Literal{Kind: blueprint.KindString, Raw: `"blue"`}
result, err := Apply(&bp, []probe.Fact{
fact("colour", probe.FactUpdateDefault,
diff --git a/internal/probe/probes_rehearsal_test.go b/internal/probe/probes_rehearsal_test.go
index 5528d18c..18a5b060 100644
--- a/internal/probe/probes_rehearsal_test.go
+++ b/internal/probe/probes_rehearsal_test.go
@@ -13,14 +13,22 @@ func rehearsalSubject() Subject {
subj := quirkSubject()
subj.EvidenceRev = CurrentEvidenceRev
subj.Fields = append(subj.Fields,
- Field{JSONPath: "colour", Kind: blueprint.KindString,
- ComputedOptionalRequired: blueprint.Optional, Writable: true},
- Field{JSONPath: "enabled", Kind: blueprint.KindBool,
- ComputedOptionalRequired: blueprint.Optional, Writable: true},
- Field{JSONPath: "postBody", Kind: blueprint.KindString,
- ComputedOptionalRequired: blueprint.Optional, Writable: true},
- Field{JSONPath: "requestMethod", Kind: blueprint.KindString,
- ComputedOptionalRequired: blueprint.Optional, Writable: true},
+ Field{
+ JSONPath: "colour", Kind: blueprint.KindString,
+ ComputedOptionalRequired: blueprint.Optional, Writable: true,
+ },
+ Field{
+ JSONPath: "enabled", Kind: blueprint.KindBool,
+ ComputedOptionalRequired: blueprint.Optional, Writable: true,
+ },
+ Field{
+ JSONPath: "postBody", Kind: blueprint.KindString,
+ ComputedOptionalRequired: blueprint.Optional, Writable: true,
+ },
+ Field{
+ JSONPath: "requestMethod", Kind: blueprint.KindString,
+ ComputedOptionalRequired: blueprint.Optional, Writable: true,
+ },
)
return subj
}
diff --git a/internal/probe/sweep.go b/internal/probe/sweep.go
index 57dd4383..1e5c6d2d 100644
--- a/internal/probe/sweep.go
+++ b/internal/probe/sweep.go
@@ -286,6 +286,37 @@ func (opts SweepOptions) sweepByPrefix(ctx context.Context, summary *SweepSummar
// intents outstanding, reporting as orphans the objects this pass just removed.
opts.Session.resolveByName(found.name, found.id)
}
+
+ // The third resolution: proven absence. An id-less intent is written before the
+ // create is sent, and a create the API refused after that point -- a role create
+ // answering 500 was the live case -- leaves an intent no pass above can touch: no
+ // identifier for the ledger pass, no object for the prefix pass. When this read
+ // demonstrably covered the whole collection, a stamped name that is not in it is an
+ // object that does not exist, and holding the ledger dirty over it blocks every
+ // future record for the sake of phantom debris.
+ if summary.Complete {
+ present := map[string]bool{}
+ for _, item := range items {
+ if obj, ok := item.(map[string]any); ok {
+ if name, ok := obj[opts.NameField].(string); ok {
+ present[name] = true
+ }
+ }
+ }
+
+ for _, o := range Unresolved(opts.Session.cfg.Ledger.Entries()) {
+ if o.ID != "" || present[o.Name] || !strings.HasPrefix(o.Name, opts.NamePrefix) {
+ continue
+ }
+ _ = opts.Session.cfg.Ledger.Resolve(o.Seq, KindRejected, "", 0,
+ "absent from a complete collection read: the create never took effect")
+ summary.Notes = append(summary.Notes, Note{
+ Probe: "sweep.prefix",
+ Message: fmt.Sprintf("intent %q resolved as never created: it has no "+
+ "identifier and a complete collection read does not contain it", o.Name),
+ })
+ }
+ }
}
// found is one object the prefix pass matched.
diff --git a/interop-specs/thousandeyes/provider-code-spec.json b/interop-specs/thousandeyes/provider-code-spec.json
index caf2727d..2749e4bb 100644
--- a/interop-specs/thousandeyes/provider-code-spec.json
+++ b/interop-specs/thousandeyes/provider-code-spec.json
@@ -391,6 +391,145 @@
"name": "thousandeyes"
},
"resources": [
+ {
+ "name": "account_group",
+ "schema": {
+ "attributes": [
+ {
+ "name": "account_group_name",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "Account group name\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission."
+ }
+ },
+ {
+ "name": "id",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint.\n\nNamed `id` per the import convention; the wire field stays aid."
+ }
+ },
+ {
+ "name": "is_current_account_group",
+ "bool": {
+ "computed_optional_required": "computed",
+ "description": "Indicates whether the requested aid is the context of the current account."
+ }
+ },
+ {
+ "name": "is_default_account_group",
+ "bool": {
+ "computed_optional_required": "computed",
+ "description": "Indicates whether the aid is the default one for the requesting user."
+ }
+ },
+ {
+ "name": "org_id",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "(Optional) The ID for the organization associated with the account group."
+ }
+ },
+ {
+ "name": "organization_name",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "(Optional) The name of the organization associated with the account group."
+ }
+ },
+ {
+ "name": "users",
+ "set_nested": {
+ "computed_optional_required": "computed",
+ "nested_object": {
+ "associated_external_type": {
+ "type": "account_groups.UserAccountGroup"
+ },
+ "attributes": [
+ {
+ "name": "date_registered",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "User's UTC registration date (ISO date-time format)."
+ }
+ },
+ {
+ "name": "email",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "User's email address."
+ }
+ },
+ {
+ "name": "last_login",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "User's UTC last login date (ISO date-time format)."
+ }
+ },
+ {
+ "name": "name",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "User's display name."
+ }
+ },
+ {
+ "name": "roles",
+ "set_nested": {
+ "computed_optional_required": "computed",
+ "nested_object": {
+ "associated_external_type": {
+ "type": "account_groups.Role"
+ },
+ "attributes": [
+ {
+ "name": "has_management_permissions",
+ "bool": {
+ "computed_optional_required": "computed",
+ "description": "Flag indicating whether the user has management permissions."
+ }
+ },
+ {
+ "name": "is_builtin",
+ "bool": {
+ "computed_optional_required": "computed",
+ "description": "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User)."
+ }
+ },
+ {
+ "name": "name",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "Name of the role."
+ }
+ },
+ {
+ "name": "role_id",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "Unique ID representing the role."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "uid",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "Unique ID representing the user."
+ }
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "markdown_description": "Retrieve account group."
+ }
+ },
{
"name": "alert_suppression_window",
"schema": {
@@ -887,6 +1026,45 @@
"markdown_description": "Get dashboard filter."
}
},
+ {
+ "name": "role",
+ "schema": {
+ "attributes": [
+ {
+ "name": "is_builtin",
+ "bool": {
+ "computed_optional_required": "computed",
+ "description": "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User)."
+ }
+ },
+ {
+ "name": "name",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "Name of the role.\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission."
+ }
+ },
+ {
+ "name": "permissions",
+ "set": {
+ "computed_optional_required": "optional",
+ "element_type": {
+ "string": {}
+ },
+ "description": "List of permission ids to grant (permissionId values from the permissions API). The response echoes permissions as expanded objects, never this id list, so state carries the configured value.\n\nEffectively required: a permission-less role create answers 500 (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n"
+ }
+ },
+ {
+ "name": "id",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "Unique ID representing the role.\n\nNamed `id` per the import convention; the wire field stays roleId."
+ }
+ }
+ ],
+ "markdown_description": "Retrieve role."
+ }
+ },
{
"name": "tag",
"schema": {
@@ -4867,6 +5045,97 @@
],
"markdown_description": "Get Web Transactions test."
}
+ },
+ {
+ "name": "user",
+ "schema": {
+ "attributes": [
+ {
+ "name": "account_group_roles",
+ "set_nested": {
+ "computed_optional_required": "optional",
+ "nested_object": {
+ "associated_external_type": {
+ "type": "users.UserAccountGroupRole"
+ },
+ "attributes": [
+ {
+ "name": "account_group_id",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "Unique ID of the account group."
+ }
+ },
+ {
+ "name": "role_ids",
+ "set": {
+ "computed_optional_required": "optional",
+ "element_type": {
+ "string": {}
+ },
+ "description": "Unique role IDs to grant in the account group."
+ }
+ }
+ ]
+ },
+ "description": "Role assignments to write: account group id plus role ids. The response echoes assignments as expanded objects under allAccountGroupRoles, never in this shape, so state carries the configured value.\n\nThe API refuses a user without at least one role (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n"
+ }
+ },
+ {
+ "name": "all_account_group_role_ids",
+ "set": {
+ "computed_optional_required": "optional",
+ "element_type": {
+ "string": {}
+ },
+ "description": "Unique IDs representing the roles.\n\nThe response echoes roles as nested objects, never as this flat id list; state carries the configured value.\n\nOmitted from generated fixtures: its members are live role ids, and account_group_roles already carries the assignment the fixtures exercise."
+ }
+ },
+ {
+ "name": "date_registered",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "UTC date the user registered their account (ISO date-time format)."
+ }
+ },
+ {
+ "name": "email",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "User's email address.\n\n\nThe API enforces this field's presence, which the specification does not declare.\n"
+ }
+ },
+ {
+ "name": "last_login",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "UTC last login of the user (ISO date-time format)."
+ }
+ },
+ {
+ "name": "login_account_group_id",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "Unique ID of the login account group.\n\nThe response echoes loginAccountGroup as a nested object, never this id; state carries the configured value.\n\nThe API refuses a user without a login account group (live probe, 2026-08-03).\n\n\nThe API enforces this field's presence, which the specification does not declare.\n"
+ }
+ },
+ {
+ "name": "name",
+ "string": {
+ "computed_optional_required": "optional",
+ "description": "User's display name.\n\nRequired-by-API by curation: the sweeper's field, unprobeable by omission."
+ }
+ },
+ {
+ "name": "id",
+ "string": {
+ "computed_optional_required": "computed",
+ "description": "Unique ID of the user.\n\nNamed `id` per the import convention; the wire field stays uid."
+ }
+ }
+ ],
+ "markdown_description": "Retrieve user."
+ }
}
],
"version": "0.1"
diff --git a/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json b/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json
index 2f5e72c9..78f356fe 100644
--- a/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json
+++ b/pilot/thousandeyes/.tfpluginframeworkgen/manifest.json
@@ -4,177 +4,222 @@
"files": [
{
"path": "internal/provider/actions.go",
- "sha256": "bb6b70f44e41cd50779e27efcbaebaef452d6bdf53fa395571b01046859db96a",
+ "sha256": "42ea1383cf7676de4ffd330df5562abb33f1758a92249f3f9985c210f5e90e19",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/provider/datasources.go",
- "sha256": "38a4e626b134dc9767520e2911714c70a767dd65084d7c790638c9d452fa7771",
+ "sha256": "4c864656a1576a4338f7df9adbda7890839209328532a0ab3d75a8dcf8ffa441",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/provider/ephemerals.go",
- "sha256": "029842d4dfb4e49ea314ab7f20214b2f6e39c8e492bc10cb693c0a29220a254d",
+ "sha256": "3049a24919b6faed2d2e474e050f02871a5ab5d0f1a7f9f8246fbcecf871bbea",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/provider/list_resources.go",
- "sha256": "6c71ec98c92e58800a56c33fbb22a4d7b38e61dd062fffcb83154c58c780a8d9",
+ "sha256": "6e8733808a31353f18832a464ad9fb0b751ff77ca7b886c007831de7d2f31c53",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/provider/resources.go",
- "sha256": "472b8a8693f5bc10b2588b2206e7e528182df87f92eef72a7972ad9df91f73eb",
+ "sha256": "c7bb2c0792de4159e438ecc0d6e9d8dc7894fb8f976fdfd2b33d7f89ee95d47b",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action.go",
- "sha256": "adf845475ff2c923b8ef96aa8d5a18d24ba9e2421a28b43fabddca4aa0587bd0",
+ "sha256": "a957b4e259b476b57182f62e14396bf7ab7acd35eae1fe587ee673b63403a643",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/action_acceptance_test.go",
- "sha256": "fe708a7f920ed7ecd5be674699135d36804369e103f89517205e8ff0c5667e1f",
+ "sha256": "b01b740c42fcdb1c27901a5287cb18bdfdb7fdc2820f9296f247ce60f1555326",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/invoke.go",
- "sha256": "405b42488edb06ef39b56a60aeeb0e19f3b5ea7c5211c3a4b9216322d2fd94d7",
+ "sha256": "c395f72a8e26fbf23f28f8aac97386fdd85d2bf1865850209377c3f7eff20a5e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/model.go",
- "sha256": "4dde87c1729a6c5fb93f97e96d41905bb5ca65e25ec899c9ef228bd2143ba7f8",
+ "sha256": "2948f4290d331d260ff2980d14252c6f87ab204034d7436c6977f92efd04aec4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/actions/endpoint_agents/v7/disable_endpoint_agent/testdata/action.tf",
- "sha256": "5979285e9b2fd1a52546734f57364faa5e0bc06a434d3d4a6307d5292d609fef",
+ "sha256": "f070ccc5c279b9a7c529e0a20c61a71f30f7bfe149fa6478562a9e3586a10750",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/datasource.go",
- "sha256": "466b03c4a693844402e362f06e678203b95db580f7342ea4d61c75b3c047e5fc",
+ "sha256": "0a1b7562f07cb7c76e47bfdc56eceba88c0cf367da9508290f7ba8fd2108d687",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/datasource_acceptance_test.go",
- "sha256": "d5ad6fb7bf7b877d3b7ef90b7d18e3c89395d61d0bd8b88cc20f5d22ef54987f",
+ "sha256": "490f16f144184fb4f175b5edcd72c69c20598950009cede30d0d3d269f55801f",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/model.go",
- "sha256": "10fe4e5727f1049a078949ef7cb7a1ce8fc6108145bd66ccb2125ed6f68af94c",
+ "sha256": "a65673dac936d188dcc0cadf8219a5dfb185aed26950ab6c79aa7b2af1ab8556",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/read.go",
- "sha256": "95728debb327b5ea82d461cee8ac4c87bd357c1759c4c90fca4230613afd8185",
+ "sha256": "7a4e43c32fc060b0188c6c20193d091a0d57b13fd62ac3a96438dc556cab163a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/seed_helper_test.go",
- "sha256": "e9a12f6c9caaf6b770816f10c960a991a9c96c5505d2f9b37fef06d820f8a6c3",
+ "sha256": "8b544848e173eaa997ebd735464fec3ef701374e2c181a2ed9ff96edf08cc7d9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/state.go",
- "sha256": "44114ffbcfa1478871523c671071ec3fb8bf1a0df14d1205a952974f64527564",
+ "sha256": "05cc65c0b6751eec52d3d70b3b1fa01747c76741c7bb077890d6fbdb43b081f4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tag/testdata/datasource.tf",
- "sha256": "f9275ac2c787cbab3577d03b00abf8d8cacaf6862ea4da2e04354b8139d1152f",
+ "sha256": "9df6b8f301305d3dbb31c71e3a68535eba1c466d2bce3eb7f21cafb2e926a320",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/datasource.go",
- "sha256": "44b579a4161874c1c9c78660108912b8bab24566c363e33f6ff0df8adee8adc6",
+ "sha256": "76c889a40af0052290750ffff8bc2dc8860e28158887a319bcac6519319190dc",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/datasource_acceptance_test.go",
- "sha256": "5bb9a19d036c76734043ed492e894563a4415ed88ff35fe752de58575b7f7d5b",
+ "sha256": "d980c5ef4ecf29b1af903e05b0526ebb91e63f58c5484526cd619b12d1520cd5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/model.go",
- "sha256": "46283eabcc6290c4a4ad27227bc16692f8339097fbce8f31cd1ac744305b785b",
+ "sha256": "d3ae196327c1d1c4235dfa3d78352db8ba5530081a0e7539f80ef090935b82fd",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/read.go",
- "sha256": "dc49332aa37c36097574144696625945e523449d62975c647f3505a145416e0e",
+ "sha256": "67153794c8ffc58fa5db8a6f3adc1279e13f048eaf899451d9f3687a3b4336d5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/seed_helper_test.go",
- "sha256": "cbee90e37713ef4779cd45f216bdfa707b0953c8f1a678ba350be5d3362a71fc",
+ "sha256": "d10a56c9597861933ab9d043eff700139dd4df35ce498255ac88488826c4b484",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/state.go",
- "sha256": "0c0da1fc62e36c4594fe21a3e22cb16ee8d935d9bd53ba0cfeac5674fc1a956e",
+ "sha256": "363c2b18f2f8ab86faa3a78bd34e796cd69c62d23a11729e74a191e36a205f34",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/datasources/tags/v7/tags/testdata/datasource.tf",
- "sha256": "058765351aea2b74ca897341397d5d03beb868858d5a243f5d17feda96c80b88",
+ "sha256": "81073ebcc49794977c64360971b7b5902e3e8df8c5d486d259ccfa17c8d8a0a2",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/ephemeral.go",
- "sha256": "e8ae15f617147a7ef74ef80482ed5c7a8f931ab5860275a8650f28856b23eb94",
+ "sha256": "48e66397a844c6f2685969a3a94ea8624dad28fc56ca16b9d3907a0e68aee803",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/ephemeral_acceptance_test.go",
- "sha256": "85e54d2c310c41dbcbb91f0c6076eba75f41a8e2a02efee3795a475ba2daa869",
+ "sha256": "c28f1931e2eb8ba63c9642285ec76ac8cb81e09840b657cde34ca92ca130e632",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/model.go",
- "sha256": "eb108c43b390c9dc4a13575d7eb8778aa6f262b4bbf6919ef202515e5a4d534b",
+ "sha256": "56957b882dcfa1cd969cba1a8b2c2e00cdee12beed438087162c9f6f980a4213",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/open.go",
- "sha256": "5d811d608805d8a0a8c912d7a7e4e85f86c1f731d57135683ef4c340c62162b3",
+ "sha256": "93f709b4ca5a6ed09623721af8445bdc50e9f2c9c29a11d973b5f027274f54a1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/seed_helper_test.go",
- "sha256": "f18d32f55773678dfdfbf3d480a78a3a012d9b2706eb1f785862888b601a0974",
+ "sha256": "098ecbac2d4244e7b7e83b2b41b7782179f43d8dfb9234844c99de6fde981e8c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/state.go",
- "sha256": "be9dbb06c4ebd7423d31adf8b998443f9a411c86c088ebbebabfa68816c22ea2",
+ "sha256": "07d97e245bd85ab312f96eaad255abb839b51a07e387c264c39f7d93ce85108b",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/ephemerals/credentials/v7/credential/testdata/ephemeral.tf",
- "sha256": "fe49891a3d8874cbf59dbc54cf242f564041e3819a24fcca5844769bd1e5fb99",
+ "sha256": "c785a49ee4284f1eeda9d8e1b4009dca601c48a80cac8d4c6cdc6345d7903baf",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/construct.go",
+ "sha256": "38b19be8b5325717b8cf6ae26be51c0fca18bb2a6b42690de95417acf35b8618",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/crud.go",
+ "sha256": "d0a1f741d7c4bba3b5a88c2dfd6dc6e5a1b62b938ba48bc5ad9f0f5f624e9aa6",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/model.go",
+ "sha256": "de11d45cc18ac4bf281037b292dd3657753508f6cc8d06313936ec9b39ae28a7",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/resource.go",
+ "sha256": "2e797beb3569792c7e885e2017b53ade21455fc3e0631946c1fbf7c3d70971f7",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go",
+ "sha256": "dc9d029ebbf06196912efee1070fb5ba631ec85c828fc3a53ae7f4f15999d82b",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/state.go",
+ "sha256": "2cd46829856b8fded80fc29ceb512c464ef2937c7b18c47b4a1954cd4642930c",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/test_helper_test.go",
+ "sha256": "5787744f07cf1e8aeba5cf2709ffdf65e80ce5d60aa575905b3e42c13bd3e5d2",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf",
+ "sha256": "01950db3af5008420c21b5a34b79e388adae52ecde590918c7f1544a13bcb6ab",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf",
+ "sha256": "b16330203f0965b71308632e4fa2ba649e1e609c99256e916e9dcc227a395a4b",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/construct.go",
- "sha256": "ff3b0c60b67898568db3d9deb9df0b2912d9f7b1a3103990224149b701821df9",
+ "sha256": "763a5200b1fcfc44be35142ab33262b30140f6cc3c1131a643ada02b71a6fb85",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go",
- "sha256": "6883b9596aff13425d09b7965893a3182e31b028662454ecdf5caba6e1d3e6f2",
+ "sha256": "29757d89176dd04e07c12d719b46989364d27317748350d1ccef82e9579d2fea",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go",
- "sha256": "e543b47272a6063fd29f002278ba72b421d2df9747fbb8146d1523913c498056",
+ "sha256": "75f297ec51bf6f277f82241bfd32113128f7f0b568ff6b29b8231b76ee4e2903",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/resource.go",
- "sha256": "27b597b48a1230ea9e822eb85fdaec73aef898fc651df78e601510da34ed61bc",
+ "sha256": "5c5453a8fdf30e7a2d00bd4276b80ffc14a16c5fe146b7f387217682de079241",
"blueprint": "blueprints/thousandeyes"
},
{
@@ -184,12 +229,12 @@
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go",
- "sha256": "9435eb0a0f3cb01384d932f8abca33af7564814fdd9624a520932ca777e875ff",
+ "sha256": "5d336a2440033514ef58aa41966fb7273cd3ad1570dc6300798694212db2602a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go",
- "sha256": "eb73199e251924d7ff24711a133ecdcaf3bfd1fca5b824f5034f162597dea90a",
+ "sha256": "722c006babea9a317d4b75e74514425cc320f216495259f81a7ad9a8ac9d19a5",
"blueprint": "blueprints/thousandeyes"
},
{
@@ -199,722 +244,812 @@
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/construct.go",
- "sha256": "fbed09b947133d90ab0081ceab085d009a517e4f66784b454d0a3f8ab591b25d",
+ "sha256": "1d89ba5d6eaf3ac6a62552bcbdc4691b17b95fe62f3e8a8f6e3c1b8c3f74431d",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go",
- "sha256": "efb3e1f4bf9e04039da8b8d1c4f53cbda6a4d5f6f2fa1ec70cd8ec9b0a0cdcb6",
+ "sha256": "6d65894184fe10d8d056be9d166b286bf794351eb3f3343663e95285f35140d1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go",
- "sha256": "ccc4f67c7f62474aa55fd90cc65ffb88b7ad5abcb1b4042f97d2fb845565ab50",
+ "sha256": "d5b48f5557ee5cd0ba486b426d5c449d9c07277b6959ac4eff74a2b1b19b6afa",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource.go",
- "sha256": "37ed6867b4efa8ee98f0675c5ec79b11e19990e1d0bdaff2323affa5bd11dc27",
+ "sha256": "bf7d641c49e2c3b5b8741e717cc3f1e9a3cd50e102f70e852259a2a153fe328c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go",
- "sha256": "1743ba0ccb1631c19ad68351b86ab0bb873e105b9b6f3571a8af26d310227907",
+ "sha256": "ed31772bb657c75d5d6bb09416b96886da7eb6abda48962dea7d80cbceda2275",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/state.go",
- "sha256": "3348add61743fa637bb66496f943a39ffa991a4912334c68d6ec386cb37dc41b",
+ "sha256": "0729e9656db2f3983294cd8a9899370d3c72f1bb8daa242e58a389e47eb333e8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go",
- "sha256": "33cfae1d92fb5889fb284b38ecba55c55b5d13d4e256588856ac369e2747f428",
+ "sha256": "1aa995f7a1f94baae7fe601f65c227a9fee17a7e728fc6c6a475b08a964c46fe",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/maximal.tf",
- "sha256": "cd5371cc209fa490a040ffeca0c0065b46d381becd231623c9e7242b0f3e05af",
+ "sha256": "1dccf74c70c1ef1e69874aed6ae37257ee0162497063bd2c0294591a4e5b2810",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/testdata/minimal.tf",
- "sha256": "deac7c1701ebdb79390124110e2b738d40cf2569c03e272e4eab148dc034514e",
+ "sha256": "98558d0f28e47261d9ec0d237c9df19c9c1c0e69b2c0e8d1d8ae99b6c8377d7d",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/construct.go",
- "sha256": "a3f110fb663eba24312e792bdb8f6255bacad5278e807e09d6189bc092406dfa",
+ "sha256": "f1dc90ab235e28c7b1bd39461034483ea1f7d1be80960a48a587a9977aef76bb",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/crud.go",
- "sha256": "d2c63090c0c3390e0e8c03977a155f9800c0c0eea032a7ac05b8070e53c93742",
+ "sha256": "b1baf2dda88381c250072063ceb0ed83470a79495b50968e65c85cd016fdd0c1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/model.go",
- "sha256": "8ddf2ea6bb56b29a57bdf428007682bf2ca9e1a9f816678531b3fba2c02aa16b",
+ "sha256": "6625df3445abe79bac6d17dfe0a2506932839817d7f07badd601c221298bc9f1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/resource.go",
- "sha256": "c5f36b73419aa53f3d5da514b24ccd1beca9d7e169ee75b9d871841d357a92d7",
+ "sha256": "1ccda6b49dd6564ef161721aaa9744061698ca101484971b7765bd4da36969de",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/resource_acceptance_test.go",
- "sha256": "6701dbc0ad7de3857dc35b120f85f12277872765d3f33c5d00863c774a7d191d",
+ "sha256": "6615e2890a90ed93b8939ccedd35ac5536df6bce6245ae5114bd4f2812fa3dcd",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/state.go",
- "sha256": "a094b672ff5c78ae3283d52c7bd5753bc0dbc8e1392a7799e84aecd08f2c4d81",
+ "sha256": "60f014c94e78216c8e32c493adb74c17ddbcd1541a043d437a90f6d054260c24",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/test_helper_test.go",
- "sha256": "c6cb3501b4050a69735959ef8b0b6ca755c540eba4ba303dba8900cbe3010dc9",
+ "sha256": "da0a8d6152b79c7fa002a42829174fcd6943a1d0713324d625a69352061836d3",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf",
- "sha256": "d83a6bedf0cd938a0d128bf24045b480765318d819b3b8aba892c1a9101dc417",
+ "sha256": "584daf69844cf396201ddfe44d08c23df125340a0919121d2d68724919003831",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf",
- "sha256": "c1148c97ec21292c0056c3e25a69dcc763e22bb6e3fa3964dab53eeb3855871d",
+ "sha256": "b1b1e5e3d8f3268509636c6fd3d0bd07f2afd6c1ca200a034012326e80270894",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/construct.go",
- "sha256": "9bcd0f0541891592d5cda5a62e992f1cc27b2a73fed5a3549be2a12feee4a5e9",
+ "sha256": "7c30399bceeff80e205c995c59b2c84693939308f6528e96b6f71c4fc5db30b8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/crud.go",
- "sha256": "beb51db81351f8df5174a3abffe46d178e5e09fb0bd16318a67e08a19cf9157d",
+ "sha256": "0da5327484eb693ccbaadb80fedc0ac72c1a489bd888286657f66f271665c281",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/model.go",
- "sha256": "42e0c39649259ace3a7158d3413f946fac7b5d51c5841fed64bde0388b100270",
+ "sha256": "159f45feaa40d06b7605b7c4d84e219945cc2117ebc99d0d47c33b71421a89da",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource.go",
- "sha256": "54161f577e2f4867b0917ce55a14e3d286c42db8bff90147e64ab08c16302750",
+ "sha256": "9695fab791a2bab92c96461efcace6681fdca036a893df945710491be995c7d0",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/resource_acceptance_test.go",
- "sha256": "7c350b70c06888cd6d27c93cbda987c29e66e914cb05627739b83dc769e7cd92",
+ "sha256": "05aca934efc32490dccf26396ac38a82d99d08a45ae4af3c0c43baef925f6b82",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/state.go",
- "sha256": "47b235f4551fdffa19c6fd2a40d1bec90dfe6cee3b75571ca24b8c92f45499b8",
+ "sha256": "1bf4ddb724dba98ef3e9755635969412d4a0c96cb2dbf78d9a32240484d018f7",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/test_helper_test.go",
- "sha256": "c9c1406c2dabc992c7b8b3d20975ab8e984f559658a589429c616a5ffaf5bad4",
+ "sha256": "3352517309a957eaa5929a8051a63f1b66004a8091336a0839437908af92eb83",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/maximal.tf",
- "sha256": "22d76fe49bc9b6a5e2d5d11ba2c2433b01cabdda8d5bba7478edca23830a2650",
+ "sha256": "942f540127e5a86ccd1b409576d3173bed626c8cf7f3ebf430d7712ec66dc827",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/alert_suppression_windows/v7/alert_suppression_window/testdata/minimal.tf",
- "sha256": "61b535daf3df3951c1cdda3484c7d54500a90275e6af5d712cf57f6b689f44fc",
+ "sha256": "8daa67daa31fc51c75ac88c03253e255f1cf6250fbbd8a223096b3dc93065aae",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/construct.go",
- "sha256": "e2d864c0852cbc11b8576f3203fa81e27685c5ddcfdd471be09ee57989c3fda8",
+ "sha256": "63c15bed74e7d83d82b53155773ba8230cb49ba7a2e86a1e414712d2a8cfaf21",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/crud.go",
- "sha256": "8f4eaf98aa133e07a1f726940af9fd5a2f3fa49de198c71055f51dac67caddf6",
+ "sha256": "b6360ecbe0688e55c552903c1182a490533629b029837092d5f2b7b917ece1f6",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/model.go",
- "sha256": "5100eefed1f9eb90b4ce76d682044b713d618dd6c03f27c1def5f4fc5a5b4df1",
+ "sha256": "64055ca734a7235721d2311b9cb8402552b8e135426eb65ae489929f0222408c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/resource.go",
- "sha256": "9e72c5e551e22c6c6959089891e7a1074eb02319384b235da146f84922974252",
+ "sha256": "ffd2de0c29d0ad81364363322bff27a9981393b151d8b034f7a337ca3b80895e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/resource_acceptance_test.go",
- "sha256": "b65345a74c9217e9aa23ff5abbd22a206626951cd644626b81a2c5e718fd8e6d",
+ "sha256": "4b964d4b6583de1e5eaba9e5ec1d1ba13e965e5e5b345b7e3d26f90acbb6785c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/state.go",
- "sha256": "491936a70fe3c64ab107f29edaa6631adbe2158ef939928db11df3ae87e8dcf8",
+ "sha256": "3be13f9d21d6e12ddd506e8a0a46ab0925dd89982dd17e5869227123a38966fc",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/test_helper_test.go",
- "sha256": "9e53f8c7e9b672cb62c91e60b44f84bec1cf42df1bb881e6c6cb0131e3e8328c",
+ "sha256": "25634dbe0edac8dbcbf86744cb246dc6c465d0fc96fdc7d30e60235e336f01a4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/testdata/maximal.tf",
- "sha256": "289401100af06ff36917089a491bba6690585bf64ff769d9f649172ba32024e7",
+ "sha256": "51e6f200fe55c8a97366c785c2ec5c6d747ffaab90b60d1b54bff306a245f8c8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/api_tests/v7/tests_api/testdata/minimal.tf",
- "sha256": "96d0b8155c64a43df646e016722a570fd79528cd6a7cbff14fe45a76a9be7a11",
+ "sha256": "5488d98be0167ef689f55546ac5bb48133c085891ba33685cec0b2d446d883c9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/construct.go",
- "sha256": "57f59a677b81ab4636030a62d99f8c47b5b7503ea8d7a64e31ec7a371c0d3fca",
+ "sha256": "5514861750873b4ebdfea03b2dee97b825bdae354b87124db2e4862ea844f73d",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/crud.go",
- "sha256": "b3103ed56f248a7b23ae204a12953581df438ac1e17cbcfe9a1d32b8f5f1537e",
+ "sha256": "ae6a16eb7da9d5f3e9b267f3b9757b4ec9d250a383290cacdc1952de38240bd4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/model.go",
- "sha256": "0640270389213ed7ca67ebfcbc454140c86cd5573edbf9d6943c46b54d9f969c",
+ "sha256": "76c6af4427a5c200d5e6b31f77b1c3a0d695e89dc65ff4236570612af49c9ccb",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/resource.go",
- "sha256": "b5fd45df9be45ef8ee05be139f1ae97efb3863c519f02adb5f86f75c8b1818c0",
+ "sha256": "cbc22488c4de84add627caa7e663ab4975e1e0af206bccebd8fe905fe6385450",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/resource_acceptance_test.go",
- "sha256": "02efd7dad47f1c92855ede6fa20175feac064cffe5bf790f4ab853b78b4701b8",
+ "sha256": "e862d159ef4112b2633224aa98835f993cd5deb7f04ee8fb47228481d8f415c6",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/state.go",
- "sha256": "e690451e3c0f14125835484e08b5a6ebb4bde63f080716a668d3946eef122bfb",
+ "sha256": "8582e8240676d070ca7e43d157e67325361fb5e6eee3075480e355838e8ec103",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/test_helper_test.go",
- "sha256": "17e8c1efb70ef96df766f7c582f6c243bfa6ad42a942f83ed20bd8777ece8c3e",
+ "sha256": "288a7cdfba3c6c58b62204b3ff1077fd4c420061b4a2d09b543815d8ce758058",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/testdata/maximal.tf",
- "sha256": "849367c490eee8d92b0cf77d0b1f41fb745a38631c5c5c03e2ba0a1334740d72",
+ "sha256": "66ac865d3347dbc4a50900dff9f2f75ffee2b620986f5da32b22be4246ca662e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/bgp_tests/v7/tests_bgp/testdata/minimal.tf",
- "sha256": "ec6e956db6c236c98cea2c4f7df69305b45a15d51cdd893c3fb48cda6f76e8ed",
+ "sha256": "27c8001dc0f24a447606ccb843245cb3c4d9716cf5fed0d20acae33ec6fba5c0",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/construct.go",
- "sha256": "b72aed7e5165434f808cbcefee5afb25eb1e73775ab0023e0b20f363da6f78bd",
+ "sha256": "b701bb77ac6ffb09853ec21b5a4da0b289ac4db262c00b5e82c1e3ba3a75e998",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/crud.go",
- "sha256": "f84d928a8aa3b0b761ad14fedee847dc96fe4e727200b67a3b7207b2af59c0b3",
+ "sha256": "2edd6cc59133834c33f8b7ac675ad4d8f7e90dadb6555f68b5468015735ad580",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/model.go",
- "sha256": "67265fd4b4b8c6e5111b7a3c76dc7727a9a9d4f959c99e9e1cd39e4d22fe6036",
+ "sha256": "078771ec1e6a44b4bd5dbb03503d2525c41581e22bc458ab23e8ab9bfde15a7a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/resource.go",
- "sha256": "2ba5c3fd1ecfd6364c7a92a0dd2faa1ffb8bf665cc5c3559097aee561953ee77",
+ "sha256": "73b1137e60fa1f12c7630e56534f9834f2893f8637d7fb58f6d582256ccfe1a5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/resource_acceptance_test.go",
- "sha256": "7206ed3729db1f25e63531e104aaf5e3e9a2450d5bfac4a8c2b13c448c113254",
+ "sha256": "69189b0d92b68ffbcccbc654961c6d1a703cef96cb26983e34c651228914bf85",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/state.go",
- "sha256": "8a2cc5dfb77de7c989f2c2205ac2b38521bcab843b193e7340fbc0dad2c3d658",
+ "sha256": "b377d0c27803b8ea7373d30c285c34a5d4de094a7ee9b9351f8baa6e8eff17d4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/test_helper_test.go",
- "sha256": "f18d32f55773678dfdfbf3d480a78a3a012d9b2706eb1f785862888b601a0974",
+ "sha256": "098ecbac2d4244e7b7e83b2b41b7782179f43d8dfb9234844c99de6fde981e8c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/testdata/maximal.tf",
- "sha256": "4eebe6def661c93b16d60dd0c43a86eeb7a9c95ded45c5e88aba46d4fbcb1979",
+ "sha256": "c417708b077c85893ee49525fbf323c11302251a63d6dbda77bad9e3cb1ae5c6",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/credentials/v7/credential/testdata/minimal.tf",
- "sha256": "ac6aab715c2e36d3bdd93504c49698aa01bc89f4e34281ee6b9308a13e377c6d",
+ "sha256": "cc8cf2672859d0dae661971d4b061e05019b00a9e9514aa2adb1c654b1d6a48c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go",
- "sha256": "6e8ba882704dfbddecee069ba999a321e4a4a7a78f6ed33a551491d42a83a9ab",
+ "sha256": "ff6f568b420c545f7a453f6ddca78de5af0ab7014664f3be0ef3d3353d5ab8a2",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go",
- "sha256": "a52361792c11632502b44e19bee777e76558d54b17578fb857a75a7e99e93b7b",
+ "sha256": "875cf31eb54161f8b1bbcdc83f834e292c78d23d385ebf6ad7bd0afc1a55297a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go",
- "sha256": "aa4ade44e7037e2ba05f56978ccc9dcaf8c6b10670b19a4bf2c55a3d1ba6d9ac",
+ "sha256": "3e83e1451db9226be970cdd6d0f4dcc305c4c89fb57f1e22bf8d5c175cb94f2e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go",
- "sha256": "d500c8e1911d60b33392079b5fed53ce2601f6de92a5ab90446d75e4d875bed6",
+ "sha256": "bb9f917e88148c102f5116073717f6f56240eed926e8dbb46bf6127d8323228c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/resource_acceptance_test.go",
- "sha256": "281310ef8e4435cb772770f2cf2540b5fc0daabae7d5f4e12f45248893068c3d",
+ "sha256": "79d6561f7eefb8ff7a7c02470ef5d969b5728e30e6521863f4ea61e5f6d3f2ca",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go",
- "sha256": "e63b6535450cb2095a3b8a0f8ea6cf9757a6d589a7f3ae192c137543eea4e612",
+ "sha256": "c5caf7cc64ec8f30d01c835b4462e897d05490042b5605ab4b950f9d8790b082",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/test_helper_test.go",
- "sha256": "d407b74a629584abb92e3fb51abb3ba1f04f67f36b0c8b37c65643ffd9d3d0bb",
+ "sha256": "fb26eeaa218149826c1d85df045de881fc1d654b4561981b58d7b9fb30a0f5d8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf",
- "sha256": "d3e1886af0c64828e652900a2fb001288213d899a414b58402e50698511375bb",
+ "sha256": "f19714af9a553b94dfbad3e871fcc4531abe85d358a4efbf226516cf462d875e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf",
- "sha256": "e28c219cc2caa72077c710e6d069d7eab61ecf25c83410d8573bf5ae05a67393",
+ "sha256": "7540b02ea25d4863b1647437ff6081f4ec8f328e6aa4ed28b3738a713c92c2ee",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/construct.go",
- "sha256": "b4bd3fc70bc2e168fad2bf7433e756d5b5553b0b90b7a3c302d560a41380bb86",
+ "sha256": "e7d017199f15795a18f092dbd7e2c32d85bd3e9077428f854891ca9b251519e0",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/crud.go",
- "sha256": "c619536d3ecc576626218a0e4ff0fdb39528b79d51cf06ce411a7d5a31245241",
+ "sha256": "a7278f1eb6a588de46d8e20f4923dbc59db5979349bd73c3e5bebaa914ab4502",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/model.go",
- "sha256": "f81741402bb21e57fe73e8c3723e4ffd070f4cc6a4692ba6f97093adaab49a01",
+ "sha256": "f7f3583963d1982ac7d9c6bc363ebaa272b0372d927b9cece85de3d4f8cac2f5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/resource.go",
- "sha256": "21348c50b558cf6c2f973b46953dc7941b06ff83cad98427aae4890b4f60240c",
+ "sha256": "5aa7651dce0ef3183ab8fe6837f05105682cba70762f97f28d79d97391af584b",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/resource_acceptance_test.go",
- "sha256": "70df127b1973d28a4d4ac78962cb508dfa94c7c92925c088f3d31c2de72081f3",
+ "sha256": "46e26227514ac0969a9caa4a8f284aa545f8c83d659a80e5756299208a1c9c0c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/state.go",
- "sha256": "a75b98510a33d2a9977db0d8d32e42e7b113b987956754bc519227e382d4dec9",
+ "sha256": "0c97c3f2dbefdf1cac346e8502da6241ce2ae022e34779c1d35e04a59f472810",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/test_helper_test.go",
- "sha256": "5208ce11ed119f986732c0096584ee2e10c4d54c9547273d2373d70c2929ab2c",
+ "sha256": "cb0c59da628d851e812f4503da0ef34b6acae128bd4ab925cf1ea7b5369171ba",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/maximal.tf",
- "sha256": "e54f8cb2be712b0263680f520872868b09b77d66ee1c5b0174c135f371829b32",
+ "sha256": "4cbfca5310a8e1ded779f4fce43503d9c1fe84bf7474e01fd14bab70484c1ea5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_server_tests/v7/tests_dns_server/testdata/minimal.tf",
- "sha256": "5b83809d9ae0cb23f66a5aed4d7ecb94db5ac566c1068f64002b8838a8fd2e35",
+ "sha256": "a69aa938ac691f587b49a71e484635294b5c5386f09b401eac901c3bd0128de3",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/construct.go",
- "sha256": "b1739e41e80b2159558fc64b03b62c61924c646f4dda0da44a40ff4dd4710960",
+ "sha256": "863f3dad7a75366f438a1c014b2ba66d595ab23ec1fd56a8ab34ab11f837c5f0",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/crud.go",
- "sha256": "c8258b703a3d8960511c189796c4691f257dc1b29b62253f0246f4a898b788b3",
+ "sha256": "e68ed6613b695a3e0f9cfabf9fa0ab784047b00f315d2bdbbb3707f8124d9dba",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/model.go",
- "sha256": "e0ed43762fb3866e2513d56b39ad5925ad50a230c910c75c88f92cbd83f62331",
+ "sha256": "742ad9e054faaa4e612cb9fac727453e99c60fefc2f7df6e7f087e551bf6461c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource.go",
- "sha256": "9d5d92cbca3938df644d9a4a8e3ea7cf35feb051de32cdbf5dee3f1530673df8",
+ "sha256": "1e44433bab5315a83477ef8568de7eecd7e0c6086103660f473fe2b79e18d3a1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/resource_acceptance_test.go",
- "sha256": "6e577d3efd375fc9ca5dcb9f4a1d90dad5fe16bbe97c361b8b822dd16472cdb8",
+ "sha256": "44e89df94091ba531b33c2d099fb2da22cd48d61428864c7544122ebe13bbcbf",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/state.go",
- "sha256": "55eca6ad2ee14e90cb2bdfc30c868a418a5091047582d204bddc9bb82aab3d8a",
+ "sha256": "eec18ad11a87f296359840040fc34935baa1c805db5316b806921f7e9b2e9a7e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/test_helper_test.go",
- "sha256": "096735d839ea73f128dd900bc89498ffb0999a97ce6447082ab2d50e13c87ffd",
+ "sha256": "53116c18bb38685727a9a62c02c6cc493d587cf8dc2bf1facbb08d77ec97581d",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/maximal.tf",
- "sha256": "fccef920534dfb4940ea67a53a6d7b4c9535508cb3ab32d031e6e9ed039a0794",
+ "sha256": "9109886ca5431ee57e3b37a3a64fed8522fa15bd5bf3e1eb20394030c3234b13",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dns_trace_tests/v7/tests_dns_trace/testdata/minimal.tf",
- "sha256": "ed1315e5ab67aab436c5a2667aa519668c53a923bdb63a875d920975d64cd60f",
+ "sha256": "d0ab656c413bc88f59a4c8ce82f6506861f260d5d55d22ef06e66e91cd7438d7",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/construct.go",
- "sha256": "4a9813e1311599676588ccea77eaae03c94d3c59317e05e5a8301fb7fca37dc7",
+ "sha256": "c26728064e28eae6fadf143ba15ef9711fecf198ee4533cb355ecf02ad3143a2",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/crud.go",
- "sha256": "81b650d01490035287037560e6917a13ff7200509971b9c6294dde81c493fb33",
+ "sha256": "8fb28f5fbe6e6de2d3b824a99f3879011637ef6e575c321b059ec55af87c2f0c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/model.go",
- "sha256": "69c2545d682a186f2f7f26d8b64e272c6722d6b2fa646eb09256145ef05e1d4c",
+ "sha256": "daba2c1a8c9d4073effa64615465d73f05a241eea214995d7284bacaaa08c923",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/resource.go",
- "sha256": "0a98c6e692da95cd62c961535f953bc02ca0666705a0d2ab2d986edef19eec7c",
+ "sha256": "480463b73a97a2430d8bae269f3f89f7584fab379299d6ce0eb73275dd3d3ad1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/resource_acceptance_test.go",
- "sha256": "2f4aca2d11ac503c64a902533e7dfe057acf3b579afaeb014d96b0e66da3379e",
+ "sha256": "bb9f5b79d77896e6fba69ad87bad3773256af5e260131dd0d576b3004789db50",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/state.go",
- "sha256": "8650df421760a2af5ece3fa51861ff648a6e63ae57102f910ba6a956c81da58b",
+ "sha256": "10fa49418f5c50497f83f320451cc3234d150c48c09024f141fccbfc9c625c79",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/test_helper_test.go",
- "sha256": "5232e79563592c3ab466aee2b26642630d20b4d03b58a7eee630d823549e8ac8",
+ "sha256": "bd6d18cce3a6fbff6ff557d45d8aacbd5471e31dc1a924b4daa3f712ad4adb13",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/maximal.tf",
- "sha256": "01b3fce2622eeabf7a1dba7a30a64396d4632593cd6d3beef924e8580765fd94",
+ "sha256": "a67da73dcaf4e8613b734c95d6ffbe0bcf3faa0672f68ade9dfdecd7aac1f6bc",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/dnssec_tests/v7/tests_dnssec/testdata/minimal.tf",
- "sha256": "898c648054e199283db463e48893e15abee59e1ac95b116ecb9270b65bfd0989",
+ "sha256": "5f7e2c3b9743351f535cbf54c34f8b5277506c080eaede671a16cdb74f516ba1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/construct.go",
- "sha256": "0af0678122c65de0c7630d1d090717062c61da6e3d67172e4bdeef7a2004d735",
+ "sha256": "979d61974438397b4c00de3cf07ffae559cca71668c35e3f78a31ee53853c788",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/crud.go",
- "sha256": "819de31c9bfc5a79faaf900a99b2bf324050185732de0769efd5914e8348268b",
+ "sha256": "755431151df4bcd2645f4d8a66663b1b8585e3ec1ffd664148c04775160ed413",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/model.go",
- "sha256": "e7595b1588e9741a077c451c7d041dcbd5a67c9d41ac01122da3b4187b8f2de6",
+ "sha256": "b867ee16c04d177575f3a8072ae8bf230ff8d72a886c0eda908793b2c9a74e85",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource.go",
- "sha256": "2bb776becde06564570af56928aba0cfb90af1752c818be66192e224dc71080b",
+ "sha256": "5d24299f9584c854a34dee9fad6635f474211736a51fd1980e71da39d0c90016",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/resource_acceptance_test.go",
- "sha256": "f78119eaa165e0aca7a3a490b557fd018d9dc3634a82c703cd51abafaf479606",
+ "sha256": "b7b039e7fb05d31d86a7f67ae4f4a93abe59934d40f3c92f9330c8ec82cb6382",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/state.go",
- "sha256": "14a5beeeeccad59fd9b588ee9fae0b69d3c89f24f83337b071cff276f7097193",
+ "sha256": "bfe6c5964dd52bba61864fa948528db5b8886e51169a748b5da821bfbb0ce3e5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/test_helper_test.go",
- "sha256": "7ef8f4782ef5500274cb5ff50637ecdb7d5c11d5a78c364f142ce4d17838cb68",
+ "sha256": "5b892958a7e8ad5c4e811b7b14ccf934ab738ee0dc2ae60a7b1ab3d72abdf554",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/maximal.tf",
- "sha256": "bdc3b55d72902efb2326c6b9a303dd90dce8e6dc7c322487192486b2be22a80b",
+ "sha256": "0fe1eeb771512b0fd1e1da77b880dfccced3a47eeded03a202c7d58e8203ed63",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/ftp_server_tests/v7/tests_ftp_server/testdata/minimal.tf",
- "sha256": "35876fcd87b54c6df179afd85522a04d1ab5705d866468f53ed9da94fac4ad58",
+ "sha256": "459152c393560e46ad6e90843b7892c7bf656d68aee24a3a5662bb58d1a126d8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/construct.go",
- "sha256": "f1cf01f8d8fbbfb7e927390f64eeed5070aaccbbf45c947b4f895f2cbbc05edf",
+ "sha256": "85117ab589fb9e661902ffff44feb28d7bdc555b123efa03116c65a7b13d0850",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/crud.go",
- "sha256": "d098335608050cb1e25da85c894ff4d94f3e4144f8ad68cfc290462c707733c2",
+ "sha256": "e19e38f80efb47959ed295136615c0bb9a2a1c81b06a9090d8c1d8f090c87500",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/model.go",
- "sha256": "3c78143cfbc3e57b2d2f95654bd16ce228b308d649a7b416ab2b1d039e93a517",
+ "sha256": "057b876f39ada05713a4453bb4f43b86b0186321fd2f26afbc2454068b5fdf39",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/resource.go",
- "sha256": "f878099f9e2516af290fd4799a58a3555b53ea3cb4686fbbf5eac2dd6ab55b0e",
+ "sha256": "0f449d9245eda10d9869a034cc8c9d5301b9954b2119632e1f0f6cebe5f33ed3",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/resource_acceptance_test.go",
- "sha256": "c9bfa9f65e132d05a125304ccf5a6378ff5736a16f6a249321d456080d0aa84b",
+ "sha256": "5df4d0cc16de4455e0eff28040f39808e57879caf06abf40b8d76951635237bd",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/state.go",
- "sha256": "c12ec9044951acf58fd3659fbf06c8f6ad5410d0b4db712e928965ce760d95a8",
+ "sha256": "e6a2afec6453dd1b3d49f78c633dc1f00bfc765e3e67a032e46df4eaa30a960a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/test_helper_test.go",
- "sha256": "9363e16020e39902d4177c3f5a430b3535861be0ded80965d5c0df068bee710b",
+ "sha256": "ea22a936e2bcfa1d071272c841635153ba904f7de46f286a16e4578c010993c0",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/testdata/maximal.tf",
- "sha256": "4b2ab7990e9dc5875c837ddac51549956dbc3f6bed28ec5631ff6df0dcc205ce",
+ "sha256": "7a2cc18efdc6bc02032b745949f27bca0042ce8a28541adde9b0f2cd8eec2d36",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/http_server_tests/v7/tests_http_server/testdata/minimal.tf",
- "sha256": "1a93537201a2378a0ac47d6688f4408dc943de22223b89b7520ab7ebcf8344ec",
+ "sha256": "e3b5fe7941f440c0c9f4660ce7dd8289161d986fb6e57ede1a262bbc0e290a61",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/construct.go",
- "sha256": "8d404e7ff83e286cee013f8132624a12104aeeb1674a05cf444ea0981f726d29",
+ "sha256": "3bb9c3d97b6d92b87935fa3d14e0f1d0aee388e754bd4ac16e7d78774bc63e20",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/crud.go",
- "sha256": "788a4d9c9e7fb8cd75448c6d577c7a797788d60b133d9f45ea4b8c49e67a3dd2",
+ "sha256": "936bd6d0e92f26d48005391ecd665d2ae590074785af89205a0d64aa9b633a47",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/model.go",
- "sha256": "86ebba1a0a2aebd595adb52cb1fbde7f08e2bbdfb66035573e2ea623154d9660",
+ "sha256": "1333de0026cde82b63d75c168f2154cd5631d539adf4f02ead0ac96ac6a1e449",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/resource.go",
- "sha256": "ba6d4137d099a1470552924829ce0ef50a5b54b76861c4120cf89561f28992a3",
+ "sha256": "f304014fbc6b740283a0276c80f98948216be76025349b1c17fc1cc6fdbff5bd",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/resource_acceptance_test.go",
- "sha256": "00272a7c28de594e34e2066b319db95d03ada245ae935edae0bf6835a319f8e0",
+ "sha256": "7d1128e4cf851bf1b5b4834f196cce8840652a9eda0fef8ca7bcbaf8b98709e9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/state.go",
- "sha256": "874fe7ac922a0ce972b8fc7cca8348e91ea3c0a37876066433f4085323135849",
+ "sha256": "ea3fdd70d88c3fc30c9b6177033f6e937fb2c69bc23f9ca974f5ac2918e6edd9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/test_helper_test.go",
- "sha256": "71dab6710a6970eabf7a10f6e4f694b0d74eb1ed1d18407a6ac1a306fd798d19",
+ "sha256": "ad34cefec15d33a0943b38242dbcd5e88dffadbb727b2b6c2b34c67e94ce5db9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/testdata/maximal.tf",
- "sha256": "6b4c15af38a95df18093cfa18b775ebb7e5334721d5fa3ffebfb5ea947f0aa82",
+ "sha256": "df74ad3d2397cd497e1399cfe1fb171a48b44b64a9aad51bff92d5aab41ed55b",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/page_load_tests/v7/tests_page_load/testdata/minimal.tf",
- "sha256": "bb0e7909bbccb450f73e138c34783ecb6a85d2214c4261c8aefdb329f713d6e4",
+ "sha256": "ac285b35772cae3d2b5dd59058135f4d9de1854ec829f18e34d0342733046df1",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/construct.go",
+ "sha256": "c8cbec628675f0b9cd8e7a5ce4a0fb9050d615b597fdd295a383b26d3f49664a",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/crud.go",
+ "sha256": "292c92a7a174277eee329f8c177927cadff1dc67bd54fbfbef3ae3bf7a450b07",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/model.go",
+ "sha256": "d5717130a804844efeba6156fb0fcd2d1abc0f9ae2fca06e6cd4b4b9db26b309",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/resource.go",
+ "sha256": "378644c5da3042f7926eaa9889c1e8b88fe9834904cd9013a4790f5d32d5ff8d",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/resource_acceptance_test.go",
+ "sha256": "e2a3c63fd67fb3bcddf5b770ac9e768561aa25e7465400271a8d2bc6ad64b2a8",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/state.go",
+ "sha256": "5db344b9cad1a77194d8ac49a637cad5b716bbf57a69165d89137e4c68574183",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/test_helper_test.go",
+ "sha256": "bea068c266c6a6de20fae0fa49aadde9ab41d5da86710414d3c11c42b64837b1",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/testdata/maximal.tf",
+ "sha256": "a8d1b4fe78e4dfcca3858618a5e11a287bb69af08f593a64560b6d6a0aa28c44",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/roles/v7/role/testdata/minimal.tf",
+ "sha256": "645a8a23594dcda6cfe91947eb24140e6e573cfcec4c2d99e5a6f54841be27d1",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/construct.go",
- "sha256": "3fb4a1f2e1e26b122b8664e6373723aa22221dcc6dc5f1d7fed0d7980ee9430a",
+ "sha256": "8b51d2c65e3e53d0bea25cfa94ec237e35e3d6382d26f5c91eaf9813579bd03e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/crud.go",
- "sha256": "719b016f9d94f2bc0cf61079f5fb890ea4bd6a2bba73eabd6dae5928f2d8f4a2",
+ "sha256": "5d469a5ff1e6985a99a846a4202f64b4e6c53770bb14d6f3df7a64692e9c74c5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/model.go",
- "sha256": "96c58a6b82ec879720545f9e3c073e09d0fa01386ce38ef21e0910836033bbe1",
+ "sha256": "d81d70b54e54f00447206ddba86d8fa02b9430749755906253ee2e502a57b159",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/resource.go",
- "sha256": "eb9ae276c90c9ebc2c45ead4e8964b00a6aabd00b04813de17854cde9bd95ba5",
+ "sha256": "fa09f1bef9b540e6e350a5e29012df95d77402d1c23531f4f418660f464eeecc",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/resource_acceptance_test.go",
- "sha256": "df69a0e40e14c81373f8d5227f571c767d0083ecd7ba0b30788b654e920c658f",
+ "sha256": "c4a236a7a8525aeb27315f799437cde6f7d9cb05bd6f0016d3168e40db44b1e3",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/state.go",
- "sha256": "fe4be4f9fddbd7b559e0f5534cbb8fb49df68cfaab813c89c29cf5f69b0d4940",
+ "sha256": "a8ca34bbc6b666e6066489eb0c275a0ca36d13cb794711947613047834eaeee7",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/test_helper_test.go",
- "sha256": "45a200fa0968584f59c09ef84d44d3f8f9cebe21f582a4e5e02e0a440dc97d4a",
+ "sha256": "84546565152f47c2886b10f0df7e3122152f46a91f9ea674ef0a9a6d4ac4974c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/maximal.tf",
- "sha256": "b857b3b5139fd2b62825caf41774ec89f120433303f46312e9790e8748d76f3d",
+ "sha256": "2a491b430b215ccf4b181b5c0534564fb4216901e218d540db47df7df92435c9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/sip_server_tests/v7/tests_sip_server/testdata/minimal.tf",
- "sha256": "32ad60c906bd955018a2b206ee0d9ab7ea75a1c1051abe2510b06dd250eb4de2",
+ "sha256": "2561ed14268686334c9efac97b3e845c3ec787a62d93fa9319ae14b6c3c499fc",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/conditional_validators.go",
- "sha256": "89a6ec367e551be8d2ad8eca0b74c57ca08ffbf46dd9cdb765e22075899ea5be",
+ "sha256": "0589e66500dc3cc60ebaf8a1a2fb1bf6d695c08bf1b96c98f5bb7659009610d6",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/construct.go",
- "sha256": "e17ce6a5556fdf1213a3aa98c9a12bbe4549bc4eb232075cc6025a93b534c5a5",
+ "sha256": "e91e142928cee63033800838c74f7e327191d598f08c9afbe24c7a2abedc7d3e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/crud.go",
- "sha256": "d476aba068331ac53881a2568759f06eb0bf2f808fda8dc326585adcbc9d7a4a",
+ "sha256": "a7067cf3d21a55272e69231b21706ad8d0f140ba30a3c280a6d5493010b93886",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/list_acceptance_test.go",
- "sha256": "cac0e6cbe524cd09cf468a6311fd97bbd91b39f0460828487b0bfebc3a0a79d3",
+ "sha256": "30aa12541ba799d6bbcffa8ae0ace50b363828b451f3d9af1c5c18cfcdbe2456",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/list_resource.go",
- "sha256": "0624f11539194b9579d7b6c44680bc73b2197ae5d00be5f3655f515b38e7ca2c",
+ "sha256": "9feed3dc92c47afb8c164fa7d9814fdad46887a2e728334801a7397eff83925e",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/model.go",
- "sha256": "bdfa564087f8a43358c1b98b6b5dba57e70b6da27a6f36b3472a019bb8d21126",
+ "sha256": "3ec6dc3c55b4400c4a432ada728cb525d0e9550ac8a2ef2b2277eb2f9c987b0f",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/resource.go",
- "sha256": "c6d173d8997e650495309b06892c2241f55c1960463679e89ea3ec9520e927cb",
+ "sha256": "18505333c00fdfc2bb2d88116777450a2bce5e079509c91506a2ccec4d9a2bb2",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/resource_acceptance_test.go",
- "sha256": "2355d717027f708bebfb3a346b9b9c223114ae78098c7616f08a8d021bc95491",
+ "sha256": "3f4a193bb838ab37ef96250563b4e5978ffa317733cbc721dbdad09b8fdd0032",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/state.go",
- "sha256": "3b66212cbf29b645449ff8da3eae99547df30514bd73f1dea081702d7130824b",
+ "sha256": "a738faf65d7baa37a273a38d244d4c174f353c55e220f5fd8f5ce972ae3aab31",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/test_helper_test.go",
- "sha256": "e9a12f6c9caaf6b770816f10c960a991a9c96c5505d2f9b37fef06d820f8a6c3",
+ "sha256": "8b544848e173eaa997ebd735464fec3ef701374e2c181a2ed9ff96edf08cc7d9",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/testdata/maximal.tf",
- "sha256": "d3b727881d0998441dae39f045068197b694020aa788dd5d6e08596b91dc8c5d",
+ "sha256": "72e2e29c1b1b991bf304b928516a2ee82a8db7fa8b21eaa0f0d09ddd24d5b0ee",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/testdata/minimal.tf",
- "sha256": "e8dfe86dd73fcc8f02e9c3883c7c61a7e44d7b96783754bc07e747ff6ed3f62e",
+ "sha256": "839a09150b00151064309e63e10972c48b4e653847f38ec7f6ef6bcea53148ee",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/testdata/query.tf",
- "sha256": "a6fff20555e4907e91c1ea52e2b7dbcbc98509a61463b00c6209331729f59042",
+ "sha256": "55f4061da14a653603bb794de68021ddf47cb7bf5e99a864f0790d7bdd6d57f5",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/tags/v7/tag/testdata/replace.tf",
- "sha256": "b6e39921170a14e1c517f31008228e981692d970e96b68b711dcba3b61903c08",
+ "sha256": "1d70c156f03f57288b9a5cf65c91e9f68f7bd76f83025d0390b1d3d4ccbdb1a4",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/construct.go",
+ "sha256": "a86abc896e88640ca4c752bf101e8012eb8fb8dc5689309eddf27ed21cc766a0",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/crud.go",
+ "sha256": "5aea379caa999c16149a1bd05bfec06f944ebe0be2ec58b885ad87c84744b7bd",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/model.go",
+ "sha256": "f4af3146bc709c8b45d2a9414ac111671a4d1a88706dd10ab9b38fa6a7c2edbf",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/resource.go",
+ "sha256": "84cda9642387aff4590825e37fb889a25a6e98deecc23243563c876828ff8cf1",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/resource_acceptance_test.go",
+ "sha256": "209f2802c5eae4e1a770950617238aba110a7512ab6e04cd1460cbd62942f928",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/state.go",
+ "sha256": "4efbfd0698d289a034d0f78de1fc6f7e20aa800d57f10496fe2deefa9b01dd55",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/test_helper_test.go",
+ "sha256": "d38c6fe1bf8b1279b7d29e00c4ca84e54d903c66094cc746c6e16c3827729e1d",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/testdata/maximal.tf",
+ "sha256": "0ec5ca5c01dd87ea0c5ec38e295502c23dcd61a656f047f6ca6a003bd5ba65dc",
+ "blueprint": "blueprints/thousandeyes"
+ },
+ {
+ "path": "internal/services/resources/users/v7/user/testdata/minimal.tf",
+ "sha256": "c29b4ed6cbe8ff8ef6166a414cedf3d8316340df8f1105fd21bb96db1e19801d",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/construct.go",
- "sha256": "e2387022979a6ff7f4ece1a741335ec5ec4094b9e207f2826915726ef5436189",
+ "sha256": "dd7cfda4110007b6b5a6f025fd730d510cd05613b2c666eae519a35800fe51e4",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/crud.go",
- "sha256": "bb9857338113ef6bf64c68f76d861d8d8475d2032d975a75255ec244187b4e36",
+ "sha256": "b458fd4d5cdba5a2dbcd1cadb3ab2dd7b2a97a7df11fef34034ef8686b438e21",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/model.go",
- "sha256": "34ec04b84cd7a46294d375cc26c207da01443d84eb39365f261bb9817e81e5de",
+ "sha256": "12128c52d8fe506171fe8f6a89a93634da0421a106f16d8a27ab6f6927442f5a",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/resource.go",
- "sha256": "31cca11eb46c326beeab60926b631122a15e32b3932b7877740bdf5b46aa5148",
+ "sha256": "29233c3823af678b41f6892c6611fce466ac83415032f45a171e722d6579f1c2",
"blueprint": "blueprints/thousandeyes"
},
{
@@ -924,12 +1059,12 @@
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/state.go",
- "sha256": "d59a68e7af8e2070610f4a64d22aed01247a260ac9c2ef3f9797f4038fc3bb08",
+ "sha256": "d2026fa0f98c39dd3f876337e40938bcd3c963c18cb67d47c849f9143804bf10",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/voice_tests/v7/tests_voice/test_helper_test.go",
- "sha256": "a4724fcb1809b11292f21ecf009e84639d578a3927a540d8c46a9455abe63018",
+ "sha256": "28f98a314e931fa2eb5cac30d70f6f7101de1551ad5393d4bfef88919a4d551d",
"blueprint": "blueprints/thousandeyes"
},
{
@@ -939,47 +1074,47 @@
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/construct.go",
- "sha256": "3a29eab43fae7a444cb0114c1a3d4f28c96d838b34b6782a5c852da9e23deece",
+ "sha256": "35b5c790867b3685f57a0373f524cc79726a3ca77a7e6ee3ad245df61255ae68",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/crud.go",
- "sha256": "98ce02bf373bed1106ba405dba5964066bac99db845d3620d81a23c7007bd77f",
+ "sha256": "bd5c8b3c5cffdbae08e90821628b516810948db682127371681c2b8d7e38d42c",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/model.go",
- "sha256": "04f1c28718b2a914aa32a63b91ef0b3a048b9033d6ff13b1f27f1e5ff399e9b6",
+ "sha256": "7a4f14ba7811570221353aada1753c416b38db5a6ecf8414a796536857d8d1ac",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource.go",
- "sha256": "b44f6f0731e8bc1d1639f661a0937366e1570f0b063fc30d898bd1879b74b48d",
+ "sha256": "4fb7e3df88554f58ccb19de359a15d6c0afded738097dadb29a2c0e9c010b8cb",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/resource_acceptance_test.go",
- "sha256": "c655b7a86909c36caa2b443e1226ce4b7b646a6e1f31b69e3d578038db52a581",
+ "sha256": "3ba1b118160c09dd3dd8e34f29ff9a0ab1ba7dad319a67fae64c483fc8be7fb8",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/state.go",
- "sha256": "49420c618854d235d7e665e62be173c6e4c86795552b280e376b7884ad9be280",
+ "sha256": "728e73a65ae3470acda9846b9408f208e887349cbbf2e677675f6af842bf3e2f",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/test_helper_test.go",
- "sha256": "1eeb0f335f06c6501c505bb5302770dabee8b0e927d84181c5cbf256a9a5f084",
+ "sha256": "600ad3ed2fa7f7b0b65f77ddfe7fde161fa7ca1e37c38a439441b6d084e4f0f6",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/maximal.tf",
- "sha256": "4435ed87bd9f8fc71047a04a0a9008895a46b205fc0a22862d1fedc227207d44",
+ "sha256": "bf53216401001547c3088ebbd3397eed5daf47161a518791836129a444fb5373",
"blueprint": "blueprints/thousandeyes"
},
{
"path": "internal/services/resources/web_transaction_tests/v7/tests_web_transaction/testdata/minimal.tf",
- "sha256": "7d96c04a106f8cec3220721ad65d29a72f7ba5b067cc73546f399125837bc500",
+ "sha256": "0ea63d6e40e5c5d1b879ee0744b8b21031a7789c0dc0e44bf2f9e3fbd099c421",
"blueprint": "blueprints/thousandeyes"
}
]
diff --git a/pilot/thousandeyes/docs/resources/account_group.md b/pilot/thousandeyes/docs/resources/account_group.md
new file mode 100644
index 00000000..b31669d2
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/account_group.md
@@ -0,0 +1,69 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_account_group Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Retrieve account group.
+---
+
+# thousandeyes_account_group (Resource)
+
+Retrieve account group.
+
+## Example Usage
+
+```terraform
+resource "thousandeyes_account_group" "example" {
+ account_group_name = "tfacc-account-group-name"
+}
+```
+
+
+## Schema
+
+### Optional
+
+- `account_group_name` (String) Account group name Required-by-API by curation: the sweeper's field, unprobeable by omission.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `id` (String) A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Named `id` per the import convention; the wire field stays aid.
+- `is_current_account_group` (Boolean) Indicates whether the requested aid is the context of the current account.
+- `is_default_account_group` (Boolean) Indicates whether the aid is the default one for the requesting user.
+- `org_id` (String) (Optional) The ID for the organization associated with the account group.
+- `organization_name` (String) (Optional) The name of the organization associated with the account group.
+- `users` (Attributes Set) (see [below for nested schema](#nestedatt--users))
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+
+
+
+### Nested Schema for `users`
+
+Read-Only:
+
+- `date_registered` (String) User's UTC registration date (ISO date-time format).
+- `email` (String) User's email address.
+- `last_login` (String) User's UTC last login date (ISO date-time format).
+- `name` (String) User's display name.
+- `roles` (Attributes Set) (see [below for nested schema](#nestedatt--users--roles))
+- `uid` (String) Unique ID representing the user.
+
+
+### Nested Schema for `users.roles`
+
+Read-Only:
+
+- `has_management_permissions` (Boolean) Flag indicating whether the user has management permissions.
+- `is_builtin` (Boolean) Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).
+- `name` (String) Name of the role.
+- `role_id` (String) Unique ID representing the role.
diff --git a/pilot/thousandeyes/docs/resources/alert_suppression_window.md b/pilot/thousandeyes/docs/resources/alert_suppression_window.md
new file mode 100644
index 00000000..ad22a8cc
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/alert_suppression_window.md
@@ -0,0 +1,70 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_alert_suppression_window Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Retrieve alert suppression window.
+---
+
+# thousandeyes_alert_suppression_window (Resource)
+
+Retrieve alert suppression window.
+
+## Example Usage
+
+```terraform
+resource "thousandeyes_alert_suppression_window" "example" {
+ duration = 3600
+ start_date = "2027-06-01T00:00:00Z"
+}
+```
+
+
+## Schema
+
+### Optional
+
+- `duration` (Number) Duration in seconds the suppression window is active. The API refuses a window without a duration (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare.
+- `end_repeat` (Attributes) End repeat options. The API assigns { type = "never" } when omitted (live acceptance, 2026-08-03). (see [below for nested schema](#nestedatt--end_repeat))
+- `is_enabled` (Boolean) Set to `false` for `disabled`, `true` for `enabled`.
+- `name` (String) Name of the alert suppression window. The 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.
+- `repeat` (Attributes) Repeat options. The API requires repeat conditions on every window; a one-off window carries `type = "none"` (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--repeat))
+- `start_date` (String) The date/time when the alert suppression window starts (ISO date-time format). The API enforces this field's presence, which the specification does not declare.
+- `test_ids` (Set of String) List of test IDs to assign to the alert suppression window. The response never carries testIds -- it echoes the linked tests as a nested collection instead -- so state carries the configured value. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `id` (String) Unique ID of the alert suppression window. Named `id` because terraform-plugin-testing populates import state only from an attribute literally called id; the wire field stays alertSuppressionWindowId.
+- `status` (String) Indicates the current status of the suppression window.
+
+
+### Nested Schema for `end_repeat`
+
+Optional:
+
+- `count` (Number) End repeat after number of occurrences, only valid with count type option.
+- `date` (String) End repeat after specific date, only valid with date type option (ISO date format).
+- `type` (String) End repeat options type. Values accepted here: `count`, `never`, `date`. Observed: the API assigns "never" when this is omitted. The API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.
+
+
+
+### Nested Schema for `repeat`
+
+Optional:
+
+- `days_of_week` (Set of String)
+- `interval_length` (Number) Number of `intervalTypes` to wait before reactivating the alert suppression window.
+- `interval_type` (String) Repeat options interval type Values accepted here: `day`, `week`, `month`. The API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.
+- `type` (String) Repeat options type. Values accepted here: `day`, `week`, `month`, `custom`. Observed: the API assigns "none" when this is omitted. The API accepted a value from outside the documented set, so no OneOf validator is generated for this attribute.
+
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
diff --git a/pilot/thousandeyes/docs/resources/alerts_rule.md b/pilot/thousandeyes/docs/resources/alerts_rule.md
new file mode 100644
index 00000000..7568b53d
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/alerts_rule.md
@@ -0,0 +1,66 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_alerts_rule Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Retrieve alert rule.
+---
+
+# thousandeyes_alerts_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"
+}
+```
+
+
+## Schema
+
+### Required
+
+- `alert_type` (String) Type of alert being triggered. In multi-layered tests, this value represents the layer the alert relates to. See [Alert Details](https://developer.cisco.com/docs/thousandeyes/retrieve-alert-details/) documentation for a list of possible values The API enforces this field's presence, which the specification does not declare.
+- `expression` (String) The expression of the alert rule. The API enforces this field's presence, which the specification does not declare.
+- `rounds_violating_out_of` (Number) Specifies the divisor (y value) in the “X of Y times” condition. The API enforces this field's presence, which the specification does not declare.
+- `rule_name` (String) Name of the alert rule.
+
+### Optional
+
+- `alert_group_type` (String) Category of alert type based on the application or network layer and source of the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Values accepted here: `bgp`, `browser-session`, `cloud-enterprise`, `endpoint`. Observed: the API assigns "cloud-enterprise" when this is omitted. The applied group follows the alert type -- an http-server rule stores cloud-enterprise whatever is sent -- so the fixtures leave it to the server.
+- `description` (String) A description of the alert rule.
+- `direction` (String) Direction for applicable alert types (eg. path trace, End-to-End (Agent) etc.) The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Only valid for directional alert types (end-to-end agent/server); refused for http-server rules (live acceptance, 2026-08-03).
+- `endpoint_agent_ids` (Set of String) An array of endpoint agent IDs associated with the rule (get `id` from `/endpoint/agents` API). This is applicable when `alertGroupType` is `browser-session`. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `endpoint_label_ids` (Set of String) An array of label IDs used to assign specific Endpoint Agents to the test (get `id` from `/endpoint/labels`). This is applicable when `alertGroupType` is `browser-session`. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `include_covered_prefixes` (Boolean) Set true to include covered prefixes in the BGP alert rule. Only applicable to BGP alert rules.
+- `is_default` (Boolean) If set to `true`, this alert rule becomes the default for its test type and is automatically applied to newly created tests with relevant metrics. Only one default alert rule is allowed per test type. Observed: the API assigns false when this is omitted from an update. Omitting this field from an update resets it rather than preserving the stored value.
+- `minimum_sources` (Number) The minimum number of agents or monitors that must meet the specified criteria to trigger the alert. Exactly one of minimum_sources and minimum_sources_pct must be set (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare.
+- `minimum_sources_pct` (Number) The minimum percentage of all assigned agents or monitors that must meet the specified criteria to trigger the alert. Exactly one of minimum_sources and minimum_sources_pct may be set; the generated fixtures carry minimum_sources.
+- `notify_on_clear` (Boolean) Send notification when alert clears. Observed: the API assigns true when this is omitted from an update. Omitting this field from an update resets it rather than preserving the stored value.
+- `rounds_violating_required` (Number) Specifies the numerator (x value) in the “X of Y times” condition. The API enforces this field's presence, which the specification does not declare.
+- `severity` (String) The severity of the alert. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Values accepted here: `info`, `major`, `minor`, `critical`. The specification documents `unknown`, which the API rejected.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `visited_sites_filter` (Set of String) A list of website domains visited during the session. This is applicable when `alertGroupType` is `browser-session`.
+
+### Read-Only
+
+- `id` (String) Unique ID of the rule. Named `id` because terraform-plugin-testing populates import state only from an attribute literally called id; the wire field stays ruleId.
+- `rounds_violating_mode` (String) `exact` requires the same agents to meet the threshold in consecutive rounds. `auto` is only enabled for CEA and Endpoint Scheduled test rules. The default is `any`.
+- `sensitivity_level` (String) Used when `roundsViolatingMode` is set to `auto`. The default is `medium`. Higher sensitivity increases the likelihood of triggering alerts.
+- `test_ids` (Set of String) Array of test IDs to link to alert rule (get `testId` from `/tests` endpoint).
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
diff --git a/pilot/thousandeyes/docs/resources/dashboards_filter.md b/pilot/thousandeyes/docs/resources/dashboards_filter.md
new file mode 100644
index 00000000..7f76b342
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/dashboards_filter.md
@@ -0,0 +1,89 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_dashboards_filter Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Get dashboard filter.
+---
+
+# thousandeyes_dashboards_filter (Resource)
+
+Get dashboard filter.
+
+## Example Usage
+
+```terraform
+resource "thousandeyes_dashboards_filter" "example" {
+ context = [{ data_source_id = "VIRTUAL_AGENT", filters = [{ filter_id = "TEST", metric_ids = [], values = ["281474976977085"] }] }]
+ name = "tfacc-name"
+}
+```
+
+
+## Schema
+
+### Required
+
+- `context` (Attributes Set) List of filters to be applied to a dashboard. The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--context))
+- `name` (String) The name of the dashboard filter, this must be unique.
+
+### Optional
+
+- `description` (String) An optional description of the filter. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `aid` (String) Account group ID of the filter.
+- `created_by` (Attributes) Details of user who created or modified the filter. (see [below for nested schema](#nestedatt--created_by))
+- `created_date` (String) Timestamp when the filter was created.
+- `id` (String) Unique ID of the dashboard filter.
+- `modified_by` (Attributes) Details of user who created or modified the filter. (see [below for nested schema](#nestedatt--modified_by))
+- `modified_date` (String) Timestamp when the filter was last modified.
+
+
+### Nested Schema for `context`
+
+Required:
+
+- `data_source_id` (String) Types of data source. Observed: the API assigns "VIRTUAL_AGENT" when this is omitted.
+- `filters` (Attributes Set) List of different filter properties. (see [below for nested schema](#nestedatt--context--filters))
+
+
+### Nested Schema for `context.filters`
+
+Required:
+
+- `filter_id` (String) Data source property to filter by. Observed: the API assigns "TEST" when this is omitted.
+- `metric_ids` (Set of String) Dashboard metric associated with the filter property.
+- `values` (Set of String) Values to filter by based on the specified `filterId`.
+
+
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+
+
+
+### Nested Schema for `created_by`
+
+Read-Only:
+
+- `name` (String) Name of the user.
+- `uid` (String) Unique ID of the user.
+
+
+
+### Nested Schema for `modified_by`
+
+Read-Only:
+
+- `name` (String) Name of the user.
+- `uid` (String) Unique ID of the user.
diff --git a/pilot/thousandeyes/docs/resources/role.md b/pilot/thousandeyes/docs/resources/role.md
new file mode 100644
index 00000000..4d5a8d32
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/role.md
@@ -0,0 +1,43 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_role Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Retrieve role.
+---
+
+# thousandeyes_role (Resource)
+
+Retrieve role.
+
+## Example Usage
+
+```terraform
+resource "thousandeyes_role" "example" {
+ name = "tfacc-name"
+}
+```
+
+
+## Schema
+
+### Optional
+
+- `name` (String) Name of the role. Required-by-API by curation: the sweeper's field, unprobeable by omission.
+- `permissions` (Set of String) List of permission ids to grant (permissionId values from the permissions API). The response echoes permissions as expanded objects, never this id list, so state carries the configured value. Effectively required: a permission-less role create answers 500 (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `id` (String) Unique ID representing the role. Named `id` per the import convention; the wire field stays roleId.
+- `is_builtin` (Boolean) Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
diff --git a/pilot/thousandeyes/docs/resources/tag.md b/pilot/thousandeyes/docs/resources/tag.md
index 3a026724..fcb4dbf1 100644
--- a/pilot/thousandeyes/docs/resources/tag.md
+++ b/pilot/thousandeyes/docs/resources/tag.md
@@ -68,18 +68,18 @@ resource "thousandeyes_tag" "maximal" {
### Required
- `key` (String) The tag's key. Together with `value` this forms the label applied to assigned objects.
-- `object_type` (String) The kind of object the tag may be assigned to. Documented values are `test`, `v-agent`, `endpoint-test`, `dashboard` and `connected-devices-test`. The generated validator permits the whole documented set, which is wider than what any one tenant accepts, so a stale specification surfaces as the API's own error rather than as a plan failure. Values accepted here: `test`, `dashboard`, `endpoint-test`, `v-agent`, `connected-devices-test`. The API enforces this field's presence, which the specification does not declare.
+- `object_type` (String) The kind of object the tag may be assigned to. Documented values are `test`, `v-agent`, `endpoint-test`, `dashboard` and `connected-devices-test`. The generated validator permits the whole documented set, which is wider than what any one tenant accepts, so a stale specification surfaces as the API's own error rather than as a plan failure. Values accepted here: `test`, `dashboard`, `endpoint-test`, `v-agent`, `connected-devices-test`. The API enforces this field's presence, which the specification does not declare. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Optional
-- `access_type` (String) The tag's access level. Documented values are `all`, `partner` and `system`. Values accepted here: `all`. The specification documents `system`, which the API rejected. The API enforces this field's presence, which the specification does not declare.
+- `access_type` (String) The tag's access level. Documented values are `all`, `partner` and `system`. Values accepted here: `all`. The specification documents `system`, which the API rejected. The API enforces this field's presence, which the specification does not declare. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `color` (String) The tag's display colour as a hex string. Computed as well as optional because the API assigns one when it is omitted; this has not yet been confirmed by probing. Observed: the API assigns "#A7EB10" when this is omitted.
- `description` (String) A human-readable description of the tag.
- `filters` (Attributes Set) Filters that dynamically assign this tag to endpoint agents. Conditionally, when objectType is "endpoint-agent" and type is "dynamic": a create omitting this field was refused with 400 and the error named the field, when objectType is "endpoint-agent" and type is "dynamic". Applied as a behaviour variant. Conditionally, when objectType is "endpoint-agent" and type is "dynamic": the field appeared in the read after 1 create(s), when objectType is "endpoint-agent" and type is "dynamic". Applied as a behaviour variant. (see [below for nested schema](#nestedatt--filters))
- `icon` (String) The tag's icon. Observed: the API assigns "LABEL" when this is omitted.
-- `match_type` (String) How the tag's filters combine when it is assigned dynamically. Values accepted here: `and`, `or`. Conditionally, when objectType is "endpoint-agent" and type is "dynamic": a create omitting this field was refused with 400 and the error named the field, when objectType is "endpoint-agent" and type is "dynamic". Applied as a behaviour variant. Conditionally, when objectType is "endpoint-agent": the field appeared in the read after 1 create(s), when objectType is "endpoint-agent". Applied as a behaviour variant. Conditionally, when objectType is "test": the field was sent on 1 create(s) and appeared in no read response, including every expansion the plan declares, when objectType is "test". Applied as a behaviour variant.
+- `match_type` (String) How the tag's filters combine when it is assigned dynamically. Values accepted here: `and`, `or`. Conditionally, when objectType is "endpoint-agent" and type is "dynamic": a create omitting this field was refused with 400 and the error named the field, when objectType is "endpoint-agent" and type is "dynamic". Applied as a behaviour variant. Conditionally, when objectType is "endpoint-agent": the field appeared in the read after 1 create(s), when objectType is "endpoint-agent". Applied as a behaviour variant. Conditionally, when objectType is "test": the field was sent on 1 create(s) and appeared in no read response, including every expansion the plan declares, when objectType is "test". Applied as a behaviour variant. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `type` (String) The tag's type, assigned by the API. Conditionally, when objectType is "endpoint-agent": a create omitting this field was refused with 400 and the error named the field, when objectType is "endpoint-agent". Applied as a behaviour variant.
+- `type` (String) The tag's type, assigned by the API. Conditionally, when objectType is "endpoint-agent": a create omitting this field was refused with 400 and the error named the field, when objectType is "endpoint-agent". Applied as a behaviour variant. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `value` (String) The tag's value. The API enforces this field's presence, which the specification does not declare.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_agent_to_agent.md b/pilot/thousandeyes/docs/resources/tests_agent_to_agent.md
index 5ff32e83..9f6f6276 100644
--- a/pilot/thousandeyes/docs/resources/tests_agent_to_agent.md
+++ b/pilot/thousandeyes/docs/resources/tests_agent_to_agent.md
@@ -30,25 +30,25 @@ resource "thousandeyes_tests_agent_to_agent" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `description` (String) A description of the test.
-- `direction` (String) Direction of the test, which affects how results are shown.
-- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests)
-- `enabled` (Boolean) Test is enabled.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
+- `direction` (String) Direction of the test, which affects how results are shown. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests) The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run).
- `mss` (Number) Maximum segment size, in bytes.
-- `num_path_traces` (Number) Number of path traces executed by the agent.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session.
-- `port` (Number) Target port.
-- `protocol` (String)
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round.
+- `num_path_traces` (Number) Number of path traces executed by the agent. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `port` (Number) Target port. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique.
- `throughput_duration` (Number) The throughput duration.
- `throughput_measurements` (Boolean) Enable or disable throughput measurements. Throughput measurements cannot be enabled when the source or target of the test is a cloud agent.
- `throughput_rate` (Number) The throughput rate, only applicable for UDP protocol.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_agent_to_server.md b/pilot/thousandeyes/docs/resources/tests_agent_to_server.md
index 8c713d3e..d147366b 100644
--- a/pilot/thousandeyes/docs/resources/tests_agent_to_server.md
+++ b/pilot/thousandeyes/docs/resources/tests_agent_to_server.md
@@ -28,28 +28,28 @@ resource "thousandeyes_tests_agent_to_server" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `continuous_mode` (Boolean) To enable continuous monitoring, set this parameter to `true` to. When continuous monitoring is enabled, the following actions occur: * `fixedPacketRate` is enforced * `bandwidthMeasurements` are disabled * If the `protocol` is set to `tcp`, `probeMode` is set to `syn`. Observed: the API assigns false when this is omitted.
- `description` (String) A description of the test.
-- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests) Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
+- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests) Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `fixed_packet_rate` (Number) If continuousMode is `false`, set the fixedPacketRate to a value between 10-100. If `continuousMode` is `true`, set the `fixedPacketRate` to `1`
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
+- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `network_measurements` (Boolean) View packet loss in 1-second intervals. This is only available for 1-minute interval tests. Set to `true` to enable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `ping_payload_size` (Number) Payload size (not total packet size) for the end-to-end metric's probes, ping payload size allows values from 0 to 1400 bytes. When set to null, payload sizes are 0 bytes for ICMP-based tests and 1 byte for TCP-based tests.
- `port` (Number) Port number to use for the test. The default port is 80.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `server` (String) The target name or IP address. If a port is set for the test, it is appended to the target name or IP address using a colon. The test's target: the API refuses a create without it, whatever the specification marks. The API enforces this field's presence, which the specification does not declare. The API normalises this value (appends the port, www.example.com becomes www.example.com:80; the 2026-08-03 acceptance run (#13)); state carries the configured form.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_api.md b/pilot/thousandeyes/docs/resources/tests_api.md
index d7e8980c..57b76797 100644
--- a/pilot/thousandeyes/docs/resources/tests_api.md
+++ b/pilot/thousandeyes/docs/resources/tests_api.md
@@ -25,39 +25,39 @@ resource "thousandeyes_tests_api" "example" {
### Required
-- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--agents))
+- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value. (see [below for nested schema](#nestedatt--agents))
- `requests` (Attributes Set) The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--requests))
- `url` (String) Target for the test. The test's target: the API refuses a create without it, whatever the specification marks. The API enforces this field's presence, which the specification does not declare.
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `client_cert_domains_allow_list` (String) Comma separated list of domains to send the client certificate.
-- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate.
-- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Observed: the API assigns false when this is omitted.
+- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `credentials` (Set of String) Contains a list of credential IDs (get `credentialId` from `/credentials` endpoint).
- `description` (String) A description of the test.
-- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
-- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted from an update. Omitting this field from an update resets it rather than preserving the stored value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted.
-- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted.
-- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Conditionally, when networkMeasurements is "false": round-trips alone, and is stored as null the moment "networkMeasurements" rides along; isolated by bisecting the maximal body's delta. Not applied to the schema, because this holds only under that condition and the schema has no way to say so. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `predefined_variables` (Attributes Set) (see [below for nested schema](#nestedatt--predefined_variables))
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
-- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
- `target_time` (Number) Target time for completion metric, defaults to 50% of time limit specified in seconds. (0 means default behavior) Observed: the API assigns 6 when this is omitted.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `time_limit` (Number) Time limit for transaction in seconds. Exceeding this limit will result in a Timeout error. Observed: the API assigns 10 when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `vault_credentials` (Attributes Set) List of credential IDs that are stored in an external vault. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. (see [below for nested schema](#nestedatt--vault_credentials))
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_bgp.md b/pilot/thousandeyes/docs/resources/tests_bgp.md
index d79bfb40..7a3e515f 100644
--- a/pilot/thousandeyes/docs/resources/tests_bgp.md
+++ b/pilot/thousandeyes/docs/resources/tests_bgp.md
@@ -29,11 +29,11 @@ resource "thousandeyes_tests_bgp" "example" {
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
- `description` (String) A description of the test.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `include_covered_prefixes` (Boolean) Indicate if queries for subprefixes detected under this prefix should included. Observed: the API assigns false when this is omitted.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_dns_server.md b/pilot/thousandeyes/docs/resources/tests_dns_server.md
index 4d74929e..044253f1 100644
--- a/pilot/thousandeyes/docs/resources/tests_dns_server.md
+++ b/pilot/thousandeyes/docs/resources/tests_dns_server.md
@@ -32,26 +32,25 @@ resource "thousandeyes_tests_dns_server" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted. SDK limitation: the wire field is a value-typed bool with omitempty, so an explicit `false` cannot be sent; with `network_measurements = true` the API then treats bandwidth measurement as requested, which cloud agents refuse. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `description` (String) A description of the test.
-- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `dns_transport_protocol` (String) Transport protocol used for DNS requests. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
+- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dns_transport_protocol` (String) Transport protocol used for DNS requests. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 1 when this is omitted.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
+- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 1 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `recursive_queries` (Boolean) Set true to run query with RD (recursion desired) flag enabled. Observed: the API assigns false when this is omitted.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
@@ -61,6 +60,7 @@ resource "thousandeyes_tests_dns_server" "example" {
- `live_share` (Boolean) Indicates if the test is shared with the account group.
- `modified_by` (String) User that modified the test.
- `modified_date` (String) UTC last modification date (ISO date-time format).
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Computed only on this endpoint: the SDK's value-typed omitempty bool cannot send false, and an update carrying true without an explicit bandwidthMeasurements false is refused for cloud agents (live rehearsal + acceptance, 2026-08-03) -- no configurable value is expressible in both directions.
- `saved_event` (Boolean) Indicates if the test is a saved event. **Note**: **Saved Events** are now called **Private Snapshots** in the user interface. This change does not affect API.
- `type` (String) This is a read only value, as test type is implicit in the test creation url.
diff --git a/pilot/thousandeyes/docs/resources/tests_dns_trace.md b/pilot/thousandeyes/docs/resources/tests_dns_trace.md
index ea47bbe6..c41c7619 100644
--- a/pilot/thousandeyes/docs/resources/tests_dns_trace.md
+++ b/pilot/thousandeyes/docs/resources/tests_dns_trace.md
@@ -31,11 +31,11 @@ resource "thousandeyes_tests_dns_trace" "example" {
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
- `description` (String) A description of the test.
-- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `dns_transport_protocol` (String) Transport protocol used for DNS requests. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
+- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dns_transport_protocol` (String) Transport protocol used for DNS requests. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
diff --git a/pilot/thousandeyes/docs/resources/tests_dnssec.md b/pilot/thousandeyes/docs/resources/tests_dnssec.md
index c510ba83..533d9637 100644
--- a/pilot/thousandeyes/docs/resources/tests_dnssec.md
+++ b/pilot/thousandeyes/docs/resources/tests_dnssec.md
@@ -31,10 +31,10 @@ resource "thousandeyes_tests_dnssec" "example" {
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
- `description` (String) A description of the test.
-- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
+- `dns_query_class` (String) Domain class used by this test. 'in' stands for Internet, while 'ch' stands for Chaos. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
diff --git a/pilot/thousandeyes/docs/resources/tests_ftp_server.md b/pilot/thousandeyes/docs/resources/tests_ftp_server.md
index 426e718c..3a9c41aa 100644
--- a/pilot/thousandeyes/docs/resources/tests_ftp_server.md
+++ b/pilot/thousandeyes/docs/resources/tests_ftp_server.md
@@ -26,7 +26,7 @@ resource "thousandeyes_tests_ftp_server" "example" {
### Required
-- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--agents))
+- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value. (see [below for nested schema](#nestedatt--agents))
- `request_type` (String) Set the type of activity for the test. Values accepted here: `download`, `list`. The API enforces this field's presence, which the specification does not declare.
- `url` (String) Target for the test. The test's target: the API refuses a create without it, whatever the specification marks. The API enforces this field's presence, which the specification does not declare. The API normalises this value (appends a trailing slash; the 2026-08-03 acceptance run (#13)); state carries the configured form.
- `username` (String) Username for Basic/NTLM authentication. The API enforces this field's presence, which the specification does not declare.
@@ -34,29 +34,28 @@ resource "thousandeyes_tests_ftp_server" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
-- `description` (String) A description of the test.
-- `download_limit` (Number) Specify maximum number of bytes to download from the target object.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `description` (String) A description of the test. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `download_limit` (Number) Specify maximum number of bytes to download from the target object. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
- `ftp_target_time` (Number) Target time for operation completion; specified in milliseconds. Observed: the API assigns 1000 when this is omitted.
- `ftp_time_limit` (Number) Set the time limit for the test in seconds. Observed: the API assigns 5 when this is omitted.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted.
-- `password` (String, Sensitive) Password for Basic/NTLM authentication. The API enforces this field's presence, which the specification does not declare. Write-only: the API never returns it (the 2026-08-03 acceptance run (#13)); state carries the configured value.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
+- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `password` (String, Sensitive) Password for Basic/NTLM authentication. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value. Write-only: the API never returns it (the 2026-08-03 acceptance run (#13)); state carries the configured value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `use_active_ftp` (Boolean) Explicitly set the flag to use active FTP. Observed: the API assigns false when this is omitted.
- `use_explicit_ftps` (Boolean) Use explicit FTPS (ftp over SSL). By default, tests will autodetect when it is appropriate to use FTPS. Observed: the API assigns false when this is omitted.
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
@@ -66,6 +65,7 @@ resource "thousandeyes_tests_ftp_server" "example" {
- `live_share` (Boolean) Indicates if the test is shared with the account group.
- `modified_by` (String) User that modified the test.
- `modified_date` (String) UTC last modification date (ISO date-time format).
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Computed only on this endpoint: the SDK's value-typed omitempty bool cannot send false, and an update carrying true without an explicit bandwidthMeasurements false is refused for cloud agents (live rehearsal + acceptance, 2026-08-03) -- no configurable value is expressible in both directions.
- `saved_event` (Boolean) Indicates if the test is a saved event. **Note**: **Saved Events** are now called **Private Snapshots** in the user interface. This change does not affect API.
- `type` (String) This is a read only value, as test type is implicit in the test creation url.
diff --git a/pilot/thousandeyes/docs/resources/tests_http_server.md b/pilot/thousandeyes/docs/resources/tests_http_server.md
index aaaccb4b..fd4335d1 100644
--- a/pilot/thousandeyes/docs/resources/tests_http_server.md
+++ b/pilot/thousandeyes/docs/resources/tests_http_server.md
@@ -23,55 +23,54 @@ resource "thousandeyes_tests_http_server" "example" {
### Required
-- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--agents))
+- `agents` (Attributes Set) The agents the test runs from. Sent on create and update; the read reports assignment through its own fields, so this does not round-trip into state. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value. (see [below for nested schema](#nestedatt--agents))
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Observed: the API assigns true when this is omitted.
-- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
-- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate.
-- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Observed: the API assigns false when this is omitted.
+- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `content_regex` (String) Content regex, this field does not require escaping. Observed: the API assigns "" when this is omitted.
-- `description` (String) A description of the test.
-- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code.
-- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted.
-- `dns_override` (String) IP address to use for DNS override.
-- `download_limit` (Number) Specifies maximum number of bytes to download from the target object.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
-- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Observed: the API assigns true when this is omitted.
-- `headers` (Set of String) HTTP request headers used.
-- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Observed: the API assigns 1000 when this is omitted.
-- `http_time_limit` (Number) HTTP time limit in seconds. Observed: the API assigns 5 when this is omitted.
-- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Observed: the API assigns 2 when this is omitted.
-- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `description` (String) A description of the test. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dns_override` (String) IP address to use for DNS override. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `download_limit` (Number) Specifies maximum number of bytes to download from the target object. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `headers` (Set of String) HTTP request headers used. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Observed: the API assigns 1000 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_time_limit` (Number) HTTP time limit in seconds. Observed: the API assigns 5 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Observed: the API assigns 2 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted.
-- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted.
-- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden.
-- `password` (String) Password for Basic/NTLM authentication.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `post_body` (String) Enter the body for the HTTP POST request in this field. No special escaping is required. If content is provided and `requestMethod` is not specified, `requestMethod` is automatically set to `post`.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
-- `request_method` (String) HTTP request method. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `password` (String) Password for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `post_body` (String) Enter the body for the HTTP POST request in this field. No special escaping is required. If content is provided and `requestMethod` is not specified, `requestMethod` is automatically set to `post`. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `request_method` (String) HTTP request method. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `url` (String) Target for the test. The test's target: the API refuses a create without it, whatever the specification marks. The API enforces this field's presence, which the specification does not declare.
-- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Observed: the API assigns false when this is omitted.
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
-- `user_agent` (String) User-agent string to be provided during the test.
-- `username` (String) Username for Basic/NTLM authentication.
+- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `user_agent` (String) User-agent string to be provided during the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Neither the update response nor a read returns this field: it is write-only in practice, and state carries the configured value.
+- `username` (String) Username for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `vault_credentials` (Attributes Set) List of credential IDs that are stored in an external vault. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. (see [below for nested schema](#nestedatt--vault_credentials))
-- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Observed: the API assigns true when this is omitted.
+- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
@@ -81,6 +80,7 @@ resource "thousandeyes_tests_http_server" "example" {
- `live_share` (Boolean) Indicates if the test is shared with the account group.
- `modified_by` (String) User that modified the test.
- `modified_date` (String) UTC last modification date (ISO date-time format).
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission. Computed only on this endpoint: the SDK's value-typed omitempty bool cannot send false, and an update carrying true without an explicit bandwidthMeasurements false is refused for cloud agents (live rehearsal + acceptance, 2026-08-03) -- no configurable value is expressible in both directions.
- `saved_event` (Boolean) Indicates if the test is a saved event. **Note**: **Saved Events** are now called **Private Snapshots** in the user interface. This change does not affect API.
- `ssl_version` (String) Reflects the verbose SSL protocol version used by a test.
- `type` (String) This is a read only value, as test type is implicit in the test creation url.
diff --git a/pilot/thousandeyes/docs/resources/tests_page_load.md b/pilot/thousandeyes/docs/resources/tests_page_load.md
index ad76df7f..31d01548 100644
--- a/pilot/thousandeyes/docs/resources/tests_page_load.md
+++ b/pilot/thousandeyes/docs/resources/tests_page_load.md
@@ -28,60 +28,58 @@ resource "thousandeyes_tests_page_load" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Observed: the API assigns true when this is omitted.
-- `allow_geolocation` (Boolean) Set true to use the agent’s geolocation by the web page. Observed: the API assigns false when this is omitted.
-- `allow_mic_and_camera` (Boolean) Set true allow the use of a fake mic and camera in the browser. Observed: the API assigns false when this is omitted.
-- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Observed: the API assigns true when this is omitted.
-- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted.
-- `block_domains` (String) Domains or full object URLs to be excluded from metrics and waterfall data for transaction tests. Observed: the API assigns "" when this is omitted.
-- `browser_language` (String) Set one of the available browser language that you want to use to configure the browser. Observed: the API assigns "en-US" when this is omitted.
-- `chrome_options` (String) Command-line options passed to Chrome when running the test.
-- `chrome_policies` (String) JSON string of Chrome policy settings to apply.
-- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate.
-- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `allow_geolocation` (Boolean) Set true to use the agent’s geolocation by the web page. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `allow_mic_and_camera` (Boolean) Set true allow the use of a fake mic and camera in the browser. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `block_domains` (String) Domains or full object URLs to be excluded from metrics and waterfall data for transaction tests. Observed: the API assigns "" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `browser_language` (String) Set one of the available browser language that you want to use to configure the browser. Observed: the API assigns "en-US" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `chrome_options` (String) Command-line options passed to Chrome when running the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `content_regex` (String) Content regex, this field does not require escaping. Observed: the API assigns "" when this is omitted.
- `description` (String) A description of the test.
-- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code.
-- `disable_screenshot` (Boolean) Enables or disables screenshots on error. Set true to not capture Observed: the API assigns false when this is omitted.
-- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted.
-- `dns_override` (String) IP address to use for DNS override.
-- `download_limit` (Number) Specifies maximum number of bytes to download from the target object.
+- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `disable_screenshot` (Boolean) Enables or disables screenshots on error. Set true to not capture Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dns_override` (String) IP address to use for DNS override. Write-only on this endpoint: the read never reports it (local acceptance run, 2026-08-03); state carries the configured value.
+- `download_limit` (Number) Specifies maximum number of bytes to download from the target object. This endpoint never reports the value back (local acceptance run, 2026-08-03); state carries the configured value.
- `emulated_device_id` (String) ID of the emulated device, if one was given when the test was created. Observed: the API assigns "281474976710656" when this is omitted.
-- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
-- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Observed: the API assigns true when this is omitted.
-- `http_interval` (Number) HTTP test run interval. The interval between HTTP test runs in seconds cannot exceed the specified interval value and defaults to the same value as the interval if not set. Documented values: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Observed: the API assigns 1000 when this is omitted.
-- `http_time_limit` (Number) HTTP time limit in seconds. Observed: the API assigns 5 when this is omitted.
-- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Observed: the API assigns 2 when this is omitted.
-- `identify_agent_traffic_with_user_agent` (Boolean) Determines how agent traffic is identified: * `false`: Adds the `x-thousandeyes-agent: yes` header. * `true`: Appends `(ThousandEyes Agent)` to the `user-agent` header. For more information, see [Notes on Agent ID Strategy](https://docs.thousandeyes.com/product-documentation/browser-synthetics/test-settings-page-load-transaction#notes-on-agent-id-strategy). Observed: the API assigns false when this is omitted.
-- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Observed: the API assigns true when this is omitted.
+- `enabled` (Boolean) Test is enabled. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_interval` (Number) HTTP test run interval. The interval between HTTP test runs in seconds cannot exceed the specified interval value and defaults to the same value as the interval if not set. Documented values: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Observed: the API assigns 1000 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_time_limit` (Number) HTTP time limit in seconds. Observed: the API assigns 5 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Observed: the API assigns 2 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `identify_agent_traffic_with_user_agent` (Boolean) Determines how agent traffic is identified: * `false`: Adds the `x-thousandeyes-agent: yes` header. * `true`: Appends `(ThousandEyes Agent)` to the `user-agent` header. For more information, see [Notes on Agent ID Strategy](https://docs.thousandeyes.com/product-documentation/browser-synthetics/test-settings-page-load-transaction#notes-on-agent-id-strategy). Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run). The API enforces this field's presence, which the specification does not declare.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted.
-- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted.
-- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Observed: the API assigns 3 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `page_load_target_time` (Number) Target time for page load completion, specified in seconds and cannot exceed the `pageLoadTimeLimit`. Observed: the API assigns 6 when this is omitted.
-- `page_load_time_limit` (Number) Page load time limit. Must be larger than the `httpTimeLimit`. Observed: the API assigns 10 when this is omitted.
-- `page_loading_strategy` (String) * `normal`: The test waits until the entire page is fully loaded, including the downloading and parsing of HTML content as well as all associated resources, before advancing to the next action in the transaction test script. * `eager`: The test waits for the DOMContentLoaded event, indicating that HTML content is downloaded and parsed, and the document reaches the "interactive" readiness state, before proceeding to the next action in the test script. * `none`: The test only waits for the download of HTML content. Once the HTML is downloaded, the test continues to the next action in the transaction test script without waiting for additional resources. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `password` (String) Password for Basic/NTLM authentication.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted.
-- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `subinterval` (Number) Subinterval for round-robin testing (in seconds). Must be less than or equal to interval and must evenly divide interval. Documented values: `60`, `120`, `300`, `600`, `900`, `1200`, `1800`, `3600`.
+- `page_load_time_limit` (Number) Page load time limit. Must be larger than the `httpTimeLimit`. Observed: the API assigns 10 when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `page_loading_strategy` (String) * `normal`: The test waits until the entire page is fully loaded, including the downloading and parsing of HTML content as well as all associated resources, before advancing to the next action in the transaction test script. * `eager`: The test waits for the DOMContentLoaded event, indicating that HTML content is downloaded and parsed, and the document reaches the "interactive" readiness state, before proceeding to the next action in the test script. * `none`: The test only waits for the download of HTML content. Once the HTML is downloaded, the test continues to the next action in the transaction test script without waiting for additional resources. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `password` (String) Password for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). Values accepted here: `tcp`, `icmp`. The specification documents `udp`, which the API rejected. Observed: the API assigns "tcp" when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `subinterval` (Number) Subinterval for round-robin testing (in seconds). Must be less than or equal to interval and must evenly divide interval. Documented values: `60`, `120`, `300`, `600`, `900`, `1200`, `1800`, `3600`. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `url` (String) Target for the test. The test's target: the API refuses a create without it, whatever the specification marks. The API enforces this field's presence, which the specification does not declare.
-- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Observed: the API assigns false when this is omitted.
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted.
-- `user_agent` (String) User-agent string to be provided during the test.
-- `username` (String) Username for Basic/NTLM authentication.
+- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Observed: the API assigns false when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `user_agent` (String) User-agent string to be provided during the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `username` (String) Username for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `vault_credentials` (Attributes Set) List of credential IDs that are stored in an external vault. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. (see [below for nested schema](#nestedatt--vault_credentials))
-- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Observed: the API assigns true when this is omitted.
+- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Observed: the API assigns true when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
@@ -91,6 +89,7 @@ resource "thousandeyes_tests_page_load" "example" {
- `live_share` (Boolean) Indicates if the test is shared with the account group.
- `modified_by` (String) User that modified the test.
- `modified_date` (String) UTC last modification date (ISO date-time format).
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Observed: the API assigns true when this is omitted. Computed only on this endpoint: browser tests always network-measure, and the SDK's value-typed omitempty bool cannot express false anyway (local acceptance run, 2026-08-03).
- `saved_event` (Boolean) Indicates if the test is a saved event. **Note**: **Saved Events** are now called **Private Snapshots** in the user interface. This change does not affect API.
- `ssl_version` (String) Reflects the verbose SSL protocol version used by a test.
- `type` (String) This is a read only value, as test type is implicit in the test creation url.
diff --git a/pilot/thousandeyes/docs/resources/tests_sip_server.md b/pilot/thousandeyes/docs/resources/tests_sip_server.md
index b0b550cc..08805586 100644
--- a/pilot/thousandeyes/docs/resources/tests_sip_server.md
+++ b/pilot/thousandeyes/docs/resources/tests_sip_server.md
@@ -28,25 +28,25 @@ resource "thousandeyes_tests_sip_server" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `description` (String) A description of the test.
-- `enabled` (Boolean) Test is enabled.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
+- `enabled` (Boolean) Test is enabled. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run).
-- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level.
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements.
-- `num_path_traces` (Number) Number of path traces executed by the agent.
+- `ipv6_policy` (String) IP version policy. Overrides the IPv6 policy configured at the agent level. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `options_regex` (String) Options regex, this field does not require escaping.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `register_enabled` (Boolean) Set to true to perform SIP registration on the test target with the SIP REGISTER command.
- `sip_target_time` (Number) Target time for test completion in milliseconds.
- `sip_time_limit` (Number) Time limit in milliseconds.
- `test_name` (String) The name of the test. Test name must be unique.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_voice.md b/pilot/thousandeyes/docs/resources/tests_voice.md
index 3d37c4ba..e25a6738 100644
--- a/pilot/thousandeyes/docs/resources/tests_voice.md
+++ b/pilot/thousandeyes/docs/resources/tests_voice.md
@@ -30,20 +30,20 @@ resource "thousandeyes_tests_voice" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `codec_id` (String) Codec identifier for the RTP stream. Valid values: * `0`: G.711 @ 64 Kbps * `1`: G.722.1 @ 24 Kbps (WB) * `2`: G.722.1 @ 32 Kbps (WB) * `3`: G.726 @ 32 Kbps * `4`: G.723.1 @ 6.4 Kbps * `5`: G.729a @ 8 Kbps * `6`: RTAudio @ 45 Kbps (WB) * `7`: RTAudio @ 27.8 Kbps * `8`: SILK @ 36 Kbps (WB) * `9`: G.722 @ 64 Kbps (WB)
- `description` (String) A description of the test.
-- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests)
+- `dscp_id` (String) DSCP ID [to see list for acceptable values](https://docs.thousandeyes.com/product-documentation/tests/dscp-options-in-network-tests) The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `duration` (Number) Duration of the test in seconds.
-- `enabled` (Boolean) Test is enabled.
+- `enabled` (Boolean) Test is enabled. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run).
- `jitter_buffer` (Number) De-jitter buffer size in seconds.
-- `num_path_traces` (Number) Number of path traces executed by the agent.
+- `num_path_traces` (Number) Number of path traces executed by the agent. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `port` (Number) Port number for the chosen protocol.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `test_name` (String) The name of the test. Test name must be unique.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
diff --git a/pilot/thousandeyes/docs/resources/tests_web_transaction.md b/pilot/thousandeyes/docs/resources/tests_web_transaction.md
index 99e00f1f..32d7b916 100644
--- a/pilot/thousandeyes/docs/resources/tests_web_transaction.md
+++ b/pilot/thousandeyes/docs/resources/tests_web_transaction.md
@@ -30,60 +30,58 @@ resource "thousandeyes_tests_web_transaction" "example" {
### Optional
- `alerts_enabled` (Boolean) Indicates if alerts are enabled. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `allow_geolocation` (Boolean) Set true to use the agent’s geolocation by the web page. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `allow_mic_and_camera` (Boolean) Set true allow the use of a fake mic and camera in the browser. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `block_domains` (String) Domains or full object URLs to be excluded from metrics and waterfall data for transaction tests.
-- `browser_language` (String) Set one of the available browser language that you want to use to configure the browser. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `chrome_options` (String) Command-line options passed to Chrome when running the test.
-- `chrome_policies` (String) JSON string of Chrome policy settings to apply.
-- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate.
-- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `allow_geolocation` (Boolean) Set true to use the agent’s geolocation by the web page. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `allow_mic_and_camera` (Boolean) Set true allow the use of a fake mic and camera in the browser. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `allow_unsafe_legacy_renegotiation` (Boolean) Allows TLS renegotiation with servers not supporting RFC 5746. Default Set to true to allow unsafe legacy renegotiation. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `auth_type` (String) HTTP authentication type. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bandwidth_measurements` (Boolean) Set to `true` to enable bandwidth measurements, only applies to Enterprise agents assigned to the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `bgp_measurements` (Boolean) Set to `true` to enable bgp measurements. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `block_domains` (String) Domains or full object URLs to be excluded from metrics and waterfall data for transaction tests. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `browser_language` (String) Set one of the available browser language that you want to use to configure the browser. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `chrome_options` (String) Command-line options passed to Chrome when running the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `client_certificate` (String) String representation (containing newline characters) of client certificate, the private key must be placed first, then the certificate. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `collect_proxy_network_data` (Boolean) Indicates whether network data to the proxy should be collected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `content_regex` (String) Content regex, this field does not require escaping. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `credentials` (Set of String) Contains a list of credential IDs (get `credentialId` from `/credentials` endpoint).
- `description` (String) A description of the test.
-- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code.
-- `disable_screenshot` (Boolean) Enables or disables screenshots on error. Set true to not capture Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `dns_override` (String) IP address to use for DNS override.
-- `download_limit` (Number) Specifies maximum number of bytes to download from the target object.
+- `desired_status_code` (String) Specify the HTTP status code value that indicates a successful response. The default value accepts any 2xx or 3xx status code. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `disable_screenshot` (Boolean) Enables or disables screenshots on error. Set true to not capture Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `distributed_tracing` (Boolean) Adds distributed tracing headers to API requests using B3 and W3C standards. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `dns_override` (String) IP address to use for DNS override. This endpoint never reports the value back (local acceptance run, 2026-08-03); state carries the configured value.
+- `download_limit` (Number) Specifies maximum number of bytes to download from the target object. This endpoint never reports the value back (local acceptance run, 2026-08-03); state carries the configured value.
- `emulated_device_id` (String) ID of the emulated device, if specified when the test was created. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `enabled` (Boolean) Test is enabled. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second.
-- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `http_time_limit` (Number) HTTP time limit in seconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `identify_agent_traffic_with_user_agent` (Boolean) Determines how agent traffic is identified: * `false`: Adds the `x-thousandeyes-agent: yes` header. * `true`: Appends `(ThousandEyes Agent)` to the `user-agent` header. For more information, see [Notes on Agent ID Strategy](https://docs.thousandeyes.com/product-documentation/browser-synthetics/test-settings-page-load-transaction#notes-on-agent-id-strategy). Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `enabled` (Boolean) Test is enabled. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `fixed_packet_rate` (Number) Sets packets rate sent to measure the network in packets per second. This endpoint never reports the value back (local acceptance run, 2026-08-03); state carries the configured value. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `follow_redirects` (Boolean) To disable following HTTP/301 or HTTP/302 redirect directives, set this parameter to `false`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_target_time` (Number) Target time for HTTP server completion, specified in milliseconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_time_limit` (Number) HTTP time limit in seconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `http_version` (Number) HTTP protocol version. Set to '2' to prefer HTTP/2, or '1' to use only HTTP/1.1. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `identify_agent_traffic_with_user_agent` (Boolean) Determines how agent traffic is identified: * `false`: Adds the `x-thousandeyes-agent: yes` header. * `true`: Appends `(ThousandEyes Agent)` to the `user-agent` header. For more information, see [Notes on Agent ID Strategy](https://docs.thousandeyes.com/product-documentation/browser-synthetics/test-settings-page-load-transaction#notes-on-agent-id-strategy). Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `include_headers` (Boolean) Set to `true` to capture response headers for objects loaded by the test. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `interval` (Number) Interval between test runs in seconds. Documented intervals, in seconds: `60`, `120`, `300`, `600`, `900`, `1800`, `3600`. The request carries this field unconditionally, so omitting it sends zero, which the API refuses (the 2026-08-03 scheduled acceptance run).
-- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `num_path_traces` (Number) Number of path traces executed by the agent. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden.
-- `page_loading_strategy` (String) * `normal`: The test waits until the entire page is fully loaded, including the downloading and parsing of HTML content as well as all associated resources, before advancing to the next action in the transaction test script. * `eager`: The test waits for the DOMContentLoaded event, indicating that HTML content is downloaded and parsed, and the document reaches the "interactive" readiness state, before proceeding to the next action in the test script. * `none`: The test only waits for the download of HTML content. Once the HTML is downloaded, the test continues to the next action in the transaction test script without waiting for additional resources. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `password` (String) Password for Basic/NTLM authentication.
-- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). The specification documents `udp`, which the API rejected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `subinterval` (Number) Subinterval for round-robin testing (in seconds). Must be less than or equal to interval and must evenly divide interval. Documented values: `60`, `120`, `300`, `600`, `900`, `1200`, `1800`, `3600`.
+- `mtu_measurements` (Boolean) Set `true` to measure MTU sizes on network from agents to the target. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `num_path_traces` (Number) Number of path traces executed by the agent. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_agent_proxy` (Boolean) Flag indicating if a proxy other than the default should be used. To override the default proxy for agents, set to `true` and specify a value for `overrideProxyId`. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `override_proxy_id` (String) ID of the proxy to be used if the default proxy is overridden. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `page_loading_strategy` (String) * `normal`: The test waits until the entire page is fully loaded, including the downloading and parsing of HTML content as well as all associated resources, before advancing to the next action in the transaction test script. * `eager`: The test waits for the DOMContentLoaded event, indicating that HTML content is downloaded and parsed, and the document reaches the "interactive" readiness state, before proceeding to the next action in the test script. * `none`: The test only waits for the download of HTML content. Once the HTML is downloaded, the test continues to the next action in the transaction test script without waiting for additional resources. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `password` (String) Password for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `path_trace_mode` (String) Select `inSession` to perform the path trace within a TCP session. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `probe_mode` (String) Probe mode used by network test, only valid when the protocol is set to TCP. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `protocol` (String) Protocol used by dependent network tests (end-to-end, path trace, PMTUD). The specification documents `udp`, which the API rejected. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `randomized_start_time` (Boolean) Indicates whether agents should randomize the start time in each test round. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `ssl_version_id` (String) SSL version options: * Use '0' for automatic selection. * Use '3' for SSLv3. * Use '4' for TLS v1.0. * Use '5' for TLS v1.1. * Use '6' for TLS v1.2. * Use '7' for TLS v1.3. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `subinterval` (Number) Subinterval for round-robin testing (in seconds). Must be less than or equal to interval and must evenly divide interval. Documented values: `60`, `120`, `300`, `600`, `900`, `1200`, `1800`, `3600`. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `target_time` (Number) Target completion time, in seconds. Defaults to 10. Cannot exceed the `timeLimit` value. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
- `test_name` (String) The name of the test. Test name must be unique. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `time_limit` (Number) Time limit for transaction in seconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `time_limit` (Number) Time limit for transaction in seconds. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `url` (String) Target for the test. The test's target: the API refuses a create without it, whatever the specification marks.
-- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
-- `user_agent` (String) User-agent string to be provided during the test.
-- `username` (String) Username for Basic/NTLM authentication.
+- `use_ntlm` (Boolean) Set to true to use NTLM, false to use Basic Authentication. Requires username and password to be set. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `use_public_bgp` (Boolean) Indicate if all available public BGP monitors should be used, when omitted defaults to `bgpMeasurements` value. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `user_agent` (String) User-agent string to be provided during the test. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
+- `username` (String) Username for Basic/NTLM authentication. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
- `vault_credentials` (Attributes Set) List of credential IDs that are stored in an external vault. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. (see [below for nested schema](#nestedatt--vault_credentials))
-- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted.
+- `verify_certificate` (Boolean) Ignore or acknowledge certificate errors. Set to false to ignore certificate errors. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. The SDK's encoding drops this type's zero value (omitempty), so configuring false, 0 or "" silently becomes an omission.
### Read-Only
@@ -93,6 +91,7 @@ resource "thousandeyes_tests_web_transaction" "example" {
- `live_share` (Boolean) Indicates if the test is shared with the account group.
- `modified_by` (String) User that modified the test.
- `modified_date` (String) UTC last modification date (ISO date-time format).
+- `network_measurements` (Boolean) Enable or disable network measurements. Set to true to enable or false to disable network measurements. Computed as well as optional: the 2026-08-03 dispatched acceptance run (#12) observed the API applying its own value when this is omitted. Computed only on this endpoint: browser tests always network-measure, and the SDK's value-typed omitempty bool cannot express false anyway (local acceptance run, 2026-08-03).
- `saved_event` (Boolean) Indicates if the test is a saved event. **Note**: **Saved Events** are now called **Private Snapshots** in the user interface. This change does not affect API.
- `ssl_version` (String) Reflects the verbose SSL protocol version used by a test.
- `type` (String) This is a read only value, as test type is implicit in the test creation url.
diff --git a/pilot/thousandeyes/docs/resources/user.md b/pilot/thousandeyes/docs/resources/user.md
new file mode 100644
index 00000000..fa1dff71
--- /dev/null
+++ b/pilot/thousandeyes/docs/resources/user.md
@@ -0,0 +1,59 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "thousandeyes_user Resource - ThousandEyes"
+subcategory: ""
+description: |-
+ Retrieve user.
+---
+
+# thousandeyes_user (Resource)
+
+Retrieve user.
+
+## Example Usage
+
+```terraform
+resource "thousandeyes_user" "example" {
+ email = "dafydd.watkins@deploymenttheory.com"
+ name = "tfacc-name"
+}
+```
+
+
+## Schema
+
+### Optional
+
+- `account_group_roles` (Attributes Set) Role assignments to write: account group id plus role ids. The response echoes assignments as expanded objects under allAccountGroupRoles, never in this shape, so state carries the configured value. The API refuses a user without at least one role (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare. (see [below for nested schema](#nestedatt--account_group_roles))
+- `all_account_group_role_ids` (Set of String) Unique IDs representing the roles. The response echoes roles as nested objects, never as this flat id list; state carries the configured value. Omitted from generated fixtures: its members are live role ids, and account_group_roles already carries the assignment the fixtures exercise.
+- `email` (String) User's email address. The API enforces this field's presence, which the specification does not declare.
+- `login_account_group_id` (String) Unique ID of the login account group. The response echoes loginAccountGroup as a nested object, never this id; state carries the configured value. The API refuses a user without a login account group (live probe, 2026-08-03). The API enforces this field's presence, which the specification does not declare.
+- `name` (String) User's display name. Required-by-API by curation: the sweeper's field, unprobeable by omission.
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `date_registered` (String) UTC date the user registered their account (ISO date-time format).
+- `id` (String) Unique ID of the user.
+
+Named `id` per the import convention; the wire field stays uid.
+- `last_login` (String) UTC last login of the user (ISO date-time format).
+
+
+### Nested Schema for `account_group_roles`
+
+Optional:
+
+- `account_group_id` (String) Unique ID of the account group.
+- `role_ids` (Set of String) Unique role IDs to grant in the account group.
+
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
+- `delete` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Setting a timeout for a Delete operation is only applicable if changes are saved into state before the destroy operation occurs.
+- `read` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours). Read operations occur during any refresh or planning operation when refresh is enabled.
+- `update` (String) A string that can be [parsed as a duration](https://pkg.go.dev/time#ParseDuration) consisting of numbers and unit suffixes, such as "30s" or "2h45m". Valid time units are "s" (seconds), "m" (minutes), "h" (hours).
diff --git a/pilot/thousandeyes/examples/resources/thousandeyes_account_group/resource.tf b/pilot/thousandeyes/examples/resources/thousandeyes_account_group/resource.tf
new file mode 100644
index 00000000..7012b3e7
--- /dev/null
+++ b/pilot/thousandeyes/examples/resources/thousandeyes_account_group/resource.tf
@@ -0,0 +1,3 @@
+resource "thousandeyes_account_group" "example" {
+ account_group_name = "tfacc-account-group-name"
+}
diff --git a/pilot/thousandeyes/examples/resources/thousandeyes_role/resource.tf b/pilot/thousandeyes/examples/resources/thousandeyes_role/resource.tf
new file mode 100644
index 00000000..efad5914
--- /dev/null
+++ b/pilot/thousandeyes/examples/resources/thousandeyes_role/resource.tf
@@ -0,0 +1,3 @@
+resource "thousandeyes_role" "example" {
+ name = "tfacc-name"
+}
diff --git a/pilot/thousandeyes/examples/resources/thousandeyes_user/resource.tf b/pilot/thousandeyes/examples/resources/thousandeyes_user/resource.tf
new file mode 100644
index 00000000..93d900d3
--- /dev/null
+++ b/pilot/thousandeyes/examples/resources/thousandeyes_user/resource.tf
@@ -0,0 +1,4 @@
+resource "thousandeyes_user" "example" {
+ email = "dafydd.watkins@deploymenttheory.com"
+ name = "tfacc-name"
+}
diff --git a/pilot/thousandeyes/internal/provider/actions.go b/pilot/thousandeyes/internal/provider/actions.go
index c571d938..39a9bab3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package provider
diff --git a/pilot/thousandeyes/internal/provider/datasources.go b/pilot/thousandeyes/internal/provider/datasources.go
index 94da1438..bcb44d92 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package provider
diff --git a/pilot/thousandeyes/internal/provider/ephemerals.go b/pilot/thousandeyes/internal/provider/ephemerals.go
index 5f532e76..b501dda9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package provider
diff --git a/pilot/thousandeyes/internal/provider/list_resources.go b/pilot/thousandeyes/internal/provider/list_resources.go
index c7eac410..92197ff2 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package provider
diff --git a/pilot/thousandeyes/internal/provider/resources.go b/pilot/thousandeyes/internal/provider/resources.go
index 2f0a9d09..1864faf6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package provider
@@ -8,6 +8,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/resource"
+ 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"
@@ -22,8 +23,10 @@ import (
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"
v7TestsPageLoad "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/page_load_tests/v7/tests_page_load"
+ v7Role "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/roles/v7/role"
v7TestsSIPServer "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/sip_server_tests/v7/tests_sip_server"
v7Tag "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/tags/v7/tag"
+ v7User "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/users/v7/user"
v7TestsVoice "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/voice_tests/v7/tests_voice"
v7TestsWebTransaction "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/resources/web_transaction_tests/v7/tests_web_transaction"
)
@@ -34,10 +37,12 @@ import (
// regenerating, not by editing here.
func (p *Provider) Resources(_ context.Context) []func() resource.Resource {
return []func() resource.Resource{
+ v7AccountGroup.NewAccountGroupResource,
v7AlertSuppressionWindow.NewAlertSuppressionWindowResource,
v7AlertsRule.NewAlertsRuleResource,
v7Credential.NewCredentialResource,
v7DashboardsFilter.NewDashboardsFilterResource,
+ v7Role.NewRoleResource,
v7Tag.NewTagResource,
v7TestsAPI.NewTestsAPIResource,
v7TestsAgentToAgent.NewTestsAgentToAgentResource,
@@ -52,5 +57,6 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource {
v7TestsSIPServer.NewTestsSIPServerResource,
v7TestsVoice.NewTestsVoiceResource,
v7TestsWebTransaction.NewTestsWebTransactionResource,
+ v7User.NewUserResource,
}
}
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 338a52e6..33cec670 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
// REF: https://developer.cisco.com/docs/thousandeyes/disable-endpoint-agent/
package disable_endpoint_agent
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 3eb36646..20d84162 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 5e86589f..9f364998 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package disable_endpoint_agent
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 c22fe85e..801d8361 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 f5538684..0302b27e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 240b3f31..b8784aa8 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 8494f92a..b5b3897f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 a388748c..8f974bab 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 bac7d5f6..b26fbc3f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 9bb4a7c5..e6bd66a1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c0c1d87a..aec5be85 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 c86a6b5c..ba740068 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 29e6e614..b4b05f62 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tags
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 d88379b8..a9c5e1d3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 105c9076..bf3fb559 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 ff82fa1c..886f6eb9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tags
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 ec01a5c4..345e69c1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 beab0224..172248de 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tags
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 ed9c7f9e..21eed64f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 fe940fbc..d08bc256 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 d6254a76..083148d4 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 9db03b6e..eafebb54 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 27f87051..87c1e982 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 e9e20c94..a10ccc8b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 e03ba4f9..953ada94 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 abecc6fd..db259aca 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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
new file mode 100644
index 00000000..176031de
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/construct.go
@@ -0,0 +1,27 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/account_groups"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// constructResource maps Terraform configuration onto the API's request body.
+//
+// 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})
+
+ body := &account_groups.AccountGroupRequest{}
+
+ body.AccountGroupName = convert.FrameworkToString(data.AccountGroupName)
+
+ return body
+}
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
new file mode 100644
index 00000000..9d64d247
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/crud.go
@@ -0,0 +1,246 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "context"
+ "time"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/account_groups"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/crud"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/errors"
+)
+
+// Create provisions a new thousandeyes_account_group.
+func (r *AccountGroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
+ var plan AccountGroupResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body := constructResource(ctx, &plan)
+
+ created, _, err := r.client.API.AccountGroups.CreateAccountGroup(ctx, body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err)
+ return
+ }
+
+ // The identifier is assigned first, so that a partially-successful create still
+ // leaves a resource Terraform can find and delete rather than an orphan it has no
+ // record of.
+ plan.ID = convert.EnumToFramework[account_groups.AccountGroupId](created.AID)
+
+ // State comes from a read, not from the create response. The two are not
+ // interchangeable: a field the API only returns when asked to expand it is absent
+ // from a create response, so mapping that response would write it null and the next
+ // read would contradict it -- a diff no configuration change can resolve.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpCreate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Read refreshes thousandeyes_account_group state from the API.
+func (r *AccountGroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
+ var state AccountGroupResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ found, diags := r.readState(ctx, &state, errors.OpRead)
+ resp.Diagnostics.Append(diags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ // Something deleted outside Terraform must produce a plan that recreates it, not an
+ // 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,
+ })
+ resp.State.RemoveResource(ctx)
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
+}
+
+// readState fetches thousandeyes_account_group 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.
+//
+// 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 *AccountGroupResource) readState(
+ ctx context.Context,
+ state *AccountGroupResourceModel,
+ op errors.Operation,
+) (bool, diag.Diagnostics) {
+ var diags diag.Diagnostics
+
+ remote, _, err := r.client.API.AccountGroups.GetAccountGroup(ctx, state.ID.ValueString())
+ if err != nil {
+ if errors.IsNotFound(err) {
+ return false, diags
+ }
+
+ errors.Handle(&diags, ResourceName, op, err)
+
+ return false, diags
+ }
+ diags.Append(mapRemoteStateToTerraform(ctx, state, remote)...)
+
+ return true, diags
+}
+
+// readAfterWrite refreshes state from the API after a create or an update, retrying while
+// the object is not yet readable.
+//
+// Why a read at all, rather than mapping the write's own response: the two are not
+// interchangeable. A field the API only returns when asked to expand it is absent from a
+// write response, so mapping that response writes it null and the next read contradicts
+// it. The pilot's own probe evidence says so.
+//
+// Why a retry: an API that is not read-your-writes consistent returns 404 for an object it
+// has just created, and a create that reports success on state the next plan disagrees with
+// is worse than one that waits.
+//
+// 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 *AccountGroupResource) readAfterWrite(
+ ctx context.Context,
+ state *AccountGroupResourceModel,
+ op errors.Operation,
+) diag.Diagnostics {
+ var diags diag.Diagnostics
+
+ opts := crud.ReadBackOptions{
+ MaxRetries: 10,
+ Interval: 2000 * time.Millisecond,
+ ResourceType: ResourceName,
+ Operation: string(op),
+ }
+
+ err := crud.ReadBack(ctx, opts, func(ctx context.Context) (bool, error) {
+ found, d := r.readState(ctx, state, op)
+ diags.Append(d...)
+
+ if d.HasError() {
+ return false, crud.ErrStopRetrying
+ }
+
+ return found, nil
+ })
+
+ // 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)
+ }
+
+ return diags
+}
+
+// Update applies configuration changes to an existing thousandeyes_account_group.
+func (r *AccountGroupResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
+ var plan, state AccountGroupResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body := constructResource(ctx, &plan)
+
+ _, _, err := r.client.API.AccountGroups.UpdateAccountGroup(ctx, state.ID.ValueString(), body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err)
+ return
+ }
+
+ // The plan carries no identifier, since it is computed. Carrying it over from
+ // prior state keeps it in the model in case the response omits it.
+ plan.ID = state.ID
+
+ // As with create: state comes from a read rather than from the update response.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpUpdate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Delete removes a thousandeyes_account_group.
+func (r *AccountGroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
+ var state AccountGroupResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ _, err := r.client.API.AccountGroups.DeleteAccountGroup(ctx, state.ID.ValueString())
+ if err != nil {
+ // Already gone is the outcome delete was asking for.
+ if errors.IsNotFound(err) {
+ return
+ }
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err)
+ return
+ }
+
+ // State is removed by the framework once Delete returns without error.
+}
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
new file mode 100644
index 00000000..9aabd5c7
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/model.go
@@ -0,0 +1,76 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts"
+ "github.com/hashicorp/terraform-plugin-framework/attr"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+)
+
+// AccountGroupResourceModel is the Terraform state for a thousandeyes_account_group.
+//
+// Field order follows the schema, and the timeouts value is last.
+type AccountGroupResourceModel struct {
+ AccountGroupName types.String `tfsdk:"account_group_name"`
+ ID types.String `tfsdk:"id"`
+ IsCurrentAccountGroup types.Bool `tfsdk:"is_current_account_group"`
+ IsDefaultAccountGroup types.Bool `tfsdk:"is_default_account_group"`
+ OrgID types.String `tfsdk:"org_id"`
+ OrganizationName types.String `tfsdk:"organization_name"`
+ Users types.Set `tfsdk:"users"`
+ Timeouts timeouts.Value `tfsdk:"timeouts"`
+}
+
+// AccountGroupUserAccountGroupModel 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 AccountGroupUserAccountGroupModel struct {
+ DateRegistered types.String `tfsdk:"date_registered"`
+ Email types.String `tfsdk:"email"`
+ LastLogin types.String `tfsdk:"last_login"`
+ Name types.String `tfsdk:"name"`
+ Roles types.Set `tfsdk:"roles"`
+ Uid types.String `tfsdk:"uid"`
+}
+
+// accountGroupUserAccountGroupAttrTypes describes AccountGroupUserAccountGroupModel 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.
+var accountGroupUserAccountGroupAttrTypes = map[string]attr.Type{
+ "date_registered": types.StringType,
+ "email": types.StringType,
+ "last_login": types.StringType,
+ "name": types.StringType,
+ "roles": types.SetType{ElemType: accountGroupRoleObjectType},
+ "uid": types.StringType,
+}
+
+var accountGroupUserAccountGroupObjectType = types.ObjectType{AttrTypes: accountGroupUserAccountGroupAttrTypes}
+
+// AccountGroupRoleModel 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 AccountGroupRoleModel struct {
+ HasManagementPermissions types.Bool `tfsdk:"has_management_permissions"`
+ IsBuiltin types.Bool `tfsdk:"is_builtin"`
+ Name types.String `tfsdk:"name"`
+ RoleID types.String `tfsdk:"role_id"`
+}
+
+// accountGroupRoleAttrTypes describes AccountGroupRoleModel 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.
+var accountGroupRoleAttrTypes = map[string]attr.Type{
+ "has_management_permissions": types.BoolType,
+ "is_builtin": types.BoolType,
+ "name": types.StringType,
+ "role_id": types.StringType,
+}
+
+var accountGroupRoleObjectType = types.ObjectType{AttrTypes: accountGroupRoleAttrTypes}
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
new file mode 100644
index 00000000..1f6c43ef
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource.go
@@ -0,0 +1,155 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/path"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/client"
+ commonschema "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/schema"
+)
+
+const (
+ // ResourceName is the Terraform type this resource registers as.
+ ResourceName = "thousandeyes_account_group"
+
+ // Default per-operation timeouts, in seconds. A practitioner overrides them
+ // with the resource's timeouts block.
+ CreateTimeout = 180
+ ReadTimeout = 180
+ UpdateTimeout = 180
+ DeleteTimeout = 180
+)
+
+// 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 = (*AccountGroupResource)(nil)
+ _ resource.ResourceWithConfigure = (*AccountGroupResource)(nil)
+ _ resource.ResourceWithImportState = (*AccountGroupResource)(nil)
+)
+
+// NewAccountGroupResource returns the thousandeyes_account_group resource.
+func NewAccountGroupResource() resource.Resource {
+ return &AccountGroupResource{}
+}
+
+// AccountGroupResource implements the thousandeyes_account_group resource.
+type AccountGroupResource struct {
+ client *thousandeyes.Client
+}
+
+// Metadata returns the resource type name.
+func (r *AccountGroupResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) {
+ resp.TypeName = ResourceName
+}
+
+// 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)
+}
+
+// ImportState maps a terraform import into state.
+func (r *AccountGroupResource) 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 *AccountGroupResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
+ resp.Schema = schema.Schema{
+ MarkdownDescription: "Retrieve account group.",
+ Attributes: map[string]schema.Attribute{
+ "account_group_name": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "Account group name Required-by-API by curation: the sweeper's field, unprobeable by " +
+ "omission.",
+ },
+ "id": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "A unique identifier associated with your account group. You can retrieve your " +
+ "`AccountGroupId` from the `/account-groups` endpoint. Named `id` per the import " +
+ "convention; the wire field stays aid.",
+ PlanModifiers: []planmodifier.String{
+ stringplanmodifier.UseStateForUnknown(),
+ },
+ },
+ "is_current_account_group": schema.BoolAttribute{
+ Computed: true,
+ MarkdownDescription: "Indicates whether the requested aid is the context of the current account.",
+ },
+ "is_default_account_group": schema.BoolAttribute{
+ Computed: true,
+ MarkdownDescription: "Indicates whether the aid is the default one for the requesting user.",
+ },
+ "org_id": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "(Optional) The ID for the organization associated with the account group.",
+ },
+ "organization_name": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "(Optional) The name of the organization associated with the account group.",
+ },
+ "users": schema.SetNestedAttribute{
+ NestedObject: schema.NestedAttributeObject{
+ Attributes: map[string]schema.Attribute{
+ "date_registered": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "User's UTC registration date (ISO date-time format).",
+ },
+ "email": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "User's email address.",
+ },
+ "last_login": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "User's UTC last login date (ISO date-time format).",
+ },
+ "name": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "User's display name.",
+ },
+ "roles": schema.SetNestedAttribute{
+ NestedObject: schema.NestedAttributeObject{
+ Attributes: map[string]schema.Attribute{
+ "has_management_permissions": schema.BoolAttribute{
+ Computed: true,
+ MarkdownDescription: "Flag indicating whether the user has management permissions.",
+ },
+ "is_builtin": schema.BoolAttribute{
+ Computed: true,
+ MarkdownDescription: "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).",
+ },
+ "name": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "Name of the role.",
+ },
+ "role_id": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "Unique ID representing the role.",
+ },
+ },
+ },
+ Computed: true,
+ },
+ "uid": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "Unique ID representing the user.",
+ },
+ },
+ },
+ Computed: true,
+ },
+ },
+ Blocks: map[string]schema.Block{
+ "timeouts": commonschema.ResourceTimeouts(ctx),
+ },
+ }
+}
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
new file mode 100644
index 00000000..6d83180e
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/resource_acceptance_test.go
@@ -0,0 +1,87 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group_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/account_groups/v7/account_group"
+)
+
+// The resource under test, and the helper that asks the API whether it is really there.
+const address = "thousandeyes_account_group.test"
+
+var testResource = account_group.AccountGroupTestResource{}
+
+// TestAccResourceAccountGroup_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 TestAccResourceAccountGroup_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_ADMIN") == "" {
+ t.Skipf("set TFPFGEN_ACC_ADMIN 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_account_group", 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("account_group_name").HasValue("tfacc-account-group-name"),
+ ),
+ },
+ // 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,
+ },
+ },
+ })
+}
+
+// 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/account_groups/v7/account_group/state.go b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go
new file mode 100644
index 00000000..b2c54074
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/state.go
@@ -0,0 +1,105 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/account_groups"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// mapRemoteStateToTerraform maps the API's response onto Terraform state.
+//
+// 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 *AccountGroupResourceModel, remote *account_groups.AccountGroupDetail) diag.Diagnostics {
+ var (
+ diags diag.Diagnostics
+ d diag.Diagnostics
+ )
+
+ if remote == nil {
+ tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{
+ "resource": ResourceName,
+ })
+ return diags
+ }
+
+ data.AccountGroupName = convert.PtrStringToFramework[string](remote.AccountGroupName)
+ data.ID = convert.EnumToFramework[account_groups.AccountGroupId](remote.AID)
+ data.IsCurrentAccountGroup = convert.PtrBoolToFramework(remote.IsCurrentAccountGroup)
+ data.IsDefaultAccountGroup = convert.PtrBoolToFramework(remote.IsDefaultAccountGroup)
+ data.OrgID = convert.PtrStringToFramework(remote.OrgID)
+ data.OrganizationName = convert.PtrStringToFramework(remote.OrganizationName)
+ data.Users, d = flattenAccountGroupUserAccountGroups(ctx, remote.Users)
+ diags.Append(d...)
+
+ tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName})
+
+ return diags
+}
+
+// flattenAccountGroupUserAccountGroups converts SDK structs into the framework value state holds.
+func flattenAccountGroupUserAccountGroups(ctx context.Context, in []account_groups.UserAccountGroup) (types.Set, diag.Diagnostics) {
+ var diags diag.Diagnostics
+ var d diag.Diagnostics
+
+ // A nil slice is null and an empty slice is empty. Conflating them produces a
+ // diff no configuration change can resolve.
+ if in == nil {
+ return types.SetNull(accountGroupUserAccountGroupObjectType), diags
+ }
+
+ models := make([]AccountGroupUserAccountGroupModel, 0, len(in))
+ for _, item := range in {
+ var m AccountGroupUserAccountGroupModel
+
+ m.DateRegistered = convert.PtrStringToFramework(item.DateRegistered)
+ m.Email = convert.PtrStringToFramework(item.Email)
+ m.LastLogin = convert.PtrStringToFramework(item.LastLogin)
+ m.Name = convert.PtrStringToFramework(item.Name)
+ m.Roles, d = flattenAccountGroupRoles(ctx, item.Roles)
+ diags.Append(d...)
+ m.Uid = convert.PtrStringToFramework(item.Uid)
+ models = append(models, m)
+ }
+
+ out, d2 := types.SetValueFrom(ctx, accountGroupUserAccountGroupObjectType, models)
+ diags.Append(d2...)
+
+ return out, diags
+}
+
+// flattenAccountGroupRoles converts SDK structs into the framework value state holds.
+func flattenAccountGroupRoles(ctx context.Context, in []account_groups.Role) (types.Set, diag.Diagnostics) {
+ var diags diag.Diagnostics
+
+ // A nil slice is null and an empty slice is empty. Conflating them produces a
+ // diff no configuration change can resolve.
+ if in == nil {
+ return types.SetNull(accountGroupRoleObjectType), diags
+ }
+
+ models := make([]AccountGroupRoleModel, 0, len(in))
+ for _, item := range in {
+ var m AccountGroupRoleModel
+
+ m.HasManagementPermissions = convert.PtrBoolToFramework(item.HasManagementPermissions)
+ m.IsBuiltin = convert.PtrBoolToFramework(item.IsBuiltin)
+ m.Name = convert.PtrStringToFramework(item.Name)
+ m.RoleID = convert.PtrStringToFramework(item.RoleID)
+ models = append(models, m)
+ }
+
+ out, d2 := types.SetValueFrom(ctx, accountGroupRoleObjectType, models)
+ diags.Append(d2...)
+
+ return out, 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
new file mode 100644
index 00000000..39edecd4
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/test_helper_test.go
@@ -0,0 +1,40 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package account_group
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-testing/terraform"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists"
+)
+
+// AccountGroupTestResource answers whether a thousandeyes_account_group 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 AccountGroupTestResource 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 (AccountGroupTestResource) Exists(
+ ctx context.Context,
+ state *terraform.InstanceState,
+) (*bool, error) {
+ return exists.Check(ctx, state, func(
+ ctx context.Context,
+ client *thousandeyes.Client,
+ state *terraform.InstanceState,
+ ) error {
+ _, _, err := client.API.AccountGroups.GetAccountGroup(ctx, state.ID)
+
+ return err
+ })
+}
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
new file mode 100644
index 00000000..2ea10741
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/maximal.tf
@@ -0,0 +1,15 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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.
+#
+# Regenerated and policed, deliberately. This file used to be a hand-owned scaffold, and
+# hand edits are how its values drifted from the generated assertions -- the checks derive
+# from the blueprint, so the blueprint is where a value is corrected: an accFixture hint for
+# 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_account_group" "test" {
+ account_group_name = "tfacc-account-group-name"
+}
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
new file mode 100644
index 00000000..3c58ed49
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/account_groups/v7/account_group/testdata/minimal.tf
@@ -0,0 +1,11 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_account_group" "test" {
+ account_group_name = "tfacc-account-group-name"
+}
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 4d05f5d7..1b3d18cc 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/crud.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/crud.go
index 384869f3..d31d37c3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/model.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/model.go
index 53cf3e72..bf7313f1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 67c7e9b2..77097910 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/state.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/state.go
index eb2d62c5..dd643b48 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_agent_tests/v7/tests_agent_to_agent/test_helper_test.go
index 5e2eb919..32b0635b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_agent_to_agent
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 1cd66fb1..39ed181b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/crud.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/crud.go
index c4709e43..ab8e9708 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/model.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/model.go
index 8fa52deb..addc8b84 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 6d691781..4dc1eea7 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_acceptance_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/resource_acceptance_test.go
index a630b182..13a4b099 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 5bcaee06..aca7cdc3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/test_helper_test.go b/pilot/thousandeyes/internal/services/resources/agent_to_server_tests/v7/tests_agent_to_server/test_helper_test.go
index 4876fc89..fc9f04c1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 6144e70a..ebae8326 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 a7777141..167a1486 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/alerts_rule/construct.go
index beee2269..5dc57499 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/construct.go
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/construct.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go
index 768fc3aa..6b081583 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/crud.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go
index 7ca66ac4..4a2797ac 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/model.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go
index 5bae5386..f52985f6 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/resource.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
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/alerts_rule/resource_acceptance_test.go
index 59cc7748..829421e0 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/alerts_rule/resource_acceptance_test.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule_test
diff --git a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go
index c20f48ba..14440482 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/state.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
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/alerts_rule/test_helper_test.go
index 1b50b272..67dcee60 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/alerts_rule/test_helper_test.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alerts_rule
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/alerts_rule/testdata/maximal.tf
index fe9d6713..d8d6ddeb 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/maximal.tf
@@ -1,5 +1,5 @@
# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-# (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_rules/v7/alerts_rule/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf
index 6b41251c..6881d6d6 100644
--- a/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf
+++ b/pilot/thousandeyes/internal/services/resources/alert_rules/v7/alerts_rule/testdata/minimal.tf
@@ -1,5 +1,5 @@
# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-# (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
# The smallest configuration this resource accepts: its required attributes and nothing else.
#
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 83f3780f..8ffd90d5 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alert_suppression_window
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 ed3c5d9c..774f5da6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alert_suppression_window
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 2d0f2ffb..4c744f51 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 ef46867c..9869dc3f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alert_suppression_window
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 d2b3d458..0efc495f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 07f6b98a..49d9ef4a 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package alert_suppression_window
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 6dd75f31..21afca9f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 f7d37e9a..39920957 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 62d5564f..ddb3bd01 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 6c06ab57..b9e43055 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_api
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 b94d2b63..4c18bbd8 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_api
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 6e360b03..1af9ab76 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 13e97c56..5d04ec80 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_api
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 38a919c2..315a1b73 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 79be5537..1adf8bbf 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_api
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 69adff30..b0bf2db6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 4d46c186..489658b0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 2d2ceab6..55f82620 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 b5caa8dc..2752e799 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_bgp
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 3a241547..5359143e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_bgp
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 c76da81b..797b1198 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 d6685ed5..688622a7 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_bgp
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 91f30c0f..3b5b16fa 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 1234cc3b..83843741 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_bgp
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 dd8a5be2..3f675599 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c5c39a1e..12b2a9c8 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 86ff5fb8..f03f23fd 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 fde12e37..e57aa711 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 68cf2fe8..8d535aa5 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 0e28839b..da01e98e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 9347cca0..6b43b0b3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 d076a55e..e3b21e6c 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 317ffc24..f06879a1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package credential
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 e9e20c94..a10ccc8b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 9678d3a4..54dd3270 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 9be0b411..10f14009 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/dashboards_filter/construct.go
index 77ccb554..1ad3b4ce 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/construct.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go
index 01fd2b55..fe2dfc6f 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/crud.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go
index f6d8affe..6a1f573e 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/model.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go
index 832f3169..b464fdff 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/resource.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
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/dashboards_filter/resource_acceptance_test.go
index c51bf798..7f15b497 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/dashboards_filter/resource_acceptance_test.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter_test
diff --git a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go
index cb4be20a..ec2fa00a 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/state.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
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/dashboards_filter/test_helper_test.go
index d19423d2..d47fd841 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/dashboards_filter/test_helper_test.go
@@ -1,5 +1,5 @@
// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-// (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package dashboards_filter
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/dashboards_filter/testdata/maximal.tf
index efaf8fd7..58761019 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/maximal.tf
@@ -1,5 +1,5 @@
# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-# (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_filters/v7/dashboards_filter/testdata/minimal.tf b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf
index 5379095a..cc9567e2 100644
--- a/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf
+++ b/pilot/thousandeyes/internal/services/resources/dashboards_filters/v7/dashboards_filter/testdata/minimal.tf
@@ -1,5 +1,5 @@
# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
-# (sha256:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
# The smallest configuration this resource accepts: its required attributes and nothing else.
#
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 8b46daed..2e361903 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_server
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 e82c082e..b16a2435 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_server
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 99b7ae57..caef40a3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 4630bcf4..cca2515e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_server
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 5c80672f..21bf627e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 ea8cc49b..edf60453 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_server
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 53e87d9b..b8340ebb 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 56f33e7f..7f169832 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 7d9cc33e..cf92c85b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 0dac7871..8107d4a6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_trace
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 2d184ccf..9a12fbeb 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_trace
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 1360619c..bd6ffd5b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 df021c65..8089f558 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_trace
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 00850610..07f0fa55 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 705576f4..883a3c62 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dns_trace
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 4c595a0a..27658649 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 24f39316..b47fd461 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 d80c6fbb..5e2d236d 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 48d99c36..7f832fe5 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 7d2acee4..e6ac868f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 44d59cc9..47d381fb 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 33bdf540..da1e180b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 645499d1..85ac2041 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec_test
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 8206c875..d0de776d 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 700bf829..9efd2c96 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_dnssec
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 459b83e6..721f32fa 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 94aeda64..9541a3aa 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 2cf356e8..095d9f93 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_ftp_server
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 92ef9ead..30a6ff96 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_ftp_server
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 65c98b2f..97e6c6a6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 0d40e4e1..66761df3 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_ftp_server
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 7a481b28..0408d602 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 f64e7c9a..633f7b41 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_ftp_server
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 6512033b..5e663a85 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 ef4a11e2..800df1cd 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 3677115d..ea2def71 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 7dd0daca..6176a434 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_http_server
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 b02f75ee..46837b67 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_http_server
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 fb7609c6..d299d5f0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 ed7993bf..c8406bd4 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_http_server
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 fc96566d..01a10ae9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 3caa45b3..5b5a9a7f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_http_server
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 3dc1d4b7..e1229ce8 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 0c5c5768..f2d646df 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 60b51afa..45f68993 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c91ca668..34d46c90 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_page_load
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 11aa2032..a45cfb26 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_page_load
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 45bc1038..c0320f62 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 4752d204..c88baf30 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_page_load
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 83fcded3..9c26f3d9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c4a0c116..5df8c2aa 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_page_load
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 90fe2cdd..86af917b 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 80983eda..317f669e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 4f73950a..0f96b2bb 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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
new file mode 100644
index 00000000..3278e324
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/construct.go
@@ -0,0 +1,34 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/roles"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// constructResource maps Terraform configuration onto the API's request body.
+//
+// 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 *RoleResourceModel) (*roles.RoleRequestBody, diag.Diagnostics) {
+ var (
+ diags diag.Diagnostics
+ d diag.Diagnostics
+ )
+ tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName})
+
+ body := &roles.RoleRequestBody{}
+
+ body.Name = convert.FrameworkToPtrString(data.Name)
+ body.Permissions, d = convert.FrameworkSetToStringSlice(ctx, data.Permissions)
+ diags.Append(d...)
+
+ return body, diags
+}
diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go
new file mode 100644
index 00000000..6c152589
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/crud.go
@@ -0,0 +1,253 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "context"
+ "time"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/crud"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/errors"
+)
+
+// Create provisions a new thousandeyes_role.
+func (r *RoleResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
+ var plan RoleResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body, constructDiags := constructResource(ctx, &plan)
+ resp.Diagnostics.Append(constructDiags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ created, _, err := r.client.API.Roles.CreateRole(ctx, body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err)
+ return
+ }
+
+ // The identifier is assigned first, so that a partially-successful create still
+ // leaves a resource Terraform can find and delete rather than an orphan it has no
+ // record of.
+ plan.ID = convert.PtrStringToFramework(created.RoleID)
+
+ // State comes from a read, not from the create response. The two are not
+ // interchangeable: a field the API only returns when asked to expand it is absent
+ // from a create response, so mapping that response would write it null and the next
+ // read would contradict it -- a diff no configuration change can resolve.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpCreate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Read refreshes thousandeyes_role state from the API.
+func (r *RoleResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
+ var state RoleResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ found, diags := r.readState(ctx, &state, errors.OpRead)
+ resp.Diagnostics.Append(diags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ // Something deleted outside Terraform must produce a plan that recreates it, not an
+ // 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,
+ })
+ resp.State.RemoveResource(ctx)
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
+}
+
+// readState fetches thousandeyes_role 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.
+//
+// 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 *RoleResource) readState(
+ ctx context.Context,
+ state *RoleResourceModel,
+ op errors.Operation,
+) (bool, diag.Diagnostics) {
+ var diags diag.Diagnostics
+
+ remote, _, err := r.client.API.Roles.GetRole(ctx, state.ID.ValueString())
+ if err != nil {
+ if errors.IsNotFound(err) {
+ return false, diags
+ }
+
+ errors.Handle(&diags, ResourceName, op, err)
+
+ return false, diags
+ }
+ mapRemoteStateToTerraform(ctx, state, remote)
+
+ return true, diags
+}
+
+// readAfterWrite refreshes state from the API after a create or an update, retrying while
+// the object is not yet readable.
+//
+// Why a read at all, rather than mapping the write's own response: the two are not
+// interchangeable. A field the API only returns when asked to expand it is absent from a
+// write response, so mapping that response writes it null and the next read contradicts
+// it. The pilot's own probe evidence says so.
+//
+// Why a retry: an API that is not read-your-writes consistent returns 404 for an object it
+// has just created, and a create that reports success on state the next plan disagrees with
+// is worse than one that waits.
+//
+// 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 *RoleResource) readAfterWrite(
+ ctx context.Context,
+ state *RoleResourceModel,
+ op errors.Operation,
+) diag.Diagnostics {
+ var diags diag.Diagnostics
+
+ opts := crud.ReadBackOptions{
+ MaxRetries: 10,
+ Interval: 2000 * time.Millisecond,
+ ResourceType: ResourceName,
+ Operation: string(op),
+ }
+
+ err := crud.ReadBack(ctx, opts, func(ctx context.Context) (bool, error) {
+ found, d := r.readState(ctx, state, op)
+ diags.Append(d...)
+
+ if d.HasError() {
+ return false, crud.ErrStopRetrying
+ }
+
+ return found, nil
+ })
+
+ // 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)
+ }
+
+ return diags
+}
+
+// Update applies configuration changes to an existing thousandeyes_role.
+func (r *RoleResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
+ var plan, state RoleResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body, constructDiags := constructResource(ctx, &plan)
+ resp.Diagnostics.Append(constructDiags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ _, _, err := r.client.API.Roles.UpdateRole(ctx, state.ID.ValueString(), body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err)
+ return
+ }
+
+ // The plan carries no identifier, since it is computed. Carrying it over from
+ // prior state keeps it in the model in case the response omits it.
+ plan.ID = state.ID
+
+ // As with create: state comes from a read rather than from the update response.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpUpdate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Delete removes a thousandeyes_role.
+func (r *RoleResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
+ var state RoleResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ _, err := r.client.API.Roles.DeleteRole(ctx, state.ID.ValueString())
+ if err != nil {
+ // Already gone is the outcome delete was asking for.
+ if errors.IsNotFound(err) {
+ return
+ }
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err)
+ return
+ }
+
+ // State is removed by the framework once Delete returns without error.
+}
diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go
new file mode 100644
index 00000000..ee0f7d2c
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/model.go
@@ -0,0 +1,20 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+)
+
+// RoleResourceModel is the Terraform state for a thousandeyes_role.
+//
+// Field order follows the schema, and the timeouts value is last.
+type RoleResourceModel struct {
+ IsBuiltin types.Bool `tfsdk:"is_builtin"`
+ Name types.String `tfsdk:"name"`
+ Permissions types.Set `tfsdk:"permissions"`
+ ID types.String `tfsdk:"id"`
+ Timeouts timeouts.Value `tfsdk:"timeouts"`
+}
diff --git a/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go
new file mode 100644
index 00000000..a52c054d
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource.go
@@ -0,0 +1,102 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/path"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/client"
+ commonschema "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/schema"
+)
+
+const (
+ // ResourceName is the Terraform type this resource registers as.
+ ResourceName = "thousandeyes_role"
+
+ // Default per-operation timeouts, in seconds. A practitioner overrides them
+ // with the resource's timeouts block.
+ CreateTimeout = 180
+ ReadTimeout = 180
+ UpdateTimeout = 180
+ DeleteTimeout = 180
+)
+
+// 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 = (*RoleResource)(nil)
+ _ resource.ResourceWithConfigure = (*RoleResource)(nil)
+ _ resource.ResourceWithImportState = (*RoleResource)(nil)
+)
+
+// NewRoleResource returns the thousandeyes_role resource.
+func NewRoleResource() resource.Resource {
+ return &RoleResource{}
+}
+
+// RoleResource implements the thousandeyes_role resource.
+type RoleResource struct {
+ client *thousandeyes.Client
+}
+
+// Metadata returns the resource type name.
+func (r *RoleResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) {
+ resp.TypeName = ResourceName
+}
+
+// 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)
+}
+
+// ImportState maps a terraform import into state.
+func (r *RoleResource) 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 *RoleResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
+ resp.Schema = schema.Schema{
+ MarkdownDescription: "Retrieve role.",
+ Attributes: map[string]schema.Attribute{
+ "is_builtin": schema.BoolAttribute{
+ Computed: true,
+ MarkdownDescription: "Flag indicating if the role is built-in (Account Admin, Organization Admin, Regular User).",
+ },
+ "name": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "Name of the role. Required-by-API by curation: the sweeper's field, unprobeable by " +
+ "omission.",
+ },
+ "permissions": schema.SetAttribute{
+ ElementType: types.StringType,
+ Optional: true,
+ MarkdownDescription: "List of permission ids to grant (permissionId values from the permissions API). The " +
+ "response echoes permissions as expanded objects, never this id list, so state carries the " +
+ "configured value. Effectively required: a permission-less role create answers 500 (live " +
+ "probe, 2026-08-03). The API enforces this field's " +
+ "presence, which the specification does not declare. ",
+ },
+ "id": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "Unique ID representing the role. Named `id` per the import convention; the wire field " +
+ "stays roleId.",
+ PlanModifiers: []planmodifier.String{
+ stringplanmodifier.UseStateForUnknown(),
+ },
+ },
+ },
+ Blocks: map[string]schema.Block{
+ "timeouts": commonschema.ResourceTimeouts(ctx),
+ },
+ }
+}
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
new file mode 100644
index 00000000..4b178714
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/resource_acceptance_test.go
@@ -0,0 +1,92 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role_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/roles/v7/role"
+)
+
+// The resource under test, and the helper that asks the API whether it is really there.
+const address = "thousandeyes_role.test"
+
+var testResource = role.RoleTestResource{}
+
+// TestAccResourceRole_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 TestAccResourceRole_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_ADMIN") == "" {
+ t.Skipf("set TFPFGEN_ACC_ADMIN 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_role", 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("name").HasValue("tfacc-name"),
+ ),
+ },
+ // 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.
+ // permissions: it is write-only, carried from configuration, which an import does not have
+ ImportStateVerifyIgnore: []string{"permissions"},
+ },
+ },
+ })
+}
+
+// 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/roles/v7/role/state.go b/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go
new file mode 100644
index 00000000..ec731058
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/state.go
@@ -0,0 +1,33 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/roles"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// mapRemoteStateToTerraform maps the API's response onto Terraform state.
+//
+// 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 *RoleResourceModel, remote *roles.RoleDetail) {
+ if remote == nil {
+ tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{
+ "resource": ResourceName,
+ })
+ return
+ }
+
+ data.IsBuiltin = convert.PtrBoolToFramework(remote.IsBuiltin)
+ data.Name = convert.PtrStringToFramework(remote.Name)
+ data.ID = convert.PtrStringToFramework(remote.RoleID)
+
+ tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName})
+}
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
new file mode 100644
index 00000000..d7e105b6
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/test_helper_test.go
@@ -0,0 +1,40 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package role
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-testing/terraform"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists"
+)
+
+// RoleTestResource answers whether a thousandeyes_role 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 RoleTestResource 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 (RoleTestResource) Exists(
+ ctx context.Context,
+ state *terraform.InstanceState,
+) (*bool, error) {
+ return exists.Check(ctx, state, func(
+ ctx context.Context,
+ client *thousandeyes.Client,
+ state *terraform.InstanceState,
+ ) error {
+ _, _, err := client.API.Roles.GetRole(ctx, state.ID)
+
+ return err
+ })
+}
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
new file mode 100644
index 00000000..13f1f6fb
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/maximal.tf
@@ -0,0 +1,19 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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.
+#
+# Regenerated and policed, deliberately. This file used to be a hand-owned scaffold, and
+# hand edits are how its values drifted from the generated assertions -- the checks derive
+# from the blueprint, so the blueprint is where a value is corrected: an accFixture hint for
+# 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_role" "test" {
+ # Where a value came from.
+ #
+ # permissions: curated in the blueprint's accFixture; the generator cannot derive it
+ name = "tfacc-name"
+ permissions = ["1", "2"]
+}
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
new file mode 100644
index 00000000..9cd29c5e
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/roles/v7/role/testdata/minimal.tf
@@ -0,0 +1,19 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_role" "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.
+ #
+ # permissions: curated in the blueprint's accFixture; the generator cannot derive it
+ name = "tfacc-name"
+ permissions = ["1", "2"]
+}
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 4e37bf1e..4e5f1c9e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_sip_server
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 15e18708..f9c9cdda 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_sip_server
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 daabeb0d..5f934eb0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 f632165c..4aaf7342 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_sip_server
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 c60930e7..5c82047a 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 2d270cd1..613edfa0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_sip_server
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 e63adc5d..5aca2911 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 792123a2..5e9ef278 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c3fdaa41..79d56e40 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 34992849..b3d8f653 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 99c746cd..c768486e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 d30697d5..47a6b70d 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 2cab3c9d..0be6b354 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 a9ec77ab..ad90f017 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 da9bed42..71b45de1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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/resource.go b/pilot/thousandeyes/internal/services/resources/tags/v7/tag/resource.go
index c8a3587c..ff1b813d 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 7cac9e90..1faa3d74 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 3cab49f7..fb333866 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tag
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 9bb4a7c5..e6bd66a1 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 286142ec..f532adcc 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 7774c110..fc10adc6 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 d14f6046..c7d4a7f8 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 c2f6f400..9df3ceb9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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
new file mode 100644
index 00000000..99c9b5ff
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/construct.go
@@ -0,0 +1,69 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/users"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// constructResource maps Terraform configuration onto the API's request body.
+//
+// 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 *UserResourceModel) (*users.UserRequest, diag.Diagnostics) {
+ var (
+ diags diag.Diagnostics
+ d diag.Diagnostics
+ )
+ tflog.Debug(ctx, "constructing request body", map[string]any{"resource": ResourceName})
+
+ body := &users.UserRequest{}
+
+ body.AccountGroupRoles, d = expandUserAccountGroupRoles(ctx, data.AccountGroupRoles)
+ diags.Append(d...)
+ body.AllAccountGroupRoleIds, d = convert.FrameworkSetToStringSlice(ctx, data.AllAccountGroupRoleIDs)
+ diags.Append(d...)
+ body.Email = convert.FrameworkToPtrString(data.Email)
+ body.LoginAccountGroupID = convert.FrameworkToPtrString(data.LoginAccountGroupID)
+ body.Name = convert.FrameworkToPtrString(data.Name)
+
+ return body, diags
+}
+
+// expandUserAccountGroupRoles converts the configured UserAccountGroupRoleModel values into SDK structs.
+func expandUserAccountGroupRoles(ctx context.Context, v types.Set) ([]users.UserAccountGroupRole, diag.Diagnostics) {
+ var diags diag.Diagnostics
+ var d diag.Diagnostics
+
+ // Null and unknown both yield nil so the field is omitted from the request,
+ // which is distinct from an empty collection asking the API to clear it.
+ if v.IsNull() || v.IsUnknown() {
+ return nil, diags
+ }
+
+ var models []UserAccountGroupRoleModel
+ diags.Append(v.ElementsAs(ctx, &models, false)...)
+ if diags.HasError() {
+ return nil, diags
+ }
+
+ out := make([]users.UserAccountGroupRole, 0, len(models))
+ for _, m := range models {
+ var item users.UserAccountGroupRole
+
+ item.AccountGroupID = convert.FrameworkToPtrString(m.AccountGroupID)
+ item.RoleIds, d = convert.FrameworkSetToStringSlice(ctx, m.RoleIds)
+ diags.Append(d...)
+ out = append(out, item)
+ }
+
+ return out, diags
+}
diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go
new file mode 100644
index 00000000..556607f6
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/crud.go
@@ -0,0 +1,253 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "context"
+ "time"
+
+ "github.com/hashicorp/terraform-plugin-framework/diag"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/crud"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/errors"
+)
+
+// Create provisions a new thousandeyes_user.
+func (r *UserResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
+ var plan UserResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "creating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseCreate, CreateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body, constructDiags := constructResource(ctx, &plan)
+ resp.Diagnostics.Append(constructDiags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ created, _, err := r.client.API.Users.CreateUser(ctx, body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpCreate, err)
+ return
+ }
+
+ // The identifier is assigned first, so that a partially-successful create still
+ // leaves a resource Terraform can find and delete rather than an orphan it has no
+ // record of.
+ plan.ID = convert.PtrStringToFramework(created.Uid)
+
+ // State comes from a read, not from the create response. The two are not
+ // interchangeable: a field the API only returns when asked to expand it is absent
+ // from a create response, so mapping that response would write it null and the next
+ // read would contradict it -- a diff no configuration change can resolve.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpCreate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Read refreshes thousandeyes_user state from the API.
+func (r *UserResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
+ var state UserResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "reading resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseRead, ReadTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ found, diags := r.readState(ctx, &state, errors.OpRead)
+ resp.Diagnostics.Append(diags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ // Something deleted outside Terraform must produce a plan that recreates it, not an
+ // 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,
+ })
+ resp.State.RemoveResource(ctx)
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
+}
+
+// readState fetches thousandeyes_user 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.
+//
+// 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 *UserResource) readState(
+ ctx context.Context,
+ state *UserResourceModel,
+ op errors.Operation,
+) (bool, diag.Diagnostics) {
+ var diags diag.Diagnostics
+
+ remote, _, err := r.client.API.Users.GetUser(ctx, state.ID.ValueString())
+ if err != nil {
+ if errors.IsNotFound(err) {
+ return false, diags
+ }
+
+ errors.Handle(&diags, ResourceName, op, err)
+
+ return false, diags
+ }
+ mapRemoteStateToTerraform(ctx, state, remote)
+
+ return true, diags
+}
+
+// readAfterWrite refreshes state from the API after a create or an update, retrying while
+// the object is not yet readable.
+//
+// Why a read at all, rather than mapping the write's own response: the two are not
+// interchangeable. A field the API only returns when asked to expand it is absent from a
+// write response, so mapping that response writes it null and the next read contradicts
+// it. The pilot's own probe evidence says so.
+//
+// Why a retry: an API that is not read-your-writes consistent returns 404 for an object it
+// has just created, and a create that reports success on state the next plan disagrees with
+// is worse than one that waits.
+//
+// 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 *UserResource) readAfterWrite(
+ ctx context.Context,
+ state *UserResourceModel,
+ op errors.Operation,
+) diag.Diagnostics {
+ var diags diag.Diagnostics
+
+ opts := crud.ReadBackOptions{
+ MaxRetries: 10,
+ Interval: 2000 * time.Millisecond,
+ ResourceType: ResourceName,
+ Operation: string(op),
+ }
+
+ err := crud.ReadBack(ctx, opts, func(ctx context.Context) (bool, error) {
+ found, d := r.readState(ctx, state, op)
+ diags.Append(d...)
+
+ if d.HasError() {
+ return false, crud.ErrStopRetrying
+ }
+
+ return found, nil
+ })
+
+ // 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)
+ }
+
+ return diags
+}
+
+// Update applies configuration changes to an existing thousandeyes_user.
+func (r *UserResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
+ var plan, state UserResourceModel
+
+ resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "updating resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, plan.Timeouts, crud.PhaseUpdate, UpdateTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+ body, constructDiags := constructResource(ctx, &plan)
+ resp.Diagnostics.Append(constructDiags...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ _, _, err := r.client.API.Users.UpdateUser(ctx, state.ID.ValueString(), body)
+ if err != nil {
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpUpdate, err)
+ return
+ }
+
+ // The plan carries no identifier, since it is computed. Carrying it over from
+ // prior state keeps it in the model in case the response omits it.
+ plan.ID = state.ID
+
+ // As with create: state comes from a read rather than from the update response.
+ resp.Diagnostics.Append(r.readAfterWrite(ctx, &plan, errors.OpUpdate)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
+}
+
+// Delete removes a thousandeyes_user.
+func (r *UserResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
+ var state UserResourceModel
+
+ resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+
+ tflog.Debug(ctx, "deleting resource", map[string]any{"resource": ResourceName})
+
+ timeout := crud.Timeout(ctx, state.Timeouts, crud.PhaseDelete, DeleteTimeout*time.Second, &resp.Diagnostics)
+ if resp.Diagnostics.HasError() {
+ return
+ }
+ ctx, cancel := context.WithTimeout(ctx, timeout)
+ defer cancel()
+
+ _, err := r.client.API.Users.DeleteUser(ctx, state.ID.ValueString())
+ if err != nil {
+ // Already gone is the outcome delete was asking for.
+ if errors.IsNotFound(err) {
+ return
+ }
+ errors.Handle(&resp.Diagnostics, ResourceName, errors.OpDelete, err)
+ return
+ }
+
+ // State is removed by the framework once Delete returns without error.
+}
diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go
new file mode 100644
index 00000000..660c4e74
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/model.go
@@ -0,0 +1,45 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts"
+ "github.com/hashicorp/terraform-plugin-framework/attr"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+)
+
+// UserResourceModel is the Terraform state for a thousandeyes_user.
+//
+// Field order follows the schema, and the timeouts value is last.
+type UserResourceModel struct {
+ AccountGroupRoles types.Set `tfsdk:"account_group_roles"`
+ AllAccountGroupRoleIDs types.Set `tfsdk:"all_account_group_role_ids"`
+ DateRegistered types.String `tfsdk:"date_registered"`
+ Email types.String `tfsdk:"email"`
+ LastLogin types.String `tfsdk:"last_login"`
+ LoginAccountGroupID types.String `tfsdk:"login_account_group_id"`
+ Name types.String `tfsdk:"name"`
+ ID types.String `tfsdk:"id"`
+ Timeouts timeouts.Value `tfsdk:"timeouts"`
+}
+
+// UserAccountGroupRoleModel 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 UserAccountGroupRoleModel struct {
+ AccountGroupID types.String `tfsdk:"account_group_id"`
+ RoleIds types.Set `tfsdk:"role_ids"`
+}
+
+// userAccountGroupRoleAttrTypes describes UserAccountGroupRoleModel 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.
+var userAccountGroupRoleAttrTypes = map[string]attr.Type{
+ "account_group_id": types.StringType,
+ "role_ids": types.SetType{ElemType: types.StringType},
+}
+
+var userAccountGroupRoleObjectType = types.ObjectType{AttrTypes: userAccountGroupRoleAttrTypes}
diff --git a/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go
new file mode 100644
index 00000000..0c732447
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource.go
@@ -0,0 +1,138 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-framework/path"
+ "github.com/hashicorp/terraform-plugin-framework/resource"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
+ "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
+ "github.com/hashicorp/terraform-plugin-framework/types"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/client"
+ commonschema "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/schema"
+)
+
+const (
+ // ResourceName is the Terraform type this resource registers as.
+ ResourceName = "thousandeyes_user"
+
+ // Default per-operation timeouts, in seconds. A practitioner overrides them
+ // with the resource's timeouts block.
+ CreateTimeout = 180
+ ReadTimeout = 180
+ UpdateTimeout = 180
+ DeleteTimeout = 180
+)
+
+// 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 = (*UserResource)(nil)
+ _ resource.ResourceWithConfigure = (*UserResource)(nil)
+ _ resource.ResourceWithImportState = (*UserResource)(nil)
+)
+
+// NewUserResource returns the thousandeyes_user resource.
+func NewUserResource() resource.Resource {
+ return &UserResource{}
+}
+
+// UserResource implements the thousandeyes_user resource.
+type UserResource struct {
+ client *thousandeyes.Client
+}
+
+// Metadata returns the resource type name.
+func (r *UserResource) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) {
+ resp.TypeName = ResourceName
+}
+
+// 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)
+}
+
+// ImportState maps a terraform import into state.
+func (r *UserResource) 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 *UserResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
+ resp.Schema = schema.Schema{
+ MarkdownDescription: "Retrieve user.",
+ Attributes: map[string]schema.Attribute{
+ "account_group_roles": schema.SetNestedAttribute{
+ NestedObject: schema.NestedAttributeObject{
+ Attributes: map[string]schema.Attribute{
+ "account_group_id": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "Unique ID of the account group.",
+ },
+ "role_ids": schema.SetAttribute{
+ ElementType: types.StringType,
+ Optional: true,
+ MarkdownDescription: "Unique role IDs to grant in the account group.",
+ },
+ },
+ },
+ Optional: true,
+ MarkdownDescription: "Role assignments to write: account group id plus role ids. The response echoes assignments " +
+ "as expanded objects under allAccountGroupRoles, never in this shape, so state carries the " +
+ "configured value. The API refuses a user without at least one role (live probe, " +
+ "2026-08-03). The API enforces this field's presence, " +
+ "which the specification does not declare. ",
+ },
+ "all_account_group_role_ids": schema.SetAttribute{
+ ElementType: types.StringType,
+ Optional: true,
+ MarkdownDescription: "Unique IDs representing the roles. The response echoes roles as nested objects, never as " +
+ "this flat id list; state carries the configured value. Omitted from generated fixtures: " +
+ "its members are live role ids, and account_group_roles already carries the assignment the " +
+ "fixtures exercise.",
+ },
+ "date_registered": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "UTC date the user registered their account (ISO date-time format).",
+ },
+ "email": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "User's email address. The API enforces this field's " +
+ "presence, which the specification does not declare. ",
+ },
+ "last_login": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "UTC last login of the user (ISO date-time format).",
+ },
+ "login_account_group_id": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "Unique ID of the login account group. The response echoes loginAccountGroup as a nested " +
+ "object, never this id; state carries the configured value. The API refuses a user without " +
+ "a login account group (live probe, 2026-08-03). The " +
+ "API enforces this field's presence, which the specification does not declare. ",
+ },
+ "name": schema.StringAttribute{
+ Optional: true,
+ MarkdownDescription: "User's display name. Required-by-API by curation: the sweeper's field, unprobeable by " +
+ "omission.",
+ },
+ "id": schema.StringAttribute{
+ Computed: true,
+ MarkdownDescription: "Unique ID of the user.\n\nNamed `id` per the import convention; the wire field stays uid.",
+ PlanModifiers: []planmodifier.String{
+ stringplanmodifier.UseStateForUnknown(),
+ },
+ },
+ },
+ Blocks: map[string]schema.Block{
+ "timeouts": commonschema.ResourceTimeouts(ctx),
+ },
+ }
+}
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
new file mode 100644
index 00000000..2a50b8b0
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/resource_acceptance_test.go
@@ -0,0 +1,98 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user_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/users/v7/user"
+)
+
+// The resource under test, and the helper that asks the API whether it is really there.
+const address = "thousandeyes_user.test"
+
+var testResource = user.UserTestResource{}
+
+// TestAccResourceUser_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 TestAccResourceUser_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_ADMIN") == "" {
+ t.Skipf("set TFPFGEN_ACC_ADMIN 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_user", 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("email").Exists(),
+ check.That(address).Key("name").HasValue("tfacc-name"),
+ ),
+ },
+ // 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.
+ // account_group_roles: it is write-only, carried from configuration, which an import does not
+ // have
+ // all_account_group_role_ids: it is write-only, carried from configuration, which an import
+ // does not have
+ // login_account_group_id: it is write-only, carried from configuration, which an import does
+ // not have
+ ImportStateVerifyIgnore: []string{"account_group_roles", "all_account_group_role_ids", "login_account_group_id"},
+ },
+ },
+ })
+}
+
+// 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/users/v7/user/state.go b/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go
new file mode 100644
index 00000000..f27b790c
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/state.go
@@ -0,0 +1,35 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+
+ "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes/thousandeyes_api/users"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/services/common/convert"
+)
+
+// mapRemoteStateToTerraform maps the API's response onto Terraform state.
+//
+// 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 *UserResourceModel, remote *users.UserDetail) {
+ if remote == nil {
+ tflog.Debug(ctx, "remote resource is nil, leaving state untouched", map[string]any{
+ "resource": ResourceName,
+ })
+ return
+ }
+
+ data.DateRegistered = convert.PtrStringToFramework(remote.DateRegistered)
+ data.Email = convert.PtrStringToFramework(remote.Email)
+ data.LastLogin = convert.PtrStringToFramework(remote.LastLogin)
+ data.Name = convert.PtrStringToFramework(remote.Name)
+ data.ID = convert.PtrStringToFramework(remote.Uid)
+
+ tflog.Debug(ctx, "mapped remote state", map[string]any{"resource": ResourceName})
+}
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
new file mode 100644
index 00000000..c72249e0
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/test_helper_test.go
@@ -0,0 +1,40 @@
+// Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
+
+package user
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-testing/terraform"
+
+ thousandeyes "github.com/deploymenttheory/go-sdk-thousandeyes/thousandeyes"
+ "github.com/deploymenttheory/terraform-plugin-framework-codegen/pilot/thousandeyes/internal/acceptance/exists"
+)
+
+// UserTestResource answers whether a thousandeyes_user 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 UserTestResource 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 (UserTestResource) Exists(
+ ctx context.Context,
+ state *terraform.InstanceState,
+) (*bool, error) {
+ return exists.Check(ctx, state, func(
+ ctx context.Context,
+ client *thousandeyes.Client,
+ state *terraform.InstanceState,
+ ) error {
+ _, _, err := client.API.Users.GetUser(ctx, state.ID)
+
+ return err
+ })
+}
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
new file mode 100644
index 00000000..0a824473
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/maximal.tf
@@ -0,0 +1,32 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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.
+#
+# Regenerated and policed, deliberately. This file used to be a hand-owned scaffold, and
+# hand edits are how its values drifted from the generated assertions -- the checks derive
+# from the blueprint, so the blueprint is where a value is corrected: an accFixture hint for
+# 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_user" "test" {
+ # Where a value came from.
+ #
+ # account_group_roles: curated in the blueprint's accFixture; the generator cannot derive it
+ #
+ # email: curated in the blueprint's accFixture; the generator cannot derive it
+ #
+ # login_account_group_id: curated in the blueprint's accFixture; the generator cannot derive
+ # it
+ #
+ # Not filled in, because no correct value could be derived. Each of these is optional, so this
+ # configuration is valid as it stands -- but it is testing less than it could.
+ #
+ # all_account_group_role_ids: curated omission; individually valid, refused in combination --
+ # see the attribute's documentation
+ account_group_roles = [{ account_group_id = "281474976742769", role_ids = ["281474976759598"] }]
+ email = "dafydd.watkins+tfacc@deploymenttheory.com"
+ login_account_group_id = "281474976742769"
+ name = "tfacc-name"
+}
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
new file mode 100644
index 00000000..699e7a64
--- /dev/null
+++ b/pilot/thousandeyes/internal/services/resources/users/v7/user/testdata/minimal.tf
@@ -0,0 +1,26 @@
+# Code generated by tfpluginframeworkgen from blueprints/thousandeyes
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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_user" "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.
+ #
+ # account_group_roles: curated in the blueprint's accFixture; the generator cannot derive it
+ #
+ # email: curated in the blueprint's accFixture; the generator cannot derive it
+ #
+ # login_account_group_id: curated in the blueprint's accFixture; the generator cannot derive
+ # it
+ account_group_roles = [{ account_group_id = "281474976742769", role_ids = ["281474976759598"] }]
+ email = "dafydd.watkins+tfacc@deploymenttheory.com"
+ login_account_group_id = "281474976742769"
+ name = "tfacc-name"
+}
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 3046961f..842d6a49 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_voice
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 fc3296d3..4376144e 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_voice
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 b230cd54..8bb892e0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 d713f2da..5b9acba9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_voice
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 7b345f42..1ca97361 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_voice
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 2c978301..08ac63ee 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_voice
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 098276d9..d0c130d9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_web_transaction
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 c5b39ec8..6e55364d 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_web_transaction
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 40024ce2..d157a980 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 2eab00f9..6c33a8cf 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_web_transaction
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 7e637ca6..6494e33f 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 96abfcc7..6cd479a5 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
package tests_web_transaction
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 dc6a3222..af9a2cef 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+// (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 dd37847c..1b726de0 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). 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 849cb232..9aaefab9 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:871c3b053ae073a64e0d70d624eefe6f67179a2717a44566972b2e35df2ff285). DO NOT EDIT.
+# (sha256:cd019f12be32331be882ccdbb92a8c651d1dd5bad8c0cb209bba818d3b11f7b4). DO NOT EDIT.
# The smallest configuration this resource accepts: its required attributes and nothing else.
#
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/facts.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/facts.json
new file mode 100644
index 00000000..cca5919a
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/facts.json
@@ -0,0 +1,104 @@
+[
+ {
+ "resource": "account_group",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-account-groups-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "account_group",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=accountGroups"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-account-groups",
+ "003-get-v7-account-groups",
+ "004-get-v7-account-groups",
+ "005-get-v7-account-groups",
+ "006-get-v7-account-groups",
+ "007-get-v7-account-groups",
+ "008-get-v7-account-groups",
+ "009-get-v7-account-groups",
+ "024-get-v7-account-groups"
+ ],
+ "rationale": "the list response wraps its items under \"accountGroups\""
+ },
+ {
+ "resource": "account_group",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-account-groups-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "account_group",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-account-groups",
+ "003-get-v7-account-groups",
+ "004-get-v7-account-groups",
+ "005-get-v7-account-groups",
+ "006-get-v7-account-groups",
+ "007-get-v7-account-groups",
+ "008-get-v7-account-groups",
+ "009-get-v7-account-groups",
+ "024-get-v7-account-groups"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "account_group",
+ "jsonPath": "accountGroupName",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "012-post-v7-account-groups"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "account_group",
+ "jsonPath": "accountGroupName",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-get-v7-account-groups-281474976748147"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ }
+]
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json
new file mode 100644
index 00000000..daad6393
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/001-get-v7-account-groups.json
@@ -0,0 +1,41 @@
+{
+ "id": "001-get-v7-account-groups",
+ "seq": 1,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "query": {
+ "tfpfgen_probe": [
+ "1"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups?tfpfgen_probe=1"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json
new file mode 100644
index 00000000..3b303d5b
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/002-get-v7-account-groups-999999999.json
@@ -0,0 +1,25 @@
+{
+ "id": "002-get-v7-account-groups-999999999",
+ "seq": 2,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups/999999999",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 404,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/account-groups/999999999",
+ "status": 404,
+ "title": "404 Not Found",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json
new file mode 100644
index 00000000..4d13529e
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/003-get-v7-account-groups.json
@@ -0,0 +1,36 @@
+{
+ "id": "003-get-v7-account-groups",
+ "seq": 3,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json
new file mode 100644
index 00000000..319a405b
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/004-get-v7-account-groups.json
@@ -0,0 +1,36 @@
+{
+ "id": "004-get-v7-account-groups",
+ "seq": 4,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json
new file mode 100644
index 00000000..749c161c
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/005-get-v7-account-groups.json
@@ -0,0 +1,41 @@
+{
+ "id": "005-get-v7-account-groups",
+ "seq": 5,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "query": {
+ "limit": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups?limit=not-a-number"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json
new file mode 100644
index 00000000..aec5e56e
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/006-get-v7-account-groups.json
@@ -0,0 +1,41 @@
+{
+ "id": "006-get-v7-account-groups",
+ "seq": 6,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "query": {
+ "max": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups?max=not-a-number"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json
new file mode 100644
index 00000000..fb77f1ba
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/007-get-v7-account-groups.json
@@ -0,0 +1,41 @@
+{
+ "id": "007-get-v7-account-groups",
+ "seq": 7,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "query": {
+ "offset": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups?offset=not-a-number"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json
new file mode 100644
index 00000000..f0cf4cfb
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/008-get-v7-account-groups.json
@@ -0,0 +1,41 @@
+{
+ "id": "008-get-v7-account-groups",
+ "seq": 8,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "query": {
+ "page": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups?page=not-a-number"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json
new file mode 100644
index 00000000..816a48d6
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/009-get-v7-account-groups.json
@@ -0,0 +1,36 @@
+{
+ "id": "009-get-v7-account-groups",
+ "seq": 9,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json
new file mode 100644
index 00000000..979b0a22
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/010-post-v7-account-groups.json
@@ -0,0 +1,35 @@
+{
+ "id": "010-post-v7-account-groups",
+ "seq": 10,
+ "request": {
+ "method": "POST",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupName": "tfpfgen-probe-write-required-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/account-groups/281474976748146",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748146"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-required-1",
+ "aid": "281474976748146",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json
new file mode 100644
index 00000000..78016895
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/011-delete-v7-account-groups-281474976748146.json
@@ -0,0 +1,25 @@
+{
+ "id": "011-delete-v7-account-groups-281474976748146",
+ "seq": 11,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/account-groups/281474976748146",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/account-groups/281474976748146",
+ "status": 400,
+ "title": "There were some errors in your request, please correct them before trying again. You do not have permissions do delete this account..",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json
new file mode 100644
index 00000000..61447630
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/012-post-v7-account-groups.json
@@ -0,0 +1,35 @@
+{
+ "id": "012-post-v7-account-groups",
+ "seq": 12,
+ "request": {
+ "method": "POST",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupName": "tfpfgen-probe-write-writable-returned-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/account-groups/281474976748147",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748147"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-writable-returned-1",
+ "aid": "281474976748147",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json
new file mode 100644
index 00000000..151c6496
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/013-get-v7-account-groups-281474976748147.json
@@ -0,0 +1,30 @@
+{
+ "id": "013-get-v7-account-groups-281474976748147",
+ "seq": 13,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups/281474976748147",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748147"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-writable-returned-1",
+ "aid": "281474976748147",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json
new file mode 100644
index 00000000..cf67f847
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/014-delete-v7-account-groups-281474976748147.json
@@ -0,0 +1,18 @@
+{
+ "id": "014-delete-v7-account-groups-281474976748147",
+ "seq": 14,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/account-groups/281474976748147",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json
new file mode 100644
index 00000000..92cb716e
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/015-post-v7-account-groups.json
@@ -0,0 +1,35 @@
+{
+ "id": "015-post-v7-account-groups",
+ "seq": 15,
+ "request": {
+ "method": "POST",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/account-groups/281474976748148",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748148"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1",
+ "aid": "281474976748148",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..f9d00da3
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/016-get-v7-account-groups-281474976748148.json
@@ -0,0 +1,30 @@
+{
+ "id": "016-get-v7-account-groups-281474976748148",
+ "seq": 16,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748148"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1",
+ "aid": "281474976748148",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..d2a1162c
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/017-put-v7-account-groups-281474976748148.json
@@ -0,0 +1,35 @@
+{
+ "id": "017-put-v7-account-groups-281474976748148",
+ "seq": 17,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748148"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1",
+ "accountToken": "fyckefbp3thc4c7xn2gpmrpc26x364hn",
+ "aid": "281474976748148",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..77d1d155
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/018-get-v7-account-groups-281474976748148.json
@@ -0,0 +1,30 @@
+{
+ "id": "018-get-v7-account-groups-281474976748148",
+ "seq": 18,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748148"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1",
+ "aid": "281474976748148",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..40177301
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/019-put-v7-account-groups-281474976748148.json
@@ -0,0 +1,29 @@
+{
+ "id": "019-put-v7-account-groups-281474976748148",
+ "seq": 19,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1"
+ }
+ },
+ "response": {
+ "status": 403,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/account-groups/281474976748148",
+ "status": 403,
+ "title": "403 Forbidden\nPlease ensure you are using the correct authentication token, and you have the correct role.\nYou do not have permissions to update this Account Group",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..9dd4aa84
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/020-get-v7-account-groups-281474976748148.json
@@ -0,0 +1,30 @@
+{
+ "id": "020-get-v7-account-groups-281474976748148",
+ "seq": 20,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups/281474976748148"
+ }
+ },
+ "accountGroupName": "tfpfgen-probe-write-rehearsal-1",
+ "aid": "281474976748148",
+ "isCurrentAccountGroup": false,
+ "isDefaultAccountGroup": false
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..e0512dd7
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/021-delete-v7-account-groups-281474976748148.json
@@ -0,0 +1,25 @@
+{
+ "id": "021-delete-v7-account-groups-281474976748148",
+ "seq": 21,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/account-groups/281474976748148",
+ "status": 400,
+ "title": "There were some errors in your request, please correct them before trying again. You do not have permissions do delete this account..",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json
new file mode 100644
index 00000000..e22ed203
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/022-delete-v7-account-groups-281474976748148.json
@@ -0,0 +1,18 @@
+{
+ "id": "022-delete-v7-account-groups-281474976748148",
+ "seq": 22,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/account-groups/281474976748148",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json
new file mode 100644
index 00000000..c90aee3a
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/023-delete-v7-account-groups-281474976748146.json
@@ -0,0 +1,18 @@
+{
+ "id": "023-delete-v7-account-groups-281474976748146",
+ "seq": 23,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/account-groups/281474976748146",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json
new file mode 100644
index 00000000..f1e63c2e
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/interactions/024-get-v7-account-groups.json
@@ -0,0 +1,36 @@
+{
+ "id": "024-get-v7-account-groups",
+ "seq": 24,
+ "request": {
+ "method": "GET",
+ "path": "/v7/account-groups",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/account-groups"
+ }
+ },
+ "accountGroups": [
+ {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769",
+ "isCurrentAccountGroup": true,
+ "isDefaultAccountGroup": true,
+ "orgId": "281474976717041",
+ "organizationName": "Lloyds Banking Group - Dev"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json
new file mode 100644
index 00000000..3d4a4fbf
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/metadata.json
@@ -0,0 +1,11 @@
+{
+ "provider": "thousandeyes",
+ "resource": "account_group",
+ "apiVersion": "7.0.98",
+ "host": "api.thousandeyes.com",
+ "basePath": "/v7",
+ "namePrefix": "tfpfgen-probe",
+ "interactions": 24,
+ "sha256": "bc8c6982b3c485d99d76c935eedc086a5403417da36c41eae0aab15f1553bb53",
+ "probeVersion": "dev"
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/plan.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/plan.json
new file mode 100644
index 00000000..76bf67bb
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/plan.json
@@ -0,0 +1,14 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "accountGroupName": "CURATE_ME-stamped-by-probe"
+ }
+ }
+ ],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 25
+ }
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json
new file mode 100644
index 00000000..4b1cd9f1
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/rehearsal.json
@@ -0,0 +1,10 @@
+[
+ {
+ "minimal": {
+ "accountGroupName": "tfacc-account-group-name"
+ },
+ "maximal": {
+ "accountGroupName": "tfacc-account-group-name"
+ }
+ }
+]
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/report.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/report.json
new file mode 100644
index 00000000..2d7cf533
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/report.json
@@ -0,0 +1,347 @@
+{
+ "profile": {
+ "host": "api.thousandeyes.com",
+ "mode": "record",
+ "sandbox": true,
+ "assertionsPassed": [
+ "mode",
+ "allowMutations",
+ "sandbox",
+ "sandboxEvidence",
+ "namePrefix",
+ "tokenEnv",
+ "noCredentialInProfile",
+ "https",
+ "endpointHostSuffix",
+ "canMutate",
+ "plan",
+ "noSnapshotOverwrite",
+ "maxExistingObjects (1 < 25)"
+ ]
+ },
+ "facts": [
+ {
+ "resource": "account_group",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-account-groups-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "account_group",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=accountGroups"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-account-groups",
+ "003-get-v7-account-groups",
+ "004-get-v7-account-groups",
+ "005-get-v7-account-groups",
+ "006-get-v7-account-groups",
+ "007-get-v7-account-groups",
+ "008-get-v7-account-groups",
+ "009-get-v7-account-groups",
+ "024-get-v7-account-groups"
+ ],
+ "rationale": "the list response wraps its items under \"accountGroups\""
+ },
+ {
+ "resource": "account_group",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-account-groups-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "account_group",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-account-groups",
+ "003-get-v7-account-groups",
+ "004-get-v7-account-groups",
+ "005-get-v7-account-groups",
+ "006-get-v7-account-groups",
+ "007-get-v7-account-groups",
+ "008-get-v7-account-groups",
+ "009-get-v7-account-groups",
+ "024-get-v7-account-groups"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "account_group",
+ "jsonPath": "accountGroupName",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "012-post-v7-account-groups"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "account_group",
+ "jsonPath": "accountGroupName",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-get-v7-account-groups-281474976748147"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ }
+ ],
+ "notes": [
+ {
+ "resource": "account_group",
+ "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": "account_group",
+ "probe": "read.volatile",
+ "message": "no existing object to read repeatedly, so volatility was not observed"
+ },
+ {
+ "resource": "account_group",
+ "probe": "read.returned-weak",
+ "message": "no existing object to read, so no field presence was observed"
+ },
+ {
+ "resource": "account_group",
+ "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": "account_group",
+ "probe": "write.server-default",
+ "message": "no fixture leaves a sendable field unset, so there is no omitted field whose default could be observed"
+ },
+ {
+ "resource": "account_group",
+ "probe": "write.update-style",
+ "message": "no fixture sets a field that can safely be omitted from an update; the name field must stay in every request or a cleared name would strand the object"
+ },
+ {
+ "resource": "account_group",
+ "probe": "write.enum",
+ "message": "no sendable field carries documented enum values, so there is no specification claim to check against the API"
+ },
+ {
+ "resource": "account_group",
+ "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": "account_group",
+ "probe": "write.rehearsal",
+ "message": "the run stopped early: a delete failed, so the run stopped creating: deleting 281474976748148 failed (status 400)"
+ },
+ {
+ "resource": "account_group",
+ "jsonPath": "accountGroupName",
+ "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": "account_group",
+ "jsonPath": "accountGroupName",
+ "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": "account_group",
+ "jsonPath": "accountGroupName",
+ "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": "account_group",
+ "jsonPath": "accountGroupName",
+ "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"
+ }
+ ],
+ "probes": [
+ {
+ "name": "read.error-envelope",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 4,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.list-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.not-found-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 2
+ },
+ {
+ "name": "read.returned-weak",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.unknown-param",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.volatile",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.enum",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.immutability",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.normalisation",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.read-your-writes",
+ "kind": "mutating",
+ "status": "skipped",
+ "requests": 0,
+ "facts": 0,
+ "reason": "the run stopped earlier: a delete failed, so the run stopped creating: deleting 281474976748148 failed (status 400)"
+ },
+ {
+ "name": "write.rehearsal",
+ "kind": "mutating",
+ "status": "failed",
+ "requests": 6,
+ "facts": 0,
+ "reason": "a delete failed, so the run stopped creating: deleting 281474976748148 failed (status 400)"
+ },
+ {
+ "name": "write.required",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.server-default",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.side-effect",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.update-style",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.writable-returned",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 2,
+ "facts": 2
+ }
+ ],
+ "budget": {
+ "requests": 22,
+ "maxRequests": 260,
+ "creates": 3,
+ "maxCreates": 25,
+ "deletes": 5,
+ "deleteFailures": 2,
+ "sweepRequests": 2
+ },
+ "sweep": {
+ "ledgerDeletes": 1,
+ "prefixDeletes": 0,
+ "complete": true
+ },
+ "rehearsal": [
+ {
+ "minimal": {
+ "accountGroupName": "tfacc-account-group-name"
+ },
+ "maximal": {
+ "accountGroupName": "tfacc-account-group-name"
+ }
+ }
+ ]
+}
diff --git a/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/subject.json b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/subject.json
new file mode 100644
index 00000000..c33e0db3
--- /dev/null
+++ b/probe-evidence/thousandeyes/account_group/7.0.98-t1785772648205/subject.json
@@ -0,0 +1,163 @@
+{
+ "resource": "account_group",
+ "collectionTemplate": "/account-groups",
+ "itemTemplate": "/account-groups/{id}",
+ "create": {
+ "method": "POST",
+ "pathTemplate": "/account-groups"
+ },
+ "read": {
+ "method": "GET",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "update": {
+ "method": "PUT",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "delete": {
+ "method": "DELETE",
+ "pathTemplate": "/account-groups/{id}"
+ },
+ "fields": [
+ {
+ "jsonPath": "accountGroupName",
+ "attribute": "account_group_name",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true
+ }
+ },
+ {
+ "jsonPath": "aid",
+ "attribute": "id",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "isCurrentAccountGroup",
+ "attribute": "is_current_account_group",
+ "kind": "bool",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "isDefaultAccountGroup",
+ "attribute": "is_default_account_group",
+ "kind": "bool",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "orgId",
+ "attribute": "org_id",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "organizationName",
+ "attribute": "organization_name",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users",
+ "attribute": "users",
+ "kind": "set_nested",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.dateRegistered",
+ "attribute": "date_registered",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false,
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ {
+ "jsonPath": "users.email",
+ "attribute": "email",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false,
+ "constraints": {
+ "format": "email"
+ }
+ },
+ {
+ "jsonPath": "users.lastLogin",
+ "attribute": "last_login",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false,
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ {
+ "jsonPath": "users.name",
+ "attribute": "name",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.roles",
+ "attribute": "roles",
+ "kind": "set_nested",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.roles.hasManagementPermissions",
+ "attribute": "has_management_permissions",
+ "kind": "bool",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.roles.isBuiltin",
+ "attribute": "is_builtin",
+ "kind": "bool",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.roles.name",
+ "attribute": "name",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.roles.roleId",
+ "attribute": "role_id",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "users.uid",
+ "attribute": "uid",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ }
+ ],
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "idField": "aid",
+ "nameField": "accountGroupName",
+ "evidenceRev": 1
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/facts.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/facts.json
new file mode 100644
index 00000000..fed2a8f1
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/facts.json
@@ -0,0 +1,186 @@
+[
+ {
+ "resource": "role",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-roles-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "role",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=roles"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-roles",
+ "003-get-v7-roles",
+ "004-get-v7-roles",
+ "005-get-v7-roles",
+ "006-get-v7-roles",
+ "007-get-v7-roles",
+ "008-get-v7-roles",
+ "009-get-v7-roles",
+ "029-get-v7-roles"
+ ],
+ "rationale": "the list response wraps its items under \"roles\""
+ },
+ {
+ "resource": "role",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-roles-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "role",
+ "field": "policy.readBack",
+ "value": {
+ "readBack": {
+ "reason": "every one of 6 read(s) immediately after a create succeeded on the first attempt"
+ }
+ },
+ "confidence": "inferred",
+ "probe": "write.read-your-writes",
+ "evidence": [
+ "014-get-v7-roles-281474976765325",
+ "018-get-v7-roles-281474976765326",
+ "020-get-v7-roles-281474976765326",
+ "022-get-v7-roles-281474976765326",
+ "025-get-v7-roles-281474976765327",
+ "027-get-v7-roles-281474976765327"
+ ],
+ "rationale": "6 object(s) were read immediately after creation and every first read succeeded",
+ "alternatives": [
+ "a consistency window measured on an idle sandbox is not production's; the interval is a floor rather than a property of the real system"
+ ]
+ },
+ {
+ "resource": "role",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-roles",
+ "003-get-v7-roles",
+ "004-get-v7-roles",
+ "005-get-v7-roles",
+ "006-get-v7-roles",
+ "007-get-v7-roles",
+ "008-get-v7-roles",
+ "009-get-v7-roles",
+ "029-get-v7-roles"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "role",
+ "jsonPath": "name",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-post-v7-roles"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "name",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "014-get-v7-roles-281474976765325"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "011-post-v7-roles"
+ ],
+ "rationale": "a create omitting this field was refused with 500, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-post-v7-roles"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "014-get-v7-roles-281474976765325"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnUpdate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.rehearsal",
+ "evidence": [
+ "019-put-v7-roles-281474976765326"
+ ],
+ "rationale": "the update response carried the field it was sent"
+ }
+]
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json
new file mode 100644
index 00000000..5804504e
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/001-get-v7-roles.json
@@ -0,0 +1,51 @@
+{
+ "id": "001-get-v7-roles",
+ "seq": 1,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "query": {
+ "tfpfgen_probe": [
+ "1"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles?tfpfgen_probe=1"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json
new file mode 100644
index 00000000..fd4c096f
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/002-get-v7-roles-999999999.json
@@ -0,0 +1,25 @@
+{
+ "id": "002-get-v7-roles-999999999",
+ "seq": 2,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/999999999",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 404,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/roles/999999999",
+ "status": 404,
+ "title": "404 Not Found",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json
new file mode 100644
index 00000000..8fc8e394
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/003-get-v7-roles.json
@@ -0,0 +1,46 @@
+{
+ "id": "003-get-v7-roles",
+ "seq": 3,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json
new file mode 100644
index 00000000..2b4ad97f
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/004-get-v7-roles.json
@@ -0,0 +1,46 @@
+{
+ "id": "004-get-v7-roles",
+ "seq": 4,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json
new file mode 100644
index 00000000..b1b0a1ee
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/005-get-v7-roles.json
@@ -0,0 +1,51 @@
+{
+ "id": "005-get-v7-roles",
+ "seq": 5,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "query": {
+ "limit": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles?limit=not-a-number"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json
new file mode 100644
index 00000000..70edaac7
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/006-get-v7-roles.json
@@ -0,0 +1,51 @@
+{
+ "id": "006-get-v7-roles",
+ "seq": 6,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "query": {
+ "max": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles?max=not-a-number"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json
new file mode 100644
index 00000000..596ec21f
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/007-get-v7-roles.json
@@ -0,0 +1,51 @@
+{
+ "id": "007-get-v7-roles",
+ "seq": 7,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "query": {
+ "offset": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles?offset=not-a-number"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json
new file mode 100644
index 00000000..9f91f4bc
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/008-get-v7-roles.json
@@ -0,0 +1,51 @@
+{
+ "id": "008-get-v7-roles",
+ "seq": 8,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "query": {
+ "page": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles?page=not-a-number"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json
new file mode 100644
index 00000000..a9301d4a
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/009-get-v7-roles.json
@@ -0,0 +1,46 @@
+{
+ "id": "009-get-v7-roles",
+ "seq": 9,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json
new file mode 100644
index 00000000..33031e5d
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/010-post-v7-roles.json
@@ -0,0 +1,52 @@
+{
+ "id": "010-post-v7-roles",
+ "seq": 10,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-required-1",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/roles/281474976765324",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765324"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-required-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765324"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json
new file mode 100644
index 00000000..6018d059
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/011-post-v7-roles.json
@@ -0,0 +1,29 @@
+{
+ "id": "011-post-v7-roles",
+ "seq": 11,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-required-2"
+ }
+ },
+ "response": {
+ "status": 500,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/roles",
+ "status": 500,
+ "title": "500 Internal Server Error\nPlease contact support@thousandeyes.com if the problem persists.",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json
new file mode 100644
index 00000000..e873b7b3
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/012-delete-v7-roles-281474976765324.json
@@ -0,0 +1,18 @@
+{
+ "id": "012-delete-v7-roles-281474976765324",
+ "seq": 12,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/roles/281474976765324",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json
new file mode 100644
index 00000000..98f36ef7
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/013-post-v7-roles.json
@@ -0,0 +1,52 @@
+{
+ "id": "013-post-v7-roles",
+ "seq": 13,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-writable-returned-1",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/roles/281474976765325",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765325"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-writable-returned-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765325"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json
new file mode 100644
index 00000000..c12abadf
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/014-get-v7-roles-281474976765325.json
@@ -0,0 +1,43 @@
+{
+ "id": "014-get-v7-roles-281474976765325",
+ "seq": 14,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765325",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765325"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-writable-returned-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765325"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json
new file mode 100644
index 00000000..9379db59
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/015-delete-v7-roles-281474976765325.json
@@ -0,0 +1,18 @@
+{
+ "id": "015-delete-v7-roles-281474976765325",
+ "seq": 15,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/roles/281474976765325",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json
new file mode 100644
index 00000000..f19ddd87
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/016-post-v7-roles.json
@@ -0,0 +1,34 @@
+{
+ "id": "016-post-v7-roles",
+ "seq": 16,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-normalisation-3",
+ "permissions": [
+ "c",
+ "b",
+ "a"
+ ]
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/roles",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json
new file mode 100644
index 00000000..4b21dd25
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/017-post-v7-roles.json
@@ -0,0 +1,52 @@
+{
+ "id": "017-post-v7-roles",
+ "seq": 17,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/roles/281474976765326",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json
new file mode 100644
index 00000000..38cca143
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/018-get-v7-roles-281474976765326.json
@@ -0,0 +1,43 @@
+{
+ "id": "018-get-v7-roles-281474976765326",
+ "seq": 18,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json
new file mode 100644
index 00000000..e8805874
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/019-put-v7-roles-281474976765326.json
@@ -0,0 +1,51 @@
+{
+ "id": "019-put-v7-roles-281474976765326",
+ "seq": 19,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json
new file mode 100644
index 00000000..3d61c1d5
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/020-get-v7-roles-281474976765326.json
@@ -0,0 +1,43 @@
+{
+ "id": "020-get-v7-roles-281474976765326",
+ "seq": 20,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json
new file mode 100644
index 00000000..8ec326af
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/021-put-v7-roles-281474976765326.json
@@ -0,0 +1,51 @@
+{
+ "id": "021-put-v7-roles-281474976765326",
+ "seq": 21,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json
new file mode 100644
index 00000000..7c7b9a2d
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/022-get-v7-roles-281474976765326.json
@@ -0,0 +1,43 @@
+{
+ "id": "022-get-v7-roles-281474976765326",
+ "seq": 22,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765326"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765326"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json
new file mode 100644
index 00000000..fbfbee40
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/023-delete-v7-roles-281474976765326.json
@@ -0,0 +1,18 @@
+{
+ "id": "023-delete-v7-roles-281474976765326",
+ "seq": 23,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/roles/281474976765326",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json
new file mode 100644
index 00000000..1a63d011
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/024-post-v7-roles.json
@@ -0,0 +1,52 @@
+{
+ "id": "024-post-v7-roles",
+ "seq": 24,
+ "request": {
+ "method": "POST",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/roles/281474976765327",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765327"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765327"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json
new file mode 100644
index 00000000..8225a344
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/025-get-v7-roles-281474976765327.json
@@ -0,0 +1,43 @@
+{
+ "id": "025-get-v7-roles-281474976765327",
+ "seq": 25,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765327",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765327"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765327"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json
new file mode 100644
index 00000000..02590612
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/026-put-v7-roles-281474976765327.json
@@ -0,0 +1,51 @@
+{
+ "id": "026-put-v7-roles-281474976765327",
+ "seq": 26,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/roles/281474976765327",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765327"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765327"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json
new file mode 100644
index 00000000..ce55eee2
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/027-get-v7-roles-281474976765327.json
@@ -0,0 +1,43 @@
+{
+ "id": "027-get-v7-roles-281474976765327",
+ "seq": 27,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles/281474976765327",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles/281474976765327"
+ }
+ },
+ "isBuiltin": false,
+ "name": "tfpfgen-probe-write-rehearsal-2",
+ "permissions": [
+ {
+ "isManagementPermission": false,
+ "label": "Assign email address of users to alerts",
+ "permission": "ALERTS_READ_ACCOUNT_USERS",
+ "permissionId": "1"
+ },
+ {
+ "isManagementPermission": false,
+ "label": "Download Endpoint Agents",
+ "permission": "AGENTS_DOWNLOAD_CUSTOM_EYEBROW",
+ "permissionId": "2"
+ }
+ ],
+ "roleId": "281474976765327"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json
new file mode 100644
index 00000000..0f9e5a3d
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/028-delete-v7-roles-281474976765327.json
@@ -0,0 +1,18 @@
+{
+ "id": "028-delete-v7-roles-281474976765327",
+ "seq": 28,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/roles/281474976765327",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json
new file mode 100644
index 00000000..c75f09cc
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/interactions/029-get-v7-roles.json
@@ -0,0 +1,46 @@
+{
+ "id": "029-get-v7-roles",
+ "seq": 29,
+ "request": {
+ "method": "GET",
+ "path": "/v7/roles",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/roles"
+ }
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Account Admin",
+ "roleId": "281474976759599"
+ },
+ {
+ "hasManagementPermissions": true,
+ "isBuiltin": true,
+ "name": "Organization Admin",
+ "roleId": "281474976759600"
+ },
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/metadata.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/metadata.json
new file mode 100644
index 00000000..3e893c74
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/metadata.json
@@ -0,0 +1,11 @@
+{
+ "provider": "thousandeyes",
+ "resource": "role",
+ "apiVersion": "7.0.98",
+ "host": "api.thousandeyes.com",
+ "basePath": "/v7",
+ "namePrefix": "tfpfgen-probe",
+ "interactions": 29,
+ "sha256": "e74d627b46a1a6867030b465870cf0fd5262dfd71ef66fad562ffb2fa3769a00",
+ "probeVersion": "dev"
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/plan.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/plan.json
new file mode 100644
index 00000000..87870387
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/plan.json
@@ -0,0 +1,18 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "name": "CURATE_ME-stamped-by-probe",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ }
+ ],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 25
+ }
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json
new file mode 100644
index 00000000..d88f0dc0
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/rehearsal.json
@@ -0,0 +1,18 @@
+[
+ {
+ "minimal": {
+ "name": "tfacc-name",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ },
+ "maximal": {
+ "name": "tfacc-name",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ }
+]
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/report.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/report.json
new file mode 100644
index 00000000..dc50e093
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/report.json
@@ -0,0 +1,451 @@
+{
+ "profile": {
+ "host": "api.thousandeyes.com",
+ "mode": "record",
+ "sandbox": true,
+ "assertionsPassed": [
+ "mode",
+ "allowMutations",
+ "sandbox",
+ "sandboxEvidence",
+ "namePrefix",
+ "tokenEnv",
+ "noCredentialInProfile",
+ "https",
+ "endpointHostSuffix",
+ "canMutate",
+ "plan",
+ "noSnapshotOverwrite",
+ "maxExistingObjects (3 < 25)"
+ ]
+ },
+ "facts": [
+ {
+ "resource": "role",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-roles-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "role",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=roles"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-roles",
+ "003-get-v7-roles",
+ "004-get-v7-roles",
+ "005-get-v7-roles",
+ "006-get-v7-roles",
+ "007-get-v7-roles",
+ "008-get-v7-roles",
+ "009-get-v7-roles",
+ "029-get-v7-roles"
+ ],
+ "rationale": "the list response wraps its items under \"roles\""
+ },
+ {
+ "resource": "role",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-roles-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "role",
+ "field": "policy.readBack",
+ "value": {
+ "readBack": {
+ "reason": "every one of 6 read(s) immediately after a create succeeded on the first attempt"
+ }
+ },
+ "confidence": "inferred",
+ "probe": "write.read-your-writes",
+ "evidence": [
+ "014-get-v7-roles-281474976765325",
+ "018-get-v7-roles-281474976765326",
+ "020-get-v7-roles-281474976765326",
+ "022-get-v7-roles-281474976765326",
+ "025-get-v7-roles-281474976765327",
+ "027-get-v7-roles-281474976765327"
+ ],
+ "rationale": "6 object(s) were read immediately after creation and every first read succeeded",
+ "alternatives": [
+ "a consistency window measured on an idle sandbox is not production's; the interval is a floor rather than a property of the real system"
+ ]
+ },
+ {
+ "resource": "role",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-roles",
+ "003-get-v7-roles",
+ "004-get-v7-roles",
+ "005-get-v7-roles",
+ "006-get-v7-roles",
+ "007-get-v7-roles",
+ "008-get-v7-roles",
+ "009-get-v7-roles",
+ "029-get-v7-roles"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "role",
+ "jsonPath": "name",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-post-v7-roles"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "name",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "014-get-v7-roles-281474976765325"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "011-post-v7-roles"
+ ],
+ "rationale": "a create omitting this field was refused with 500, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnCreate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "013-post-v7-roles"
+ ],
+ "rationale": "every create response carried the field it was sent"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnRead",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.writable-returned",
+ "evidence": [
+ "014-get-v7-roles-281474976765325"
+ ],
+ "rationale": "the field appeared in the read after 1 create(s)"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "field": "returnedOnUpdate",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.rehearsal",
+ "evidence": [
+ "019-put-v7-roles-281474976765326"
+ ],
+ "rationale": "the update response carried the field it was sent"
+ }
+ ],
+ "notes": [
+ {
+ "resource": "",
+ "probe": "sweep.prefix",
+ "message": "intent \"tfpfgen-probe-write-required-2\" resolved as never created: it has no identifier and a complete collection read does not contain it"
+ },
+ {
+ "resource": "role",
+ "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": "role",
+ "probe": "read.volatile",
+ "message": "no existing object to read repeatedly, so volatility was not observed"
+ },
+ {
+ "resource": "role",
+ "probe": "read.returned-weak",
+ "message": "no existing object to read, so no field presence was observed"
+ },
+ {
+ "resource": "role",
+ "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": "role",
+ "probe": "write.server-default",
+ "message": "no fixture leaves a sendable field unset, so there is no omitted field whose default could be observed"
+ },
+ {
+ "resource": "role",
+ "probe": "write.update-style",
+ "message": "no fixture sets a field that can safely be omitted from an update; the name field must stay in every request or a cleared name would strand the object"
+ },
+ {
+ "resource": "role",
+ "probe": "write.enum",
+ "message": "no sendable field carries documented enum values, so there is no specification claim to check against the API"
+ },
+ {
+ "resource": "role",
+ "probe": "write.normalisation",
+ "message": "the create carrying \"collection order is changed\" was refused with 400 (), so nothing was observed about that transform"
+ },
+ {
+ "resource": "role",
+ "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": "role",
+ "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": "role",
+ "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": "role",
+ "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": "role",
+ "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"
+ },
+ {
+ "resource": "role",
+ "jsonPath": "permissions",
+ "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"
+ }
+ ],
+ "probes": [
+ {
+ "name": "read.error-envelope",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 4,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.list-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.not-found-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 2
+ },
+ {
+ "name": "read.returned-weak",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.unknown-param",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.volatile",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.enum",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.immutability",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.normalisation",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.read-your-writes",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 0,
+ "facts": 1
+ },
+ {
+ "name": "write.rehearsal",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 12,
+ "facts": 1
+ },
+ {
+ "name": "write.required",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 2,
+ "facts": 1
+ },
+ {
+ "name": "write.server-default",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.side-effect",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.update-style",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.writable-returned",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 2,
+ "facts": 4
+ }
+ ],
+ "budget": {
+ "requests": 28,
+ "maxRequests": 260,
+ "creates": 6,
+ "maxCreates": 25,
+ "deletes": 4,
+ "sweepRequests": 1
+ },
+ "sweep": {
+ "ledgerDeletes": 0,
+ "prefixDeletes": 0,
+ "complete": true,
+ "notes": [
+ {
+ "resource": "",
+ "probe": "sweep.prefix",
+ "message": "intent \"tfpfgen-probe-write-required-2\" resolved as never created: it has no identifier and a complete collection read does not contain it"
+ }
+ ]
+ },
+ "rehearsal": [
+ {
+ "minimal": {
+ "name": "tfacc-name",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ },
+ "maximal": {
+ "name": "tfacc-name",
+ "permissions": [
+ "1",
+ "2"
+ ]
+ }
+ }
+ ]
+}
diff --git a/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/subject.json b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/subject.json
new file mode 100644
index 00000000..9b70affc
--- /dev/null
+++ b/probe-evidence/thousandeyes/role/7.0.98-t1785772662063/subject.json
@@ -0,0 +1,67 @@
+{
+ "resource": "role",
+ "collectionTemplate": "/roles",
+ "itemTemplate": "/roles/{id}",
+ "create": {
+ "method": "POST",
+ "pathTemplate": "/roles"
+ },
+ "read": {
+ "method": "GET",
+ "pathTemplate": "/roles/{id}"
+ },
+ "update": {
+ "method": "PUT",
+ "pathTemplate": "/roles/{id}"
+ },
+ "delete": {
+ "method": "DELETE",
+ "pathTemplate": "/roles/{id}"
+ },
+ "fields": [
+ {
+ "jsonPath": "isBuiltin",
+ "attribute": "is_builtin",
+ "kind": "bool",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ },
+ {
+ "jsonPath": "name",
+ "attribute": "name",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true
+ }
+ },
+ {
+ "jsonPath": "permissions",
+ "attribute": "permissions",
+ "kind": "set",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": false
+ }
+ },
+ {
+ "jsonPath": "roleId",
+ "attribute": "id",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ }
+ ],
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "idField": "roleId",
+ "nameField": "name",
+ "evidenceRev": 1
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/facts.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/facts.json
new file mode 100644
index 00000000..24d507d4
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/facts.json
@@ -0,0 +1,143 @@
+[
+ {
+ "resource": "user",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-users-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "user",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=users"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-users",
+ "003-get-v7-users",
+ "004-get-v7-users",
+ "005-get-v7-users",
+ "006-get-v7-users",
+ "007-get-v7-users",
+ "008-get-v7-users",
+ "009-get-v7-users",
+ "029-get-v7-users"
+ ],
+ "rationale": "the list response wraps its items under \"users\""
+ },
+ {
+ "resource": "user",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-users-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "user",
+ "field": "policy.readBack",
+ "value": {
+ "readBack": {
+ "reason": "every one of 2 read(s) immediately after a create succeeded on the first attempt"
+ }
+ },
+ "confidence": "inferred",
+ "probe": "write.read-your-writes",
+ "evidence": [
+ "018-get-v7-users-281474976781821",
+ "025-get-v7-users-281474976781823"
+ ],
+ "rationale": "2 object(s) were read immediately after creation and every first read succeeded",
+ "alternatives": [
+ "a consistency window measured on an idle sandbox is not production's; the interval is a floor rather than a property of the real system"
+ ]
+ },
+ {
+ "resource": "user",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-users",
+ "003-get-v7-users",
+ "004-get-v7-users",
+ "005-get-v7-users",
+ "006-get-v7-users",
+ "007-get-v7-users",
+ "008-get-v7-users",
+ "009-get-v7-users",
+ "029-get-v7-users"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "user",
+ "jsonPath": "accountGroupRoles",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "011-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ },
+ {
+ "resource": "user",
+ "jsonPath": "email",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.required",
+ "evidence": [
+ "012-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400 and the error named the field"
+ },
+ {
+ "resource": "user",
+ "jsonPath": "loginAccountGroupId",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "013-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ }
+]
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json
new file mode 100644
index 00000000..54a1e973
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/001-get-v7-users.json
@@ -0,0 +1,113 @@
+{
+ "id": "001-get-v7-users",
+ "seq": 1,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "query": {
+ "tfpfgen_probe": [
+ "1"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users?tfpfgen_probe=1"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json
new file mode 100644
index 00000000..6ec8cb02
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/002-get-v7-users-999999999.json
@@ -0,0 +1,25 @@
+{
+ "id": "002-get-v7-users-999999999",
+ "seq": 2,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users/999999999",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 404,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users/999999999",
+ "status": 404,
+ "title": "404 Not Found",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json
new file mode 100644
index 00000000..93b9e869
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/003-get-v7-users.json
@@ -0,0 +1,108 @@
+{
+ "id": "003-get-v7-users",
+ "seq": 3,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json
new file mode 100644
index 00000000..39191ab0
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/004-get-v7-users.json
@@ -0,0 +1,108 @@
+{
+ "id": "004-get-v7-users",
+ "seq": 4,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json
new file mode 100644
index 00000000..ffac85b2
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/005-get-v7-users.json
@@ -0,0 +1,113 @@
+{
+ "id": "005-get-v7-users",
+ "seq": 5,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "query": {
+ "limit": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users?limit=not-a-number"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json
new file mode 100644
index 00000000..4f65636d
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/006-get-v7-users.json
@@ -0,0 +1,113 @@
+{
+ "id": "006-get-v7-users",
+ "seq": 6,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "query": {
+ "max": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users?max=not-a-number"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json
new file mode 100644
index 00000000..bcf0e3dc
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/007-get-v7-users.json
@@ -0,0 +1,113 @@
+{
+ "id": "007-get-v7-users",
+ "seq": 7,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "query": {
+ "offset": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users?offset=not-a-number"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json
new file mode 100644
index 00000000..095b05f6
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/008-get-v7-users.json
@@ -0,0 +1,113 @@
+{
+ "id": "008-get-v7-users",
+ "seq": 8,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "query": {
+ "page": [
+ "not-a-number"
+ ]
+ },
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users?page=not-a-number"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json
new file mode 100644
index 00000000..55af90d2
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/009-get-v7-users.json
@@ -0,0 +1,108 @@
+{
+ "id": "009-get-v7-users",
+ "seq": 9,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json
new file mode 100644
index 00000000..7e238fb2
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/010-post-v7-users.json
@@ -0,0 +1,65 @@
+{
+ "id": "010-post-v7-users",
+ "seq": 10,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-required-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/users/281474976781820",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users/281474976781820"
+ }
+ },
+ "accountGroupRoles": [
+ {
+ "accountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ }
+ ],
+ "dateRegistered": "2026-08-03T15:59:55Z",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "tfpfgen-probe-write-required-1",
+ "uid": "281474976781820"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json
new file mode 100644
index 00000000..111400f4
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/011-post-v7-users.json
@@ -0,0 +1,31 @@
+{
+ "id": "011-post-v7-users",
+ "seq": 11,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-required-2"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "The user 'dafydd.watkins+tfacc@deploymenttheory.com' already exists!",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json
new file mode 100644
index 00000000..9d9f5f82
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/012-post-v7-users.json
@@ -0,0 +1,38 @@
+{
+ "id": "012-post-v7-users",
+ "seq": 12,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-required-3"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "There were some errors in your request, please correct them before trying again. Email address is required.",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json
new file mode 100644
index 00000000..a1162b3e
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/013-post-v7-users.json
@@ -0,0 +1,38 @@
+{
+ "id": "013-post-v7-users",
+ "seq": 13,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "name": "tfpfgen-probe-write-required-4"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "The user 'dafydd.watkins+tfacc@deploymenttheory.com' already exists!",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json
new file mode 100644
index 00000000..af806440
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/014-delete-v7-users-281474976781820.json
@@ -0,0 +1,18 @@
+{
+ "id": "014-delete-v7-users-281474976781820",
+ "seq": 14,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/users/281474976781820",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json
new file mode 100644
index 00000000..91b8485d
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/015-post-v7-users.json
@@ -0,0 +1,39 @@
+{
+ "id": "015-post-v7-users",
+ "seq": 15,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "probe-email-1",
+ "loginAccountGroupId": "probe-loginAccountGroupId-1",
+ "name": "tfpfgen-probe-write-writable-returned-1"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json
new file mode 100644
index 00000000..dfcb480c
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/016-post-v7-users.json
@@ -0,0 +1,39 @@
+{
+ "id": "016-post-v7-users",
+ "seq": 16,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "probe-email-1",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-update-style-1"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "There were some errors in your request, please correct them before trying again. Invalid email address probe-email-1.",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json
new file mode 100644
index 00000000..97b27b53
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/017-post-v7-users.json
@@ -0,0 +1,65 @@
+{
+ "id": "017-post-v7-users",
+ "seq": 17,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-server-default-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/users/281474976781821",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users/281474976781821"
+ }
+ },
+ "accountGroupRoles": [
+ {
+ "accountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ }
+ ],
+ "dateRegistered": "2026-08-03T15:59:58Z",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "tfpfgen-probe-write-server-default-1",
+ "uid": "281474976781821"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json
new file mode 100644
index 00000000..049c5786
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/018-get-v7-users-281474976781821.json
@@ -0,0 +1,50 @@
+{
+ "id": "018-get-v7-users-281474976781821",
+ "seq": 18,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users/281474976781821",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users/281474976781821"
+ }
+ },
+ "accountGroupRoles": [
+ {
+ "accountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ }
+ ],
+ "dateRegistered": "2026-08-03T15:59:58Z",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "tfpfgen-probe-write-server-default-1",
+ "uid": "281474976781821"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json
new file mode 100644
index 00000000..e224bfd9
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/019-post-v7-users.json
@@ -0,0 +1,39 @@
+{
+ "id": "019-post-v7-users",
+ "seq": 19,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-server-default-2"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "The user 'dafydd.watkins+tfacc@deploymenttheory.com' already exists!",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json
new file mode 100644
index 00000000..b0d53588
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/020-delete-v7-users-281474976781821.json
@@ -0,0 +1,18 @@
+{
+ "id": "020-delete-v7-users-281474976781821",
+ "seq": 20,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/users/281474976781821",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json
new file mode 100644
index 00000000..bed2eb62
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/021-post-v7-users.json
@@ -0,0 +1,39 @@
+{
+ "id": "021-post-v7-users",
+ "seq": 21,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": " probe-email-1 ",
+ "loginAccountGroupId": " probe-loginAccountGroupId-1 ",
+ "name": "tfpfgen-probe-write-normalisation-1"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json
new file mode 100644
index 00000000..08277a43
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/022-post-v7-users.json
@@ -0,0 +1,39 @@
+{
+ "id": "022-post-v7-users",
+ "seq": 22,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "MiXeD-probe-email-2",
+ "loginAccountGroupId": "MiXeD-probe-loginAccountGroupId-2",
+ "name": "tfpfgen-probe-write-normalisation-2"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json
new file mode 100644
index 00000000..d747aae6
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/023-post-v7-users.json
@@ -0,0 +1,44 @@
+{
+ "id": "023-post-v7-users",
+ "seq": 23,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "allAccountGroupRoleIds": [
+ "c",
+ "b",
+ "a"
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-normalisation-3"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json
new file mode 100644
index 00000000..afdc0d0c
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/024-post-v7-users.json
@@ -0,0 +1,65 @@
+{
+ "id": "024-post-v7-users",
+ "seq": 24,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-rehearsal-1"
+ }
+ },
+ "response": {
+ "status": 201,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "location": "https://api.thousandeyes.com/v7/users/281474976781823",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users/281474976781823"
+ }
+ },
+ "accountGroupRoles": [
+ {
+ "accountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ }
+ ],
+ "dateRegistered": "2026-08-03T16:00:06Z",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "uid": "281474976781823"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json
new file mode 100644
index 00000000..acead4d1
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/025-get-v7-users-281474976781823.json
@@ -0,0 +1,50 @@
+{
+ "id": "025-get-v7-users-281474976781823",
+ "seq": 25,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users/281474976781823",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users/281474976781823"
+ }
+ },
+ "accountGroupRoles": [
+ {
+ "accountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "roles": [
+ {
+ "hasManagementPermissions": false,
+ "isBuiltin": true,
+ "name": "Regular User",
+ "roleId": "281474976759598"
+ }
+ ]
+ }
+ ],
+ "dateRegistered": "2026-08-03T16:00:06Z",
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "tfpfgen-probe-write-rehearsal-1",
+ "uid": "281474976781823"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json
new file mode 100644
index 00000000..4a3ff6e1
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/026-put-v7-users-281474976781823.json
@@ -0,0 +1,42 @@
+{
+ "id": "026-put-v7-users-281474976781823",
+ "seq": 26,
+ "request": {
+ "method": "PUT",
+ "path": "/v7/users/281474976781823",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "allAccountGroupRoleIds": [
+ "tfacc-all-account-group-role-ids-element"
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-rehearsal-1"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users/281474976781823",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json
new file mode 100644
index 00000000..3ea54cc1
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/027-delete-v7-users-281474976781823.json
@@ -0,0 +1,18 @@
+{
+ "id": "027-delete-v7-users-281474976781823",
+ "seq": 27,
+ "request": {
+ "method": "DELETE",
+ "path": "/v7/users/281474976781823",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 204,
+ "header": {
+ "x-organization-rate-limit-limit": "240"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json
new file mode 100644
index 00000000..58be905e
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/028-post-v7-users.json
@@ -0,0 +1,42 @@
+{
+ "id": "028-post-v7-users",
+ "seq": 28,
+ "request": {
+ "method": "POST",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json",
+ "content-type": "application/json"
+ },
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "allAccountGroupRoleIds": [
+ "tfacc-all-account-group-role-ids-element"
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfpfgen-probe-write-rehearsal-2"
+ }
+ },
+ "response": {
+ "status": 400,
+ "header": {
+ "content-type": "application/problem+json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "instance": "/v7/users",
+ "status": 400,
+ "title": "400 Bad Request",
+ "type": "about:blank"
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json
new file mode 100644
index 00000000..11471882
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/interactions/029-get-v7-users.json
@@ -0,0 +1,108 @@
+{
+ "id": "029-get-v7-users",
+ "seq": 29,
+ "request": {
+ "method": "GET",
+ "path": "/v7/users",
+ "header": {
+ "accept": "application/json"
+ }
+ },
+ "response": {
+ "status": 200,
+ "header": {
+ "content-type": "application/json;charset=UTF-8",
+ "x-organization-rate-limit-limit": "240"
+ },
+ "body": {
+ "_links": {
+ "self": {
+ "href": "https://api.thousandeyes.com/v7/users"
+ }
+ },
+ "users": [
+ {
+ "dateRegistered": "2026-07-16T10:08:09Z",
+ "email": "Dafydd.Watkins+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Dafydd Watkins",
+ "uid": "281474976776279"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Benjamin.Huson+dev@Lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Benjamin Huson",
+ "uid": "281474976776280"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:10Z",
+ "email": "Graham.Brookfield+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Graham Brookfield",
+ "uid": "281474976776281"
+ },
+ {
+ "dateRegistered": "2026-07-16T10:08:11Z",
+ "email": "Thomas.Chappell+dev@lloydsbanking.com",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Thomas Chappell",
+ "uid": "281474976776282"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:01Z",
+ "email": "dafydd.watkins@deploymenttheory.com",
+ "lastLogin": "2026-07-31T11:18:19Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "dafyddwatkins",
+ "uid": "281474976776659"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:02Z",
+ "email": "benhuson@husondev.co.uk",
+ "lastLogin": "2026-07-28T09:01:58Z",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "name": "Ben Huson",
+ "uid": "281474976776660"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:03Z",
+ "email": "graham.brookfield@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776661"
+ },
+ {
+ "dateRegistered": "2026-07-17T14:01:04Z",
+ "email": "tom@husondev.co.uk",
+ "loginAccountGroup": {
+ "accountGroupName": "Lloyds Banking Group - Dev",
+ "aid": "281474976742769"
+ },
+ "uid": "281474976776662"
+ }
+ ]
+ },
+ "droppedHeaders": 14
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/metadata.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/metadata.json
new file mode 100644
index 00000000..76b3472a
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/metadata.json
@@ -0,0 +1,11 @@
+{
+ "provider": "thousandeyes",
+ "resource": "user",
+ "apiVersion": "7.0.98",
+ "host": "api.thousandeyes.com",
+ "basePath": "/v7",
+ "namePrefix": "tfpfgen-probe",
+ "interactions": 29,
+ "sha256": "88c46241304d189077b314f4796e7e4cc67a28fba90a9743cecc2a866d654d05",
+ "probeVersion": "dev"
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/plan.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/plan.json
new file mode 100644
index 00000000..2d55ae1d
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/plan.json
@@ -0,0 +1,24 @@
+{
+ "fixtures": [
+ {
+ "name": "minimal",
+ "body": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "CURATE_ME-stamped-by-probe"
+ }
+ }
+ ],
+ "budget": {
+ "maxRequests": 260,
+ "maxCreates": 18
+ }
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json
new file mode 100644
index 00000000..017bfc62
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/rehearsal.json
@@ -0,0 +1,33 @@
+[
+ {
+ "minimal": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfacc-name"
+ },
+ "maximal": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "allAccountGroupRoleIds": [
+ "tfacc-all-account-group-role-ids-element"
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfacc-name"
+ }
+ }
+]
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/report.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/report.json
new file mode 100644
index 00000000..f164a1bc
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/report.json
@@ -0,0 +1,431 @@
+{
+ "profile": {
+ "host": "api.thousandeyes.com",
+ "mode": "record",
+ "sandbox": true,
+ "assertionsPassed": [
+ "mode",
+ "allowMutations",
+ "sandbox",
+ "sandboxEvidence",
+ "namePrefix",
+ "tokenEnv",
+ "noCredentialInProfile",
+ "https",
+ "endpointHostSuffix",
+ "canMutate",
+ "plan",
+ "noSnapshotOverwrite",
+ "maxExistingObjects (8 < 25)"
+ ]
+ },
+ "facts": [
+ {
+ "resource": "user",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "404=problem"
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-users-999999999"
+ ],
+ "rationale": "a 404 response used the problem error shape"
+ },
+ {
+ "resource": "user",
+ "field": "errorEnvelope",
+ "value": {
+ "text": "listEnvelopeKey=users"
+ },
+ "confidence": "observed",
+ "probe": "read.list-shape",
+ "evidence": [
+ "001-get-v7-users",
+ "003-get-v7-users",
+ "004-get-v7-users",
+ "005-get-v7-users",
+ "006-get-v7-users",
+ "007-get-v7-users",
+ "008-get-v7-users",
+ "009-get-v7-users",
+ "029-get-v7-users"
+ ],
+ "rationale": "the list response wraps its items under \"users\""
+ },
+ {
+ "resource": "user",
+ "field": "policy.delete.notFoundIsSuccess",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.not-found-shape",
+ "evidence": [
+ "002-get-v7-users-999999999"
+ ],
+ "rationale": "reading an absent object answered 404 with a problem error body",
+ "alternatives": [
+ "the API may answer differently for an identifier that once existed and was deleted"
+ ]
+ },
+ {
+ "resource": "user",
+ "field": "policy.readBack",
+ "value": {
+ "readBack": {
+ "reason": "every one of 2 read(s) immediately after a create succeeded on the first attempt"
+ }
+ },
+ "confidence": "inferred",
+ "probe": "write.read-your-writes",
+ "evidence": [
+ "018-get-v7-users-281474976781821",
+ "025-get-v7-users-281474976781823"
+ ],
+ "rationale": "2 object(s) were read immediately after creation and every first read succeeded",
+ "alternatives": [
+ "a consistency window measured on an idle sandbox is not production's; the interval is a floor rather than a property of the real system"
+ ]
+ },
+ {
+ "resource": "user",
+ "field": "unknownParamTolerated",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "read.unknown-param",
+ "evidence": [
+ "001-get-v7-users",
+ "003-get-v7-users",
+ "004-get-v7-users",
+ "005-get-v7-users",
+ "006-get-v7-users",
+ "007-get-v7-users",
+ "008-get-v7-users",
+ "009-get-v7-users",
+ "029-get-v7-users"
+ ],
+ "rationale": "a collection read carrying an unrecognised query parameter answered 200",
+ "alternatives": [
+ "a gateway rather than the API itself may have rejected the parameter, in which case tolerance of unknown request-body fields does not follow"
+ ]
+ },
+ {
+ "resource": "user",
+ "jsonPath": "accountGroupRoles",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "011-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ },
+ {
+ "resource": "user",
+ "jsonPath": "email",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "observed",
+ "probe": "write.required",
+ "evidence": [
+ "012-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400 and the error named the field"
+ },
+ {
+ "resource": "user",
+ "jsonPath": "loginAccountGroupId",
+ "field": "requiredByApi",
+ "value": {
+ "bool": true
+ },
+ "confidence": "inferred",
+ "probe": "write.required",
+ "evidence": [
+ "013-post-v7-users"
+ ],
+ "rationale": "a create omitting this field was refused with 400, but the error body did not name the field, so the refusal may have had another cause",
+ "alternatives": [
+ "the create may have been refused for a reason unrelated to this field, which only an error body naming it would rule out"
+ ]
+ }
+ ],
+ "notes": [
+ {
+ "resource": "user",
+ "probe": "write.update-style",
+ "message": "every fixture's create was refused, so nothing was observed about update style"
+ },
+ {
+ "resource": "user",
+ "probe": "write.writable-returned",
+ "message": "fixture minimal was refused with 400 (), so nothing was observed about writability from it"
+ },
+ {
+ "resource": "user",
+ "probe": "write.update-style",
+ "message": "fixture minimal was refused with 400; trying the next"
+ },
+ {
+ "resource": "user",
+ "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": "user",
+ "probe": "read.volatile",
+ "message": "no existing object to read repeatedly, so volatility was not observed"
+ },
+ {
+ "resource": "user",
+ "probe": "read.returned-weak",
+ "message": "no existing object to read, so no field presence was observed"
+ },
+ {
+ "resource": "user",
+ "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": "user",
+ "probe": "write.enum",
+ "message": "no sendable field carries documented enum values, so there is no specification claim to check against the API"
+ },
+ {
+ "resource": "user",
+ "probe": "write.normalisation",
+ "message": "the create carrying \"collection order is changed\" was refused with 400 (), so nothing was observed about that transform"
+ },
+ {
+ "resource": "user",
+ "probe": "write.normalisation",
+ "message": "the create carrying \"letter case is changed\" was refused with 400 (), so nothing was observed about that transform"
+ },
+ {
+ "resource": "user",
+ "probe": "write.normalisation",
+ "message": "the create carrying \"surrounding whitespace is stripped\" was refused with 400 (), so nothing was observed about that transform"
+ },
+ {
+ "resource": "user",
+ "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": "user",
+ "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": "user",
+ "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": "user",
+ "probe": "write.server-default",
+ "message": "the second, byte-identical to the first create was refused with 400 (), so no default was observed"
+ },
+ {
+ "resource": "user",
+ "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": "user",
+ "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": "user",
+ "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"
+ }
+ ],
+ "probes": [
+ {
+ "name": "read.error-envelope",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 4,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.list-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.not-found-shape",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 2
+ },
+ {
+ "name": "read.returned-weak",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "read.unknown-param",
+ "kind": "read",
+ "status": "ok",
+ "requests": 1,
+ "facts": 1
+ },
+ {
+ "name": "read.volatile",
+ "kind": "read",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.enum",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.immutability",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.normalisation",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 3,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.read-your-writes",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 0,
+ "facts": 1
+ },
+ {
+ "name": "write.rehearsal",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 5,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.required",
+ "kind": "mutating",
+ "status": "ok",
+ "requests": 4,
+ "facts": 3
+ },
+ {
+ "name": "write.server-default",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 3,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.side-effect",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 0,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.update-style",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ },
+ {
+ "name": "write.writable-returned",
+ "kind": "mutating",
+ "status": "abandoned",
+ "requests": 1,
+ "facts": 0,
+ "reason": "ran but established nothing"
+ }
+ ],
+ "budget": {
+ "requests": 28,
+ "maxRequests": 260,
+ "creates": 13,
+ "maxCreates": 18,
+ "deletes": 3,
+ "sweepRequests": 1
+ },
+ "sweep": {
+ "ledgerDeletes": 0,
+ "prefixDeletes": 0,
+ "complete": true
+ },
+ "rehearsal": [
+ {
+ "minimal": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfacc-name"
+ },
+ "maximal": {
+ "accountGroupRoles": [
+ {
+ "accountGroupId": "281474976742769",
+ "roleIds": [
+ "281474976759598"
+ ]
+ }
+ ],
+ "allAccountGroupRoleIds": [
+ "tfacc-all-account-group-role-ids-element"
+ ],
+ "email": "dafydd.watkins+tfacc@deploymenttheory.com",
+ "loginAccountGroupId": "281474976742769",
+ "name": "tfacc-name"
+ }
+ }
+ ]
+}
diff --git a/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/subject.json b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/subject.json
new file mode 100644
index 00000000..e3f6b49d
--- /dev/null
+++ b/probe-evidence/thousandeyes/user/7.0.98-t1785772809774/subject.json
@@ -0,0 +1,128 @@
+{
+ "resource": "user",
+ "collectionTemplate": "/users",
+ "itemTemplate": "/users/{id}",
+ "create": {
+ "method": "POST",
+ "pathTemplate": "/users"
+ },
+ "read": {
+ "method": "GET",
+ "pathTemplate": "/users/{id}"
+ },
+ "update": {
+ "method": "PUT",
+ "pathTemplate": "/users/{id}"
+ },
+ "delete": {
+ "method": "DELETE",
+ "pathTemplate": "/users/{id}"
+ },
+ "fields": [
+ {
+ "jsonPath": "accountGroupRoles",
+ "attribute": "account_group_roles",
+ "kind": "set_nested",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": false
+ }
+ },
+ {
+ "jsonPath": "accountGroupRoles.accountGroupId",
+ "attribute": "account_group_id",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true
+ },
+ {
+ "jsonPath": "accountGroupRoles.roleIds",
+ "attribute": "role_ids",
+ "kind": "set",
+ "computedOptionalRequired": "optional",
+ "writable": true
+ },
+ {
+ "jsonPath": "allAccountGroupRoleIds",
+ "attribute": "all_account_group_role_ids",
+ "kind": "set",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "returnedOnRead": false
+ }
+ },
+ {
+ "jsonPath": "dateRegistered",
+ "attribute": "date_registered",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false,
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ {
+ "jsonPath": "email",
+ "attribute": "email",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "constraints": {
+ "format": "email"
+ },
+ "behaviour": {
+ "requiredByApi": true
+ }
+ },
+ {
+ "jsonPath": "lastLogin",
+ "attribute": "last_login",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false,
+ "constraints": {
+ "format": "date-time"
+ }
+ },
+ {
+ "jsonPath": "loginAccountGroupId",
+ "attribute": "login_account_group_id",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true,
+ "returnedOnRead": false
+ }
+ },
+ {
+ "jsonPath": "name",
+ "attribute": "name",
+ "kind": "string",
+ "computedOptionalRequired": "optional",
+ "writable": true,
+ "behaviour": {
+ "requiredByApi": true
+ }
+ },
+ {
+ "jsonPath": "uid",
+ "attribute": "id",
+ "kind": "string",
+ "computedOptionalRequired": "computed",
+ "writable": false
+ }
+ ],
+ "policy": {
+ "updateStyle": "putFull",
+ "delete": {
+ "notFoundIsSuccess": true
+ }
+ },
+ "idField": "uid",
+ "nameField": "name",
+ "evidenceRev": 1
+}