diff --git a/packages/api/src/provider-info.ts b/packages/api/src/provider-info.ts index 53a9e78bc94..05dfa6e978a 100644 --- a/packages/api/src/provider-info.ts +++ b/packages/api/src/provider-info.ts @@ -38,6 +38,14 @@ export interface ProviderContainerConnectionInfo { socketPath: string; }; lifecycleMethods?: LifecycleMethod[]; + // can start the connection + canStart: boolean; + // can stop the connection + canStop: boolean; + // can edit the connection + canEdit: boolean; + // can delete the connection + canDelete: boolean; /** * Specify if the corresponding {@link import('@podman-desktop/api').ProviderContainerConnection} instance * has a shellAccess available @@ -55,6 +63,14 @@ export interface ProviderKubernetesConnectionInfo { apiURL: string; }; lifecycleMethods?: LifecycleMethod[]; + // can start the connection + canStart: boolean; + // can stop the connection + canStop: boolean; + // can edit the connection + canEdit: boolean; + // can delete the connection + canDelete: boolean; } export interface ProviderVmConnectionInfo { @@ -62,6 +78,14 @@ export interface ProviderVmConnectionInfo { name: string; status: ProviderConnectionStatus; lifecycleMethods?: LifecycleMethod[]; + // can start the connection + canStart: boolean; + // can stop the connection + canStop: boolean; + // can edit the connection + canEdit: boolean; + // can delete the connection + canDelete: boolean; } export type ProviderConnectionInfo = @@ -79,6 +103,10 @@ export interface ProviderInfo { vmConnections: ProviderVmConnectionInfo[]; status: ProviderStatus; lifecycleMethods?: LifecycleMethod[]; + // can start the provider + canStart: boolean; + // can stop the provider + canStop: boolean; // can create provider connection from ContainerProviderConnectionFactory params containerProviderConnectionCreation: boolean; // can initialize provider connection from ContainerProviderConnectionFactory params diff --git a/packages/main/src/plugin/container-registry.spec.ts b/packages/main/src/plugin/container-registry.spec.ts index 047d8e55256..a764d82decc 100644 --- a/packages/main/src/plugin/container-registry.spec.ts +++ b/packages/main/src/plugin/container-registry.spec.ts @@ -1383,6 +1383,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; await expect( containerRegistry.buildImage('context', () => {}, { @@ -1467,6 +1471,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; vi.spyOn(util, 'isWindows').mockImplementation(() => false); @@ -1553,6 +1561,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; vi.spyOn(util, 'isWindows').mockImplementation(() => true); @@ -1656,6 +1668,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; vi.spyOn(util, 'isWindows').mockImplementation(() => false); @@ -1761,6 +1777,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; vi.spyOn(util, 'isWindows').mockImplementation(() => false); @@ -1842,6 +1862,10 @@ describe('buildImage', () => { }, lifecycleMethods: undefined, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; vi.spyOn(util, 'isWindows').mockImplementation(() => false); @@ -4037,6 +4061,10 @@ test('check createPod uses running podman connection if ProviderContainerConnect }, status: 'started', type: 'podman', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; const result = await containerRegistry.createPod({ diff --git a/packages/main/src/plugin/explore-features/explore-features.spec.ts b/packages/main/src/plugin/explore-features/explore-features.spec.ts index 7dd0e35a21c..423b3171745 100644 --- a/packages/main/src/plugin/explore-features/explore-features.spec.ts +++ b/packages/main/src/plugin/explore-features/explore-features.spec.ts @@ -113,6 +113,10 @@ const providerInfoMock: ProviderInfo = { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], @@ -131,6 +135,8 @@ const providerInfoMock: ProviderInfo = { images: {}, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, }; const extensionInfoMock: ExtensionInfo = { diff --git a/packages/main/src/plugin/index.spec.ts b/packages/main/src/plugin/index.spec.ts index 2a1d3e1a6d3..63f1e1478b6 100644 --- a/packages/main/src/plugin/index.spec.ts +++ b/packages/main/src/plugin/index.spec.ts @@ -1052,6 +1052,10 @@ describe('container-provider-registry:playKube', () => { endpoint: { socketPath: '.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; test('should call ContainerProviderRegistry#playKube', async () => { diff --git a/packages/main/src/plugin/provider-registry.spec.ts b/packages/main/src/plugin/provider-registry.spec.ts index 4491af6f5c1..05d214b0a46 100644 --- a/packages/main/src/plugin/provider-registry.spec.ts +++ b/packages/main/src/plugin/provider-registry.spec.ts @@ -455,6 +455,10 @@ test('expect isProviderContainerConnection returns true with a ProviderContainer socketPath: '/endpoint1.sock', }, lifecycleMethods: undefined, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', }; const res = providerRegistry.isProviderContainerConnection(connection); @@ -469,6 +473,10 @@ test('expect isProviderContainerConnection returns false with a ProviderKubernet apiURL: 'url', }, lifecycleMethods: undefined, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', }; const res = providerRegistry.isProviderContainerConnection(connection); @@ -847,6 +855,10 @@ describe('should send events when starting a container connection', async () => endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', vmType: { id: 'libkrun', @@ -966,6 +978,10 @@ test('should send events when starting a Kubernetes connection', async () => { connectionType: 'kubernetes', name: 'connection', endpoint: { apiURL: 'endpoint' }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', }; @@ -1016,6 +1032,10 @@ test('should send events when starting a VM connection', async () => { const connection: ProviderVmConnectionInfo = { connectionType: 'vm', name: 'connection', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', }; @@ -1085,6 +1105,10 @@ describe('when auto-starting a container connection', async () => { endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', vmType: { id: 'libkrun', @@ -1263,6 +1287,10 @@ test('should send events when stopping a container connection', async () => { endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', vmType: { id: 'libkrun', @@ -1334,6 +1362,10 @@ test('should send events when container connection status change', async () => { endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', vmType: { id: 'libkrun', @@ -1413,6 +1445,10 @@ test('should send events when stopping a Kubernetes connection', async () => { endpoint: { apiURL: 'endpoint1', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', }; @@ -1463,6 +1499,10 @@ test('should send events when stopping a VM connection', async () => { const connection: ProviderVmConnectionInfo = { connectionType: 'vm', name: 'connection', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', }; @@ -1562,6 +1602,10 @@ test('should retrieve context of container provider', async () => { endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', }; @@ -1617,6 +1661,10 @@ test('should retrieve context of kubernetes provider', async () => { endpoint: { apiURL: 'url', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', }; @@ -1673,6 +1721,10 @@ test('should retrieve context of VM provider', async () => { const connection: ProviderVmConnectionInfo = { connectionType: 'vm', name: 'connection', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'stopped', }; @@ -2341,6 +2393,10 @@ describe('shellInProviderConnection', () => { endpoint: { socketPath: '/endpoint1.sock', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', vmType: { id: 'libkrun', @@ -2434,6 +2490,10 @@ describe('shellInProviderConnection', () => { const connection: ProviderVmConnectionInfo = { connectionType: 'vm', name: 'connection', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, status: 'started', }; diff --git a/packages/main/src/plugin/provider-registry.ts b/packages/main/src/plugin/provider-registry.ts index 1ee200d3900..b12df1a96be 100644 --- a/packages/main/src/plugin/provider-registry.ts +++ b/packages/main/src/plugin/provider-registry.ts @@ -707,6 +707,10 @@ export class ProviderRegistry { endpoint: { socketPath: connection.endpoint.socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, shellAccess: !!connection.shellAccess, vmType: connection.vmType ? { @@ -723,12 +727,20 @@ export class ProviderRegistry { endpoint: { apiURL: connection.endpoint.apiURL, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; } else { providerConnection = { connectionType: 'vm', name: connection.name, status: connection.status(), + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; } if (connection.lifecycle) { @@ -746,6 +758,10 @@ export class ProviderRegistry { lifecycleMethods.push('edit'); } providerConnection.lifecycleMethods = lifecycleMethods; + providerConnection.canStart = !!connection.lifecycle.start; + providerConnection.canStop = !!connection.lifecycle.stop; + providerConnection.canEdit = !!connection.lifecycle.edit; + providerConnection.canDelete = !!connection.lifecycle.delete; } return providerConnection; } @@ -850,6 +866,8 @@ export class ProviderRegistry { warnings: provider.warnings, installationSupport, cleanupSupport, + canStart: false, + canStop: false, }; // handle update @@ -862,6 +880,9 @@ export class ProviderRegistry { if (this.providerLifecycles.has(provider.internalId)) { providerInfo.lifecycleMethods = ['start', 'stop']; } + const hasLifecycle = this.providerLifecycles.has(provider.internalId); + providerInfo.canStart = hasLifecycle; + providerInfo.canStop = hasLifecycle; return providerInfo; } diff --git a/packages/renderer/src/lib/container/CreateContainerFromExistingImage.spec.ts b/packages/renderer/src/lib/container/CreateContainerFromExistingImage.spec.ts index 6f1d16902fc..356d8f7ed45 100644 --- a/packages/renderer/src/lib/container/CreateContainerFromExistingImage.spec.ts +++ b/packages/renderer/src/lib/container/CreateContainerFromExistingImage.spec.ts @@ -96,6 +96,10 @@ const pInfo: ProviderContainerConnectionInfo = { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/dashboard/NewContentOnDashboardBadge.spec.ts b/packages/renderer/src/lib/dashboard/NewContentOnDashboardBadge.spec.ts index 42dddf72187..48aac6d4bfb 100644 --- a/packages/renderer/src/lib/dashboard/NewContentOnDashboardBadge.spec.ts +++ b/packages/renderer/src/lib/dashboard/NewContentOnDashboardBadge.spec.ts @@ -52,6 +52,10 @@ const pInfo: ProviderContainerConnectionInfo = { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/dashboard/ProviderCard.spec.ts b/packages/renderer/src/lib/dashboard/ProviderCard.spec.ts index 8526b7c8a24..d1466d15861 100644 --- a/packages/renderer/src/lib/dashboard/ProviderCard.spec.ts +++ b/packages/renderer/src/lib/dashboard/ProviderCard.spec.ts @@ -48,6 +48,8 @@ test('Expect provider region', async () => { images: {} as ProviderImages, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, }; const { findByRole } = render(ProviderCard, { provider }); @@ -77,6 +79,8 @@ test('Expect provider name', async () => { images: {} as ProviderImages, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, }; const { findByLabelText } = render(ProviderCard, { provider }); @@ -107,6 +111,8 @@ test('Expect provider icon', async () => { images: { icon: 'test.png' } as ProviderImages, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, }; const { findByRole } = render(ProviderCard, { provider }); @@ -141,6 +147,8 @@ test('Expect no provider version', async () => { images: {} as ProviderImages, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, // no version }; const { queryByLabelText } = render(ProviderCard, { provider }); @@ -172,6 +180,8 @@ test('Expect provider version', async () => { installationSupport: false, version: '1.2.3', cleanupSupport: false, + canStart: false, + canStop: false, }; const { findByLabelText } = render(ProviderCard, { provider }); @@ -202,6 +212,8 @@ test('Expect provider state', async () => { images: {} as ProviderImages, installationSupport: false, cleanupSupport: false, + canStart: false, + canStop: false, }; const { findByLabelText } = render(ProviderCard, { provider }); diff --git a/packages/renderer/src/lib/dashboard/ProviderInstalled.spec.ts b/packages/renderer/src/lib/dashboard/ProviderInstalled.spec.ts index 2f7e32fa455..72959574123 100644 --- a/packages/renderer/src/lib/dashboard/ProviderInstalled.spec.ts +++ b/packages/renderer/src/lib/dashboard/ProviderInstalled.spec.ts @@ -85,6 +85,8 @@ test('Expect installed provider shows button', async () => { warnings: [], extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; const initializationContext: InitializationContext = new InitializationContextImpl( @@ -141,6 +143,8 @@ test('Expect to see the initialize context error if provider installation fails' warnings: [], extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; const initializationContext: InitializationContext = new InitializationContextImpl( diff --git a/packages/renderer/src/lib/dashboard/ProviderStatusTestHelper.spec.ts b/packages/renderer/src/lib/dashboard/ProviderStatusTestHelper.spec.ts index 6689fa483c4..4a7a543976d 100644 --- a/packages/renderer/src/lib/dashboard/ProviderStatusTestHelper.spec.ts +++ b/packages/renderer/src/lib/dashboard/ProviderStatusTestHelper.spec.ts @@ -52,6 +52,8 @@ export async function verifyStatus< }, extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; const initializationContext: InitializationContext = { mode: InitializeAndStartMode }; diff --git a/packages/renderer/src/lib/forms/ContainerConnectionDropdown.spec.ts b/packages/renderer/src/lib/forms/ContainerConnectionDropdown.spec.ts index 167dcc7aea7..3b22f9cdd26 100644 --- a/packages/renderer/src/lib/forms/ContainerConnectionDropdown.spec.ts +++ b/packages/renderer/src/lib/forms/ContainerConnectionDropdown.spec.ts @@ -36,6 +36,10 @@ const CONTAINER_CONNECTION_INFO: ProviderContainerConnectionInfo = { }, name: 'podman', status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', displayName: 'Podman', lifecycleMethods: undefined, diff --git a/packages/renderer/src/lib/forms/ContainerConnectionDropdownTest.spec.ts b/packages/renderer/src/lib/forms/ContainerConnectionDropdownTest.spec.ts index 94f0fcf96b1..fe3330c06f1 100644 --- a/packages/renderer/src/lib/forms/ContainerConnectionDropdownTest.spec.ts +++ b/packages/renderer/src/lib/forms/ContainerConnectionDropdownTest.spec.ts @@ -32,6 +32,10 @@ const MULTI_CONNECTIONS: ProviderContainerConnectionInfo[] = Array.from({ length socketPath: `socket-${index}`, }, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', })); diff --git a/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts b/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts index ea1f085c451..6670d5387ce 100644 --- a/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts +++ b/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts @@ -64,6 +64,10 @@ function setup(): void { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/image/ImageEmptyScreen.spec.ts b/packages/renderer/src/lib/image/ImageEmptyScreen.spec.ts index 4ea1c7eedb7..8e410f1f662 100644 --- a/packages/renderer/src/lib/image/ImageEmptyScreen.spec.ts +++ b/packages/renderer/src/lib/image/ImageEmptyScreen.spec.ts @@ -49,6 +49,10 @@ function setup(): void { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/image/ImportContainersImages.spec.ts b/packages/renderer/src/lib/image/ImportContainersImages.spec.ts index b550e1f7e96..58064617c82 100644 --- a/packages/renderer/src/lib/image/ImportContainersImages.spec.ts +++ b/packages/renderer/src/lib/image/ImportContainersImages.spec.ts @@ -38,6 +38,10 @@ const pInfo: ProviderContainerConnectionInfo = { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/image/LoadImages.spec.ts b/packages/renderer/src/lib/image/LoadImages.spec.ts index 47811373d2d..9a7d48a1066 100644 --- a/packages/renderer/src/lib/image/LoadImages.spec.ts +++ b/packages/renderer/src/lib/image/LoadImages.spec.ts @@ -38,6 +38,10 @@ const pInfo: ProviderContainerConnectionInfo = { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/image/PullImage.spec.ts b/packages/renderer/src/lib/image/PullImage.spec.ts index 26784b39ade..0295f99d401 100644 --- a/packages/renderer/src/lib/image/PullImage.spec.ts +++ b/packages/renderer/src/lib/image/PullImage.spec.ts @@ -51,6 +51,10 @@ const CONTAINER_CONNECTION_MOCK: ProviderContainerConnectionInfo = { endpoint: { socketPath: 'dummy/socket', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; diff --git a/packages/renderer/src/lib/kube/KubePlayYAML.spec.ts b/packages/renderer/src/lib/kube/KubePlayYAML.spec.ts index 6294fb12dcb..acd217f2670 100644 --- a/packages/renderer/src/lib/kube/KubePlayYAML.spec.ts +++ b/packages/renderer/src/lib/kube/KubePlayYAML.spec.ts @@ -104,6 +104,10 @@ function setup(): void { endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }; const providerInfo = { diff --git a/packages/renderer/src/lib/network/CreateNetwork.spec.ts b/packages/renderer/src/lib/network/CreateNetwork.spec.ts index b2ceb56238c..191f5490744 100644 --- a/packages/renderer/src/lib/network/CreateNetwork.spec.ts +++ b/packages/renderer/src/lib/network/CreateNetwork.spec.ts @@ -58,6 +58,10 @@ function createProviderConnection( endpoint: { socketPath: '', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', ...overrides, }; diff --git a/packages/renderer/src/lib/onboarding/OnboardingComponent.spec.ts b/packages/renderer/src/lib/onboarding/OnboardingComponent.spec.ts index 4feb1b40ed2..4991deb558b 100644 --- a/packages/renderer/src/lib/onboarding/OnboardingComponent.spec.ts +++ b/packages/renderer/src/lib/onboarding/OnboardingComponent.spec.ts @@ -34,6 +34,8 @@ const providerInfo: ProviderInfo = { icon: 'img', }, status: 'started', + canStart: false, + canStop: false, warnings: [], containerProviderConnectionCreation: true, detectionChecks: [], @@ -47,6 +49,10 @@ const providerInfo: ProviderInfo = { socketPath: 'socket', }, lifecycleMethods: ['start', 'stop', 'delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], diff --git a/packages/renderer/src/lib/pod/PodCreateFromContainers.spec.ts b/packages/renderer/src/lib/pod/PodCreateFromContainers.spec.ts index 873f44ce867..06f0ecd5cc5 100644 --- a/packages/renderer/src/lib/pod/PodCreateFromContainers.spec.ts +++ b/packages/renderer/src/lib/pod/PodCreateFromContainers.spec.ts @@ -35,6 +35,8 @@ const providerInfo: ProviderInfo = { icon: 'img', }, status: 'started', + canStart: false, + canStop: false, warnings: [], containerProviderConnectionCreation: true, detectionChecks: [], @@ -48,6 +50,10 @@ const providerInfo: ProviderInfo = { socketPath: 'socket', }, lifecycleMethods: ['start', 'stop', 'delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], diff --git a/packages/renderer/src/lib/pod/PodsList.spec.ts b/packages/renderer/src/lib/pod/PodsList.spec.ts index aa04f55a632..9763b442816 100644 --- a/packages/renderer/src/lib/pod/PodsList.spec.ts +++ b/packages/renderer/src/lib/pod/PodsList.spec.ts @@ -46,6 +46,8 @@ const getContributedMenusMock = vi.fn(); const kubernetesGetCurrentNamespaceMock = vi.fn(); const provider: ProviderInfo = { + canStart: false, + canStop: false, containerConnections: [ { connectionType: 'container', @@ -53,6 +55,10 @@ const provider: ProviderInfo = { displayName: 'MyConnection', status: 'started', endpoint: { socketPath: 'dummy' }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], @@ -590,6 +596,10 @@ test('Expect to see empty page and no table when no container engine is running' { name: 'podman-machine-default', status: 'stopped', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, } as unknown as ProviderContainerConnectionInfo, ], } as unknown as ProviderInfo, @@ -648,6 +658,10 @@ test('Expect environment dropdown to appear with multiple running connections', displayName: 'Podman Machine', status: 'started', type: 'podman', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, } as unknown as ProviderContainerConnectionInfo, ], } as unknown as ProviderInfo, @@ -661,6 +675,10 @@ test('Expect environment dropdown to appear with multiple running connections', displayName: 'Docker Desktop', status: 'started', type: 'docker', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, } as unknown as ProviderContainerConnectionInfo, ], } as unknown as ProviderInfo, @@ -704,6 +722,10 @@ test('Expect environment dropdown to filter pods by selected environment', async displayName: 'Podman Machine', status: 'started', type: 'podman', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, } as unknown as ProviderContainerConnectionInfo, ], } as unknown as ProviderInfo, @@ -717,6 +739,10 @@ test('Expect environment dropdown to filter pods by selected environment', async displayName: 'Docker Desktop', status: 'started', type: 'docker', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, } as unknown as ProviderContainerConnectionInfo, ], } as unknown as ProviderInfo, diff --git a/packages/renderer/src/lib/preferences/PreferencesConnectionActions.spec.ts b/packages/renderer/src/lib/preferences/PreferencesConnectionActions.spec.ts index a78fb626af8..1fd0f85a0f0 100644 --- a/packages/renderer/src/lib/preferences/PreferencesConnectionActions.spec.ts +++ b/packages/renderer/src/lib/preferences/PreferencesConnectionActions.spec.ts @@ -52,6 +52,8 @@ const containerProviderInfo: ProviderInfo = { vmConnections: [], vmProviderConnectionCreation: false, vmProviderConnectionInitialization: false, + canStart: false, + canStop: false, }; const containerConnection: ProviderContainerConnectionInfo = { @@ -63,6 +65,10 @@ const containerConnection: ProviderContainerConnectionInfo = { socketPath: 'socket', }, lifecycleMethods: ['start', 'stop', 'delete'], + canStart: true, + canStop: true, + canEdit: false, + canDelete: true, type: 'podman', }; @@ -74,6 +80,10 @@ const kubernetesConnection: ProviderKubernetesConnectionInfo = { apiURL: 'url', }, lifecycleMethods: ['start', 'stop', 'delete'], + canStart: true, + canStop: true, + canEdit: false, + canDelete: true, }; const updateConnectionStatus = (): void => { diff --git a/packages/renderer/src/lib/preferences/PreferencesConnectionActions.svelte b/packages/renderer/src/lib/preferences/PreferencesConnectionActions.svelte index d2c87ac0565..5adbbd2374e 100644 --- a/packages/renderer/src/lib/preferences/PreferencesConnectionActions.svelte +++ b/packages/renderer/src/lib/preferences/PreferencesConnectionActions.svelte @@ -156,7 +156,7 @@ function getLoggerHandler(provider: ProviderInfo, containerConnectionInfo: Provi class="flex bg-[var(--pd-action-button-details-bg)] w-fit rounded-lg m-auto" role="group" aria-label="Connection Actions"> - {#if connection.lifecycleMethods.includes('start')} + {#if connection.canStart}
=> startConnectionProvider(provider, connection)} @@ -165,7 +165,7 @@ function getLoggerHandler(provider: ProviderInfo, containerConnectionInfo: Provi state={connectionStatus} />
{/if} - {#if connection.lifecycleMethods.includes('start') && connection.lifecycleMethods.includes('stop')} + {#if connection.canStart && connection.canStop} => restartConnectionProvider(provider, connection)} action="restart" @@ -173,7 +173,7 @@ function getLoggerHandler(provider: ProviderInfo, containerConnectionInfo: Provi state={connectionStatus} /> {/if} - {#if connection.lifecycleMethods.includes('stop')} + {#if connection.canStop} => stopConnectionProvider(provider, connection)} action="stop" @@ -181,7 +181,7 @@ function getLoggerHandler(provider: ProviderInfo, containerConnectionInfo: Provi state={connectionStatus} /> {/if} - {#if connection.lifecycleMethods.includes('edit')} + {#if connection.canEdit} => editConnectionProvider(provider, connection)} action="edit" @@ -189,7 +189,7 @@ function getLoggerHandler(provider: ProviderInfo, containerConnectionInfo: Provi state={connectionStatus} /> {/if} - {#if connection.lifecycleMethods.includes('delete')} + {#if connection.canDelete} { @@ -84,6 +86,10 @@ test('Expect that the right machine is displayed', async () => { endpoint: { socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, { @@ -94,6 +100,10 @@ test('Expect that the right machine is displayed', async () => { endpoint: { socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, { @@ -104,6 +114,10 @@ test('Expect that the right machine is displayed', async () => { endpoint: { socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], @@ -150,6 +164,10 @@ test('Expect that removing the connection is going back to the previous page', a endpoint: { socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, { @@ -162,6 +180,10 @@ test('Expect that removing the connection is going back to the previous page', a }, type: 'podman', lifecycleMethods: ['delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: true, }, { connectionType: 'container', @@ -171,6 +193,10 @@ test('Expect that removing the connection is going back to the previous page', a endpoint: { socketPath, }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], @@ -248,6 +274,10 @@ test('Expect to see error message if action fails', async () => { }, type: 'podman', lifecycleMethods: ['delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: true, }, ], }; @@ -311,6 +341,10 @@ test('Expect startContainerProvider to only be called once when restarting', asy }, type: 'podman', lifecycleMethods: ['start', 'stop'], + canStart: true, + canStop: true, + canEdit: false, + canDelete: false, }, ], }; @@ -368,6 +402,10 @@ test('Expect display name to be used in favor of name for page title', async () }, type: 'podman', lifecycleMethods: ['start', 'stop'], + canStart: true, + canStop: true, + canEdit: false, + canDelete: false, }, ], }; @@ -408,6 +446,10 @@ test('expect terminal tab to be visible if shellAccess is truthy', async () => { socketPath, }, shellAccess: true, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], diff --git a/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionDetailsSummary.spec.ts b/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionDetailsSummary.spec.ts index 7fcab57a6e4..3a9bf14ac4c 100644 --- a/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionDetailsSummary.spec.ts +++ b/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionDetailsSummary.spec.ts @@ -35,6 +35,10 @@ const kubernetesConnection: ProviderKubernetesConnectionInfo = { apiURL: 'url', }, status: 'started', + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }; test('Expect that name, url and kubernetes are displayed', async () => { diff --git a/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionRendering.spec.ts b/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionRendering.spec.ts index 00d2c2ae44b..bbfcf943f67 100644 --- a/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionRendering.spec.ts +++ b/packages/renderer/src/lib/preferences/PreferencesKubernetesConnectionRendering.spec.ts @@ -71,6 +71,10 @@ test('Expect that removing the connection is going back to the previous page', a endpoint: { apiURL: 'http://localhost:8080', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }, { connectionType: 'kubernetes', @@ -80,6 +84,10 @@ test('Expect that removing the connection is going back to the previous page', a apiURL: 'http://localhost:8181', }, lifecycleMethods: ['delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: true, }, { connectionType: 'kubernetes', @@ -88,6 +96,10 @@ test('Expect that removing the connection is going back to the previous page', a endpoint: { apiURL: 'http://localhost:8282', }, + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, }, ], kubernetesProviderConnectionCreation: true, @@ -100,6 +112,8 @@ test('Expect that removing the connection is going back to the previous page', a kubernetesProviderConnectionInitialization: false, extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; // 3 connections with the same socket path @@ -177,6 +191,10 @@ test('Expect to see error message if action fails', async () => { apiURL, }, lifecycleMethods: ['delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: true, }, ], kubernetesProviderConnectionCreation: true, @@ -189,6 +207,8 @@ test('Expect to see error message if action fails', async () => { kubernetesProviderConnectionInitialization: false, extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; providerInfos.set([providerInfo]); diff --git a/packages/renderer/src/lib/preferences/PreferencesProviderInstallationModal.spec.ts b/packages/renderer/src/lib/preferences/PreferencesProviderInstallationModal.spec.ts index da2b567701c..ba59999a99e 100644 --- a/packages/renderer/src/lib/preferences/PreferencesProviderInstallationModal.spec.ts +++ b/packages/renderer/src/lib/preferences/PreferencesProviderInstallationModal.spec.ts @@ -45,6 +45,10 @@ const providerInfo: ProviderInfo = { socketPath: 'socket', }, lifecycleMethods: ['start', 'stop', 'delete'], + canStart: false, + canStop: false, + canEdit: false, + canDelete: false, type: 'podman', }, ], @@ -61,6 +65,8 @@ const providerInfo: ProviderInfo = { kubernetesProviderConnectionInitialization: false, extensionId: '', cleanupSupport: false, + canStart: false, + canStop: false, }; const closeCallback = vi.fn(); diff --git a/packages/renderer/src/lib/preferences/PreferencesProviderRendering.svelte b/packages/renderer/src/lib/preferences/PreferencesProviderRendering.svelte index 1d3f7f58404..78843be526c 100644 --- a/packages/renderer/src/lib/preferences/PreferencesProviderRendering.svelte +++ b/packages/renderer/src/lib/preferences/PreferencesProviderRendering.svelte @@ -112,7 +112,7 @@ async function stopReceivingLogs(providerInternalId: string): Promise {
- {#if providerInfo?.lifecycleMethods.includes('start')} + {#if providerInfo?.canStart}