Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
5053f62
updated uap plugin entrypoint name
XuechunHou Jan 8, 2026
40fff6d
Merge branch 'master' of github.com:GoogleCloudPlatform/ops-agent
XuechunHou Jan 22, 2026
9cc0b5b
Merge branch 'master' of github.com:GoogleCloudPlatform/ops-agent
XuechunHou Jan 29, 2026
c5d8dac
pulled the latest fluentbit and fixed the docker build for sles16
XuechunHou Jan 30, 2026
d0a99e3
reverted changes in fluent_bit.sh
XuechunHou Jan 30, 2026
45f6acd
updated transformation test
XuechunHou Jan 30, 2026
07ec11a
rebuilt otel and reran transformation test
XuechunHou Jan 30, 2026
e56e572
updated regex and reran transformation test
XuechunHou Jan 30, 2026
20b57f8
fixed regex
XuechunHou Jan 30, 2026
29170e9
pulled the latest otelopscol
XuechunHou Jan 30, 2026
ac265ff
fixed project.yaml
XuechunHou Jan 30, 2026
08bcdf2
use fluentbit v0.1.14
XuechunHou Jan 30, 2026
972d7a7
Merge branch 'master' into sles16
LujieDuan Mar 12, 2026
2a7c634
Testing setting up python for gcloud
LujieDuan Mar 12, 2026
f839f45
Setup Python for gcloud on sles 16 - again
LujieDuan Mar 12, 2026
379d9a6
Update how to set swap space on SLES 16
LujieDuan Mar 16, 2026
62ec6d1
Pick up gce_testing.go WaitForStop change
LujieDuan Mar 16, 2026
4b16ac5
Update rpm building spec for sles 16
LujieDuan Mar 18, 2026
1990fe6
Trying anohter way to config systemd preset
LujieDuan Mar 18, 2026
f84484e
Update gce_testing.go
LujieDuan Mar 19, 2026
2e65ba2
Guard the systemd_pre to only get called on SLES 16
LujieDuan Mar 19, 2026
62e2b2a
Update gce_testing to main head
LujieDuan Mar 23, 2026
f734951
Merge branch 'master' into sles16
LujieDuan Mar 23, 2026
ce88500
Upgrade prokect to go1.25
LujieDuan Mar 23, 2026
5075a33
Merge branch 'master' into sles16
LujieDuan Mar 24, 2026
40f761b
Revert temoporary changes and ready for review
LujieDuan Mar 24, 2026
37c449f
Revert extra integration change and will add it back later separately
LujieDuan Mar 24, 2026
008f12b
Revert extra integration change and will add it back later separately…
LujieDuan Mar 24, 2026
95a2e52
Using sle_version for spec file
LujieDuan Mar 24, 2026
baa0482
Update to use suse_version for SLES 16
LujieDuan Mar 24, 2026
ecd5a0c
Revert "Revert temoporary changes and ready for review"
LujieDuan Mar 24, 2026
c67a191
Add test to make sure system service got remove upon uninstalling
LujieDuan Mar 25, 2026
b34a1ba
sles 12 does not support %elif
LujieDuan Mar 25, 2026
d760f4f
Uninstall properly for SLES 16
LujieDuan Mar 25, 2026
864f9c9
Fix suse_version check with 1600 value
LujieDuan Mar 25, 2026
125ed5d
Run SLES 15 tests again
LujieDuan Mar 25, 2026
beba1f1
Revert "Run SLES 15 tests again"
LujieDuan Mar 25, 2026
766665d
Reapply "Revert temoporary changes and ready for review"
LujieDuan Mar 25, 2026
730eede
Merge branch 'master' into sles16
LujieDuan Mar 25, 2026
856d3d6
Merge branch 'master' into sles16
rafaelwestphal Mar 30, 2026
4161d1b
Add wait time for uninstalltion to remove flakeness
LujieDuan Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -921,6 +921,111 @@ COPY --from=sles15-build /tmp/google-cloud-ops-agent.tgz /google-cloud-ops-agent
COPY --from=sles15-build /google-cloud-ops-agent*.rpm /
COPY --from=sles15-build /google-cloud-ops-agent-plugin*.tar.gz /

