From 0f5d56d212c95418ffb03c5c8f9fdc442cbc6dc2 Mon Sep 17 00:00:00 2001 From: hasheddan Date: Mon, 24 May 2021 13:18:55 -0500 Subject: [PATCH] Create Lock if not exist in revision controller Updates revision controllers to create the lock if it does not exist when resolving dependencies. If a package revision is inactive it will not create the lock as its only purpose would be to remove itself from it. If a package opts out of dependency management it will not create the lock as it does not attempt to consider dependencies. Signed-off-by: hasheddan --- .../controller/pkg/revision/dependency.go | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/internal/controller/pkg/revision/dependency.go b/internal/controller/pkg/revision/dependency.go index 37406af0816..83252f0e1eb 100644 --- a/internal/controller/pkg/revision/dependency.go +++ b/internal/controller/pkg/revision/dependency.go @@ -22,6 +22,7 @@ import ( "github.com/Masterminds/semver" "github.com/google/go-containerregistry/pkg/name" "github.com/pkg/errors" + kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -37,7 +38,7 @@ const ( lockName = "lock" errNotMeta = "meta type is not a valid package" - errGetLock = "cannot get lock" + errGetOrCreateLock = "cannot get or create lock" errIncompatibleDependencyFmt = "incompatible dependencies: %+v" errMissingDependenciesFmt = "missing dependencies: %+v" errDependencyNotInGraph = "dependency is not present in graph" @@ -92,8 +93,18 @@ func (m *PackageDependencyManager) Resolve(ctx context.Context, pkg runtime.Obje // Get the lock. lock := &v1alpha1.Lock{} - if err := m.client.Get(ctx, types.NamespacedName{Name: lockName}, lock); err != nil { - return found, installed, invalid, errors.Wrap(err, errGetLock) + err = m.client.Get(ctx, types.NamespacedName{Name: lockName}, lock) + if kerrors.IsNotFound(err) { + // If lock does not exist and we are inactive then we can return early + // because our only operation would be to remove self. + if pr.GetDesiredState() == v1.PackageRevisionInactive { + return found, installed, invalid, nil + } + lock.Name = lockName + err = m.client.Create(ctx, lock, &client.CreateOptions{}) + } + if err != nil { + return found, installed, invalid, errors.Wrap(err, errGetOrCreateLock) } prRef, err := name.ParseReference(pr.GetSource(), name.WithDefaultRegistry("")) @@ -210,7 +221,12 @@ func (m *PackageDependencyManager) RemoveSelf(ctx context.Context, pr v1.Package // Get the lock. lock := &v1alpha1.Lock{} - if err := m.client.Get(ctx, types.NamespacedName{Name: lockName}, lock); err != nil { + err = m.client.Get(ctx, types.NamespacedName{Name: lockName}, lock) + if kerrors.IsNotFound(err) { + // If lock does not exist then we don't need to remove self. + return nil + } + if err != nil { return err }