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  }