1package tfe 2 3import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/url" 8 "time" 9) 10 11// Compile-time proof of interface implementation. 12var _ OrganizationTokens = (*organizationTokens)(nil) 13 14// OrganizationTokens describes all the organization token related methods 15// that the Terraform Enterprise API supports. 16// 17// TFE API docs: 18// https://www.terraform.io/docs/enterprise/api/organization-tokens.html 19type OrganizationTokens interface { 20 // Generate a new organization token, replacing any existing token. 21 Generate(ctx context.Context, organization string) (*OrganizationToken, error) 22 23 // Read an organization token. 24 Read(ctx context.Context, organization string) (*OrganizationToken, error) 25 26 // Delete an organization token. 27 Delete(ctx context.Context, organization string) error 28} 29 30// organizationTokens implements OrganizationTokens. 31type organizationTokens struct { 32 client *Client 33} 34 35// OrganizationToken represents a Terraform Enterprise organization token. 36type OrganizationToken struct { 37 ID string `jsonapi:"primary,authentication-tokens"` 38 CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"` 39 Description string `jsonapi:"attr,description"` 40 LastUsedAt time.Time `jsonapi:"attr,last-used-at,iso8601"` 41 Token string `jsonapi:"attr,token"` 42} 43 44// Generate a new organization token, replacing any existing token. 45func (s *organizationTokens) Generate(ctx context.Context, organization string) (*OrganizationToken, error) { 46 if !validStringID(&organization) { 47 return nil, errors.New("invalid value for organization") 48 } 49 50 u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization)) 51 req, err := s.client.newRequest("POST", u, nil) 52 if err != nil { 53 return nil, err 54 } 55 56 ot := &OrganizationToken{} 57 err = s.client.do(ctx, req, ot) 58 if err != nil { 59 return nil, err 60 } 61 62 return ot, err 63} 64 65// Read an organization token. 66func (s *organizationTokens) Read(ctx context.Context, organization string) (*OrganizationToken, error) { 67 if !validStringID(&organization) { 68 return nil, errors.New("invalid value for organization") 69 } 70 71 u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization)) 72 req, err := s.client.newRequest("GET", u, nil) 73 if err != nil { 74 return nil, err 75 } 76 77 ot := &OrganizationToken{} 78 err = s.client.do(ctx, req, ot) 79 if err != nil { 80 return nil, err 81 } 82 83 return ot, err 84} 85 86// Delete an organization token. 87func (s *organizationTokens) Delete(ctx context.Context, organization string) error { 88 if !validStringID(&organization) { 89 return errors.New("invalid value for organization") 90 } 91 92 u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization)) 93 req, err := s.client.newRequest("DELETE", u, nil) 94 if err != nil { 95 return err 96 } 97 98 return s.client.do(ctx, req, nil) 99} 100