forked from cockpit/cockpit-podman
2119 lines
114 KiB
Diff
2119 lines
114 KiB
Diff
|
From ce58262dbb6b9f0b453a84107e7e6dd0f5fbcc96 Mon Sep 17 00:00:00 2001
|
||
|
From: Cockpit Project <cockpituous@gmail.com>
|
||
|
Date: Thu, 1 Jun 2023 03:08:22 +0000
|
||
|
Subject: [PATCH] Makefile: Update Cockpit lib to
|
||
|
756b59469637dd2dee00d086b883cffd16dc5efc
|
||
|
|
||
|
Update to the same PF5 versions as Cockpit. Apply the "-v5" prefixing
|
||
|
and import adjustments.
|
||
|
|
||
|
Make use of the new pywrap feature from our test.
|
||
|
|
||
|
See starter-kit commit 2215aa3bf801224.
|
||
|
|
||
|
Closes #1299
|
||
|
---
|
||
|
Makefile | 8 +-
|
||
|
node_modules | 2 +-
|
||
|
package.json | 11 +-
|
||
|
src/ContainerCommitModal.jsx | 8 +-
|
||
|
src/ContainerHeader.jsx | 4 +-
|
||
|
src/ContainerRenameModal.jsx | 2 +-
|
||
|
src/Containers.jsx | 6 +-
|
||
|
src/Containers.scss | 40 ++--
|
||
|
src/DynamicListForm.scss | 14 +-
|
||
|
src/ImageRunModal.jsx | 42 ++--
|
||
|
src/ImageRunModal.scss | 20 +-
|
||
|
src/ImageSearchModal.css | 18 +-
|
||
|
src/ImageSearchModal.jsx | 4 +-
|
||
|
src/Images.css | 12 +-
|
||
|
src/Images.jsx | 4 +-
|
||
|
src/PodCreateModal.jsx | 2 +-
|
||
|
src/PublishPort.jsx | 12 +-
|
||
|
src/Volume.jsx | 4 +-
|
||
|
src/app.jsx | 4 +-
|
||
|
src/podman.scss | 42 ++--
|
||
|
test/check-application | 441 +++++++++++++++++------------------
|
||
|
21 files changed, 346 insertions(+), 354 deletions(-)
|
||
|
|
||
|
Index: cockpit-podman-70/Makefile
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/Makefile
|
||
|
+++ cockpit-podman-70/Makefile
|
||
|
@@ -34,13 +34,11 @@ all: $(DIST_TEST)
|
||
|
COCKPIT_REPO_FILES = \
|
||
|
pkg/lib \
|
||
|
test/common \
|
||
|
- tools/git-utils.sh \
|
||
|
- tools/make-bots \
|
||
|
tools/node-modules \
|
||
|
$(NULL)
|
||
|
|
||
|
COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git
|
||
|
-COCKPIT_REPO_COMMIT = 355c0aa59e3991243e10a61183e62ea129d3261a # 292 + 8 commits
|
||
|
+COCKPIT_REPO_COMMIT = 756b59469637dd2dee00d086b883cffd16dc5efc # 293 + conditional pfv5
|
||
|
|
||
|
$(COCKPIT_REPO_FILES): $(COCKPIT_REPO_STAMP)
|
||
|
COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}'
|
||
|
@@ -200,8 +198,8 @@ prepare-check: $(NODE_MODULES_TEST) $(VM
|
||
|
check: prepare-check
|
||
|
TEST_AUDIT_NO_SELINUX=1 test/common/run-tests ${RUN_TESTS_OPTIONS}
|
||
|
|
||
|
-bots: tools/make-bots
|
||
|
- tools/make-bots
|
||
|
+bots: $(COCKPIT_REPO_STAMP)
|
||
|
+ test/common/make-bots
|
||
|
|
||
|
test/reference: test/common
|
||
|
test/common/pixel-tests pull
|
||
|
Index: cockpit-podman-70/package.json
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/package.json
|
||
|
+++ cockpit-podman-70/package.json
|
||
|
@@ -43,11 +43,12 @@
|
||
|
"stylelint-formatter-pretty": "^3.1.1"
|
||
|
},
|
||
|
"dependencies": {
|
||
|
- "@patternfly/patternfly": "5.0.0-alpha.43",
|
||
|
- "@patternfly/react-core": "5.0.0-alpha.83",
|
||
|
- "@patternfly/react-icons": "5.0.0-alpha.12",
|
||
|
- "@patternfly/react-styles": "5.0.0-alpha.8",
|
||
|
- "@patternfly/react-table": "5.0.0-alpha.85",
|
||
|
+ "@patternfly/patternfly": "5.0.0-alpha.53",
|
||
|
+ "@patternfly/react-core": "5.0.0-alpha.98",
|
||
|
+ "@patternfly/react-icons": "5.0.0-alpha.14",
|
||
|
+ "@patternfly/react-styles": "5.0.0-alpha.10",
|
||
|
+ "@patternfly/react-table": "5.0.0-alpha.100",
|
||
|
+ "@patternfly/react-tokens": "5.0.0-alpha.9",
|
||
|
"date-fns": "2.28.0",
|
||
|
"docker-names": "1.2.1",
|
||
|
"prop-types": "15.8.1",
|
||
|
Index: cockpit-podman-70/src/ContainerCommitModal.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ContainerCommitModal.jsx
|
||
|
+++ cockpit-podman-70/src/ContainerCommitModal.jsx
|
||
|
@@ -91,7 +91,7 @@ const ContainerCommitModal = ({ containe
|
||
|
<TextInput id="commit-dialog-image-name"
|
||
|
value={imageName}
|
||
|
validated={nameError ? "error" : "default"}
|
||
|
- onChange={value => { setNameError(""); setImageName(value) }} />
|
||
|
+ onChange={(_, value) => { setNameError(""); setImageName(value) }} />
|
||
|
<FormHelper fieldId="commit-dialog-image-name" helperTextInvalid={nameError} />
|
||
|
</FormGroup>
|
||
|
|
||
|
@@ -99,20 +99,20 @@ const ContainerCommitModal = ({ containe
|
||
|
<TextInput id="commit-dialog-image-tag"
|
||
|
placeholder="latest" // Do not translate
|
||
|
value={tag}
|
||
|
- onChange={value => { setNameError(""); setTag(value) }} />
|
||
|
+ onChange={(_, value) => { setNameError(""); setTag(value) }} />
|
||
|
</FormGroup>
|
||
|
|
||
|
<FormGroup fieldId="commit-dialog-author" label={_("Author")}>
|
||
|
<TextInput id="commit-dialog-author"
|
||
|
placeholder={_("Example, Your Name <yourname@example.com>")}
|
||
|
value={author}
|
||
|
- onChange={setAuthor} />
|
||
|
+ onChange={(_, value) => setAuthor(value)} />
|
||
|
</FormGroup>
|
||
|
|
||
|
<FormGroup fieldId="commit-dialog-command" label={_("Command")}>
|
||
|
<TextInput id="commit-dialog-command"
|
||
|
value={command}
|
||
|
- onChange={setCommand} />
|
||
|
+ onChange={(_, value) => setCommand(value)} />
|
||
|
</FormGroup>
|
||
|
|
||
|
<FormGroup fieldId="commit-dialog-pause" label={_("Options")} isStack hasNoPaddingTop>
|
||
|
Index: cockpit-podman-70/src/ContainerHeader.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ContainerHeader.jsx
|
||
|
+++ cockpit-podman-70/src/ContainerHeader.jsx
|
||
|
@@ -15,7 +15,7 @@ const ContainerHeader = ({ user, twoOwne
|
||
|
{_("Owner")}
|
||
|
</ToolbarItem>
|
||
|
<ToolbarItem>
|
||
|
- <FormSelect id="containers-containers-owner" value={ownerFilter} onChange={handleOwnerChanged}>
|
||
|
+ <FormSelect id="containers-containers-owner" value={ownerFilter} onChange={(_, value) => handleOwnerChanged(value)}>
|
||
|
<FormSelectOption value='user' label={user} />
|
||
|
<FormSelectOption value='system' label={_("System")} />
|
||
|
<FormSelectOption value='all' label={_("All")} />
|
||
|
@@ -27,7 +27,7 @@ const ContainerHeader = ({ user, twoOwne
|
||
|
<TextInput id="containers-filter"
|
||
|
placeholder={_("Type to filter…")}
|
||
|
value={textFilter}
|
||
|
- onChange={handleFilterChanged} />
|
||
|
+ onChange={(_, value) => handleFilterChanged(value)} />
|
||
|
</ToolbarItem>
|
||
|
</ToolbarContent>
|
||
|
</Toolbar>
|
||
|
Index: cockpit-podman-70/src/ContainerRenameModal.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ContainerRenameModal.jsx
|
||
|
+++ cockpit-podman-70/src/ContainerRenameModal.jsx
|
||
|
@@ -70,7 +70,7 @@ const ContainerRenameModal = ({ containe
|
||
|
validated={nameError ? "error" : "default"}
|
||
|
type="text"
|
||
|
aria-label={nameError}
|
||
|
- onChange={value => handleInputChange("name", value)} />
|
||
|
+ onChange={(_, value) => handleInputChange("name", value)} />
|
||
|
<FormHelper fieldId="commit-dialog-image-name" helperTextInvalid={nameError} />
|
||
|
</FormGroup>
|
||
|
</Form>
|
||
|
Index: cockpit-podman-70/src/Containers.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/Containers.jsx
|
||
|
+++ cockpit-podman-70/src/Containers.jsx
|
||
|
@@ -6,7 +6,7 @@ import { Divider } from "@patternfly/rea
|
||
|
import { Dropdown, DropdownItem, DropdownSeparator, KebabToggle } from '@patternfly/react-core/dist/esm/deprecated/components/Dropdown/index.js';
|
||
|
import { Flex } from "@patternfly/react-core/dist/esm/layouts/Flex";
|
||
|
import { Popover } from "@patternfly/react-core/dist/esm/components/Popover";
|
||
|
-import { LabelGroup } from "@patternfly/react-core/dist/esm/components/LabelGroup";
|
||
|
+import { LabelGroup } from "@patternfly/react-core/dist/esm/components/Label";
|
||
|
import { Text, TextVariants } from "@patternfly/react-core/dist/esm/components/Text";
|
||
|
import { FormSelect, FormSelectOption } from "@patternfly/react-core/dist/esm/components/FormSelect";
|
||
|
import { Tooltip } from "@patternfly/react-core/dist/esm/components/Tooltip";
|
||
|
@@ -429,7 +429,7 @@ class Containers extends React.Component
|
||
|
];
|
||
|
|
||
|
if (!container.isDownloading) {
|
||
|
- columns.push({ title: <ContainerActions version={this.props.version} container={container} healthcheck={healthcheck} onAddNotification={this.props.onAddNotification} localImages={localImages} updateContainerAfterEvent={this.props.updateContainerAfterEvent} />, props: { className: "pf-c-table__action" } });
|
||
|
+ columns.push({ title: <ContainerActions version={this.props.version} container={container} healthcheck={healthcheck} onAddNotification={this.props.onAddNotification} localImages={localImages} updateContainerAfterEvent={this.props.updateContainerAfterEvent} />, props: { className: "pf-v5-c-table__action" } });
|
||
|
}
|
||
|
|
||
|
const tty = containerDetail ? !!containerDetail.Config.Tty : undefined;
|
||
|
@@ -736,7 +736,7 @@ class Containers extends React.Component
|
||
|
{_("Show")}
|
||
|
</ToolbarItem>
|
||
|
<ToolbarItem>
|
||
|
- <FormSelect id="containers-containers-filter" value={this.props.filter} onChange={this.props.handleFilterChange}>
|
||
|
+ <FormSelect id="containers-containers-filter" value={this.props.filter} onChange={(_, value) => this.props.handleFilterChange(value)}>
|
||
|
<FormSelectOption value='all' label={_("All")} />
|
||
|
<FormSelectOption value='running' label={_("Only running")} />
|
||
|
</FormSelect>
|
||
|
Index: cockpit-podman-70/src/Containers.scss
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/Containers.scss
|
||
|
+++ cockpit-podman-70/src/Containers.scss
|
||
|
@@ -1,54 +1,54 @@
|
||
|
@import "global-variables";
|
||
|
|
||
|
.container-pod {
|
||
|
- .pf-c-card__header {
|
||
|
+ .pf-v5-c-card__header {
|
||
|
border-color: #ddd;
|
||
|
- padding-top: var(--pf-global--spacer--md);
|
||
|
+ padding-top: var(--pf-v5-global--spacer--md);
|
||
|
}
|
||
|
|
||
|
.pod-header-details {
|
||
|
border-color: #ddd;
|
||
|
- margin-top: var(--pf-global--spacer--md);
|
||
|
- margin-left: var(--pf-global--spacer--md);
|
||
|
- margin-right: var(--pf-global--spacer--md);
|
||
|
+ margin-top: var(--pf-v5-global--spacer--md);
|
||
|
+ margin-left: var(--pf-v5-global--spacer--md);
|
||
|
+ margin-right: var(--pf-v5-global--spacer--md);
|
||
|
}
|
||
|
|
||
|
.pod-details-button {
|
||
|
padding-left: 0;
|
||
|
padding-right: 0;
|
||
|
- margin-right: var(--pf-global--spacer--md);
|
||
|
+ margin-right: var(--pf-v5-global--spacer--md);
|
||
|
}
|
||
|
|
||
|
.pod-details-button-color {
|
||
|
- color: var(--pf-c-button--m-secondary--Color);
|
||
|
+ color: var(--pf-v5-c-button--m-secondary--Color);
|
||
|
}
|
||
|
|
||
|
- .pf-c-card__title {
|
||
|
+ .pf-v5-c-card__title {
|
||
|
padding: 0;
|
||
|
- font-weight: var(--pf-global--FontWeight--normal);
|
||
|
- font-size: var(--pf-global--FontSize--sm);
|
||
|
+ font-weight: var(--pf-v5-global--FontWeight--normal);
|
||
|
+ font-size: var(--pf-v5-global--FontSize--sm);
|
||
|
|
||
|
.pod-name {
|
||
|
- font-weight: var(--pf-global--FontWeight--bold);
|
||
|
- font-size: var(--pf-global--FontSize--md);
|
||
|
+ font-weight: var(--pf-v5-global--FontWeight--bold);
|
||
|
+ font-size: var(--pf-v5-global--FontSize--md);
|
||
|
padding-right: 1rem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- > .pf-c-card__header {
|
||
|
+ > .pf-v5-c-card__header {
|
||
|
&:not(:last-child) {
|
||
|
- padding-bottom: var(--pf-global--spacer-sm);
|
||
|
+ padding-bottom: var(--pf-v5-global--spacer-sm);
|
||
|
}
|
||
|
|
||
|
// Reduce vertical padding of pod header items
|
||
|
- > .pf-c-card__title > .pf-l-flex {
|
||
|
- row-gap: var(--pf-global--spacer--sm);
|
||
|
+ > .pf-v5-c-card__title > .pf-l-flex {
|
||
|
+ row-gap: var(--pf-v5-global--spacer--sm);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.pod-stat {
|
||
|
- @media (max-width: $pf-global--breakpoint--sm - 1) {
|
||
|
+ @media (max-width: $pf-v5-global--breakpoint--sm - 1) {
|
||
|
// Place each pod stat on its own row
|
||
|
flex-basis: 100%;
|
||
|
display: grid;
|
||
|
@@ -68,7 +68,7 @@
|
||
|
}
|
||
|
|
||
|
.ct-table-empty td {
|
||
|
- padding: var(--pf-global--spacer--sm) var(--pf-global--spacer--md) var(--pf-global--spacer--lg);
|
||
|
+ padding: var(--pf-v5-global--spacer--sm) var(--pf-global--spacer--md) var(--pf-global--spacer--lg);
|
||
|
}
|
||
|
|
||
|
/* HACK - force DescriptionList to wrap but not fill the width */
|
||
|
@@ -78,8 +78,8 @@
|
||
|
}
|
||
|
|
||
|
/* Upstream issue https://github.com/patternfly/patternfly/pull/3714 */
|
||
|
-.containers-containers .pf-c-toolbar__content-section {
|
||
|
- gap: var(--pf-global--spacer--sm);
|
||
|
+.containers-containers .pf-v5-c-toolbar__content-section {
|
||
|
+ gap: var(--pf-v5-global--spacer--sm);
|
||
|
}
|
||
|
|
||
|
/* Drop the excessive margin for a Dropdown button */
|
||
|
Index: cockpit-podman-70/src/DynamicListForm.scss
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/DynamicListForm.scss
|
||
|
+++ cockpit-podman-70/src/DynamicListForm.scss
|
||
|
@@ -1,11 +1,11 @@
|
||
|
@import "global-variables";
|
||
|
|
||
|
.dynamic-form-group {
|
||
|
- .pf-c-empty-state {
|
||
|
+ .pf-v5-c-empty-state {
|
||
|
padding: 0;
|
||
|
}
|
||
|
|
||
|
- .pf-c-form__label {
|
||
|
+ .pf-v5-c-form__label {
|
||
|
// Don't allow labels to wrap
|
||
|
white-space: nowrap;
|
||
|
}
|
||
|
@@ -19,21 +19,21 @@
|
||
|
}
|
||
|
|
||
|
// Set check to the same height as input widgets and vertically align
|
||
|
- .pf-c-form__group-control > .pf-c-check {
|
||
|
+ .pf-v5-c-form__group-control > .pf-c-check {
|
||
|
// Set height to the same as inputs
|
||
|
// Font height is font size * line height (1rem * 1.5)
|
||
|
// Widgets have 5px padding, 1px border (top & bottom): (5 + 1) * 2 = 12
|
||
|
// This all equals to 36px
|
||
|
- height: calc(var(--pf-global--FontSize--md) * var(--pf-global--LineHeight--md) + 12px);
|
||
|
+ height: calc(var(--pf-v5-global--FontSize--md) * var(--pf-global--LineHeight--md) + 12px);
|
||
|
align-content: center;
|
||
|
}
|
||
|
|
||
|
// We use FormFieldGroup PF component for the nested look and for ability to add buttons to the header
|
||
|
// However we want to save space and not add indent to the left so we need to override it
|
||
|
- .pf-c-form__field-group-body {
|
||
|
+ .pf-v5-c-form__field-group-body {
|
||
|
// Stretch content fully
|
||
|
- --pf-c-form__field-group-body--GridColumn: 1 / -1;
|
||
|
+ --pf-v5-c-form__field-group-body--GridColumn: 1 / -1;
|
||
|
// Reduce padding at the top
|
||
|
- --pf-c-form__field-group-body--PaddingTop: var(--pf-global--spacer--xs);
|
||
|
+ --pf-v5-c-form__field-group-body--PaddingTop: var(--pf-v5-global--spacer--xs);
|
||
|
}
|
||
|
}
|
||
|
Index: cockpit-podman-70/src/ImageRunModal.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ImageRunModal.jsx
|
||
|
+++ cockpit-podman-70/src/ImageRunModal.jsx
|
||
|
@@ -90,12 +90,12 @@ const EnvVar = ({ id, item, onChange, id
|
||
|
<FormGroup className="pf-m-6-col-on-md" label={_("Key")} fieldId={id + "-key-address"}>
|
||
|
<TextInput id={id + "-key"}
|
||
|
value={item.envKey || ''}
|
||
|
- onChange={value => handleEnvValue('envKey', value, idx, onChange, additem, itemCount, item.envValue)} />
|
||
|
+ onChange={(_, value) => handleEnvValue('envKey', value, idx, onChange, additem, itemCount, item.envValue)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-6-col-on-md" label={_("Value")} fieldId={id + "-value-address"}>
|
||
|
<TextInput id={id + "-value"}
|
||
|
value={item.envValue || ''}
|
||
|
- onChange={value => handleEnvValue('envValue', value, idx, onChange, additem, itemCount, item.envKey)} />
|
||
|
+ onChange={(_, value) => handleEnvValue('envValue', value, idx, onChange, additem, itemCount, item.envKey)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-1-col-on-md remove-button-group">
|
||
|
<Button variant='secondary'
|
||
|
@@ -652,7 +652,7 @@ export class ImageRunModal extends React
|
||
|
// Add the search component
|
||
|
const footer = (
|
||
|
<ToggleGroup className='image-search-footer' aria-label={_("Search by registry")}>
|
||
|
- <ToggleGroupItem text={_("All")} key='all' isSelected={this.state.searchByRegistry == 'all'} onChange={(_, ev) => {
|
||
|
+ <ToggleGroupItem text={_("All")} key='all' isSelected={this.state.searchByRegistry == 'all'} onChange={(ev, _) => {
|
||
|
ev.stopPropagation();
|
||
|
this.setState({ searchByRegistry: 'all' });
|
||
|
}}
|
||
|
@@ -661,7 +661,7 @@ export class ImageRunModal extends React
|
||
|
ev.stopPropagation();
|
||
|
}}
|
||
|
/>
|
||
|
- <ToggleGroupItem text={_("Local")} key='local' isSelected={this.state.searchByRegistry == 'local'} onChange={(_, ev) => {
|
||
|
+ <ToggleGroupItem text={_("Local")} key='local' isSelected={this.state.searchByRegistry == 'local'} onChange={(ev, _) => {
|
||
|
ev.stopPropagation();
|
||
|
this.setState({ searchByRegistry: 'local' });
|
||
|
}}
|
||
|
@@ -675,7 +675,7 @@ export class ImageRunModal extends React
|
||
|
<ToggleGroupItem
|
||
|
text={index} key={index}
|
||
|
isSelected={ this.state.searchByRegistry == index }
|
||
|
- onChange={ (_, ev) => {
|
||
|
+ onChange={ (ev, _) => {
|
||
|
ev.stopPropagation();
|
||
|
this.setState({ searchByRegistry: index });
|
||
|
} }
|
||
|
@@ -694,10 +694,10 @@ export class ImageRunModal extends React
|
||
|
className="image-name"
|
||
|
placeholder={_("Container name")}
|
||
|
value={dialogValues.containerName}
|
||
|
- onChange={value => this.onValueChanged('containerName', value)} />
|
||
|
+ onChange={(_, value) => this.onValueChanged('containerName', value)} />
|
||
|
</FormGroup>
|
||
|
<Tabs activeKey={activeTabKey} onSelect={this.handleTabClick}>
|
||
|
- <Tab eventKey={0} title={<TabTitleText>{_("Details")}</TabTitleText>} className="pf-c-form pf-m-horizontal">
|
||
|
+ <Tab eventKey={0} title={<TabTitleText>{_("Details")}</TabTitleText>} className="pf-v5-c-form pf-m-horizontal">
|
||
|
{ this.props.userServiceAvailable && this.props.systemServiceAvailable &&
|
||
|
<FormGroup isInline hasNoPaddingTop fieldId='run-image-dialog-owner' label={_("Owner")}
|
||
|
labelIcon={
|
||
|
@@ -735,7 +735,7 @@ export class ImageRunModal extends React
|
||
|
</TextContent>
|
||
|
</>
|
||
|
}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -765,7 +765,7 @@ export class ImageRunModal extends React
|
||
|
<FlexItem>{cockpit.format(_("Searching: $0"), "quay.io/busybox")}</FlexItem>
|
||
|
</Flex>
|
||
|
}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -789,7 +789,7 @@ export class ImageRunModal extends React
|
||
|
onClear={this.clearImageSelection}
|
||
|
// onFilter must be set or the spinner crashes https://github.com/patternfly/patternfly-react/issues/6384
|
||
|
onFilter={() => {}}
|
||
|
- onTypeaheadInputChanged={value => this.debouncedInputChanged(value)}
|
||
|
+ onTypeaheadInputChanged={this.debouncedInputChanged}
|
||
|
footer={footer}
|
||
|
isDisabled={!!this.props.image}
|
||
|
>
|
||
|
@@ -814,7 +814,7 @@ export class ImageRunModal extends React
|
||
|
<FormGroup fieldId='run-image-dialog-command' label={_("Command")}>
|
||
|
<TextInput id='run-image-dialog-command'
|
||
|
value={dialogValues.command || ''}
|
||
|
- onChange={value => this.onValueChanged('command', value)} />
|
||
|
+ onChange={(_, value) => this.onValueChanged('command', value)} />
|
||
|
</FormGroup>
|
||
|
|
||
|
<FormGroup fieldId="run=image-dialog-tty">
|
||
|
@@ -861,7 +861,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("CPU Shares help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("CPU shares determine the priority of running containers. Default priority is 1024. A higher number prioritizes this container. A lower number decreases priority.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -893,7 +893,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Restart policy help")}
|
||
|
enableFlip
|
||
|
bodyContent={this.props.userLingeringEnabled ? _("Restart policy to follow when containers exit. Using linger for auto-starting containers may not work in some circumstances, such as when ecryptfs, systemd-homed, NFS, or 2FA are used on a user account.") : _("Restart policy to follow when containers exit.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -929,7 +929,7 @@ export class ImageRunModal extends React
|
||
|
</Grid>
|
||
|
}
|
||
|
</Tab>
|
||
|
- <Tab eventKey={1} title={<TabTitleText>{_("Integration")}</TabTitleText>} id="create-image-dialog-tab-integration" className="pf-c-form">
|
||
|
+ <Tab eventKey={1} title={<TabTitleText>{_("Integration")}</TabTitleText>} id="create-image-dialog-tab-integration" className="pf-v5-c-form">
|
||
|
|
||
|
<DynamicListForm id='run-image-dialog-publish'
|
||
|
emptyStateString={_("No ports exposed")}
|
||
|
@@ -960,11 +960,11 @@ export class ImageRunModal extends React
|
||
|
helperText={_("Paste one or more lines of key=value pairs into any field for bulk import")}
|
||
|
itemcomponent={ <EnvVar />} />
|
||
|
</Tab>
|
||
|
- <Tab eventKey={2} title={<TabTitleText>{_("Health check")}</TabTitleText>} id="create-image-dialog-tab-healthcheck" className="pf-c-form pf-m-horizontal">
|
||
|
+ <Tab eventKey={2} title={<TabTitleText>{_("Health check")}</TabTitleText>} id="create-image-dialog-tab-healthcheck" className="pf-v5-c-form pf-m-horizontal">
|
||
|
<FormGroup fieldId='run-image-dialog-healthcheck-command' label={_("Command")}>
|
||
|
<TextInput id='run-image-dialog-healthcheck-command'
|
||
|
value={dialogValues.healthcheck_command || ''}
|
||
|
- onChange={value => this.onValueChanged('healthcheck_command', value)} />
|
||
|
+ onChange={(_, value) => this.onValueChanged('healthcheck_command', value)} />
|
||
|
</FormGroup>
|
||
|
|
||
|
<FormGroup fieldId='run-image-healthcheck-interval' label={_("Interval")}
|
||
|
@@ -972,7 +972,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Health check interval help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("Interval how often health check is run.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -997,7 +997,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Health check timeout help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("The maximum time allowed to complete the health check before an interval is considered failed.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -1022,7 +1022,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Health check start period help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("The initialization time needed for a container to bootstrap.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -1047,7 +1047,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Health check retries help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("The number of retries allowed before a healthcheck is considered to be unhealthy.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -1070,7 +1070,7 @@ export class ImageRunModal extends React
|
||
|
<Popover aria-label={_("Health failure check action help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("Action to take once the container transitions to an unhealthy state.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
Index: cockpit-podman-70/src/ImageRunModal.scss
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ImageRunModal.scss
|
||
|
+++ cockpit-podman-70/src/ImageRunModal.scss
|
||
|
@@ -1,14 +1,14 @@
|
||
|
@import "global-variables";
|
||
|
|
||
|
// Ensure the width fits within the screen boundaries (with padding on the sides)
|
||
|
-.pf-c-select__menu {
|
||
|
+.pf-v5-c-select__menu {
|
||
|
// 3xl is the left+right padding for an iPhone SE;
|
||
|
// this works on other screen sizes as well
|
||
|
- max-width: calc(100vw - var(--pf-global--spacer--3xl));
|
||
|
+ max-width: calc(100vw - var(--pf-v5-global--spacer--3xl));
|
||
|
}
|
||
|
|
||
|
// Make sure the footer is visible with more then 5 results.
|
||
|
-.pf-c-select__menu-list {
|
||
|
+.pf-v5-c-select__menu-list {
|
||
|
// 35% viewport height is for 1280x720;
|
||
|
// since it picks the min of the two, it works everywhere
|
||
|
max-height: min(20rem, 35vh);
|
||
|
@@ -16,14 +16,14 @@
|
||
|
}
|
||
|
|
||
|
// Fix the dot next to spinner: https://github.com/patternfly/patternfly-react/issues/6383
|
||
|
-.pf-c-select__list-item.pf-m-loading {
|
||
|
+.pf-v5-c-select__list-item.pf-m-loading {
|
||
|
list-style-type: none;
|
||
|
}
|
||
|
|
||
|
.image-search-footer {
|
||
|
flex-wrap: wrap;
|
||
|
|
||
|
- .pf-c-toggle-group__text {
|
||
|
+ .pf-v5-c-toggle-group__text {
|
||
|
word-wrap: break-word;
|
||
|
}
|
||
|
}
|
||
|
@@ -31,17 +31,17 @@
|
||
|
// PF4 does not yet support multiple form fields for the same label
|
||
|
.ct-input-group-spacer-sm.pf-l-flex {
|
||
|
// Limit width for select entries and inputs in the input groups otherwise they take up the whole space
|
||
|
- > .pf-c-select, .pf-c-form-control:not(.pf-c-select__toggle-typeahead) {
|
||
|
+ > .pf-v5-c-select, .pf-c-form-control:not(.pf-c-select__toggle-typeahead) {
|
||
|
max-width: 8ch;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// HACK: A local copy of pf-m-horizontal (as ct-m-horizontal),
|
||
|
// but applied at the FormGroup level instead of Form
|
||
|
-@media (min-width: $pf-global--breakpoint--md) {
|
||
|
- .pf-c-form__group.ct-m-horizontal {
|
||
|
+@media (min-width: $pf-v5-global--breakpoint--md) {
|
||
|
+ .pf-v5-c-form__group.ct-m-horizontal {
|
||
|
display: grid;
|
||
|
- grid-column-gap: var(--pf-c-form--m-horizontal__group-label--md--GridColumnGap);
|
||
|
- grid-template-columns: var(--pf-c-form--m-horizontal__group-label--md--GridColumnWidth) var(--pf-c-form--m-horizontal__group-control--md--GridColumnWidth);
|
||
|
+ grid-column-gap: var(--pf-v5-c-form--m-horizontal__group-label--md--GridColumnGap);
|
||
|
+ grid-template-columns: var(--pf-v5-c-form--m-horizontal__group-label--md--GridColumnWidth) var(--pf-c-form--m-horizontal__group-control--md--GridColumnWidth);
|
||
|
}
|
||
|
}
|
||
|
Index: cockpit-podman-70/src/ImageSearchModal.css
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ImageSearchModal.css
|
||
|
+++ cockpit-podman-70/src/ImageSearchModal.css
|
||
|
@@ -1,9 +1,9 @@
|
||
|
-.podman-search .pf-c-modal-box__body {
|
||
|
+.podman-search .pf-v5-c-modal-box__body {
|
||
|
display: grid;
|
||
|
grid-auto-flow: row;
|
||
|
overflow: hidden;
|
||
|
grid-template-rows: auto auto 1fr;
|
||
|
- grid-gap: var(--pf-global--spacer--sm);
|
||
|
+ grid-gap: var(--pf-v5-global--spacer--sm);
|
||
|
}
|
||
|
|
||
|
.image-list-item {
|
||
|
@@ -12,11 +12,11 @@
|
||
|
}
|
||
|
|
||
|
.image-list-item + .image-list-item {
|
||
|
- border-top: 1px solid var(--pf-global--BorderColor--200);
|
||
|
+ border-top: 1px solid var(--pf-v5-global--BorderColor--200);
|
||
|
}
|
||
|
|
||
|
.image-list-item > .image-name {
|
||
|
- color: var(--pf-global--Color--100);
|
||
|
+ color: var(--pf-v5-global--Color--100);
|
||
|
}
|
||
|
|
||
|
@media (min-width: 768px) {
|
||
|
@@ -44,17 +44,17 @@
|
||
|
}
|
||
|
|
||
|
.image-search-tag-form {
|
||
|
- margin-bottom: var(--pf-global--spacer--md);
|
||
|
+ margin-bottom: var(--pf-v5-global--spacer--md);
|
||
|
}
|
||
|
|
||
|
-.podman-search .pf-c-modal-box__footer {
|
||
|
+.podman-search .pf-v5-c-modal-box__footer {
|
||
|
display: initial;
|
||
|
}
|
||
|
|
||
|
-.podman-search .pf-c-data-list {
|
||
|
+.podman-search .pf-v5-c-data-list {
|
||
|
overflow-y: auto;
|
||
|
}
|
||
|
|
||
|
-.podman-search .pf-l-flex .pf-c-form__group:nth-child(2) {
|
||
|
- grid-template-columns: 2rem var(--pf-c-form--m-horizontal__group-control--md--GridColumnWidth);
|
||
|
+.podman-search .pf-l-flex .pf-v5-c-form__group:nth-child(2) {
|
||
|
+ grid-template-columns: 2rem var(--pf-v5-c-form--m-horizontal__group-control--md--GridColumnWidth);
|
||
|
}
|
||
|
Index: cockpit-podman-70/src/ImageSearchModal.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/ImageSearchModal.jsx
|
||
|
+++ cockpit-podman-70/src/ImageSearchModal.jsx
|
||
|
@@ -170,7 +170,7 @@ export class ImageSearchModal extends Re
|
||
|
placeholder={_("Search by name or description")}
|
||
|
value={this.state.imageIdentifier}
|
||
|
onKeyPress={this.onKeyPress}
|
||
|
- onChange={value => this.onValueChanged('imageIdentifier', value)} />
|
||
|
+ onChange={(_event, value) => this.onValueChanged('imageIdentifier', value)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup fieldId="registry-select" label={_("in")}>
|
||
|
<FormSelect id='registry-select'
|
||
|
@@ -234,7 +234,7 @@ export class ImageSearchModal extends Re
|
||
|
type='text'
|
||
|
placeholder="latest"
|
||
|
value={this.state.imageTag || ''}
|
||
|
- onChange={value => this.onValueChanged('imageTag', value)} />
|
||
|
+ onChange={(_event, value) => this.onValueChanged('imageTag', value)} />
|
||
|
</FormGroup>
|
||
|
</Form>
|
||
|
<Button variant='primary' isDisabled={this.state.selected == undefined} onClick={this.onDownloadClicked}>
|
||
|
Index: cockpit-podman-70/src/Images.css
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/Images.css
|
||
|
+++ cockpit-podman-70/src/Images.css
|
||
|
@@ -4,15 +4,15 @@
|
||
|
}
|
||
|
|
||
|
/* Danger dropdown items should be red */
|
||
|
-.pf-c-dropdown__menu-item.pf-m-danger:not(.pf-m-disabled, .pf-m-aria-disabled) {
|
||
|
- color: var(--pf-global--danger-color--200);
|
||
|
+.pf-v5-c-dropdown__menu-item.pf-m-danger:not(.pf-m-disabled, .pf-m-aria-disabled) {
|
||
|
+ color: var(--pf-v5-global--danger-color--200);
|
||
|
}
|
||
|
|
||
|
-#containers-images .pf-c-table.pf-m-compact .pf-c-table__action {
|
||
|
- --pf-c-table__action--PaddingTop: 0.5rem;
|
||
|
- --pf-c-table__action--PaddingBottom: 0.5rem;
|
||
|
+#containers-images .pf-v5-c-table.pf-m-compact .pf-c-table__action {
|
||
|
+ --pf-v5-c-table__action--PaddingTop: 0.5rem;
|
||
|
+ --pf-v5-c-table__action--PaddingBottom: 0.5rem;
|
||
|
}
|
||
|
|
||
|
-.containers-images .pf-c-expandable-section__content {
|
||
|
+.containers-images .pf-v5-c-expandable-section__content {
|
||
|
margin-top: 0;
|
||
|
}
|
||
|
Index: cockpit-podman-70/src/Images.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/Images.jsx
|
||
|
+++ cockpit-podman-70/src/Images.jsx
|
||
|
@@ -142,7 +142,7 @@ class Images extends React.Component {
|
||
|
userPodmanRestartAvailable={this.props.userPodmanRestartAvailable}
|
||
|
userLingeringEnabled={this.props.userLingeringEnabled}
|
||
|
version={this.props.version} />,
|
||
|
- props: { className: 'pf-c-table__action content-action' }
|
||
|
+ props: { className: 'pf-v5-c-table__action content-action' }
|
||
|
},
|
||
|
];
|
||
|
|
||
|
@@ -288,7 +288,7 @@ class Images extends React.Component {
|
||
|
<CardTitle>
|
||
|
<Text component={TextVariants.h2}>{_("Images")}</Text>
|
||
|
</CardTitle>
|
||
|
- <Flex className="ignore-pixels" style={{ rowGap: "var(--pf-global--spacer--xs)" }}>{imageTitleStats}</Flex>
|
||
|
+ <Flex className="ignore-pixels" style={{ rowGap: "var(--pf-v5-global--spacer--xs)" }}>{imageTitleStats}</Flex>
|
||
|
</Flex>
|
||
|
</FlexItem>
|
||
|
<FlexItem>
|
||
|
Index: cockpit-podman-70/src/PodCreateModal.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/PodCreateModal.jsx
|
||
|
+++ cockpit-podman-70/src/PodCreateModal.jsx
|
||
|
@@ -100,7 +100,7 @@ export const PodCreateModal = ({ user, s
|
||
|
value={podName}
|
||
|
validated={nameError ? "error" : "default"}
|
||
|
aria-label={nameError}
|
||
|
- onChange={value => onValueChanged('podName', value)} />
|
||
|
+ onChange={(_event, value) => onValueChanged('podName', value)} />
|
||
|
<FormHelper fieldId="create-pod-dialog-name" helperTextInvalid={nameError} />
|
||
|
</FormGroup>
|
||
|
{ userServiceAvailable && systemServiceAvailable &&
|
||
|
Index: cockpit-podman-70/src/PublishPort.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/PublishPort.jsx
|
||
|
+++ cockpit-podman-70/src/PublishPort.jsx
|
||
|
@@ -20,14 +20,14 @@ export const PublishPort = ({ id, item,
|
||
|
<Popover aria-label={_("IP address help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("If host IP is set to 0.0.0.0 or not set at all, the port will be bound on all IPs on the host.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
}>
|
||
|
<TextInput id={id + "-ip-address"}
|
||
|
value={item.IP || ''}
|
||
|
- onChange={value => onChange(idx, 'IP', value)} />
|
||
|
+ onChange={(_event, value) => onChange(idx, 'IP', value)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-2-col-on-md"
|
||
|
label={_("Host port")}
|
||
|
@@ -36,7 +36,7 @@ export const PublishPort = ({ id, item,
|
||
|
<Popover aria-label={_("Host port help")}
|
||
|
enableFlip
|
||
|
bodyContent={_("If the host port is not set the container port will be randomly assigned a port on the host.")}>
|
||
|
- <button onClick={e => e.preventDefault()} className="pf-c-form__group-label-help">
|
||
|
+ <button onClick={e => e.preventDefault()} className="pf-v5-c-form__group-label-help">
|
||
|
<OutlinedQuestionCircleIcon />
|
||
|
</button>
|
||
|
</Popover>
|
||
|
@@ -47,7 +47,7 @@ export const PublishPort = ({ id, item,
|
||
|
min={1}
|
||
|
max={65535}
|
||
|
value={item.hostPort || ''}
|
||
|
- onChange={value => onChange(idx, 'hostPort', value)} />
|
||
|
+ onChange={(_event, value) => onChange(idx, 'hostPort', value)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-2-col-on-md"
|
||
|
label={_("Container port")}
|
||
|
@@ -58,12 +58,12 @@ export const PublishPort = ({ id, item,
|
||
|
min={1}
|
||
|
max={65535}
|
||
|
value={item.containerPort || ''}
|
||
|
- onChange={value => onChange(idx, 'containerPort', value)} />
|
||
|
+ onChange={(_event, value) => onChange(idx, 'containerPort', value)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-2-col-on-md"
|
||
|
label={_("Protocol")}
|
||
|
fieldId={id + "-protocol"}>
|
||
|
- <FormSelect className='pf-c-form-control container-port-protocol'
|
||
|
+ <FormSelect className='pf-v5-c-form-control container-port-protocol'
|
||
|
id={id + "-protocol"}
|
||
|
value={item.protocol}
|
||
|
onChange={(_event, value) => onChange(idx, 'protocol', value)}>
|
||
|
Index: cockpit-podman-70/src/Volume.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/Volume.jsx
|
||
|
+++ cockpit-podman-70/src/Volume.jsx
|
||
|
@@ -22,7 +22,7 @@ export const Volume = ({ id, item, onCha
|
||
|
<FormGroup className="pf-m-3-col-on-md" label={_("Container path")} fieldId={id + "-container-path"}>
|
||
|
<TextInput id={id + "-container-path"}
|
||
|
value={item.containerPath || ''}
|
||
|
- onChange={value => onChange(idx, 'containerPath', value)} />
|
||
|
+ onChange={(_event, value) => onChange(idx, 'containerPath', value)} />
|
||
|
</FormGroup>
|
||
|
<FormGroup className="pf-m-2-col-on-md" label={_("Mode")} fieldId={id + "-mode"}>
|
||
|
<Checkbox id={id + "-mode"}
|
||
|
@@ -32,7 +32,7 @@ export const Volume = ({ id, item, onCha
|
||
|
</FormGroup>
|
||
|
{ options && options.selinuxAvailable &&
|
||
|
<FormGroup className="pf-m-3-col-on-md" label={_("SELinux")} fieldId={id + "-selinux"}>
|
||
|
- <FormSelect id={id + "-selinux"} className='pf-c-form-control'
|
||
|
+ <FormSelect id={id + "-selinux"} className='pf-v5-c-form-control'
|
||
|
value={item.selinux}
|
||
|
onChange={(_event, value) => onChange(idx, 'selinux', value)}>
|
||
|
<FormSelectOption value='' key='' label={_("No label")} />
|
||
|
Index: cockpit-podman-70/src/app.jsx
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/app.jsx
|
||
|
+++ cockpit-podman-70/src/app.jsx
|
||
|
@@ -139,7 +139,7 @@ class Application extends React.Componen
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- onContainerFilterChanged(_event, value) {
|
||
|
+ onContainerFilterChanged(value) {
|
||
|
this.setState({
|
||
|
containersFilter: value
|
||
|
});
|
||
|
@@ -802,7 +802,7 @@ class Application extends React.Componen
|
||
|
variant={PageSectionVariants.light}>
|
||
|
<ContainerHeader
|
||
|
handleFilterChanged={this.onFilterChanged}
|
||
|
- handleOwnerChanged={(_event, value) => this.onOwnerChanged(value)}
|
||
|
+ handleOwnerChanged={this.onOwnerChanged}
|
||
|
ownerFilter={this.state.ownerFilter}
|
||
|
textFilter={this.state.textFilter}
|
||
|
twoOwners={this.state.systemServiceAvailable && this.state.userServiceAvailable}
|
||
|
Index: cockpit-podman-70/src/podman.scss
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/src/podman.scss
|
||
|
+++ cockpit-podman-70/src/podman.scss
|
||
|
@@ -1,25 +1,25 @@
|
||
|
@use "ct-card.scss";
|
||
|
@use "page.scss";
|
||
|
@import "global-variables";
|
||
|
-// For pf-line-clamp
|
||
|
+// For pf-v5-line-clamp
|
||
|
@import "@patternfly/patternfly/sass-utilities/mixins.scss";
|
||
|
// For pf-u-disabled-color-100
|
||
|
@import "@patternfly/patternfly/utilities/Text/text.css";
|
||
|
|
||
|
-#app .pf-c-card.containers-containers, #app .pf-c-card.containers-images {
|
||
|
+#app .pf-v5-c-card.containers-containers, #app .pf-c-card.containers-images {
|
||
|
@extend .ct-card;
|
||
|
}
|
||
|
|
||
|
#containers-images, #containers-containers {
|
||
|
// Decrease padding for the image/container toggle button list
|
||
|
- .pf-c-table.pf-m-compact .pf-c-table__toggle {
|
||
|
+ .pf-v5-c-table.pf-m-compact .pf-c-table__toggle {
|
||
|
padding-left: 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@media screen and (max-width: 768px) {
|
||
|
// Badges should not stretch in mobile mode
|
||
|
- .pf-c-table [data-label] > .pf-c-badge {
|
||
|
+ .pf-v5-c-table [data-label] > .pf-c-badge {
|
||
|
justify-self: start;
|
||
|
}
|
||
|
}
|
||
|
@@ -30,12 +30,12 @@
|
||
|
}
|
||
|
|
||
|
.container-block small {
|
||
|
- @include pf-line-clamp("1");
|
||
|
- color: var(--pf-global--Color--200);
|
||
|
+ @include pf-v5-line-clamp("1");
|
||
|
+ color: var(--pf-v5-global--Color--200);
|
||
|
}
|
||
|
|
||
|
.container-name {
|
||
|
- font-size: var(--pf-global--FontSize--lg);
|
||
|
+ font-size: var(--pf-v5-global--FontSize--lg);
|
||
|
font-weight: 400;
|
||
|
}
|
||
|
|
||
|
@@ -43,7 +43,7 @@
|
||
|
max-width: 15em;
|
||
|
}
|
||
|
|
||
|
-.pf-c-alert__description {
|
||
|
+.pf-v5-c-alert__description {
|
||
|
overflow-wrap: anywhere;
|
||
|
}
|
||
|
|
||
|
@@ -54,26 +54,26 @@
|
||
|
}
|
||
|
|
||
|
.ct-badge-container-running, .ct-badge-pod-running {
|
||
|
- background-color: var(--pf-global--info-color--100);
|
||
|
+ background-color: var(--pf-v5-global--info-color--100);
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.ct-badge-container-healthy {
|
||
|
- background-color: var(--pf-global--success-color--100);
|
||
|
+ background-color: var(--pf-v5-global--success-color--100);
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.ct-badge-container-unhealthy {
|
||
|
- background-color: var(--pf-global--danger-color--100);
|
||
|
+ background-color: var(--pf-v5-global--danger-color--100);
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.green {
|
||
|
- color: var(--pf-global--success-color--100);
|
||
|
+ color: var(--pf-v5-global--success-color--100);
|
||
|
}
|
||
|
|
||
|
.red {
|
||
|
- color: var(--pf-global--danger-color--100);
|
||
|
+ color: var(--pf-v5-global--danger-color--100);
|
||
|
}
|
||
|
|
||
|
// Hide the header nav from the expandable rows - this should be better done with JS but the current cockpit-listing-panel implementation does not support this variant
|
||
|
@@ -82,7 +82,7 @@
|
||
|
}
|
||
|
|
||
|
.ct-grey-text {
|
||
|
- color: var(--pf-global--Color--200);
|
||
|
+ color: var(--pf-v5-global--Color--200);
|
||
|
}
|
||
|
|
||
|
.content-action {
|
||
|
@@ -92,19 +92,19 @@
|
||
|
|
||
|
// Remove doubled-up padding and borders on nested tables in mobile
|
||
|
.ct-listing-panel-body .ct-table tr {
|
||
|
- --pf-c-table-tr--responsive--PaddingTop: 0;
|
||
|
- --pf-c-table-tr--responsive--PaddingRight: 0;
|
||
|
- --pf-c-table-tr--responsive--PaddingBottom: 0;
|
||
|
- --pf-c-table-tr--responsive--PaddingLeft: 0;
|
||
|
+ --pf-v5-c-table-tr--responsive--PaddingTop: 0;
|
||
|
+ --pf-v5-c-table-tr--responsive--PaddingRight: 0;
|
||
|
+ --pf-v5-c-table-tr--responsive--PaddingBottom: 0;
|
||
|
+ --pf-v5-c-table-tr--responsive--PaddingLeft: 0;
|
||
|
}
|
||
|
|
||
|
-@media (max-width: $pf-global--breakpoint--md - 1) {
|
||
|
+@media (max-width: $pf-v5-global--breakpoint--md - 1) {
|
||
|
.show-only-when-wide {
|
||
|
display: none;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-@media (min-width: $pf-global--breakpoint--md) {
|
||
|
+@media (min-width: $pf-v5-global--breakpoint--md) {
|
||
|
.show-only-when-narrow {
|
||
|
display: none;
|
||
|
}
|
||
|
@@ -112,6 +112,6 @@
|
||
|
// Add borders to no pod containers list and images list
|
||
|
.container-pod.pf-m-plain tbody,
|
||
|
.containers-images tbody {
|
||
|
- border: var(--pf-c-card--m-flat--BorderWidth) solid var(--pf-c-card--m-flat--BorderColor);
|
||
|
+ border: var(--pf-v5-c-card--m-flat--BorderWidth) solid var(--pf-c-card--m-flat--BorderColor);
|
||
|
}
|
||
|
}
|
||
|
Index: cockpit-podman-70/test/check-application
|
||
|
===================================================================
|
||
|
--- cockpit-podman-70.orig/test/check-application
|
||
|
+++ cockpit-podman-70/test/check-application
|
||
|
@@ -1,16 +1,9 @@
|
||
|
-#!/usr/bin/python3
|
||
|
+#!/usr/bin/python3 -cimport os, sys; os.execv(os.path.dirname(sys.argv[1]) + "/common/pywrap", sys.argv)
|
||
|
# Run this with --help to see available options for tracing and debugging
|
||
|
# See https://github.com/cockpit-project/cockpit/blob/main/test/common/testlib.py
|
||
|
# "class Browser" and "class MachineCase" for the available API.
|
||
|
|
||
|
-import os
|
||
|
import json
|
||
|
-import sys
|
||
|
-
|
||
|
-# import Cockpit's machinery for test VMs and its browser test API
|
||
|
-TEST_DIR = os.path.dirname(__file__)
|
||
|
-sys.path.append(os.path.join(TEST_DIR, "common"))
|
||
|
-sys.path.append(os.path.join(os.path.dirname(TEST_DIR), "bots/machine"))
|
||
|
|
||
|
from machine_core import ssh_connection # noqa
|
||
|
import testlib # noqa
|
||
|
@@ -45,8 +38,8 @@ def podman_version(cls):
|
||
|
|
||
|
|
||
|
def showImages(browser):
|
||
|
- if browser.attr("#containers-images button.pf-c-expandable-section__toggle", "aria-expanded") == 'false':
|
||
|
- browser.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ if browser.attr("#containers-images button.pf-v5-c-expandable-section__toggle", "aria-expanded") == 'false':
|
||
|
+ browser.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
|
||
|
def checkImage(browser, name, owner):
|
||
|
@@ -146,15 +139,15 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
def performContainerAction(self, container, cmd):
|
||
|
b = self.browser
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{container}') .pf-c-dropdown__toggle")
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{container}') .pf-c-dropdown__menu li:contains({cmd})")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{container}') .pf-v5-c-dropdown__toggle")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{container}') .pf-v5-c-dropdown__menu li:contains({cmd})")
|
||
|
|
||
|
def getContainerAction(self, container, cmd):
|
||
|
- return f"#containers-containers tbody tr:contains('{container}') .pf-c-dropdown__menu li:contains({cmd})"
|
||
|
+ return f"#containers-containers tbody tr:contains('{container}') .pf-v5-c-dropdown__menu li:contains({cmd})"
|
||
|
|
||
|
def toggleExpandedContainer(self, container):
|
||
|
b = self.browser
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{container}') .pf-c-table__toggle button")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{container}') .pf-v5-c-table__toggle button")
|
||
|
|
||
|
def getContainerAttr(self, container, key, selector=""):
|
||
|
b = self.browser
|
||
|
@@ -185,14 +178,14 @@ class TestApplication(testlib.MachineCas
|
||
|
try:
|
||
|
b.wait_visible("#containers-containers")
|
||
|
b.wait_not_in_text("#containers-containers", "Loading")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
except testlib.Error:
|
||
|
if system:
|
||
|
- b.click("#overview div.pf-c-alert .pf-c-alert__action > button:contains(Start)")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.click("#overview div.pf-v5-c-alert .pf-v5-c-alert__action > button:contains(Start)")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
else:
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
- b.wait_not_present("#app .pf-c-empty-state button")
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
+ b.wait_not_present("#app .pf-v5-c-empty-state button")
|
||
|
|
||
|
def waitPodRow(self, podName, present=False):
|
||
|
if present:
|
||
|
@@ -207,9 +200,9 @@ class TestApplication(testlib.MachineCas
|
||
|
cmd=container["command"], state=container["state"], pod=podName)
|
||
|
else:
|
||
|
if self.browser.val("#containers-containers-filter") == "all":
|
||
|
- self.browser.wait_in_text("#table-" + podName + " .pf-c-empty-state", "No containers in this pod")
|
||
|
+ self.browser.wait_in_text("#table-" + podName + " .pf-v5-c-empty-state", "No containers in this pod")
|
||
|
else:
|
||
|
- self.browser.wait_in_text("#table-" + podName + " .pf-c-empty-state", "No running containers in this pod")
|
||
|
+ self.browser.wait_in_text("#table-" + podName + " .pf-v5-c-empty-state", "No running containers in this pod")
|
||
|
|
||
|
def waitContainerRow(self, container, present=True):
|
||
|
b = self.browser
|
||
|
@@ -295,10 +288,10 @@ class TestApplication(testlib.MachineCas
|
||
|
b.wait(lambda: old_pid != m.execute("podman inspect --format '{{.State.Pid}}' test-pod-1-system".strip()))
|
||
|
|
||
|
self.performPodAction("pod-1", "system", "Delete")
|
||
|
- b.click(".pf-c-modal-box button:contains(Delete)")
|
||
|
- b.wait_in_text(".pf-c-modal-box__body", "running or paused containers cannot be removed without force")
|
||
|
- b.wait_in_text(".pf-c-modal-box__body .pf-c-list", "test-pod-1-system")
|
||
|
- b.click(".pf-c-modal-box button:contains('Force delete')")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains(Delete)")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__body", "running or paused containers cannot be removed without force")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__body .pf-v5-c-list", "test-pod-1-system")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Force delete')")
|
||
|
self.waitPodRow("pod-1", False)
|
||
|
|
||
|
b.set_input_text('#containers-filter', '')
|
||
|
@@ -309,8 +302,8 @@ class TestApplication(testlib.MachineCas
|
||
|
self.machine.execute("podman rm --force -t0 test-pod-2-system")
|
||
|
self.waitPodContainer("pod-2", [])
|
||
|
self.performPodAction("pod-2", "system", "Delete")
|
||
|
- b.wait_not_in_text(".pf-c-modal-box__body", "test-pod-2-system")
|
||
|
- b.click(".pf-c-modal-box button:contains('Delete')")
|
||
|
+ b.wait_not_in_text(".pf-v5-c-modal-box__body", "test-pod-2-system")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Delete')")
|
||
|
self.waitPodRow("pod-2", False)
|
||
|
|
||
|
# Volumes / mounts
|
||
|
@@ -321,11 +314,11 @@ class TestApplication(testlib.MachineCas
|
||
|
# Verify 1 port mapping
|
||
|
b.wait_in_text("#table-pod-3-title .pod-details-ports-btn", "1")
|
||
|
b.click("#table-pod-3-title .pod-details-ports-btn")
|
||
|
- b.wait_in_text(".pf-c-popover__content", "0.0.0.0:9999 → 9999/tcp")
|
||
|
+ b.wait_in_text(".pf-v5-c-popover__content", "0.0.0.0:9999 → 9999/tcp")
|
||
|
# Verify 1 mount
|
||
|
b.wait_in_text("#table-pod-3-title .pod-details-volumes-btn", "1")
|
||
|
b.click("#table-pod-3-title .pod-details-volumes-btn")
|
||
|
- b.wait_in_text(".pf-c-popover__content", "/tmp ↔ /app")
|
||
|
+ b.wait_in_text(".pf-v5-c-popover__content", "/tmp ↔ /app")
|
||
|
|
||
|
def testBasicSystem(self):
|
||
|
self._testBasic(True)
|
||
|
@@ -361,19 +354,19 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click("#image-actions-dropdown")
|
||
|
b.click("button:contains(Download new image)")
|
||
|
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
- b.wait_visible("div.pf-c-modal-box footer button:contains(Download):disabled")
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.wait_visible("div.pf-v5-c-modal-box footer button:contains(Download):disabled")
|
||
|
b.wait_not_present("#as-user")
|
||
|
- b.click(".pf-c-modal-box button:contains('Cancel')")
|
||
|
- b.wait_not_present('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Cancel')")
|
||
|
+ b.wait_not_present('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
|
||
|
# Gain privileges
|
||
|
b.become_superuser(passwordless=self.machine.image == "rhel4edge")
|
||
|
|
||
|
# We are notified that we can also start the system one
|
||
|
- b.wait_in_text("#overview div.pf-c-alert .pf-c-alert__title", "System Podman service is also available")
|
||
|
- b.click("#overview div.pf-c-alert .pf-c-alert__action > button:contains(Start)")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert .pf-c-alert__title")
|
||
|
+ b.wait_in_text("#overview div.pf-v5-c-alert .pf-v5-c-alert__title", "System Podman service is also available")
|
||
|
+ b.click("#overview div.pf-v5-c-alert .pf-v5-c-alert__action > button:contains(Start)")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert .pf-v5-c-alert__title")
|
||
|
|
||
|
checkImage(b, IMG_REGISTRY, "system")
|
||
|
checkImage(b, IMG_REGISTRY, "admin")
|
||
|
@@ -388,11 +381,11 @@ class TestApplication(testlib.MachineCas
|
||
|
# Also user selection in image download should be visible
|
||
|
b.click("#image-actions-dropdown")
|
||
|
b.click("button:contains(Download new image)")
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
- b.wait_visible("div.pf-c-modal-box footer button:contains(Download):disabled")
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.wait_visible("div.pf-v5-c-modal-box footer button:contains(Download):disabled")
|
||
|
b.wait_visible("#as-user")
|
||
|
- b.click(".pf-c-modal-box button:contains('Cancel')")
|
||
|
- b.wait_not_present('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Cancel')")
|
||
|
+ b.wait_not_present('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
|
||
|
# Check that when we filter only system stuff an then drop privileges that we show user stuff
|
||
|
b.set_val("#containers-containers-owner", "system")
|
||
|
@@ -411,27 +404,27 @@ class TestApplication(testlib.MachineCas
|
||
|
# Check showing of entrypoint
|
||
|
b.click("#containers-containers-create-container-btn")
|
||
|
b.click("#create-image-image-select-typeahead")
|
||
|
- b.click(f'button.pf-c-select__menu-item:contains("{IMG_REGISTRY}")')
|
||
|
+ b.click(f'button.pf-v5-c-select__menu-item:contains("{IMG_REGISTRY}")')
|
||
|
b.wait_val("#run-image-dialog-command", '/etc/docker/registry/config.yml')
|
||
|
b.wait_text("#run-image-dialog-entrypoint", '/entrypoint.sh')
|
||
|
|
||
|
# Deleting image will cleanup both command and entrypoint
|
||
|
- b.click("button.pf-c-select__toggle-clear")
|
||
|
+ b.click("button.pf-v5-c-select__toggle-clear")
|
||
|
b.wait_val("#run-image-dialog-command", '')
|
||
|
b.wait_not_present("#run-image-dialog-entrypoint")
|
||
|
|
||
|
# Edited command will not be cleared
|
||
|
b.click("#create-image-image-select-typeahead")
|
||
|
- b.click(f'button.pf-c-select__menu-item:contains("{IMG_REGISTRY}")')
|
||
|
+ b.click(f'button.pf-v5-c-select__menu-item:contains("{IMG_REGISTRY}")')
|
||
|
b.wait_val("#run-image-dialog-command", '/etc/docker/registry/config.yml')
|
||
|
b.set_input_text("#run-image-dialog-command", '/etc/docker/registry/config.yaml')
|
||
|
- b.click("button.pf-c-select__toggle-clear")
|
||
|
+ b.click("button.pf-v5-c-select__toggle-clear")
|
||
|
b.wait_not_present("#run-image-dialog-entrypoint")
|
||
|
b.wait_val("#run-image-dialog-command", '/etc/docker/registry/config.yaml')
|
||
|
|
||
|
# Setting a new image will still keep the old command and not prefill it
|
||
|
b.click("#create-image-image-select-typeahead")
|
||
|
- b.click(f'button.pf-c-select__menu-item:contains({IMG_ALPINE})')
|
||
|
+ b.click(f'button.pf-v5-c-select__menu-item:contains({IMG_ALPINE})')
|
||
|
b.wait_visible("#run-image-dialog-pull-latest-image")
|
||
|
b.wait_val("#run-image-dialog-command", '/etc/docker/registry/config.yaml')
|
||
|
|
||
|
@@ -448,7 +441,7 @@ class TestApplication(testlib.MachineCas
|
||
|
b.wait_visible("#app")
|
||
|
|
||
|
# `User Service is also available` banner should not be present
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
# There should not be any duplicate images listed
|
||
|
# The "busybox" and "alpine" images have been deleted by _testBasic.
|
||
|
showImages(b)
|
||
|
@@ -460,7 +453,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# https://github.com/cockpit-project/cockpit-podman/pull/891
|
||
|
b.click("#containers-containers-create-container-btn")
|
||
|
b.set_input_text("#create-image-image-select-typeahead", "registry")
|
||
|
- b.wait_visible('button.pf-c-select__menu-item:contains("registry")')
|
||
|
+ b.wait_visible('button.pf-v5-c-select__menu-item:contains("registry")')
|
||
|
|
||
|
def testBasicUser(self):
|
||
|
self._testBasic(False)
|
||
|
@@ -518,23 +511,23 @@ class TestApplication(testlib.MachineCas
|
||
|
# show image listing toggle
|
||
|
hello_sel = f"#containers-images tbody tr[data-row-id={images[IMG_HELLO_LATEST]}{auth}]".lower()
|
||
|
b.wait_visible(hello_sel)
|
||
|
- b.click(hello_sel + " td.pf-c-table__toggle button")
|
||
|
- b.click(hello_sel + " .pf-c-dropdown__toggle")
|
||
|
+ b.click(hello_sel + " td.pf-v5-c-table__toggle button")
|
||
|
+ b.click(hello_sel + " .pf-v5-c-dropdown__toggle")
|
||
|
b.wait_visible(hello_sel + " button.btn-delete")
|
||
|
b.wait_in_text("#containers-images tbody.pf-m-expanded tr .image-details:first-child", "Command/run.sh")
|
||
|
# Show history
|
||
|
- b.click("#containers-images tbody.pf-m-expanded .pf-c-tabs__list li:nth-child(2) button")
|
||
|
- b.wait_in_text("#containers-images .pf-c-table__expandable-row.pf-m-expanded td[data-label=\"ID\"]:first",
|
||
|
+ b.click("#containers-images tbody.pf-m-expanded .pf-v5-c-tabs__list li:nth-child(2) button")
|
||
|
+ b.wait_in_text("#containers-images .pf-v5-c-table__expandable-row.pf-m-expanded td[data-label=\"ID\"]:first",
|
||
|
images[IMG_HELLO_LATEST][:12])
|
||
|
- b.wait_in_text("#containers-images .pf-c-table__expandable-row.pf-m-expanded td[data-label=\"Created\"]:first",
|
||
|
+ b.wait_in_text("#containers-images .pf-v5-c-table__expandable-row.pf-m-expanded td[data-label=\"Created\"]:first",
|
||
|
"today at")
|
||
|
# topmost (last) layer
|
||
|
- b.wait_in_text("#containers-images .pf-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:first",
|
||
|
+ b.wait_in_text("#containers-images .pf-v5-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:first",
|
||
|
"COPY")
|
||
|
- b.wait_in_text("#containers-images .pf-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:first",
|
||
|
+ b.wait_in_text("#containers-images .pf-v5-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:first",
|
||
|
"in /test2.txt")
|
||
|
# initial (first) layer
|
||
|
- b.wait_in_text("#containers-images .pf-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:last",
|
||
|
+ b.wait_in_text("#containers-images .pf-v5-c-table__expandable-row.pf-m-expanded td[data-label=\"Created by\"]:last",
|
||
|
"COPY")
|
||
|
|
||
|
self.execute(auth, f"podman rmi {IMG_HELLO_LATEST}")
|
||
|
@@ -682,31 +675,31 @@ class TestApplication(testlib.MachineCas
|
||
|
self.execute(auth, f"podman tag {IMG_BUSYBOX} {IMG_BUSYBOX}:4")
|
||
|
|
||
|
busybox_sel = f"#containers-images tbody tr[data-row-id={images[IMG_BUSYBOX_LATEST]}{auth}]".lower()
|
||
|
- b.click(busybox_sel + " td.pf-c-table__toggle button")
|
||
|
+ b.click(busybox_sel + " td.pf-v5-c-table__toggle button")
|
||
|
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:1")
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:2")
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:3")
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:4")
|
||
|
|
||
|
- b.click(busybox_sel + " .pf-c-dropdown__toggle")
|
||
|
+ b.click(busybox_sel + " .pf-v5-c-dropdown__toggle")
|
||
|
b.click(busybox_sel + " button.btn-delete")
|
||
|
- self.assertTrue(b.get_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']"))
|
||
|
- b.set_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX}:1']", True)
|
||
|
- b.set_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX}:3']", True)
|
||
|
- b.set_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']", False)
|
||
|
+ self.assertTrue(b.get_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']"))
|
||
|
+ b.set_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX}:1']", True)
|
||
|
+ b.set_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX}:3']", True)
|
||
|
+ b.set_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']", False)
|
||
|
self.confirm_modal("Delete")
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX_LATEST}")
|
||
|
b.wait_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:2")
|
||
|
b.wait_not_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:1")
|
||
|
b.wait_not_in_text(busybox_sel + " + tr", f"{IMG_BUSYBOX}:3")
|
||
|
|
||
|
- b.click(busybox_sel + " .pf-c-dropdown__toggle")
|
||
|
+ b.click(busybox_sel + " .pf-v5-c-dropdown__toggle")
|
||
|
b.click(busybox_sel + " button.btn-delete")
|
||
|
b.click("button:contains('select all')")
|
||
|
- self.assertTrue(b.get_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']"))
|
||
|
- self.assertTrue(b.get_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX}:2']"))
|
||
|
- self.assertTrue(b.get_checked(f".pf-c-check__input[aria-label='{IMG_BUSYBOX}:4']"))
|
||
|
+ self.assertTrue(b.get_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX_LATEST}']"))
|
||
|
+ self.assertTrue(b.get_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX}:2']"))
|
||
|
+ self.assertTrue(b.get_checked(f".pf-v5-c-check__input[aria-label='{IMG_BUSYBOX}:4']"))
|
||
|
self.confirm_modal("Delete")
|
||
|
self.confirm_modal("Force delete")
|
||
|
b.wait_not_in_text("#containers-images", busybox_sel)
|
||
|
@@ -730,8 +723,8 @@ class TestApplication(testlib.MachineCas
|
||
|
b.assert_pixels('#app', "overview", ignore=[".ignore-pixels"], skip_layouts=["rtl", "mobile"])
|
||
|
alpine_sel = f"#containers-images tbody tr[data-row-id={images[IMG_ALPINE_LATEST]}{auth}]".lower()
|
||
|
b.wait_visible(alpine_sel)
|
||
|
- b.click(alpine_sel + " td.pf-c-table__toggle button")
|
||
|
- b.click(alpine_sel + " .pf-c-dropdown__toggle")
|
||
|
+ b.click(alpine_sel + " td.pf-v5-c-table__toggle button")
|
||
|
+ b.click(alpine_sel + " .pf-v5-c-dropdown__toggle")
|
||
|
b.click(alpine_sel + " button.btn-delete")
|
||
|
self.confirm_modal("Delete")
|
||
|
self.confirm_modal("Force delete")
|
||
|
@@ -768,10 +761,10 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Intermediate images are not shown in create container dialog
|
||
|
b.click("#containers-containers-create-container-btn")
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
b.click("#create-image-image-select-typeahead")
|
||
|
- b.wait_visible(f".pf-c-select__menu-item:contains('{IMG_REGISTRY}')")
|
||
|
- b.wait_not_present(".pf-c-select__menu-item:contains('none')")
|
||
|
+ b.wait_visible(f".pf-v5-c-select__menu-item:contains('{IMG_REGISTRY}')")
|
||
|
+ b.wait_not_present(".pf-v5-c-select__menu-item:contains('none')")
|
||
|
|
||
|
def testCommitUser(self):
|
||
|
self._testCommit(False)
|
||
|
@@ -792,9 +785,9 @@ class TestApplication(testlib.MachineCas
|
||
|
self.toggleExpandedContainer("test-sh0")
|
||
|
|
||
|
self.performContainerAction("test-sh0", "Commit")
|
||
|
- b.wait_visible(".pf-c-modal-box")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box")
|
||
|
|
||
|
- b.wait_in_text(".pf-c-modal-box__description", "state of the test-sh0 container")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__description", "state of the test-sh0 container")
|
||
|
|
||
|
# Empty name yields warning
|
||
|
b.click("button:contains(Commit)")
|
||
|
@@ -820,15 +813,15 @@ class TestApplication(testlib.MachineCas
|
||
|
# Check failing commit
|
||
|
b.set_input_text("#commit-dialog-image-name", "TEST")
|
||
|
b.click("button:contains(Commit)")
|
||
|
- b.wait_in_text(".pf-c-alert", "Failed to commit container test-sh0")
|
||
|
- b.wait_in_text(".pf-c-alert", "repository name must be lowercase")
|
||
|
+ b.wait_in_text(".pf-v5-c-alert", "Failed to commit container test-sh0")
|
||
|
+ b.wait_in_text(".pf-v5-c-alert", "repository name must be lowercase")
|
||
|
|
||
|
# Test cancel
|
||
|
self.confirm_modal("Cancel")
|
||
|
|
||
|
# Force commit empty container
|
||
|
self.performContainerAction("test-sh0", "Commit")
|
||
|
- b.wait_visible(".pf-c-modal-box")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box")
|
||
|
# We prefill command
|
||
|
b.wait_val("#commit-dialog-command", 'sh -c "ls -a"')
|
||
|
# Test docker format
|
||
|
@@ -852,14 +845,14 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Commit with name, tag, author and edited command
|
||
|
self.performContainerAction("test-sh0", "Commit")
|
||
|
- b.wait_visible(".pf-c-modal-box")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box")
|
||
|
b.set_input_text("#commit-dialog-image-name", "newname")
|
||
|
b.set_input_text("#commit-dialog-image-tag", "24")
|
||
|
b.set_input_text("#commit-dialog-author", "MM")
|
||
|
b.set_input_text("#commit-dialog-command", "sh -c 'ps'")
|
||
|
|
||
|
if auth:
|
||
|
- b.assert_pixels(".pf-c-modal-box", "commit", skip_layouts=["rtl"])
|
||
|
+ b.assert_pixels(".pf-v5-c-modal-box", "commit", skip_layouts=["rtl"])
|
||
|
|
||
|
self.confirm_modal("Commit")
|
||
|
|
||
|
@@ -871,7 +864,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# Test commit of running container
|
||
|
self.execute(auth, f"podman run -d --name test-sh2 --stop-timeout 0 {IMG_BUSYBOX} sleep 1000")
|
||
|
self.performContainerAction("test-sh2", "Commit")
|
||
|
- b.wait_visible(".pf-c-modal-box")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box")
|
||
|
b.set_input_text("#commit-dialog-image-name", "newname")
|
||
|
self.confirm_modal("Commit")
|
||
|
waitImageCount(self.user_images_count + 3)
|
||
|
@@ -881,7 +874,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# This only works on rootless with cgroupsv2
|
||
|
if auth or self.has_cgroupsV2:
|
||
|
self.performContainerAction("test-sh2", "Commit")
|
||
|
- b.wait_visible(".pf-c-modal-box")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box")
|
||
|
b.set_input_text("#commit-dialog-image-name", "newname")
|
||
|
b.set_checked("#commit-dialog-pause", True)
|
||
|
b.click("button:contains(Commit)")
|
||
|
@@ -916,8 +909,8 @@ class TestApplication(testlib.MachineCas
|
||
|
# Open get new image modal
|
||
|
b.click("#image-actions-dropdown")
|
||
|
b.click("button:contains(Download new image)")
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
- b.wait_visible("div.pf-c-modal-box footer button:contains(Download):disabled")
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.wait_visible("div.pf-v5-c-modal-box footer button:contains(Download):disabled")
|
||
|
|
||
|
return self
|
||
|
|
||
|
@@ -934,32 +927,32 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
def selectImageAndDownload(self):
|
||
|
# Select and download the self.imageName image
|
||
|
- b.wait_visible(f".pf-c-data-list .image-name:contains({self.imageName})")
|
||
|
- b.click(f".pf-c-data-list .image-name:contains({self.imageName})")
|
||
|
- b.wait_visible("div.pf-c-modal-box footer button:contains(Download):not([disabled])")
|
||
|
- b.click("div.pf-c-modal-box footer button:contains(Download)")
|
||
|
+ b.wait_visible(f".pf-v5-c-data-list .image-name:contains({self.imageName})")
|
||
|
+ b.click(f".pf-v5-c-data-list .image-name:contains({self.imageName})")
|
||
|
+ b.wait_visible("div.pf-v5-c-modal-box footer button:contains(Download):not([disabled])")
|
||
|
+ b.click("div.pf-v5-c-modal-box footer button:contains(Download)")
|
||
|
|
||
|
return self
|
||
|
|
||
|
def expectDownloadErrorForNonExistingTag(self):
|
||
|
- b.wait_not_present('div.pf-c-modal-box')
|
||
|
- b.wait_visible(f'h4.pf-c-alert__title:contains("Danger alert:Failed to download image localhost:5000/{self.imageName}:{self.imageTag}")')
|
||
|
+ b.wait_not_present('div.pf-v5-c-modal-box')
|
||
|
+ b.wait_visible(f'h4.pf-v5-c-alert__title:contains("Danger alert:Failed to download image localhost:5000/{self.imageName}:{self.imageTag}")')
|
||
|
|
||
|
return self
|
||
|
|
||
|
def expectSearchErrorForNotExistingImage(self):
|
||
|
- b.wait_visible(f".pf-c-modal-box__body:contains(No results for {self.imageName})")
|
||
|
+ b.wait_visible(f".pf-v5-c-modal-box__body:contains(No results for {self.imageName})")
|
||
|
|
||
|
return self
|
||
|
|
||
|
def expectDownloadSuccess(self):
|
||
|
# Confirm that the modal dialog is not open anymore
|
||
|
- b.wait_not_present('div.pf-c-modal-box')
|
||
|
+ b.wait_not_present('div.pf-v5-c-modal-box')
|
||
|
# Confirm that the image got downloaded
|
||
|
checkImage(b, f"localhost:5000/{self.imageName}:{self.imageTag or 'latest'}", "system" if self.user == "system" else "admin")
|
||
|
|
||
|
# Confirm that no error has happened
|
||
|
- b.wait_not_present('h4.pf-c-alert__title:contains("Failed to download image")')
|
||
|
+ b.wait_not_present('h4.pf-v5-c-alert__title:contains("Failed to download image")')
|
||
|
|
||
|
# Find out this image ID
|
||
|
self.imageSha = execute(self.user == "system", f"podman inspect --format '{{{{.Id}}}}' localhost:5000/{self.imageName}:{self.imageTag or 'latest'}").strip()
|
||
|
@@ -974,22 +967,22 @@ class TestApplication(testlib.MachineCas
|
||
|
# show image listing toggle
|
||
|
sel = f"#containers-images tbody tr[data-row-id={self.imageSha}{'true' if self.user == 'system' else 'false'}]"
|
||
|
b.wait_visible(sel)
|
||
|
- b.click(sel + " td.pf-c-table__toggle button")
|
||
|
+ b.click(sel + " td.pf-v5-c-table__toggle button")
|
||
|
|
||
|
# Click the delete icon on the image row
|
||
|
- b.click(sel + " .pf-c-dropdown__toggle")
|
||
|
+ b.click(sel + " .pf-v5-c-dropdown__toggle")
|
||
|
b.click(sel + ' button.btn-delete')
|
||
|
|
||
|
- b.set_checked(f".pf-c-check__input[aria-label='localhost:5000/{self.imageName}{imageTagSuffix}']", True)
|
||
|
+ b.set_checked(f".pf-v5-c-check__input[aria-label='localhost:5000/{self.imageName}{imageTagSuffix}']", True)
|
||
|
if another:
|
||
|
- b.set_checked(f".pf-c-check__input[aria-label='{another}']", True)
|
||
|
+ b.set_checked(f".pf-v5-c-check__input[aria-label='{another}']", True)
|
||
|
|
||
|
# Confirm deletion in the delete dialog
|
||
|
- b.click(".pf-c-modal-box #btn-img-delete")
|
||
|
+ b.click(".pf-v5-c-modal-box #btn-img-delete")
|
||
|
|
||
|
if force:
|
||
|
# Confirm force delete
|
||
|
- b.click(".pf-c-modal-box button:contains('Force delete')")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Force delete')")
|
||
|
|
||
|
b.wait_not_present(sel)
|
||
|
|
||
|
@@ -1002,19 +995,19 @@ class TestApplication(testlib.MachineCas
|
||
|
# Test registries
|
||
|
b.click("#image-actions-dropdown")
|
||
|
b.click("button:contains(Download new image)")
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Search for an image")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Search for an image")')
|
||
|
# HACK: Sometimes the value is not shown fully. FIXME
|
||
|
b.set_input_text("#search-image-dialog-name", "my-busybox", value_check=False)
|
||
|
|
||
|
- b.wait_visible(".pf-c-data-list .image-name:contains('localhost:5000/my-busybox')")
|
||
|
- b.wait_visible(".pf-c-data-list .image-name:contains('localhost:6000/my-busybox')")
|
||
|
+ b.wait_visible(".pf-v5-c-data-list .image-name:contains('localhost:5000/my-busybox')")
|
||
|
+ b.wait_visible(".pf-v5-c-data-list .image-name:contains('localhost:6000/my-busybox')")
|
||
|
b.assert_pixels(".podman-search", "download", skip_layouts=["rtl"])
|
||
|
|
||
|
b.set_val('#registry-select', "localhost:6000")
|
||
|
- b.wait_not_present(".pf-c-data-list .image-name:contains('localhost:5000/my-busybox')")
|
||
|
- b.wait_visible(".pf-c-data-list .image-name:contains('localhost:6000/my-busybox')")
|
||
|
- b.click(".pf-c-modal-box button:contains('Cancel')")
|
||
|
- b.wait_not_present('div.pf-c-modal-box')
|
||
|
+ b.wait_not_present(".pf-v5-c-data-list .image-name:contains('localhost:5000/my-busybox')")
|
||
|
+ b.wait_visible(".pf-v5-c-data-list .image-name:contains('localhost:6000/my-busybox')")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains('Cancel')")
|
||
|
+ b.wait_not_present('div.pf-v5-c-modal-box')
|
||
|
|
||
|
dialog0 = DownloadImageDialog('my-busybox', user="system")
|
||
|
dialog0.openDialog() \
|
||
|
@@ -1070,7 +1063,7 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
b.wait_visible("#containers-containers")
|
||
|
self.waitContainerRow("swamped-crate")
|
||
|
- b.click("#containers-containers tbody tr:contains('swamped-crate') .pf-c-dropdown__toggle")
|
||
|
+ b.click("#containers-containers tbody tr:contains('swamped-crate') .pf-v5-c-dropdown__toggle")
|
||
|
|
||
|
if not auth:
|
||
|
# Checkpoint/restore is not supported on user containers yet - the related buttons should not be shown
|
||
|
@@ -1080,7 +1073,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# Health check is not set up
|
||
|
b.wait_not_present(self.getContainerAction('swamped-crate', 'Run health check'))
|
||
|
|
||
|
- b.click("#containers-containers tbody tr:contains('swamped-crate') .pf-c-dropdown__toggle")
|
||
|
+ b.click("#containers-containers tbody tr:contains('swamped-crate') .pf-v5-c-dropdown__toggle")
|
||
|
|
||
|
# Start the container
|
||
|
self.performContainerAction(IMG_BUSYBOX, "Start")
|
||
|
@@ -1130,9 +1123,9 @@ class TestApplication(testlib.MachineCas
|
||
|
self.waitContainerRow(IMG_BUSYBOX)
|
||
|
if not auth:
|
||
|
# Check that the checkpoint option is not present for rootless
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-c-dropdown__toggle")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-v5-c-dropdown__toggle")
|
||
|
b.wait_not_present(self.getContainerAction(IMG_BUSYBOX, 'Checkpoint'))
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-c-dropdown__toggle")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-v5-c-dropdown__toggle")
|
||
|
# Stop the container
|
||
|
self.performContainerAction(IMG_BUSYBOX, "Force stop")
|
||
|
|
||
|
@@ -1148,7 +1141,7 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Check that console reconnects when container starts
|
||
|
b.click(".pf-m-expanded button:contains('Console')")
|
||
|
- b.wait_text(".pf-m-expanded .pf-c-empty-state", "Container is not running")
|
||
|
+ b.wait_text(".pf-m-expanded .pf-v5-c-empty-state", "Container is not running")
|
||
|
self.performContainerAction("swamped-crate", "Start")
|
||
|
b.wait_in_text(".pf-m-expanded .xterm-accessibility-tree", "/ # ")
|
||
|
b.focus(".pf-m-expanded .xterm-helper-textarea")
|
||
|
@@ -1191,12 +1184,12 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Checkpoint the container
|
||
|
self.performContainerAction(IMG_BUSYBOX, "Checkpoint")
|
||
|
- b.set_checked('.pf-c-modal-box input#checkpoint-dialog-keep', True)
|
||
|
- b.set_checked('.pf-c-modal-box input#checkpoint-dialog-tcpEstablished', True)
|
||
|
- b.click('.pf-c-modal-box button:contains(Checkpoint)')
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#checkpoint-dialog-keep', True)
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#checkpoint-dialog-tcpEstablished', True)
|
||
|
+ b.click('.pf-v5-c-modal-box button:contains(Checkpoint)')
|
||
|
b.wait_not_present('.modal_dialog')
|
||
|
|
||
|
- b.wait(lambda: "checkpoint/restore requires at least criu" in b.text(".pf-c-alert.pf-m-danger > .pf-c-alert__description").lower())
|
||
|
+ b.wait(lambda: "checkpoint/restore requires at least criu" in b.text(".pf-v5-c-alert.pf-m-danger > .pf-v5-c-alert__description").lower())
|
||
|
return
|
||
|
|
||
|
# Run a container
|
||
|
@@ -1205,9 +1198,9 @@ class TestApplication(testlib.MachineCas
|
||
|
b.wait(lambda: self.execute(True, "podman ps --all | grep -e swamped-crate -e Exited"))
|
||
|
|
||
|
# Check that the restore option is not present (i.e. start is a regular button)
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-c-dropdown__toggle")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-v5-c-dropdown__toggle")
|
||
|
b.wait_not_present(self.getContainerAction(IMG_BUSYBOX, 'Restore'))
|
||
|
- b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-c-dropdown__toggle")
|
||
|
+ b.click(f"#containers-containers tbody tr:contains('{IMG_BUSYBOX}') .pf-v5-c-dropdown__toggle")
|
||
|
|
||
|
# Start the container
|
||
|
self.performContainerAction("swamped-crate", "Start")
|
||
|
@@ -1215,29 +1208,29 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Checkpoint the container
|
||
|
self.performContainerAction("swamped-crate", "Checkpoint")
|
||
|
- b.set_checked('.pf-c-modal-box input#checkpoint-dialog-keep', True)
|
||
|
- b.set_checked('.pf-c-modal-box input#checkpoint-dialog-tcpEstablished', True)
|
||
|
- b.click('.pf-c-modal-box button:contains(Checkpoint)')
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#checkpoint-dialog-keep', True)
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#checkpoint-dialog-tcpEstablished', True)
|
||
|
+ b.click('.pf-v5-c-modal-box button:contains(Checkpoint)')
|
||
|
|
||
|
with b.wait_timeout(300):
|
||
|
- b.wait_not_present(".pf-c-modal-box")
|
||
|
+ b.wait_not_present(".pf-v5-c-modal-box")
|
||
|
|
||
|
if self.has_criu:
|
||
|
b.wait(lambda: self.getContainerAttr("swamped-crate", "State") in NOT_RUNNING)
|
||
|
else:
|
||
|
# expect proper error message
|
||
|
- b.wait_in_text(".pf-c-alert.pf-m-danger", "Failed to checkpoint container swamped-crate")
|
||
|
- b.wait(lambda: "checkpoint/restore requires at least criu" in b.text(".pf-c-alert.pf-m-danger > .pf-c-alert__description").lower())
|
||
|
+ b.wait_in_text(".pf-v5-c-alert.pf-m-danger", "Failed to checkpoint container swamped-crate")
|
||
|
+ b.wait(lambda: "checkpoint/restore requires at least criu" in b.text(".pf-v5-c-alert.pf-m-danger > .pf-v5-c-alert__description").lower())
|
||
|
return
|
||
|
|
||
|
# Restore the container
|
||
|
self.waitContainerRow("swamped-crate")
|
||
|
self.performContainerAction("swamped-crate", "Restore")
|
||
|
- b.set_checked('.pf-c-modal-box input#restore-dialog-keep', True)
|
||
|
- b.set_checked('.pf-c-modal-box input#restore-dialog-tcpEstablished', True)
|
||
|
- b.set_checked('.pf-c-modal-box input#restore-dialog-ignoreStaticIP', True)
|
||
|
- b.set_checked('.pf-c-modal-box input#restore-dialog-ignoreStaticMAC', True)
|
||
|
- b.click('.pf-c-modal-box button:contains(Restore)')
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#restore-dialog-keep', True)
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#restore-dialog-tcpEstablished', True)
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#restore-dialog-ignoreStaticIP', True)
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#restore-dialog-ignoreStaticMAC', True)
|
||
|
+ b.click('.pf-v5-c-modal-box button:contains(Restore)')
|
||
|
b.wait(lambda: self.getContainerAttr("swamped-crate", "State") in 'Running')
|
||
|
|
||
|
# A new MAC address should have been generated
|
||
|
@@ -1251,8 +1244,8 @@ class TestApplication(testlib.MachineCas
|
||
|
# Checkpoint the container without stopping
|
||
|
self.waitContainerRow("swamped-crate")
|
||
|
self.performContainerAction("swamped-crate", "Checkpoint")
|
||
|
- b.set_checked('.pf-c-modal-box input#checkpoint-dialog-leaveRunning', True)
|
||
|
- b.click('.pf-c-modal-box button:contains(Checkpoint)')
|
||
|
+ b.set_checked('.pf-v5-c-modal-box input#checkpoint-dialog-leaveRunning', True)
|
||
|
+ b.click('.pf-v5-c-modal-box button:contains(Checkpoint)')
|
||
|
b.wait_not_present('.modal_dialog')
|
||
|
|
||
|
# Stop the container
|
||
|
@@ -1261,7 +1254,7 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Restore the container
|
||
|
self.performContainerAction("swamped-crate", "Restore")
|
||
|
- b.click('.pf-c-modal-box button:contains(Restore)')
|
||
|
+ b.click('.pf-v5-c-modal-box button:contains(Restore)')
|
||
|
b.wait(lambda: self.getContainerAttr("swamped-crate", "State") in 'Running')
|
||
|
|
||
|
def testNotRunning(self):
|
||
|
@@ -1297,7 +1290,7 @@ class TestApplication(testlib.MachineCas
|
||
|
self.login_and_go("/podman")
|
||
|
|
||
|
# Troubleshoot action
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-link")
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-link")
|
||
|
b.enter_page("/system/services")
|
||
|
# services page is too slow
|
||
|
with b.wait_timeout(60):
|
||
|
@@ -1306,10 +1299,10 @@ class TestApplication(testlib.MachineCas
|
||
|
# Start action, with enabling (by default)
|
||
|
b.go("/podman")
|
||
|
b.enter_page("/podman")
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
|
||
|
b.wait_visible("#containers-containers")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert.pf-m-info")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert.pf-m-info")
|
||
|
|
||
|
is_active_system("active")
|
||
|
is_active_user("active")
|
||
|
@@ -1319,9 +1312,9 @@ class TestApplication(testlib.MachineCas
|
||
|
# Start action, without enabling
|
||
|
disable_system()
|
||
|
disable_user()
|
||
|
- b.click("#app .pf-c-empty-state input[type=checkbox]")
|
||
|
- b.assert_pixels("#app .pf-c-empty-state", "podman-service-disabled", skip_layouts=["medium", "mobile"])
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
+ b.click("#app .pf-v5-c-empty-state input[type=checkbox]")
|
||
|
+ b.assert_pixels("#app .pf-v5-c-empty-state", "podman-service-disabled", skip_layouts=["medium", "mobile"])
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
|
||
|
b.wait_visible("#containers-containers")
|
||
|
is_enabled_system("disabled")
|
||
|
@@ -1335,9 +1328,9 @@ class TestApplication(testlib.MachineCas
|
||
|
disable_user()
|
||
|
enable_user()
|
||
|
self.login_and_go("/podman")
|
||
|
- b.wait_in_text("#overview div.pf-c-alert .pf-c-alert__title", "System Podman service is also available")
|
||
|
- b.click("#overview div.pf-c-alert .pf-c-alert__action > button:contains(Start)")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.wait_in_text("#overview div.pf-v5-c-alert .pf-v5-c-alert__title", "System Podman service is also available")
|
||
|
+ b.click("#overview div.pf-v5-c-alert .pf-v5-c-alert__action > button:contains(Start)")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
is_active_system("active")
|
||
|
is_active_user("active")
|
||
|
is_enabled_user("enabled")
|
||
|
@@ -1347,9 +1340,9 @@ class TestApplication(testlib.MachineCas
|
||
|
disable_user()
|
||
|
enable_system()
|
||
|
self.login_and_go("/podman")
|
||
|
- b.wait_in_text("#overview div.pf-c-alert .pf-c-alert__title", "User Podman service is also available")
|
||
|
- b.click("#overview div.pf-c-alert .pf-c-alert__action > button:contains(Start)")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.wait_in_text("#overview div.pf-v5-c-alert .pf-v5-c-alert__title", "User Podman service is also available")
|
||
|
+ b.click("#overview div.pf-v5-c-alert .pf-v5-c-alert__action > button:contains(Start)")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
is_active_system("active")
|
||
|
is_active_user("active")
|
||
|
is_enabled_user("enabled")
|
||
|
@@ -1359,9 +1352,9 @@ class TestApplication(testlib.MachineCas
|
||
|
disable_user()
|
||
|
disable_system()
|
||
|
self.login_and_go("/podman", superuser=False)
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
b.wait_visible("#containers-containers")
|
||
|
- b.wait_not_present("#overview div.pf-c-alert")
|
||
|
+ b.wait_not_present("#overview div.pf-v5-c-alert")
|
||
|
|
||
|
is_active_system("inactive")
|
||
|
is_active_user("active")
|
||
|
@@ -1375,10 +1368,10 @@ class TestApplication(testlib.MachineCas
|
||
|
self.restore_dir("/usr/share/cockpit/systemd")
|
||
|
self.machine.execute("rm /usr/share/cockpit/systemd/manifest.json")
|
||
|
self.login_and_go("/podman")
|
||
|
- b.wait_visible("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
- self.assertFalse(b.is_present("#app .pf-c-empty-state button.pf-m-link"))
|
||
|
+ b.wait_visible("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
+ self.assertFalse(b.is_present("#app .pf-v5-c-empty-state button.pf-m-link"))
|
||
|
# starting still works
|
||
|
- b.click("#app .pf-c-empty-state button.pf-m-primary")
|
||
|
+ b.click("#app .pf-v5-c-empty-state button.pf-m-primary")
|
||
|
b.wait_visible("#containers-containers")
|
||
|
|
||
|
self.allow_restart_journal_messages()
|
||
|
@@ -1414,35 +1407,35 @@ class TestApplication(testlib.MachineCas
|
||
|
b = self.browser
|
||
|
container_name = "busybox-downloaded"
|
||
|
|
||
|
- b.click("#containers-containers button.pf-c-button.pf-m-primary")
|
||
|
+ b.click("#containers-containers button.pf-v5-c-button.pf-m-primary")
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
|
||
|
# No local results found
|
||
|
b.set_input_text("#create-image-image-select-typeahead", "notfound")
|
||
|
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("Local")')
|
||
|
- b.wait_text("button.pf-c-select__menu-item.pf-m-disabled", "No images found")
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("Local")')
|
||
|
+ b.wait_text("button.pf-v5-c-select__menu-item.pf-m-disabled", "No images found")
|
||
|
|
||
|
# Local results found
|
||
|
b.set_input_text("#create-image-image-select-typeahead", "registry")
|
||
|
if auth:
|
||
|
- b.assert_pixels(".pf-c-modal-box", "image-select", skip_layouts=["rtl"])
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("Local")')
|
||
|
- b.wait_text("button.pf-c-select__menu-item", IMG_REGISTRY_LATEST)
|
||
|
+ b.assert_pixels(".pf-v5-c-modal-box", "image-select", skip_layouts=["rtl"])
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("Local")')
|
||
|
+ b.wait_text("button.pf-v5-c-select__menu-item", IMG_REGISTRY_LATEST)
|
||
|
|
||
|
# Local registry
|
||
|
b.set_input_text("#create-image-image-select-typeahead", "my-busybox")
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("localhost:5000")')
|
||
|
- b.wait_text("button.pf-c-select__menu-item:not(.pf-m-disabled)", "localhost:5000/my-busybox")
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("localhost:5000")')
|
||
|
+ b.wait_text("button.pf-v5-c-select__menu-item:not(.pf-m-disabled)", "localhost:5000/my-busybox")
|
||
|
|
||
|
# Select image
|
||
|
- b.click('button.pf-c-select__menu-item:contains("localhost:5000/my-busybox")')
|
||
|
+ b.click('button.pf-v5-c-select__menu-item:contains("localhost:5000/my-busybox")')
|
||
|
|
||
|
# Remote image, no pull latest image option
|
||
|
b.wait_not_present("#run-image-dialog-pull-latest-image")
|
||
|
|
||
|
# Create Container, image is pulled and should end up being "running"
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
sel = " span:not(.downloading)"
|
||
|
b.wait(lambda: self.getContainerAttr(container_name, "State", sel) in 'Running')
|
||
|
output = self.execute(auth, f"podman exec {container_name} ls -lh /latest || true").strip()
|
||
|
@@ -1457,21 +1450,21 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
container_name = "busybox-latest"
|
||
|
|
||
|
- b.click("#containers-containers button.pf-c-button.pf-m-primary")
|
||
|
+ b.click("#containers-containers button.pf-v5-c-button.pf-m-primary")
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
|
||
|
# Local registry
|
||
|
b.set_input_text("#create-image-image-select-typeahead", "my-busybox")
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("Local")')
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("Local")')
|
||
|
|
||
|
# Select image
|
||
|
- b.click('button.pf-c-select__menu-item:contains("localhost:5000/my-busybox")')
|
||
|
+ b.click('button.pf-v5-c-select__menu-item:contains("localhost:5000/my-busybox")')
|
||
|
|
||
|
# Pull the latest image
|
||
|
b.set_checked("#run-image-dialog-pull-latest-image", True)
|
||
|
|
||
|
# Create Container, image is pulled and should end up being "running"
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
sel = " span:not(.downloading)"
|
||
|
b.wait(lambda: self.getContainerAttr(container_name, "State", sel) in 'Running')
|
||
|
# Verify that the latest file exists
|
||
|
@@ -1481,7 +1474,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# Test creating a container with
|
||
|
if auth:
|
||
|
container_name = "busybox-download-admin"
|
||
|
- b.click("#containers-containers button.pf-c-button.pf-m-primary")
|
||
|
+ b.click("#containers-containers button.pf-v5-c-button.pf-m-primary")
|
||
|
|
||
|
# Start container as admin
|
||
|
b.click('#run-image-dialog-owner-user')
|
||
|
@@ -1490,10 +1483,10 @@ class TestApplication(testlib.MachineCas
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
|
||
|
b.set_input_text("#create-image-image-select-typeahead", IMG_BUSYBOX)
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("Local")')
|
||
|
- b.click(f'button.pf-c-select__menu-item:contains("{IMG_BUSYBOX}")')
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("Local")')
|
||
|
+ b.click(f'button.pf-v5-c-select__menu-item:contains("{IMG_BUSYBOX}")')
|
||
|
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
b.wait(lambda: self.getContainerAttr(container_name, "State", sel) in 'Running')
|
||
|
|
||
|
def testRunImageSystem(self):
|
||
|
@@ -1512,7 +1505,7 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
self.login(auth)
|
||
|
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
b.wait_in_text("#containers-images", IMG_BUSYBOX)
|
||
|
b.wait_in_text("#containers-images", IMG_ALPINE)
|
||
|
@@ -1522,7 +1515,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# Check command in alpine
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_ALPINE}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_ALPINE}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
# depending on the precise container, this can be /bin/sh or /bin/ash
|
||
|
cmd = self.execute(auth, 'podman image inspect --format "{{.Config.Cmd}}" ' + IMG_ALPINE)
|
||
|
cmd = cmd.strip().replace('[', '').replace(']', '')
|
||
|
@@ -1532,7 +1525,7 @@ class TestApplication(testlib.MachineCas
|
||
|
# Open run image dialog
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
# Inspect and fill modal dialog
|
||
|
b.wait_val("#create-image-image-select-typeahead", IMG_BUSYBOX_LATEST)
|
||
|
@@ -1640,7 +1633,7 @@ class TestApplication(testlib.MachineCas
|
||
|
else:
|
||
|
b.wait_not_present('#run-image-dialog-volume-0-selinux')
|
||
|
|
||
|
- b.set_file_autocomplete_val("#run-image-dialog-volume-0 .pf-c-select", rodir)
|
||
|
+ b.set_file_autocomplete_val("#run-image-dialog-volume-0 .pf-v5-c-select", rodir)
|
||
|
b.key_press(["\r"])
|
||
|
b.set_input_text('#run-image-dialog-volume-0-container-path', '/tmp/ro')
|
||
|
ro_label = m.execute(f"ls -dZ {rodir}").split(" ")[0]
|
||
|
@@ -1652,8 +1645,8 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click('.volume-form .btn-add')
|
||
|
|
||
|
if auth:
|
||
|
- b.assert_pixels(".pf-c-modal-box", "integration",
|
||
|
- ignore=["#run-image-dialog-volume-0 input.pf-c-select__toggle-typeahead"],
|
||
|
+ b.assert_pixels(".pf-v5-c-modal-box", "integration",
|
||
|
+ ignore=["#run-image-dialog-volume-0 input.pf-v5-c-select__toggle-typeahead"],
|
||
|
skip_layouts=["rtl"])
|
||
|
|
||
|
if self.has_selinux:
|
||
|
@@ -1661,13 +1654,13 @@ class TestApplication(testlib.MachineCas
|
||
|
else:
|
||
|
b.wait_not_present('#run-image-dialog-volume-1-selinux')
|
||
|
|
||
|
- b.set_file_autocomplete_val("#run-image-dialog-volume-1 .pf-c-select", rwdir)
|
||
|
+ b.set_file_autocomplete_val("#run-image-dialog-volume-1 .pf-v5-c-select", rwdir)
|
||
|
b.key_press(["\r"])
|
||
|
b.set_input_text('#run-image-dialog-volume-1-container-path', '/tmp/rw')
|
||
|
rw_label = m.execute(f"ls -dZ {rwdir}").split(" ")[0]
|
||
|
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
- b.wait_not_present("div.pf-c-modal-box")
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.wait_not_present("div.pf-v5-c-modal-box")
|
||
|
self.waitContainerRow(IMG_BUSYBOX)
|
||
|
sha = self.execute(auth, "podman inspect --format '{{.Id}}' busybox-with-tty").strip()
|
||
|
self.waitContainer(sha, auth, name='busybox-with-tty', image=IMG_BUSYBOX,
|
||
|
@@ -1787,7 +1780,7 @@ class TestApplication(testlib.MachineCas
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
self.toggleExpandedContainer(IMG_BUSYBOX)
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
b.wait_val("#create-image-image-select-typeahead", IMG_BUSYBOX_LATEST)
|
||
|
b.set_input_text("#run-image-dialog-name", "busybox-without-publish")
|
||
|
@@ -1798,8 +1791,8 @@ class TestApplication(testlib.MachineCas
|
||
|
# Run without tty, console should be able to `exec`
|
||
|
b.set_checked("#run-image-dialog-tty", False)
|
||
|
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
- b.wait_not_present("div.pf-c-modal-box")
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.wait_not_present("div.pf-v5-c-modal-box")
|
||
|
|
||
|
self.waitContainerRow("busybox-without-publish")
|
||
|
self.toggleExpandedContainer("busybox-without-publish")
|
||
|
@@ -1848,7 +1841,7 @@ class TestApplication(testlib.MachineCas
|
||
|
self.filter_containers("running")
|
||
|
id_with_tty = self.execute(auth, "podman inspect --format '{{.Id}}' busybox-with-tty").strip()
|
||
|
|
||
|
- b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") td.pf-c-table__toggle button')
|
||
|
+ b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") td.pf-v5-c-table__toggle button')
|
||
|
# running container, just selects it, but leaves "Only running" alone
|
||
|
b.click(f"#containers-images tbody tr:contains('{IMG_BUSYBOX}') + tr div.ct-listing-panel-body dt:contains('Used by') + dd button:contains('busybox-with-tty')")
|
||
|
b.wait_js_cond('window.location.hash === "#' + id_with_tty + '"')
|
||
|
@@ -1862,14 +1855,14 @@ class TestApplication(testlib.MachineCas
|
||
|
container_name = "busybox-not-started"
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
b.wait_val("#create-image-image-select-typeahead", IMG_BUSYBOX_LATEST)
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
b.set_input_text("#run-image-dialog-command", "sh -c sleep infinity")
|
||
|
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-btn')
|
||
|
- b.wait_not_present("div.pf-c-modal-box")
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-btn')
|
||
|
+ b.wait_not_present("div.pf-v5-c-modal-box")
|
||
|
|
||
|
sha = self.execute(auth, "podman inspect --format '{{.Id}}' " + container_name).strip()
|
||
|
self.waitContainer(sha, auth, name=container_name, image=IMG_BUSYBOX, state=['Configured', 'Created'])
|
||
|
@@ -1883,12 +1876,12 @@ class TestApplication(testlib.MachineCas
|
||
|
# auto-expands container details
|
||
|
b.wait_in_text("#containers-containers tbody tr:contains('busybox-not-started') + tr", "sleep infinity")
|
||
|
|
||
|
- b.click(f'#containers-images tbody tr:contains("{IMG_ALPINE}") td.pf-c-table__toggle button')
|
||
|
+ b.click(f'#containers-images tbody tr:contains("{IMG_ALPINE}") td.pf-v5-c-table__toggle button')
|
||
|
b.wait_in_text(f"#containers-images tbody tr:contains('{IMG_ALPINE}') td[data-label='Used by']", 'unused')
|
||
|
|
||
|
b.set_input_text('#containers-filter', 'foobar')
|
||
|
- b.wait_in_text('#containers-containers .pf-c-empty-state', 'No containers that match the current filter')
|
||
|
- b.wait_in_text('#containers-images .pf-c-empty-state', 'No images that match the current filter')
|
||
|
+ b.wait_in_text('#containers-containers .pf-v5-c-empty-state', 'No containers that match the current filter')
|
||
|
+ b.wait_in_text('#containers-images .pf-v5-c-empty-state', 'No images that match the current filter')
|
||
|
b.set_input_text('#containers-filter', '')
|
||
|
|
||
|
if not auth or not self.machine.ostree_image: # don't kill ws container
|
||
|
@@ -1897,10 +1890,10 @@ class TestApplication(testlib.MachineCas
|
||
|
# Remove all containers first as it is not possible to set --time 0 to rmi command
|
||
|
self.execute(auth, "podman rm --all --force --time 0")
|
||
|
self.execute(auth, "podman rmi -af")
|
||
|
- b.wait_in_text('#containers-containers .pf-c-empty-state', 'No containers')
|
||
|
+ b.wait_in_text('#containers-containers .pf-v5-c-empty-state', 'No containers')
|
||
|
b.set_val("#containers-containers-filter", "running")
|
||
|
- b.wait_in_text('#containers-containers .pf-c-empty-state', 'No running containers')
|
||
|
- b.wait_in_text('#containers-images .pf-c-empty-state', 'No images')
|
||
|
+ b.wait_in_text('#containers-containers .pf-v5-c-empty-state', 'No running containers')
|
||
|
+ b.wait_in_text('#containers-images .pf-v5-c-empty-state', 'No images')
|
||
|
|
||
|
def check_content(self, type, present, not_present):
|
||
|
b = self.browser
|
||
|
@@ -1946,8 +1939,8 @@ class TestApplication(testlib.MachineCas
|
||
|
def confirm_modal(self, text):
|
||
|
"""Wait for the pop up window and click the button with text"""
|
||
|
b = self.browser
|
||
|
- b.click(f".pf-c-modal-box footer button:contains({text})")
|
||
|
- b.wait_not_present(f".pf-c-modal-box footer button:contains({text})")
|
||
|
+ b.click(f".pf-v5-c-modal-box footer button:contains({text})")
|
||
|
+ b.wait_not_present(f".pf-v5-c-modal-box footer button:contains({text})")
|
||
|
|
||
|
def testPruneUnusedImagesSystem(self):
|
||
|
self._testPruneUnusedImagesSystem(True)
|
||
|
@@ -1978,12 +1971,12 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click("button:contains(Prune unused images)")
|
||
|
|
||
|
if auth:
|
||
|
- b.wait_js_func("ph_count_check", ".pf-c-modal-box__body .pf-c-list li", (self.user_images_count + self.system_images_count) - leftover_images)
|
||
|
+ b.wait_js_func("ph_count_check", ".pf-v5-c-modal-box__body .pf-v5-c-list li", (self.user_images_count + self.system_images_count) - leftover_images)
|
||
|
elif root:
|
||
|
- b.wait_js_func("ph_count_check", ".pf-c-modal-box__body .pf-c-list li", self.system_images_count - leftover_images)
|
||
|
+ b.wait_js_func("ph_count_check", ".pf-v5-c-modal-box__body .pf-v5-c-list li", self.system_images_count - leftover_images)
|
||
|
else:
|
||
|
- b.wait_js_func("ph_count_check", ".pf-c-modal-box__body .pf-c-list li", self.user_images_count - leftover_images)
|
||
|
- b.click(".pf-c-modal-box button:contains(Prune)")
|
||
|
+ b.wait_js_func("ph_count_check", ".pf-v5-c-modal-box__body .pf-v5-c-list li", self.user_images_count - leftover_images)
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains(Prune)")
|
||
|
|
||
|
# When being superuser, admin images are also removed
|
||
|
if auth:
|
||
|
@@ -2011,16 +2004,16 @@ class TestApplication(testlib.MachineCas
|
||
|
# Deselect both
|
||
|
b.click("#deleteSystemImages")
|
||
|
b.click("#deleteUserImages")
|
||
|
- b.wait_visible(".pf-c-modal-box button:contains(Prune):disabled")
|
||
|
+ b.wait_visible(".pf-v5-c-modal-box button:contains(Prune):disabled")
|
||
|
|
||
|
# Admin / user images are selected
|
||
|
expected_images = self.user_images_count + self.system_images_count
|
||
|
if self.machine.ostree_image:
|
||
|
expected_images -= 1
|
||
|
- b.wait_js_func("ph_count_check", ".pf-c-modal-box__body .pf-c-list li", expected_images)
|
||
|
+ b.wait_js_func("ph_count_check", ".pf-v5-c-modal-box__body .pf-v5-c-list li", expected_images)
|
||
|
# Select user images
|
||
|
b.click("#deleteUserImages")
|
||
|
- b.click(".pf-c-modal-box button:contains(Prune)")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains(Prune)")
|
||
|
|
||
|
# System images are left over
|
||
|
self.waitNumImages(self.system_images_count)
|
||
|
@@ -2031,8 +2024,8 @@ class TestApplication(testlib.MachineCas
|
||
|
# Pruning again, should delete all system images
|
||
|
b.click("#image-actions-dropdown")
|
||
|
b.click("button:contains(Prune unused images)")
|
||
|
- b.wait_js_func("ph_count_check", ".pf-c-modal-box__body .pf-c-list li", self.system_images_count - 1 if self.machine.ostree_image else self.system_images_count)
|
||
|
- b.click(".pf-c-modal-box button:contains(Prune)")
|
||
|
+ b.wait_js_func("ph_count_check", ".pf-v5-c-modal-box__body .pf-v5-c-list li", self.system_images_count - 1 if self.machine.ostree_image else self.system_images_count)
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains(Prune)")
|
||
|
self.waitNumImages(1 if self.machine.ostree_image else 0)
|
||
|
|
||
|
# Prune button should now be disabled
|
||
|
@@ -2070,13 +2063,13 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click("button:contains(Prune unused containers)")
|
||
|
|
||
|
if auth:
|
||
|
- b.wait_in_text(".pf-c-modal-box__body tbody tr:nth-child(1) td[data-label=Name]", "adminnotrunning")
|
||
|
- b.wait_in_text(".pf-c-modal-box__body tbody tr:nth-child(2) td[data-label=Name]", "notrunning")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__body tbody tr:nth-child(1) td[data-label=Name]", "adminnotrunning")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__body tbody tr:nth-child(2) td[data-label=Name]", "notrunning")
|
||
|
else:
|
||
|
- b.wait_in_text(".pf-c-modal-box__body tbody td[data-label=Name]", "notrunning")
|
||
|
+ b.wait_in_text(".pf-v5-c-modal-box__body tbody td[data-label=Name]", "notrunning")
|
||
|
|
||
|
- b.click(".pf-c-modal-box button:contains(Prune)")
|
||
|
- b.wait_not_present(".pf-c-modal-box__body")
|
||
|
+ b.click(".pf-v5-c-modal-box button:contains(Prune)")
|
||
|
+ b.wait_not_present(".pf-v5-c-modal-box__body")
|
||
|
|
||
|
if auth:
|
||
|
self.waitContainerRow("notrunning", False)
|
||
|
@@ -2097,11 +2090,11 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
# Start a podman container which uses a port
|
||
|
self.execute(False, f"podman run -d -p 5000:5000 --name registry --stop-timeout 0 {IMG_REGISTRY}")
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
|
||
|
@@ -2110,12 +2103,12 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click('.publish-port-form .btn-add')
|
||
|
b.set_input_text('#run-image-dialog-publish-0-host-port', '5000')
|
||
|
b.set_input_text('#run-image-dialog-publish-0-container-port', '5000')
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
- b.wait_in_text(".pf-c-alert", "address already in use")
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.wait_in_text(".pf-v5-c-alert", "address already in use")
|
||
|
|
||
|
# Changing the port should allow creation of container
|
||
|
b.set_input_text('#run-image-dialog-publish-0-host-port', '5001')
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
self.waitContainerRow(container_name)
|
||
|
|
||
|
def _testHealthcheck(self, auth):
|
||
|
@@ -2127,11 +2120,11 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
self.login(auth)
|
||
|
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
b.set_input_text("#run-image-dialog-name", "healthy")
|
||
|
|
||
|
@@ -2143,14 +2136,14 @@ class TestApplication(testlib.MachineCas
|
||
|
b.click('#run-image-healthcheck-retries button:nth-child(1)')
|
||
|
b.wait_val("#run-image-healthcheck-retries input", 2)
|
||
|
if auth:
|
||
|
- b.assert_pixels('.pf-c-modal-box', "healthcheck-modal", skip_layouts=["rtl"])
|
||
|
+ b.assert_pixels('.pf-v5-c-modal-box', "healthcheck-modal", skip_layouts=["rtl"])
|
||
|
# Test that the healthcheck option is not available before podman 4.3
|
||
|
if podman_version(self) < (4, 3, 0):
|
||
|
b.wait_not_present("#run-image-healthcheck-action")
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
|
||
|
self.waitContainerRow("healthy")
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
healthy_sha = self.execute(auth, "podman inspect --format '{{.Id}}' healthy").strip()
|
||
|
self.waitContainer(healthy_sha, auth, state='RunningHealthy')
|
||
|
@@ -2198,18 +2191,18 @@ class TestApplication(testlib.MachineCas
|
||
|
self.assertGreater(int(b.text('.pf-m-expanded #container-details-healthcheck dt:contains("Failing streak") + dd')), 3)
|
||
|
if auth:
|
||
|
b.wait_js_func("ph_count_check", ".pf-m-expanded table[aria-label=Logs] tbody tr", 5)
|
||
|
- b.assert_pixels(".pf-m-expanded .pf-c-table__expandable-row-content",
|
||
|
+ b.assert_pixels(".pf-m-expanded .pf-v5-c-table__expandable-row-content",
|
||
|
"healthcheck-details",
|
||
|
ignore=["thead", "#container-details-healthcheck dt:contains('Failing streak') + dd",
|
||
|
"td[data-label='Started at']"],
|
||
|
skip_layouts=["rtl"])
|
||
|
|
||
|
self.toggleExpandedContainer("sick")
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
b.wait_visible('#containers-images td[data-label="Image"]:contains("busybox:latest")')
|
||
|
b.click('#containers-images tbody tr:contains("busybox:latest") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
# Test the health check action, only supported in podman 4.3 and later.
|
||
|
# To test this we make a healthcheck which depends on a file, so when starting the
|
||
|
@@ -2227,7 +2220,7 @@ class TestApplication(testlib.MachineCas
|
||
|
b.set_input_text('#run-image-healthcheck-interval input', '1')
|
||
|
b.set_input_text('#run-image-healthcheck-timeout input', '1')
|
||
|
b.click('#run-image-healthcheck-action-2')
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
|
||
|
self.waitContainerRow(containername)
|
||
|
self.toggleExpandedContainer(containername)
|
||
|
@@ -2270,17 +2263,17 @@ class TestApplication(testlib.MachineCas
|
||
|
self.execute(False, f"podman rmi {IMG_BUSYBOX}")
|
||
|
|
||
|
self.login(auth)
|
||
|
- b.click("#containers-images button.pf-c-expandable-section__toggle")
|
||
|
+ b.click("#containers-images button.pf-v5-c-expandable-section__toggle")
|
||
|
|
||
|
def create_container(name, policy=None):
|
||
|
b.wait_visible(f'#containers-images td[data-label="Image"]:contains("{IMG_BUSYBOX}")')
|
||
|
b.click(f'#containers-images tbody tr:contains("{IMG_BUSYBOX}") .ct-container-create')
|
||
|
- b.wait_visible('div.pf-c-modal-box header:contains("Create container")')
|
||
|
+ b.wait_visible('div.pf-v5-c-modal-box header:contains("Create container")')
|
||
|
|
||
|
b.set_input_text("#run-image-dialog-name", name)
|
||
|
if policy:
|
||
|
b.set_val("#run-image-dialog-restart-policy", "always")
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
self.waitContainerRow(name)
|
||
|
|
||
|
container_name = 'none'
|
||
|
@@ -2315,9 +2308,9 @@ class TestApplication(testlib.MachineCas
|
||
|
|
||
|
b.set_input_text("#run-image-dialog-name", container_name)
|
||
|
b.set_input_text("#create-image-image-select-typeahead", IMG_BUSYBOX_LATEST)
|
||
|
- b.click('button.pf-c-toggle-group__button:contains("Local")')
|
||
|
- b.click(f'button.pf-c-select__menu-item:contains("{IMG_BUSYBOX_LATEST}")')
|
||
|
- b.click('.pf-c-modal-box__footer #create-image-create-run-btn')
|
||
|
+ b.click('button.pf-v5-c-toggle-group__button:contains("Local")')
|
||
|
+ b.click(f'button.pf-v5-c-select__menu-item:contains("{IMG_BUSYBOX_LATEST}")')
|
||
|
+ b.click('.pf-v5-c-modal-box__footer #create-image-create-run-btn')
|
||
|
b.wait_not_present("#run-image-dialog-name")
|
||
|
|
||
|
container_sha = self.execute(auth, f"podman inspect --format '{{{{.Id}}}}' {container_name}").strip()
|
||
|
@@ -2460,11 +2453,11 @@ class TestApplication(testlib.MachineCas
|
||
|
else:
|
||
|
b.wait_not_present('#create-pod-dialog-volume-0-selinux')
|
||
|
|
||
|
- b.set_file_autocomplete_val("#create-pod-dialog-volume-0 .pf-c-select", rodir)
|
||
|
+ b.set_file_autocomplete_val("#create-pod-dialog-volume-0 .pf-v5-c-select", rodir)
|
||
|
b.set_input_text('#create-pod-dialog-volume-0-container-path', '/tmp/ro')
|
||
|
b.click('.volume-form .btn-add')
|
||
|
|
||
|
- b.set_file_autocomplete_val("#create-pod-dialog-volume-1 .pf-c-select", rwdir)
|
||
|
+ b.set_file_autocomplete_val("#create-pod-dialog-volume-1 .pf-v5-c-select", rwdir)
|
||
|
b.set_input_text('#create-pod-dialog-volume-1-container-path', '/tmp/rw')
|
||
|
|
||
|
b.click("#create-pod-create-btn")
|
||
|
@@ -2514,7 +2507,7 @@ class TestApplication(testlib.MachineCas
|
||
|
self.waitContainerRow(container_name)
|
||
|
self.toggleExpandedContainer(container_name)
|
||
|
b.click(".pf-m-expanded button:contains('Logs')")
|
||
|
- b.wait_in_text(".pf-m-expanded .pf-c-empty-state__content", "failed to obtain logs for Container")
|
||
|
+ b.wait_in_text(".pf-m-expanded .pf-v5-c-empty-state__content", "failed to obtain logs for Container")
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|