mirror of https://github.com/fluxcd/flux2.git
				
				
				
			Merge pull request #376 from phillebaba/refactor-manifest-generation
Refactor manifest generation into a separate packagepull/387/head
						commit
						41d4e7e15b
					
				| @ -0,0 +1,23 @@ | ||||
| package sync | ||||
| 
 | ||||
| import "time" | ||||
| 
 | ||||
| type Options struct { | ||||
| 	Interval   time.Duration | ||||
| 	URL        string | ||||
| 	Name       string | ||||
| 	Namespace  string | ||||
| 	Branch     string | ||||
| 	TargetPath string | ||||
| } | ||||
| 
 | ||||
| func MakeDefaultOptions() Options { | ||||
| 	return Options{ | ||||
| 		Interval:   1 * time.Minute, | ||||
| 		URL:        "", | ||||
| 		Name:       "gotk-system", | ||||
| 		Namespace:  "gotk-system", | ||||
| 		Branch:     "main", | ||||
| 		TargetPath: "", | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,88 @@ | ||||
| package sync | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"sigs.k8s.io/yaml" | ||||
| 
 | ||||
| 	kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1beta1" | ||||
| 	sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	bootstrapSourceManifest        = "toolkit-source.yaml" | ||||
| 	bootstrapKustomizationManifest = "toolkit-kustomization.yaml" | ||||
| ) | ||||
| 
 | ||||
| func Generate(options Options) ([]map[string]string, error) { | ||||
| 	files := []map[string]string{} | ||||
| 
 | ||||
| 	gvk := sourcev1.GroupVersion.WithKind(sourcev1.GitRepositoryKind) | ||||
| 	gitRepository := sourcev1.GitRepository{ | ||||
| 		TypeMeta: metav1.TypeMeta{ | ||||
| 			Kind:       gvk.Kind, | ||||
| 			APIVersion: gvk.GroupVersion().String(), | ||||
| 		}, | ||||
| 		ObjectMeta: metav1.ObjectMeta{ | ||||
| 			Name:      options.Name, | ||||
| 			Namespace: options.Namespace, | ||||
| 		}, | ||||
| 		Spec: sourcev1.GitRepositorySpec{ | ||||
| 			URL: options.URL, | ||||
| 			Interval: metav1.Duration{ | ||||
| 				Duration: options.Interval, | ||||
| 			}, | ||||
| 			Reference: &sourcev1.GitRepositoryRef{ | ||||
| 				Branch: options.Branch, | ||||
| 			}, | ||||
| 			SecretRef: &corev1.LocalObjectReference{ | ||||
| 				Name: options.Name, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	gitData, err := yaml.Marshal(gitRepository) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	files = append(files, map[string]string{"file_path": filepath.Join(options.TargetPath, options.Namespace, bootstrapSourceManifest), "content": string(gitData)}) | ||||
| 
 | ||||
| 	gvk = kustomizev1.GroupVersion.WithKind(kustomizev1.KustomizationKind) | ||||
| 	kustomization := kustomizev1.Kustomization{ | ||||
| 		TypeMeta: metav1.TypeMeta{ | ||||
| 			Kind:       gvk.Kind, | ||||
| 			APIVersion: gvk.GroupVersion().String(), | ||||
| 		}, | ||||
| 		ObjectMeta: metav1.ObjectMeta{ | ||||
| 			Name:      options.Name, | ||||
| 			Namespace: options.Namespace, | ||||
| 		}, | ||||
| 		Spec: kustomizev1.KustomizationSpec{ | ||||
| 			Interval: metav1.Duration{ | ||||
| 				Duration: 10 * time.Minute, | ||||
| 			}, | ||||
| 			Path:  fmt.Sprintf("./%s", strings.TrimPrefix(options.TargetPath, "./")), | ||||
| 			Prune: true, | ||||
| 			SourceRef: kustomizev1.CrossNamespaceSourceReference{ | ||||
| 				Kind: sourcev1.GitRepositoryKind, | ||||
| 				Name: options.Name, | ||||
| 			}, | ||||
| 			Validation: "client", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	ksData, err := yaml.Marshal(kustomization) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	files = append(files, map[string]string{"file_path": filepath.Join(options.TargetPath, options.Namespace, bootstrapKustomizationManifest), "content": string(ksData)}) | ||||
| 
 | ||||
| 	return files, nil | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| /* | ||||
| Copyright 2020 The Flux CD contributors. | ||||
| 
 | ||||
| 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 sync | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestGenerate(t *testing.T) { | ||||
| 	opts := MakeDefaultOptions() | ||||
| 	output, err := Generate(opts) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	fmt.Println(output) | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue