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