Skip to content

Commit e12c449

Browse files
committed
feat: workspace resource
1 parent 3a9243f commit e12c449

File tree

6 files changed

+414
-3
lines changed

6 files changed

+414
-3
lines changed

client/workspace.go

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package client
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"fmt"
67
"io"
@@ -24,8 +25,18 @@ type MeshWorkspaceMetadata struct {
2425
}
2526

2627
type MeshWorkspaceSpec struct {
27-
DisplayName string `json:"displayName" tfsdk:"display_name"`
28-
Tags map[string][]string `json:"tags" tfsdk:"tags"`
28+
DisplayName string `json:"displayName" tfsdk:"display_name"`
29+
Tags map[string][]string `json:"tags" tfsdk:"tags"`
30+
PlatformBuilderAccessEnabled *bool `json:"platformBuilderAccessEnabled,omitempty" tfsdk:"platform_builder_access_enabled"`
31+
}
32+
33+
type MeshWorkspaceCreate struct {
34+
ApiVersion string `json:"apiVersion" tfsdk:"api_version"`
35+
Metadata MeshWorkspaceCreateMetadata `json:"metadata" tfsdk:"metadata"`
36+
Spec MeshWorkspaceSpec `json:"spec" tfsdk:"spec"`
37+
}
38+
type MeshWorkspaceCreateMetadata struct {
39+
Name string `json:"name" tfsdk:"name"`
2940
}
3041

3142
func (c *MeshStackProviderClient) urlForWorkspace(name string) *url.URL {
@@ -67,3 +78,82 @@ func (c *MeshStackProviderClient) ReadWorkspace(name string) (*MeshWorkspace, er
6778
}
6879
return &workspace, nil
6980
}
81+
82+
func (c *MeshStackProviderClient) CreateWorkspace(workspace *MeshWorkspaceCreate) (*MeshWorkspace, error) {
83+
paylod, err := json.Marshal(workspace)
84+
if err != nil {
85+
return nil, err
86+
}
87+
88+
req, err := http.NewRequest("POST", c.endpoints.Workspaces.String(), bytes.NewBuffer(paylod))
89+
if err != nil {
90+
return nil, err
91+
}
92+
req.Header.Set("Content-Type", CONTENT_TYPE_WORKSPACE)
93+
req.Header.Set("Accept", CONTENT_TYPE_WORKSPACE)
94+
95+
res, err := c.doAuthenticatedRequest(req)
96+
if err != nil {
97+
return nil, err
98+
}
99+
defer res.Body.Close()
100+
101+
data, err := io.ReadAll(res.Body)
102+
if err != nil {
103+
return nil, err
104+
}
105+
106+
if !isSuccessHTTPStatus(res) {
107+
return nil, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, data)
108+
}
109+
110+
var createdWorkspace MeshWorkspace
111+
err = json.Unmarshal(data, &createdWorkspace)
112+
if err != nil {
113+
return nil, err
114+
}
115+
return &createdWorkspace, nil
116+
}
117+
118+
func (c *MeshStackProviderClient) UpdateWorkspace(name string, workspace *MeshWorkspaceCreate) (*MeshWorkspace, error) {
119+
targetUrl := c.urlForWorkspace(name)
120+
121+
paylod, err := json.Marshal(workspace)
122+
if err != nil {
123+
return nil, err
124+
}
125+
126+
req, err := http.NewRequest("PUT", targetUrl.String(), bytes.NewBuffer(paylod))
127+
if err != nil {
128+
return nil, err
129+
}
130+
req.Header.Set("Content-Type", CONTENT_TYPE_WORKSPACE)
131+
req.Header.Set("Accept", CONTENT_TYPE_WORKSPACE)
132+
133+
res, err := c.doAuthenticatedRequest(req)
134+
if err != nil {
135+
return nil, err
136+
}
137+
defer res.Body.Close()
138+
139+
data, err := io.ReadAll(res.Body)
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
if !isSuccessHTTPStatus(res) {
145+
return nil, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, data)
146+
}
147+
148+
var updatedWorkspace MeshWorkspace
149+
err = json.Unmarshal(data, &updatedWorkspace)
150+
if err != nil {
151+
return nil, err
152+
}
153+
return &updatedWorkspace, nil
154+
}
155+
156+
func (c *MeshStackProviderClient) DeleteWorkspace(name string) error {
157+
targetUrl := c.urlForWorkspace(name)
158+
return c.deleteMeshObject(*targetUrl, 204)
159+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data "meshstack_workspace" "example" {
2+
metadata = {
3+
name = "my-workspace-identifier"
4+
}
5+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
resource "meshstack_workspace" "example" {
2+
metadata = {
3+
name = "my-workspace-identifier"
4+
}
5+
spec = {
6+
display_name = "My Workspace's Display Name"
7+
tags = {
8+
"cost-center" = [
9+
"12345"
10+
]
11+
}
12+
}
13+
}

internal/provider/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ func (p *MeshStackProvider) Resources(ctx context.Context) []func() resource.Res
107107
NewTenantResource,
108108
NewProjectUserBindingResource,
109109
NewProjectGroupBindingResource,
110+
NewWorkspaceResource,
110111
NewBuildingBlockResource,
111112
NewBuildingBlockV2Resource,
112113
NewTagDefinitionResource,
@@ -121,6 +122,7 @@ func (p *MeshStackProvider) DataSources(ctx context.Context) []func() datasource
121122
NewProjectsDataSource,
122123
NewProjectUserBindingDataSource,
123124
NewProjectGroupBindingDataSource,
125+
NewWorkspaceDataSource,
124126
NewTenantDataSource,
125127
NewTagDefinitionDataSource,
126128
NewTagDefinitionsDataSource,

internal/provider/workspace_data_source.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (d *workspaceDataSource) Schema(_ context.Context, _ datasource.SchemaReque
5151
},
5252

5353
"metadata": schema.SingleNestedAttribute{
54-
Computed: true,
54+
Required: true,
5555
Attributes: map[string]schema.Attribute{
5656
"name": schema.StringAttribute{
5757
MarkdownDescription: "Name of the workspace. Is used to identify the workspace.",
@@ -80,6 +80,10 @@ func (d *workspaceDataSource) Schema(_ context.Context, _ datasource.SchemaReque
8080
ElementType: types.ListType{ElemType: types.StringType},
8181
Computed: true,
8282
},
83+
"platform_builder_access_enabled": schema.BoolAttribute{
84+
MarkdownDescription: "Whether platform builder access is enabled for the Workspace.",
85+
Computed: true,
86+
},
8387
},
8488
},
8589
},

0 commit comments

Comments
 (0)