Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package google-guest-agent for 
openSUSE:Factory checked in at 2025-04-04 18:10:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/google-guest-agent (Old)
 and      /work/SRC/openSUSE:Factory/.google-guest-agent.new.1907 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "google-guest-agent"

Fri Apr  4 18:10:03 2025 rev:44 rq:1267147 version:20250327.01

Changes:
--------
--- /work/SRC/openSUSE:Factory/google-guest-agent/google-guest-agent.changes    
2025-03-11 20:48:05.965171546 +0100
+++ 
/work/SRC/openSUSE:Factory/.google-guest-agent.new.1907/google-guest-agent.changes
  2025-04-04 18:10:10.294818325 +0200
@@ -1,0 +2,121 @@
+Mon Mar 31 11:11:30 UTC 2025 - John Paul Adrian Glaubitz 
<adrian.glaub...@suse.com>
+
+- Update to version 20250327.01 (bsc#1239763, bsc#1239866)
+  * Remove error messages from gce_workload_cert_refresh and
+    metadata script runner (#527)
+- from version 20250327.00
+  * Update guest-logging-go dependency (#526)
+  * Add 'created-by' metadata, and pass it as option to logging library (#508)
+  * Revert "oslogin: Correctly handle newlines at the end of
+    modified files (#520)" (#523)
+  * Re-enable disabled services if the core plugin was enabled (#522)
+  * Enable guest services on package upgrade (#519)
+  * oslogin: Correctly handle newlines at the end of modified files (#520)
+  * Fix core plugin path (#518)
+  * Fix package build issues (#517)
+  * Fix dependencies ran go mod tidy -v (#515)
+  * Fix debian build path (#514)
+  * Bundle compat metadata script runner binary in package (#513)
+  * Bump golang.org/x/net from 0.27.0 to 0.36.0 (#512)
+  * Update startup/shutdown services to launch compat manager (#503)
+  * Bundle new gce metadata script runner binary in agent package (#502)
+  * Revert "Revert bundling new binaries in the package (#509)" (#511)
+- from version 20250326.00
+  * Re-enable disabled services if the core plugin was enabled (#521)
+- from version 20250324.00
+  * Enable guest services on package upgrade (#519)
+  * oslogin: Correctly handle newlines at the end of modified files (#520)
+  * Fix core plugin path (#518)
+  * Fix package build issues (#517)
+  * Fix dependencies ran go mod tidy -v (#515)
+  * Fix debian build path (#514)
+  * Bundle compat metadata script runner binary in package (#513)
+  * Bump golang.org/x/net from 0.27.0 to 0.36.0 (#512)
+  * Update startup/shutdown services to launch compat manager (#503)
+  * Bundle new gce metadata script runner binary in agent package (#502)
+  * Revert "Revert bundling new binaries in the package (#509)" (#511)
+  * Revert bundling new binaries in the package (#509)
+  * Fix typo in windows build script (#501)
+  * Include core plugin binary for all packages (#500)
+  * Update crypto library to fix  CVE-2024-45337 (#499)
+  * Start packaging compat manager (#498)
+  * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492)
+  * scripts: introduce a wrapper to locally build deb package (#490)
+  * Introduce compat-manager systemd unit (#497)
+- from version 20250317.00
+  * Revert "Revert bundling new binaries in the package (#509)" (#511)
+  * Revert bundling new binaries in the package (#509)
+  * Fix typo in windows build script (#501)
+  * Include core plugin binary for all packages (#500)
+  * Update crypto library to fix  CVE-2024-45337 (#499)
+  * Start packaging compat manager (#498)
+  * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492)
+  * scripts: introduce a wrapper to locally build deb package (#490)
+  * Introduce compat-manager systemd unit (#497)
+- from version 20250312.00
+  * Revert bundling new binaries in the package (#509)
+  * Fix typo in windows build script (#501)
+  * Include core plugin binary for all packages (#500)
+  * Update crypto library to fix  CVE-2024-45337 (#499)
+  * Start packaging compat manager (#498)
+  * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492)
+  * scripts: introduce a wrapper to locally build deb package (#490)
+  * Introduce compat-manager systemd unit (#497)
+- from version 20250305.00
+  * Revert bundling new binaries in the package (#509)
+  * Fix typo in windows build script (#501)
+  * Include core plugin binary for all packages (#500)
+  * Update crypto library to fix  CVE-2024-45337 (#499)
+  * Start packaging compat manager (#498)
+  * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492)
+  * scripts: introduce a wrapper to locally build deb package (#490)
+  * Introduce compat-manager systemd unit (#497)
+- from version 20250304.01
+  * Fix typo in windows build script (#501)
+- from version 20250214.01
+  * Include core plugin binary for all packages (#500)
+- from version 20250214.00
+  * Update crypto library to fix  CVE-2024-45337 (#499)
+- from version 20250212.00
+  * Start packaging compat manager (#498)
+  * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492)
+- from version 20250211.00
+  * scripts: introduce a wrapper to locally build deb package (#490)
+  * Introduce compat-manager systemd unit (#497)
+- from version 20250207.00
+  * vlan: toggle vlan configuration in debian packaging (#495)
+  * vlan: move config out of unstable section (#494)
+  * Add clarification to comments regarding invalid NICs and the
+    `invalid` tag. (#493)
+  * Include interfaces in lists even if it has an invalid MAC. (#489)
+  * Fix windows package build failures (#491)
+  * vlan: don't index based on the vlan ID (#486)
+  * Revert PR #482 (#488)
+  * Remove Amy and Zach from OWNERS (#487)
+  * Skip interfaces in interfaceNames() instead of erroring if there is an 
(#482)
+  * Fix Debian packaging if guest agent manager is not checked out (#485)
+- from version 20250204.02
+  * force concourse to move version forward.
+- from version 20250204.01
+  * vlan: toggle vlan configuration in debian packaging (#495)
+- from version 20250204.00
+  * vlan: move config out of unstable section (#494)
+  * Add clarification to comments regarding invalid NICs and the
+    `invalid` tag. (#493)
+- from version 20250203.01
+  * Include interfaces in lists even if it has an invalid MAC. (#489)
+- from version 20250203.00
+  * Fix windows package build failures (#491)
+  * vlan: don't index based on the vlan ID (#486)
+  * Revert PR #482 (#488)
+  * Remove Amy and Zach from OWNERS (#487)
+  * Skip interfaces in interfaceNames() instead of erroring if there is an 
(#482)
+  * Fix Debian packaging if guest agent manager is not checked out (#485)
+- from version 20250122.00
+  * networkd(vlan): remove the interface in addition to config (#468)
+  * Implement support for vlan dynamic removal, update dhclient to
+    remove only if configured (#465)
+  * Update logging library (#479)
+  * Remove Pat from owners file. (#478)
+
+-------------------------------------------------------------------

Old:
----
  guest-agent-20250116.00.tar.gz

New:
----
  guest-agent-20250327.01.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ google-guest-agent.spec ++++++
--- /var/tmp/diff_new_pack.KJJkzS/_old  2025-04-04 18:10:10.974846718 +0200
+++ /var/tmp/diff_new_pack.KJJkzS/_new  2025-04-04 18:10:10.978846884 +0200
@@ -24,7 +24,7 @@
 %global import_path     %{provider_prefix}
 
 Name:           google-guest-agent
-Version:        20250116.00
+Version:        20250327.01
 Release:        0
 Summary:        Google Cloud Guest Agent
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.KJJkzS/_old  2025-04-04 18:10:11.014848387 +0200
+++ /var/tmp/diff_new_pack.KJJkzS/_new  2025-04-04 18:10:11.018848554 +0200
@@ -3,8 +3,8 @@
     <param 
name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="versionformat">20250116.00</param>
-    <param name="revision">20250116.00</param>
+    <param name="versionformat">20250327.01</param>
+    <param name="revision">20250327.01</param>
     <param name="changesgenerate">enable</param>
   </service>
   <service name="recompress" mode="disabled">
@@ -15,7 +15,7 @@
     <param name="basename">guest-agent</param>
   </service>
   <service name="go_modules" mode="disabled">
-    <param name="archive">guest-agent-20250116.00.tar.gz</param>
+    <param name="archive">guest-agent-20250327.01.tar.gz</param>
   </service>
 </services>
 

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.KJJkzS/_old  2025-04-04 18:10:11.042849557 +0200
+++ /var/tmp/diff_new_pack.KJJkzS/_new  2025-04-04 18:10:11.046849724 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param>
-              <param 
name="changesrevision">4dbdb5da9cb233c43adcea8affd01bf5d291b9bd</param></service></servicedata>
+              <param 
name="changesrevision">bdc0a12cb28433745106c088c80a553ffff2d466</param></service></servicedata>
 (No newline at EOF)
 

++++++ guest-agent-20250116.00.tar.gz -> guest-agent-20250327.01.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/.gitignore 
new/guest-agent-20250327.01/.gitignore
--- old/guest-agent-20250116.00/.gitignore      2025-01-16 19:12:23.000000000 
+0100
+++ new/guest-agent-20250327.01/.gitignore      1970-01-01 01:00:00.000000000 
+0100
@@ -1,15 +0,0 @@
-# Ignore all built binaries.
-**/gce_workload_cert_refresh
-**/gce_workload_cert_refresh.exe
-**/google_authorized_keys
-**/google_authorized_keys.exe
-**/google_guest_agent
-**/google_guest_agent.exe
-**/google_metadata_script_runner
-**/google_metadata_script_runner.exe
-
-# Don't ignore new content to directories.
-!**/gce_workload_cert_refresh/
-!**/google_authorized_keys/
-!**/google_guest_agent/
-!**/google_metadata_script_runner/
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/OWNERS 
new/guest-agent-20250327.01/OWNERS
--- old/guest-agent-20250116.00/OWNERS  2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/OWNERS  2025-03-27 17:31:22.000000000 +0100
@@ -2,7 +2,6 @@
 # See the OWNERS docs at https://go.k8s.io/owners
 
 approvers:
-  - a-crate
   - ajorg
   - bkatyl
   - chaitanyakulkarni28
@@ -13,4 +12,3 @@
   - karnvadaliya
   - koln67
   - lpleahy
-  - zmarano
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/build-deb.sh 
new/guest-agent-20250327.01/build-deb.sh
--- old/guest-agent-20250116.00/build-deb.sh    1970-01-01 01:00:00.000000000 
+0100
+++ new/guest-agent-20250327.01/build-deb.sh    2025-03-27 17:31:22.000000000 
+0100
@@ -0,0 +1,47 @@
+#!/bin/env bash
+#
+# This script wraps the steps required to locally build a deb package
+# based on the in tree debian packaging (see invocation example bellow).
+#
+# After the build is finished the script will print out where the final
+# artifact was generated.
+#
+# Invocation:
+# VERSION=<version> RELEASE=<release> ./build-deb.sh
+#
+
+BUILD_DIR=$(mktemp -d)
+PKGNAME="google-guest-agent"
+
+if [ -z "${VERSION}" ]; then
+   echo "VERSION environment variable is not set"
+   exit 1
+fi
+
+if [ -z "${RELEASE}" ]; then
+   echo "RELEASE environment variable is not set"
+   exit 1
+fi
+
+TARBALL="${PKGNAME}_${VERSION}.orig.tar.gz"
+
+echo "Creating tarball: ${TARBALL}"
+tar czvf "${BUILD_DIR}/${TARBALL}" --exclude .git --exclude packaging \
+  --transform "s/^\./${PKGNAME}-${VERSION}/" .
+
+tar -C "$BUILD_DIR" -xzvf "${BUILD_DIR}/${TARBALL}"
+PKGDIR="${BUILD_DIR}/${PKGNAME}-${VERSION}"
+
+cp -r packaging/debian "${BUILD_DIR}/${PKGNAME}-${VERSION}/"
+
+cd "${BUILD_DIR}/${PKGNAME}-${VERSION}"
+
+# We generate this to enable auto-versioning.
+[[ -f debian/changelog ]] && rm debian/changelog
+
+dch --create -M -v 1:${VERSION}-${RELEASE} --package $PKGNAME -D stable \
+  "Debian packaging for ${PKGNAME}"
+
+DEB_BUILD_OPTIONS="noautodbgsym nocheck" debuild -e "VERSION=${VERSION}" -e 
"RELEASE=${RELEASE}" -us -uc
+
+echo "Package built at: ${BUILD_DIR}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/gce_workload_cert_refresh/main.go 
new/guest-agent-20250327.01/gce_workload_cert_refresh/main.go
--- old/guest-agent-20250116.00/gce_workload_cert_refresh/main.go       
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/gce_workload_cert_refresh/main.go       
2025-03-27 17:31:22.000000000 +0100
@@ -149,13 +149,16 @@
 
 func main() {
        ctx := context.Background()
-
        opts := logger.LogOpts{
                LoggerName:     programName,
                FormatFunction: logFormat,
                // No need for syslog.
                DisableLocalLogging: true,
        }
+       createdByBytes, err := getMetadata(ctx, 
"/instance/attributes/created-by")
+       if err == nil {
+               opts.MIG = string(createdByBytes)
+       }
 
        opts.Writers = []io.Writer{os.Stderr}
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/go.mod 
new/guest-agent-20250327.01/go.mod
--- old/guest-agent-20250116.00/go.mod  2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/go.mod  2025-03-27 17:31:22.000000000 +0100
@@ -1,12 +1,12 @@
 module github.com/GoogleCloudPlatform/guest-agent
 
-go 1.20
+go 1.23.0
 
 replace github.com/GoogleCloudPlatform/guest-agent/metadata => ../metadata
 
 require (
        cloud.google.com/go/storage v1.31.0
-       github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250108002221-76154e4b3bd9
+       github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250327013322-4be06cdc8bd8
        github.com/Microsoft/go-winio v0.6.1
        github.com/go-ini/ini v1.66.6
        github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
@@ -17,8 +17,8 @@
        github.com/kardianos/service v1.2.2
        github.com/robfig/cron/v3 v3.0.1
        github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
-       golang.org/x/crypto v0.25.0
-       golang.org/x/sys v0.22.0
+       golang.org/x/crypto v0.35.0
+       golang.org/x/sys v0.30.0
        google.golang.org/api v0.134.0
        google.golang.org/grpc v1.57.1
        google.golang.org/protobuf v1.33.0
@@ -44,10 +44,10 @@
        github.com/pkg/errors v0.9.1 // indirect
        go.opencensus.io v0.24.0 // indirect
        golang.org/x/mod v0.17.0 // indirect
-       golang.org/x/net v0.27.0 // indirect
+       golang.org/x/net v0.36.0 // indirect
        golang.org/x/oauth2 v0.10.0 // indirect
-       golang.org/x/sync v0.7.0 // indirect
-       golang.org/x/text v0.16.0 // indirect
+       golang.org/x/sync v0.11.0 // indirect
+       golang.org/x/text v0.22.0 // indirect
        golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
        golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
        google.golang.org/appengine v1.6.7 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/go.sum 
new/guest-agent-20250327.01/go.sum
--- old/guest-agent-20250116.00/go.sum  2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/go.sum  2025-03-27 17:31:22.000000000 +0100
@@ -15,8 +15,8 @@
 cloud.google.com/go/storage v1.31.0 
h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI=
 cloud.google.com/go/storage v1.31.0/go.mod 
h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0=
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250108002221-76154e4b3bd9 
h1:7qCQS+ERyBX6NCxH857rhrxntIwyAIuIk9+s0iETYWU=
-github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250108002221-76154e4b3bd9/go.mod 
h1:6ZqSUIZRAPR5dNMWJ+FwIarFFQ9t5qalaKQs20o6h+I=
+github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250327013322-4be06cdc8bd8 
h1:XHFUi3AVH/bsqoNIniftXTVgHYZuMalB/s/5LiLkf9c=
+github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20250327013322-4be06cdc8bd8/go.mod 
h1:6ZqSUIZRAPR5dNMWJ+FwIarFFQ9t5qalaKQs20o6h+I=
 github.com/Microsoft/go-winio v0.6.1 
h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 github.com/Microsoft/go-winio v0.6.1/go.mod 
h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
 github.com/antihax/optional v1.0.0/go.mod 
h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
@@ -63,7 +63,9 @@
 github.com/golang/protobuf v1.5.3 
h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
 github.com/golang/protobuf v1.5.3/go.mod 
h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/google/certificate-transparency-go v1.1.2 
h1:4hE0GEId6NAW28dFpC+LrRGwQX5dtmXQGDbg8+/MZOM=
+github.com/google/certificate-transparency-go v1.1.2/go.mod 
h1:3OL+HKDqHPUfdKrHVQxO6T8nDLO0HF7LRTlkIWXaWvQ=
 github.com/google/go-attestation v0.4.4-0.20230613144338-a9b6eb1eb888 
h1:HURgKPRPJSozDuMHpjdV+iyFVLhB6bi1JanhGgSzI1k=
+github.com/google/go-attestation v0.4.4-0.20230613144338-a9b6eb1eb888/go.mod 
h1:xCfWZojUHwedNcs780T8cblW9XHss9XKD2s3U44FVbo=
 github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -80,9 +82,11 @@
 github.com/google/go-tpm-tools v0.4.0 
h1:bYRZAUvQEmn11WTKCkTLRCCv4aTlOBgBBeqCK0ABT2A=
 github.com/google/go-tpm-tools v0.4.0/go.mod 
h1:G7PFUk8KKQzdYYGv/cpV9LB9sPT7czAAomnceugzNKQ=
 github.com/google/go-tspi v0.3.0 
h1:ADtq8RKfP+jrTyIWIZDIYcKOMecRqNJFOew2IT0Inus=
+github.com/google/go-tspi v0.3.0/go.mod 
h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI=
 github.com/google/logger v1.1.1 h1:+6Z2geNxc9G+4D4oDO9njjjn2d0wN5d7uOo0vOIW1NQ=
 github.com/google/logger v1.1.1/go.mod 
h1:BkeJZ+1FhQ+/d087r4dzojEg1u2ZX+ZqG1jTUrLM+zQ=
 github.com/google/martian/v3 v3.3.2 
h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
+github.com/google/martian/v3 v3.3.2/go.mod 
h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
 github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc=
 github.com/google/s2a-go v0.1.4/go.mod 
h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
 github.com/google/tink/go v1.7.0 
h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w=
@@ -124,13 +128,15 @@
 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod 
h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod 
h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
+go.uber.org/multierr v1.8.0/go.mod 
h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
-golang.org/x/crypto v0.25.0/go.mod 
h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
+golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
+golang.org/x/crypto v0.35.0/go.mod 
h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -151,8 +157,8 @@
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
-golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
@@ -162,8 +168,8 @@
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
+golang.org/x/sync v0.11.0/go.mod 
h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -176,19 +182,20 @@
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
+golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
+golang.org/x/term v0.29.0/go.mod 
h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod 
h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
+golang.org/x/text v0.22.0/go.mod 
h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google-guest-agent-manager.service 
new/guest-agent-20250327.01/google-guest-agent-manager.service
--- old/guest-agent-20250116.00/google-guest-agent-manager.service      
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google-guest-agent-manager.service      
2025-03-27 17:31:22.000000000 +0100
@@ -1,7 +1,7 @@
 [Unit]
 Description=Google Compute Engine Guest Agent Plugin Manager
-After=google-guest-agent.service
-Wants=google-guest-agent.service
+After=network-online.target syslog.service
+After=network.service networking.service NetworkManager.service 
systemd-networkd.service
 
 [Service]
 Type=notify
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google-guest-compat-manager.service 
new/guest-agent-20250327.01/google-guest-compat-manager.service
--- old/guest-agent-20250116.00/google-guest-compat-manager.service     
1970-01-01 01:00:00.000000000 +0100
+++ new/guest-agent-20250327.01/google-guest-compat-manager.service     
2025-03-27 17:31:22.000000000 +0100
@@ -0,0 +1,12 @@
+[Unit]
+Description=Google Compute Engine Guest Compat Manager
+After=network-online.target syslog.service
+After=network.service networking.service NetworkManager.service 
systemd-networkd.service
+
+[Service]
+Type=notify
+ExecStart=/usr/bin/google_guest_compat_manager
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google-shutdown-scripts.service 
new/guest-agent-20250327.01/google-shutdown-scripts.service
--- old/guest-agent-20250116.00/google-shutdown-scripts.service 2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google-shutdown-scripts.service 2025-03-27 
17:31:22.000000000 +0100
@@ -8,7 +8,7 @@
 ExecStart=/bin/true
 RemainAfterExit=true
 # This service does nothing on start, and runs shutdown scripts on stop.
-ExecStop=/usr/bin/google_metadata_script_runner shutdown
+ExecStop=/bin/sh -c 'if [ -e /usr/bin/gce_compat_metadata_script_runner ]; 
then /usr/bin/gce_compat_metadata_script_runner shutdown; else 
/usr/bin/google_metadata_script_runner shutdown; fi'
 TimeoutStopSec=0
 KillMode=process
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google-startup-scripts.service 
new/guest-agent-20250327.01/google-startup-scripts.service
--- old/guest-agent-20250116.00/google-startup-scripts.service  2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google-startup-scripts.service  2025-03-27 
17:31:22.000000000 +0100
@@ -6,7 +6,7 @@
 
 [Service]
 Type=oneshot
-ExecStart=/usr/bin/google_metadata_script_runner startup
+ExecStart=/bin/sh -c 'if [ -e /usr/bin/gce_compat_metadata_script_runner ]; 
then /usr/bin/gce_compat_metadata_script_runner startup; else 
/usr/bin/google_metadata_script_runner startup; fi'
 #TimeoutStartSec is ignored for Type=oneshot service units.
 KillMode=process
 StandardOutput=journal+console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_authorized_keys/main.go 
new/guest-agent-20250327.01/google_authorized_keys/main.go
--- old/guest-agent-20250116.00/google_authorized_keys/main.go  2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_authorized_keys/main.go  2025-03-27 
17:31:22.000000000 +0100
@@ -143,9 +143,11 @@
        ctx := context.Background()
        username := os.Args[1]
 
+       createdBy, _ := client.GetKey(ctx, "/instance/attributes/created-by", 
nil)
        opts := logger.LogOpts{
                LoggerName:     programName,
                FormatFunction: logFormat,
+               MIG:            createdBy,
        }
 
        if runtime.GOOS == "windows" {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/cfg/cfg.go 
new/guest-agent-20250327.01/google_guest_agent/cfg/cfg.go
--- old/guest-agent-20250116.00/google_guest_agent/cfg/cfg.go   2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_guest_agent/cfg/cfg.go   2025-03-27 
17:31:22.000000000 +0100
@@ -92,6 +92,7 @@
 setup = true
 manage_primary_nic =
 restore_debian12_netplan_config = true
+vlan_setup_enabled = false
 
 [OSLogin]
 cert_authentication = true
@@ -111,7 +112,6 @@
 command_pipe_mode = 0770
 command_pipe_group =
 command_request_timeout = 10s
-vlan_setup_enabled = false
 systemd_config_dir = /usr/lib/systemd/network
 `
 )
@@ -288,6 +288,7 @@
        Setup                        bool   `ini:"setup,omitempty"`
        ManagePrimaryNIC             bool   `ini:"manage_primary_nic,omitempty"`
        RestoreDebian12NetplanConfig bool   
`ini:"restore_debian12_netplan_config,omitempty"`
+       VlanSetupEnabled             bool   `ini:"vlan_setup_enabled,omitempty"`
 }
 
 // Snapshots contains the configurations of Snapshots section.
@@ -307,7 +308,6 @@
        CommandRequestTimeout string `ini:"command_request_timeout,omitempty"`
        CommandPipeMode       string `ini:"command_pipe_mode,omitempty"`
        CommandPipeGroup      string `ini:"command_pipe_group,omitempty"`
-       VlanSetupEnabled      bool   `ini:"vlan_setup_enabled,omitempty"`
        SystemdConfigDir      string `ini:"systemd_config_dir,omitempty"`
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/main.go 
new/guest-agent-20250327.01/google_guest_agent/main.go
--- old/guest-agent-20250116.00/google_guest_agent/main.go      2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_guest_agent/main.go      2025-03-27 
17:31:22.000000000 +0100
@@ -207,6 +207,7 @@
        // TODO: move all this metadata dependent code to its own metadata 
event handler.
        if newMetadata != nil {
                opts.ProjectName = newMetadata.Project.ProjectID
+               opts.MIG = newMetadata.Instance.Attributes.CreatedBy
                if err := logger.Init(ctx, opts); err != nil {
                        logger.Errorf("Error initializing logger: %v", err)
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/common.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/common.go
--- old/guest-agent-20250116.00/google_guest_agent/network/manager/common.go    
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_guest_agent/network/manager/common.go    
2025-03-27 17:31:22.000000000 +0100
@@ -23,13 +23,11 @@
        "net"
        "os"
        "os/exec"
-       "regexp"
-       "strconv"
+       "strings"
 
        "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/osinfo"
        "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run"
        "github.com/GoogleCloudPlatform/guest-agent/metadata"
-       "github.com/GoogleCloudPlatform/guest-agent/utils"
        "github.com/GoogleCloudPlatform/guest-logging-go/logger"
        "github.com/go-ini/ini"
 
@@ -85,39 +83,44 @@
        var ifaces []string
        for _, ni := range nics {
                iface, err := GetInterfaceByMAC(ni.Mac)
+               ifaceName := iface.Name
                if err != nil {
-                       return nil, err
+                       if _, found := badMAC[ni.Mac]; !found {
+                               logger.Errorf("Error getting interface %s: %v", 
ni.Mac, err)
+                               badMAC[ni.Mac] = iface
+                       }
+                       // Mark the iface as invalid, and include its Mac. This 
is important
+                       // to avoid shifting indices if a MAC is invalid, which 
will cause
+                       // problems with network and VLAN setup.
+                       ifaceName = fmt.Sprintf("invalid-%s", ni.Mac)
                }
-               ifaces = append(ifaces, iface.Name)
+               ifaces = append(ifaces, ifaceName)
        }
        return ifaces, nil
 }
 
-// vlanInterfaceParentMap gets a map of VLAN IDs and its parent NIC.
-func vlanInterfaceParentMap(nics map[int]metadata.VlanInterface, 
allEthernetInterfaces []string) (map[int]string, error) {
-       vlans := make(map[int]string)
-
-       for _, ni := range nics {
-               parentInterface, err := 
vlanParentInterface(allEthernetInterfaces, ni)
-               if err != nil {
-                       return nil, fmt.Errorf("failed to determine vlan's 
parent interface: %+v", err)
-               }
-               vlans[ni.Vlan] = parentInterface
+// isInvalid checks if the provided interface is invalid. This is used to skip
+// writing configurations for interfaces that have been disabled or otherwise
+// made invalid. The `invalid` tag is added to ifaces whose MACs are invalid.
+// This logic is handled in the `interfaceListsIpv4Ipv6` function below.
+//
+// Marking an interface as invalid allows us to keep consistency with the lists
+// of interfaces returned by `interfaceNames` and `interfaceListsIpv4Ipv6`. In
+// cases where a NIC is disabled, skipping them would result in shifting of
+// indices, which will cause problems with both network setup (especially in 
cases
+// where the primary NIC is disabled for some reason) and VLAN setup, which 
depends
+// on properly pairing with respective NIC indices.
+//
+// For example, if the primary NIC was disabled, then the current network
+// setup implementation will start treating the first secondary NIC as the
+// primary NIC. In VLAN's case, a VLAN NIC may be improperly paired with the
+// wrong parent NIC.
+func isInvalid(iface string) bool {
+       invalid := strings.Contains(iface, "invalid")
+       if invalid {
+               logger.Debugf("Invalid interface %s, skipping", iface)
        }
-
-       return vlans, nil
-}
-
-// vlanInterfaceListsIpv6 gets a list of VLAN IDs that support IPv6.
-func vlanInterfaceListsIpv6(nics map[int]VlanInterface) []int {
-       var googleIpv6Interfaces []int
-
-       for _, ni := range nics {
-               if ni.DHCPv6Refresh != "" {
-                       googleIpv6Interfaces = append(googleIpv6Interfaces, 
ni.Vlan)
-               }
-       }
-       return googleIpv6Interfaces
+       return invalid
 }
 
 // interfaceListsIpv4Ipv6 gets a list of interface names. The first list is a 
list of all
@@ -128,17 +131,21 @@
 
        for _, ni := range nics {
                iface, err := GetInterfaceByMAC(ni.Mac)
+               ifaceName := iface.Name
                if err != nil {
                        if _, found := badMAC[ni.Mac]; !found {
                                logger.Errorf("error getting interface: %s", 
err)
                                badMAC[ni.Mac] = iface
                        }
-                       continue
+                       // Mark the iface as invalid, and include its Mac. This 
is important
+                       // to avoid shifting indices if a MAC is invalid, which 
will cause
+                       // problems with network and VLAN setup.
+                       ifaceName = fmt.Sprintf("invalid-%s", ni.Mac)
                }
                if ni.DHCPv6Refresh != "" {
-                       googleIpv6Interfaces = append(googleIpv6Interfaces, 
iface.Name)
+                       googleIpv6Interfaces = append(googleIpv6Interfaces, 
ifaceName)
                }
-               googleInterfaces = append(googleInterfaces, iface.Name)
+               googleInterfaces = append(googleInterfaces, ifaceName)
        }
        return googleInterfaces, googleIpv6Interfaces
 }
@@ -183,30 +190,6 @@
        return net.Interface{}, fmt.Errorf("no interface found with MAC %s", 
mac)
 }
 
-// vlanParentInterface returns the interface name of the parent interface of a 
vlan interface.
-func vlanParentInterface(ethernetInterfaces []string, vlan 
metadata.VlanInterface) (string, error) {
-       regexStr := "(?P<prefix>.*network-interfaces)/(?P<interface>[0-9]+)/"
-       parentRegex := regexp.MustCompile(regexStr)
-
-       groups := utils.RegexGroupsMap(parentRegex, vlan.ParentInterface)
-
-       ifaceIndex, found := groups["interface"]
-       if !found {
-               return "", fmt.Errorf("invalid vlan's ParentInterface 
reference, no interface index found")
-       }
-
-       index, err := strconv.Atoi(ifaceIndex)
-       if err != nil {
-               return "", fmt.Errorf("failed to parse parent index(%s): %+v", 
ifaceIndex, err)
-       }
-
-       if index >= len(ethernetInterfaces) {
-               return "", fmt.Errorf("invalid parent index(%d), known 
interfaces count: %d", index, len(ethernetInterfaces))
-       }
-
-       return ethernetInterfaces[index], nil
-}
-
 // readIniFile reads and parses the content of filePath and loads it into ptr.
 func readIniFile(filePath string, ptr any) error {
        opts := ini.LoadOptions{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/common_test.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/common_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/common_test.go   
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/common_test.go   
    2025-03-27 17:31:22.000000000 +0100
@@ -13,126 +13,3 @@
 //  limitations under the License.
 
 package manager
-
-import (
-       "fmt"
-       "sort"
-       "testing"
-
-       "github.com/GoogleCloudPlatform/guest-agent/metadata"
-       "github.com/google/go-cmp/cmp"
-)
-
-func TestVlanParentInterfaceSuccess(t *testing.T) {
-       tests := []struct {
-               parentInterface string
-               expectedResult  string
-       }{
-               {"/computeMetadata/v1/instance/network-interfaces/0/", "eth0"},
-               {"/computeMetadata/v1/instance/network-interfaces/1/", "eth1"},
-               {"/computeMetadata/v1/instance/network-interfaces/2/", "eth2"},
-       }
-
-       availableNics := []string{
-               "eth0",
-               "eth1",
-               "eth2",
-       }
-
-       for i, curr := range tests {
-               t.Run(fmt.Sprintf("test-vlan-parent-success-%d", i), func(t 
*testing.T) {
-                       vlan := metadata.VlanInterface{ParentInterface: 
curr.parentInterface}
-
-                       parent, err := vlanParentInterface(availableNics, vlan)
-                       if err != nil {
-                               t.Fatalf("expected err: nil, got: %+v", err)
-                       }
-
-                       if parent != curr.expectedResult {
-                               t.Fatalf("got wront parent value, expected: %s, 
got: %s", curr.expectedResult, parent)
-                       }
-               })
-       }
-}
-
-func TestVlanParentInterfaceFailure(t *testing.T) {
-       tests := []string{
-               "/computeMetadata/v1/instance/network-interfaces/x/",
-               "/computeMetadata/v1/instance/network-interfaces/0/",           
         // Valid format but interfaces slices will have zero elements.
-               
"/computeMetadata/v1/instance/network-interfaces/18446744073709551616/", // Out 
of int64 range - strconv.Atoi() should fail.
-               "/computeMetadata/v1/instance/0/",
-               "/computeMetadata/v1/instance/network-interfaces0/",
-               "/computeMetadata/v1/instance/network-interfaces/",
-               "/computeMetadata/",
-               "",
-       }
-
-       for i, curr := range tests {
-               t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
-                       vlan := metadata.VlanInterface{ParentInterface: curr}
-                       _, err := vlanParentInterface([]string{}, vlan)
-                       if err == nil {
-                               t.Fatalf("vlanParentInterface(%s) = nil, want: 
non-nil", curr)
-                       }
-               })
-       }
-}
-
-func TestVlanInterfaceListsIpv6(t *testing.T) {
-       nics := map[int]VlanInterface{
-               0: {VlanInterface: metadata.VlanInterface{Vlan: 4, 
DHCPv6Refresh: "123456"}},
-               1: {VlanInterface: metadata.VlanInterface{Vlan: 5}},
-               2: {VlanInterface: metadata.VlanInterface{Vlan: 6, MTU: 1234}},
-               3: {VlanInterface: metadata.VlanInterface{Vlan: 7, Mac: "acd", 
ParentInterface: "/parent/0", DHCPv6Refresh: "7890"}},
-       }
-       want := []int{4, 7}
-       got := vlanInterfaceListsIpv6(nics)
-       sort.Ints(got)
-
-       if diff := cmp.Diff(want, got); diff != "" {
-               t.Errorf("vlanInterfaceListsIpv6(%+v) returned unexpected diff 
(-want,+got)\n%s", nics, diff)
-       }
-}
-
-func TestVlanInterfaceParentMap(t *testing.T) {
-       tests := []struct {
-               name                  string
-               nics                  map[int]metadata.VlanInterface
-               allEthernetInterfaces []string
-               wantErr               bool
-               wantMap               map[int]string
-       }{
-               {
-                       name:                  "all_valid_nics",
-                       allEthernetInterfaces: []string{"ens3", "ens4"},
-                       nics: map[int]metadata.VlanInterface{
-                               4: {Vlan: 4, ParentInterface: 
"/computeMetadata/v1/instance/network-interfaces/0/"},
-                               5: {Vlan: 5, ParentInterface: 
"/computeMetadata/v1/instance/network-interfaces/1/"},
-                       },
-                       wantMap: map[int]string{
-                               4: "ens3",
-                               5: "ens4",
-                       },
-               },
-               {
-                       name:                  "invalid_parent",
-                       allEthernetInterfaces: []string{"ens3"},
-                       nics: map[int]metadata.VlanInterface{
-                               5: {Vlan: 5, ParentInterface: 
"/computeMetadata/v1/instance/network-interfaces/1/"},
-                       },
-                       wantErr: true,
-               },
-       }
-
-       for _, test := range tests {
-               t.Run(test.name, func(t *testing.T) {
-                       got, err := vlanInterfaceParentMap(test.nics, 
test.allEthernetInterfaces)
-                       if (err != nil) != test.wantErr {
-                               t.Fatalf("vlanInterfaceParentMap(%+v, %v) = 
error [%v], want error: %t", test.nics, test.allEthernetInterfaces, err, 
test.wantErr)
-                       }
-                       if diff := cmp.Diff(test.wantMap, got); diff != "" {
-                               t.Errorf("vlanInterfaceParentMap(%+v, %v) 
returned unexpected diff (-want,+got)\n%s", test.nics, 
test.allEthernetInterfaces, diff)
-                       }
-               })
-       }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux.go
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux.go
    2025-03-27 17:31:22.000000000 +0100
@@ -415,6 +415,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
dhclient launch for %s", iface)
                        continue
                }
+               if isInvalid(iface) {
+                       continue
+               }
                // On 18.04 we fallback to dhclient as networkctl is very old 
and has not reload support for example.
                // Default netplan config will take care of it, do not launch 
dhclient for primary NIC on 18.04.
                if (i == 0) && isUbuntu1804() {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux_test.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux_test.go
       2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux_test.go
       2025-03-27 17:31:22.000000000 +0100
@@ -49,7 +49,7 @@
                for _, arg := range args {
                        msg += fmt.Sprintf(" %v", arg)
                }
-               return fmt.Errorf(msg)
+               return fmt.Errorf("%s", msg)
        }
        return nil
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/manager.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/manager.go
--- old/guest-agent-20250116.00/google_guest_agent/network/manager/manager.go   
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_guest_agent/network/manager/manager.go   
2025-03-27 17:31:22.000000000 +0100
@@ -83,7 +83,7 @@
        EthernetInterfaces []metadata.NetworkInterfaces
 
        // VlanInterfaces are the vLAN interfaces descriptors offered by 
metadata.
-       VlanInterfaces map[int]VlanInterface
+       VlanInterfaces map[string]VlanInterface
 }
 
 // guestAgentSection is the section added to guest-agent-written ini files to 
indicate
@@ -163,7 +163,8 @@
                }
 
                for vlanID, vlan := range vlans {
-                       nics.VlanInterfaces[vlanID] = 
VlanInterface{VlanInterface: vlan, ParentInterfaceID: 
ethernetInterfaces[parentID]}
+                       mapID := fmt.Sprintf("%d-%d", parentID, vlanID)
+                       nics.VlanInterfaces[mapID] = 
VlanInterface{VlanInterface: vlan, ParentInterfaceID: 
ethernetInterfaces[parentID]}
                }
        }
        return nil
@@ -191,7 +192,7 @@
 
        nics := &Interfaces{
                EthernetInterfaces: mds.Instance.NetworkInterfaces,
-               VlanInterfaces:     map[int]VlanInterface{},
+               VlanInterfaces:     map[string]VlanInterface{},
        }
 
        interfaces, err := interfaceNames(nics.EthernetInterfaces)
@@ -231,7 +232,7 @@
                return fmt.Errorf("manager(%s): error setting up ethernet 
interfaces: %v", activeService.manager.Name(), err)
        }
 
-       if config.Unstable.VlanSetupEnabled {
+       if config.NetworkInterfaces.VlanSetupEnabled {
                logger.Infof("VLAN setup is enabled via config file, setting up 
interfaces")
                if err := reformatVlanNics(mds, nics, interfaces); err != nil {
                        return fmt.Errorf("unable to read vlans, invalid 
format: %w", err)
@@ -335,7 +336,7 @@
 func buildInterfacesFromAllPhysicalNICs() (*Interfaces, error) {
        nics := &Interfaces{
                EthernetInterfaces: nil,
-               VlanInterfaces:     map[int]VlanInterface{},
+               VlanInterfaces:     map[string]VlanInterface{},
        }
 
        interfaces, err := net.Interfaces()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/manager_test.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/manager_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/manager_test.go  
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/manager_test.go  
    2025-03-27 17:31:22.000000000 +0100
@@ -335,11 +335,11 @@
                        },
                },
        }}
-       nics := &Interfaces{VlanInterfaces: map[int]VlanInterface{}}
-       want := &Interfaces{VlanInterfaces: map[int]VlanInterface{
-               5: {VlanInterface: metadata.VlanInterface{Mac: "a", 
ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/", Vlan: 
5}, ParentInterfaceID: "eth0"},
-               6: {VlanInterface: metadata.VlanInterface{Mac: "b", Vlan: 6, 
IP: "1.2.3.4"}, ParentInterfaceID: "eth0"},
-               7: {VlanInterface: metadata.VlanInterface{Mac: "c", Vlan: 7, 
DHCPv6Refresh: "123456"}, ParentInterfaceID: "eth1"},
+       nics := &Interfaces{VlanInterfaces: map[string]VlanInterface{}}
+       want := &Interfaces{VlanInterfaces: map[string]VlanInterface{
+               "0-5": {VlanInterface: metadata.VlanInterface{Mac: "a", 
ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/", Vlan: 
5}, ParentInterfaceID: "eth0"},
+               "0-6": {VlanInterface: metadata.VlanInterface{Mac: "b", Vlan: 
6, IP: "1.2.3.4"}, ParentInterfaceID: "eth0"},
+               "1-7": {VlanInterface: metadata.VlanInterface{Mac: "c", Vlan: 
7, DHCPv6Refresh: "123456"}, ParentInterfaceID: "eth1"},
        }}
 
        ethernetInterfaces := []string{"eth0", "eth1"}
@@ -365,7 +365,7 @@
                        },
                },
        }}
-       nics := &Interfaces{VlanInterfaces: map[int]VlanInterface{}}
+       nics := &Interfaces{VlanInterfaces: map[string]VlanInterface{}}
 
        tests := []struct {
                name               string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux.go 
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux.go 
    2025-03-27 17:31:22.000000000 +0100
@@ -26,6 +26,7 @@
        "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/cfg"
        "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/osinfo"
        "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run"
+       "github.com/GoogleCloudPlatform/guest-agent/metadata"
        "github.com/GoogleCloudPlatform/guest-agent/utils"
        "github.com/GoogleCloudPlatform/guest-logging-go/logger"
 )
@@ -258,6 +259,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
writeNetworkdDropin for %s", iface)
                        continue
                }
+               if isInvalid(iface) {
+                       continue
+               }
                logger.Debugf("writing systemd-networkd drop-in config for %s", 
iface)
 
                var dhcp = "ipv4"
@@ -368,6 +372,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
writeNetplanEthernetDropin for %s", iface)
                        continue
                }
+               if isInvalid(iface) {
+                       continue
+               }
                logger.Debugf("Adding %s(%d) to drop-in configuration.", iface, 
i)
 
                trueVal := true
@@ -468,28 +475,33 @@
 
 // SetupVlanInterface writes the apppropriate vLAN interfaces netplan 
configuration.
 func (n *netplan) SetupVlanInterface(ctx context.Context, config 
*cfg.Sections, nics *Interfaces) error {
+       var reload1, reload2, reload3 bool
+       var err error
+
        toRemove, err := n.findVlanDiff(nics)
        if err != nil {
                return fmt.Errorf("unable to detect vlan nics to delete: %w", 
err)
        }
 
-       reload1, err := n.rollbackVlanNics(ctx, toRemove)
-       if err != nil {
-               return fmt.Errorf("unable to remove vlan interfaces (%+v): %w", 
toRemove, err)
+       if toRemove != nil {
+               reload1, err = n.rollbackVlanNics(ctx, toRemove)
+               if err != nil {
+                       return fmt.Errorf("unable to remove vlan interfaces 
(%+v): %w", toRemove, err)
+               }
        }
 
-       reload2, err := n.writeNetplanVLANDropin(nics)
+       reload2, err = n.writeNetplanVLANDropin(nics)
        if err != nil {
                return fmt.Errorf("unable to write netplan VLAN dropin: %w", 
err)
        }
 
-       reload3, err := n.writeNetworkdVLANDropin(nics)
+       reload3, err = n.writeNetworkdVLANDropin(nics)
        if err != nil {
                return fmt.Errorf("unable to write netplan networkd VLAN 
dropin: %w", err)
        }
 
        if reload1 || reload2 || reload3 {
-               if err := n.reloadConfigs(ctx); err != nil {
+               if err = n.reloadConfigs(ctx); err != nil {
                        return fmt.Errorf("error applying vlan interface 
configs: %w", err)
                }
        }
@@ -512,23 +524,23 @@
 // and returns only the vlan interfaces to delete.
 func (n *netplan) findVlanDiff(expectedNics *Interfaces) (*Interfaces, error) {
        keepInterfaces := make(map[string]string)
-       toRemove := &Interfaces{VlanInterfaces: make(map[int]VlanInterface)}
+       toRemove := Interfaces{VlanInterfaces: make(map[string]VlanInterface)}
 
        existingVlanCfgs := netplanDropin{}
        netplanVlanDropinFile := n.dropinFile(netplanVlanSuffix)
        // There's no config file per interface, single netplan config file 
lists all the interfaces.
        if !utils.FileExists(netplanVlanDropinFile, utils.TypeFile) {
                logger.Infof("File %q does not exist, nothing to rollback", 
netplanVlanDropinFile)
-               return toRemove, nil
+               return nil, nil
        }
 
        if err := readYamlFile(netplanVlanDropinFile, &existingVlanCfgs); err 
!= nil {
-               return toRemove, fmt.Errorf("unable to read %q trying rollback 
configs: %w", netplanVlanDropinFile, err)
+               return nil, fmt.Errorf("unable to read %q trying rollback 
configs: %w", netplanVlanDropinFile, err)
        }
 
        if len(existingVlanCfgs.Network.Vlans) == 0 {
                logger.Debugf("No existing VLAN configs found at %q, skipping 
rollback", netplanVlanDropinFile)
-               return toRemove, nil
+               return nil, nil
        }
 
        for _, iface := range expectedNics.VlanInterfaces {
@@ -541,11 +553,18 @@
        for vlanKey, vlan := range existingVlanCfgs.Network.Vlans {
                _, ok := keepInterfaces[vlanKey]
                if !ok {
-                       toRemove.VlanInterfaces[vlan.ID] = 
VlanInterface{ParentInterfaceID: n.interfaceFromLink(vlan.Link)}
+                       parentID := n.interfaceFromLink(vlan.Link)
+                       vlanID := fmt.Sprintf("%s-%d", parentID, vlan.ID)
+                       toRemove.VlanInterfaces[vlanID] = VlanInterface{
+                               ParentInterfaceID: parentID,
+                               VlanInterface: metadata.VlanInterface{
+                                       Vlan: vlan.ID,
+                               },
+                       }
                }
        }
 
-       return toRemove, nil
+       return &toRemove, nil
 }
 
 // rollbackVlanNics removes the [nics] and its config (netplan and networkd 
dropin both) on disk.
@@ -567,8 +586,8 @@
                }
        }
 
-       for id, iface := range nics.VlanInterfaces {
-               ifaceName := n.vlanInterfaceName(iface.ParentInterfaceID, id)
+       for _, iface := range nics.VlanInterfaces {
+               ifaceName := n.vlanInterfaceName(iface.ParentInterfaceID, 
iface.VlanInterface.Vlan)
                key := n.ID(ifaceName)
 
                deleteNics = append(deleteNics, key)
@@ -663,8 +682,6 @@
 func (n *netplan) writeNetworkdVLANDropin(nics *Interfaces) (bool, error) {
        var reload bool
 
-       googleIpv6Interfaces := vlanInterfaceListsIpv6(nics.VlanInterfaces)
-
        stat, err := os.Stat(n.networkdDropinDir)
        if err != nil {
                return false, fmt.Errorf("failed to stat systemd-networkd's 
drop-in root dir: %w", err)
@@ -678,7 +695,7 @@
                logger.Debugf("writing systemd-networkd drop-in config for VLAN 
ID: %d", iface.Vlan)
 
                var dhcp = "ipv4"
-               if slices.Contains(googleIpv6Interfaces, iface.Vlan) {
+               if iface.DHCPv6Refresh != "" {
                        dhcp = "yes"
                }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux_test.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux_test.go
        2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux_test.go
        2025-03-27 17:31:22.000000000 +0100
@@ -193,8 +193,8 @@
                                Mac: ifaces[1].HardwareAddr.String(),
                        },
                },
-               VlanInterfaces: map[int]VlanInterface{
-                       5: {
+               VlanInterfaces: map[string]VlanInterface{
+                       "0-5": {
                                VlanInterface: metadata.VlanInterface{
                                        Mac:  "mac-address",
                                        Vlan: 5,
@@ -202,7 +202,7 @@
                                },
                                ParentInterfaceID: ifaces[1].Name,
                        },
-                       6: {
+                       "0-6": {
                                VlanInterface: metadata.VlanInterface{
                                        Mac:           "mac-address2",
                                        Vlan:          6,
@@ -426,8 +426,8 @@
        }
 
        nics := &Interfaces{
-               VlanInterfaces: map[int]VlanInterface{
-                       5: {
+               VlanInterfaces: map[string]VlanInterface{
+                       "ens4-5": {
                                VlanInterface: metadata.VlanInterface{
                                        Mac:  "mac-address",
                                        Vlan: 5,
@@ -439,8 +439,11 @@
        }
 
        wantNics := &Interfaces{
-               VlanInterfaces: map[int]VlanInterface{
-                       6: {
+               VlanInterfaces: map[string]VlanInterface{
+                       "ens4-6": {
+                               VlanInterface: metadata.VlanInterface{
+                                       Vlan: 6,
+                               },
                                ParentInterfaceID: "ens4",
                        },
                },
@@ -451,6 +454,10 @@
                t.Fatalf("netplan.findVlanDiff(%+v) failed unexpectedly with 
error: %v", nics, err)
        }
 
+       if got == nil {
+               t.Fatalf("netplan.findVlanDiff(%+v) return nil, expected non 
nil", nics)
+       }
+
        if diff := cmp.Diff(wantNics, got); diff != "" {
                t.Errorf("netplan.findVlanDiff(%+v) returned diff on vlans to 
remove (-want,+got)\n%s", nics, diff)
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux.go
     2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux.go
     2025-03-27 17:31:22.000000000 +0100
@@ -289,7 +289,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
writeNetworkManagerConfigs for %s", iface)
                        continue
                }
-
+               if isInvalid(iface) {
+                       continue
+               }
                logger.Debugf("writing nmconnection file for %s", iface)
 
                configFilePath := n.networkManagerConfigFilePath(iface)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux_test.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux_test.go
        2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux_test.go
        2025-03-27 17:31:22.000000000 +0100
@@ -446,8 +446,8 @@
                EthernetInterfaces: []metadata.NetworkInterfaces{{
                        Mac: ifaces[1].HardwareAddr.String(),
                }},
-               VlanInterfaces: map[int]VlanInterface{
-                       22: {
+               VlanInterfaces: map[string]VlanInterface{
+                       "0-22": {
                                VlanInterface: metadata.VlanInterface{
                                        Mac:             "foobar",
                                        ParentInterface: 
"/computeMetadata/v1/instance/network-interfaces/0/",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux.go
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux.go
    2025-03-27 17:31:22.000000000 +0100
@@ -403,7 +403,7 @@
 
                ptr, foundPtr := ptrMap[extension]
                if !foundPtr {
-                       return requiresRestart, fmt.Errorf("regex matching 
failed, invalid etension: %s", extension)
+                       return requiresRestart, fmt.Errorf("regex matching 
failed, invalid extension: %s", extension)
                }
 
                filePath := filepath.Join(n.configDir, file.Name())
@@ -511,7 +511,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
systemdNetworkd writeEthernetConfig for %s", iface)
                        continue
                }
-
+               if isInvalid(iface) {
+                       continue
+               }
                logger.Debugf("write systemd-networkd network config for %s", 
iface)
 
                var dhcp = "ipv4"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux_test.go
 
new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux_test.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux_test.go
       2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux_test.go
       2025-03-27 17:31:22.000000000 +0100
@@ -647,10 +647,11 @@
                                dhclientTestTearDown(t)
                        })
 
+                       mapIdx := fmt.Sprintf("%s-%d", curr.parentID, 
curr.vlanInterface.Vlan)
                        nics := &Interfaces{
                                EthernetInterfaces: 
[]metadata.NetworkInterfaces{curr.ethernetInterface},
-                               VlanInterfaces: map[int]VlanInterface{
-                                       curr.vlanInterface.Vlan: 
{VlanInterface: curr.vlanInterface, ParentInterfaceID: curr.parentID},
+                               VlanInterfaces: map[string]VlanInterface{
+                                       mapIdx: {VlanInterface: 
curr.vlanInterface, ParentInterfaceID: curr.parentID},
                                },
                        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_guest_agent/network/manager/wicked_linux.go 
new/guest-agent-20250327.01/google_guest_agent/network/manager/wicked_linux.go
--- 
old/guest-agent-20250116.00/google_guest_agent/network/manager/wicked_linux.go  
    2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/google_guest_agent/network/manager/wicked_linux.go  
    2025-03-27 17:31:22.000000000 +0100
@@ -218,7 +218,9 @@
                        logger.Debugf("ManagePrimaryNIC is disabled, skipping 
wicked writeEthernetConfig for %s", iface)
                        continue
                }
-
+               if isInvalid(iface) {
+                       continue
+               }
                logger.Debugf("write enabling ifcfg-%s config", iface)
                ifcfg := n.ifcfgFilePath(iface)
 
@@ -333,7 +335,7 @@
        // for non-primary configuration files.
        for _, iface := range ifaces[1:] {
                if err := n.removeInterface(ctx, iface); err != nil {
-                       return fmt.Errorf("failed to rollback wicked ethernet 
interface: %+v", err)
+                       logger.Errorf("failed to rollback wicked ethernet 
interface: %+v", err)
                }
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/google_metadata_script_runner/main.go 
new/guest-agent-20250327.01/google_metadata_script_runner/main.go
--- old/guest-agent-20250116.00/google_metadata_script_runner/main.go   
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/google_metadata_script_runner/main.go   
2025-03-27 17:31:22.000000000 +0100
@@ -452,6 +452,10 @@
        if err == nil {
                opts.ProjectName = projectID
        }
+       createdBy, err := getMetadataKey(ctx, "/instance/attributes/created-by")
+       if err == nil {
+               opts.MIG = createdBy
+       }
 
        if err := logger.Init(ctx, opts); err != nil {
                fmt.Printf("Error initializing logger: %+v", err)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/instance_configs.cfg 
new/guest-agent-20250327.01/instance_configs.cfg
--- old/guest-agent-20250116.00/instance_configs.cfg    2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/instance_configs.cfg    2025-03-27 
17:31:22.000000000 +0100
@@ -36,6 +36,7 @@
 dhcp_command = 
 ip_forwarding = true
 setup = true
+vlan_setup_enabled = false
 
 [OSLogin]
 cert_authentication = true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/metadata/metadata.go 
new/guest-agent-20250327.01/metadata/metadata.go
--- old/guest-agent-20250116.00/metadata/metadata.go    2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/metadata/metadata.go    2025-03-27 
17:31:22.000000000 +0100
@@ -205,6 +205,7 @@
 
 // Attributes describes the project's attributes keys.
 type Attributes struct {
+       CreatedBy                 string
        BlockProjectKeys          bool
        HTTPSMDSEnableNativeStore *bool
        DisableHTTPSMdsSetup      *bool
@@ -234,6 +235,7 @@
        }
        // Unmarshal to literal JSON types before doing anything else.
        type inner struct {
+               CreatedBy                 string      `json:"created-by"`
                BlockProjectKeys          string      
`json:"block-project-ssh-keys"`
                Diagnostics               string      `json:"diagnostics"`
                DisableAccountManager     string      
`json:"disable-account-manager"`
@@ -262,6 +264,7 @@
        a.WSFCAddresses = temp.WSFCAddresses
        a.WSFCAgentPort = temp.WSFCAgentPort
        a.WindowsKeys = temp.WindowsKeys
+       a.CreatedBy = temp.CreatedBy
 
        value, err := strconv.ParseBool(temp.DisableHTTPSMdsSetup)
        if err == nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/postinst 
new/guest-agent-20250327.01/packaging/debian/postinst
--- old/guest-agent-20250116.00/packaging/debian/postinst       2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/debian/postinst       2025-03-27 
17:31:22.000000000 +0100
@@ -1,9 +1,18 @@
 #!/bin/sh -e
 
 if [ "$1" = "configure" ] ; then
-       if [ ! -f /etc/default/instance_configs.cfg ]; then 
-               cp -a 
"/usr/share/${DPKG_MAINTSCRIPT_PACKAGE}/instance_configs.cfg" /etc/default/
-       fi
+  if [ ! -f /etc/default/instance_configs.cfg ]; then
+    cp -a "/usr/share/${DPKG_MAINTSCRIPT_PACKAGE}/instance_configs.cfg" 
/etc/default/
+  fi
+
+  if [ ! -f "/usr/bin/google_guest_compat_manager" ]; then
+    if [ -f "/etc/google-guest-agent/core-plugin-enabled" ] && [ ! -z $(grep 
"true" "/etc/google-guest-agent/core-plugin-enabled") ]; then
+      # If the guest agent is disabled because core plugin is enabled, then
+      # re-enable the guest agent. Otherwise it stays disabled post-upgrade.
+      systemctl enable 'google-guest-agent.service' > /dev/null || true
+      systemctl enable 'gce-workload-cert-refresh.timer' > /dev/null || true
+    fi
+  fi
 fi
 
 #DEBHELPER#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/prerm 
new/guest-agent-20250327.01/packaging/debian/prerm
--- old/guest-agent-20250116.00/packaging/debian/prerm  1970-01-01 
01:00:00.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/debian/prerm  2025-03-27 
17:31:22.000000000 +0100
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+
+if [ "$1" = "purge" -o "$1" = "remove" ] ; then
+    systemctl stop google-guest-agent-manager >/dev/null 2>&1 || :
+    ggactl_plugin_cleanup all >/dev/null 2>&1 || :
+fi
+
+#DEBHELPER#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/rules 
new/guest-agent-20250327.01/packaging/debian/rules
--- old/guest-agent-20250116.00/packaging/debian/rules  2025-01-16 
19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/debian/rules  2025-03-27 
17:31:22.000000000 +0100
@@ -19,11 +19,18 @@
        # Binary-only package.
        dh_auto_install -- --no-source
        install -d debian/google-guest-agent/usr/share/google-guest-agent
+       sed -i "s/vlan_setup_enabled = false/vlan_setup_enabled = true/g" 
instance_configs.cfg
        install -p -m 0644 instance_configs.cfg 
debian/google-guest-agent/usr/share/google-guest-agent
        install -d debian/google-guest-agent/lib/systemd/system
        install -p -m 0644 gce-workload-cert-refresh.timer 
debian/google-guest-agent/lib/systemd/system/
-       if [[ -d google-guest-agent ]]; then\
-               install -p -m 0644 
google-guest-agent/cmd/google_guest_agent/google_guest_agent 
debian/google-guest-agent/usr/bin/google_guest_agent_manager;\
+       if [ -d google-guest-agent ]; then\
+               install -d 
debian/google-guest-agent/usr/lib/google/guest_agent;\
+               install -p -m 0755 
google-guest-agent/cmd/gce_metadata_script_runner/gce_metadata_script_runner 
debian/google-guest-agent/usr/bin/gce_metadata_script_runner;\
+               install -p -m 0755 
google-guest-agent/cmd/google_guest_compat_manager/google_guest_compat_manager 
debian/google-guest-agent/usr/bin/google_guest_compat_manager;\
+               install -p -m 0755 
google-guest-agent/cmd/google_guest_agent/google_guest_agent 
debian/google-guest-agent/usr/bin/google_guest_agent_manager;\
+               install -p -m 0755 
google-guest-agent/cmd/ggactl/ggactl_plugin_cleanup 
debian/google-guest-agent/usr/bin/ggactl_plugin_cleanup;\
+               install -p -m 0755 
google-guest-agent/cmd/core_plugin/core_plugin 
debian/google-guest-agent/usr/lib/google/guest_agent/core_plugin;\
+               install -p -m 0755 
google-guest-agent/cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner
 debian/google-guest-agent/usr/bin/gce_compat_metadata_script_runner;\
        fi
 
 override_dh_golang:
@@ -31,8 +38,13 @@
 
 override_dh_auto_build:
        dh_auto_build -O--buildsystem=golang -- -ldflags="-s -w -X 
main.version=$(VERSION)" -mod=readonly
-       if [[ -d google-guest-agent ]]; then\
+       if [ -d google-guest-agent ]; then\
+               VERSION=$(VERSION) make -C google-guest-agent 
cmd/google_guest_compat_manager/google_guest_compat_manager;\
                VERSION=$(VERSION) make -C google-guest-agent 
cmd/google_guest_agent/google_guest_agent;\
+               VERSION=$(VERSION) make -C google-guest-agent 
cmd/ggactl/ggactl_plugin_cleanup;\
+               VERSION=$(VERSION) make -C google-guest-agent 
cmd/core_plugin/core_plugin;\
+               VERSION=$(VERSION) make -C google-guest-agent 
cmd/gce_metadata_script_runner/gce_metadata_script_runner;\
+               VERSION=$(VERSION) make -C google-guest-agent 
cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner;\
        fi
 
 override_dh_installinit:
@@ -42,13 +54,15 @@
        install -d debian/google-guest-agent/lib/systemd/system
        install -p -m 0644 *.service 
debian/google-guest-agent/lib/systemd/system/
        # Don't include guest agent manager if not building with it.
-       if [[ ! -d google-guest-agent ]]; then\
-               rm -f 
debian/google-guest-agent/lib/systemd/systemd/google-guest-agent-manager.service;\
+       if [ ! -d google-guest-agent ]; then\
+               rm -f 
debian/google-guest-agent/lib/systemd/system/google-guest-compat-manager.service;\
+               rm -f 
debian/google-guest-agent/lib/systemd/system/google-guest-agent-manager.service;\
        fi
        install -d debian/google-guest-agent/lib/systemd/system-preset
        install -p -m 0644 *.preset 
debian/google-guest-agent/lib/systemd/system-preset/
        dh_systemd_enable google-guest-agent.service 
google-startup-scripts.service google-shutdown-scripts.service 
gce-workload-cert-refresh.timer
-       if [[ -d google-guest-agent ]]; then\
+       if [ -d google-guest-agent ]; then\
+               dh_systemd_enable google-guest-compat-manager.service;\
                dh_systemd_enable google-guest-agent-manager.service;\
        fi
 
@@ -56,6 +70,7 @@
        # Only perform start/stop actions for the guest agent and cert refresh 
timer.
        dh_systemd_start google-guest-agent.service
        dh_systemd_start gce-workload-cert-refresh.timer
-       if [[ -d google-guest-agent ]]; then\
+       if [ -d google-guest-agent ]; then\
+               dh_systemd_start google-guest-compat-manager.service;\
                dh_systemd_start google-guest-agent-manager.service;\
        fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/agent_install.ps1 
new/guest-agent-20250327.01/packaging/googet/agent_install.ps1
--- old/guest-agent-20250116.00/packaging/googet/agent_install.ps1      
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/googet/agent_install.ps1      
2025-03-27 17:31:22.000000000 +0100
@@ -22,6 +22,11 @@
 $manager_display_name = 'Google Compute Engine Agent Manager'
 $manager_description = 'Google Compute Engine Agent Manager'
 
+$compat_manager = 'GCEWindowsCompatManager'
+$compat_path = '"C:\Program Files\Google\Compute 
Engine\agent\GCEWindowsCompatManager.exe"'
+$compat_display_name = 'Google Compute Engine Compat Manager'
+$compat_description = 'Google Compute Engine Compat Manager'
+
 $initial_config = @'
 # GCE Instance Configuration
 
@@ -72,11 +77,19 @@
   Set-New-Service $name $display_name $description $path
   Set-ServiceConfig $name $path
 
-  # Guest Agent Manager service
+  # Guest Agent Manager and Compat Manager service
   if ($install_manager) {
+    Set-New-Service $compat_manager $compat_display_name $compat_description 
$compat_path
+    Set-ServiceConfig $compat_manager $compat_path
+
     Set-New-Service $manager_name $manager_display_name $manager_description 
$manager_path
     Set-ServiceConfig $manager_name $manager_path
   } else {
+    if (Get-Service $compat_manager -ErrorAction SilentlyContinue) {
+      Stop-Service $compat_manager
+      & sc.exe delete $compat_manager
+    }
+
     if (Get-Service $manager_name -ErrorAction SilentlyContinue) {
       Stop-Service $manager_name
       & sc.exe delete $manager_name
@@ -91,6 +104,7 @@
   Restart-Service $name -Verbose
 
   if ($install_manager) {
+    Restart-Service $compat_manager -Verbose
     Restart-Service $manager_name -Verbose
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/agent_uninstall.ps1 
new/guest-agent-20250327.01/packaging/googet/agent_uninstall.ps1
--- old/guest-agent-20250116.00/packaging/googet/agent_uninstall.ps1    
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/googet/agent_uninstall.ps1    
2025-03-27 17:31:22.000000000 +0100
@@ -15,9 +15,20 @@
 Stop-Service GCEAgent -Verbose
 & sc.exe delete GCEAgent
 
+$compat_manager = 'GCEWindowsCompatManager'
 $name = 'GCEAgentManager'
+$cleanup_exe = "C:\Program Files\Google\Compute 
Engine\agent\ggactl_plugin_cleanup.exe"
+
+# Stop and Delete compat manager.
+if (Get-Service $compat_manager -ErrorAction SilentlyContinue) {
+    Stop-Service $compat_manager -Verbose
+    & sc.exe delete $compat_manager
+}
+
+# Stop Guest Agent Manager, cleanup all plugins (if present) and delete the 
service.
 if (Get-Service $name -ErrorAction SilentlyContinue) {
     Stop-Service $name -Verbose
+    & $cleanup_exe all
     & sc.exe delete $name
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/google-compute-engine-windows.goospec
 
new/guest-agent-20250327.01/packaging/googet/google-compute-engine-windows.goospec
--- 
old/guest-agent-20250116.00/packaging/googet/google-compute-engine-windows.goospec
  2025-01-16 19:12:23.000000000 +0100
+++ 
new/guest-agent-20250327.01/packaging/googet/google-compute-engine-windows.goospec
  2025-03-27 17:31:22.000000000 +0100
@@ -7,9 +7,14 @@
   "description": "Google Compute Engine Windows agent",
   "source": "https://github.com/GoogleCloudPlatform/guest-agent/";,
   "files": {
+    "CorePlugin.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/CorePlugin.exe",
+    "GCEMetadataScriptRunner.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/GCEMetadataScriptRunner.exe",
     "GCEWindowsAgentManager.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/GCEWindowsAgentManager.exe",
+    "GCEWindowsCompatManager.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/GCEWindowsCompatManager.exe",
+    "GCECompatMetadataScripts.exe": "<ProgramFiles>/Google/Compute 
Engine/metadata_scripts/GCECompatMetadataScripts.exe",
     "GCEWindowsAgent.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/GCEWindowsAgent.exe",
     "GCEAuthorizedKeysCommand.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/GCEAuthorizedKeysCommand.exe",
+    "ggactl_plugin_cleanup.exe": "<ProgramFiles>/Google/Compute 
Engine/agent/ggactl_plugin_cleanup.exe",
     "THIRD_PARTY_LICENSES": "<ProgramFiles>/Google/Compute 
Engine/THIRD_PARTY_LICENSES/",
     "LICENSE": "<ProgramFiles>/Google/Compute Engine/agent/LICENSE.txt"
   },
@@ -36,7 +41,12 @@
   ],
   "sources": [{
       "include": [
+        "CorePlugin.exe",
+        "ggactl_plugin_cleanup.exe",
         "GCEWindowsAgent.exe",
+        "GCECompatMetadataScripts.exe",
+        "GCEWindowsCompatManager.exe",
+        "GCEMetadataScriptRunner.exe",
         "GCEWindowsAgentManager.exe",
        "GCEAuthorizedKeysCommand.exe",
         "packaging/googet/agent_install.ps1",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/run_shutdown_scripts.cmd 
new/guest-agent-20250327.01/packaging/googet/run_shutdown_scripts.cmd
--- old/guest-agent-20250116.00/packaging/googet/run_shutdown_scripts.cmd       
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/googet/run_shutdown_scripts.cmd       
2025-03-27 17:31:22.000000000 +0100
@@ -16,4 +16,8 @@
 REM Run shutdown scripts that should happen as soon as the instance
 REM begins to power down
 
-"C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCEMetadataScripts.exe" "shutdown"
+IF EXIST "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCECompatMetadataScripts.exe" (
+    "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCECompatMetadataScripts.exe" "shutdown"
+) ELSE (
+    "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCEMetadataScripts.exe" "shutdown"
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/run_startup_scripts.cmd 
new/guest-agent-20250327.01/packaging/googet/run_startup_scripts.cmd
--- old/guest-agent-20250116.00/packaging/googet/run_startup_scripts.cmd        
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/googet/run_startup_scripts.cmd        
2025-03-27 17:31:22.000000000 +0100
@@ -19,4 +19,8 @@
 REM We execute the startup script asynchronously so it may run without
 REM this three day maximum runtime limitation.
 
-start "" "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCEMetadataScripts.exe" "startup"
+IF EXIST "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCECompatMetadataScripts.exe" (
+    start "" "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCECompatMetadataScripts.exe" "startup"
+) ELSE (
+    start "" "C:\Program Files\Google\Compute 
Engine\metadata_scripts\GCEMetadataScripts.exe" "startup"
+)
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/googet/windows_agent_build.sh 
new/guest-agent-20250327.01/packaging/googet/windows_agent_build.sh
--- old/guest-agent-20250116.00/packaging/googet/windows_agent_build.sh 
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/googet/windows_agent_build.sh 
2025-03-27 17:31:22.000000000 +0100
@@ -33,11 +33,27 @@
     # This is a placeholder file for guest-agent package, 
google-compute-engine-windows.goospec
     # looks for this file during goopack packaging and will fail if not found.
     echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > GCEWindowsAgentManager.exe
+    echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > ggactl_plugin_cleanup.exe
+    echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > GCEWindowsCompatManager.exe
+    echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > CorePlugin.exe
+    echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > GCEMetadataScriptRunner.exe
+    echo "This is a placeholder file so guest agent package build without 
error. Package will have actual Guest Agent Manager executable instead if both 
repos are cloned side-by-side." > GCECompatMetadataScripts.exe
     exit 0
 fi
 
 BUILD_DIR=$(pwd)
 pushd $GUEST_AGENT_REPO
 GOOS=windows VERSION=$version make cmd/google_guest_agent/google_guest_agent
-cp cmd/google_guest_agent/google_guest_agent.exe 
$BUILD_DIR/GCEWindowsAgentManager.exe
+GOOS=windows VERSION=$version make cmd/ggactl/ggactl_plugin_cleanup
+GOOS=windows VERSION=$version make 
cmd/google_guest_compat_manager/google_guest_compat_manager
+GOOS=windows VERSION=$version make cmd/core_plugin/core_plugin
+GOOS=windows VERSION=$version make 
cmd/gce_metadata_script_runner/gce_metadata_script_runner
+GOOS=windows VERSION=$version make 
cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner
+
+cp cmd/google_guest_agent/google_guest_agent 
$BUILD_DIR/GCEWindowsAgentManager.exe
+cp cmd/ggactl/ggactl_plugin_cleanup $BUILD_DIR/ggactl_plugin_cleanup.exe
+cp cmd/google_guest_compat_manager/google_guest_compat_manager 
$BUILD_DIR/GCEWindowsCompatManager.exe
+cp cmd/core_plugin/core_plugin $BUILD_DIR/CorePlugin.exe
+cp cmd/gce_metadata_script_runner/gce_metadata_script_runner 
$BUILD_DIR/GCEMetadataScriptRunner.exe
+cp cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner 
$BUILD_DIR/GCECompatMetadataScripts.exe
 popd
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/guest-agent-20250116.00/packaging/google-guest-agent.spec 
new/guest-agent-20250327.01/packaging/google-guest-agent.spec
--- old/guest-agent-20250116.00/packaging/google-guest-agent.spec       
2025-01-16 19:12:23.000000000 +0100
+++ new/guest-agent-20250327.01/packaging/google-guest-agent.spec       
2025-03-27 17:31:22.000000000 +0100
@@ -63,6 +63,11 @@
 %if 0%{?build_plugin_manager}
 pushd %{name}-extra-%{version}/
   VERSION=%{version} make cmd/google_guest_agent/google_guest_agent
+  VERSION=%{version} make cmd/ggactl/ggactl_plugin_cleanup
+  VERSION=%{version} make 
cmd/google_guest_compat_manager/google_guest_compat_manager
+  VERSION=%{version} make cmd/core_plugin/core_plugin
+  VERSION=%{version} make 
cmd/gce_metadata_script_runner/gce_metadata_script_runner
+  VERSION=%{version} make 
cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner
 popd
 %endif
 
@@ -79,7 +84,13 @@
 
 # Compat agent, it will become google_guest_agent after the full package 
transition.
 %if 0%{?build_plugin_manager}
+install -d %{buildroot}%{_exec_prefix}/lib/google/guest_agent
+install -p -m 0755 
%{name}-extra-%{version}/cmd/gce_metadata_script_runner/gce_metadata_script_runner
 %{buildroot}%{_bindir}/gce_metadata_script_runner
 install -p -m 0755 
%{name}-extra-%{version}/cmd/google_guest_agent/google_guest_agent 
%{buildroot}%{_bindir}/google_guest_agent_manager
+install -p -m 0755 %{name}-extra-%{version}/cmd/ggactl/ggactl_plugin_cleanup 
%{buildroot}%{_bindir}/ggactl_plugin_cleanup
+install -p -m 0755 
%{name}-extra-%{version}/cmd/google_guest_compat_manager/google_guest_compat_manager
 %{buildroot}%{_bindir}/google_guest_compat_manager
+install -p -m 0755 %{name}-extra-%{version}/cmd/core_plugin/core_plugin 
%{buildroot}%{_exec_prefix}/lib/google/guest_agent/core_plugin
+install -p -m 0755 
%{name}-extra-%{version}/cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner
 %{buildroot}%{_bindir}/gce_compat_metadata_script_runner
 %endif
 
 %if 0%{?el6}
@@ -94,6 +105,7 @@
 
 %if 0%{?build_plugin_manager}
 install -p -m 0644 google-guest-agent-manager.service %{buildroot}%{_unitdir}
+install -p -m 0644 google-guest-compat-manager.service %{buildroot}%{_unitdir}
 %endif
 
 install -p -m 0644 google-startup-scripts.service %{buildroot}%{_unitdir}
@@ -110,7 +122,12 @@
 %{_bindir}/google_guest_agent
 
 %if 0%{?build_plugin_manager}
+%{_bindir}/gce_metadata_script_runner
+%{_bindir}/google_guest_compat_manager
+%{_bindir}/gce_compat_metadata_script_runner
 %{_bindir}/google_guest_agent_manager
+%{_bindir}/ggactl_plugin_cleanup
+%{_exec_prefix}/lib/google/guest_agent/core_plugin
 %endif
 
 %{_bindir}/google_metadata_script_runner
@@ -124,6 +141,7 @@
 
 %if 0%{?build_plugin_manager}
 %{_unitdir}/google-guest-agent-manager.service
+%{_unitdir}/google-guest-compat-manager.service
 %endif
 
 %{_unitdir}/google-startup-scripts.service
@@ -151,6 +169,7 @@
   systemctl enable gce-workload-cert-refresh.timer >/dev/null 2>&1 || :
 
   %if 0%{?build_plugin_manager}
+    systemctl enable google-guest-compat-manager.service >/dev/null 2>&1 || :
     systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || :
   %endif
 
@@ -159,6 +178,7 @@
     systemctl start google-guest-agent.service >/dev/null 2>&1 || :
     systemctl start gce-workload-cert-refresh.timer >/dev/null 2>&1 || :
     %if 0%{?build_plugin_manager}
+      systemctl start google-guest-compat-manager.service >/dev/null 2>&1 || :
       systemctl start google-guest-agent-manager.service >/dev/null 2>&1 || :
     %endif
   fi
@@ -166,20 +186,35 @@
 
 else
   # Package upgrade
+  %if 0%{?build_plugin_manager}
+      systemctl enable google-guest-compat-manager.service >/dev/null 2>&1 || :
+      systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || :
+  %endif
+    
   if [ -d /run/systemd/system ]; then
     systemctl daemon-reload >/dev/null 2>&1 || :
     systemctl try-restart google-guest-agent.service >/dev/null 2>&1 || :
     %if 0%{?build_plugin_manager}
-      systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || :
+      systemctl restart google-guest-compat-manager.service >/dev/null 2>&1 || 
:
       systemctl restart google-guest-agent-manager.service >/dev/null 2>&1 || :
     %endif
   fi
+
+  # Re-enable the guest agent service if core plugin was enabled, since the
+  # service would have been disabled, and stay disabled post-upgrade.
+  if [ ! -f "/usr/bin/google_guest_compat_manager" ]; then
+    if [ -f "/etc/google-guest-agent/core-plugin-enabled" ] && [ ! -z $(grep 
"true" "/etc/google-guest-agent/core-plugin-enabled") ]; then
+      systemctl enable google-guest-agent.service > /dev/null 2>&1 || :
+      systemctl enable gce-workload-cert-refresh.timer > /dev/null 2>&1 || :
+    fi
+  fi
 fi
 
 %preun
 if [ $1 -eq 0 ]; then
   # Package removal, not upgrade
   %if 0%{?build_plugin_manager}
+    systemctl --no-reload disable google-guest-compat-manager.service 
>/dev/null 2>&1 || :
     systemctl --no-reload disable google-guest-agent-manager.service 
>/dev/null 2>&1 || :
   %endif
   systemctl --no-reload disable google-guest-agent.service >/dev/null 2>&1 || :
@@ -189,7 +224,9 @@
   if [ -d /run/systemd/system ]; then
     systemctl stop google-guest-agent.service >/dev/null 2>&1 || :
     %if 0%{?build_plugin_manager}
+      systemctl stop google-guest-compat-manager.service >/dev/null 2>&1 || :
       systemctl stop google-guest-agent-manager.service >/dev/null 2>&1 || :
+      ggactl_plugin_cleanup all >/dev/null 2>&1 || :
     %endif
   fi
 fi

++++++ vendor.tar.gz ++++++
++++ 24360 lines of diff (skipped)

Reply via email to