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  }