Skip to content

Commit

Permalink
update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rajansandeep committed Apr 21, 2020
1 parent 7e0ffb4 commit a7968bc
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 41 deletions.
4 changes: 2 additions & 2 deletions pkg/patterns/declarative/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ type reconcilerParams struct {

prune bool
preserveNamespace bool
kustomize bool
Kustomize bool
validate bool

sink Sink
Expand Down Expand Up @@ -158,7 +158,7 @@ func WithPreserveNamespace() reconcilerOption {
// WithApplyKustomize run kustomize build to create final manifest
func WithApplyKustomize() reconcilerOption {
return func(p reconcilerParams) reconcilerParams {
p.kustomize = true
p.Kustomize = true
return p
}
}
Expand Down
56 changes: 28 additions & 28 deletions pkg/patterns/declarative/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ type Reconciler struct {

mgr manager.Manager

options reconcilerParams
Options reconcilerParams
}

type kubectlClient interface {
Expand Down Expand Up @@ -96,8 +96,8 @@ func (r *Reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
return reconcile.Result{}, err
}

if r.options.status != nil {
if err := r.options.status.Preflight(ctx, instance); err != nil {
if r.Options.status != nil {
if err := r.Options.status.Preflight(ctx, instance); err != nil {
log.Error(err, "preflight check failed, not reconciling")
return reconcile.Result{}, err
}
Expand All @@ -111,20 +111,20 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN
log.WithValues("object", name.String()).Info("reconciling")

var fs filesys.FileSystem
if r.options.kustomize {
if r.Options.Kustomize {
fs = filesys.MakeFsInMemory()
}

objects, err := r.buildDeploymentObjects(ctx, name, instance, fs)
objects, err := r.BuildDeploymentObjectsWithFs(ctx, name, instance, fs)
if err != nil {
log.Error(err, "building deployment objects")
return reconcile.Result{}, fmt.Errorf("error building deployment objects: %v", err)
}
log.WithValues("objects", fmt.Sprintf("%d", len(objects.Items))).Info("built deployment objects")

defer func() {
if r.options.status != nil {
if err := r.options.status.Reconciled(ctx, instance, objects); err != nil {
if r.Options.status != nil {
if err := r.Options.status.Reconciled(ctx, instance, objects); err != nil {
log.Error(err, "failed to reconcile status")
}
}
Expand All @@ -136,7 +136,7 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN
}
var manifestStr string

if r.options.kustomize {
if r.Options.Kustomize {
// run kustomize to create final manifest
opts := krusty.MakeDefaultOptions()
k := krusty.MakeKustomizer(fs, opts)
Expand Down Expand Up @@ -165,27 +165,27 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN

extraArgs := []string{"--force"}

if r.options.prune {
if r.Options.prune {
var labels []string
for k, v := range r.options.labelMaker(ctx, instance) {
for k, v := range r.Options.labelMaker(ctx, instance) {
labels = append(labels, fmt.Sprintf("%s=%s", k, v))
}

extraArgs = append(extraArgs, "--prune", "--selector", strings.Join(labels, ","))
}

ns := ""
if !r.options.preserveNamespace {
if !r.Options.preserveNamespace {
ns = name.Namespace
}

if err := r.kubectl.Apply(ctx, ns, manifestStr, r.options.validate, extraArgs...); err != nil {
if err := r.kubectl.Apply(ctx, ns, manifestStr, r.Options.validate, extraArgs...); err != nil {
log.Error(err, "applying manifest")
return reconcile.Result{}, fmt.Errorf("error applying manifest: %v", err)
}

if r.options.sink != nil {
if err := r.options.sink.Notify(ctx, instance, objects); err != nil {
if r.Options.sink != nil {
if err := r.Options.sink.Notify(ctx, instance, objects); err != nil {
log.Error(err, "notifying sink")
return reconcile.Result{}, err
}
Expand All @@ -196,12 +196,12 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN

// BuildDeploymentObjects performs all manifest operations to build a final set of objects for deployment
func (r *Reconciler) BuildDeploymentObjects(ctx context.Context, name types.NamespacedName, instance DeclarativeObject) (*manifest.Objects, error) {
return r.buildDeploymentObjects(ctx, name, instance, nil)
return r.BuildDeploymentObjectsWithFs(ctx, name, instance, nil)
}

// buildDeploymentObjects is the implementation of BuildDeploymentObjects, supporting saving to a filesystem for kustomize
// BuildDeploymentObjectsWithFs is the implementation of BuildDeploymentObjects, supporting saving to a filesystem for kustomize
// If fs is provided, the transformed manifests will be saved to that filesystem
func (r *Reconciler) buildDeploymentObjects(ctx context.Context, name types.NamespacedName, instance DeclarativeObject, fs filesys.FileSystem) (*manifest.Objects, error) {
func (r *Reconciler) BuildDeploymentObjectsWithFs(ctx context.Context, name types.NamespacedName, instance DeclarativeObject, fs filesys.FileSystem) (*manifest.Objects, error) {
log := log.Log

// 1. Load the manifest
Expand All @@ -213,7 +213,7 @@ func (r *Reconciler) buildDeploymentObjects(ctx context.Context, name types.Name
manifestObjects := &manifest.Objects{}
// 2. Perform raw string operations
for manifestPath, manifestStr := range manifestFiles {
for _, t := range r.options.rawManifestOperations {
for _, t := range r.Options.rawManifestOperations {
transformed, err := t(ctx, instance, manifestStr)
if err != nil {
log.Error(err, "error performing raw manifest operations")
Expand All @@ -230,9 +230,9 @@ func (r *Reconciler) buildDeploymentObjects(ctx context.Context, name types.Name
}

// 4. Perform object transformations
transforms := r.options.objectTransformations
if r.options.labelMaker != nil {
transforms = append(transforms, AddLabels(r.options.labelMaker(ctx, instance)))
transforms := r.Options.objectTransformations
if r.Options.labelMaker != nil {
transforms = append(transforms, AddLabels(r.Options.labelMaker(ctx, instance)))
}
// TODO(jrjohnson): apply namespace here
for _, t := range transforms {
Expand Down Expand Up @@ -267,7 +267,7 @@ func (r *Reconciler) buildDeploymentObjects(ctx context.Context, name types.Name

// loadRawManifest loads the raw manifest YAML from the repository
func (r *Reconciler) loadRawManifest(ctx context.Context, o DeclarativeObject) (map[string]string, error) {
s, err := r.options.manifestController.ResolveManifest(ctx, o)
s, err := r.Options.manifestController.ResolveManifest(ctx, o)
if err != nil {
return nil, err
}
Expand All @@ -294,19 +294,19 @@ func (r *Reconciler) applyOptions(opts ...reconcilerOption) error {
params.manifestController = loader
}

r.options = params
r.Options = params
return nil
}

// Validate compatibility of selected options
func (r *Reconciler) validateOptions() error {
var errs []string

if r.options.prune && r.options.labelMaker == nil {
if r.Options.prune && r.Options.labelMaker == nil {
errs = append(errs, "WithApplyPrune must be used with the WithLabels option")
}

if r.options.manifestController == nil {
if r.Options.manifestController == nil {
errs = append(errs, "ManifestController must be set either by configuring DefaultManifestLoader or specifying the WithManifestController option")
}

Expand All @@ -318,15 +318,15 @@ func (r *Reconciler) validateOptions() error {
}

func (r *Reconciler) injectOwnerRef(ctx context.Context, instance DeclarativeObject, objects *manifest.Objects) error {
if r.options.ownerFn == nil {
if r.Options.ownerFn == nil {
return nil
}

log := log.Log
log.WithValues("object", fmt.Sprintf("%s/%s", instance.GetName(), instance.GetNamespace())).Info("injecting owner references")

for _, o := range objects.Items {
owner, err := r.options.ownerFn(ctx, instance, *o, *objects)
owner, err := r.Options.ownerFn(ctx, instance, *o, *objects)
if err != nil {
log.WithValues("object", o).Error(err, "resolving owner ref", o)
return err
Expand Down Expand Up @@ -373,5 +373,5 @@ func (r *Reconciler) injectOwnerRef(ctx context.Context, instance DeclarativeObj

// SetSink provides a Sink that will be notified for all deployments
func (r *Reconciler) SetSink(sink Sink) {
r.options.sink = sink
r.Options.sink = sink
}
41 changes: 30 additions & 11 deletions pkg/test/golden/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ import (
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative"
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/manifest"
"sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/mocks"
"sigs.k8s.io/kustomize/api/filesys"
"sigs.k8s.io/kustomize/api/krusty"
)

func NewValidator(t *testing.T, b *scheme.Builder) *validator {
Expand Down Expand Up @@ -135,8 +137,8 @@ func (v *validator) Validate(r declarative.Reconciler) {
t := v.T
t.Helper()

serializer := json.NewSerializer(json.DefaultMetaFactory, v.scheme, v.scheme, false)
yamlizer := json.NewYAMLSerializer(json.DefaultMetaFactory, v.scheme, v.scheme)
serializer := json.NewSerializerWithOptions(json.DefaultMetaFactory, v.scheme, v.scheme, json.SerializerOptions{Yaml: false, Pretty: false, Strict: false})
yamlizer := json.NewSerializerWithOptions(json.DefaultMetaFactory, v.scheme, v.scheme, json.SerializerOptions{Yaml: true, Pretty: false, Strict: false})

metadataAccessor := meta.NewAccessor()

Expand Down Expand Up @@ -217,7 +219,11 @@ func (v *validator) Validate(r declarative.Reconciler) {

nsn := types.NamespacedName{Namespace: namespace, Name: name}

objects, err := r.BuildDeploymentObjects(ctx, nsn, cr.(declarative.DeclarativeObject))
var fs filesys.FileSystem
if r.Options.Kustomize {
fs = filesys.MakeFsInMemory()
}
objects, err := r.BuildDeploymentObjectsWithFs(ctx, nsn, cr.(declarative.DeclarativeObject), fs)
if err != nil {
t.Errorf("error building deployment objects: %v", err)
continue
Expand All @@ -227,17 +233,30 @@ func (v *validator) Validate(r declarative.Reconciler) {
{
var b bytes.Buffer

for i, o := range objects.Items {
if i != 0 {
b.WriteString("\n---\n\n")
if r.Options.Kustomize {
opts := krusty.MakeDefaultOptions()
k := krusty.MakeKustomizer(fs, opts)
m, err := k.Run(objects.Path)
if err != nil {
t.Fatalf("running kustomize to create final manifest: %v", err)
}
manifestYaml, err := m.AsYaml()
if err != nil {
t.Fatalf("creating final manifest yaml: %v", err)
}
u := o.UnstructuredObject()
if err := yamlizer.Encode(u, &b); err != nil {
t.Fatalf("error encoding to yaml: %v", err)
actualYAML = string(manifestYaml)
} else {
for i, o := range objects.Items {
if i != 0 {
b.WriteString("\n---\n\n")
}
u := o.UnstructuredObject()
if err := yamlizer.Encode(u, &b); err != nil {
t.Fatalf("error encoding to yaml: %v", err)
}
}
actualYAML = b.String()
}

actualYAML = b.String()
}

expectedPath := strings.Replace(p, ".in.yaml", ".out.yaml", -1)
Expand Down

0 comments on commit a7968bc

Please sign in to comment.