1package tfe 2 3import ( 4 "context" 5 "fmt" 6 "net/url" 7) 8 9// Compile-time proof of interface implementation. 10var _ AdminWorkspaces = (*adminWorkspaces)(nil) 11 12// AdminWorkspaces describes all the admin workspace related methods that the Terraform Enterprise API supports. 13// Note that admin settings are only available in Terraform Enterprise. 14// 15// TFE API docs: https://www.terraform.io/docs/cloud/api/admin/workspaces.html 16type AdminWorkspaces interface { 17 // List all the workspaces within a workspace. 18 List(ctx context.Context, options AdminWorkspaceListOptions) (*AdminWorkspaceList, error) 19 20 // Read a workspace by its ID. 21 Read(ctx context.Context, workspaceID string) (*AdminWorkspace, error) 22 23 // Delete a workspace by its ID. 24 Delete(ctx context.Context, workspaceID string) error 25} 26 27// adminWorkspaces implements AdminWorkspaces. 28type adminWorkspaces struct { 29 client *Client 30} 31 32type AdminVCSRepo struct { 33 Identifier string `jsonapi:"attr,identifier"` 34} 35 36// AdminWorkspaces represents a Terraform Enterprise admin workspace. 37type AdminWorkspace struct { 38 ID string `jsonapi:"primary,workspaces"` 39 Name string `jsonapi:"attr,name"` 40 Locked bool `jsonapi:"attr,locked"` 41 VCSRepo *AdminVCSRepo `jsonapi:"attr,vcs-repo"` 42 43 // Relations 44 Organization *Organization `jsonapi:"relation,organization"` 45 CurrentRun *Run `jsonapi:"relation,current-run"` 46} 47 48// AdminWorkspaceListOptions represents the options for listing workspaces. 49type AdminWorkspaceListOptions struct { 50 ListOptions 51 52 // A query string (partial workspace name) used to filter the results. 53 // https://www.terraform.io/docs/cloud/api/admin/workspaces.html#query-parameters 54 Query *string `url:"q,omitempty"` 55 56 // A list of relations to include. See available resources 57 // https://www.terraform.io/docs/cloud/api/admin/workspaces.html#available-related-resources 58 Include *string `url:"include"` 59} 60 61// AdminWorkspaceList represents a list of workspaces. 62type AdminWorkspaceList struct { 63 *Pagination 64 Items []*AdminWorkspace 65} 66 67// List all the workspaces within a worksapce. 68func (s *adminWorkspaces) List(ctx context.Context, options AdminWorkspaceListOptions) (*AdminWorkspaceList, error) { 69 u := "admin/workspaces" 70 req, err := s.client.newRequest("GET", u, &options) 71 if err != nil { 72 return nil, err 73 } 74 75 awl := &AdminWorkspaceList{} 76 err = s.client.do(ctx, req, awl) 77 if err != nil { 78 return nil, err 79 } 80 81 return awl, nil 82} 83 84// Read a workspace by its ID. 85func (s *adminWorkspaces) Read(ctx context.Context, workspaceID string) (*AdminWorkspace, error) { 86 if !validStringID(&workspaceID) { 87 return nil, ErrInvalidWorkspaceValue 88 } 89 90 u := fmt.Sprintf("admin/workspaces/%s", url.QueryEscape(workspaceID)) 91 req, err := s.client.newRequest("GET", u, nil) 92 if err != nil { 93 return nil, err 94 } 95 96 aw := &AdminWorkspace{} 97 err = s.client.do(ctx, req, aw) 98 if err != nil { 99 return nil, err 100 } 101 102 return aw, nil 103} 104 105// Delete a workspace by its ID. 106func (s *adminWorkspaces) Delete(ctx context.Context, workspaceID string) error { 107 if !validStringID(&workspaceID) { 108 return ErrInvalidWorkspaceValue 109 } 110 111 u := fmt.Sprintf("admin/workspaces/%s", url.QueryEscape(workspaceID)) 112 req, err := s.client.newRequest("DELETE", u, nil) 113 if err != nil { 114 return err 115 } 116 117 return s.client.do(ctx, req, nil) 118} 119