11package client
22
33import (
4+ "bytes"
45 "encoding/json"
56 "fmt"
67 "io"
78 "net/http"
89 "net/url"
910)
1011
11- const CONTENT_TYPE_WORKSPACE = "application/vnd.meshcloud.api.meshworkspace.v1 .hal+json"
12+ const CONTENT_TYPE_WORKSPACE = "application/vnd.meshcloud.api.meshworkspace.v2 .hal+json"
1213
1314type MeshWorkspace struct {
1415 ApiVersion string `json:"apiVersion" tfsdk:"api_version"`
@@ -18,14 +19,25 @@ type MeshWorkspace struct {
1819}
1920
2021type MeshWorkspaceMetadata struct {
21- Name string `json:"name" tfsdk:"name"`
22- CreatedOn string `json:"createdOn" tfsdk:"created_on"`
23- DeletedOn * string `json:"deletedOn" tfsdk:"deleted_on"`
22+ Name string `json:"name" tfsdk:"name"`
23+ CreatedOn string `json:"createdOn" tfsdk:"created_on"`
24+ DeletedOn * string `json:"deletedOn" tfsdk:"deleted_on"`
25+ Tags map [string ][]string `json:"tags" tfsdk:"tags"`
2426}
2527
2628type MeshWorkspaceSpec struct {
27- DisplayName string `json:"displayName" tfsdk:"display_name"`
28- Tags map [string ][]string `json:"tags" tfsdk:"tags"`
29+ DisplayName string `json:"displayName" tfsdk:"display_name"`
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"`
40+ Tags map [string ][]string `json:"tags" tfsdk:"tags"`
2941}
3042
3143func (c * MeshStackProviderClient ) urlForWorkspace (name string ) * url.URL {
@@ -67,3 +79,82 @@ func (c *MeshStackProviderClient) ReadWorkspace(name string) (*MeshWorkspace, er
6779 }
6880 return & workspace , nil
6981}
82+
83+ func (c * MeshStackProviderClient ) CreateWorkspace (workspace * MeshWorkspaceCreate ) (* MeshWorkspace , error ) {
84+ paylod , err := json .Marshal (workspace )
85+ if err != nil {
86+ return nil , err
87+ }
88+
89+ req , err := http .NewRequest ("POST" , c .endpoints .Workspaces .String (), bytes .NewBuffer (paylod ))
90+ if err != nil {
91+ return nil , err
92+ }
93+ req .Header .Set ("Content-Type" , CONTENT_TYPE_WORKSPACE )
94+ req .Header .Set ("Accept" , CONTENT_TYPE_WORKSPACE )
95+
96+ res , err := c .doAuthenticatedRequest (req )
97+ if err != nil {
98+ return nil , err
99+ }
100+ defer res .Body .Close ()
101+
102+ data , err := io .ReadAll (res .Body )
103+ if err != nil {
104+ return nil , err
105+ }
106+
107+ if ! isSuccessHTTPStatus (res ) {
108+ return nil , fmt .Errorf ("unexpected status code: %d, %s" , res .StatusCode , data )
109+ }
110+
111+ var createdWorkspace MeshWorkspace
112+ err = json .Unmarshal (data , & createdWorkspace )
113+ if err != nil {
114+ return nil , err
115+ }
116+ return & createdWorkspace , nil
117+ }
118+
119+ func (c * MeshStackProviderClient ) UpdateWorkspace (name string , workspace * MeshWorkspaceCreate ) (* MeshWorkspace , error ) {
120+ targetUrl := c .urlForWorkspace (name )
121+
122+ paylod , err := json .Marshal (workspace )
123+ if err != nil {
124+ return nil , err
125+ }
126+
127+ req , err := http .NewRequest ("PUT" , targetUrl .String (), bytes .NewBuffer (paylod ))
128+ if err != nil {
129+ return nil , err
130+ }
131+ req .Header .Set ("Content-Type" , CONTENT_TYPE_WORKSPACE )
132+ req .Header .Set ("Accept" , CONTENT_TYPE_WORKSPACE )
133+
134+ res , err := c .doAuthenticatedRequest (req )
135+ if err != nil {
136+ return nil , err
137+ }
138+ defer res .Body .Close ()
139+
140+ data , err := io .ReadAll (res .Body )
141+ if err != nil {
142+ return nil , err
143+ }
144+
145+ if ! isSuccessHTTPStatus (res ) {
146+ return nil , fmt .Errorf ("unexpected status code: %d, %s" , res .StatusCode , data )
147+ }
148+
149+ var updatedWorkspace MeshWorkspace
150+ err = json .Unmarshal (data , & updatedWorkspace )
151+ if err != nil {
152+ return nil , err
153+ }
154+ return & updatedWorkspace , nil
155+ }
156+
157+ func (c * MeshStackProviderClient ) DeleteWorkspace (name string ) error {
158+ targetUrl := c .urlForWorkspace (name )
159+ return c .deleteMeshObject (* targetUrl , 204 )
160+ }
0 commit comments