Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1778280
Add trace controller secret permission
kabicin Feb 14, 2025
3de174e
Add trace sharing
kabicin Feb 19, 2025
028e6e7
add resource_sharing functions to utils
kabicin Feb 19, 2025
cce3518
Call leader tracker directly from controllers
kabicin Feb 20, 2025
1cf7228
Add ResourceSharingFactory
kabicin Feb 26, 2025
5aa3d06
Simplify trace tests with helpers
kabicin Feb 28, 2025
132a2a9
Test upgrade/downgrade scenario for trace sharing
kabicin Feb 28, 2025
810a0fd
Update openlibertytrace_resource_sharing.go
kabicin Mar 3, 2025
3e495c6
Update leader_tracker.go
kabicin Mar 3, 2025
7f1994c
Update leader_tracker.go
kabicin Mar 3, 2025
fde7355
Update openlibertytrace_resource_sharing.go
kabicin Mar 3, 2025
409b203
Update openlibertytrace_resource_sharing.go
kabicin Mar 3, 2025
cdfc4e6
Update trace unit tests
kabicin Mar 5, 2025
e7f754d
Update openlibertytrace_controller.go
kabicin Mar 5, 2025
9d20071
Update openlibertytrace_controller.go
kabicin Mar 6, 2025
546e225
Remove debug
kabicin Mar 6, 2025
a147cce
Add CleanupUnusedResources to resource sharing
kabicin Mar 11, 2025
c57a736
tidy resource sharing callbacks
kabicin Mar 11, 2025
3bfc53c
Rebase changes from main
kabicin Mar 13, 2025
9615148
Update go.mod
kabicin Mar 17, 2025
90a1fce
Fix cache return
kabicin Mar 18, 2025
556ff63
Increase readability in resource sharing interface
kabicin Mar 18, 2025
2ada5af
Move leader tracker into subpackage
kabicin Mar 20, 2025
85fb3a0
Add LibertyURI to resource sharing interface
kabicin Mar 25, 2025
9968c73
Revert go.mod
kabicin May 5, 2025
28d9901
Add corner case for Traces swapping Pod refs
kabicin May 12, 2025
7d047ae
Update openlibertytrace_controller.go
kabicin May 14, 2025
bd3d822
Update openlibertytrace_controller.go
kabicin May 15, 2025
1d4b4f7
Merge branch 'main' into trace-sharing
kabicin May 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions bundle/manifests/open-liberty.clusterserviceversion.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1352,6 +1352,18 @@ spec:
- patch
- update
- watch
- apiGroups:
- ""
resources:
- secrets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- image.openshift.io
resources:
Expand Down
12 changes: 12 additions & 0 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,18 @@ rules:
- patch
- update
- watch
- apiGroups:
- ""
resources:
- secrets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- image.openshift.io
resources:
Expand Down
7 changes: 7 additions & 0 deletions internal/controller/assets/trace-decision-tree.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# This file enables resource sharing for day-2 operation Trace CR instances that share the same name
#
# '*' wildcard will map to a list of strings generated from the leader tracker at runtime
tree:
v1_4_2:
name: "*"
replace: {}
4 changes: 4 additions & 0 deletions internal/controller/assets/trace-signature.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: apps.openliberty.io/v1
kind: OpenLibertyTrace
name: "{0}"
rootName: "" # empty root name is used because pod names are determined by the cluster
119 changes: 56 additions & 63 deletions internal/controller/ltpa_keys_sharing.go

Large diffs are not rendered by default.

155 changes: 81 additions & 74 deletions internal/controller/ltpa_keys_sharing_test.go

Large diffs are not rendered by default.

77 changes: 43 additions & 34 deletions internal/controller/openlibertyapplication_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"github.com/go-logr/logr"

lutils "github.com/OpenLiberty/open-liberty-operator/utils"
"github.com/OpenLiberty/open-liberty-operator/utils/leader"
tree "github.com/OpenLiberty/open-liberty-operator/utils/tree"
oputils "github.com/application-stacks/runtime-component-operator/utils"

