argo-cd
117 строк · 3.8 Кб
1package generator
2
3import (
4"context"
5"log"
6"math/rand"
7"time"
8
9"github.com/argoproj/argo-cd/v2/util/settings"
10
11"github.com/argoproj/argo-cd/v2/util/db"
12
13"github.com/argoproj/argo-cd/v2/hack/gen-resources/util"
14
15v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
17"k8s.io/client-go/kubernetes"
18
19"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
20appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
21)
22
23type ApplicationGenerator struct {
24argoClientSet *appclientset.Clientset
25clientSet *kubernetes.Clientset
26db db.ArgoDB
27}
28
29func NewApplicationGenerator(argoClientSet *appclientset.Clientset, clientSet *kubernetes.Clientset, db db.ArgoDB) Generator {
30return &ApplicationGenerator{argoClientSet, clientSet, db}
31}
32
33func (pg *ApplicationGenerator) buildRandomSource(repositories []*v1alpha1.Repository) (*v1alpha1.ApplicationSource, error) {
34seed := rand.New(rand.NewSource(time.Now().Unix()))
35repoNumber := seed.Int() % len(repositories)
36return &v1alpha1.ApplicationSource{
37RepoURL: repositories[repoNumber].Repo,
38Path: "helm-guestbook",
39TargetRevision: "master",
40}, nil
41}
42
43func (ag *ApplicationGenerator) buildSource(opts *util.GenerateOpts, repositories []*v1alpha1.Repository) (*v1alpha1.ApplicationSource, error) {
44switch opts.ApplicationOpts.SourceOpts.Strategy {
45case "Random":
46return ag.buildRandomSource(repositories)
47}
48return ag.buildRandomSource(repositories)
49}
50
51func (pg *ApplicationGenerator) buildRandomDestination(opts *util.GenerateOpts, clusters []v1alpha1.Cluster) (*v1alpha1.ApplicationDestination, error) {
52seed := rand.New(rand.NewSource(time.Now().Unix()))
53clusterNumber := seed.Int() % len(clusters)
54return &v1alpha1.ApplicationDestination{
55Namespace: opts.Namespace,
56Name: clusters[clusterNumber].Name,
57}, nil
58}
59
60func (ag *ApplicationGenerator) buildDestination(opts *util.GenerateOpts, clusters []v1alpha1.Cluster) (*v1alpha1.ApplicationDestination, error) {
61switch opts.ApplicationOpts.DestinationOpts.Strategy {
62case "Random":
63return ag.buildRandomDestination(opts, clusters)
64}
65return ag.buildRandomDestination(opts, clusters)
66}
67
68func (pg *ApplicationGenerator) Generate(opts *util.GenerateOpts) error {
69settingsMgr := settings.NewSettingsManager(context.TODO(), pg.clientSet, opts.Namespace)
70repositories, err := db.NewDB(opts.Namespace, settingsMgr, pg.clientSet).ListRepositories(context.TODO())
71if err != nil {
72return err
73}
74clusters, err := db.NewDB(opts.Namespace, settingsMgr, pg.clientSet).ListClusters(context.TODO())
75if err != nil {
76return err
77}
78applications := pg.argoClientSet.ArgoprojV1alpha1().Applications(opts.Namespace)
79for i := 0; i < opts.ApplicationOpts.Samples; i++ {
80log.Printf("Generate application #%v", i)
81source, err := pg.buildSource(opts, repositories)
82if err != nil {
83return err
84}
85log.Printf("Pick source \"%s\"", source)
86destination, err := pg.buildDestination(opts, clusters.Items)
87if err != nil {
88return err
89}
90log.Printf("Pick destination \"%s\"", destination)
91log.Printf("Create application")
92_, err = applications.Create(context.TODO(), &v1alpha1.Application{
93ObjectMeta: v1.ObjectMeta{
94GenerateName: "application-",
95Namespace: opts.Namespace,
96Labels: labels,
97},
98Spec: v1alpha1.ApplicationSpec{
99Project: "default",
100Destination: *destination,
101Source: source,
102},
103}, v1.CreateOptions{})
104if err != nil {
105return err
106}
107}
108return nil
109}
110
111func (ag *ApplicationGenerator) Clean(opts *util.GenerateOpts) error {
112log.Printf("Clean applications")
113applications := ag.argoClientSet.ArgoprojV1alpha1().Applications(opts.Namespace)
114return applications.DeleteCollection(context.TODO(), v1.DeleteOptions{}, v1.ListOptions{
115LabelSelector: "app.kubernetes.io/generated-by=argocd-generator",
116})
117}
118