diff --git a/cmd/flux/bootstrap.go b/cmd/flux/bootstrap.go index 7f92ca51..fd53ddc0 100644 --- a/cmd/flux/bootstrap.go +++ b/cmd/flux/bootstrap.go @@ -266,3 +266,20 @@ func generateDeployKey(ctx context.Context, kubeClient client.Client, url *url.U return string(pair.PublicKey), nil } + +func checkIfBootstrapPathDiffers(ctx context.Context, kubeClient client.Client, namespace string, path string) bool { + namespacedName := types.NamespacedName{ + Name: namespace, + Namespace: namespace, + } + var fluxSystemKustomization kustomizev1.Kustomization + err := kubeClient.Get(ctx, namespacedName, &fluxSystemKustomization) + if err != nil { + return false + } + if fluxSystemKustomization.Spec.Path == path { + return false + } + + return true +} diff --git a/cmd/flux/bootstrap_github.go b/cmd/flux/bootstrap_github.go index b9cf8450..2a12991d 100644 --- a/cmd/flux/bootstrap_github.go +++ b/cmd/flux/bootstrap_github.go @@ -115,6 +115,20 @@ func bootstrapGitHubCmdRun(cmd *cobra.Command, args []string) error { return err } + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + bootstrapPathDiffers := checkIfBootstrapPathDiffers(ctx, kubeClient, namespace, filepath.ToSlash(ghPath.String())) + + if bootstrapPathDiffers { + return fmt.Errorf("cluster already bootstrapped to a different path") + } + repository, err := git.NewRepository(ghRepository, ghOwner, ghHostname, ghToken, "flux", ghOwner+"@users.noreply.github.com") if err != nil { return err @@ -135,9 +149,6 @@ func bootstrapGitHubCmdRun(cmd *cobra.Command, args []string) error { } defer os.RemoveAll(tmpDir) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - if ghDelete { if err := provider.DeleteRepository(ctx, repository); err != nil { return err @@ -198,11 +209,6 @@ func bootstrapGitHubCmdRun(cmd *cobra.Command, args []string) error { logger.Successf("components are up to date") } - kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) - if err != nil { - return err - } - // determine if repo synchronization is working isInstall := shouldInstallManifests(ctx, kubeClient, namespace) diff --git a/cmd/flux/bootstrap_gitlab.go b/cmd/flux/bootstrap_gitlab.go index e8b9556c..63677466 100644 --- a/cmd/flux/bootstrap_gitlab.go +++ b/cmd/flux/bootstrap_gitlab.go @@ -115,6 +115,20 @@ func bootstrapGitLabCmdRun(cmd *cobra.Command, args []string) error { return err } + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + bootstrapPathDiffers := checkIfBootstrapPathDiffers(ctx, kubeClient, namespace, filepath.ToSlash(glPath.String())) + + if bootstrapPathDiffers { + return fmt.Errorf("cluster already bootstrapped to a different path") + } + repository, err := git.NewRepository(glRepository, glOwner, glHostname, glToken, "flux", glOwner+"@users.noreply.gitlab.com") if err != nil { return err @@ -129,20 +143,12 @@ func bootstrapGitLabCmdRun(cmd *cobra.Command, args []string) error { IsPersonal: glPersonal, } - kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) - if err != nil { - return err - } - tmpDir, err := ioutil.TempDir("", namespace) if err != nil { return err } defer os.RemoveAll(tmpDir) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - // create GitLab project if doesn't exists logger.Actionf("connecting to %s", glHostname) changed, err := provider.CreateRepository(ctx, repository)