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