Skip to content
This repository was archived by the owner on Jan 30, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 5 additions & 2 deletions internal/discovery/discovery.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,18 @@ import (
"github.com/opdev/productctl/internal/resource"
)

var ErrDuplicateComponentName = errors.New("duplicate component name")
var (
ErrDuplicateComponentName = errors.New("duplicate component name")
ErrNoImagesDiscovered = errors.New("no images found in discovery manifest")
)

// ComponentsFromDiscoveryManifest converts discovered workloads into Component
// declarations. DiscoveredImages are treated as container components. The
// specifics of the container component declaration are assumed, and left to the
// user to change before use.
func ComponentsFromDiscoveryManifest(manifest discovery.Manifest) ([]*resource.Component, error) {
if len(manifest.DiscoveredImages) == 0 {
return nil, errors.New("could not find discovered images in discovery manifest")
return nil, ErrNoImagesDiscovered
}

processedNames := map[string]any{}
Expand Down
13 changes: 13 additions & 0 deletions internal/discovery/discovery_suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package discovery_test

import (
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

func TestDiscovery(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Discovery Suite")
}
42 changes: 42 additions & 0 deletions internal/discovery/discovery_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package discovery_test

import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"

libdiscovery "github.com/opdev/productctl/internal/discovery"

"github.com/opdev/discover-workload/discovery"
)

var _ = Describe("Discovery", func() {
When("converting workload discovery manifest to component resources", func() {
It("should return an error when discovery manifest contains no entries", func() {
_, err := libdiscovery.ComponentsFromDiscoveryManifest(discovery.Manifest{})
Expect(err).To(MatchError(libdiscovery.ErrNoImagesDiscovered))
})

It("should return an error for duplicate component names", func() {
manifestWithDuplicateNames := discovery.Manifest{
DiscoveredImages: []discovery.DiscoveredImage{
{ContainerName: "component1"},
{ContainerName: "component1"},
},
}
_, err := libdiscovery.ComponentsFromDiscoveryManifest(manifestWithDuplicateNames)
Expect(err).To(MatchError(libdiscovery.ErrDuplicateComponentName))
})

It("should return components for valid manifest", func() {
manifest := discovery.Manifest{
DiscoveredImages: []discovery.DiscoveredImage{
{ContainerName: "component1"},
{ContainerName: "component2"},
},
}
components, err := libdiscovery.ComponentsFromDiscoveryManifest(manifest)
Expect(err).NotTo(HaveOccurred())
Expect(components).To(HaveLen(len(manifest.DiscoveredImages)))
})
})
})