scalibr linux new metadata support (#1038)
* Add SCALIBR extractors support and unit tests
* quickfix
diff --git a/packages/packages_linux.go b/packages/packages_linux.go
index 2841565..bf8d7a1 100644
--- a/packages/packages_linux.go
+++ b/packages/packages_linux.go
@@ -18,6 +18,7 @@
"context"
"errors"
"fmt"
+ "slices"
"strings"
"github.com/GoogleCloudPlatform/osconfig/agentconfig"
@@ -26,6 +27,12 @@
"github.com/package-url/packageurl-go"
)
+var (
+ scalibrLinuxEnabled = agentconfig.ScalibrLinuxEnabled
+ extendedInventoryEnabled = agentconfig.ExtendedInventoryEnabled
+ extendedInventoryExtractorsAllowed = agentconfig.ExtendedInventoryExtractorsAllowed
+)
+
// GetPackageUpdates gets all available package updates from any known
// installed package manager.
func (p defaultUpdatesProvider) getPackageUpdates(ctx context.Context) (Packages, error) {
@@ -265,13 +272,21 @@
// NewInstalledPackagesProvider makes provider that uses osv-scalibr as its implementation if enabled by config, otherwise falls back to default legacy implementation.
func NewInstalledPackagesProvider(osinfoProvider osinfo.Provider) InstalledPackagesProvider {
- if agentconfig.ScalibrLinuxEnabled() {
- return scalibrInstalledPackagesProvider{
- extractors: []string{
- "os/cos",
- "os/dpkg",
- "os/rpm",
- },
+ if scalibrLinuxEnabled() {
+ extractors := []string{
+ "os/cos",
+ "os/dpkg",
+ "os/rpm",
+ }
+ if extendedInventoryEnabled() {
+ for _, ext := range extendedInventoryExtractorsAllowed() {
+ if !slices.Contains(extractors, ext) {
+ extractors = append(extractors, ext)
+ }
+ }
+ }
+ return &scalibrInstalledPackagesProvider{
+ extractors: extractors,
osinfoProvider: osinfoProvider,
}
}
diff --git a/packages/packages_linux_test.go b/packages/packages_linux_test.go
index 2e09e13..b2f8673 100644
--- a/packages/packages_linux_test.go
+++ b/packages/packages_linux_test.go
@@ -240,6 +240,60 @@
t.Errorf("unexpected error, got: %v, want: <nil>", err)
}
}
+
+// overrideScalibrConfig overrides scalibr configuration flags for the duration of a test.
+func overrideScalibrConfig(t *testing.T, scalibrLinux bool, extendedEnabled bool, allowedExtractors []string) {
+ t.Helper()
+ utiltest.OverrideVariable(t, &scalibrLinuxEnabled, func() bool { return scalibrLinux })
+ utiltest.OverrideVariable(t, &extendedInventoryEnabled, func() bool { return extendedEnabled })
+ utiltest.OverrideVariable(t, &extendedInventoryExtractorsAllowed, func() []string { return allowedExtractors })
+}
+
+// TestNewInstalledPackagesProvider tests the creation of InstalledPackagesProvider based on Scalibr configuration flags.
+func TestNewInstalledPackagesProvider(t *testing.T) {
+ oiProvider := &stubOsInfoProvider{}
+
+ tests := []struct {
+ name string
+ scalibrLinuxEnabled bool
+ extendedInventoryEnabled bool
+ extendedExtractorsAllowed []string
+ wantExtractors []string
+ }{
+ {
+ name: "scalibr disabled, want no extractors",
+ scalibrLinuxEnabled: false,
+ wantExtractors: nil,
+ },
+ {
+ name: "scalibr enabled, extended disabled, want base extractors",
+ scalibrLinuxEnabled: true,
+ extendedInventoryEnabled: false,
+ wantExtractors: []string{"os/cos", "os/dpkg", "os/rpm"},
+ },
+ {
+ name: "scalibr enabled, extended enabled, want extended extractors without duplicates",
+ scalibrLinuxEnabled: true,
+ extendedInventoryEnabled: true,
+ extendedExtractorsAllowed: []string{"python/wheelegg", "os/dpkg", "os/apk"},
+ wantExtractors: []string{"os/cos", "os/dpkg", "os/rpm", "python/wheelegg", "os/apk"},
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ overrideScalibrConfig(t, tt.scalibrLinuxEnabled, tt.extendedInventoryEnabled, tt.extendedExtractorsAllowed)
+ provider := NewInstalledPackagesProvider(oiProvider)
+ scalibrProvider, ok := provider.(*scalibrInstalledPackagesProvider)
+ if !ok {
+ t.Skip("Scalibr is disabled, defaultInstalledPackagesProvider returned")
+ }
+
+ utiltest.AssertEquals(t, scalibrProvider.extractors, tt.wantExtractors)
+ })
+ }
+}
+
func Test_getInstalledPackages(t *testing.T) {
enableAllInstalledPackages()
COSPkgInfoExists = false //explicitly skip for now