From 007e32f2f5ad34691d323619bebf53c0ba081f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Sun, 25 Jun 2023 10:14:59 +0200 Subject: [PATCH] feat: show docker version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Show the version of Docker CLI same as way as for Podman CLI. In the future, they might be able to show the server version. Signed-off-by: Anders F Björklund --- extensions/docker/src/docker-cli.ts | 61 +++++++++++++++++++++++++++++ extensions/docker/src/extension.ts | 16 ++++++++ 2 files changed, 77 insertions(+) create mode 100644 extensions/docker/src/docker-cli.ts diff --git a/extensions/docker/src/docker-cli.ts b/extensions/docker/src/docker-cli.ts new file mode 100644 index 00000000000..fa6e32b9fa7 --- /dev/null +++ b/extensions/docker/src/docker-cli.ts @@ -0,0 +1,61 @@ +/********************************************************************** + * Copyright (C) 2024 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ +import * as extensionApi from '@podman-desktop/api'; + +const macosExtraPath = '/usr/local/bin:/opt/homebrew/bin:/opt/local/bin'; + +export function getInstallationPath(): string { + const env = process.env; + if (extensionApi.env.isMac) { + if (!env.PATH) { + return macosExtraPath; + } else { + return env.PATH.concat(':').concat(macosExtraPath); + } + } else { + return env.PATH; + } +} + +export function getDockerCli(): string { + if (extensionApi.env.isWindows) { + return 'docker.exe'; + } + return 'docker'; +} + +export interface InstalledDocker { + version: string; +} + +export async function getDockerInstallation(): Promise { + try { + let { stdout: versionOut } = await extensionApi.process.exec(getDockerCli(), ['--version']); + if (!versionOut.startsWith('Docker')) { + // could be the podman-docker wrapper script + return undefined; + } + versionOut = versionOut.replace(/, build .*$/, ''); + const versionArr = versionOut.split(' '); + const version = versionArr[versionArr.length - 1]; + return { version }; + } catch (err) { + // no docker binary + return undefined; + } +} diff --git a/extensions/docker/src/extension.ts b/extensions/docker/src/extension.ts index 27ae08cee47..7cfd26b211d 100644 --- a/extensions/docker/src/extension.ts +++ b/extensions/docker/src/extension.ts @@ -22,6 +22,7 @@ import * as http from 'node:http'; let stopLoop = false; +import { getDockerInstallation } from './docker-cli'; let socketPath: string; let provider: extensionApi.Provider; let providerState: extensionApi.ProviderConnectionStatus = 'stopped'; @@ -108,6 +109,21 @@ async function monitorDaemon(extensionContext: extensionApi.ExtensionContext): P } async function updateProvider(extensionContext: extensionApi.ExtensionContext) { + try { + const installedDocker = await getDockerInstallation(); + if (!installedDocker) { + provider.updateStatus('not-installed'); + } else if (installedDocker.version) { + provider.updateVersion(installedDocker.version); + // update provider status if someone has installed docker externally + if (provider.status === 'not-installed') { + provider.updateStatus('installed'); + } + } + } catch (error) { + // ignore the update + } + // check if the daemon is alive const isAlive = await isDockerDaemonAlive(socketPath);