openlibertyv1 "github.com/OpenLiberty/open-liberty-operator/api/v1"
Expand Down Expand Up @@ -157,14 +159,16 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
}

baseRSF := r.createResourceSharingFactoryBase()

// Check if the OpenLibertyApplication instance is marked to be deleted, which is
// indicated by the deletion timestamp being set.
isInstanceMarkedToBeDeleted := instance.GetDeletionTimestamp() != nil
if isInstanceMarkedToBeDeleted {
if lutils.Contains(instance.GetFinalizers(), applicationFinalizer) {
// Run finalization logic for applicationFinalizer. If the finalization logic fails, don't remove the
// finalizer so that we can retry during the next reconciliation.
if err := r.finalizeOpenLibertyApplication(reqLogger, instance, instance.Name+"-serviceability", instance.Namespace); err != nil {
if err := r.finalizeOpenLibertyApplication(reqLogger, instance, baseRSF, instance.Name+"-serviceability", instance.Namespace); err != nil {
return reconcile.Result{}, err
}

Expand Down Expand Up @@ -251,30 +255,35 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
}

// Reconciles the shared LTPA state for the instance namespace
var ltpaMetadataList *lutils.LTPAMetadataList
var ltpaKeysMetadata, ltpaConfigMetadata *lutils.LTPAMetadata
var ltpaMetadataList *leader.LTPAMetadataList
var ltpaKeysMetadata, ltpaConfigMetadata *leader.LTPAMetadata
var ltpaRSF tree.ResourceSharingFactory
if r.isLTPAKeySharingEnabled(instance) {
leaderMetadataList, err := r.reconcileResourceTrackingState(instance, LTPA_RESOURCE_SHARING_FILE_NAME)
rsf, leaderMetadataList, err := r.reconcileResourceTrackingState(instance, LTPA_RESOURCE_SHARING_FILE_NAME)
if err != nil {
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
}
ltpaMetadataList = leaderMetadataList.(*lutils.LTPAMetadataList)
ltpaRSF = rsf
ltpaMetadataList = leaderMetadataList.(*leader.LTPAMetadataList)
if ltpaMetadataList != nil && len(ltpaMetadataList.Items) == 2 {
ltpaKeysMetadata = ltpaMetadataList.Items[0].(*lutils.LTPAMetadata)
ltpaConfigMetadata = ltpaMetadataList.Items[1].(*lutils.LTPAMetadata)
ltpaKeysMetadata = ltpaMetadataList.Items[0].(*leader.LTPAMetadata)
ltpaConfigMetadata = ltpaMetadataList.Items[1].(*leader.LTPAMetadata)
}
}

// Reconciles the shared password encryption key state for the instance namespace only if the shared key already exists
var passwordEncryptionMetadataList *lutils.PasswordEncryptionMetadataList
passwordEncryptionMetadata := &lutils.PasswordEncryptionMetadata{}
var passwordEncryptionMetadataList *leader.PasswordEncryptionMetadataList
passwordEncryptionMetadata := &leader.PasswordEncryptionMetadata{}
var passwordEncryptionRSF tree.ResourceSharingFactory
if r.isUsingPasswordEncryptionKeySharing(instance, passwordEncryptionMetadata) {
leaderMetadataList, err := r.reconcileResourceTrackingState(instance, PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)
rsf, leaderMetadataList, err := r.reconcileResourceTrackingState(instance, PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)
if err != nil {
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
}
passwordEncryptionMetadataList = leaderMetadataList.(*lutils.PasswordEncryptionMetadataList)
passwordEncryptionRSF = rsf
passwordEncryptionMetadataList = leaderMetadataList.(*leader.PasswordEncryptionMetadataList)
if passwordEncryptionMetadataList != nil && len(passwordEncryptionMetadataList.Items) == 1 {
passwordEncryptionMetadata = passwordEncryptionMetadataList.Items[0].(*lutils.PasswordEncryptionMetadata)
passwordEncryptionMetadata = passwordEncryptionMetadataList.Items[0].(*leader.PasswordEncryptionMetadata)
}
} else if r.isPasswordEncryptionKeySharingEnabled(instance) {
// error if the password encryption key sharing is enabled but the Secret is not found
Expand Down Expand Up @@ -479,14 +488,14 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
}

// Manage the shared password encryption key Secret if it exists
message, encryptionSecretName, passwordEncryptionKeyLastRotation, err := r.reconcilePasswordEncryptionKey(instance, passwordEncryptionMetadata)
message, encryptionSecretName, passwordEncryptionKeyLastRotation, err := r.reconcilePasswordEncryptionKey(passwordEncryptionRSF, baseRSF, instance, passwordEncryptionMetadata)
if err != nil {
reqLogger.Error(err, message)
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
}

// Create and manage the shared LTPA keys Secret if the feature is enabled
message, ltpaSecretName, ltpaKeysLastRotation, err := r.reconcileLTPAKeys(instance, ltpaKeysMetadata)
message, ltpaSecretName, ltpaKeysLastRotation, err := r.reconcileLTPAKeys(ltpaRSF, baseRSF, instance, ltpaKeysMetadata)
if err != nil {
reqLogger.Error(err, message)
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
Expand All @@ -500,7 +509,7 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
}

// Using the LTPA keys and config metadata, create and manage the shared LTPA Liberty server XML if the feature is enabled
message, ltpaXMLSecretName, err := r.reconcileLTPAConfig(instance, ltpaKeysMetadata, ltpaConfigMetadata, passwordEncryptionMetadata, ltpaKeysLastRotation, lastKeyRelatedRotation)
message, ltpaXMLSecretName, err := r.reconcileLTPAConfig(ltpaRSF, baseRSF, instance, ltpaKeysMetadata, ltpaConfigMetadata, passwordEncryptionMetadata, ltpaKeysLastRotation, lastKeyRelatedRotation)
if err != nil {
reqLogger.Error(err, message)
return r.ManageError(err, common.StatusConditionTypeReconciled, instance)
Expand Down Expand Up @@ -572,12 +581,12 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
return err
}
lutils.AddPodTemplateSpecAnnotation(&statefulSet.Spec.Template, lastRotationAnnotation)
if instance.Status.GetReferences()[lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)] != encryptionSecretName {
instance.Status.SetReference(lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME), encryptionSecretName)
if instance.Status.GetReferences()[leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)] != encryptionSecretName {
instance.Status.SetReference(leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME), encryptionSecretName)
}
} else {
lutils.RemovePodTemplateSpecAnnotationByKey(&statefulSet.Spec.Template, lutils.GetLastRotationLabelKey(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
lutils.RemovePodTemplateSpecAnnotationByKey(&statefulSet.Spec.Template, leader.GetLastRotationLabelKey(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME, lutils.LibertyURI))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
}

if r.isLTPAKeySharingEnabled(instance) && len(ltpaSecretName) > 0 {
Expand All @@ -594,12 +603,12 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
return err
}
lutils.AddPodTemplateSpecAnnotation(&statefulSet.Spec.Template, configLastRotationAnnotation)
if instance.Status.GetReferences()[lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME)] != ltpaSecretName {
instance.Status.SetReference(lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME), ltpaSecretName)
if instance.Status.GetReferences()[leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME)] != ltpaSecretName {
instance.Status.SetReference(leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME), ltpaSecretName)
}
} else {
lutils.RemovePodTemplateSpecAnnotationByKey(&statefulSet.Spec.Template, lutils.GetLastRotationLabelKey(LTPA_RESOURCE_SHARING_FILE_NAME))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME))
lutils.RemovePodTemplateSpecAnnotationByKey(&statefulSet.Spec.Template, leader.GetLastRotationLabelKey(LTPA_RESOURCE_SHARING_FILE_NAME, lutils.LibertyURI))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME))
}
return nil
})
Expand Down Expand Up @@ -668,12 +677,12 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
return err
}
lutils.AddPodTemplateSpecAnnotation(&deploy.Spec.Template, lastRotationAnnotation)
if instance.Status.GetReferences()[lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)] != encryptionSecretName {
instance.Status.SetReference(lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME), encryptionSecretName)
if instance.Status.GetReferences()[leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)] != encryptionSecretName {
instance.Status.SetReference(leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME), encryptionSecretName)
}
} else {
lutils.RemovePodTemplateSpecAnnotationByKey(&deploy.Spec.Template, lutils.GetLastRotationLabelKey(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), lutils.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
lutils.RemovePodTemplateSpecAnnotationByKey(&deploy.Spec.Template, leader.GetLastRotationLabelKey(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME, lutils.LibertyURI))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), leader.GetTrackedResourceName(PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME))
}

