github.com/argoproj/argo-cd/v2@v2.10.9/hack/gen-resources/generators/repo_generator.go (about)

     1  package generator
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"log"
    10  	"net/http"
    11  
    12  	v1 "k8s.io/api/core/v1"
    13  	v1meta "k8s.io/apimachinery/pkg/apis/meta/v1"
    14  
    15  	"github.com/argoproj/argo-cd/v2/hack/gen-resources/util"
    16  
    17  	"k8s.io/client-go/kubernetes"
    18  )
    19  
    20  type Repo struct {
    21  	Id  int    `json:"id"`
    22  	Url string `json:"html_url"`
    23  }
    24  
    25  type RepoGenerator struct {
    26  	clientSet *kubernetes.Clientset
    27  	bar       *util.Bar
    28  }
    29  
    30  func NewRepoGenerator(clientSet *kubernetes.Clientset) Generator {
    31  	return &RepoGenerator{clientSet: clientSet, bar: &util.Bar{}}
    32  }
    33  
    34  func fetchRepos(token string, page int) ([]Repo, error) {
    35  	client := &http.Client{}
    36  	req, _ := http.NewRequest(http.MethodGet, fmt.Sprintf("https://api.github.com/repos/argoproj/argocd-example-apps/forks?per_page=100&page=%v", page), nil)
    37  	req.Header.Set("Authorization", token)
    38  	resp, err := client.Do(req)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  	body, err := io.ReadAll(resp.Body)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  	var repos []Repo
    47  	err = json.Unmarshal(body, &repos)
    48  	if err != nil {
    49  		return nil, errors.New("failed to retrieve repos, reason: " + string(body))
    50  	}
    51  	return repos, nil
    52  }
    53  
    54  func FetchRepos(token string, samples int) ([]Repo, error) {
    55  	log.Print("Fetch repos started")
    56  	var (
    57  		repos []Repo
    58  		page  = 1
    59  	)
    60  
    61  	for {
    62  		if page%10 == 0 {
    63  			log.Printf("Fetch repos, page: %v", page)
    64  		}
    65  		fetchedRepos, err := fetchRepos(token, page)
    66  		if err != nil {
    67  			return nil, err
    68  		}
    69  		if len(fetchedRepos) == 0 {
    70  			break
    71  		}
    72  		if len(repos)+len(fetchedRepos) > samples {
    73  			repos = append(repos, fetchedRepos[0:samples-len(repos)]...)
    74  			break
    75  		}
    76  		repos = append(repos, fetchedRepos...)
    77  		page++
    78  	}
    79  	return repos, nil
    80  }
    81  
    82  func (rg *RepoGenerator) Generate(opts *util.GenerateOpts) error {
    83  	repos, err := FetchRepos(opts.GithubToken, opts.RepositoryOpts.Samples)
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	secrets := rg.clientSet.CoreV1().Secrets(opts.Namespace)
    89  	rg.bar.NewOption(0, int64(len(repos)))
    90  	for _, repo := range repos {
    91  		_, err = secrets.Create(context.TODO(), &v1.Secret{
    92  			ObjectMeta: v1meta.ObjectMeta{
    93  				GenerateName: "repo-",
    94  				Namespace:    opts.Namespace,
    95  				Labels: map[string]string{
    96  					"app.kubernetes.io/generated-by": "argocd-generator",
    97  					"argocd.argoproj.io/secret-type": "repository",
    98  				},
    99  				Annotations: map[string]string{
   100  					"managed-by": "argocd.argoproj.io",
   101  				},
   102  			},
   103  			Data: map[string][]byte{
   104  				"type":    []byte("git"),
   105  				"url":     []byte(repo.Url),
   106  				"project": []byte("default"),
   107  			},
   108  		}, v1meta.CreateOptions{})
   109  		rg.bar.Increment()
   110  		rg.bar.Play()
   111  	}
   112  	rg.bar.Finish()
   113  	if err != nil {
   114  		return err
   115  	}
   116  	return nil
   117  }
   118  
   119  func (rg *RepoGenerator) Clean(opts *util.GenerateOpts) error {
   120  	log.Printf("Clean repos")
   121  	secrets := rg.clientSet.CoreV1().Secrets(opts.Namespace)
   122  	return secrets.DeleteCollection(context.TODO(), v1meta.DeleteOptions{}, v1meta.ListOptions{
   123  		LabelSelector: "app.kubernetes.io/generated-by=argocd-generator",
   124  	})
   125  }