Skip to content

Commit

Permalink
Singular realizer (#857)
Browse files Browse the repository at this point in the history
Workload and Deliverable share common realizer


Co-authored-by: Sam Coward <[email protected]>
Co-authored-by: Rasheed Abdul-Aziz <[email protected]>
  • Loading branch information
squeedee and idoru authored May 18, 2022
1 parent b886062 commit 4f02212
Show file tree
Hide file tree
Showing 23 changed files with 426 additions and 2,061 deletions.
21 changes: 18 additions & 3 deletions pkg/controllers/deliverable_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ import (
cerrors "github.com/vmware-tanzu/cartographer/pkg/errors"
"github.com/vmware-tanzu/cartographer/pkg/logger"
"github.com/vmware-tanzu/cartographer/pkg/mapper"
"github.com/vmware-tanzu/cartographer/pkg/realizer"
realizerclient "github.com/vmware-tanzu/cartographer/pkg/realizer/client"
realizer "github.com/vmware-tanzu/cartographer/pkg/realizer/deliverable"
"github.com/vmware-tanzu/cartographer/pkg/realizer/statuses"
"github.com/vmware-tanzu/cartographer/pkg/repository"
"github.com/vmware-tanzu/cartographer/pkg/templates"
"github.com/vmware-tanzu/cartographer/pkg/tracker/dependency"
"github.com/vmware-tanzu/cartographer/pkg/tracker/stamped"
"github.com/vmware-tanzu/cartographer/pkg/utils"
Expand Down Expand Up @@ -115,14 +116,15 @@ func (r *DeliverableReconciler) Reconcile(ctx context.Context, req ctrl.Request)
return r.completeReconciliation(ctx, deliverable, nil, fmt.Errorf("failed to get secret for service account [%s]: %w", fmt.Sprintf("%s/%s", serviceAccountNS, serviceAccountName), err))
}

resourceRealizer, err := r.ResourceRealizerBuilder(secret, deliverable, r.Repo, delivery.Spec.Params)
resourceRealizer, err := r.ResourceRealizerBuilder(secret, deliverable, deliverable.Spec.Params, r.Repo, delivery.Spec.Params, buildDeliverableResourceLabeler(deliverable, delivery))

if err != nil {
r.conditionManager.AddPositive(conditions.ResourceRealizerBuilderErrorCondition(err))
return r.completeReconciliation(ctx, deliverable, nil, cerrors.NewUnhandledError(fmt.Errorf("failed to build resource realizer: %w", err)))
}

resourceStatuses := statuses.NewResourceStatuses(deliverable.Status.Resources, conditions.AddConditionForResourceSubmittedDeliverable)
err = r.Realizer.Realize(ctx, resourceRealizer, delivery, resourceStatuses)
err = r.Realizer.Realize(ctx, resourceRealizer, delivery.Name, realizer.MakeDeliveryOwnerResources(delivery), resourceStatuses)

if err != nil {
conditions.AddConditionForResourceSubmittedDeliverable(&r.conditionManager, true, err)
Expand Down Expand Up @@ -208,6 +210,19 @@ func (r *DeliverableReconciler) isDeliveryReady(delivery *v1alpha1.ClusterDelive
return readyCondition.Status == "True"
}

func buildDeliverableResourceLabeler(owner, blueprint client.Object) realizer.ResourceLabeler {
return func(resource realizer.OwnerResource) templates.Labels {
return templates.Labels{
"carto.run/deliverable-name": owner.GetName(),
"carto.run/deliverable-namespace": owner.GetNamespace(),
"carto.run/delivery-name": blueprint.GetName(),
"carto.run/resource-name": resource.Name,
"carto.run/template-kind": resource.TemplateRef.Kind,
"carto.run/cluster-template-name": resource.TemplateRef.Name,
}
}
}

func (r *DeliverableReconciler) trackDependencies(deliverable *v1alpha1.Deliverable, realizedResources []v1alpha1.ResourceStatus, serviceAccountName, serviceAccountNS string) {
r.DependencyTracker.ClearTracked(types.NamespacedName{
Namespace: deliverable.Namespace,
Expand Down
66 changes: 46 additions & 20 deletions pkg/controllers/deliverable_reconciler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/log/zap"

Expand All @@ -41,8 +42,8 @@ import (
"github.com/vmware-tanzu/cartographer/pkg/conditions/conditionsfakes"
"github.com/vmware-tanzu/cartographer/pkg/controllers"
cerrors "github.com/vmware-tanzu/cartographer/pkg/errors"
realizer "github.com/vmware-tanzu/cartographer/pkg/realizer/deliverable"
"github.com/vmware-tanzu/cartographer/pkg/realizer/deliverable/deliverablefakes"
"github.com/vmware-tanzu/cartographer/pkg/realizer"
"github.com/vmware-tanzu/cartographer/pkg/realizer/realizerfakes"
"github.com/vmware-tanzu/cartographer/pkg/realizer/statuses"
"github.com/vmware-tanzu/cartographer/pkg/repository"
"github.com/vmware-tanzu/cartographer/pkg/repository/repositoryfakes"
Expand All @@ -60,17 +61,18 @@ var _ = Describe("DeliverableReconciler", func() {
req ctrl.Request
repo *repositoryfakes.FakeRepository
conditionManager *conditionsfakes.FakeConditionManager
rlzr *deliverablefakes.FakeRealizer
rlzr *realizerfakes.FakeRealizer
dl *v1alpha1.Deliverable
deliverableLabels map[string]string
stampedTracker *stampedfakes.FakeStampedTracker
dependencyTracker *dependencyfakes.FakeDependencyTracker

builtResourceRealizer *deliverablefakes.FakeResourceRealizer
resourceRealizerSecret *corev1.Secret
serviceAccountSecret *corev1.Secret
serviceAccountName string
resourceRealizerBuilderError error
builtResourceRealizer *realizerfakes.FakeResourceRealizer
labelerForBuiltResourceRealizer realizer.ResourceLabeler
resourceRealizerSecret *corev1.Secret
serviceAccountSecret *corev1.Secret
serviceAccountName string
resourceRealizerBuilderError error
)

BeforeEach(func() {
Expand All @@ -84,7 +86,7 @@ var _ = Describe("DeliverableReconciler", func() {
return conditionManager
}

rlzr = &deliverablefakes.FakeRealizer{}
rlzr = &realizerfakes.FakeRealizer{}
rlzr.RealizeReturns(nil)

stampedTracker = &stampedfakes.FakeStampedTracker{}
Expand All @@ -104,12 +106,13 @@ var _ = Describe("DeliverableReconciler", func() {
repo.GetServiceAccountSecretReturns(serviceAccountSecret, nil)

resourceRealizerBuilderError = nil
resourceRealizerBuilder := func(secret *corev1.Secret, deliverable *v1alpha1.Deliverable, systemRepo repository.Repository, deliveryParams []v1alpha1.BlueprintParam) (realizer.ResourceRealizer, error) {

resourceRealizerBuilder := func(secret *corev1.Secret, owner client.Object, ownerParams []v1alpha1.OwnerParam, systemRepo repository.Repository, blueprintParams []v1alpha1.BlueprintParam, resourceLabeler realizer.ResourceLabeler) (realizer.ResourceRealizer, error) {
labelerForBuiltResourceRealizer = resourceLabeler
if resourceRealizerBuilderError != nil {
return nil, resourceRealizerBuilderError
}
resourceRealizerSecret = secret
builtResourceRealizer = &deliverablefakes.FakeResourceRealizer{}
return builtResourceRealizer, nil
}

Expand Down Expand Up @@ -268,7 +271,7 @@ var _ = Describe("DeliverableReconciler", func() {
},
}, nil)

rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand All @@ -277,7 +280,30 @@ var _ = Describe("DeliverableReconciler", func() {
}
})

It("updates the status of the deliverable with the realizedResources", func() {
It("labels owner resources", func() {
_, _ = reconciler.Reconcile(ctx, req)
Expect(labelerForBuiltResourceRealizer).To(Not(BeNil()))

resource := realizer.OwnerResource{
TemplateRef: v1alpha1.TemplateReference{
Kind: "be-kind",
Name: "no-names",
},
Name: "fine-i-have-a-name",
}

labels := labelerForBuiltResourceRealizer(resource)
Expect(labels).To(Equal(templates.Labels{
"carto.run/deliverable-name": "my-deliverable",
"carto.run/deliverable-namespace": "my-namespace",
"carto.run/delivery-name": "some-delivery",
"carto.run/resource-name": resource.Name,
"carto.run/template-kind": resource.TemplateRef.Kind,
"carto.run/cluster-template-name": resource.TemplateRef.Name,
}))
})

It("updates the status of the owner with the realizedResources", func() {
_, _ = reconciler.Reconcile(ctx, req)

Expect(repo.StatusUpdateCallCount()).To(Equal(1))
Expand Down Expand Up @@ -317,7 +343,7 @@ var _ = Describe("DeliverableReconciler", func() {
_, _ = reconciler.Reconcile(ctx, req)

Expect(rlzr.RealizeCallCount()).To(Equal(1))
_, resourceRealizer, _, _ := rlzr.RealizeArgsForCall(0)
_, resourceRealizer, _, _, _ := rlzr.RealizeArgsForCall(0)
Expect(resourceRealizer).To(Equal(builtResourceRealizer))
})

Expand Down Expand Up @@ -585,7 +611,7 @@ var _ = Describe("DeliverableReconciler", func() {
}, nil,
)

rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down Expand Up @@ -644,7 +670,7 @@ var _ = Describe("DeliverableReconciler", func() {
StampedObject: &unstructured.Unstructured{},
ResourceName: "some-name",
}
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down Expand Up @@ -699,7 +725,7 @@ var _ = Describe("DeliverableReconciler", func() {
BlueprintType: cerrors.Delivery,
}

rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down Expand Up @@ -759,7 +785,7 @@ var _ = Describe("DeliverableReconciler", func() {
StampedObject: stampedObject,
}

rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down Expand Up @@ -1076,7 +1102,7 @@ var _ = Describe("DeliverableReconciler", func() {
var realizerError error
BeforeEach(func() {
realizerError = errors.New("some error")
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down Expand Up @@ -1341,7 +1367,7 @@ var _ = Describe("DeliverableReconciler", func() {
},
}, nil,
)
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, delivery *v1alpha1.ClusterDelivery, statuses statuses.ResourceStatuses) error {
rlzr.RealizeStub = func(ctx context.Context, resourceRealizer realizer.ResourceRealizer, deliveryName string, resources []realizer.OwnerResource, statuses statuses.ResourceStatuses) error {
statusesVal := reflect.ValueOf(statuses)
existingVal := reflect.ValueOf(resourceStatuses)

Expand Down
21 changes: 18 additions & 3 deletions pkg/controllers/workload_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ import (
cerrors "github.com/vmware-tanzu/cartographer/pkg/errors"
"github.com/vmware-tanzu/cartographer/pkg/logger"
"github.com/vmware-tanzu/cartographer/pkg/mapper"
"github.com/vmware-tanzu/cartographer/pkg/realizer"
realizerclient "github.com/vmware-tanzu/cartographer/pkg/realizer/client"
"github.com/vmware-tanzu/cartographer/pkg/realizer/statuses"
realizer "github.com/vmware-tanzu/cartographer/pkg/realizer/workload"
"github.com/vmware-tanzu/cartographer/pkg/repository"
"github.com/vmware-tanzu/cartographer/pkg/templates"
"github.com/vmware-tanzu/cartographer/pkg/tracker/dependency"
"github.com/vmware-tanzu/cartographer/pkg/tracker/stamped"
"github.com/vmware-tanzu/cartographer/pkg/utils"
Expand Down Expand Up @@ -117,7 +118,8 @@ func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
return r.completeReconciliation(ctx, workload, nil, fmt.Errorf("failed to get service account secret [%s]: %w", fmt.Sprintf("%s/%s", serviceAccountNS, serviceAccountName), err))
}

resourceRealizer, err := r.ResourceRealizerBuilder(secret, workload, r.Repo, supplyChain.Spec.Params)
resourceRealizer, err := r.ResourceRealizerBuilder(secret, workload, workload.Spec.Params, r.Repo, supplyChain.Spec.Params, buildWorkloadResourceLabeler(workload, supplyChain))

if err != nil {
r.conditionManager.AddPositive(conditions.ResourceRealizerBuilderErrorCondition(err))
log.Error(err, "failed to build resource realizer")
Expand All @@ -126,7 +128,7 @@ func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
}

resourceStatuses := statuses.NewResourceStatuses(workload.Status.Resources, conditions.AddConditionForResourceSubmittedWorkload)
err = r.Realizer.Realize(ctx, resourceRealizer, supplyChain, resourceStatuses)
err = r.Realizer.Realize(ctx, resourceRealizer, supplyChain.Name, realizer.MakeSupplychainOwnerResources(supplyChain), resourceStatuses)

if err != nil {
conditions.AddConditionForResourceSubmittedWorkload(&r.conditionManager, true, err)
Expand Down Expand Up @@ -212,6 +214,19 @@ func (r *WorkloadReconciler) isSupplyChainReady(supplyChain *v1alpha1.ClusterSup
return supplyChainReadyCondition.Status == "True"
}

func buildWorkloadResourceLabeler(owner, blueprint client.Object) realizer.ResourceLabeler {
return func(resource realizer.OwnerResource) templates.Labels {
return templates.Labels{
"carto.run/workload-name": owner.GetName(),
"carto.run/workload-namespace": owner.GetNamespace(),
"carto.run/supply-chain-name": blueprint.GetName(),
"carto.run/resource-name": resource.Name,
"carto.run/template-kind": resource.TemplateRef.Kind,
"carto.run/cluster-template-name": resource.TemplateRef.Name,
}
}
}

func getSupplyChainReadyCondition(supplyChain *v1alpha1.ClusterSupplyChain) metav1.Condition {
for _, condition := range supplyChain.Status.Conditions {
if condition.Type == "Ready" {
Expand Down
Loading

0 comments on commit 4f02212

Please sign in to comment.