# ======================================
# Build Ops Agent for sles-16
# ======================================

FROM opensuse/leap:16.0 AS sles16-build-base
ARG OPENJDK_MAJOR_VERSION

RUN set -x; zypper -n refresh && \
zypper -n update && \
zypper -n install git systemd autoconf automake flex libtool libcurl-devel libopenssl-devel libyajl-devel gcc gcc-c++ zlib-devel rpm-build expect cmake systemd-devel systemd-rpm-macros unzip zip 'bison>3'
# Allow fluent-bit to find systemd
RUN ln -fs /usr/lib/systemd /lib/systemd
COPY --from=openjdk-install /usr/local/java-${OPENJDK_MAJOR_VERSION}-openjdk/ /usr/local/java-${OPENJDK_MAJOR_VERSION}-openjdk
ENV JAVA_HOME /usr/local/java-${OPENJDK_MAJOR_VERSION}-openjdk/
COPY --from=cmake-install-recent /cmake.sh /cmake.sh
RUN set -x; bash /cmake.sh --skip-license --prefix=/usr/local


SHELL ["/bin/bash", "-c"]

# Install golang
ARG TARGETARCH
ARG GO_VERSION
ADD https://go.dev/dl/go${GO_VERSION}.linux-${TARGETARCH}.tar.gz /tmp/go${GO_VERSION}.tar.gz
RUN set -xe; \
tar -xf /tmp/go${GO_VERSION}.tar.gz -C /usr/local
ENV PATH="${PATH}:/usr/local/go/bin"


FROM sles16-build-base AS sles16-build-otel
WORKDIR /work
# Download golang deps
COPY ./submodules/opentelemetry-operations-collector/go.mod ./submodules/opentelemetry-operations-collector/go.sum submodules/opentelemetry-operations-collector/
RUN cd submodules/opentelemetry-operations-collector && go mod download

COPY ./submodules/opentelemetry-java-contrib submodules/opentelemetry-java-contrib
# Install gradle. The first invocation of gradlew does this
RUN cd submodules/opentelemetry-java-contrib && ./gradlew --no-daemon -Djdk.lang.Process.launchMechanism=vfork tasks
COPY ./submodules/opentelemetry-operations-collector submodules/opentelemetry-operations-collector
COPY ./builds/otel.sh .
RUN \
unset OTEL_TRACES_EXPORTER && \
unset OTEL_EXPORTER_OTLP_TRACES_ENDPOINT && \
unset OTEL_EXPORTER_OTLP_TRACES_PROTOCOL && \
./otel.sh /work/cache/

FROM sles16-build-base AS sles16-build-fluent-bit
WORKDIR /work
COPY ./submodules/fluent-bit submodules/fluent-bit
COPY ./builds/fluent_bit.sh .
RUN ./fluent_bit.sh /work/cache/


FROM sles16-build-base AS sles16-build-systemd
WORKDIR /work
COPY ./systemd systemd
COPY ./builds/systemd.sh .
RUN ./systemd.sh /work/cache/


FROM sles16-build-base AS sles16-build-golang-base
WORKDIR /work
COPY go.mod go.sum ./
# Fetch dependencies
RUN go mod download
COPY confgenerator confgenerator
COPY apps apps
COPY internal internal


FROM sles16-build-golang-base AS sles16-build-wrapper
WORKDIR /work
COPY cmd/agent_wrapper cmd/agent_wrapper
COPY ./builds/agent_wrapper.sh .
RUN ./agent_wrapper.sh /work/cache/


FROM sles16-build-golang-base AS sles16-build
WORKDIR /work
COPY . /work

# Run the build script once to build the ops agent engine to a cache
RUN mkdir -p /tmp/cache_run/golang && cp -r . /tmp/cache_run/golang
WORKDIR /tmp/cache_run/golang
RUN ./pkg/rpm/build.sh &> /dev/null || true
WORKDIR /work

