diff --git a/cmd/flux/get_alert.go b/cmd/flux/get_alert.go index f3c9656f..63c6c8ff 100644 --- a/cmd/flux/get_alert.go +++ b/cmd/flux/get_alert.go @@ -70,7 +70,7 @@ func getAlertCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -80,18 +80,16 @@ func getAlertCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(alert.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ alert.GetName(), - //alert.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(alert.Spec.Suspend)), string(c.Status), c.Message, + strings.Title(strconv.FormatBool(alert.Spec.Suspend)), } } else { row = []string{ alert.GetName(), - //alert.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(alert.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + strings.Title(strconv.FormatBool(alert.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_helmrelease.go b/cmd/flux/get_helmrelease.go index c7f7a980..ecf84db3 100644 --- a/cmd/flux/get_helmrelease.go +++ b/cmd/flux/get_helmrelease.go @@ -72,7 +72,7 @@ func getHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,18 +82,18 @@ func getHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(helmRelease.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ helmRelease.GetName(), - helmRelease.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), string(c.Status), c.Message, + helmRelease.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), } } else { row = []string{ helmRelease.GetName(), - helmRelease.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + helmRelease.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_kustomization.go b/cmd/flux/get_kustomization.go index 2768e27f..4e4de5de 100644 --- a/cmd/flux/get_kustomization.go +++ b/cmd/flux/get_kustomization.go @@ -71,7 +71,7 @@ func getKsCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -81,18 +81,18 @@ func getKsCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(kustomization.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ kustomization.GetName(), - kustomization.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), string(c.Status), c.Message, + kustomization.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), } } else { row = []string{ kustomization.GetName(), - kustomization.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + kustomization.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_receiver.go b/cmd/flux/get_receiver.go index 5b2ab086..b760b7d6 100644 --- a/cmd/flux/get_receiver.go +++ b/cmd/flux/get_receiver.go @@ -70,7 +70,7 @@ func getReceiverCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -80,16 +80,16 @@ func getReceiverCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(receiver.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ receiver.GetName(), - strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), string(c.Status), c.Message, + strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), } } else { row = []string{ receiver.GetName(), - strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), } } rows = append(rows, row) diff --git a/cmd/flux/get_source_bucket.go b/cmd/flux/get_source_bucket.go index 7b347c28..0d9b698e 100644 --- a/cmd/flux/get_source_bucket.go +++ b/cmd/flux/get_source_bucket.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceBucketCmd = &cobra.Command{ Long: "The get sources bucket command prints the status of the Bucket sources.", Example: ` # List all Buckets and their status flux get sources bucket + + # List buckets from all namespaces + flux get sources helm --all-namespaces `, RunE: getSourceBucketCmdRun, } @@ -68,7 +73,7 @@ func getSourceBucketCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceBucketCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_source_chart.go b/cmd/flux/get_source_chart.go new file mode 100644 index 00000000..db012061 --- /dev/null +++ b/cmd/flux/get_source_chart.go @@ -0,0 +1,111 @@ +/* +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 ( + "context" + "os" + "strconv" + "strings" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var getSourceHelmChartCmd = &cobra.Command{ + Use: "chart", + Short: "Get HelmChart statuses", + Long: "The get sources chart command prints the status of the HelmCharts.", + Example: ` # List all Helm charts and their status + flux get sources chart + + # List Helm charts from all namespaces + flux get sources chart --all-namespaces +`, + RunE: getSourceHelmChartCmdRun, +} + +func init() { + getSourceCmd.AddCommand(getSourceHelmChartCmd) +} + +func getSourceHelmChartCmdRun(cmd *cobra.Command, args []string) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + var listOpts []client.ListOption + if !allNamespaces { + listOpts = append(listOpts, client.InNamespace(namespace)) + } + var list sourcev1.HelmChartList + err = kubeClient.List(ctx, &list, listOpts...) + if err != nil { + return err + } + + if len(list.Items) == 0 { + logger.Failuref("no chart sources found in %s namespace", namespace) + return nil + } + + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} + if allNamespaces { + header = append([]string{"Namespace"}, header...) + } + var rows [][]string + for _, source := range list.Items { + var row []string + var revision string + if source.GetArtifact() != nil { + revision = source.GetArtifact().Revision + } + if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { + row = []string{ + source.GetName(), + string(c.Status), + c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), + } + } else { + row = []string{ + source.GetName(), + string(metav1.ConditionFalse), + "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), + } + } + if allNamespaces { + row = append([]string{source.Namespace}, row...) + } + rows = append(rows, row) + } + utils.PrintTable(os.Stdout, header, rows) + return nil +} diff --git a/cmd/flux/get_source_git.go b/cmd/flux/get_source_git.go index 10cdfc52..8f8fb811 100644 --- a/cmd/flux/get_source_git.go +++ b/cmd/flux/get_source_git.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceGitCmd = &cobra.Command{ Long: "The get sources git command prints the status of the GitRepository sources.", Example: ` # List all Git repositories and their status flux get sources git + + # List Git repositories from all namespaces + flux get sources git --all-namespaces `, RunE: getSourceGitCmdRun, } @@ -68,7 +73,7 @@ func getSourceGitCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceGitCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_source_helm.go b/cmd/flux/get_source_helm.go index a7528006..5f36cf5a 100644 --- a/cmd/flux/get_source_helm.go +++ b/cmd/flux/get_source_helm.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceHelmCmd = &cobra.Command{ Long: "The get sources helm command prints the status of the HelmRepository sources.", Example: ` # List all Helm repositories and their status flux get sources helm + + # List Helm repositories from all namespaces + flux get sources helm --all-namespaces `, RunE: getSourceHelmCmdRun, } @@ -68,7 +73,7 @@ func getSourceHelmCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceHelmCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/resume_helmrelease.go b/cmd/flux/resume_helmrelease.go index 7b0da873..4e5eebb0 100644 --- a/cmd/flux/resume_helmrelease.go +++ b/cmd/flux/resume_helmrelease.go @@ -109,9 +109,6 @@ func isHelmReleaseResumed(ctx context.Context, kubeClient client.Client, case metav1.ConditionTrue: return true, nil case metav1.ConditionFalse: - if c.Reason == meta.SuspendedReason { - return false, nil - } return false, fmt.Errorf(c.Message) } } diff --git a/cmd/flux/resume_kustomization.go b/cmd/flux/resume_kustomization.go index b1046674..58d41cdc 100644 --- a/cmd/flux/resume_kustomization.go +++ b/cmd/flux/resume_kustomization.go @@ -108,9 +108,6 @@ func isKustomizationResumed(ctx context.Context, kubeClient client.Client, case metav1.ConditionTrue: return true, nil case metav1.ConditionFalse: - if c.Reason == meta.SuspendedReason { - return false, nil - } return false, fmt.Errorf(c.Message) } } diff --git a/cmd/flux/resume_source.go b/cmd/flux/resume_source.go new file mode 100644 index 00000000..dae04830 --- /dev/null +++ b/cmd/flux/resume_source.go @@ -0,0 +1,31 @@ +/* +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 ( + "github.com/spf13/cobra" +) + +var resumeSourceCmd = &cobra.Command{ + Use: "source", + Short: "Resume sources", + Long: "The resume sub-commands resume a suspended source.", +} + +func init() { + resumeCmd.AddCommand(resumeSourceCmd) +} diff --git a/cmd/flux/resume_source_bucket.go b/cmd/flux/resume_source_bucket.go new file mode 100644 index 00000000..895d1c69 --- /dev/null +++ b/cmd/flux/resume_source_bucket.go @@ -0,0 +1,115 @@ +/* +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 ( + "context" + "fmt" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" +) + +var resumeSourceBucketCmd = &cobra.Command{ + Use: "bucket [name]", + Short: "Resume a suspended Bucket", + Long: `The resume command marks a previously suspended Bucket resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing Bucket + flux resume source bucket podinfo +`, + RunE: resumeSourceBucketCmdRun, +} + +func init() { + resumeSourceCmd.AddCommand(resumeSourceBucketCmd) +} + +func resumeSourceBucketCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var bucket sourcev1.Bucket + err = kubeClient.Get(ctx, namespacedName, &bucket) + if err != nil { + return err + } + + logger.Actionf("resuming source %s in %s namespace", name, namespace) + bucket.Spec.Suspend = false + if err := kubeClient.Update(ctx, &bucket); err != nil { + return err + } + logger.Successf("source resumed") + + logger.Waitingf("waiting for Bucket reconciliation") + if err := wait.PollImmediate(pollInterval, timeout, + isBucketResumed(ctx, kubeClient, namespacedName, &bucket)); err != nil { + return err + } + logger.Successf("Bucket reconciliation completed") + + logger.Successf("fetched revision %s", bucket.Status.Artifact.Revision) + return nil +} + +func isBucketResumed(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, bucket *sourcev1.Bucket) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, bucket) + if err != nil { + return false, err + } + + // Confirm the state we are observing is for the current generation + if bucket.Generation != bucket.Status.ObservedGeneration { + return false, nil + } + + if c := apimeta.FindStatusCondition(bucket.Status.Conditions, meta.ReadyCondition); c != nil { + switch c.Status { + case metav1.ConditionTrue: + return true, nil + case metav1.ConditionFalse: + return false, fmt.Errorf(c.Message) + } + } + return false, nil + } +} diff --git a/cmd/flux/resume_source_chart.go b/cmd/flux/resume_source_chart.go new file mode 100644 index 00000000..8f3d1bfe --- /dev/null +++ b/cmd/flux/resume_source_chart.go @@ -0,0 +1,115 @@ +/* +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 ( + "context" + "fmt" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" +) + +var resumeSourceHelmChartCmd = &cobra.Command{ + Use: "chart [name]", + Short: "Resume a suspended HelmChart", + Long: `The resume command marks a previously suspended HelmChart resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing HelmChart + flux resume source chart podinfo +`, + RunE: resumeSourceHelmChartCmdRun, +} + +func init() { + resumeSourceCmd.AddCommand(resumeSourceHelmChartCmd) +} + +func resumeSourceHelmChartCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var repository sourcev1.HelmChart + err = kubeClient.Get(ctx, namespacedName, &repository) + if err != nil { + return err + } + + logger.Actionf("resuming source %s in %s namespace", name, namespace) + repository.Spec.Suspend = false + if err := kubeClient.Update(ctx, &repository); err != nil { + return err + } + logger.Successf("source resumed") + + logger.Waitingf("waiting for HelmChart reconciliation") + if err := wait.PollImmediate(pollInterval, timeout, + isHelmChartResumed(ctx, kubeClient, namespacedName, &repository)); err != nil { + return err + } + logger.Successf("HelmChart reconciliation completed") + + logger.Successf("fetched revision %s", repository.Status.Artifact.Revision) + return nil +} + +func isHelmChartResumed(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, chart *sourcev1.HelmChart) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, chart) + if err != nil { + return false, err + } + + // Confirm the state we are observing is for the current generation + if chart.Generation != chart.Status.ObservedGeneration { + return false, nil + } + + if c := apimeta.FindStatusCondition(chart.Status.Conditions, meta.ReadyCondition); c != nil { + switch c.Status { + case metav1.ConditionTrue: + return true, nil + case metav1.ConditionFalse: + return false, fmt.Errorf(c.Message) + } + } + return false, nil + } +} diff --git a/cmd/flux/resume_source_git.go b/cmd/flux/resume_source_git.go new file mode 100644 index 00000000..53b386c5 --- /dev/null +++ b/cmd/flux/resume_source_git.go @@ -0,0 +1,115 @@ +/* +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 ( + "context" + "fmt" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" +) + +var resumeSourceGitCmd = &cobra.Command{ + Use: "git [name]", + Short: "Resume a suspended GitRepository", + Long: `The resume command marks a previously suspended GitRepository resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing GitRepository + flux resume source git podinfo +`, + RunE: resumeSourceGitCmdRun, +} + +func init() { + resumeSourceCmd.AddCommand(resumeSourceGitCmd) +} + +func resumeSourceGitCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var repository sourcev1.GitRepository + err = kubeClient.Get(ctx, namespacedName, &repository) + if err != nil { + return err + } + + logger.Actionf("resuming source %s in %s namespace", name, namespace) + repository.Spec.Suspend = false + if err := kubeClient.Update(ctx, &repository); err != nil { + return err + } + logger.Successf("source resumed") + + logger.Waitingf("waiting for GitRepository reconciliation") + if err := wait.PollImmediate(pollInterval, timeout, + isGitRepositoryResumed(ctx, kubeClient, namespacedName, &repository)); err != nil { + return err + } + logger.Successf("GitRepository reconciliation completed") + + logger.Successf("fetched revision %s", repository.Status.Artifact.Revision) + return nil +} + +func isGitRepositoryResumed(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, repository *sourcev1.GitRepository) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, repository) + if err != nil { + return false, err + } + + // Confirm the state we are observing is for the current generation + if repository.Generation != repository.Status.ObservedGeneration { + return false, nil + } + + if c := apimeta.FindStatusCondition(repository.Status.Conditions, meta.ReadyCondition); c != nil { + switch c.Status { + case metav1.ConditionTrue: + return true, nil + case metav1.ConditionFalse: + return false, fmt.Errorf(c.Message) + } + } + return false, nil + } +} diff --git a/cmd/flux/resume_source_helm.go b/cmd/flux/resume_source_helm.go new file mode 100644 index 00000000..59d01b5d --- /dev/null +++ b/cmd/flux/resume_source_helm.go @@ -0,0 +1,115 @@ +/* +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 ( + "context" + "fmt" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" +) + +var resumeSourceHelmCmd = &cobra.Command{ + Use: "helm [name]", + Short: "Resume a suspended HelmRepository", + Long: `The resume command marks a previously suspended HelmRepository resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing HelmRepository + flux resume source helm bitnami +`, + RunE: resumeSourceHelmCmdRun, +} + +func init() { + resumeSourceCmd.AddCommand(resumeSourceHelmCmd) +} + +func resumeSourceHelmCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var repository sourcev1.HelmRepository + err = kubeClient.Get(ctx, namespacedName, &repository) + if err != nil { + return err + } + + logger.Actionf("resuming source %s in %s namespace", name, namespace) + repository.Spec.Suspend = false + if err := kubeClient.Update(ctx, &repository); err != nil { + return err + } + logger.Successf("source resumed") + + logger.Waitingf("waiting for HelmRepository reconciliation") + if err := wait.PollImmediate(pollInterval, timeout, + isHelmRepositoryResumed(ctx, kubeClient, namespacedName, &repository)); err != nil { + return err + } + logger.Successf("HelmRepository reconciliation completed") + + logger.Successf("fetched revision %s", repository.Status.Artifact.Revision) + return nil +} + +func isHelmRepositoryResumed(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, repository *sourcev1.HelmRepository) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, repository) + if err != nil { + return false, err + } + + // Confirm the state we are observing is for the current generation + if repository.Generation != repository.Status.ObservedGeneration { + return false, nil + } + + if c := apimeta.FindStatusCondition(repository.Status.Conditions, meta.ReadyCondition); c != nil { + switch c.Status { + case metav1.ConditionTrue: + return true, nil + case metav1.ConditionFalse: + return false, fmt.Errorf(c.Message) + } + } + return false, nil + } +} diff --git a/cmd/flux/suspend_source.go b/cmd/flux/suspend_source.go new file mode 100644 index 00000000..c255afbf --- /dev/null +++ b/cmd/flux/suspend_source.go @@ -0,0 +1,31 @@ +/* +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 ( + "github.com/spf13/cobra" +) + +var suspendSourceCmd = &cobra.Command{ + Use: "source", + Short: "Suspend sources", + Long: "The suspend sub-commands suspend the reconciliation of a source.", +} + +func init() { + suspendCmd.AddCommand(suspendSourceCmd) +} diff --git a/cmd/flux/suspend_source_bucket.go b/cmd/flux/suspend_source_bucket.go new file mode 100644 index 00000000..e2f82673 --- /dev/null +++ b/cmd/flux/suspend_source_bucket.go @@ -0,0 +1,75 @@ +/* +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 ( + "context" + "fmt" + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" +) + +var suspendSourceBucketCmd = &cobra.Command{ + Use: "bucket [name]", + Short: "Suspend reconciliation of a Bucket", + Long: "The suspend command disables the reconciliation of a Bucket resource.", + Example: ` # Suspend reconciliation for an existing Bucket + flux suspend source bucket podinfo +`, + RunE: suspendSourceBucketCmdRun, +} + +func init() { + suspendSourceCmd.AddCommand(suspendSourceBucketCmd) +} + +func suspendSourceBucketCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var bucket sourcev1.Bucket + err = kubeClient.Get(ctx, namespacedName, &bucket) + if err != nil { + return err + } + + logger.Actionf("suspending source %s in %s namespace", name, namespace) + bucket.Spec.Suspend = true + if err := kubeClient.Update(ctx, &bucket); err != nil { + return err + } + logger.Successf("source suspended") + + return nil +} diff --git a/cmd/flux/suspend_source_chart.go b/cmd/flux/suspend_source_chart.go new file mode 100644 index 00000000..5498a745 --- /dev/null +++ b/cmd/flux/suspend_source_chart.go @@ -0,0 +1,75 @@ +/* +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 ( + "context" + "fmt" + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" +) + +var suspendSourceHelmChartCmd = &cobra.Command{ + Use: "chart [name]", + Short: "Suspend reconciliation of a HelmChart", + Long: "The suspend command disables the reconciliation of a HelmChart resource.", + Example: ` # Suspend reconciliation for an existing HelmChart + flux suspend source chart podinfo +`, + RunE: suspendSourceHelmChartCmdRun, +} + +func init() { + suspendSourceCmd.AddCommand(suspendSourceHelmChartCmd) +} + +func suspendSourceHelmChartCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var chart sourcev1.HelmChart + err = kubeClient.Get(ctx, namespacedName, &chart) + if err != nil { + return err + } + + logger.Actionf("suspending source %s in %s namespace", name, namespace) + chart.Spec.Suspend = true + if err := kubeClient.Update(ctx, &chart); err != nil { + return err + } + logger.Successf("source suspended") + + return nil +} diff --git a/cmd/flux/suspend_source_git.go b/cmd/flux/suspend_source_git.go new file mode 100644 index 00000000..e96f3fc5 --- /dev/null +++ b/cmd/flux/suspend_source_git.go @@ -0,0 +1,75 @@ +/* +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 ( + "context" + "fmt" + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" +) + +var suspendSourceGitCmd = &cobra.Command{ + Use: "git [name]", + Short: "Suspend reconciliation of a GitRepository", + Long: "The suspend command disables the reconciliation of a GitRepository resource.", + Example: ` # Suspend reconciliation for an existing GitRepository + flux suspend source git podinfo +`, + RunE: suspendSourceGitCmdRun, +} + +func init() { + suspendSourceCmd.AddCommand(suspendSourceGitCmd) +} + +func suspendSourceGitCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var repository sourcev1.GitRepository + err = kubeClient.Get(ctx, namespacedName, &repository) + if err != nil { + return err + } + + logger.Actionf("suspending source %s in %s namespace", name, namespace) + repository.Spec.Suspend = true + if err := kubeClient.Update(ctx, &repository); err != nil { + return err + } + logger.Successf("source suspended") + + return nil +} diff --git a/cmd/flux/suspend_source_helm.go b/cmd/flux/suspend_source_helm.go new file mode 100644 index 00000000..fd132962 --- /dev/null +++ b/cmd/flux/suspend_source_helm.go @@ -0,0 +1,75 @@ +/* +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 ( + "context" + "fmt" + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" +) + +var suspendSourceHelmCmd = &cobra.Command{ + Use: "helm [name]", + Short: "Suspend reconciliation of a HelmRepository", + Long: "The suspend command disables the reconciliation of a HelmRepository resource.", + Example: ` # Suspend reconciliation for an existing HelmRepository + flux suspend source helm bitnami +`, + RunE: suspendSourceHelmCmdRun, +} + +func init() { + suspendSourceCmd.AddCommand(suspendSourceHelmCmd) +} + +func suspendSourceHelmCmdRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("source name is required") + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var repository sourcev1.HelmRepository + err = kubeClient.Get(ctx, namespacedName, &repository) + if err != nil { + return err + } + + logger.Actionf("suspending source %s in %s namespace", name, namespace) + repository.Spec.Suspend = true + if err := kubeClient.Update(ctx, &repository); err != nil { + return err + } + logger.Successf("source suspended") + + return nil +} diff --git a/docs/cmd/flux_get_sources.md b/docs/cmd/flux_get_sources.md index 34f61be4..780cde02 100644 --- a/docs/cmd/flux_get_sources.md +++ b/docs/cmd/flux_get_sources.md @@ -27,6 +27,7 @@ The get source sub-commands print the statuses of the sources. * [flux get](flux_get.md) - Get sources and resources * [flux get sources bucket](flux_get_sources_bucket.md) - Get Bucket source statuses +* [flux get sources chart](flux_get_sources_chart.md) - Get HelmChart statuses * [flux get sources git](flux_get_sources_git.md) - Get GitRepository source statuses * [flux get sources helm](flux_get_sources_helm.md) - Get HelmRepository source statuses diff --git a/docs/cmd/flux_get_sources_bucket.md b/docs/cmd/flux_get_sources_bucket.md index 352bcc37..661004b6 100644 --- a/docs/cmd/flux_get_sources_bucket.md +++ b/docs/cmd/flux_get_sources_bucket.md @@ -16,6 +16,9 @@ flux get sources bucket [flags] # List all Buckets and their status flux get sources bucket + # List buckets from all namespaces + flux get sources helm --all-namespaces + ``` ### Options diff --git a/docs/cmd/flux_get_sources_chart.md b/docs/cmd/flux_get_sources_chart.md new file mode 100644 index 00000000..dd4f196a --- /dev/null +++ b/docs/cmd/flux_get_sources_chart.md @@ -0,0 +1,44 @@ +## flux get sources chart + +Get HelmChart statuses + +### Synopsis + +The get sources chart command prints the status of the HelmCharts. + +``` +flux get sources chart [flags] +``` + +### Examples + +``` + # List all Helm charts and their status + flux get sources chart + + # List Helm charts from all namespaces + flux get sources chart --all-namespaces + +``` + +### Options + +``` + -h, --help help for chart +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get sources](flux_get_sources.md) - Get source statuses + diff --git a/docs/cmd/flux_get_sources_git.md b/docs/cmd/flux_get_sources_git.md index ceb22ad3..55cf75dc 100644 --- a/docs/cmd/flux_get_sources_git.md +++ b/docs/cmd/flux_get_sources_git.md @@ -16,6 +16,9 @@ flux get sources git [flags] # List all Git repositories and their status flux get sources git + # List Git repositories from all namespaces + flux get sources git --all-namespaces + ``` ### Options diff --git a/docs/cmd/flux_get_sources_helm.md b/docs/cmd/flux_get_sources_helm.md index 69e5bbf4..294ad059 100644 --- a/docs/cmd/flux_get_sources_helm.md +++ b/docs/cmd/flux_get_sources_helm.md @@ -16,6 +16,9 @@ flux get sources helm [flags] # List all Helm repositories and their status flux get sources helm + # List Helm repositories from all namespaces + flux get sources helm --all-namespaces + ``` ### Options diff --git a/docs/cmd/flux_resume.md b/docs/cmd/flux_resume.md index ad74fb86..71bb21fd 100644 --- a/docs/cmd/flux_resume.md +++ b/docs/cmd/flux_resume.md @@ -29,4 +29,5 @@ The resume sub-commands resume a suspended resource. * [flux resume helmrelease](flux_resume_helmrelease.md) - Resume a suspended HelmRelease * [flux resume kustomization](flux_resume_kustomization.md) - Resume a suspended Kustomization * [flux resume receiver](flux_resume_receiver.md) - Resume a suspended Receiver +* [flux resume source](flux_resume_source.md) - Resume sources diff --git a/docs/cmd/flux_resume_source.md b/docs/cmd/flux_resume_source.md new file mode 100644 index 00000000..d2c06c14 --- /dev/null +++ b/docs/cmd/flux_resume_source.md @@ -0,0 +1,32 @@ +## flux resume source + +Resume sources + +### Synopsis + +The resume sub-commands resume a suspended source. + +### Options + +``` + -h, --help help for source +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume](flux_resume.md) - Resume suspended resources +* [flux resume source bucket](flux_resume_source_bucket.md) - Resume a suspended Bucket +* [flux resume source chart](flux_resume_source_chart.md) - Resume a suspended HelmChart +* [flux resume source git](flux_resume_source_git.md) - Resume a suspended GitRepository +* [flux resume source helm](flux_resume_source_helm.md) - Resume a suspended HelmRepository + diff --git a/docs/cmd/flux_resume_source_bucket.md b/docs/cmd/flux_resume_source_bucket.md new file mode 100644 index 00000000..58916381 --- /dev/null +++ b/docs/cmd/flux_resume_source_bucket.md @@ -0,0 +1,40 @@ +## flux resume source bucket + +Resume a suspended Bucket + +### Synopsis + +The resume command marks a previously suspended Bucket resource for reconciliation and waits for it to finish. + +``` +flux resume source bucket [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing Bucket + flux resume source bucket podinfo + +``` + +### Options + +``` + -h, --help help for bucket +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume source](flux_resume_source.md) - Resume sources + diff --git a/docs/cmd/flux_resume_source_chart.md b/docs/cmd/flux_resume_source_chart.md new file mode 100644 index 00000000..8d3c562e --- /dev/null +++ b/docs/cmd/flux_resume_source_chart.md @@ -0,0 +1,40 @@ +## flux resume source chart + +Resume a suspended HelmChart + +### Synopsis + +The resume command marks a previously suspended HelmChart resource for reconciliation and waits for it to finish. + +``` +flux resume source chart [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing HelmChart + flux resume source chart podinfo + +``` + +### Options + +``` + -h, --help help for chart +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume source](flux_resume_source.md) - Resume sources + diff --git a/docs/cmd/flux_resume_source_git.md b/docs/cmd/flux_resume_source_git.md new file mode 100644 index 00000000..195be5ed --- /dev/null +++ b/docs/cmd/flux_resume_source_git.md @@ -0,0 +1,40 @@ +## flux resume source git + +Resume a suspended GitRepository + +### Synopsis + +The resume command marks a previously suspended GitRepository resource for reconciliation and waits for it to finish. + +``` +flux resume source git [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing GitRepository + flux resume source git podinfo + +``` + +### Options + +``` + -h, --help help for git +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume source](flux_resume_source.md) - Resume sources + diff --git a/docs/cmd/flux_resume_source_helm.md b/docs/cmd/flux_resume_source_helm.md new file mode 100644 index 00000000..be7f75cd --- /dev/null +++ b/docs/cmd/flux_resume_source_helm.md @@ -0,0 +1,40 @@ +## flux resume source helm + +Resume a suspended HelmRepository + +### Synopsis + +The resume command marks a previously suspended HelmRepository resource for reconciliation and waits for it to finish. + +``` +flux resume source helm [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing HelmRepository + flux resume source helm bitnami + +``` + +### Options + +``` + -h, --help help for helm +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume source](flux_resume_source.md) - Resume sources + diff --git a/docs/cmd/flux_suspend.md b/docs/cmd/flux_suspend.md index 044c0805..b5e2f934 100644 --- a/docs/cmd/flux_suspend.md +++ b/docs/cmd/flux_suspend.md @@ -29,4 +29,5 @@ The suspend sub-commands suspend the reconciliation of a resource. * [flux suspend helmrelease](flux_suspend_helmrelease.md) - Suspend reconciliation of HelmRelease * [flux suspend kustomization](flux_suspend_kustomization.md) - Suspend reconciliation of Kustomization * [flux suspend receiver](flux_suspend_receiver.md) - Suspend reconciliation of Receiver +* [flux suspend source](flux_suspend_source.md) - Suspend sources diff --git a/docs/cmd/flux_suspend_source.md b/docs/cmd/flux_suspend_source.md new file mode 100644 index 00000000..c2246bf6 --- /dev/null +++ b/docs/cmd/flux_suspend_source.md @@ -0,0 +1,32 @@ +## flux suspend source + +Suspend sources + +### Synopsis + +The suspend sub-commands suspend the reconciliation of a source. + +### Options + +``` + -h, --help help for source +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend](flux_suspend.md) - Suspend resources +* [flux suspend source bucket](flux_suspend_source_bucket.md) - Suspend reconciliation of a Bucket +* [flux suspend source chart](flux_suspend_source_chart.md) - Suspend reconciliation of a HelmChart +* [flux suspend source git](flux_suspend_source_git.md) - Suspend reconciliation of a GitRepository +* [flux suspend source helm](flux_suspend_source_helm.md) - Suspend reconciliation of a HelmRepository + diff --git a/docs/cmd/flux_suspend_source_bucket.md b/docs/cmd/flux_suspend_source_bucket.md new file mode 100644 index 00000000..5af9ee3a --- /dev/null +++ b/docs/cmd/flux_suspend_source_bucket.md @@ -0,0 +1,40 @@ +## flux suspend source bucket + +Suspend reconciliation of a Bucket + +### Synopsis + +The suspend command disables the reconciliation of a Bucket resource. + +``` +flux suspend source bucket [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing Bucket + flux suspend source bucket podinfo + +``` + +### Options + +``` + -h, --help help for bucket +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend source](flux_suspend_source.md) - Suspend sources + diff --git a/docs/cmd/flux_suspend_source_chart.md b/docs/cmd/flux_suspend_source_chart.md new file mode 100644 index 00000000..9e7bd292 --- /dev/null +++ b/docs/cmd/flux_suspend_source_chart.md @@ -0,0 +1,40 @@ +## flux suspend source chart + +Suspend reconciliation of a HelmChart + +### Synopsis + +The suspend command disables the reconciliation of a HelmChart resource. + +``` +flux suspend source chart [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing HelmChart + flux suspend source chart podinfo + +``` + +### Options + +``` + -h, --help help for chart +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend source](flux_suspend_source.md) - Suspend sources + diff --git a/docs/cmd/flux_suspend_source_git.md b/docs/cmd/flux_suspend_source_git.md new file mode 100644 index 00000000..21588cae --- /dev/null +++ b/docs/cmd/flux_suspend_source_git.md @@ -0,0 +1,40 @@ +## flux suspend source git + +Suspend reconciliation of a GitRepository + +### Synopsis + +The suspend command disables the reconciliation of a GitRepository resource. + +``` +flux suspend source git [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing GitRepository + flux suspend source git podinfo + +``` + +### Options + +``` + -h, --help help for git +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend source](flux_suspend_source.md) - Suspend sources + diff --git a/docs/cmd/flux_suspend_source_helm.md b/docs/cmd/flux_suspend_source_helm.md new file mode 100644 index 00000000..20a823ce --- /dev/null +++ b/docs/cmd/flux_suspend_source_helm.md @@ -0,0 +1,40 @@ +## flux suspend source helm + +Suspend reconciliation of a HelmRepository + +### Synopsis + +The suspend command disables the reconciliation of a HelmRepository resource. + +``` +flux suspend source helm [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing HelmRepository + flux suspend source helm bitnami + +``` + +### Options + +``` + -h, --help help for helm +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend source](flux_suspend_source.md) - Suspend sources + diff --git a/go.mod b/go.mod index c2ab39b7..d9bf219f 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/fluxcd/pkg/runtime v0.3.0 github.com/fluxcd/pkg/ssh v0.0.5 github.com/fluxcd/pkg/untar v0.0.5 - github.com/fluxcd/source-controller/api v0.3.0 + github.com/fluxcd/source-controller/api v0.4.0 github.com/manifoldco/promptui v0.7.0 github.com/olekukonko/tablewriter v0.0.4 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index b894eba7..7107ed2f 100644 --- a/go.sum +++ b/go.sum @@ -149,8 +149,8 @@ github.com/fluxcd/pkg/ssh v0.0.5 h1:rnbFZ7voy2JBlUfMbfyqArX2FYaLNpDhccGFC3qW83A= github.com/fluxcd/pkg/ssh v0.0.5/go.mod h1:7jXPdXZpc0ttMNz2kD9QuMi3RNn/e0DOFbj0Tij/+Hs= github.com/fluxcd/pkg/untar v0.0.5 h1:UGI3Ch1UIEIaqQvMicmImL1s9npQa64DJ/ozqHKB7gk= github.com/fluxcd/pkg/untar v0.0.5/go.mod h1:O6V9+rtl8c1mHBafgqFlJN6zkF1HS5SSYn7RpQJ/nfw= -github.com/fluxcd/source-controller/api v0.3.0 h1:liDV8tqpBeQp7KDdVxX9YYb6gFoO7v2hyIFXudw2vQg= -github.com/fluxcd/source-controller/api v0.3.0/go.mod h1:MYmvbADJp/21m4C+PEY7WXCeqEErMYuhns+jnKyewqs= +github.com/fluxcd/source-controller/api v0.4.0 h1:hyHMFXLxkTT4H7KT7h0UUb3GK6bS2JJzNCcilBk2fXs= +github.com/fluxcd/source-controller/api v0.4.0/go.mod h1:MYmvbADJp/21m4C+PEY7WXCeqEErMYuhns+jnKyewqs= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= diff --git a/manifests/bases/source-controller/kustomization.yaml b/manifests/bases/source-controller/kustomization.yaml index 08f479cf..9d6715e6 100644 --- a/manifests/bases/source-controller/kustomization.yaml +++ b/manifests/bases/source-controller/kustomization.yaml @@ -1,8 +1,8 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: -- https://github.com/fluxcd/source-controller/archive/v0.3.0.zip//source-controller-0.3.0/config/crd -- https://github.com/fluxcd/source-controller/archive/v0.3.0.zip//source-controller-0.3.0/config/manager +- https://github.com/fluxcd/source-controller/archive/v0.4.0.zip//source-controller-0.4.0/config/crd +- https://github.com/fluxcd/source-controller/archive/v0.4.0.zip//source-controller-0.4.0/config/manager patchesJson6902: - target: group: apps diff --git a/mkdocs.yml b/mkdocs.yml index a9771d90..574f0b48 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -119,6 +119,7 @@ nav: - Get sources: cmd/flux_get_sources.md - Get sources git: cmd/flux_get_sources_git.md - Get sources helm: cmd/flux_get_sources_helm.md + - Get sources chart: cmd/flux_get_sources_chart.md - Get sources bucket: cmd/flux_get_sources_bucket.md - Get alert provider: cmd/flux_get_alert-provider.md - Get alert: cmd/flux_get_alert.md @@ -127,12 +128,22 @@ nav: - Resume: cmd/flux_resume.md - Resume kustomization: cmd/flux_resume_kustomization.md - Resume helmrelease: cmd/flux_resume_helmrelease.md + - Resume source: cmd/flux_resume_source.md + - Resume source git: cmd/flux_resume_source_git.md + - Resume source helm: cmd/flux_resume_source_helm.md + - Resume source chart: cmd/flux_resume_source_chart.md + - Resume source bucket: cmd/flux_resume_source_bucket.md - Resume alert provider: cmd/flux_resume_alert-provider.md - Resume alert: cmd/flux_resume_alert.md - Resume receiver: cmd/flux_resume_receiver.md - Suspend: cmd/flux_suspend.md - Suspend kustomization: cmd/flux_suspend_kustomization.md - Suspend helmrelease: cmd/flux_suspend_helmrelease.md + - Suspend source: cmd/flux_suspend_source.md + - Suspend source git: cmd/flux_suspend_source_git.md + - Suspend source helm: cmd/flux_suspend_source_helm.md + - Suspend source chart: cmd/flux_suspend_source_chart.md + - Suspend source bucket: cmd/flux_suspend_source_bucket.md - Suspend alert provider: cmd/flux_suspend_alert-provider.md - Suspend alert: cmd/flux_suspend_alert.md - Suspend receiver: cmd/flux_suspend_receiver.md