From f0e21df7830e3f8d00498936d0d292ae6ff6765b Mon Sep 17 00:00:00 2001 From: Sida Chen Date: Tue, 30 May 2017 13:45:14 -0400 Subject: [PATCH] worker: fixed duplicated ns and ns not inherited bug --- worker.go | 19 +++++++++++-------- worker_test.go | 11 ++++++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/worker.go b/worker.go index 862f46d82c..06f36df043 100644 --- a/worker.go +++ b/worker.go @@ -145,26 +145,29 @@ func detectContent(imageFormat, name, path string, headers map[string]string, pa return } +// detectNamespaces returns a list of unique namespaces detected in a layer and its ancestry. func detectNamespaces(name string, files tarutil.FilesMap, parent *database.Layer) (namespaces []database.Namespace, err error) { - namespaces, err = featurens.Detect(files) + nsSet := map[string]*database.Namespace{} + nsCurrent, err := featurens.Detect(files) if err != nil { return } - if len(namespaces) > 0 { - for _, ns := range namespaces { - log.WithFields(log.Fields{logLayerName: name, "detected namespace": ns.Name}).Debug("detected namespace") - } - return + + for _, ns := range nsCurrent { + nsSet[ns.Name] = &ns + log.WithFields(log.Fields{logLayerName: name, "detected namespace": ns.Name}).Debug("detected namespace") } - // Fallback to the parent's namespace. if parent != nil { for _, ns := range parent.Namespaces { + nsSet[ns.Name] = &ns log.WithFields(log.Fields{logLayerName: name, "detected namespace": ns.Name}).Debug("detected namespace (from parent)") } - return } + for _, ns := range nsSet { + namespaces = append(namespaces, *ns) + } return } diff --git a/worker_test.go b/worker_test.go index 37c42f4cb4..c63a66743b 100644 --- a/worker_test.go +++ b/worker_test.go @@ -101,11 +101,16 @@ func TestProcessWithDistUpgrade(t *testing.T) { // Ensure that the 'wheezy' layer has the expected namespace and non-upgraded features. jessie, ok := datastore.layers["jessie"] if assert.True(t, ok, "layer 'jessie' not processed") { - if !assert.Len(t, jessie.Namespaces, 1) { + if !assert.Len(t, jessie.Namespaces, 2) { return } - assert.Equal(t, "debian:8", jessie.Namespaces[0].Name) - assert.Len(t, jessie.Features, 74) + nsNames := []string{jessie.Namespaces[0].Name, jessie.Namespaces[1].Name} + // the old features and namespace should remain here with only the features in new namespaces detected + assert.Contains(t, nsNames, "debian:8") + assert.Contains(t, nsNames, "debian:7") + + // because the featurefmt detects the features under "debian:8" and "debian:7", therefore the number of features is duplicated + assert.Len(t, jessie.Features, 148) for _, nufv := range nonUpgradedFeatureVersions { nufv.Feature.Namespace.Name = "debian:7"