if r.isLTPAKeySharingEnabled(instance) && len(ltpaSecretName) > 0 {
Expand All @@ -690,12 +699,12 @@ func (r *ReconcileOpenLiberty) Reconcile(ctx context.Context, request ctrl.Reque
return err
}
lutils.AddPodTemplateSpecAnnotation(&deploy.Spec.Template, configLastRotationAnnotation)
if instance.Status.GetReferences()[lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME)] != ltpaSecretName {
instance.Status.SetReference(lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME), ltpaSecretName)
if instance.Status.GetReferences()[leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME)] != ltpaSecretName {
instance.Status.SetReference(leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME), ltpaSecretName)
}
} else {
lutils.RemovePodTemplateSpecAnnotationByKey(&deploy.Spec.Template, lutils.GetLastRotationLabelKey(LTPA_RESOURCE_SHARING_FILE_NAME))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), lutils.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME))
lutils.RemovePodTemplateSpecAnnotationByKey(&deploy.Spec.Template, leader.GetLastRotationLabelKey(LTPA_RESOURCE_SHARING_FILE_NAME, lutils.LibertyURI))
lutils.RemoveMapElementByKey(instance.Status.GetReferences(), leader.GetTrackedResourceName(LTPA_RESOURCE_SHARING_FILE_NAME))
}
return nil
})
Expand Down Expand Up @@ -969,9 +978,9 @@ func getMonitoringEnabledLabelName(ba common.BaseComponent) string {
return "monitor." + ba.GetGroupName() + "/enabled"
}

func (r *ReconcileOpenLiberty) finalizeOpenLibertyApplication(reqLogger logr.Logger, olapp *openlibertyv1.OpenLibertyApplication, pvcName string, pvcNamespace string) error {
r.RemoveLeaderTrackerReference(olapp, LTPA_RESOURCE_SHARING_FILE_NAME)
r.RemoveLeaderTrackerReference(olapp, PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)
func (r *ReconcileOpenLiberty) finalizeOpenLibertyApplication(reqLogger logr.Logger, olapp *openlibertyv1.OpenLibertyApplication, baseRSF tree.ResourceSharingFactoryBase, pvcName string, pvcNamespace string) error {
tree.RemoveLeaderTrackerReference(baseRSF, olapp.GetName(), olapp.GetNamespace(), OperatorName, OperatorShortName, LTPA_RESOURCE_SHARING_FILE_NAME)
tree.RemoveLeaderTrackerReference(baseRSF, olapp.GetName(), olapp.GetNamespace(), OperatorName, OperatorShortName, PASSWORD_ENCRYPTION_RESOURCE_SHARING_FILE_NAME)
r.deletePVC(reqLogger, pvcName, pvcNamespace)
return nil
}
Expand Down
Loading