mirror of
				https://github.com/fluxcd/flux2.git
				synced 2025-10-31 16:26:36 +08:00 
			
		
		
		
	 351d287d88
			
		
	
	351d287d88
	
	
	
		
			
			Add tests for flux trace command that fake out the kubernetes client, load objects from a yaml file and create them in the client, and assert on the output of the trace command to an expected golden file. This is a follow up from the suggestions in PR https://github.com/fluxcd/flux2/pull/1626 which suggested that additional testing would be helpful. This test approach is modeled after the helm command tests. This required some changes to the kubernetes client setup to make it possible to use a fake. If we agree this pattern makes sense, it can be applied to other commands. Signed-off-by: Allen Porter <allen@thebends.org>
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2020 The Flux authors
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/spf13/cobra"
 | |
| 	_ "k8s.io/client-go/plugin/pkg/client/auth"
 | |
| 
 | |
| 	"github.com/fluxcd/flux2/internal/utils"
 | |
| 	"github.com/fluxcd/flux2/pkg/manifestgen/install"
 | |
| )
 | |
| 
 | |
| var VERSION = "0.0.0-dev.0"
 | |
| 
 | |
| var rootCmd = &cobra.Command{
 | |
| 	Use:           "flux",
 | |
| 	Version:       VERSION,
 | |
| 	SilenceUsage:  true,
 | |
| 	SilenceErrors: true,
 | |
| 	Short:         "Command line utility for assembling Kubernetes CD pipelines",
 | |
| 	Long: `
 | |
| Command line utility for assembling Kubernetes CD pipelines the GitOps way.`,
 | |
| 	Example: `  # Check prerequisites
 | |
|   flux check --pre
 | |
| 
 | |
|   # Install the latest version of Flux
 | |
|   flux install --version=master
 | |
| 
 | |
|   # Create a source for a public Git repository
 | |
|   flux create source git webapp-latest \
 | |
|     --url=https://github.com/stefanprodan/podinfo \
 | |
|     --branch=master \
 | |
|     --interval=3m
 | |
| 
 | |
|   # List GitRepository sources and their status
 | |
|   flux get sources git
 | |
| 
 | |
|   # Trigger a GitRepository source reconciliation
 | |
|   flux reconcile source git flux-system
 | |
| 
 | |
|   # Export GitRepository sources in YAML format
 | |
|   flux export source git --all > sources.yaml
 | |
| 
 | |
|   # Create a Kustomization for deploying a series of microservices
 | |
|   flux create kustomization webapp-dev \
 | |
|     --source=webapp-latest \
 | |
|     --path="./deploy/webapp/" \
 | |
|     --prune=true \
 | |
|     --interval=5m \
 | |
|     --validation=client \
 | |
|     --health-check="Deployment/backend.webapp" \
 | |
|     --health-check="Deployment/frontend.webapp" \
 | |
|     --health-check-timeout=2m
 | |
| 
 | |
|   # Trigger a git sync of the Kustomization's source and apply changes
 | |
|   flux reconcile kustomization webapp-dev --with-source
 | |
| 
 | |
|   # Suspend a Kustomization reconciliation
 | |
|   flux suspend kustomization webapp-dev
 | |
| 
 | |
|   # Export Kustomizations in YAML format
 | |
|   flux export kustomization --all > kustomizations.yaml
 | |
| 
 | |
|   # Resume a Kustomization reconciliation
 | |
|   flux resume kustomization webapp-dev
 | |
| 
 | |
|   # Delete a Kustomization
 | |
|   flux delete kustomization webapp-dev
 | |
| 
 | |
|   # Delete a GitRepository source
 | |
|   flux delete source git webapp-latest
 | |
| 
 | |
|   # Uninstall Flux and delete CRDs
 | |
|   flux uninstall`,
 | |
| }
 | |
| 
 | |
| var logger = stderrLogger{stderr: os.Stderr}
 | |
| 
 | |
| type rootFlags struct {
 | |
| 	kubeconfig   string
 | |
| 	kubecontext  string
 | |
| 	namespace    string
 | |
| 	timeout      time.Duration
 | |
| 	verbose      bool
 | |
| 	pollInterval time.Duration
 | |
| 	defaults     install.Options
 | |
| }
 | |
| 
 | |
| var rootArgs = NewRootFlags()
 | |
| 
 | |
| func init() {
 | |
| 	rootCmd.PersistentFlags().StringVarP(&rootArgs.namespace, "namespace", "n", rootArgs.defaults.Namespace, "the namespace scope for this operation")
 | |
| 	rootCmd.PersistentFlags().DurationVar(&rootArgs.timeout, "timeout", 5*time.Minute, "timeout for this operation")
 | |
| 	rootCmd.PersistentFlags().BoolVar(&rootArgs.verbose, "verbose", false, "print generated objects")
 | |
| 	rootCmd.PersistentFlags().StringVarP(&rootArgs.kubeconfig, "kubeconfig", "", "",
 | |
| 		"absolute path to the kubeconfig file")
 | |
| 	rootCmd.PersistentFlags().StringVarP(&rootArgs.kubecontext, "context", "", "", "kubernetes context to use")
 | |
| 
 | |
| 	rootCmd.DisableAutoGenTag = true
 | |
| }
 | |
| 
 | |
| func NewRootFlags() rootFlags {
 | |
| 	rf := rootFlags{
 | |
| 		pollInterval: 2 * time.Second,
 | |
| 		defaults:     install.MakeDefaultOptions(),
 | |
| 	}
 | |
| 	rf.defaults.Version = "v" + VERSION
 | |
| 	return rf
 | |
| }
 | |
| 
 | |
| type rootContext struct {
 | |
| 	kubeManager utils.KubeManager
 | |
| }
 | |
| 
 | |
| var rootCtx = NewRootContext()
 | |
| 
 | |
| func NewRootContext() rootContext {
 | |
| 	var rc rootContext
 | |
| 	rc.kubeManager = utils.DefaultKubeManager()
 | |
| 	return rc
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	log.SetFlags(0)
 | |
| 	configureKubeconfig()
 | |
| 	if err := rootCmd.Execute(); err != nil {
 | |
| 		logger.Failuref("%v", err)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func configureKubeconfig() {
 | |
| 	switch {
 | |
| 	case len(rootArgs.kubeconfig) > 0:
 | |
| 	case len(os.Getenv("KUBECONFIG")) > 0:
 | |
| 		rootArgs.kubeconfig = os.Getenv("KUBECONFIG")
 | |
| 	default:
 | |
| 		if home := homeDir(); len(home) > 0 {
 | |
| 			rootArgs.kubeconfig = filepath.Join(home, ".kube", "config")
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func homeDir() string {
 | |
| 	if h := os.Getenv("HOME"); h != "" {
 | |
| 		return h
 | |
| 	}
 | |
| 	return os.Getenv("USERPROFILE") // windows
 | |
| }
 |