From c4851aa9c6ded875db318cfedde141803de12f82 Mon Sep 17 00:00:00 2001 From: Daniel Guns Date: Fri, 10 Oct 2025 16:47:20 -0300 Subject: [PATCH] Adding export source external Signed-off-by: Daniel Guns --- cmd/flux/export_source_external.go | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 cmd/flux/export_source_external.go diff --git a/cmd/flux/export_source_external.go b/cmd/flux/export_source_external.go new file mode 100644 index 00000000..5451761d --- /dev/null +++ b/cmd/flux/export_source_external.go @@ -0,0 +1,84 @@ +/* +Copyright 2025 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" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + + sourcev1 "github.com/fluxcd/source-controller/api/v1" +) + +var exportSourceExternalCmd = &cobra.Command{ + Use: "external [name]", + Short: "Export ExternalArtifact sources in YAML format", + Long: "The export source external command exports one or all ExternalArtifact sources in YAML format.", + Example: ` # Export all ExternalArtifact sources + flux export source external --all > sources.yaml + + # Export a specific ExternalArtifact + flux export source external my-artifact > source.yaml`, + ValidArgsFunction: resourceNamesCompletionFunc(sourcev1.GroupVersion.WithKind(sourcev1.ExternalArtifactKind)), + RunE: exportWithSecretCommand{ + list: externalArtifactListAdapter{&sourcev1.ExternalArtifactList{}}, + object: externalArtifactAdapter{&sourcev1.ExternalArtifact{}}, + }.run, +} + +func init() { + exportSourceCmd.AddCommand(exportSourceExternalCmd) +} + +func exportExternalArtifact(source *sourcev1.ExternalArtifact) interface{} { + gvk := sourcev1.GroupVersion.WithKind(sourcev1.ExternalArtifactKind) + export := sourcev1.ExternalArtifact{ + TypeMeta: metav1.TypeMeta{ + Kind: gvk.Kind, + APIVersion: gvk.GroupVersion().String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: source.Name, + Namespace: source.Namespace, + Labels: source.Labels, + Annotations: source.Annotations, + }, + Spec: source.Spec, + } + return export +} + +func getExternalArtifactSecret(source *sourcev1.ExternalArtifact) *types.NamespacedName { + // ExternalArtifact does not have a secretRef in its spec, this satisfies the interface + return nil +} + +func (ex externalArtifactAdapter) secret() *types.NamespacedName { + return getExternalArtifactSecret(ex.ExternalArtifact) +} + +func (ex externalArtifactListAdapter) secretItem(i int) *types.NamespacedName { + return getExternalArtifactSecret(&ex.ExternalArtifactList.Items[i]) +} + +func (ex externalArtifactAdapter) export() interface{} { + return exportExternalArtifact(ex.ExternalArtifact) +} + +func (ex externalArtifactListAdapter) exportItem(i int) interface{} { + return exportExternalArtifact(&ex.ExternalArtifactList.Items[i]) +}