diff --git a/pkg/controller/instance/instance_controller.go b/pkg/controller/instance/instance_controller.go index 99e091155..200f089b1 100644 --- a/pkg/controller/instance/instance_controller.go +++ b/pkg/controller/instance/instance_controller.go @@ -23,8 +23,9 @@ import ( "strings" "time" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/engine" - "github.com/kudobuilder/kudo/pkg/engine/task" "github.com/kudobuilder/kudo/pkg/engine/workflow" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/source" @@ -168,7 +169,7 @@ func (r *Reconciler) Reconcile(request ctrl.Request) (ctrl.Result, error) { return reconcile.Result{}, err } log.Printf("InstanceController: Going to proceed in execution of active plan %s on instance %s/%s", activePlan.Name, instance.Namespace, instance.Name) - newStatus, err := workflow.Execute(activePlan, metadata, r.Client, &task.KustomizeEnhancer{Scheme: r.Scheme}, time.Now()) + newStatus, err := workflow.Execute(activePlan, metadata, r.Client, &renderer.KustomizeEnhancer{Scheme: r.Scheme}, time.Now()) // ---------- 4. Update status of instance after the execution proceeded ---------- if newStatus != nil { diff --git a/pkg/util/health/ready.go b/pkg/engine/health/health.go similarity index 100% rename from pkg/util/health/ready.go rename to pkg/engine/health/health.go diff --git a/pkg/engine/renderer/engine.go b/pkg/engine/renderer/engine.go index 0cd6bcc52..3d8c635eb 100644 --- a/pkg/engine/renderer/engine.go +++ b/pkg/engine/renderer/engine.go @@ -5,9 +5,22 @@ import ( "fmt" "text/template" + "github.com/kudobuilder/kudo/pkg/engine" + "github.com/masterminds/sprig" ) +// Metadata contains Metadata along with specific fields associated with current plan +// being executed like current plan, phase, step or task names. +type Metadata struct { + engine.Metadata + + PlanName string + PhaseName string + StepName string + TaskName string +} + // Engine is the control struct for parsing and templating Kubernetes resources in an ordered fashion type Engine struct { FuncMap template.FuncMap diff --git a/pkg/engine/task/enhancer.go b/pkg/engine/renderer/enhancer.go similarity index 97% rename from pkg/engine/task/enhancer.go rename to pkg/engine/renderer/enhancer.go index 7c985a186..efbe227c5 100644 --- a/pkg/engine/task/enhancer.go +++ b/pkg/engine/renderer/enhancer.go @@ -1,4 +1,4 @@ -package task +package renderer import ( "fmt" @@ -9,7 +9,6 @@ import ( "github.com/pkg/errors" - "github.com/kudobuilder/kudo/pkg/util/template" "gopkg.in/yaml.v2" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/kustomize/k8sdeps/kunstruct" @@ -109,7 +108,7 @@ func (k *KustomizeEnhancer) Apply(templates map[string]string, metadata Metadata return nil, errors.Wrapf(err, "error encoding kustomized files into yaml") } - objsToAdd, err = template.ParseKubernetesObjects(string(res)) + objsToAdd, err = YamlToObject(string(res)) if err != nil { return nil, errors.Wrapf(err, "error parsing kubernetes objects after applying kustomize") } diff --git a/pkg/util/template/template.go b/pkg/engine/renderer/parser.go similarity index 85% rename from pkg/util/template/template.go rename to pkg/engine/renderer/parser.go index 99277b1e5..3e4f37c26 100644 --- a/pkg/util/template/template.go +++ b/pkg/engine/renderer/parser.go @@ -1,4 +1,4 @@ -package template +package renderer import ( "bytes" @@ -12,10 +12,10 @@ import ( "k8s.io/client-go/kubernetes/scheme" ) -// ParseKubernetesObjects parses a list of runtime.Objects from the provided yaml +// YamlToObject parses a list of runtime.Objects from the provided yaml // If the type is not known in the scheme, it tries to parse it as Unstructured // TODO(av) could we use something else than a global scheme here? Should we somehow inject it? -func ParseKubernetesObjects(yaml string) (objs []runtime.Object, err error) { +func YamlToObject(yaml string) (objs []runtime.Object, err error) { sepYamlfiles := strings.Split(yaml, "---") for _, f := range sepYamlfiles { if f == "\n" || f == "" { diff --git a/pkg/util/template/template_test.go b/pkg/engine/renderer/parser_test.go similarity index 82% rename from pkg/util/template/template_test.go rename to pkg/engine/renderer/parser_test.go index 99060eb2c..3ace143d9 100644 --- a/pkg/util/template/template_test.go +++ b/pkg/engine/renderer/parser_test.go @@ -1,9 +1,9 @@ -package template +package renderer import "testing" func TestParseKubernetesObjects_UnknownType(t *testing.T) { - _, err := ParseKubernetesObjects(`apiVersion: monitoring.coreos.com/v1 + _, err := YamlToObject(`apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: diff --git a/pkg/engine/task/render.go b/pkg/engine/task/render.go index df94a180d..f06d9fb3f 100644 --- a/pkg/engine/task/render.go +++ b/pkg/engine/task/render.go @@ -8,7 +8,7 @@ import ( ) // render method takes resource names and Instance parameters and then renders passed templates using kudo engine. -func render(resourceNames []string, templates map[string]string, params map[string]string, meta Metadata) (map[string]string, error) { +func render(resourceNames []string, templates map[string]string, params map[string]string, meta renderer.Metadata) (map[string]string, error) { configs := make(map[string]interface{}) configs["OperatorName"] = meta.OperatorName configs["Name"] = meta.InstanceName @@ -40,7 +40,7 @@ func render(resourceNames []string, templates map[string]string, params map[stri // kustomize method takes a slice of rendered templates, applies conventions using Enhancer and // returns a slice of k8s objects. -func kustomize(rendered map[string]string, meta Metadata, enhancer Enhancer) ([]runtime.Object, error) { +func kustomize(rendered map[string]string, meta renderer.Metadata, enhancer renderer.Enhancer) ([]runtime.Object, error) { enhanced, err := enhancer.Apply(rendered, meta) return enhanced, err } diff --git a/pkg/engine/task/task.go b/pkg/engine/task/task.go index 45bb87d3b..37d6612b4 100644 --- a/pkg/engine/task/task.go +++ b/pkg/engine/task/task.go @@ -4,27 +4,17 @@ import ( "errors" "fmt" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - "github.com/kudobuilder/kudo/pkg/engine" "sigs.k8s.io/controller-runtime/pkg/client" ) -// Metadata contains Metadata along with specific fields associated with current plan -// being executed like current plan, phase, step or task names. -type Metadata struct { - engine.Metadata - - PlanName string - PhaseName string - StepName string - TaskName string -} - // Context is a engine.task execution context containing k8s client, templates parameters etc. type Context struct { Client client.Client - Enhancer Enhancer - Meta Metadata + Enhancer renderer.Enhancer + Meta renderer.Metadata Templates map[string]string // Raw templates Parameters map[string]string // Instance and OperatorVersion parameters merged } diff --git a/pkg/engine/task/task_apply.go b/pkg/engine/task/task_apply.go index 7b59ec0ad..ba5f3ba3a 100644 --- a/pkg/engine/task/task_apply.go +++ b/pkg/engine/task/task_apply.go @@ -7,7 +7,7 @@ import ( "log" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - "github.com/kudobuilder/kudo/pkg/util/health" + "github.com/kudobuilder/kudo/pkg/engine/health" apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" diff --git a/pkg/engine/task/task_apply_test.go b/pkg/engine/task/task_apply_test.go index 983dba347..8c1222313 100644 --- a/pkg/engine/task/task_apply_test.go +++ b/pkg/engine/task/task_apply_test.go @@ -5,8 +5,9 @@ import ( "fmt" "testing" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/engine" - "github.com/kudobuilder/kudo/pkg/util/template" "github.com/stretchr/testify/assert" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" @@ -18,7 +19,7 @@ import ( ) func TestApplyTask_Run(t *testing.T) { - meta := Metadata{ + meta := renderer.Metadata{ Metadata: engine.Metadata{ InstanceName: "test", InstanceNamespace: "default", @@ -51,7 +52,7 @@ func TestApplyTask_Run(t *testing.T) { ctx: Context{ Client: fake.NewFakeClientWithScheme(scheme.Scheme), Enhancer: &testEnhancer{}, - Meta: Metadata{}, + Meta: renderer.Metadata{}, }, }, { @@ -168,10 +169,10 @@ func resourceAsString(resource metav1.Object) string { type testEnhancer struct{} -func (k *testEnhancer) Apply(templates map[string]string, metadata Metadata) ([]runtime.Object, error) { +func (k *testEnhancer) Apply(templates map[string]string, metadata renderer.Metadata) ([]runtime.Object, error) { result := make([]runtime.Object, 0) for _, t := range templates { - objsToAdd, err := template.ParseKubernetesObjects(t) + objsToAdd, err := renderer.YamlToObject(t) if err != nil { return nil, fmt.Errorf("error parsing kubernetes objects after applying kustomize: %w", err) } @@ -182,6 +183,6 @@ func (k *testEnhancer) Apply(templates map[string]string, metadata Metadata) ([] type errorEnhancer struct{} -func (k *errorEnhancer) Apply(templates map[string]string, metadata Metadata) ([]runtime.Object, error) { +func (k *errorEnhancer) Apply(templates map[string]string, metadata renderer.Metadata) ([]runtime.Object, error) { return nil, errors.New("always error") } diff --git a/pkg/engine/task/task_delete_test.go b/pkg/engine/task/task_delete_test.go index d7347c821..638f4ae9e 100644 --- a/pkg/engine/task/task_delete_test.go +++ b/pkg/engine/task/task_delete_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/engine" "github.com/stretchr/testify/assert" "k8s.io/client-go/kubernetes/scheme" @@ -12,7 +14,7 @@ import ( ) func TestDeleteTask_Run(t *testing.T) { - meta := Metadata{ + meta := renderer.Metadata{ Metadata: engine.Metadata{ InstanceName: "test", InstanceNamespace: "default", @@ -45,7 +47,7 @@ func TestDeleteTask_Run(t *testing.T) { ctx: Context{ Client: fake.NewFakeClientWithScheme(scheme.Scheme), Enhancer: &testEnhancer{}, - Meta: Metadata{}, + Meta: renderer.Metadata{}, }, }, { diff --git a/pkg/engine/workflow/engine.go b/pkg/engine/workflow/engine.go index a88ca7a7f..6dc6412e4 100644 --- a/pkg/engine/workflow/engine.go +++ b/pkg/engine/workflow/engine.go @@ -6,6 +6,8 @@ import ( "log" "time" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" "github.com/kudobuilder/kudo/pkg/engine" "github.com/kudobuilder/kudo/pkg/engine/task" @@ -58,7 +60,7 @@ func (ap *ActivePlan) taskByName(name string) (*v1alpha1.Task, bool) { // // Furthermore, a transient ERROR during a step execution, means that the next step may be executed if the step strategy // is "parallel". In case of a fatal error, it is returned alongside with the new plan status and published on the event bus. -func Execute(pl *ActivePlan, em *engine.Metadata, c client.Client, enh task.Enhancer, currentTime time.Time) (*v1alpha1.PlanStatus, error) { +func Execute(pl *ActivePlan, em *engine.Metadata, c client.Client, enh renderer.Enhancer, currentTime time.Time) (*v1alpha1.PlanStatus, error) { if pl.Status.IsTerminal() { log.Printf("PlanExecution: Plan %s for instance %s is terminal, nothing to do", pl.Name, em.InstanceName) return pl.PlanStatus, nil @@ -130,7 +132,7 @@ func Execute(pl *ActivePlan, em *engine.Metadata, c client.Client, enh task.Enha } } // - 3.a build execution metadata - - exm := task.Metadata{ + exm := renderer.Metadata{ Metadata: *em, PlanName: pl.Name, PhaseName: ph.Name, diff --git a/pkg/engine/workflow/engine_test.go b/pkg/engine/workflow/engine_test.go index 63239ad1f..737d137be 100644 --- a/pkg/engine/workflow/engine_test.go +++ b/pkg/engine/workflow/engine_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" + "github.com/kudobuilder/kudo/pkg/engine/renderer" + "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" "github.com/kudobuilder/kudo/pkg/engine" - "github.com/kudobuilder/kudo/pkg/engine/task" - "github.com/kudobuilder/kudo/pkg/util/template" "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -37,7 +37,7 @@ func TestExecutePlan(t *testing.T) { metadata *engine.Metadata expectedStatus *v1alpha1.PlanStatus wantErr bool - enhancer task.Enhancer + enhancer renderer.Enhancer }{ {name: "plan already finished will not change its status", activePlan: &ActivePlan{ Name: "test", @@ -636,10 +636,10 @@ func instance() *v1alpha1.Instance { type testEnhancer struct{} -func (k *testEnhancer) Apply(templates map[string]string, metadata task.Metadata) ([]runtime.Object, error) { +func (k *testEnhancer) Apply(templates map[string]string, metadata renderer.Metadata) ([]runtime.Object, error) { result := make([]runtime.Object, 0) for _, t := range templates { - objsToAdd, err := template.ParseKubernetesObjects(t) + objsToAdd, err := renderer.YamlToObject(t) if err != nil { return nil, errors.Wrapf(err, "error parsing kubernetes objects after applying kustomize") }