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