From f7c8fae589ca4c3ac80251091bfce014c1798056 Mon Sep 17 00:00:00 2001 From: bowenislandsong Date: Fri, 24 Apr 2020 13:52:10 -0400 Subject: [PATCH] Update PkgManifest upon catsrc update The catsrc update sync triggered by the informer does not update pkgmanifest. This commit adds an update mechanism. --- pkg/package-server/provider/registry.go | 14 ++++-- test/e2e/packagemanifest_e2e_test.go | 58 +++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/pkg/package-server/provider/registry.go b/pkg/package-server/provider/registry.go index ff0b1075a6..94f4c67a6f 100644 --- a/pkg/package-server/provider/registry.go +++ b/pkg/package-server/provider/registry.go @@ -9,7 +9,6 @@ import ( "sync" "time" - "github.com/operator-framework/operator-registry/pkg/api" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" @@ -29,6 +28,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer" "github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators" pkglisters "github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/client/listers/operators/internalversion" + "github.com/operator-framework/operator-registry/pkg/api" ) const ( @@ -189,9 +189,17 @@ func (p *RegistryProvider) syncCatalogSource(obj interface{}) (syncError error) Namespace: source.GetNamespace(), Name: source.GetName(), } + if sourceMeta := p.sources.GetMeta(key); sourceMeta != nil && sourceMeta.Address == address { - // If the address hasn't changed, don't bother creating a new source - logger.Debug("catalog address unchanged, skipping source creation") + logger.Infof("updating PackageManifest based on CatalogSource changes: %v", key) + timeout, cancel := context.WithTimeout(context.Background(), cacheTimeout) + defer cancel() + var client *registryClient + client, syncError = p.registryClient(key) + if syncError != nil { + return + } + syncError = p.refreshCache(timeout, client) return } diff --git a/test/e2e/packagemanifest_e2e_test.go b/test/e2e/packagemanifest_e2e_test.go index ffbfb51927..c5f42397ce 100644 --- a/test/e2e/packagemanifest_e2e_test.go +++ b/test/e2e/packagemanifest_e2e_test.go @@ -118,3 +118,61 @@ func TestPackageManifestLoading(t *testing.T) { require.NotNil(t, pmList.ListMeta, "package manifest list metadata empty") require.NotNil(t, pmList.Items) } + +func TestPkgManifestsFromCatsrc(t *testing.T) { + defer cleaner.NotifyTestComplete(t, true) + + sourceName := genName("catalog-") + packageName := "etcd-test" + displayName := "etcd test catalog" + image := "quay.io/olmtest/catsrc-update-test:related" + crc := newCRClient(t) + pmc := newPMClient(t) + + catalogSource := &v1alpha1.CatalogSource{ + TypeMeta: metav1.TypeMeta{ + Kind: v1alpha1.CatalogSourceKind, + APIVersion: v1alpha1.CatalogSourceCRDAPIVersion, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: sourceName, + Namespace: testNamespace, + Labels: map[string]string{"olm.catalogSource": sourceName}, + }, + Spec: v1alpha1.CatalogSourceSpec{ + SourceType: v1alpha1.SourceTypeGrpc, + Image: image, + DisplayName: displayName, + }, + } + + catalogSource, err := crc.OperatorsV1alpha1().CatalogSources(catalogSource.GetNamespace()).Create(catalogSource) + require.NoError(t, err, "error creating Catalog Sources") + require.NotNil(t, catalogSource) + + pm, err := fetchPackageManifest(t, pmc, testNamespace, packageName, packageManifestHasStatus) + require.NoError(t, err, "error getting package manifest") + require.NotNil(t, pm) + require.Equal(t, packageName, pm.GetName()) + require.Equal(t, displayName, pm.Status.CatalogSourceDisplayName) + + catalogSource, err = crc.OperatorsV1alpha1().CatalogSources(testNamespace).Get(catalogSource.GetName(), metav1.GetOptions{}) + require.NoError(t, err, "error getting catalogSource") + + displayName = "updated Name" + catalogSource.Spec.DisplayName = displayName + catalogSource, err = crc.OperatorsV1alpha1().CatalogSources(testNamespace).Update(catalogSource) + require.NoError(t, err, "error updating catalogSource") + require.Equal(t, displayName, catalogSource.Spec.DisplayName) + + // waiting for the update to complete + err = wait.Poll(pollInterval, 1*time.Minute, func() (bool, error) { + t.Logf("Polling package-server...") + pm, err := fetchPackageManifest(t, pmc, testNamespace, packageName, packageManifestHasStatus) + if err != nil { + return false, err + } + return pm.Status.CatalogSourceDisplayName == displayName, nil + }) + require.NoError(t, err, "error package manifest Status.CatalogSourceDisplayName is not updated to catsrc Spec.DisplayName") +}