diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh index 30d093cf515dfc..ebdcdeb0d81dce 100755 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh @@ -289,16 +289,16 @@ apply_elastic_agent_config() { local decoded_ingest_api_key=$(echo "$ingest_api_key_encoded" | base64 -d) # Verify that the downloaded archive contains the expected `elastic-agent.yml` file - tar --list --file "$elastic_agent_tmp_config_path" --include 'elastic-agent.yml' >/dev/null && + tar --list --file "$elastic_agent_tmp_config_path" | grep "$(basename "$elastic_agent_config_path")" >/dev/null && # Remove existing config file including `inputs.d` directory rm -rf "$elastic_agent_config_path" "$(dirname "$elastic_agent_config_path")/inputs.d" && # Extract new config files from downloaded archive - tar --extract --file "$elastic_agent_tmp_config_path" --include 'elastic-agent.yml' --include 'inputs.d/*.yml' --directory "$(dirname "$elastic_agent_config_path")" && + tar --extract --file "$elastic_agent_tmp_config_path" --directory "$(dirname "$elastic_agent_config_path")" && # Replace placeholder with the Ingest API key - sed -i '' "s/\${API_KEY}/$decoded_ingest_api_key/" "$elastic_agent_config_path" + sed -i='' "s/\${API_KEY}/$decoded_ingest_api_key/" "$elastic_agent_config_path" if [ "$?" -eq 0 ]; then printf "\e[1;32m✓\e[0m %s\n" "Config written to:" - tar --list --file "$elastic_agent_tmp_config_path" --include 'elastic-agent.yml' --include 'inputs.d/*.yml' | while read -r file; do + tar --list --file "$elastic_agent_tmp_config_path" | grep '\.yml$' | while read -r file; do echo " - $(dirname "$elastic_agent_config_path")/$file" done diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts index 1589269d99aa8d..229ce3bf252d0e 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts @@ -263,9 +263,12 @@ const createFlowRoute = createObservabilityOnboardingServerRoute({ * * The request format is TSV (tab-separated values) to simplify parsing in bash. * - * The response format is either a YAML file or a tarball containing the Elastic Agent + * The response format is either a YAML file or a tar archive containing the Elastic Agent * configuration, depending on the `Accept` header. * + * Errors during installation are ignore unless all integrations fail to install. When that happens + * a 500 Internal Server Error is returned with the first error message. + * * Example request: * * ```text @@ -335,10 +338,21 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ let installedIntegrations: InstalledIntegration[] = []; try { - installedIntegrations = await ensureInstalledIntegrations( + const settledResults = await ensureInstalledIntegrations( integrationsToInstall, packageClient ); + installedIntegrations = settledResults.reduce((acc, result) => { + if (result.status === 'fulfilled') { + acc.push(result.value); + } + return acc; + }, []); + // Errors during installation are ignore unless all integrations fail to install. When that happens + // a 500 Internal Server Error is returned with the first error message. + if (!installedIntegrations.length) { + throw (settledResults[0] as PromiseRejectedResult).reason; + } } catch (error) { if (error instanceof FleetUnauthorizedError) { return response.forbidden({ @@ -401,8 +415,8 @@ export type IntegrationToInstall = RegistryIntegrationToInstall | CustomIntegrat async function ensureInstalledIntegrations( integrationsToInstall: IntegrationToInstall[], packageClient: PackageClient -): Promise { - return Promise.all( +): Promise>> { + return Promise.allSettled( integrationsToInstall.map(async (integration) => { const { pkgName, installSource } = integration;