Skip to content

Commit 665d984

Browse files
committed
Added cleanup of obsolete access packages
1 parent 9999e55 commit 665d984

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

docs/Manual/Deployment/Kubernetes/DeploymentResource.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ operator containing "access packages". An access package contains those `Secrets
248248
to access the SyncMasters of this `ArangoDeployment`.
249249

250250
By removing a name from this setting, the corresponding `Secret` is also deleted.
251+
Note that to remove all access packages, leave an empty array in place (`[]`).
252+
Completely removing the setting results in not modifying the list.
251253

252254
See [the `ArangoDeploymentReplication` specification](./DeploymentReplicationResource.md) for more information
253255
on access packages.

pkg/deployment/access_package.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,60 @@ import (
3636
)
3737

3838
const (
39-
clientAuthValidFor = time.Hour * 24 * 365 // 1yr
40-
clientAuthCurve = "P256"
39+
clientAuthValidFor = time.Hour * 24 * 365 // 1yr
40+
clientAuthCurve = "P256"
41+
labelKeyOriginalDeployment = "original-deployment-name"
4142
)
4243

4344
// createAccessPackages creates a arangosync access packages specified
4445
// in spec.sync.externalAccess.accessPackageSecretNames.
4546
func (d *Deployment) createAccessPackages() error {
47+
log := d.deps.Log
4648
spec := d.apiObject.Spec
49+
secrets := d.deps.KubeCli.CoreV1().Secrets(d.GetNamespace())
4750

4851
if !spec.Sync.IsEnabled() {
4952
// We're only relevant when sync is enabled
5053
return nil
5154
}
5255

56+
// Create all access packages that we're asked to build
57+
apNameMap := make(map[string]struct{})
5358
for _, apSecretName := range spec.Sync.ExternalAccess.AccessPackageSecretNames {
59+
apNameMap[apSecretName] = struct{}{}
5460
if err := d.ensureAccessPackage(apSecretName); err != nil {
5561
return maskAny(err)
5662
}
5763
}
5864

65+
// Remove all access packages that we did build, but are no longer needed
66+
secretList, err := secrets.List(metav1.ListOptions{})
67+
if err != nil {
68+
log.Debug().Err(err).Msg("Failed to list secrets")
69+
return maskAny(err)
70+
}
71+
for _, secret := range secretList.Items {
72+
if d.isOwnerOf(&secret) {
73+
if _, found := secret.Data[constants.SecretAccessPackageYaml]; found {
74+
// Secret is an access package
75+
if _, wanted := apNameMap[secret.GetName()]; !wanted {
76+
// We found an obsolete access package secret. Remove it.
77+
if err := secrets.Delete(secret.GetName(), &metav1.DeleteOptions{
78+
Preconditions: &metav1.Preconditions{UID: &secret.UID},
79+
}); err != nil && !k8sutil.IsNotFound(err) {
80+
// Not serious enough to stop everything now, just log and create an event
81+
log.Warn().Err(err).Msg("Failed to remove obsolete access package secret")
82+
d.CreateEvent(k8sutil.NewErrorEvent("Access Package cleanup failed", err, d.apiObject))
83+
} else {
84+
// Access package removed, notify user
85+
log.Info().Str("secret-name", secret.GetName()).Msg("Removed access package Secret")
86+
d.CreateEvent(k8sutil.NewAccessPackageDeletedEvent(d.apiObject, secret.GetName()))
87+
}
88+
}
89+
}
90+
}
91+
}
92+
5993
return nil
6094
}
6195

@@ -117,7 +151,7 @@ func (d *Deployment) ensureAccessPackage(apSecretName string) error {
117151
ObjectMeta: metav1.ObjectMeta{
118152
Name: apSecretName + "-auth",
119153
Labels: map[string]string{
120-
"remote-deployment": d.apiObject.GetName(),
154+
labelKeyOriginalDeployment: d.apiObject.GetName(),
121155
},
122156
},
123157
Data: map[string][]byte{
@@ -133,7 +167,7 @@ func (d *Deployment) ensureAccessPackage(apSecretName string) error {
133167
ObjectMeta: metav1.ObjectMeta{
134168
Name: apSecretName + "-ca",
135169
Labels: map[string]string{
136-
"remote-deployment": d.apiObject.GetName(),
170+
labelKeyOriginalDeployment: d.apiObject.GetName(),
137171
},
138172
},
139173
Data: map[string][]byte{

pkg/util/k8sutil/events.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ func NewAccessPackageCreatedEvent(apiObject APIObject, apSecretName string) *v1.
135135
return event
136136
}
137137

138+
// NewAccessPackageDeletedEvent creates an event indicating that a secret containing an access package
139+
// has been deleted.
140+
func NewAccessPackageDeletedEvent(apiObject APIObject, apSecretName string) *v1.Event {
141+
event := newDeploymentEvent(apiObject)
142+
event.Type = v1.EventTypeNormal
143+
event.Reason = "Access package deleted"
144+
event.Message = fmt.Sprintf("An access package named %s has been deleted", apSecretName)
145+
return event
146+
}
147+
138148
// NewErrorEvent creates an even of type error.
139149
func NewErrorEvent(reason string, err error, apiObject APIObject) *v1.Event {
140150
event := newDeploymentEvent(apiObject)

0 commit comments

Comments
 (0)