Skip to content

Commit

Permalink
feat: add kube to compose actions (#3253)
Browse files Browse the repository at this point in the history
### What does this PR do?

* Adds "Generate Kube" to Compose actions
* Adds "Kube" tab to Compose details

### Screenshot/screencast of this PR

<!-- Please include a screenshot or a screencast explaining what is doing this PR -->

### What issues does this PR fix or reference?

<!-- Please include any related issue from Podman Desktop repository (or from another issue tracker).
-->

Closes #3105

### How to test this PR?

1. Deploy a docker-compose example
(https://raw.githubusercontent.com/kubernetes/kompose/main/examples/docker-compose.yaml)
2. Go to the container view in PD
3. Press on the compose group
4. View kube tab

<!-- Please explain steps to reproduce -->

Signed-off-by: Charlie Drage <charlie@charliedrage.com>
  • Loading branch information
cdrage committed Jul 26, 2023
1 parent 7fbd786 commit ae23457
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
15 changes: 14 additions & 1 deletion packages/renderer/src/lib/compose/ComposeActions.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script lang="ts">
import { faTrash, faPlay, faStop, faArrowsRotate } from '@fortawesome/free-solid-svg-icons';
import { faFileCode, faTrash, faPlay, faStop, faArrowsRotate } from '@fortawesome/free-solid-svg-icons';
import type { ComposeInfoUI } from './ComposeInfoUI';
import { router } from 'tinro';
import ListItemButtonIcon from '../ui/ListItemButtonIcon.svelte';
import DropdownMenu from '../ui/DropdownMenu.svelte';
import FlatMenu from '../ui/FlatMenu.svelte';
Expand Down Expand Up @@ -57,6 +58,10 @@ async function restartCompose(composeInfoUI: ComposeInfoUI) {
}
}
function openGenerateKube(): void {
router.goto(`/compose/${encodeURI(compose.name)}/${encodeURI(compose.engineId)}/kube`);
}
// If dropdownMenu = true, we'll change style to the imported dropdownMenu style
// otherwise, leave blank.
let actionsStyle;
Expand Down Expand Up @@ -93,6 +98,14 @@ if (dropdownMenu) {

<!-- If dropdownMenu is true, use it, otherwise just show the regular buttons -->
<svelte:component this="{actionsStyle}">
{#if !detailed}
<ListItemButtonIcon
title="Generate Kube"
onClick="{() => openGenerateKube()}"
menu="{dropdownMenu}"
detailed="{detailed}"
icon="{faFileCode}" />
{/if}
<ListItemButtonIcon
title="Restart Compose"
onClick="{() => restartCompose(compose)}"
Expand Down
7 changes: 7 additions & 0 deletions packages/renderer/src/lib/compose/ComposeDetails.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ beforeAll(() => {
});
(window as any).ResizeObserver = vi.fn().mockReturnValue({ observe: vi.fn(), unobserve: vi.fn() });
(window as any).initializeProvider = vi.fn().mockResolvedValue([]);
(window as any).generatePodmanKube = vi.fn();
mockBreadcrumb();
});

Expand All @@ -44,3 +45,9 @@ test('Simple test that compose name is displayed', async () => {
render(ComposeDetails, { composeName: 'foobar', engineId: 'engine' });
expect(screen.getByText('foobar')).toBeInTheDocument();
});

test('Test that compose kube tab is clickable and loadable', async () => {
render(ComposeDetails, { composeName: 'foobar', engineId: 'engine' });
const kubeHref = screen.getByRole('link', { name: 'Kube' });
await fireEvent.click(kubeHref);
});
5 changes: 5 additions & 0 deletions packages/renderer/src/lib/compose/ComposeDetails.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { containersInfos } from '/@/stores/containers';
import type { ComposeInfoUI } from './ComposeInfoUI';
import { ContainerUtils } from '../container/container-utils';
import ComposeDetailsLogs from './ComposeDetailsLogs.svelte';
import ComposeDetailsKube from './ComposeDetailsKube.svelte';
import type { ContainerInfoUI } from '../container/ContainerInfoUI';
import DetailsPage from '../ui/DetailsPage.svelte';
import Tab from '../ui/Tab.svelte';
Expand Down Expand Up @@ -83,11 +84,15 @@ onDestroy(() => {
</svelte:fragment>
<svelte:fragment slot="tabs">
<Tab title="Logs" url="logs" />
<Tab title="Kube" url="kube" />
</svelte:fragment>
<svelte:fragment slot="content">
<Route path="/logs" breadcrumb="Logs" navigationHint="tab">
<ComposeDetailsLogs compose="{compose}" />
</Route>
<Route path="/kube" breadcrumb="Kube" navigationHint="tab">
<ComposeDetailsKube compose="{compose}" />
</Route>
</svelte:fragment>
</DetailsPage>
{/if}
23 changes: 23 additions & 0 deletions packages/renderer/src/lib/compose/ComposeDetailsKube.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<script lang="ts">
import { onMount } from 'svelte';
import MonacoEditor from '../editor/MonacoEditor.svelte';
import type { ComposeInfoUI } from './ComposeInfoUI';
export let compose: ComposeInfoUI;
let kubeDetails: string;
onMount(async () => {
// Grab all the container ID's from compose.containers
const containerIds = compose.containers.map(container => container.id);
// Generate the kube yaml using the generatePodmanKube function which
// only has to take in the engineID and an array of container ID's to generate from
const kubeResult = await window.generatePodmanKube(compose.engineId, containerIds);
kubeDetails = kubeResult;
});
</script>

{#if kubeDetails}
<MonacoEditor content="{kubeDetails}" language="yaml" />
{/if}

0 comments on commit ae23457

Please sign in to comment.