github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/internal/service/serviceaccounts.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "github.com/esnet/gdg/internal/types" 6 "log/slog" 7 8 "github.com/esnet/gdg/internal/tools" 9 "github.com/grafana/grafana-openapi-client-go/client/service_accounts" 10 "github.com/grafana/grafana-openapi-client-go/models" 11 "github.com/samber/lo" 12 "log" 13 ) 14 15 func (s *DashNGoImpl) CreateServiceAccount(name, role string, expiration int64) (*models.ServiceAccountDTO, error) { 16 p := service_accounts.NewCreateServiceAccountParams() 17 p.Body = &models.CreateServiceAccountForm{ 18 Name: name, 19 Role: role, 20 } 21 data, err := s.GetClient().ServiceAccounts.CreateServiceAccount(p) 22 if err != nil { 23 log.Fatalf("unable to create a service request, serviceName: %s, role: %s", name, role) 24 25 } 26 27 return data.GetPayload(), nil 28 } 29 30 func (s *DashNGoImpl) CreateServiceAccountToken(serviceAccountId int64, name string, expiration int64) (*models.NewAPIKeyResult, error) { 31 p := service_accounts.NewCreateTokenParams() 32 p.Body = &models.AddServiceAccountTokenCommand{ 33 Name: name, 34 SecondsToLive: expiration, 35 } 36 p.ServiceAccountID = serviceAccountId 37 token, err := s.GetClient().ServiceAccounts.CreateToken(p) 38 if err != nil { 39 log.Fatalf("unable to create token '%s' for service account ID: %d, err: %v", name, serviceAccountId, err) 40 41 } 42 43 return token.GetPayload(), nil 44 } 45 46 func (s *DashNGoImpl) ListServiceAccounts() []*types.ServiceAccountDTOWithTokens { 47 p := service_accounts.NewSearchOrgServiceAccountsWithPagingParams() 48 p.Disabled = tools.PtrOf(false) 49 p.Perpage = tools.PtrOf(int64(5000)) 50 51 resp, err := s.GetClient().ServiceAccounts.SearchOrgServiceAccountsWithPaging(p) 52 if err != nil { 53 log.Fatal("unable to retrieve service accounts") 54 } 55 data := resp.GetPayload() 56 result := lo.Map(data.ServiceAccounts, func(entity *models.ServiceAccountDTO, _ int) *types.ServiceAccountDTOWithTokens { 57 t := types.ServiceAccountDTOWithTokens{ 58 ServiceAccount: entity, 59 } 60 return &t 61 }) 62 for _, item := range result { 63 if item.ServiceAccount.Tokens > 0 { 64 item.Tokens, err = s.ListServiceAccountsTokens(item.ServiceAccount.ID) 65 if err != nil { 66 slog.Warn("failed to retrieve tokens for service account", "serviceAccountId", item.ServiceAccount.ID) 67 } 68 } 69 70 } 71 72 return result 73 } 74 75 func (s *DashNGoImpl) ListServiceAccountsTokens(id int64) ([]*models.TokenDTO, error) { 76 response, err := s.GetClient().ServiceAccounts.ListTokens(id) 77 if err != nil { 78 return nil, fmt.Errorf("failed to retrieve service account for %d response", id) 79 } 80 81 return response.GetPayload(), nil 82 } 83 84 func (s *DashNGoImpl) DeleteAllServiceAccounts() []string { 85 var accountNames []string 86 accounts := s.ListServiceAccounts() 87 for _, account := range accounts { 88 accountId := account.ServiceAccount.ID 89 _, err := s.GetClient().ServiceAccounts.DeleteServiceAccount(accountId) 90 if err != nil { 91 slog.Warn("Failed to delete service account", "ServiceAccountId", accountId) 92 } else { 93 accountNames = append(accountNames, fmt.Sprintf("service account %d has been deleted", accountId)) 94 } 95 } 96 97 return accountNames 98 } 99 100 func (s *DashNGoImpl) DeleteServiceAccountTokens(serviceId int64) []string { 101 var result []string 102 tokens, err := s.ListServiceAccountsTokens(serviceId) 103 if err != nil { 104 log.Fatalf("failed to retrieve tokens for the given service ID: %d", serviceId) 105 } 106 107 for _, token := range tokens { 108 _, err := s.GetClient().ServiceAccounts.DeleteToken(token.ID, serviceId) 109 if err != nil { 110 slog.Error("unable to delete token", "tokenID", token.ID) 111 continue 112 } 113 result = append(result, token.Name) 114 } 115 116 return result 117 }