From c9070782040693c3053e960a4a92db3d6b0874b9 Mon Sep 17 00:00:00 2001 From: axel7083 <42176370+axel7083@users.noreply.github.com> Date: Thu, 15 May 2025 13:02:15 +0200 Subject: [PATCH] feat(configuration): support disabling quadlet default dependencies Signed-off-by: axel7083 <42176370+axel7083@users.noreply.github.com> --- packages/backend/package.json | 12 +++++- packages/backend/src/extension.ts | 2 + .../src/services/configuration-service.ts | 39 +++++++++++++++++++ packages/backend/src/services/main-service.ts | 11 ++++++ .../backend/src/services/podlet-js-service.ts | 15 +++++++ .../src/containers/container-generator.ts | 7 ++++ .../podlet-js/src/images/image-generator.ts | 7 ++++ .../podlet-js/src/models/container-quadlet.ts | 2 + .../podlet-js/src/models/image-quadlet.ts | 2 + .../podlet-js/src/models/quadlet-section.ts | 28 +++++++++++++ 10 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/services/configuration-service.ts create mode 100644 packages/podlet-js/src/models/quadlet-section.ts diff --git a/packages/backend/package.json b/packages/backend/package.json index 23454c29..3581602d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -60,7 +60,17 @@ "command": "podlet.compose", "title": "Podlet: compose" } - ] + ], + "configuration": { + "title": "Podman Quadlet", + "properties": { + "quadlet.generate.DefaultDependencies": { + "type": "boolean", + "default": true, + "description": "Add Quadlet’s default network dependencies to the unit (default is true)." + } + } + } }, "devDependencies": { "@podman-desktop/api": "^1.18.1", diff --git a/packages/backend/src/extension.ts b/packages/backend/src/extension.ts index 907f9d27..77b3cd53 100644 --- a/packages/backend/src/extension.ts +++ b/packages/backend/src/extension.ts @@ -11,6 +11,7 @@ import { window, cli as cliApi, commands as commandsApi, + configuration as configurationApi, } from '@podman-desktop/api'; import { MainService } from './services/main-service'; @@ -28,6 +29,7 @@ export async function activate(extensionContext: ExtensionContext): Promise {} + + getQuadletDefaultDependencies(): boolean { + return this.#configuration.get('generate.DefaultDependencies') ?? true; + } + + dispose(): void {} +} diff --git a/packages/backend/src/services/main-service.ts b/packages/backend/src/services/main-service.ts index 0bd74573..8fc995e4 100644 --- a/packages/backend/src/services/main-service.ts +++ b/packages/backend/src/services/main-service.ts @@ -8,6 +8,7 @@ import type { extensions, process as processApi, commands as commandsApi, + configuration as configurationApi, provider, window, cli as cliApi, @@ -44,6 +45,7 @@ import { DialogService } from './dialog-service'; import { DialogApiImpl } from '../apis/dialog-api-impl'; import { DialogApi } from '/@shared/src/apis/dialog-api'; import { PodletJsService } from './podlet-js-service'; +import { ConfigurationService } from './configuration-service'; interface Dependencies { extensionContext: ExtensionContext; @@ -55,6 +57,7 @@ interface Dependencies { cliApi: typeof cliApi; commandsApi: typeof commandsApi; containers: typeof containerEngine; + configurationApi: typeof configurationApi; } export class MainService implements Disposable, AsyncInit { @@ -105,6 +108,13 @@ export class MainService implements Disposable, AsyncInit { await routing.init(); this.#disposables.push(routing); + // The configuration + const configuration = new ConfigurationService({ + configurationApi: this.dependencies.configurationApi, + }); + await configuration.init(); + this.#disposables.push(configuration); + // The provider service register subscribers events for provider updates const providers = new ProviderService({ providers: this.dependencies.providers, @@ -175,6 +185,7 @@ export class MainService implements Disposable, AsyncInit { containers: containers, images: images, telemetry: this.#telemetry, + configuration: configuration, }); /** diff --git a/packages/backend/src/services/podlet-js-service.ts b/packages/backend/src/services/podlet-js-service.ts index 800bf3f9..c9415655 100644 --- a/packages/backend/src/services/podlet-js-service.ts +++ b/packages/backend/src/services/podlet-js-service.ts @@ -23,11 +23,14 @@ import type { ContainerInspectInfo, ImageInspectInfo, TelemetryLogger } from '@p import { ContainerGenerator, Compose, ImageGenerator } from 'podlet-js'; import { readFile } from 'node:fs/promises'; import { TelemetryEvents } from '../utils/telemetry-events'; +import type { ConfigurationService } from './configuration-service'; +import type { QuadletSection } from 'podlet-js/dist/models/quadlet-section'; interface Dependencies { containers: ContainerService; images: ImageService; telemetry: TelemetryLogger; + configuration: ConfigurationService; } export class PodletJsService { @@ -47,9 +50,20 @@ export class PodletJsService { return new ContainerGenerator({ container, image, + quadlet: this.buildQuadletSection(), }).generate(); } + protected buildQuadletSection(): undefined | QuadletSection { + const defaultDependencies = this.dependencies.configuration.getQuadletDefaultDependencies(); + if (!defaultDependencies) { + return { + DefaultDependencies: defaultDependencies, + }; + } + return undefined; + } + /** * Using the `podlet-js` package, generate a stringify {@link ImageQuadlet} * @param engineId @@ -61,6 +75,7 @@ export class PodletJsService { return new ImageGenerator({ image: image, + quadlet: this.buildQuadletSection(), }).generate(); } diff --git a/packages/podlet-js/src/containers/container-generator.ts b/packages/podlet-js/src/containers/container-generator.ts index 2ccabfec..907ed358 100644 --- a/packages/podlet-js/src/containers/container-generator.ts +++ b/packages/podlet-js/src/containers/container-generator.ts @@ -31,10 +31,12 @@ import { ReadOnly } from './builders/read-only'; import { Mount } from './builders/mount'; import { Generator } from '../utils/generator'; import { Restart } from './builders/restart'; +import type { QuadletSection } from '../models/quadlet-section'; interface Dependencies { container: ContainerInspectInfo; image: ImageInspectInfo; + quadlet?: QuadletSection; } export class ContainerGenerator extends Generator { @@ -63,6 +65,11 @@ export class ContainerGenerator extends Generator { } as ContainerQuadlet, ); + // user may specify a quadlet section + if (this.dependencies.quadlet) { + containerQuadlet.Quadlet = this.dependencies.quadlet; + } + return stringify(this.format(containerQuadlet)); } } diff --git a/packages/podlet-js/src/images/image-generator.ts b/packages/podlet-js/src/images/image-generator.ts index 479d21ea..00ac23a0 100644 --- a/packages/podlet-js/src/images/image-generator.ts +++ b/packages/podlet-js/src/images/image-generator.ts @@ -19,9 +19,11 @@ import { Generator } from '../utils/generator'; import type { ImageInspectInfo } from '@podman-desktop/api'; import { stringify } from 'js-ini'; import type { ImageQuadlet } from '../models/image-quadlet'; +import type { QuadletSection } from '../models/quadlet-section'; interface Dependencies { image: ImageInspectInfo; + quadlet?: QuadletSection; } export class ImageGenerator extends Generator { @@ -36,6 +38,11 @@ export class ImageGenerator extends Generator { }, }; + // user may specify a quadlet section + if (this.dependencies.quadlet) { + image.Quadlet = this.dependencies.quadlet; + } + return stringify(this.format(image)); } } diff --git a/packages/podlet-js/src/models/container-quadlet.ts b/packages/podlet-js/src/models/container-quadlet.ts index a2b7058d..ba92b342 100644 --- a/packages/podlet-js/src/models/container-quadlet.ts +++ b/packages/podlet-js/src/models/container-quadlet.ts @@ -16,12 +16,14 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ import type { ServiceQuadlet } from './service-quadlet'; +import type { QuadletSection } from './quadlet-section'; /** * Learn more about Container Quadlet https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#container-units-container */ export interface ContainerQuadlet { Service?: ServiceQuadlet; + Quadlet?: QuadletSection; Container: { /** * Add these capabilities, in addition to the default Podman capability set, to the container. diff --git a/packages/podlet-js/src/models/image-quadlet.ts b/packages/podlet-js/src/models/image-quadlet.ts index 85b1ef5e..05f2e161 100644 --- a/packages/podlet-js/src/models/image-quadlet.ts +++ b/packages/podlet-js/src/models/image-quadlet.ts @@ -16,12 +16,14 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ import type { ServiceQuadlet } from './service-quadlet'; +import type { QuadletSection } from './quadlet-section'; /** * Learn more about Image Quadlet https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#image-units-image */ export interface ImageQuadlet { Service?: ServiceQuadlet; + Quadlet?: QuadletSection; Image: { /** * All tagged images in the repository are pulled. diff --git a/packages/podlet-js/src/models/quadlet-section.ts b/packages/podlet-js/src/models/quadlet-section.ts new file mode 100644 index 00000000..87b9a58c --- /dev/null +++ b/packages/podlet-js/src/models/quadlet-section.ts @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (C) 2025 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 + ***********************************************************************/ + +/** + * Learn more about Quadlet Section https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#quadlet-section-quadlet + */ +export interface QuadletSection { + /** + * Add Quadlet’s default network dependencies to the unit. + * @default true + */ + DefaultDependencies: boolean; +}