Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package google-osconfig-agent for
openSUSE:Factory checked in at 2026-10-16 20:10:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/google-osconfig-agent (Old)
and /work/SRC/openSUSE:Factory/.google-osconfig-agent.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-osconfig-agent"
Fri Oct 16 20:10:14 2026 rev:65 rq:1385178 version:20261015.00
Changes:
--------
---
/work/SRC/openSUSE:Factory/google-osconfig-agent/google-osconfig-agent.changes
2026-10-02 23:07:00.568505664 +0200
+++
/work/SRC/openSUSE:Factory/.google-osconfig-agent.new.3698736/google-osconfig-agent.changes
2026-10-16 20:13:55.317841945 +0200
@@ -1,0 +2,10 @@
+Fri Oct 16 07:16:50 UTC 2026 - John Paul Adrian Glaubitz
<[email protected]>
+
+- Update to version 20261015.00
+ * Add scalibr os benchmarks (#1044)
+- Update github.com/containerd/containerd to v1.7.35 (bsc#1285135,
CVE-2026-95838)
+- Update github.com/moby/sys/user to v0.4.1 (bsc#1284870, CVE-2026-61801)
+- Update golang.org/x/crypto to v0.58.0
+- Update golang.org/x/net to v0.61.0 (bsc#1285283, CVE-2026-78669)
+
+-------------------------------------------------------------------
Old:
----
osconfig-20260928.01.tar.gz
New:
----
osconfig-20261015.00.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ google-osconfig-agent.spec ++++++
--- /var/tmp/diff_new_pack.BBhLco/_old 2026-10-16 20:14:00.233048354 +0200
+++ /var/tmp/diff_new_pack.BBhLco/_new 2026-10-16 20:14:00.236048480 +0200
@@ -19,7 +19,7 @@
%define shortname osconfig
Name: google-osconfig-agent
-Version: 20260928.01
+Version: 20261015.00
Release: 0
Summary: Google Cloud Guest Agent
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.BBhLco/_old 2026-10-16 20:14:00.273050033 +0200
+++ /var/tmp/diff_new_pack.BBhLco/_new 2026-10-16 20:14:00.276050160 +0200
@@ -3,8 +3,8 @@
<param name="url">https://github.com/GoogleCloudPlatform/osconfig</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="versionformat">20260928.01</param>
- <param name="revision">20260928.01</param>
+ <param name="versionformat">20261015.00</param>
+ <param name="revision">20261015.00</param>
<param name="changesgenerate">enable</param>
</service>
<service name="recompress" mode="disabled">
@@ -15,9 +15,12 @@
<param name="basename">osconfig</param>
</service>
<service name="go_modules" mode="disabled">
- <param name="archive">osconfig-20260928.01.tar.gz</param>
+ <param name="archive">osconfig-20261015.00.tar.gz</param>
+ <param
name="replace">github.com/containerd/containerd=github.com/containerd/[email protected]</param>
<param
name="replace">github.com/klauspost/compress=github.com/klauspost/[email protected]</param>
- <param
name="replace">golang.org/x/crypto=golang.org/x/[email protected]</param>
+ <param
name="replace">github.com/moby/sys/user=github.com/moby/sys/[email protected]</param>
+ <param
name="replace">golang.org/x/crypto=golang.org/x/[email protected]</param>
+ <param name="replace">golang.org/x/net=golang.org/x/[email protected]</param>
</service>
</services>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.BBhLco/_old 2026-10-16 20:14:00.303051293 +0200
+++ /var/tmp/diff_new_pack.BBhLco/_new 2026-10-16 20:14:00.307051461 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://github.com/GoogleCloudPlatform/osconfig</param>
- <param
name="changesrevision">6cc49b8ba49719102c0e66d035396136b02be5e8</param></service></servicedata>
+ <param
name="changesrevision">f066b81252091d7e3f6be2611600e80aeaff7ce1</param></service></servicedata>
(No newline at EOF)
++++++ osconfig-20260928.01.tar.gz -> osconfig-20261015.00.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osconfig-20260928.01/packages/trace.go
new/osconfig-20261015.00/packages/trace.go
--- old/osconfig-20260928.01/packages/trace.go 2026-09-28 17:49:49.000000000
+0200
+++ new/osconfig-20261015.00/packages/trace.go 2026-10-15 15:26:07.000000000
+0200
@@ -14,7 +14,7 @@
osInfoProvider osinfo.Provider
}
-// TracingInstalledPackagesProvider creates an InstalledPackagesProvider
decorator that traces the execution time, memory usage, and OS information for
each call.
+// TracingInstalledPackagesProvider creates an InstalledPackagesProvider
decorator that traces the execution time, memory usage, CPU usage, and OS
information for each call.
func TracingInstalledPackagesProvider(tracedProvider
InstalledPackagesProvider, osInfoProvider osinfo.Provider)
InstalledPackagesProvider {
return tracingInstalledPackagesProvider{tracedProvider: tracedProvider,
osInfoProvider: osInfoProvider}
}
@@ -26,8 +26,8 @@
}
ctx, cancel := context.WithCancel(ctx)
- resultChannel := make(chan utiltrace.TraceMemoryResult)
- go utiltrace.TraceMemory(ctx, 100*time.Millisecond, resultChannel)
+ resultChannel := make(chan utiltrace.TraceResult)
+ go utiltrace.Trace(ctx, 100*time.Millisecond, resultChannel)
startTime := time.Now()
pkgs, err := p.tracedProvider.GetInstalledPackages(ctx)
@@ -41,16 +41,19 @@
return pkgs, err
}
-func logTraceResult(ctx context.Context, result utiltrace.TraceMemoryResult,
duration time.Duration, osinfo osinfo.OSInfo) {
+func logTraceResult(ctx context.Context, result utiltrace.TraceResult,
duration time.Duration, osinfo osinfo.OSInfo) {
clog.Debugf(
ctx,
- "GetInstalledPackages: %.3fs, memory %+.2f MB (=%.2f-%.2f),
peak %.2f MB, mean %.2f MB (%d samples), OS: %s@%s, hostname: %s",
+ "GetInstalledPackages: %.3fs, memory %+.2f MB (=%.2f-%.2f),
peak %.2f MB, mean %.2f MB, CPU peak %.1f%%, mean %.1f%%, alloc %.2f MB (%d
samples), OS: %s@%s, hostname: %s",
duration.Seconds(),
result.MemAfterMB-result.MemBeforeMB,
result.MemAfterMB,
result.MemBeforeMB,
result.MemPeakMB,
result.MemMeanMB,
+ result.CPUPeakPercent,
+ result.CPUMeanPercent,
+ result.AllocMB,
result.SampleCount,
osinfo.ShortName,
osinfo.KernelRelease,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osconfig-20260928.01/packages/trace_test.go
new/osconfig-20261015.00/packages/trace_test.go
--- old/osconfig-20260928.01/packages/trace_test.go 2026-09-28
17:49:49.000000000 +0200
+++ new/osconfig-20261015.00/packages/trace_test.go 2026-10-15
15:26:07.000000000 +0200
@@ -152,3 +152,65 @@
})
}
}
+
+func runGetInstalledPackagesWithScalibr(t *testing.T, extractors []string,
scanRoots, dirsToSkip []string, op osinfo.Provider) (Packages, error) {
+ t.Helper()
+ provider := &scalibrInstalledPackagesProvider{
+ extractors: extractors,
+ osinfoProvider: op,
+ scanRootPaths: scanRoots,
+ dirsToSkip: dirsToSkip,
+ }
+ traced := TracingInstalledPackagesProvider(provider, op)
+ return traced.GetInstalledPackages(context.Background())
+}
+
+// TestTracingInstalledPackagesProvider_Scalibr verifies that
TracingInstalledPackagesProvider
+// works correctly when decorating a scalibrInstalledPackagesProvider.
+func TestTracingInstalledPackagesProvider_Scalibr(t *testing.T) {
+ utiltest.OverrideVariable(t, &ZypperExists, false)
+ virtualRoot := arrangeVirtualRoot(t, "./testdata/debian.dpkg-status",
"/var/lib/dpkg/status")
+
+ wantPkgs := Packages{Deb: []*PkgInfo{
+ {Name: "7zip", Version: "24.09+dfsg-4", Arch: "x86_64", Source:
Source{Name: "7zip", Version: "24.09+dfsg-4"}, Type: "deb", Purl:
"pkg:deb/linux/[email protected]%2Bdfsg-4?arch=amd64"},
+ {Name: "llvm-16", Version: "1:16.0.6-27+build3", Arch:
"x86_64", Source: Source{Name: "llvm-toolchain-16", Version:
"1:16.0.6-27+build3"}, Type: "deb", Purl:
"pkg:deb/linux/llvm-16@1%3A16.0.6-27%2Bbuild3?arch=amd64&source=llvm-toolchain-16"},
+ }}
+
+ tests := []struct {
+ name string
+ extractors []string
+ scanRoots []string
+ dirsToSkip []string
+ op osinfo.Provider
+ wantPkgs Packages
+ wantErr error
+ }{
+ {
+ name: "valid dpkg scan with scalibr, want
packages and nil error",
+ extractors: []string{"os/dpkg"},
+ scanRoots: []string{virtualRoot},
+ dirsToSkip: []string{},
+ op: stubProvider{},
+ wantPkgs: wantPkgs,
+ wantErr: nil,
+ },
+ {
+ name: "invalid extractor with scalibr, want
unknown plugin error",
+ extractors: []string{"invalid/extractor"},
+ scanRoots: []string{virtualRoot},
+ dirsToSkip: []string{},
+ op: stubProvider{},
+ wantPkgs: Packages{},
+ wantErr: errors.New("unknown plugin
\"invalid/extractor\""),
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ gotPkgs, gotErr :=
runGetInstalledPackagesWithScalibr(t, tt.extractors, tt.scanRoots,
tt.dirsToSkip, tt.op)
+
+ utiltest.AssertErrorMatch(t, gotErr, tt.wantErr)
+ utiltest.AssertEquals(t, gotPkgs, tt.wantPkgs)
+ })
+ }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osconfig-20260928.01/util/utiltrace/utiltrace.go
new/osconfig-20261015.00/util/utiltrace/utiltrace.go
--- old/osconfig-20260928.01/util/utiltrace/utiltrace.go 2026-09-28
17:49:49.000000000 +0200
+++ new/osconfig-20261015.00/util/utiltrace/utiltrace.go 2026-10-15
15:26:07.000000000 +0200
@@ -28,17 +28,47 @@
SampleCount int
}
-// TraceMemory collects memory usage with specified interval until done
channel is closed
-func TraceMemory(ctx context.Context, interval time.Duration, resultChannel
chan TraceMemoryResult) {
+// TraceResult reflects resource usage stats collected by Trace function.
+type TraceResult struct {
+ TraceMemoryResult
+ CPUPeakPercent float64
+ CPUMeanPercent float64
+ Duration time.Duration
+ AllocMB float64
+}
+
+type cpuSample struct {
+ totalCPUTime time.Duration
+ time time.Time
+}
+
+// Trace collects memory and CPU usage with specified interval until ctx is
cancelled.
+func Trace(ctx context.Context, interval time.Duration, resultChannel chan
TraceResult) {
compactMemory()
+ startTime := time.Now()
+
+ var memBefore runtime.MemStats
+ runtime.ReadMemStats(&memBefore)
+
startMB := memoryUsageMB()
- result := TraceMemoryResult{
- MemBeforeMB: startMB,
- MemPeakMB: startMB,
- SampleCount: 1,
+ result := TraceResult{
+ TraceMemoryResult: TraceMemoryResult{
+ MemBeforeMB: startMB,
+ MemPeakMB: startMB,
+ SampleCount: 1,
+ },
}
runningAverageMB := startMB
+ var lastSample cpuSample
+ startCPUTime, err := getCPUTime()
+ if err == nil {
+ lastSample = cpuSample{totalCPUTime: startCPUTime, time:
startTime}
+ }
+
+ var peakCPU, runningAverageCPU float64
+ cpuSampleCount := 0
+
ticker := time.NewTicker(interval)
defer ticker.Stop()
@@ -51,12 +81,55 @@
if result.MemPeakMB < currentMB {
result.MemPeakMB = currentMB
}
+
+ currentCPUTime, err := getCPUTime()
+ now := time.Now()
+ if err == nil && !lastSample.time.IsZero() {
+ timeDelta := now.Sub(lastSample.time).Seconds()
+ cpuDelta := (currentCPUTime -
lastSample.totalCPUTime).Seconds()
+ if timeDelta > 0 {
+ cpuPercent := (cpuDelta / timeDelta) *
100.0
+ cpuSampleCount++
+ runningAverageCPU += (cpuPercent -
runningAverageCPU) / float64(cpuSampleCount)
+ if cpuPercent > peakCPU {
+ peakCPU = cpuPercent
+ }
+ }
+ lastSample = cpuSample{totalCPUTime:
currentCPUTime, time: now}
+ }
case <-ctx.Done():
compactMemory()
+ totalDuration := time.Since(startTime)
+
+ var memAfter runtime.MemStats
+ runtime.ReadMemStats(&memAfter)
+
result.MemAfterMB = memoryUsageMB()
result.MemMeanMB = runningAverageMB
+ result.AllocMB =
float64(memAfter.TotalAlloc-memBefore.TotalAlloc) / 1024 / 1024
+ result.Duration = totalDuration
+
+ if finalCPUTime, err := getCPUTime(); err == nil &&
totalDuration > 0 && !lastSample.time.IsZero() {
+ meanCPU := (finalCPUTime -
startCPUTime).Seconds() / totalDuration.Seconds() * 100.0
+ runningAverageCPU = meanCPU
+ if meanCPU > peakCPU {
+ peakCPU = meanCPU
+ }
+ }
+
+ result.CPUPeakPercent = peakCPU
+ result.CPUMeanPercent = runningAverageCPU
+
resultChannel <- result
return
}
}
}
+
+// TraceMemory collects memory usage with specified interval until done
channel is closed.
+func TraceMemory(ctx context.Context, interval time.Duration, resultChannel
chan TraceMemoryResult) {
+ traceChan := make(chan TraceResult, 1)
+ go Trace(ctx, interval, traceChan)
+ res := <-traceChan
+ resultChannel <- res.TraceMemoryResult
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/osconfig-20260928.01/util/utiltrace/utiltrace_linux.go
new/osconfig-20261015.00/util/utiltrace/utiltrace_linux.go
--- old/osconfig-20260928.01/util/utiltrace/utiltrace_linux.go 1970-01-01
01:00:00.000000000 +0100
+++ new/osconfig-20261015.00/util/utiltrace/utiltrace_linux.go 2026-10-15
15:26:07.000000000 +0200
@@ -0,0 +1,35 @@
+// Copyright 2026 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build linux
+// +build linux
+
+package utiltrace
+
+import (
+ "fmt"
+ "syscall"
+ "time"
+)
+
+// getCPUTime returns total (user + system) CPU time consumed by the process.
+var getCPUTime = func() (time.Duration, error) {
+ var usage syscall.Rusage
+ if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil {
+ return 0, fmt.Errorf("getrusage error: %w", err)
+ }
+ user := time.Duration(usage.Utime.Sec)*time.Second +
time.Duration(usage.Utime.Usec)*time.Microsecond
+ sys := time.Duration(usage.Stime.Sec)*time.Second +
time.Duration(usage.Stime.Usec)*time.Microsecond
+ return user + sys, nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/osconfig-20260928.01/util/utiltrace/utiltrace_test.go
new/osconfig-20261015.00/util/utiltrace/utiltrace_test.go
--- old/osconfig-20260928.01/util/utiltrace/utiltrace_test.go 2026-09-28
17:49:49.000000000 +0200
+++ new/osconfig-20261015.00/util/utiltrace/utiltrace_test.go 2026-10-15
15:26:07.000000000 +0200
@@ -84,3 +84,62 @@
}
})
}
+
+func mockCPUAPI(t *testing.T, cpuTimes []time.Duration) {
+ prevGetCPUTime := getCPUTime
+ t.Cleanup(func() { getCPUTime = prevGetCPUTime })
+
+ idx := 0
+ getCPUTime = func() (time.Duration, error) {
+ if len(cpuTimes) == 0 {
+ return 0, nil
+ }
+ if idx < len(cpuTimes) {
+ val := cpuTimes[idx]
+ idx++
+ return val, nil
+ }
+ return cpuTimes[len(cpuTimes)-1], nil
+ }
+}
+
+// TestTrace verifies that Trace collects both memory and CPU metrics
correctly.
+func TestTrace(t *testing.T) {
+ tests := []struct {
+ name string
+ memLevels []float64
+ cpuTimes []time.Duration
+ wantMemPeak float64
+ wantMemMean float64
+ }{
+ {
+ name: "valid levels, want peak and mean tracked",
+ memLevels: []float64{10, 20, 10},
+ cpuTimes: []time.Duration{0, 10 * time.Millisecond,
20 * time.Millisecond},
+ wantMemPeak: 20,
+ wantMemMean: 15,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ mockMemoryAPI(t, tt.memLevels, cancel)
+ mockCPUAPI(t, tt.cpuTimes)
+
+ gotChannel := make(chan TraceResult)
+ go Trace(ctx, time.Millisecond, gotChannel)
+ got := <-gotChannel
+
+ if got.MemPeakMB != tt.wantMemPeak {
+ t.Errorf("MemPeakMB = %v, want %v",
got.MemPeakMB, tt.wantMemPeak)
+ }
+ if got.MemMeanMB != tt.wantMemMean {
+ t.Errorf("MemMeanMB = %v, want %v",
got.MemMeanMB, tt.wantMemMean)
+ }
+ if got.AllocMB < 0 {
+ t.Errorf("AllocMB = %v, want >= 0", got.AllocMB)
+ }
+ })
+ }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/osconfig-20260928.01/util/utiltrace/utiltrace_windows.go
new/osconfig-20261015.00/util/utiltrace/utiltrace_windows.go
--- old/osconfig-20260928.01/util/utiltrace/utiltrace_windows.go
1970-01-01 01:00:00.000000000 +0100
+++ new/osconfig-20261015.00/util/utiltrace/utiltrace_windows.go
2026-10-15 15:26:07.000000000 +0200
@@ -0,0 +1,28 @@
+// Copyright 2026 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build windows
+// +build windows
+
+package utiltrace
+
+import (
+ "time"
+)
+
+// getCPUTime returns total CPU time consumed by the process.
+// Stub implementation on Windows.
+var getCPUTime = func() (time.Duration, error) {
+ return 0, nil
+}
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/google-osconfig-agent/vendor.tar.gz
/work/SRC/openSUSE:Factory/.google-osconfig-agent.new.3698736/vendor.tar.gz
differ: char 13, line 1