11package client
22
33import (
4+ "bytes"
45 "encoding/json"
56 "fmt"
67 "io"
@@ -24,8 +25,18 @@ type MeshWorkspaceMetadata struct {
2425}
2526
2627type 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
3142func (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+ }
0 commit comments