From 1956d95b9a3d4e6f167ac8d94f60853a8a99762a Mon Sep 17 00:00:00 2001 From: Bobby Iliev Date: Fri, 19 Apr 2024 09:00:34 +0300 Subject: [PATCH] Update to 0.6.10 (#106) --- CHANGELOG.md | 3 + examples/docker-compose.yml | 2 + examples/mocks/cloud/mock_server.go | 4 +- examples/mocks/frontegg/mock_server.go | 437 +++++++++++++- .../pulumi-resource-materialize/schema.json | 542 ++++++++++++------ provider/go.mod | 2 +- provider/go.sum | 4 +- provider/resources.go | 4 + 8 files changed, 807 insertions(+), 191 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 101c763..26b351b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ CHANGELOG ========= +## 0.1.10 - 2024-04-01 +Update to Terraform Provider [0.6.10](https://github.com/MaterializeInc/terraform-provider-materialize/releases/tag/v0.6.10). + ## 0.1.9 - 2024-03-29 Update to Terraform Provider [0.6.9](https://github.com/MaterializeInc/terraform-provider-materialize/releases/tag/v0.6.9). diff --git a/examples/docker-compose.yml b/examples/docker-compose.yml index 59ae0b4..56aa324 100644 --- a/examples/docker-compose.yml +++ b/examples/docker-compose.yml @@ -11,6 +11,8 @@ services: - --bootstrap-default-cluster-replica-size=3xsmall - --bootstrap-builtin-system-cluster-replica-size=3xsmall - --bootstrap-builtin-introspection-cluster-replica-size=3xsmall + - --bootstrap-builtin-support-cluster-replica-size=3xsmall + - --bootstrap-builtin-probe-cluster-replica-size=3xsmall - --availability-zone=test1 - --availability-zone=test2 - --all-features diff --git a/examples/mocks/cloud/mock_server.go b/examples/mocks/cloud/mock_server.go index 16fe549..4a4daed 100644 --- a/examples/mocks/cloud/mock_server.go +++ b/examples/mocks/cloud/mock_server.go @@ -70,7 +70,9 @@ func regionHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(mockRegion) case http.MethodPatch: - w.WriteHeader(http.StatusOK) + enabledRegion := CloudRegion{RegionInfo: nil} + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(enabledRegion) case http.MethodDelete: w.WriteHeader(http.StatusAccepted) default: diff --git a/examples/mocks/frontegg/mock_server.go b/examples/mocks/frontegg/mock_server.go index 4b5a63f..1b651cc 100644 --- a/examples/mocks/frontegg/mock_server.go +++ b/examples/mocks/frontegg/mock_server.go @@ -24,11 +24,12 @@ type AppPassword struct { } type User struct { - ID string `json:"id"` - Email string `json:"email"` - ProfilePictureURL string `json:"profilePictureUrl"` - Verified bool `json:"verified"` - Metadata string `json:"metadata"` + ID string `json:"id"` + Email string `json:"email"` + ProfilePictureURL string `json:"profilePictureUrl"` + Verified bool `json:"verified"` + Metadata string `json:"metadata"` + Roles []FronteggRole `json:"roles"` } type FronteggRole struct { @@ -100,11 +101,66 @@ type SCIM2Configuration struct { type SCIM2ConfigurationsResponse []SCIM2Configuration +// GroupCreateParams represents the parameters for creating a new group. +type GroupCreateParams struct { + Name string `json:"name"` + Description string `json:"description,omitempty"` + Color string `json:"color,omitempty"` + Metadata string `json:"metadata,omitempty"` +} + +// GroupUpdateParams represents the parameters for updating an existing group. +type GroupUpdateParams struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Color string `json:"color,omitempty"` + Metadata string `json:"metadata,omitempty"` +} + +// ScimGroup represents the structure of a group in the response. +type ScimGroup struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Metadata string `json:"metadata"` + Roles []ScimRole `json:"roles"` + Users []ScimUser `json:"users"` + ManagedBy string `json:"managedBy"` + Color string `json:"color"` +} + +// ScimRole represents the structure of a role within a group. +type ScimRole struct { + ID string `json:"id"` + Key string `json:"key"` + Name string `json:"name"` + Description string `json:"description"` + IsDefault bool `json:"is_default"` +} + +// ScimUser represents the structure of a user within a group. +type ScimUser struct { + ID string `json:"id"` + Name string `json:"name"` + Email string `json:"email"` +} + +// SCIMGroupsResponse represents the overall structure of the response from the SCIM groups API. +type SCIMGroupsResponse struct { + Groups []ScimGroup `json:"groups"` +} + +// AddRolesToGroupParams represents the parameters for adding roles to a group. +type AddRolesToGroupParams struct { + RoleIds []string `json:"roleIds"` +} + var ( appPasswords = make(map[string]AppPassword) users = make(map[string]User) ssoConfigs = make(map[string]SSOConfig) scimConfigurations = make(map[string]SCIM2Configuration) + groups = make(map[string]ScimGroup) mutex = &sync.Mutex{} ) @@ -117,6 +173,7 @@ func main() { http.HandleFunc("/frontegg/team/resources/sso/v1/configurations", handleSSOConfigRequest) http.HandleFunc("/frontegg/team/resources/sso/v1/configurations/", handleSSOConfigAndDomainRequest) http.HandleFunc("/frontegg/identity/resources/groups/v1", handleSCIMGroupsRequest) + http.HandleFunc("/frontegg/identity/resources/groups/v1/", handleSCIMGroupsParamRequest) http.HandleFunc("/frontegg/directory/resources/v1/configurations/scim2", handleSCIM2ConfigurationsRequest) http.HandleFunc("/frontegg/directory/resources/v1/configurations/scim2/", handleSCIMConfigurationByID) @@ -156,7 +213,11 @@ func getUser(w http.ResponseWriter, r *http.Request) { } func createUser(w http.ResponseWriter, r *http.Request) { - var newUser User + var newUser struct { + User + RoleIDs []string `json:"roleIds"` + } + if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return @@ -165,15 +226,28 @@ func createUser(w http.ResponseWriter, r *http.Request) { userID := generateUserID() newUser.ID = userID - // Store the new user + // Map role IDs to role names and update the newUser.Roles slice + for _, roleID := range newUser.RoleIDs { + var roleName string + switch roleID { + case "1": + roleName = "Organization Admin" + case "2": + roleName = "Organization Member" + } + + if roleName != "" { + newUser.Roles = append(newUser.Roles, FronteggRole{ID: roleID, Name: roleName}) + } + } + mutex.Lock() - users[userID] = newUser + users[userID] = newUser.User mutex.Unlock() w.WriteHeader(http.StatusCreated) - // Return the created user w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(newUser) + json.NewEncoder(w).Encode(newUser.User) } func generateUserID() string { @@ -461,11 +535,68 @@ func handleGroupMappingRequests(w http.ResponseWriter, r *http.Request, ssoConfi } } +func handleSCIMGroupsParamRequest(w http.ResponseWriter, r *http.Request) { + logRequest(r) + // Extract the group ID and potential action from the URL path + trimmedPath := strings.TrimPrefix(r.URL.Path, "/frontegg/identity/resources/groups/v1/") + trimmedPath = strings.Split(trimmedPath, "?")[0] + parts := strings.Split(trimmedPath, "/") + groupID := "" + if len(parts) > 0 { + groupID = parts[0] + } + + switch r.Method { + case http.MethodPost: + if strings.Contains(trimmedPath, "/roles") && groupID != "" { + // Add roles to a group + handleAddRolesToGroup(w, r, groupID) + } else if strings.Contains(trimmedPath, "/users") && groupID != "" { + // Add users to a group + handleAddUsersToGroup(w, r, groupID) + } else { + http.Error(w, "Invalid request for POST method", http.StatusBadRequest) + } + case http.MethodPatch: + if groupID != "" { + // Update a group + handleUpdateScimGroup(w, r, groupID) + } else { + http.Error(w, "Group ID is required for PATCH method", http.StatusBadRequest) + } + case http.MethodDelete: + if strings.Contains(trimmedPath, "/roles") && groupID != "" { + // Remove roles from a group + handleRemoveRolesFromGroup(w, r, groupID) + } else if strings.Contains(trimmedPath, "/users") && groupID != "" { + // Remove users from a group + handleRemoveUsersFromGroup(w, r, groupID) + } else if groupID != "" { + // Delete a group + handleDeleteScimGroup(w, r, groupID) + } else { + http.Error(w, "Group ID is required for DELETE method", http.StatusBadRequest) + } + case http.MethodGet: + if groupID != "" { + // Get a specific group by ID + handleGetScimGroupByID(w, r, groupID) + } else { + // List all groups + listSCIMGroups(w, r) + } + default: + http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) + } +} + +// Handle scim groups create and list func handleSCIMGroupsRequest(w http.ResponseWriter, r *http.Request) { - // TODO: add support for creating groups and updating groups switch r.Method { case http.MethodGet: listSCIMGroups(w, r) + case http.MethodPost: + handleCreateScimGroup(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } @@ -483,10 +614,121 @@ func handleSCIM2ConfigurationsRequest(w http.ResponseWriter, r *http.Request) { } func listSCIMGroups(w http.ResponseWriter, r *http.Request) { - // TODO: update this to return the groups that are created by the user - w.Header().Set("Content-Type", "application/json") + mutex.Lock() + defer mutex.Unlock() + + allGroups := make([]ScimGroup, 0, len(groups)) + for _, group := range groups { + allGroups = append(allGroups, group) + } + + // Respond with all the groups encoded as JSON + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(SCIMGroupsResponse{Groups: allGroups}) +} + +func handleCreateScimGroup(w http.ResponseWriter, r *http.Request) { + var params GroupCreateParams + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Create a new group with the provided parameters + newGroup := ScimGroup{ + ID: uuid.New().String(), + Name: params.Name, + Description: params.Description, + Metadata: params.Metadata, + Roles: []ScimRole{}, + Users: []ScimUser{}, + } + + // Store the new group in the mock data store + mutex.Lock() + groups[newGroup.ID] = newGroup + mutex.Unlock() + + // Respond with the newly created group + w.WriteHeader(http.StatusCreated) + json.NewEncoder(w).Encode(newGroup) +} + +func handleUpdateScimGroup(w http.ResponseWriter, r *http.Request, groupID string) { + var params GroupUpdateParams + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Lock the mutex before accessing the shared resource + mutex.Lock() + group, exists := groups[groupID] + mutex.Unlock() + + if !exists { + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // Update the group's attributes if they are provided in the request + if params.Name != "" { + group.Name = params.Name + } + if params.Description != "" { + group.Description = params.Description + } + if params.Color != "" { + group.Color = params.Color + } + if params.Metadata != "" { + group.Metadata = params.Metadata + } + + // Update the group in the mock data store + mutex.Lock() + groups[groupID] = group + mutex.Unlock() + + // Respond with the updated group data + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(group) +} + +func handleDeleteScimGroup(w http.ResponseWriter, r *http.Request, groupID string) { + // Lock the mutex before accessing the shared resource + mutex.Lock() + defer mutex.Unlock() + + // Check if the group exists + _, exists := groups[groupID] + if !exists { + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // Delete the group from the mock data store + delete(groups, groupID) + + // Respond with a 200 OK status to indicate successful deletion w.WriteHeader(http.StatusOK) - w.Write([]byte(`{"groups":[]}`)) +} + +func handleGetScimGroupByID(w http.ResponseWriter, r *http.Request, groupID string) { + // Lock the mutex before accessing the shared resource + mutex.Lock() + group, exists := groups[groupID] + mutex.Unlock() + + if !exists { + // If the group does not exist, return a 404 Not Found status + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // If the group exists, encode it to JSON and return it with a 200 OK status + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(group) } func handleSCIMConfigurationByID(w http.ResponseWriter, r *http.Request) { @@ -498,6 +740,173 @@ func handleSCIMConfigurationByID(w http.ResponseWriter, r *http.Request) { } } +func handleAddRolesToGroup(w http.ResponseWriter, r *http.Request, groupID string) { + logRequest(r) + var params AddRolesToGroupParams + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Lock the mutex before accessing the shared resource + mutex.Lock() + defer mutex.Unlock() + + group, exists := groups[groupID] + if !exists { + // If the group does not exist, return a 404 Not Found status + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + for _, roleID := range params.RoleIds { + // Check if the role is already in the group to prevent duplicates + found := false + for _, role := range group.Roles { + if role.ID == roleID { + found = true + break + } + } + + // If the role is not found, add it to the group with a specific name based on its ID + if !found { + roleName := "" + switch roleID { + case "1": + roleName = "Organization Admin" + case "2": + roleName = "Organization Member" + } + group.Roles = append(group.Roles, ScimRole{ID: roleID, Name: roleName}) + } + } + + // Update the group in the mock data store + groups[groupID] = group + + // Respond with a 201 Created status + w.WriteHeader(http.StatusCreated) +} + +func handleRemoveRolesFromGroup(w http.ResponseWriter, r *http.Request, groupID string) { + var params AddRolesToGroupParams + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Lock the mutex before accessing the shared resource + mutex.Lock() + defer mutex.Unlock() + + group, exists := groups[groupID] + if !exists { + // If the group does not exist, return a 404 Not Found status + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // Remove the specified roles from the group + for _, roleID := range params.RoleIds { + for i, role := range group.Roles { + if role.ID == roleID { + // Remove the role from the slice + group.Roles = append(group.Roles[:i], group.Roles[i+1:]...) + break + } + } + } + + // Update the group in the mock data store + groups[groupID] = group + + // Respond with a 200 OK status to indicate successful removal + w.WriteHeader(http.StatusOK) +} + +func handleAddUsersToGroup(w http.ResponseWriter, r *http.Request, groupID string) { + var params struct { + UserIds []string `json:"userIds"` + } + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Lock the mutex before accessing the shared resource + mutex.Lock() + defer mutex.Unlock() + + group, exists := groups[groupID] + if !exists { + // If the group does not exist, return a 404 Not Found status + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // Add the specified users to the group, avoiding duplicates + for _, userID := range params.UserIds { + // Check if the user is already in the group + found := false + for _, user := range group.Users { + if user.ID == userID { + found = true + break + } + } + + // If the user is not found, add them to the group + if !found { + group.Users = append(group.Users, ScimUser{ID: userID}) + } + } + + // Update the group in the mock data store + groups[groupID] = group + + // Respond with a 201 Created status + w.WriteHeader(http.StatusCreated) +} + +func handleRemoveUsersFromGroup(w http.ResponseWriter, r *http.Request, groupID string) { + var params struct { + UserIds []string `json:"userIds"` + } + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Lock the mutex before accessing the shared resource + mutex.Lock() + defer mutex.Unlock() + + group, exists := groups[groupID] + if !exists { + // If the group does not exist, return a 404 Not Found status + http.Error(w, "Group not found", http.StatusNotFound) + return + } + + // Remove the specified users from the group + for _, userID := range params.UserIds { + for i, user := range group.Users { + if user.ID == userID { + // Remove the user from the group + group.Users = append(group.Users[:i], group.Users[i+1:]...) + break + } + } + } + + // Update the group in the mock data store + groups[groupID] = group + + // Respond with a 200 OK status to indicate successful removal + w.WriteHeader(http.StatusOK) +} + func listSCIMConfigurations(w http.ResponseWriter) { mutex.Lock() configs := make([]SCIM2Configuration, 0, len(scimConfigurations)) diff --git a/provider/cmd/pulumi-resource-materialize/schema.json b/provider/cmd/pulumi-resource-materialize/schema.json index cdffcbd..afbcc86 100644 --- a/provider/cmd/pulumi-resource-materialize/schema.json +++ b/provider/cmd/pulumi-resource-materialize/schema.json @@ -399,13 +399,11 @@ "properties": { "privatelinkConnection": { "$ref": "#/types/materialize:index/ConnectionKafkaAwsPrivatelinkPrivatelinkConnection:ConnectionKafkaAwsPrivatelinkPrivatelinkConnection", - "description": "The AWS PrivateLink connection name in Materialize.\n", - "willReplaceOnChanges": true + "description": "The AWS PrivateLink connection name in Materialize.\n" }, "privatelinkConnectionPort": { "type": "integer", - "description": "The port of the AWS PrivateLink connection.\n", - "willReplaceOnChanges": true + "description": "The port of the AWS PrivateLink connection.\n" } }, "type": "object", @@ -446,13 +444,11 @@ }, "privatelinkConnection": { "$ref": "#/types/materialize:index/ConnectionKafkaKafkaBrokerPrivatelinkConnection:ConnectionKafkaKafkaBrokerPrivatelinkConnection", - "description": "The AWS PrivateLink connection name in Materialize.\n", - "willReplaceOnChanges": true + "description": "The AWS PrivateLink connection name in Materialize.\n" }, "sshTunnel": { "$ref": "#/types/materialize:index/ConnectionKafkaKafkaBrokerSshTunnel:ConnectionKafkaKafkaBrokerSshTunnel", - "description": "The name of an SSH tunnel connection to route network traffic through by default.\n", - "willReplaceOnChanges": true + "description": "The name of an SSH tunnel connection to route network traffic through by default.\n" }, "targetGroupPort": { "type": "integer", @@ -2620,6 +2616,54 @@ "name" ] }, + "materialize:index/SourceLoadgenKeyValueOptions:SourceLoadgenKeyValueOptions": { + "properties": { + "batchSize": { + "type": "integer", + "description": "The number of keys per partition to produce in each update.\n", + "willReplaceOnChanges": true + }, + "keys": { + "type": "integer", + "description": "The number of keys in the source. This must be divisible by the product of 'partitions' and 'batch_size'.\n", + "willReplaceOnChanges": true + }, + "partitions": { + "type": "integer", + "description": "The number of partitions to spread the keys across.\n", + "willReplaceOnChanges": true + }, + "seed": { + "type": "integer", + "description": "A per-source seed for seeding the random data.\n", + "willReplaceOnChanges": true + }, + "snapshotRounds": { + "type": "integer", + "description": "The number of rounds of data to produce as the source starts up.\n", + "willReplaceOnChanges": true + }, + "tickInterval": { + "type": "string", + "description": "The interval at which the next datum should be emitted. Defaults to one second.\n", + "willReplaceOnChanges": true + }, + "transactionalSnapshot": { + "type": "boolean", + "description": "Whether to emit the snapshot as a singular transaction.\n", + "willReplaceOnChanges": true + }, + "valueSize": { + "type": "integer", + "description": "The number of bytes in each value.\n", + "willReplaceOnChanges": true + } + }, + "type": "object", + "required": [ + "keys" + ] + }, "materialize:index/SourceLoadgenMarketingOptions:SourceLoadgenMarketingOptions": { "properties": { "scaleFactor": { @@ -3169,6 +3213,82 @@ "type": "object" } }, + "materialize:index/cloudRegion:CloudRegion": { + "description": "The region resource allows you to manage regions in Materialize. When a new region is created, it automatically includes an 'xsmall' quickstart cluster as part of the initialization process. Users are billed for this quickstart cluster from the moment the region is created. To avoid unnecessary charges, you can connect to the new region and drop the quickstart cluster if it is not needed. Please note that disabling a region cannot be achieved directly through this provider. If you need to disable a region, contact Materialize support for assistance. This process ensures that any necessary cleanup and billing adjustments are handled properly.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\nconst example = new materialize.CloudRegion(\"example\", {regionId: \"aws/us-east-1\"});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\nexample = materialize.CloudRegion(\"example\", region_id=\"aws/us-east-1\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = new Materialize.CloudRegion(\"example\", new()\n {\n RegionId = \"aws/us-east-1\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := materialize.NewCloudRegion(ctx, \"example\", \u0026materialize.CloudRegionArgs{\n\t\t\tRegionId: pulumi.String(\"aws/us-east-1\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.CloudRegion;\nimport com.pulumi.materialize.CloudRegionArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var example = new CloudRegion(\"example\", CloudRegionArgs.builder() \n .regionId(\"aws/us-east-1\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n example:\n type: materialize:CloudRegion\n properties:\n regionId: aws/us-east-1\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\n\n\n```sh\n $ pulumi import materialize:index/cloudRegion:CloudRegion Regions can be imported using the `terraform import` command\n```\n\n\n\n```sh\n $ pulumi import materialize:index/cloudRegion:CloudRegion example_region aws/us-east-1\n```\n\n ", + "properties": { + "enabledAt": { + "type": "string", + "description": "The timestamp when the region was enabled.\n" + }, + "httpAddress": { + "type": "string", + "description": "The HTTP address of the region.\n" + }, + "regionId": { + "type": "string", + "description": "The ID of the region to manage. Example: aws/us-west-2\n" + }, + "regionState": { + "type": "boolean", + "description": "The state of the region. True if enabled, false otherwise.\n" + }, + "resolvable": { + "type": "boolean", + "description": "Indicates if the region is resolvable.\n" + }, + "sqlAddress": { + "type": "string", + "description": "The SQL address of the region.\n" + } + }, + "required": [ + "enabledAt", + "httpAddress", + "regionId", + "regionState", + "resolvable", + "sqlAddress" + ], + "inputProperties": { + "regionId": { + "type": "string", + "description": "The ID of the region to manage. Example: aws/us-west-2\n" + } + }, + "requiredInputs": [ + "regionId" + ], + "stateInputs": { + "description": "Input properties used for looking up and filtering CloudRegion resources.\n", + "properties": { + "enabledAt": { + "type": "string", + "description": "The timestamp when the region was enabled.\n" + }, + "httpAddress": { + "type": "string", + "description": "The HTTP address of the region.\n" + }, + "regionId": { + "type": "string", + "description": "The ID of the region to manage. Example: aws/us-west-2\n" + }, + "regionState": { + "type": "boolean", + "description": "The state of the region. True if enabled, false otherwise.\n" + }, + "resolvable": { + "type": "boolean", + "description": "Indicates if the region is resolvable.\n" + }, + "sqlAddress": { + "type": "string", + "description": "The SQL address of the region.\n" + } + }, + "type": "object" + } + }, "materialize:index/cluster:Cluster": { "description": "Clusters describe logical compute resources that can be used by sources, sinks, indexes, and materialized views. Managed clusters are created by setting the `size` attribute\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\nconst exampleCluster = new materialize.Cluster(\"exampleCluster\", {});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\nexample_cluster = materialize.Cluster(\"exampleCluster\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var exampleCluster = new Materialize.Cluster(\"exampleCluster\");\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := materialize.NewCluster(ctx, \"exampleCluster\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.Cluster;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var exampleCluster = new Cluster(\"exampleCluster\");\n\n }\n}\n```\n```yaml\nresources:\n exampleCluster:\n type: materialize:Cluster\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\nClusters can be imported using the cluster id\n\n```sh\n $ pulumi import materialize:index/cluster:Cluster example_cluster \u003cregion\u003e:\u003ccluster_id\u003e\n```\n\n Cluster id and information be found in the `mz_catalog.mz_clusters` table The region is the region where the database is located (e.g. aws/us-east-1) ", "properties": { @@ -3188,10 +3308,6 @@ "description": "**Deprecated**. This attribute is maintained for backward compatibility with existing configurations. New users should use 'cc' sizes for disk access.\n", "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters" }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n" - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n" @@ -3245,10 +3361,6 @@ "description": "**Deprecated**. This attribute is maintained for backward compatibility with existing configurations. New users should use 'cc' sizes for disk access.\n", "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters" }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n" - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n" @@ -3299,10 +3411,6 @@ "description": "**Deprecated**. This attribute is maintained for backward compatibility with existing configurations. New users should use 'cc' sizes for disk access.\n", "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters" }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n" - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n" @@ -3357,10 +3465,6 @@ "description": "**Deprecated**. This attribute is maintained for backward compatibility with existing configurations. New users should use 'cc' sizes for disk access.\n", "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters" }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n" - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n" @@ -3410,11 +3514,6 @@ "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters", "willReplaceOnChanges": true }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n", - "willReplaceOnChanges": true - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n", @@ -3468,11 +3567,6 @@ "deprecationMessage": "Disk replicas are deprecated and will be removed in a future release. The `disk` attribute will be enabled by default for 'cc' clusters", "willReplaceOnChanges": true }, - "idleArrangementMergeEffort": { - "type": "integer", - "description": "The amount of effort to exert compacting arrangements during idle periods. This is an unstable option! It may be changed or removed at any time.\n", - "willReplaceOnChanges": true - }, "introspectionDebugging": { "type": "boolean", "description": "Whether to introspect the gathering of the introspection data.\n", @@ -3574,23 +3668,19 @@ "inputProperties": { "accessKeyId": { "$ref": "#/types/materialize:index/ConnectionAwsAccessKeyId:ConnectionAwsAccessKeyId", - "description": "The access key ID to connect with.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The access key ID to connect with.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "assumeRoleArn": { "type": "string", - "description": "The Amazon Resource Name (ARN) of the IAM role to assume.\n", - "willReplaceOnChanges": true + "description": "The Amazon Resource Name (ARN) of the IAM role to assume.\n" }, "assumeRoleSessionName": { "type": "string", - "description": "The session name to use when assuming the role.\n", - "willReplaceOnChanges": true + "description": "The session name to use when assuming the role.\n" }, "awsRegion": { "type": "string", - "description": "The AWS region to connect to.\n", - "willReplaceOnChanges": true + "description": "The AWS region to connect to.\n" }, "comment": { "type": "string", @@ -3603,8 +3693,7 @@ }, "endpoint": { "type": "string", - "description": "Override the default AWS endpoint URL.\n", - "willReplaceOnChanges": true + "description": "Override the default AWS endpoint URL.\n" }, "name": { "type": "string", @@ -3626,13 +3715,11 @@ }, "secretAccessKey": { "$ref": "#/types/materialize:index/ConnectionAwsSecretAccessKey:ConnectionAwsSecretAccessKey", - "description": "The secret access key corresponding to the specified access key ID.\n", - "willReplaceOnChanges": true + "description": "The secret access key corresponding to the specified access key ID.\n" }, "sessionToken": { "$ref": "#/types/materialize:index/ConnectionAwsSessionToken:ConnectionAwsSessionToken", - "description": "The session token corresponding to the specified access key ID.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The session token corresponding to the specified access key ID.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -3644,23 +3731,19 @@ "properties": { "accessKeyId": { "$ref": "#/types/materialize:index/ConnectionAwsAccessKeyId:ConnectionAwsAccessKeyId", - "description": "The access key ID to connect with.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The access key ID to connect with.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "assumeRoleArn": { "type": "string", - "description": "The Amazon Resource Name (ARN) of the IAM role to assume.\n", - "willReplaceOnChanges": true + "description": "The Amazon Resource Name (ARN) of the IAM role to assume.\n" }, "assumeRoleSessionName": { "type": "string", - "description": "The session name to use when assuming the role.\n", - "willReplaceOnChanges": true + "description": "The session name to use when assuming the role.\n" }, "awsRegion": { "type": "string", - "description": "The AWS region to connect to.\n", - "willReplaceOnChanges": true + "description": "The AWS region to connect to.\n" }, "comment": { "type": "string", @@ -3673,8 +3756,7 @@ }, "endpoint": { "type": "string", - "description": "Override the default AWS endpoint URL.\n", - "willReplaceOnChanges": true + "description": "Override the default AWS endpoint URL.\n" }, "name": { "type": "string", @@ -3700,13 +3782,11 @@ }, "secretAccessKey": { "$ref": "#/types/materialize:index/ConnectionAwsSecretAccessKey:ConnectionAwsSecretAccessKey", - "description": "The secret access key corresponding to the specified access key ID.\n", - "willReplaceOnChanges": true + "description": "The secret access key corresponding to the specified access key ID.\n" }, "sessionToken": { "$ref": "#/types/materialize:index/ConnectionAwsSessionToken:ConnectionAwsSessionToken", - "description": "The session token corresponding to the specified access key ID.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The session token corresponding to the specified access key ID.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -3762,6 +3842,10 @@ "serviceName": { "type": "string", "description": "The name of the AWS PrivateLink service.\n" + }, + "validate": { + "type": "boolean", + "description": "**Private Preview** If the connection should wait for validation.\n" } }, "required": [ @@ -3778,8 +3862,7 @@ "items": { "type": "string" }, - "description": "The availability zones of the AWS PrivateLink service.\n", - "willReplaceOnChanges": true + "description": "The availability zones of the AWS PrivateLink service.\n" }, "comment": { "type": "string", @@ -3810,8 +3893,11 @@ }, "serviceName": { "type": "string", - "description": "The name of the AWS PrivateLink service.\n", - "willReplaceOnChanges": true + "description": "The name of the AWS PrivateLink service.\n" + }, + "validate": { + "type": "boolean", + "description": "**Private Preview** If the connection should wait for validation.\n" } }, "requiredInputs": [ @@ -3826,8 +3912,7 @@ "items": { "type": "string" }, - "description": "The availability zones of the AWS PrivateLink service.\n", - "willReplaceOnChanges": true + "description": "The availability zones of the AWS PrivateLink service.\n" }, "comment": { "type": "string", @@ -3867,8 +3952,11 @@ }, "serviceName": { "type": "string", - "description": "The name of the AWS PrivateLink service.\n", - "willReplaceOnChanges": true + "description": "The name of the AWS PrivateLink service.\n" + }, + "validate": { + "type": "boolean", + "description": "**Private Preview** If the connection should wait for validation.\n" } }, "type": "object" @@ -3973,8 +4061,7 @@ }, "password": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistryPassword:ConnectionConfluentSchemaRegistryPassword", - "description": "The password for the Confluent Schema Registry.\n", - "willReplaceOnChanges": true + "description": "The password for the Confluent Schema Registry.\n" }, "region": { "type": "string", @@ -3993,18 +4080,15 @@ }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslCertificate:ConnectionConfluentSchemaRegistrySslCertificate", - "description": "The client certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslCertificateAuthority:ConnectionConfluentSchemaRegistrySslCertificateAuthority", - "description": "The CA certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslKey:ConnectionConfluentSchemaRegistrySslKey", - "description": "The client key for the Confluent Schema Registry.\n", - "willReplaceOnChanges": true + "description": "The client key for the Confluent Schema Registry.\n" }, "url": { "type": "string", @@ -4012,8 +4096,7 @@ }, "username": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistryUsername:ConnectionConfluentSchemaRegistryUsername", - "description": "The username for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The username for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -4050,8 +4133,7 @@ }, "password": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistryPassword:ConnectionConfluentSchemaRegistryPassword", - "description": "The password for the Confluent Schema Registry.\n", - "willReplaceOnChanges": true + "description": "The password for the Confluent Schema Registry.\n" }, "qualifiedSqlName": { "type": "string", @@ -4074,18 +4156,15 @@ }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslCertificate:ConnectionConfluentSchemaRegistrySslCertificate", - "description": "The client certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslCertificateAuthority:ConnectionConfluentSchemaRegistrySslCertificateAuthority", - "description": "The CA certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistrySslKey:ConnectionConfluentSchemaRegistrySslKey", - "description": "The client key for the Confluent Schema Registry.\n", - "willReplaceOnChanges": true + "description": "The client key for the Confluent Schema Registry.\n" }, "url": { "type": "string", @@ -4093,8 +4172,7 @@ }, "username": { "$ref": "#/types/materialize:index/ConnectionConfluentSchemaRegistryUsername:ConnectionConfluentSchemaRegistryUsername", - "description": "The username for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The username for the Confluent Schema Registry.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -4195,8 +4273,7 @@ "inputProperties": { "awsPrivatelink": { "$ref": "#/types/materialize:index/ConnectionKafkaAwsPrivatelink:ConnectionKafkaAwsPrivatelink", - "description": "AWS PrivateLink configuration. Conflicts with `kafka_broker`.\n", - "willReplaceOnChanges": true + "description": "AWS PrivateLink configuration. Conflicts with `kafka_broker`.\n" }, "comment": { "type": "string", @@ -4212,8 +4289,7 @@ "items": { "$ref": "#/types/materialize:index/ConnectionKafkaKafkaBroker:ConnectionKafkaKafkaBroker" }, - "description": "The Kafka broker's configuration.\n", - "willReplaceOnChanges": true + "description": "The Kafka broker's configuration.\n" }, "name": { "type": "string", @@ -4235,18 +4311,15 @@ }, "saslMechanisms": { "type": "string", - "description": "The SASL mechanism for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The SASL mechanism for the Kafka broker.\n" }, "saslPassword": { "$ref": "#/types/materialize:index/ConnectionKafkaSaslPassword:ConnectionKafkaSaslPassword", - "description": "The SASL password for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The SASL password for the Kafka broker.\n" }, "saslUsername": { "$ref": "#/types/materialize:index/ConnectionKafkaSaslUsername:ConnectionKafkaSaslUsername", - "description": "The SASL username for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The SASL username for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "schemaName": { "type": "string", @@ -4255,28 +4328,23 @@ }, "securityProtocol": { "type": "string", - "description": "The security protocol to use: `PLAINTEXT`, `SSL`, `SASL_PLAINTEXT`, or `SASL_SSL`.\n", - "willReplaceOnChanges": true + "description": "The security protocol to use: `PLAINTEXT`, `SSL`, `SASL_PLAINTEXT`, or `SASL_SSL`.\n" }, "sshTunnel": { "$ref": "#/types/materialize:index/ConnectionKafkaSshTunnel:ConnectionKafkaSshTunnel", - "description": "The default SSH tunnel configuration for the Kafka brokers.\n", - "willReplaceOnChanges": true + "description": "The default SSH tunnel configuration for the Kafka brokers.\n" }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionKafkaSslCertificate:ConnectionKafkaSslCertificate", - "description": "The client certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionKafkaSslCertificateAuthority:ConnectionKafkaSslCertificateAuthority", - "description": "The CA certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionKafkaSslKey:ConnectionKafkaSslKey", - "description": "The client key for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The client key for the Kafka broker.\n" }, "validate": { "type": "boolean", @@ -4288,8 +4356,7 @@ "properties": { "awsPrivatelink": { "$ref": "#/types/materialize:index/ConnectionKafkaAwsPrivatelink:ConnectionKafkaAwsPrivatelink", - "description": "AWS PrivateLink configuration. Conflicts with `kafka_broker`.\n", - "willReplaceOnChanges": true + "description": "AWS PrivateLink configuration. Conflicts with `kafka_broker`.\n" }, "comment": { "type": "string", @@ -4305,8 +4372,7 @@ "items": { "$ref": "#/types/materialize:index/ConnectionKafkaKafkaBroker:ConnectionKafkaKafkaBroker" }, - "description": "The Kafka broker's configuration.\n", - "willReplaceOnChanges": true + "description": "The Kafka broker's configuration.\n" }, "name": { "type": "string", @@ -4332,18 +4398,15 @@ }, "saslMechanisms": { "type": "string", - "description": "The SASL mechanism for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The SASL mechanism for the Kafka broker.\n" }, "saslPassword": { "$ref": "#/types/materialize:index/ConnectionKafkaSaslPassword:ConnectionKafkaSaslPassword", - "description": "The SASL password for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The SASL password for the Kafka broker.\n" }, "saslUsername": { "$ref": "#/types/materialize:index/ConnectionKafkaSaslUsername:ConnectionKafkaSaslUsername", - "description": "The SASL username for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The SASL username for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "schemaName": { "type": "string", @@ -4352,28 +4415,23 @@ }, "securityProtocol": { "type": "string", - "description": "The security protocol to use: `PLAINTEXT`, `SSL`, `SASL_PLAINTEXT`, or `SASL_SSL`.\n", - "willReplaceOnChanges": true + "description": "The security protocol to use: `PLAINTEXT`, `SSL`, `SASL_PLAINTEXT`, or `SASL_SSL`.\n" }, "sshTunnel": { "$ref": "#/types/materialize:index/ConnectionKafkaSshTunnel:ConnectionKafkaSshTunnel", - "description": "The default SSH tunnel configuration for the Kafka brokers.\n", - "willReplaceOnChanges": true + "description": "The default SSH tunnel configuration for the Kafka brokers.\n" }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionKafkaSslCertificate:ConnectionKafkaSslCertificate", - "description": "The client certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionKafkaSslCertificateAuthority:ConnectionKafkaSslCertificateAuthority", - "description": "The CA certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the Kafka broker.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionKafkaSslKey:ConnectionKafkaSslKey", - "description": "The client key for the Kafka broker.\n", - "willReplaceOnChanges": true + "description": "The client key for the Kafka broker.\n" }, "validate": { "type": "boolean", @@ -4469,8 +4527,7 @@ "inputProperties": { "awsPrivatelink": { "$ref": "#/types/materialize:index/ConnectionMysqlAwsPrivatelink:ConnectionMysqlAwsPrivatelink", - "description": "The AWS PrivateLink configuration for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The AWS PrivateLink configuration for the MySQL database.\n" }, "comment": { "type": "string", @@ -4483,8 +4540,7 @@ }, "host": { "type": "string", - "description": "The MySQL database hostname.\n", - "willReplaceOnChanges": true + "description": "The MySQL database hostname.\n" }, "name": { "type": "string", @@ -4496,13 +4552,11 @@ }, "password": { "$ref": "#/types/materialize:index/ConnectionMysqlPassword:ConnectionMysqlPassword", - "description": "The MySQL database password.\n", - "willReplaceOnChanges": true + "description": "The MySQL database password.\n" }, "port": { "type": "integer", - "description": "The MySQL database port.\n", - "willReplaceOnChanges": true + "description": "The MySQL database port.\n" }, "region": { "type": "string", @@ -4516,33 +4570,27 @@ }, "sshTunnel": { "$ref": "#/types/materialize:index/ConnectionMysqlSshTunnel:ConnectionMysqlSshTunnel", - "description": "The SSH tunnel configuration for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The SSH tunnel configuration for the MySQL database.\n" }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionMysqlSslCertificate:ConnectionMysqlSslCertificate", - "description": "The client certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionMysqlSslCertificateAuthority:ConnectionMysqlSslCertificateAuthority", - "description": "The CA certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionMysqlSslKey:ConnectionMysqlSslKey", - "description": "The client key for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The client key for the MySQL database.\n" }, "sslMode": { "type": "string", - "description": "The SSL mode for the MySQL database. Allowed values are disabled, required, verify-ca, verify-identity.\n", - "willReplaceOnChanges": true + "description": "The SSL mode for the MySQL database. Allowed values are disabled, required, verify-ca, verify-identity.\n" }, "user": { "$ref": "#/types/materialize:index/ConnectionMysqlUser:ConnectionMysqlUser", - "description": "The MySQL database username.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The MySQL database username.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -4558,8 +4606,7 @@ "properties": { "awsPrivatelink": { "$ref": "#/types/materialize:index/ConnectionMysqlAwsPrivatelink:ConnectionMysqlAwsPrivatelink", - "description": "The AWS PrivateLink configuration for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The AWS PrivateLink configuration for the MySQL database.\n" }, "comment": { "type": "string", @@ -4572,8 +4619,7 @@ }, "host": { "type": "string", - "description": "The MySQL database hostname.\n", - "willReplaceOnChanges": true + "description": "The MySQL database hostname.\n" }, "name": { "type": "string", @@ -4585,13 +4631,11 @@ }, "password": { "$ref": "#/types/materialize:index/ConnectionMysqlPassword:ConnectionMysqlPassword", - "description": "The MySQL database password.\n", - "willReplaceOnChanges": true + "description": "The MySQL database password.\n" }, "port": { "type": "integer", - "description": "The MySQL database port.\n", - "willReplaceOnChanges": true + "description": "The MySQL database port.\n" }, "qualifiedSqlName": { "type": "string", @@ -4609,33 +4653,27 @@ }, "sshTunnel": { "$ref": "#/types/materialize:index/ConnectionMysqlSshTunnel:ConnectionMysqlSshTunnel", - "description": "The SSH tunnel configuration for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The SSH tunnel configuration for the MySQL database.\n" }, "sslCertificate": { "$ref": "#/types/materialize:index/ConnectionMysqlSslCertificate:ConnectionMysqlSslCertificate", - "description": "The client certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The client certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslCertificateAuthority": { "$ref": "#/types/materialize:index/ConnectionMysqlSslCertificateAuthority:ConnectionMysqlSslCertificateAuthority", - "description": "The CA certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The CA certificate for the MySQL database.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "sslKey": { "$ref": "#/types/materialize:index/ConnectionMysqlSslKey:ConnectionMysqlSslKey", - "description": "The client key for the MySQL database.\n", - "willReplaceOnChanges": true + "description": "The client key for the MySQL database.\n" }, "sslMode": { "type": "string", - "description": "The SSL mode for the MySQL database. Allowed values are disabled, required, verify-ca, verify-identity.\n", - "willReplaceOnChanges": true + "description": "The SSL mode for the MySQL database. Allowed values are disabled, required, verify-ca, verify-identity.\n" }, "user": { "$ref": "#/types/materialize:index/ConnectionMysqlUser:ConnectionMysqlUser", - "description": "The MySQL database username.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n", - "willReplaceOnChanges": true + "description": "The MySQL database username.. Can be supplied as either free text using `text` or reference to a secret object using `secret`.\n" }, "validate": { "type": "boolean", @@ -7566,6 +7604,150 @@ "type": "object" } }, + "materialize:index/sCIM2Group:SCIM2Group": { + "description": "The SCIM group resource allows you to manage user groups in Frontegg.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\n// Create a SCIM group\nconst exampleScimGroup = new materialize.SCIM2Group(\"exampleScimGroup\", {description: \"Example SCIM group\"});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\n# Create a SCIM group\nexample_scim_group = materialize.SCIM2Group(\"exampleScimGroup\", description=\"Example SCIM group\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n // Create a SCIM group\n var exampleScimGroup = new Materialize.SCIM2Group(\"exampleScimGroup\", new()\n {\n Description = \"Example SCIM group\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := materialize.NewSCIM2Group(ctx, \"exampleScimGroup\", \u0026materialize.SCIM2GroupArgs{\n\t\t\tDescription: pulumi.String(\"Example SCIM group\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.SCIM2Group;\nimport com.pulumi.materialize.SCIM2GroupArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var exampleScimGroup = new SCIM2Group(\"exampleScimGroup\", SCIM2GroupArgs.builder() \n .description(\"Example SCIM group\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n # Create a SCIM group\n exampleScimGroup:\n type: materialize:SCIM2Group\n properties:\n description: Example SCIM group\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\nSCIM Group ID can be found using the `materialize_scim_groups` data source\n\n```sh\n $ pulumi import materialize:index/sCIM2Group:SCIM2Group example_scim_group \u003cscim_group_id\u003e\n```\n\n ", + "properties": { + "description": { + "type": "string", + "description": "A description of the SCIM group.\n" + }, + "name": { + "type": "string", + "description": "The name of the SCIM group.\n" + } + }, + "required": [ + "name" + ], + "inputProperties": { + "description": { + "type": "string", + "description": "A description of the SCIM group.\n" + }, + "name": { + "type": "string", + "description": "The name of the SCIM group.\n" + } + }, + "stateInputs": { + "description": "Input properties used for looking up and filtering SCIM2Group resources.\n", + "properties": { + "description": { + "type": "string", + "description": "A description of the SCIM group.\n" + }, + "name": { + "type": "string", + "description": "The name of the SCIM group.\n" + } + }, + "type": "object" + } + }, + "materialize:index/sCIM2GroupRoles:SCIM2GroupRoles": { + "description": "The materialize_scim_group_role resource allows managing roles within a SCIM group in Frontegg.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\n// Create a SCIM group role\nconst scimGroupExample = new materialize.SCIM2Group(\"scimGroupExample\", {description: \"scim_group_example\"});\nconst scimGroupRolesExample = new materialize.SCIM2GroupRoles(\"scimGroupRolesExample\", {\n groupId: scimGroupExample.id,\n roles: [\n \"Admin\",\n \"Member\",\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\n# Create a SCIM group role\nscim_group_example = materialize.SCIM2Group(\"scimGroupExample\", description=\"scim_group_example\")\nscim_group_roles_example = materialize.SCIM2GroupRoles(\"scimGroupRolesExample\",\n group_id=scim_group_example.id,\n roles=[\n \"Admin\",\n \"Member\",\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n // Create a SCIM group role\n var scimGroupExample = new Materialize.SCIM2Group(\"scimGroupExample\", new()\n {\n Description = \"scim_group_example\",\n });\n\n var scimGroupRolesExample = new Materialize.SCIM2GroupRoles(\"scimGroupRolesExample\", new()\n {\n GroupId = scimGroupExample.Id,\n Roles = new[]\n {\n \"Admin\",\n \"Member\",\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tscimGroupExample, err := materialize.NewSCIM2Group(ctx, \"scimGroupExample\", \u0026materialize.SCIM2GroupArgs{\n\t\t\tDescription: pulumi.String(\"scim_group_example\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = materialize.NewSCIM2GroupRoles(ctx, \"scimGroupRolesExample\", \u0026materialize.SCIM2GroupRolesArgs{\n\t\t\tGroupId: scimGroupExample.ID(),\n\t\t\tRoles: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Admin\"),\n\t\t\t\tpulumi.String(\"Member\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.SCIM2Group;\nimport com.pulumi.materialize.SCIM2GroupArgs;\nimport com.pulumi.materialize.SCIM2GroupRoles;\nimport com.pulumi.materialize.SCIM2GroupRolesArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var scimGroupExample = new SCIM2Group(\"scimGroupExample\", SCIM2GroupArgs.builder() \n .description(\"scim_group_example\")\n .build());\n\n var scimGroupRolesExample = new SCIM2GroupRoles(\"scimGroupRolesExample\", SCIM2GroupRolesArgs.builder() \n .groupId(scimGroupExample.id())\n .roles( \n \"Admin\",\n \"Member\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n # Create a SCIM group role\n scimGroupExample:\n type: materialize:SCIM2Group\n properties:\n description: scim_group_example\n scimGroupRolesExample:\n type: materialize:SCIM2GroupRoles\n properties:\n groupId: ${scimGroupExample.id}\n roles:\n - Admin\n - Member\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\nSCIM Group ID can be found using the `materialize_scim_groups` data source\n\n```sh\n $ pulumi import materialize:index/sCIM2GroupRoles:SCIM2GroupRoles example_scim_group_roles \u003cscim_group_id\u003e\n```\n\n ", + "properties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of role names to assign to the SCIM group.\n" + } + }, + "required": [ + "groupId" + ], + "inputProperties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of role names to assign to the SCIM group.\n" + } + }, + "requiredInputs": [ + "groupId" + ], + "stateInputs": { + "description": "Input properties used for looking up and filtering SCIM2GroupRoles resources.\n", + "properties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of role names to assign to the SCIM group.\n" + } + }, + "type": "object" + } + }, + "materialize:index/sCIM2GroupUsers:SCIM2GroupUsers": { + "description": "The materialize.SCIM2GroupUsers resource allows managing users within a SCIM group in Frontegg.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\n// Create a SCIM group users resource\nconst exampleUsers1 = new materialize.User(\"exampleUsers1\", {\n email: \"example-user1@example.com\",\n roles: [\"Member\"],\n});\nconst exampleUsers2 = new materialize.User(\"exampleUsers2\", {\n email: \"example-user2@example.com\",\n roles: [\"Member\"],\n});\nconst exampleScimGroupUsers = new materialize.SCIM2GroupUsers(\"exampleScimGroupUsers\", {\n groupId: materialize_scim_group.example_scim_group.id,\n users: [\n exampleUsers1.id,\n exampleUsers2.id,\n ],\n});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\n# Create a SCIM group users resource\nexample_users1 = materialize.User(\"exampleUsers1\",\n email=\"example-user1@example.com\",\n roles=[\"Member\"])\nexample_users2 = materialize.User(\"exampleUsers2\",\n email=\"example-user2@example.com\",\n roles=[\"Member\"])\nexample_scim_group_users = materialize.SCIM2GroupUsers(\"exampleScimGroupUsers\",\n group_id=materialize_scim_group[\"example_scim_group\"][\"id\"],\n users=[\n example_users1.id,\n example_users2.id,\n ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n // Create a SCIM group users resource\n var exampleUsers1 = new Materialize.User(\"exampleUsers1\", new()\n {\n Email = \"example-user1@example.com\",\n Roles = new[]\n {\n \"Member\",\n },\n });\n\n var exampleUsers2 = new Materialize.User(\"exampleUsers2\", new()\n {\n Email = \"example-user2@example.com\",\n Roles = new[]\n {\n \"Member\",\n },\n });\n\n var exampleScimGroupUsers = new Materialize.SCIM2GroupUsers(\"exampleScimGroupUsers\", new()\n {\n GroupId = materialize_scim_group.Example_scim_group.Id,\n Users = new[]\n {\n exampleUsers1.Id,\n exampleUsers2.Id,\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleUsers1, err := materialize.NewUser(ctx, \"exampleUsers1\", \u0026materialize.UserArgs{\n\t\t\tEmail: pulumi.String(\"example-user1@example.com\"),\n\t\t\tRoles: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Member\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texampleUsers2, err := materialize.NewUser(ctx, \"exampleUsers2\", \u0026materialize.UserArgs{\n\t\t\tEmail: pulumi.String(\"example-user2@example.com\"),\n\t\t\tRoles: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Member\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = materialize.NewSCIM2GroupUsers(ctx, \"exampleScimGroupUsers\", \u0026materialize.SCIM2GroupUsersArgs{\n\t\t\tGroupId: pulumi.Any(materialize_scim_group.Example_scim_group.Id),\n\t\t\tUsers: pulumi.StringArray{\n\t\t\t\texampleUsers1.ID(),\n\t\t\t\texampleUsers2.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.User;\nimport com.pulumi.materialize.UserArgs;\nimport com.pulumi.materialize.SCIM2GroupUsers;\nimport com.pulumi.materialize.SCIM2GroupUsersArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var exampleUsers1 = new User(\"exampleUsers1\", UserArgs.builder() \n .email(\"example-user1@example.com\")\n .roles(\"Member\")\n .build());\n\n var exampleUsers2 = new User(\"exampleUsers2\", UserArgs.builder() \n .email(\"example-user2@example.com\")\n .roles(\"Member\")\n .build());\n\n var exampleScimGroupUsers = new SCIM2GroupUsers(\"exampleScimGroupUsers\", SCIM2GroupUsersArgs.builder() \n .groupId(materialize_scim_group.example_scim_group().id())\n .users( \n exampleUsers1.id(),\n exampleUsers2.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n # Create a SCIM group users resource\n exampleUsers1:\n type: materialize:User\n properties:\n email: example-user1@example.com\n roles:\n - Member\n exampleUsers2:\n type: materialize:User\n properties:\n email: example-user2@example.com\n roles:\n - Member\n exampleScimGroupUsers:\n type: materialize:SCIM2GroupUsers\n properties:\n groupId: ${materialize_scim_group.example_scim_group.id}\n users:\n - ${exampleUsers1.id}\n - ${exampleUsers2.id}\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\nSCIM group ID can be found using the `materialize_scim_groups` data source.\n\n```sh\n $ pulumi import materialize:index/sCIM2GroupUsers:SCIM2GroupUsers example_scim_group_user \u003cscim_group_id\u003e\n```\n\n ", + "properties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "users": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of user IDs to assign to the SCIM group.\n" + } + }, + "required": [ + "groupId" + ], + "inputProperties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "users": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of user IDs to assign to the SCIM group.\n" + } + }, + "requiredInputs": [ + "groupId" + ], + "stateInputs": { + "description": "Input properties used for looking up and filtering SCIM2GroupUsers resources.\n", + "properties": { + "groupId": { + "type": "string", + "description": "The ID of the SCIM group.\n" + }, + "users": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of user IDs to assign to the SCIM group.\n" + } + }, + "type": "object" + } + }, "materialize:index/sSOConfig:SSOConfig": { "description": "The SSO configuration resource allows you to create, read, update, and delete SSO configurations.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as materialize from \"@pulumi/materialize\";\n\nconst exampleSsoConfig = new materialize.SSOConfig(\"exampleSsoConfig\", {\n enabled: true,\n oidcClientId: \"client-id\",\n oidcSecret: \"client-secret\",\n publicCertificate: \"PUBLIC_CERTIFICATE\",\n signRequest: true,\n ssoEndpoint: \"https://sso.example2.com\",\n type: \"saml\",\n});\n```\n```python\nimport pulumi\nimport pulumi_materialize as materialize\n\nexample_sso_config = materialize.SSOConfig(\"exampleSsoConfig\",\n enabled=True,\n oidc_client_id=\"client-id\",\n oidc_secret=\"client-secret\",\n public_certificate=\"PUBLIC_CERTIFICATE\",\n sign_request=True,\n sso_endpoint=\"https://sso.example2.com\",\n type=\"saml\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Materialize = Pulumi.Materialize;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var exampleSsoConfig = new Materialize.SSOConfig(\"exampleSsoConfig\", new()\n {\n Enabled = true,\n OidcClientId = \"client-id\",\n OidcSecret = \"client-secret\",\n PublicCertificate = \"PUBLIC_CERTIFICATE\",\n SignRequest = true,\n SsoEndpoint = \"https://sso.example2.com\",\n Type = \"saml\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-materialize/sdk/go/materialize\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := materialize.NewSSOConfig(ctx, \"exampleSsoConfig\", \u0026materialize.SSOConfigArgs{\n\t\t\tEnabled: pulumi.Bool(true),\n\t\t\tOidcClientId: pulumi.String(\"client-id\"),\n\t\t\tOidcSecret: pulumi.String(\"client-secret\"),\n\t\t\tPublicCertificate: pulumi.String(\"PUBLIC_CERTIFICATE\"),\n\t\t\tSignRequest: pulumi.Bool(true),\n\t\t\tSsoEndpoint: pulumi.String(\"https://sso.example2.com\"),\n\t\t\tType: pulumi.String(\"saml\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.materialize.SSOConfig;\nimport com.pulumi.materialize.SSOConfigArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var exampleSsoConfig = new SSOConfig(\"exampleSsoConfig\", SSOConfigArgs.builder() \n .enabled(true)\n .oidcClientId(\"client-id\")\n .oidcSecret(\"client-secret\")\n .publicCertificate(\"PUBLIC_CERTIFICATE\")\n .signRequest(true)\n .ssoEndpoint(\"https://sso.example2.com\")\n .type(\"saml\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n exampleSsoConfig:\n type: materialize:SSOConfig\n properties:\n enabled: true\n oidcClientId: client-id\n oidcSecret: client-secret\n publicCertificate: PUBLIC_CERTIFICATE\n signRequest: true\n ssoEndpoint: https://sso.example2.com\n type: saml\n```\n{{% /example %}}\n{{% /examples %}}\n\n## Import\n\nThe SSO Configuration ID can be found using the `materialize_sso_config` data source\n\n```sh\n $ pulumi import materialize:index/sSOConfig:SSOConfig example \u003csso_config_id\u003e\n```\n\n ", "properties": { @@ -8797,9 +8979,13 @@ "$ref": "#/types/materialize:index/SourceLoadgenExposeProgress:SourceLoadgenExposeProgress", "description": "The name of the progress subsource for the source. If this is not specified, the subsource will be named `\u003csrc_name\u003e_progress`.\n" }, + "keyValueOptions": { + "$ref": "#/types/materialize:index/SourceLoadgenKeyValueOptions:SourceLoadgenKeyValueOptions", + "description": "KEY VALUE Load Generator Options.\n" + }, "loadGeneratorType": { "type": "string", - "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH].\n" + "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH KEY VALUE].\n" }, "marketingOptions": { "$ref": "#/types/materialize:index/SourceLoadgenMarketingOptions:SourceLoadgenMarketingOptions", @@ -8880,9 +9066,14 @@ "description": "The name of the progress subsource for the source. If this is not specified, the subsource will be named `\u003csrc_name\u003e_progress`.\n", "willReplaceOnChanges": true }, + "keyValueOptions": { + "$ref": "#/types/materialize:index/SourceLoadgenKeyValueOptions:SourceLoadgenKeyValueOptions", + "description": "KEY VALUE Load Generator Options.\n", + "willReplaceOnChanges": true + }, "loadGeneratorType": { "type": "string", - "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH].\n", + "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH KEY VALUE].\n", "willReplaceOnChanges": true }, "marketingOptions": { @@ -8949,9 +9140,14 @@ "description": "The name of the progress subsource for the source. If this is not specified, the subsource will be named `\u003csrc_name\u003e_progress`.\n", "willReplaceOnChanges": true }, + "keyValueOptions": { + "$ref": "#/types/materialize:index/SourceLoadgenKeyValueOptions:SourceLoadgenKeyValueOptions", + "description": "KEY VALUE Load Generator Options.\n", + "willReplaceOnChanges": true + }, "loadGeneratorType": { "type": "string", - "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH].\n", + "description": "The load generator types: [AUCTION MARKETING COUNTER TPCH KEY VALUE].\n", "willReplaceOnChanges": true }, "marketingOptions": { diff --git a/provider/go.mod b/provider/go.mod index 379d458..59e3227 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -5,7 +5,7 @@ go 1.20 replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20230912190043-e6d96b3b8f7e require ( - github.com/MaterializeInc/terraform-provider-materialize v0.6.9 + github.com/MaterializeInc/terraform-provider-materialize v0.6.10 github.com/pulumi/pulumi-terraform-bridge/v3 v3.59.0 github.com/pulumi/pulumi/sdk/v3 v3.81.0 ) diff --git a/provider/go.sum b/provider/go.sum index b962b41..3e58138 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -715,8 +715,8 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/MaterializeInc/terraform-provider-materialize v0.6.9 h1:+1uVe+NiRZs8flDcj0fAWYHCk3GrzagickjFn3cOSV0= -github.com/MaterializeInc/terraform-provider-materialize v0.6.9/go.mod h1:OiKVThIYxLU5nQFzABdOEJOaQ7Q9wZAOnsJX4UTRSq0= +github.com/MaterializeInc/terraform-provider-materialize v0.6.10 h1:dJL+PyNqP1pWLWtJCLnWcc4l3ktYXnJI6hEFOZtgWTQ= +github.com/MaterializeInc/terraform-provider-materialize v0.6.10/go.mod h1:OiKVThIYxLU5nQFzABdOEJOaQ7Q9wZAOnsJX4UTRSq0= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= diff --git a/provider/resources.go b/provider/resources.go index 8f45ddd..a38e36a 100644 --- a/provider/resources.go +++ b/provider/resources.go @@ -109,6 +109,7 @@ func Provider() tfbridge.ProviderInfo { "materialize_index": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "Index")}, "materialize_materialized_view": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "MaterializedView")}, "materialize_materialized_view_grant": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantMaterializedView")}, + "materialize_region": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "CloudRegion")}, "materialize_role": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "Role")}, "materialize_role_grant": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantRole")}, "materialize_role_parameter": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "RoleParameter")}, @@ -116,6 +117,9 @@ func Provider() tfbridge.ProviderInfo { "materialize_schema_grant": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantSchema")}, "materialize_schema_grant_default_privilege": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantSchemaDefaultPrivilege")}, "materialize_scim_config": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "SCIM2Configuration")}, + "materialize_scim_group": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "SCIM2Group")}, + "materialize_scim_group_roles": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "SCIM2GroupRoles")}, + "materialize_scim_group_users": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "SCIM2GroupUsers")}, "materialize_secret": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "Secret")}, "materialize_secret_grant": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantSecret")}, "materialize_secret_grant_default_privilege": {Tok: tfbridge.MakeResource(mainPkg, mainMod, "GrantSecretDefaultPrivilege")},