diff --git a/install_script.sh.template b/install_script.sh.template index 90e5c344..092cec77 100644 --- a/install_script.sh.template +++ b/install_script.sh.template @@ -691,6 +691,38 @@ function remove_existing_datadog_installer_package() { return "$exit_status" } +function remove_existing_datadog_agent_ddot_package() { + local sudo_cmd="$1" + local os="$2" + + local exit_status=0 + if [ "$os" == "Debian" ]; then + $sudo_cmd apt list --installed "datadog-agent-ddot" 2>/dev/null | grep -q "datadog-agent-ddot" || exit_status=$? + elif [ "$os" == "Red Hat" ]; then + rpm -q datadog-agent-ddot || exit_status=$? + elif [ "$os" == "SUSE" ]; then + rpm -q datadog-agent-ddot || exit_status=$? + else + return 0 + fi + + if [ "$exit_status" -ne 0 ]; then + return 0 + fi + + echo -e "\033[33mRemoving legacy datadog-agent-ddot package before upgrade...\n\033[0m" + exit_status=0 + if [ "$os" == "Debian" ]; then + $sudo_cmd apt-get remove -y --force-yes "datadog-agent-ddot" || exit_status=$? + elif [ "$os" == "Red Hat" ]; then + $sudo_cmd yum -y remove "datadog-agent-ddot" || exit_status=$? + elif [ "$os" == "SUSE" ]; then + $sudo_cmd zypper --non-interactive --no-refresh remove "datadog-agent-ddot" || exit_status=$? + fi + + return "$exit_status" +} + function remove_existing_packages_for_fips_flavor() { local sudo_cmd="$1" local os="$2" @@ -1241,9 +1273,13 @@ if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then report_telemetry exit 1; fi - # Starting from 7.78.0, DDOT is installed by the Agent post-install script - if [ -n "$agent_minor_version_without_patch" ] && [ "${agent_minor_version_without_patch}" -ge 78 ]; then - DD_OTELCOLLECTOR_ENABLED= + + # For version < 7.78, DDOT is not installed by the Agent post-install script + ddot_installed_by_agent= + # Starting from 7.78.0, DDOT is installed by the Agent post-install script => no need to install it manually after + # If the agent version is not set, we consider that this is the latest version, thus >= 78 + if [ -z "$agent_minor_version_without_patch" ] || [ "${agent_minor_version_without_patch}" -ge 78 ]; then + ddot_installed_by_agent=true fi fi @@ -1335,7 +1371,7 @@ if [ "$OS" == "Red Hat" ]; then # if some packages were previously pinned (using excludepkgs) # this will unpin them as a side effect $sudo_cmd sh -c "echo -e '[datadog]\nname = Datadog, Inc.\nbaseurl = https://${yum_url}/${yum_version_path}/${ARCHI}/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=${rpm_repo_gpgcheck}\npriority=1\ngpgkey=${gpgkeys}' > /etc/yum.repos.d/datadog.repo" - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then $sudo_cmd sh -c "echo -e '[datadog-ddot]\nname = Datadog, Inc.\nbaseurl = https://${yum_url}/${ddot_yum_version_path}/${ARCHI}/\nenabled=0\ngpgcheck=1\nrepo_gpgcheck=${rpm_repo_gpgcheck}\npriority=1\ngpgkey=${gpgkeys}' > /etc/yum.repos.d/datadog-ddot.repo" fi @@ -1373,6 +1409,9 @@ if [ "$OS" == "Red Hat" ]; then remove_existing_packages_for_fips_flavor "$sudo_cmd" "$OS" fi remove_existing_datadog_installer_package "$sudo_cmd" "$OS" + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -n "$ddot_installed_by_agent" ]; then + remove_existing_datadog_agent_ddot_package "$sudo_cmd" "$OS" + fi # Complete package_sources_setup end_stage 0 "$(cat <<-END | tr -d '\n' @@ -1383,15 +1422,15 @@ END # packages can be empty if no_agent is set if [ ${#packages[@]} -ne 0 ]; then - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then echo -e " \033[33mInstalling package(s): ${packages[*]} ${ddot_package}\n\033[0m" else echo -e " \033[33mInstalling package(s): ${packages[*]}\n\033[0m" fi # yum has a default retry of 10 https://github.com/Distrotech/yum/blob/f4e54aeed297158c563828aa3ebb93d0c8ce7e38/docs/yum.conf.5#L364-L366 - $sudo_cmd bash -c "SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} DATADOG_TRACE_ID=${DATADOG_TRACE_ID} DATADOG_PARENT_ID=${DATADOG_PARENT_ID} yum -y --disablerepo='*' --enablerepo='datadog' install $dnf_flag ${packages[*]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) || $sudo_cmd bash -c "SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} yum -y install $dnf_flag ${packages[*]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + $sudo_cmd bash -c "DD_OTELCOLLECTOR_ENABLED='${DD_OTELCOLLECTOR_ENABLED}' DD_API_KEY='${apikey}' DD_SITE='${site}' DD_INSTALLER_REGISTRY_URL='${DD_INSTALLER_REGISTRY_URL}' SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} DATADOG_TRACE_ID=${DATADOG_TRACE_ID} DATADOG_PARENT_ID=${DATADOG_PARENT_ID} yum -y --disablerepo='*' --enablerepo='datadog' install $dnf_flag ${packages[*]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) || $sudo_cmd bash -c "DD_OTELCOLLECTOR_ENABLED='${DD_OTELCOLLECTOR_ENABLED}' DD_API_KEY='${apikey}' DD_SITE='${site}' DD_INSTALLER_REGISTRY_URL='${DD_INSTALLER_REGISTRY_URL}' SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} yum -y install $dnf_flag ${packages[*]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then $sudo_cmd bash -c "SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} DATADOG_TRACE_ID=${DATADOG_TRACE_ID} DATADOG_PARENT_ID=${DATADOG_PARENT_ID} yum -y --disablerepo='*' --enablerepo='datadog-ddot' install $dnf_flag ${ddot_package}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) || $sudo_cmd bash -c "SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} yum -y install $dnf_flag ${ddot_package}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) fi @@ -1456,7 +1495,7 @@ elif [ "$OS" == "Debian" ]; then $sudo_cmd sh -c "echo 'deb [signed-by=${apt_usr_share_keyring}] https://${apt_url}/ ${apt_repo_version}' > /etc/apt/sources.list.d/datadog.list" $sudo_cmd sh -c "chmod a+r /etc/apt/sources.list.d/datadog.list" - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then printf "\033[34m\n* Installing APT package sources for Datadog DDOT\n\033[0m\n" $sudo_cmd sh -c "echo 'deb [signed-by=${apt_usr_share_keyring}] https://${apt_url}/ ${ddot_apt_repo_version}' > /etc/apt/sources.list.d/datadog-ddot.list" $sudo_cmd sh -c "chmod a+r /etc/apt/sources.list.d/datadog-ddot.list" @@ -1507,7 +1546,7 @@ If the failing repository is Datadog, please contact Datadog support. ***** " $sudo_cmd apt-get update -o Dir::Etc::sourcelist="sources.list.d/datadog.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then $sudo_cmd apt-get update -o Dir::Etc::sourcelist="sources.list.d/datadog-ddot.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" $sudo_cmd mv /etc/apt/sources.list.d/datadog-ddot.list /etc/apt/sources.list.d/datadog-ddot.list.disabled fi @@ -1540,13 +1579,16 @@ If the cause is unclear, please contact Datadog support. remove_existing_packages_for_fips_flavor "$sudo_cmd" "$OS" fi remove_existing_datadog_installer_package "$sudo_cmd" "$OS" + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -n "$ddot_installed_by_agent" ]; then + remove_existing_datadog_agent_ddot_package "$sudo_cmd" "$OS" + fi if [ "$agent_flavor" == "datadog-agent" ]; then # Old version of the install scripts created a __pycache__ directory in the python-scripts directory $sudo_cmd rm -rf "/opt/datadog-agent/python-scripts/__pycache__" fi - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then echo -e " \033[33mInstalling package(s): ${packages[*]} ${ddot_package}\n\033[0m" else echo -e " \033[33mInstalling package(s): ${packages[*]}\n\033[0m" @@ -1567,8 +1609,8 @@ END )" start_stage "install_agent_packages" - $sudo_cmd bash -c "POLICYRCD='${POLICYRCD}' apt-get install -o Acquire::Retries='5' -y --force-yes ${packages[*]} 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2)" - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + $sudo_cmd bash -c "DD_OTELCOLLECTOR_ENABLED='${DD_OTELCOLLECTOR_ENABLED}' DD_API_KEY='${apikey}' DD_SITE='${site}' DD_INSTALLER_REGISTRY_URL='${DD_INSTALLER_REGISTRY_URL}' POLICYRCD='${POLICYRCD}' apt-get install -o Acquire::Retries='5' -y --force-yes ${packages[*]} 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2)" + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then $sudo_cmd mv /etc/apt/sources.list.d/datadog-ddot.list.disabled /etc/apt/sources.list.d/datadog-ddot.list $sudo_cmd bash -c "POLICYRCD='${POLICYRCD}' apt-get install -o Acquire::Retries='5' -y --force-yes ${ddot_package} 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2)" $sudo_cmd mv /etc/apt/sources.list.d/datadog-ddot.list /etc/apt/sources.list.d/datadog-ddot.list.disabled @@ -1653,7 +1695,7 @@ elif [ "$OS" == "SUSE" ]; then echo -e "\033[34m\n* Installing YUM Repository for Datadog\n\033[0m" $sudo_cmd sh -c "echo -e '[datadog]\nname=datadog\nenabled=1\nbaseurl=https://${yum_url}/suse/${yum_version_path}/${ARCHI}\ntype=rpm-md\ngpgcheck=1\nrepo_gpgcheck=${rpm_repo_gpgcheck}\ngpgkey=${gpgkeys}' > /etc/zypp/repos.d/datadog.repo" - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then echo -e "\033[34m\n* Installing YUM Repository for DDOT\n\033[0m" $sudo_cmd sh -c "echo -e '[datadog-ddot]\nname=datadog-ddot\nenabled=0\nbaseurl=https://${yum_url}/suse/${ddot_yum_version_path}/${ARCHI}\ntype=rpm-md\ngpgcheck=1\nrepo_gpgcheck=${rpm_repo_gpgcheck}\ngpgkey=${gpgkeys}' > /etc/zypp/repos.d/datadog-ddot.repo" fi @@ -1661,7 +1703,7 @@ elif [ "$OS" == "SUSE" ]; then echo -e "\033[34m\n* Refreshing repositories\n\033[0m" $sudo_cmd zypper --non-interactive --no-gpg-checks refresh datadog - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then $sudo_cmd zypper --non-interactive --no-gpg-checks refresh datadog-ddot fi @@ -1723,6 +1765,9 @@ elif [ "$OS" == "SUSE" ]; then remove_existing_packages_for_fips_flavor "$sudo_cmd" "$OS" fi remove_existing_datadog_installer_package "$sudo_cmd" "$OS" + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -n "$ddot_installed_by_agent" ]; then + remove_existing_datadog_agent_ddot_package "$sudo_cmd" "$OS" + fi # Complete package_sources_setup end_stage 0 "$(cat <<-END | tr -d '\n' @@ -1731,19 +1776,19 @@ END )" start_stage "install_agent_packages" if [ ${#packages[@]} -ne 0 ]; then - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then echo -e " \033[33mInstalling package(s): ${packages[*]} ${ddot_package}\n\033[0m" else echo -e " \033[33mInstalling package(s): ${packages[*]}\n\033[0m" fi # Not yet retry mechanism in zypper, see https://github.com/openSUSE/zypper/issues/420 if [ -z "$sudo_cmd" ]; then - ZYPP_RPM_DEBUG="${ZYPP_RPM_DEBUG:-0}" SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} zypper --non-interactive --no-refresh install "${packages[@]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) ||: + DD_OTELCOLLECTOR_ENABLED="${DD_OTELCOLLECTOR_ENABLED}" DD_API_KEY="${apikey}" DD_SITE="${site}" DD_INSTALLER_REGISTRY_URL="${DD_INSTALLER_REGISTRY_URL}" ZYPP_RPM_DEBUG="${ZYPP_RPM_DEBUG:-0}" SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} zypper --non-interactive --no-refresh install "${packages[@]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) ||: else - $sudo_cmd ZYPP_RPM_DEBUG="${ZYPP_RPM_DEBUG:-0}" SYSTEMD_OFFLINE="${SYSTEMD_OFFLINE:-0}" zypper --non-interactive --no-refresh install "${packages[@]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) ||: + $sudo_cmd DD_OTELCOLLECTOR_ENABLED="${DD_OTELCOLLECTOR_ENABLED}" DD_API_KEY="${apikey}" DD_SITE="${site}" DD_INSTALLER_REGISTRY_URL="${DD_INSTALLER_REGISTRY_URL}" ZYPP_RPM_DEBUG="${ZYPP_RPM_DEBUG:-0}" SYSTEMD_OFFLINE="${SYSTEMD_OFFLINE:-0}" zypper --non-interactive --no-refresh install "${packages[@]}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) ||: fi - if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then + if [ -n "$DD_OTELCOLLECTOR_ENABLED" ] && [ -z "$ddot_installed_by_agent" ]; then if [ -z "$sudo_cmd" ]; then ZYPP_RPM_DEBUG="${ZYPP_RPM_DEBUG:-0}" SYSTEMD_OFFLINE=${SYSTEMD_OFFLINE:-0} zypper --non-interactive --no-refresh install "${ddot_package}" 2> >($sudo_cmd tee /tmp/ddog_install_error_msg >&2) ||: else @@ -2222,6 +2267,8 @@ elif [ ! "$no_agent" ]; then fi # DDOT configuration update +# Even if DDOT is installed by the agent, update_ddot still needs to run +# to enable otelcollector in datadog.yaml after datadog.yaml is written. if [ -n "$DD_OTELCOLLECTOR_ENABLED" ]; then update_ddot "$sudo_cmd" "$config_file" manage_otel_config "$sudo_cmd" "$otel_config_file" "$apikey" "$site" diff --git a/test/dockertest.sh b/test/dockertest.sh index 7632ba34..fdb26af0 100755 --- a/test/dockertest.sh +++ b/test/dockertest.sh @@ -84,6 +84,7 @@ docker run --rm --platform "$PLATFORM" \ -e DD_COMPLIANCE_CONFIG_ENABLED="${DD_COMPLIANCE_CONFIG_ENABLED}" \ -e DD_RUNTIME_SECURITY_CONFIG_ENABLED="${DD_RUNTIME_SECURITY_CONFIG_ENABLED}" \ -e DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED="${DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED}" \ + -e DD_OTELCOLLECTOR_ENABLED="${DD_OTELCOLLECTOR_ENABLED}" \ -e DD_INSTALL_ONLY=true \ -e DD_AGENT_MINOR_VERSION="${MINOR_VERSION}" \ -e DD_AGENT_FLAVOR="${FLAVOR}" \