Implement export to YAML

- add export commands for git sources and kustomizations
- add export e2e tests
pull/13/head
stefanprodan 5 years ago
parent 6d590fe4d2
commit f127adc8ea

@ -80,6 +80,10 @@ jobs:
- name: tk resume kustomization
run: |
./bin/tk resume kustomization podinfo
- name: tk export
run: |
./bin/tk export source git --all
./bin/tk export kustomization --all
- name: tk delete kustomization
run: |
./bin/tk delete kustomization podinfo --silent

@ -3,8 +3,8 @@ package main
import (
"context"
"fmt"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
"github.com/manifoldco/promptui"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/types"

@ -0,0 +1,20 @@
package main
import (
"github.com/spf13/cobra"
)
var exportCmd = &cobra.Command{
Use: "export",
Short: "Export commands",
}
var (
exportAll bool
)
func init() {
exportCmd.PersistentFlags().BoolVar(&exportAll, "all", false, "select all resources")
rootCmd.AddCommand(exportCmd)
}

@ -0,0 +1,94 @@
package main
import (
"context"
"fmt"
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1alpha1"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/yaml"
)
var exportKsCmd = &cobra.Command{
Use: "kustomization [name]",
Aliases: []string{"ks"},
Short: "Export kustomization in YAML format",
RunE: exportKsCmdRun,
}
func init() {
exportCmd.AddCommand(exportKsCmd)
}
func exportKsCmdRun(cmd *cobra.Command, args []string) error {
if !exportAll && len(args) < 1 {
return fmt.Errorf("kustomization name is required")
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
kubeClient, err := utils.kubeClient(kubeconfig)
if err != nil {
return err
}
if exportAll {
var list kustomizev1.KustomizationList
err = kubeClient.List(ctx, &list, client.InNamespace(namespace))
if err != nil {
return err
}
if len(list.Items) == 0 {
logFailure("no kustomizations found in %s namespace", namespace)
return nil
}
for _, kustomization := range list.Items {
if err := exportKs(kustomization); err != nil {
return err
}
}
} else {
name := args[0]
namespacedName := types.NamespacedName{
Namespace: namespace,
Name: name,
}
var kustomization kustomizev1.Kustomization
err = kubeClient.Get(ctx, namespacedName, &kustomization)
if err != nil {
return err
}
return exportKs(kustomization)
}
return nil
}
func exportKs(kustomization kustomizev1.Kustomization) error {
gvk := kustomizev1.GroupVersion.WithKind("Kustomization")
export := kustomizev1.Kustomization{
TypeMeta: metav1.TypeMeta{
Kind: gvk.Kind,
APIVersion: gvk.GroupVersion().String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: kustomization.Name,
Namespace: kustomization.Namespace,
},
Spec: kustomization.Spec,
}
data, err := yaml.Marshal(export)
if err != nil {
return err
}
fmt.Println("---")
fmt.Println(string(data))
return nil
}

@ -0,0 +1,14 @@
package main
import (
"github.com/spf13/cobra"
)
var exportSourceCmd = &cobra.Command{
Use: "source",
Short: "Export source commands",
}
func init() {
exportCmd.AddCommand(exportSourceCmd)
}

@ -0,0 +1,93 @@
package main
import (
"context"
"fmt"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/yaml"
)
var exportSourceGitCmd = &cobra.Command{
Use: "git [name]",
Short: "Export git source in YAML format",
RunE: exportSourceGitCmdRun,
}
func init() {
exportSourceCmd.AddCommand(exportSourceGitCmd)
}
func exportSourceGitCmdRun(cmd *cobra.Command, args []string) error {
if !exportAll && len(args) < 1 {
return fmt.Errorf("kustomization name is required")
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
kubeClient, err := utils.kubeClient(kubeconfig)
if err != nil {
return err
}
if exportAll {
var list sourcev1.GitRepositoryList
err = kubeClient.List(ctx, &list, client.InNamespace(namespace))
if err != nil {
return err
}
if len(list.Items) == 0 {
logFailure("no source found in %s namespace", namespace)
return nil
}
for _, repository := range list.Items {
if err := exportGit(repository); err != nil {
return err
}
}
} else {
name := args[0]
namespacedName := types.NamespacedName{
Namespace: namespace,
Name: name,
}
var repository sourcev1.GitRepository
err = kubeClient.Get(ctx, namespacedName, &repository)
if err != nil {
return err
}
return exportGit(repository)
}
return nil
}
func exportGit(source sourcev1.GitRepository) error {
gvk := sourcev1.GroupVersion.WithKind("GitRepository")
export := sourcev1.GitRepository{
TypeMeta: metav1.TypeMeta{
Kind: gvk.Kind,
APIVersion: gvk.GroupVersion().String(),
},
ObjectMeta: metav1.ObjectMeta{
Name: source.Name,
Namespace: source.Namespace,
},
Spec: source.Spec,
}
data, err := yaml.Marshal(export)
if err != nil {
return err
}
fmt.Println("---")
fmt.Println(string(data))
return nil
}

@ -38,6 +38,9 @@ var rootCmd = &cobra.Command{
# Trigger a git sync
tk sync source git webapp-latest
# Export git sources in YAML format
tk export source git --all > sources.yaml
# Create a kustomization for deploying a series of microservices
tk create kustomization webapp-dev \
--source=webapp-latest \
@ -56,6 +59,9 @@ var rootCmd = &cobra.Command{
# Suspend a kustomization reconciliation
tk suspend kustomization webapp-dev
# Export kustomizations in YAML format
tk export kustomization --all > kustomizations.yaml
# Resume a kustomization reconciliation
tk resume kustomization webapp-dev

@ -12,6 +12,7 @@ require (
k8s.io/apimachinery v0.18.2
k8s.io/client-go v0.18.2
sigs.k8s.io/controller-runtime v0.6.0
sigs.k8s.io/yaml v1.2.0
)
// fix AKS auth

Loading…
Cancel
Save