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