|  |  |  | @ -22,10 +22,11 @@ import ( | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | var createSourceCmd = &cobra.Command{ | 
		
	
		
			
				|  |  |  |  | 	Use:   "source [name]", | 
		
	
		
			
				|  |  |  |  | 	Short: "Create source resource", | 
		
	
		
			
				|  |  |  |  | 	Short: "Create or update a source resource", | 
		
	
		
			
				|  |  |  |  | 	Long: ` | 
		
	
		
			
				|  |  |  |  | The create source command generates a source.fluxcd.io resource and waits for it to sync. | 
		
	
		
			
				|  |  |  |  | For Git over SSH, host and SSH keys are automatically generated.`, | 
		
	
		
			
				|  |  |  |  | For Git over SSH, host and SSH keys are automatically generated and stored in a Kubernetes secret. | 
		
	
		
			
				|  |  |  |  | For private Git repositories, the basic authentication credentials are stored in a Kubernetes secret.`, | 
		
	
		
			
				|  |  |  |  | 	Example: `  # Create a source from a public Git repository master branch | 
		
	
		
			
				|  |  |  |  |   create source podinfo --git-url https://github.com/stefanprodan/podinfo-deploy --git-branch master
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -131,21 +132,9 @@ func createSourceCmdRun(cmd *cobra.Command, args []string) error { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	namespacedName := types.NamespacedName{ | 
		
	
		
			
				|  |  |  |  | 		Namespace: namespace, | 
		
	
		
			
				|  |  |  |  | 		Name:      name, | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	err = kubeClient.Get(ctx, namespacedName, &gitRepository) | 
		
	
		
			
				|  |  |  |  | 	if errors.IsNotFound(err) { | 
		
	
		
			
				|  |  |  |  | 		if err := kubeClient.Create(ctx, &gitRepository); err != nil { | 
		
	
		
			
				|  |  |  |  | 			return err | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} else { | 
		
	
		
			
				|  |  |  |  | 		if err := kubeClient.Update(ctx, &gitRepository); err != nil { | 
		
	
		
			
				|  |  |  |  | 	if err := upsertGitRepository(ctx, kubeClient, gitRepository); err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	logAction("waiting for source sync") | 
		
	
		
			
				|  |  |  |  | 	if err := wait.PollImmediate(2*time.Second, timeout, | 
		
	
	
		
			
				
					|  |  |  | @ -155,13 +144,17 @@ func createSourceCmdRun(cmd *cobra.Command, args []string) error { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	logSuccess("source %s is ready", name) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	namespacedName := types.NamespacedName{ | 
		
	
		
			
				|  |  |  |  | 		Namespace: namespace, | 
		
	
		
			
				|  |  |  |  | 		Name:      name, | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	err = kubeClient.Get(ctx, namespacedName, &gitRepository) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return fmt.Errorf("source sync failed: %w", err) | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	if gitRepository.Status.Artifact != nil { | 
		
	
		
			
				|  |  |  |  | 		logSuccess("revision %s", gitRepository.Status.Artifact.Revision) | 
		
	
		
			
				|  |  |  |  | 		logSuccess("fetched revision %s", gitRepository.Status.Artifact.Revision) | 
		
	
		
			
				|  |  |  |  | 	} else { | 
		
	
		
			
				|  |  |  |  | 		return fmt.Errorf("source sync failed, artifact not found") | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					|  |  |  | @ -222,6 +215,35 @@ func generateSSH(ctx context.Context, name, host, tmpDir string) error { | 
		
	
		
			
				|  |  |  |  | 	return nil | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | func upsertGitRepository(ctx context.Context, kubeClient client.Client, gitRepository sourcev1.GitRepository) error { | 
		
	
		
			
				|  |  |  |  | 	namespacedName := types.NamespacedName{ | 
		
	
		
			
				|  |  |  |  | 		Namespace: gitRepository.GetNamespace(), | 
		
	
		
			
				|  |  |  |  | 		Name:      gitRepository.GetName(), | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	var existing sourcev1.GitRepository | 
		
	
		
			
				|  |  |  |  | 	err := kubeClient.Get(ctx, namespacedName, &existing) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		if errors.IsNotFound(err) { | 
		
	
		
			
				|  |  |  |  | 			if err := kubeClient.Create(ctx, &gitRepository); err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} else { | 
		
	
		
			
				|  |  |  |  | 				logSuccess("source created") | 
		
	
		
			
				|  |  |  |  | 				return nil | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	existing.Spec = gitRepository.Spec | 
		
	
		
			
				|  |  |  |  | 	if err := kubeClient.Update(ctx, &existing); err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	logSuccess("source updated") | 
		
	
		
			
				|  |  |  |  | 	return nil | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | func isGitRepositoryReady(ctx context.Context, kubeClient client.Client, name, namespace string) wait.ConditionFunc { | 
		
	
		
			
				|  |  |  |  | 	return func() (bool, error) { | 
		
	
		
			
				|  |  |  |  | 		var gitRepository sourcev1.GitRepository | 
		
	
	
		
			
				
					|  |  |  | 
 |