COPY ./confgenerator/default-config.yaml /work/cache/etc/google-cloud-ops-agent/config.yaml
COPY --from=sles16-build-otel /work/cache /work/cache
COPY --from=sles16-build-fluent-bit /work/cache /work/cache
COPY --from=sles16-build-systemd /work/cache /work/cache
COPY --from=sles16-build-wrapper /work/cache /work/cache
RUN ./pkg/rpm/build.sh

COPY cmd/ops_agent_uap_plugin cmd/ops_agent_uap_plugin
COPY ./builds/ops_agent_plugin.sh .
RUN ./ops_agent_plugin.sh /work/cache/
RUN ./pkg/plugin/build.sh /work/cache sles16


FROM scratch AS sles16
COPY --from=sles16-build /tmp/google-cloud-ops-agent.tgz /google-cloud-ops-agent-sles-16.tgz
COPY --from=sles16-build /google-cloud-ops-agent*.rpm /
COPY --from=sles16-build /google-cloud-ops-agent-plugin*.tar.gz /

# ======================================
# Build Ops Agent for ubuntu-jammy
# ======================================
Expand Down Expand Up @@ -1230,6 +1335,7 @@ COPY --from=bullseye /* /
COPY --from=trixie /* /
COPY --from=sles12 /* /
COPY --from=sles15 /* /
COPY --from=sles16 /* /
COPY --from=jammy /* /
COPY --from=noble /* /
COPY --from=questing /* /
12 changes: 12 additions & 0 deletions dockerfiles/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,18 @@ RUN ln -fs /usr/lib/systemd /lib/systemd` + installJava + installCMake,
tar_distro_name: "sles-15",
package_extension: "rpm",
},
{
from_image: "opensuse/leap:16.0",
target_name: "sles16",
install_packages: `RUN set -x; zypper -n refresh && \
zypper -n update && \
zypper -n install git systemd autoconf automake flex libtool libcurl-devel libopenssl-devel libyajl-devel gcc gcc-c++ zlib-devel rpm-build expect cmake systemd-devel systemd-rpm-macros unzip zip 'bison>3'
# Allow fluent-bit to find systemd
RUN ln -fs /usr/lib/systemd /lib/systemd` + installJava + installCMake,
package_build: "RUN ./pkg/rpm/build.sh",
tar_distro_name: "sles-16",
package_extension: "rpm",
},
{
from_image: "ubuntu:jammy",
target_name: "jammy",
Expand Down
66 changes: 64 additions & 2 deletions integration_test/ops_agent_test/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2593,12 +2593,23 @@ func testDefaultMetrics(ctx context.Context, t *testing.T, logger *log.Logger, v
if !gce.IsWindows(vm.ImageSpec) {
// Enable swap file: https://linuxize.com/post/create-a-linux-swap-file/
// We do this so that swap file metrics will show up.
_, err := gce.RunRemotely(ctx, logger, vm, strings.Join([]string{
swapCmds := []string{
"sudo dd if=/dev/zero of=/swapfile bs=1024 count=102400",
"sudo chmod 600 /swapfile",
"(sudo mkswap /swapfile || sudo /usr/sbin/mkswap /swapfile)",
"(sudo swapon /swapfile || sudo /usr/sbin/swapon /swapfile)",
}, " && "))
}

isSles16 := strings.Contains(vm.ImageSpec, "sles-16")
if isSles16 {
// SLES 16 uses btrfs by default, which does not support swapfiles created via dd without special handling.
// https://www.suse.com/support/kb/doc/?id=000019943
swapCmds = []string{
"sudo btrfs filesystem mkswapfile --size 100M --uuid clear /swapfile",
"(sudo swapon /swapfile || sudo /usr/sbin/swapon /swapfile)",
}
}
_, err := gce.RunRemotely(ctx, logger, vm, strings.Join(swapCmds, " && "))
if err != nil {
t.Fatalf("Failed to enable swap file: %v", err)
}
Expand Down Expand Up @@ -6277,6 +6288,57 @@ func TestOpsAgentSigning(t *testing.T) {
})
}

// TestUninstallRemovesService tests to make sure the agent service is removed
// when the agent is uninstalled
func TestUninstallRemovesService(t *testing.T) {
t.Parallel()
gce.RunForEachImage(t, func(t *testing.T, imageSpec string) {
t.Parallel()
if gce.IsOpsAgentUAPPlugin() {
t.Skip("Uninstall test not supported for UAP plugin.")
}
ctx, logger, vm := setupMainLogAndVM(t, imageSpec)

// Install the agent
if err := agents.SetupOpsAgent(ctx, logger, vm, ""); err != nil {
t.Fatal(err)
}

// Uninstall the agent
var uninstallCmd string
if gce.IsWindows(imageSpec) {
uninstallCmd = "googet -noconfirm remove google-cloud-ops-agent"
} else if strings.Contains(imageSpec, "sles") || strings.Contains(imageSpec, "suse") {
uninstallCmd = "sudo zypper remove -y google-cloud-ops-agent"
} else if gce.IsRpm(imageSpec) {
uninstallCmd = "sudo yum remove -y google-cloud-ops-agent"
} else {
uninstallCmd = "sudo DEBIAN_FRONTEND=noninteractive apt-get purge -y google-cloud-ops-agent"
}

if _, err := gce.RunRemotely(ctx, logger, vm, uninstallCmd); err != nil {
t.Fatalf("Failed to uninstall Ops Agent: %v", err)
}

// Give systemd some time to clean up the service.
// Sometimes the service enters a "failed" state with "Loaded: not-found"
// while it's being stopped/uninstalled, and it takes a bit for systemd
// to fully remove it from memory.
time.Sleep(60 * time.Second)

var checkServiceCmd string
if gce.IsWindows(imageSpec) {
checkServiceCmd = "if (Get-Service google-cloud-ops-agent* -ErrorAction SilentlyContinue) { Write-Output 'Service exists'; exit 1 }"
} else {
checkServiceCmd = `output=$(systemctl status 'google-cloud-ops-agent*' 2>/dev/null); if [ -n "$output" ]; then echo "Service exists: $output"; exit 1; fi`
}

if out, err := gce.RunRemotely(ctx, logger, vm, checkServiceCmd); err != nil {
t.Fatalf("Service still exists after uninstall, or error checking status: %v. Output: %s", err, out.Stdout)
}
})
}

func TestMain(m *testing.M) {
code := m.Run()
gce.CleanupKeysOrDie()
Expand Down
23 changes: 17 additions & 6 deletions pkg/rpm/google-cloud-ops-agent.spec
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
%if 0%{?sle_version} > 0
# we expect the distro suffix
%if 0%{?suse_version} >= 1600
# On OpenSUSE 16, sle_version is defined as literal string sle_version, and the
# if check will cause an infinite expanding loop - So we check suse_version first
%global dist .sles%(expr substr %{suse_version} 1 2)
%else
%if 0%{?sle_version} > 0
%global dist .sles%(expr substr %{sle_version} 1 2)
%if %{sle_version} <= 12
# systemd macros have different names
%global systemd_post %{service_add_post %1}
%global systemd_preun %{service_del_preun %1}
%global systemd_postun %{service_del_postun %1}
%endif
%endif

Expand Down Expand Up @@ -52,8 +52,14 @@ BUILD_DISTRO=${build_distro#.} DESTDIR="%{buildroot}" ./build.sh
%{_unitdir}/%{name}*
%{_unitdir}-preset/*-%{name}*

%pre
%if 0%{?suse_version} >= 1600
%systemd_pre google-cloud-ops-agent.service
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

%endif

%post
%systemd_post google-cloud-ops-agent.service

# rhel7 systemctl does not support --value
if [ "$(systemctl show -p LoadState google-cloud-ops-agent.target 2>/dev/null || :)" = "LoadState=loaded" ]; then
systemctl stop google-cloud-ops-agent.target > /dev/null 2>&1 || :
Expand All @@ -77,6 +83,11 @@ fi
%preun
%systemd_preun google-cloud-ops-agent.service

# SLES 16 systemd_preun does not automatically stop the service on uninstallation
if [ $1 -eq 0 ]; then
systemctl stop google-cloud-ops-agent.service >/dev/null 2>&1 || :
fi

%postun
%systemd_postun_with_restart google-cloud-ops-agent.service

Expand Down
Loading