From 1096541f54d36415f4ea5cfb4e486d1741af8074 Mon Sep 17 00:00:00 2001 From: Bryan Florkiewicz Date: Thu, 1 Jul 2021 17:45:12 -0400 Subject: [PATCH 1/4] Console 2537: Prompt the user to refresh on plugin change (UI changes) These changes are adding the new endpoint that the UI can poll in order to check for plugin changes. https://issues.redhat.com/browse/console-2537 --- .../console-app/locales/en/console-app.json | 3 ++ .../ConsoleOperatorConfig.tsx | 44 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/frontend/packages/console-app/locales/en/console-app.json b/frontend/packages/console-app/locales/en/console-app.json index 99302e93ff0..b7bad888c0b 100644 --- a/frontend/packages/console-app/locales/en/console-app.json +++ b/frontend/packages/console-app/locales/en/console-app.json @@ -54,6 +54,9 @@ "Connecting to your OpenShift command line terminal ...": "Connecting to your OpenShift command line terminal ...", "Enabled": "Enabled", "Disabled": "Disabled", + "Web console update is available": "Web console update is available", + "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.": "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.", + "Refresh web console": "Refresh web console", "Name": "Name", "Version": "Version", "Description": "Description", diff --git a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx index 9d76ed8f3b0..2aef29516ce 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Button } from '@patternfly/react-core'; +import { AlertVariant, Button } from '@patternfly/react-core'; import { PencilAltIcon } from '@patternfly/react-icons'; import { ISortBy, @@ -11,6 +11,7 @@ import { TableHeader, TableVariant, } from '@patternfly/react-table'; +import * as _ from 'lodash'; import { useTranslation } from 'react-i18next'; import { breadcrumbsForGlobalConfig } from '@console/internal/components/cluster-settings/global-config'; import { DetailsForKind } from '@console/internal/components/default-resource'; @@ -21,6 +22,7 @@ import { WatchK8sResource, } from '@console/internal/components/utils/k8s-watch-hook'; import { useAccessReview } from '@console/internal/components/utils/rbac'; +import { useURLPoll } from '@console/internal/components/utils/url-poll-hook'; import { ConsoleOperatorConfigModel, ConsolePluginModel } from '@console/internal/models'; import { ConsolePluginKind, @@ -31,6 +33,7 @@ import { import { DynamicPluginInfo, isLoadedDynamicPluginInfo } from '@console/plugin-sdk/src'; import { useDynamicPluginInfo } from '@console/plugin-sdk/src/api/useDynamicPluginInfo'; import { consolePluginModal } from '@console/shared/src/components/modals'; +import { useToast } from '@console/shared/src/components/toast'; import { CONSOLE_OPERATOR_CONFIG_NAME } from '@console/shared/src/constants'; const consoleOperatorConfigReference: K8sResourceKindReference = referenceForModel( @@ -80,6 +83,40 @@ const ConsolePluginStatus: React.FC = ({ enabled, plugi const ConsolePluginsList: React.FC = ({ obj }) => { const { t } = useTranslation(); + const toastContext = useToast(); + const [pluginsData, pluginsError] = useURLPoll( + `${window.SERVER_FLAGS.basePath}api/check-updates`, + ); + + const prevPluginsDataRef = React.useRef(); + React.useEffect(() => { + prevPluginsDataRef.current = pluginsData; + }); + const prevPluginsData = prevPluginsDataRef.current; + + const pluginsStateInitialized = _.isEmpty(pluginsError) && !_.isEmpty(prevPluginsData); + const pluginsChanged = !_.isEmpty(_.xor(prevPluginsData?.plugins, pluginsData?.plugins)); + const consoleCommitChanged = prevPluginsData?.consoleCommit !== pluginsData?.consoleCommit; + + if (pluginsStateInitialized && (pluginsChanged || consoleCommitChanged)) { + toastContext.addToast({ + variant: AlertVariant.warning, + title: t('console-app~Web console update is available'), + content: t( + 'console-app~There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.', + ), + timeout: true, + dismissible: true, + actions: [ + { + dismiss: true, + label: t('console-app~Refresh web console'), + callback: () => window.location.reload(), + }, + ], + }); + } + const [consolePlugins, consolePluginsLoaded] = useK8sWatchResource({ isList: true, kind: referenceForModel(ConsolePluginModel), @@ -212,3 +249,8 @@ type ConsolePluginStatusType = { type ConsolePluginsListType = { obj: K8sResourceKind; }; + +type ConsoleUpdatesResponseType = { + consoleCommit?: string; + plugins?: string[]; +}; From 4bf1c9dade7bb178f673ade309ef8132ee4e4edc Mon Sep 17 00:00:00 2001 From: Bryan Florkiewicz Date: Tue, 20 Jul 2021 17:41:52 -0400 Subject: [PATCH 2/4] Console 2537: Prompt the user to refresh on plugin change (UI changes) These changes are in response to code review comments to move the polling registration to the top level app.jsx component. https://issues.redhat.com/browse/console-2537 --- .../ConsoleOperatorConfig.tsx | 44 +------------------ .../locales/en/console-app.json | 6 +-- 2 files changed, 4 insertions(+), 46 deletions(-) rename frontend/{packages/console-app => public}/locales/en/console-app.json (100%) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx index 2aef29516ce..9d76ed8f3b0 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { AlertVariant, Button } from '@patternfly/react-core'; +import { Button } from '@patternfly/react-core'; import { PencilAltIcon } from '@patternfly/react-icons'; import { ISortBy, @@ -11,7 +11,6 @@ import { TableHeader, TableVariant, } from '@patternfly/react-table'; -import * as _ from 'lodash'; import { useTranslation } from 'react-i18next'; import { breadcrumbsForGlobalConfig } from '@console/internal/components/cluster-settings/global-config'; import { DetailsForKind } from '@console/internal/components/default-resource'; @@ -22,7 +21,6 @@ import { WatchK8sResource, } from '@console/internal/components/utils/k8s-watch-hook'; import { useAccessReview } from '@console/internal/components/utils/rbac'; -import { useURLPoll } from '@console/internal/components/utils/url-poll-hook'; import { ConsoleOperatorConfigModel, ConsolePluginModel } from '@console/internal/models'; import { ConsolePluginKind, @@ -33,7 +31,6 @@ import { import { DynamicPluginInfo, isLoadedDynamicPluginInfo } from '@console/plugin-sdk/src'; import { useDynamicPluginInfo } from '@console/plugin-sdk/src/api/useDynamicPluginInfo'; import { consolePluginModal } from '@console/shared/src/components/modals'; -import { useToast } from '@console/shared/src/components/toast'; import { CONSOLE_OPERATOR_CONFIG_NAME } from '@console/shared/src/constants'; const consoleOperatorConfigReference: K8sResourceKindReference = referenceForModel( @@ -83,40 +80,6 @@ const ConsolePluginStatus: React.FC = ({ enabled, plugi const ConsolePluginsList: React.FC = ({ obj }) => { const { t } = useTranslation(); - const toastContext = useToast(); - const [pluginsData, pluginsError] = useURLPoll( - `${window.SERVER_FLAGS.basePath}api/check-updates`, - ); - - const prevPluginsDataRef = React.useRef(); - React.useEffect(() => { - prevPluginsDataRef.current = pluginsData; - }); - const prevPluginsData = prevPluginsDataRef.current; - - const pluginsStateInitialized = _.isEmpty(pluginsError) && !_.isEmpty(prevPluginsData); - const pluginsChanged = !_.isEmpty(_.xor(prevPluginsData?.plugins, pluginsData?.plugins)); - const consoleCommitChanged = prevPluginsData?.consoleCommit !== pluginsData?.consoleCommit; - - if (pluginsStateInitialized && (pluginsChanged || consoleCommitChanged)) { - toastContext.addToast({ - variant: AlertVariant.warning, - title: t('console-app~Web console update is available'), - content: t( - 'console-app~There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.', - ), - timeout: true, - dismissible: true, - actions: [ - { - dismiss: true, - label: t('console-app~Refresh web console'), - callback: () => window.location.reload(), - }, - ], - }); - } - const [consolePlugins, consolePluginsLoaded] = useK8sWatchResource({ isList: true, kind: referenceForModel(ConsolePluginModel), @@ -249,8 +212,3 @@ type ConsolePluginStatusType = { type ConsolePluginsListType = { obj: K8sResourceKind; }; - -type ConsoleUpdatesResponseType = { - consoleCommit?: string; - plugins?: string[]; -}; diff --git a/frontend/packages/console-app/locales/en/console-app.json b/frontend/public/locales/en/console-app.json similarity index 100% rename from frontend/packages/console-app/locales/en/console-app.json rename to frontend/public/locales/en/console-app.json index b7bad888c0b..57d7fe21f36 100644 --- a/frontend/packages/console-app/locales/en/console-app.json +++ b/frontend/public/locales/en/console-app.json @@ -1,4 +1,7 @@ { + "Web console update is available": "Web console update is available", + "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.": "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.", + "Refresh web console": "Refresh web console", "VolumeSnapshotContents": "VolumeSnapshotContents", "Delete {{kind}}": "Delete {{kind}}", "Edit {{kind}}": "Edit {{kind}}", @@ -54,9 +57,6 @@ "Connecting to your OpenShift command line terminal ...": "Connecting to your OpenShift command line terminal ...", "Enabled": "Enabled", "Disabled": "Disabled", - "Web console update is available": "Web console update is available", - "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.": "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.", - "Refresh web console": "Refresh web console", "Name": "Name", "Version": "Version", "Description": "Description", From 0cb0e42b4bd83f2b8e15c4c194463fe1215b756e Mon Sep 17 00:00:00 2001 From: Kim Doberstein Date: Mon, 12 Jul 2021 11:35:58 -0500 Subject: [PATCH 3/4] Add help links to masthead so they can be translated --- .../tests/i18n/pseudolocalization.spec.ts | 16 +++++++-- .../public/components/masthead-toolbar.jsx | 33 +++++++++++++++++-- frontend/public/locales/en/public.json | 2 ++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/frontend/packages/integration-tests-cypress/tests/i18n/pseudolocalization.spec.ts b/frontend/packages/integration-tests-cypress/tests/i18n/pseudolocalization.spec.ts index 03cbdb80686..8d11e9fe609 100644 --- a/frontend/packages/integration-tests-cypress/tests/i18n/pseudolocalization.spec.ts +++ b/frontend/packages/integration-tests-cypress/tests/i18n/pseudolocalization.spec.ts @@ -21,13 +21,25 @@ describe('Localization', () => { cy.visit('/dashboards?pseudolocalization=true&lng=en'); masthead.clickMastheadLink('help-dropdown-toggle'); // wait for both console help menu items and additionalHelpActions items to load - // additionalHelpActions come from ConsoleLinks 'HelpMenu' yaml and are not translated - // only test console help items which are translated + cy.get('.pf-c-app-launcher__group').should('have.length', 2); + // Test that all links in the first group are translated cy.get('.pf-c-app-launcher__group') .first() .within(() => { cy.get('[role="menuitem"]').isPseudoLocalized(); }); + // Ensure that the first two elements of the second help group are translated + cy.get('.pf-c-app-launcher__group') + .eq(1) + .get('[role="menuitem"]') + .eq(0) + .isPseudoLocalized(); + + cy.get('.pf-c-app-launcher__group') + .eq(1) + .get('[role="menuitem"]') + .eq(1) + .isPseudoLocalized(); }); it('pseudolocalizes navigation', () => { diff --git a/frontend/public/components/masthead-toolbar.jsx b/frontend/public/components/masthead-toolbar.jsx index 878a8892bce..81f6006d9a0 100644 --- a/frontend/public/components/masthead-toolbar.jsx +++ b/frontend/public/components/masthead-toolbar.jsx @@ -40,6 +40,21 @@ import { ConsoleLinkModel } from '../models'; import { languagePreferencesModal } from './modals'; import { withTelemetry, withQuickStartContext } from '@console/shared/src/hoc'; +const defaultHelpLinks = [ + { + // t('public~Learning Portal') + label: 'Learning Portal', + externalLink: true, + href: 'https://learn.openshift.com/?ref=webconsole', + }, + { + // t('public~OpenShift Blog') + label: 'OpenShift Blog', + externalLink: true, + href: 'https://blog.openshift.com', + }, +]; + const SystemStatusButton = ({ statuspageData, className }) => { const { t } = useTranslation(); return !_.isEmpty(_.get(statuspageData, 'incidents')) ? ( @@ -378,8 +393,22 @@ class MastheadToolbarContents_ extends React.Component { ], }); - if (!_.isEmpty(additionalHelpActions.actions)) { - helpActions.push(additionalHelpActions); + const additionOperatorHelpActions = { ...additionalHelpActions } || { + name: '', + isSection: true, + actions: [], + }; + + // Add default help links to start of additional links from operator + additionOperatorHelpActions.actions = defaultHelpLinks + .map((helpLink) => ({ + ...helpLink, + label: t(`public~${helpLink.label}`), + })) + .concat(additionOperatorHelpActions.actions); + + if (!_.isEmpty(additionOperatorHelpActions.actions)) { + helpActions.push(additionOperatorHelpActions); } return helpActions; diff --git a/frontend/public/locales/en/public.json b/frontend/public/locales/en/public.json index d93419e0ae5..5ccd9c8666c 100644 --- a/frontend/public/locales/en/public.json +++ b/frontend/public/locales/en/public.json @@ -658,6 +658,8 @@ "Instance type": "Instance type", "Machine addresses": "Machine addresses", "by machine or node name": "by machine or node name", + "Learning Portal": "Learning Portal", + "OpenShift Blog": "OpenShift Blog", "System status": "System status", "Red Hat applications": "Red Hat applications", "Quick Starts": "Quick Starts", From cbd349de3a5100487b71a6f5deb649d767c183b5 Mon Sep 17 00:00:00 2001 From: Kim Doberstein Date: Mon, 16 Aug 2021 09:49:05 -0500 Subject: [PATCH 4/4] Delete console-app.json This was accidentally added during a rebase. Removing because it is no longer in master --- frontend/public/locales/en/console-app.json | 248 -------------------- 1 file changed, 248 deletions(-) delete mode 100644 frontend/public/locales/en/console-app.json diff --git a/frontend/public/locales/en/console-app.json b/frontend/public/locales/en/console-app.json deleted file mode 100644 index 57d7fe21f36..00000000000 --- a/frontend/public/locales/en/console-app.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "Web console update is available": "Web console update is available", - "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.": "There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.", - "Refresh web console": "Refresh web console", - "VolumeSnapshotContents": "VolumeSnapshotContents", - "Delete {{kind}}": "Delete {{kind}}", - "Edit {{kind}}": "Edit {{kind}}", - "Edit labels": "Edit labels", - "Edit annotations": "Edit annotations", - "Edit Pod count": "Edit Pod count", - "Edit Pod selector": "Edit Pod selector", - "Edit tolerations": "Edit tolerations", - "Add storage": "Add storage", - "Edit update strategy": "Edit update strategy", - "Resume rollouts": "Resume rollouts", - "Pause rollouts": "Pause rollouts", - "Start rollout": "Start rollout", - "Edit resource limits": "Edit resource limits", - "Add Health Checks": "Add Health Checks", - "Edit Health Checks": "Edit Health Checks", - "Add HorizontalPodAutoscaler": "Add HorizontalPodAutoscaler", - "Edit HorizontalPodAutoscaler": "Edit HorizontalPodAutoscaler", - "Remove HorizontalPodAutoscaler": "Remove HorizontalPodAutoscaler", - "Edit parallelism": "Edit parallelism", - "Expand PVC": "Expand PVC", - "Create snapshot": "Create snapshot", - "PVC is not Bound": "PVC is not Bound", - "Clone PVC": "Clone PVC", - "Restore as new PVC": "Restore as new PVC", - "Volume Snapshot is not Ready": "Volume Snapshot is not Ready", - "Access mode": "Access mode", - "Close terminal?": "Close terminal?", - "This will close the terminal session. Content in the terminal will not be restored on next session.": "This will close the terminal session. Content in the terminal will not be restored on next session.", - "Yes": "Yes", - "No": "No", - "Command line terminal": "Command line terminal", - "Open terminal in new tab": "Open terminal in new tab", - "Minimize terminal": "Minimize terminal", - "Restore terminal": "Restore terminal", - "Close terminal": "Close terminal", - "The terminal connection has closed due to {{reason}}.": "The terminal connection has closed due to {{reason}}.", - "The terminal connection has closed.": "The terminal connection has closed.", - "connecting to {{container}}": "connecting to {{container}}", - "Reconnect to terminal": "Reconnect to terminal", - "Restart terminal": "Restart terminal", - "OpenShift command line": "OpenShift command line", - "OpenShift command line terminal": "OpenShift command line terminal", - "Failed to connect to your OpenShift command line terminal": "Failed to connect to your OpenShift command line terminal", - "Initialize terminal": "Initialize terminal", - "Start": "Start", - "Cancel": "Cancel", - "Project": "Project", - "Select Project": "Select Project", - "Create Project": "Create Project", - "This Project will be used to initialize your command line terminal": "This Project will be used to initialize your command line terminal", - "Project name": "Project name", - "Connecting to your OpenShift command line terminal ...": "Connecting to your OpenShift command line terminal ...", - "Enabled": "Enabled", - "Disabled": "Disabled", - "Name": "Name", - "Version": "Version", - "Description": "Description", - "Status": "Status", - "Console plugins table": "Console plugins table", - "console plugins": "console plugins", - "Console plugins": "Console plugins", - "Updating cluster to {{version}}": "Updating cluster to {{version}}", - "API Servers": "API Servers", - "Controller Managers": "Controller Managers", - "Schedulers": "Schedulers", - "API Request Success Rate": "API Request Success Rate", - "Components of the Control Plane are responsible for maintaining and reconciling the state of the cluster.": "Components of the Control Plane are responsible for maintaining and reconciling the state of the cluster.", - "Components": "Components", - "Response rate": "Response rate", - "Single master": "Single master", - "Incompatible file type": "Incompatible file type", - "{{fileName}} cannot be uploaded. Only {{fileExtensions}} files are supported currently. Try another file.": "{{fileName}} cannot be uploaded. Only {{fileExtensions}} files are supported currently. Try another file.", - "Clone": "Clone", - "Size": "Size", - "Size should be equal or greater than the requested size of PVC": "Size should be equal or greater than the requested size of PVC", - "PVC details": "PVC details", - "Namespace": "Namespace", - "Storage Class": "Storage Class", - "Requested capacity": "Requested capacity", - "Used capacity": "Used capacity", - "Volume mode": "Volume mode", - "Save": "Save", - "When restore action for snapshot <1>{{snapshotName}} is finished a new crash-consistent PVC copy will be created.": "When restore action for snapshot <1>{{snapshotName}} is finished a new crash-consistent PVC copy will be created.", - "Size should be equal or greater than the restore size of snapshot": "Size should be equal or greater than the restore size of snapshot", - "{{resourceKind}} details": "{{resourceKind}} details", - "Created at": "Created at", - "API version": "API version", - "Restore": "Restore", - "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic from all pods in eligible namespaces will be allowed.", - "If no pod selector is provided, traffic from all pods in this namespace will be allowed.": "If no pod selector is provided, traffic from all pods in this namespace will be allowed.", - "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.": "If no pod selector is provided, traffic to all pods in eligible namespaces will be allowed.", - "If no pod selector is provided, traffic to all pods in this namespace will be allowed.": "If no pod selector is provided, traffic to all pods in this namespace will be allowed.", - "If no namespace selector is provided, pods from all namespaces will be eligible.": "If no namespace selector is provided, pods from all namespaces will be eligible.", - "This action cannot be undone. Deleting a node will instruct Kubernetes that the node is down or unrecoverable and delete all pods scheduled to that node. If the node is still running but unresponsive and the node is deleted, stateful workloads and persistent volumes may suffer corruption or data loss. Only delete a node that you have confirmed is completely stopped and cannot be restored.": "This action cannot be undone. Deleting a node will instruct Kubernetes that the node is down or unrecoverable and delete all pods scheduled to that node. If the node is still running but unresponsive and the node is deleted, stateful workloads and persistent volumes may suffer corruption or data loss. Only delete a node that you have confirmed is completely stopped and cannot be restored.", - "Delete node": "Delete node", - "Mark as unschedulable": "Mark as unschedulable", - "Unschedulable nodes won't accept new pods. This is useful for scheduling maintenance or preparing to decommission a node.": "Unschedulable nodes won't accept new pods. This is useful for scheduling maintenance or preparing to decommission a node.", - "Mark unschedulable": "Mark unschedulable", - "Activity": "Activity", - "View events": "View events", - "Details": "Details", - "View all": "View all", - "Node name": "Node name", - "Role": "Role", - "Instance type": "Instance type", - "Zone": "Zone", - "Node addresses": "Node addresses", - "Inventory": "Inventory", - "Image": "Image", - "Images": "Images", - "Not available": "Not available", - "See breakdown": "See breakdown", - "See details": "See details", - "Health checks": "Health checks", - "{{ cpuMessage }}": "{{ cpuMessage }}", - "{{ memoryMessage }}": "{{ memoryMessage }}", - "{{ machineHealthCheckLabelPlural }} automatically remediate node health issues.": "{{ machineHealthCheckLabelPlural }} automatically remediate node health issues.", - "Conditions": "Conditions", - "Reboot pending": "Reboot pending", - "Reprovision pending": "Reprovision pending", - "Only one {{ machineHealthCheckLabel }} resource should match this node.": "Only one {{ machineHealthCheckLabel }} resource should match this node.", - "Not configured": "Not configured", - "CPU": "CPU", - "Memory": "Memory", - "Filesystem": "Filesystem", - "Network in": "Network in", - "Network out": "Network out", - "Utilization": "Utilization", - "Network transfer": "Network transfer", - "Pod count": "Pod count", - "Node conditions": "Node conditions", - "Type": "Type", - "Reason": "Reason", - "Updated": "Updated", - "Changed": "Changed", - "Node details": "Node details", - "External ID": "External ID", - "Node labels": "Node labels", - "Taints": "Taints", - "Taint": "Taint", - "Taint_plural": "Taints", - "Annotations": "Annotations", - "Annotation": "Annotation", - "Annotation_plural": "Annotations", - "Machine": "Machine", - "Provider ID": "Provider ID", - "Unschedulable": "Unschedulable", - "Created": "Created", - "Operating system": "Operating system", - "OS image": "OS image", - "Architecture": "Architecture", - "Kernel version": "Kernel version", - "Boot ID": "Boot ID", - "Container runtime": "Container runtime", - "Kubelet version": "Kubelet version", - "Kube-Proxy version": "Kube-Proxy version", - "Overview": "Overview", - "Terminal": "Terminal", - "Pods": "Pods", - "Labels": "Labels", - "Nodes": "Nodes", - "Ready": "Ready", - "Not Ready": "Not Ready", - "Master": "Master", - "Worker": "Worker", - "This node's {{conditionDescription}}. Performance may be degraded.": "This node's {{conditionDescription}}. Performance may be degraded.", - "<0>To use host binaries, run <1>chroot /host": "<0>To use host binaries, run <1>chroot /host", - "The debug pod failed. ": "The debug pod failed. ", - "An error occurred. Please try again": "An error occurred. Please try again", - "Scheduling disabled": "Scheduling disabled", - "No new Pods or workloads will be placed on this Node until it's marked as schedulable.": "No new Pods or workloads will be placed on this Node until it's marked as schedulable.", - "Mark as schedulable": "Mark as schedulable", - "Quick Starts": "Quick Starts", - "Learn how to create, import, and run applications on OpenShift with step-by-step instructions and tasks.": "Learn how to create, import, and run applications on OpenShift with step-by-step instructions and tasks.", - "No results found": "No results found", - "No results match the filter criteria. Remove filters or clear all filters to show results.": "No results match the filter criteria. Remove filters or clear all filters to show results.", - "Clear all filters": "Clear all filters", - "Complete ({{statusCount, number}})": "Complete ({{statusCount, number}})", - "In progress ({{statusCount, number}})": "In progress ({{statusCount, number}})", - "Not started ({{statusCount, number}})": "Not started ({{statusCount, number}})", - "Filter by keyword...": "Filter by keyword...", - "Select filter": "Select filter", - "{{count, number}} item": "{{count, number}} item", - "{{count, number}} item_plural": "{{count, number}} items", - "Prerequisites ({{totalPrereqs}})": "Prerequisites ({{totalPrereqs}})", - "Prerequisites": "Prerequisites", - "Show prerequisites": "Show prerequisites", - "Complete": "Complete", - "In progress": "In progress", - "Not started": "Not started", - "{{duration, number}} minutes": "{{duration, number}} minutes", - "One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.": "One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.", - "Start {{nextQSDisplayName}} quick start": "Start {{nextQSDisplayName}} quick start", - "Continue": "Continue", - "Next": "Next", - "Close": "Close", - "Back": "Back", - "Restart": "Restart", - "In this quick start, you will complete {{count, number}} task": "In this quick start, you will complete {{count, number}} task", - "In this quick start, you will complete {{count, number}} task_plural": "In this quick start, you will complete {{count, number}} tasks", - "{{taskIndex, number}}": "{{taskIndex, number}}", - "Check your work": "Check your work", - "{{index, number}} of {{tasks, number}}": "{{index, number}} of {{tasks, number}}", - "Leave quick start?": "Leave quick start?", - "Leave": "Leave", - "Your progress will be saved.": "Your progress will be saved.", - "Get started": "Get started", - "Skip tour": "Skip tour", - "Okay, got it!": "Okay, got it!", - "Guided tour": "Guided tour", - "Step {{stepNumber, number}}/{{totalSteps, number}}": "Step {{stepNumber, number}}/{{totalSteps, number}}", - "guided tour {{step, number}}": "guided tour {{step, number}}", - "Only {{volumeMode}} volume mode is available for {{storageClass}} with {{accessMode}} access mode": "Only {{volumeMode}} volume mode is available for {{storageClass}} with {{accessMode}} access mode", - "VolumeSnapshotClass with same provisioner as claim": "VolumeSnapshotClass with same provisioner as claim", - "Select volume snapshot class": "Select volume snapshot class", - "PersistentVolumeClaim details": "PersistentVolumeClaim details", - "StorageClass": "StorageClass", - "Create VolumeSnapshot": "Create VolumeSnapshot", - "Edit YAML": "Edit YAML", - "Creating snapshot for claim <1>{{pvcName}}": "Creating snapshot for claim <1>{{pvcName}}", - "PersistentVolumeClaim": "PersistentVolumeClaim", - "Snapshot Class": "Snapshot Class", - "Create": "Create", - "VolumeSnapshotClass details": "VolumeSnapshotClass details", - "Driver": "Driver", - "Deletion policy": "Deletion policy", - "VolumeSnapshotContent details": "VolumeSnapshotContent details", - "VolumeSnapshot": "VolumeSnapshot", - "VolumeSnapshotClass": "VolumeSnapshotClass", - "Volume handle": "Volume handle", - "Snapshot handle": "Snapshot handle", - "SnapshotClass": "SnapshotClass", - "VolumeSnapshot details": "VolumeSnapshot details", - "Source": "Source", - "VolumeSnapshotContent": "VolumeSnapshotContent", - "Snapshot content": "Snapshot content", - "VolumeSnapshots": "VolumeSnapshots", - "Administrator": "Administrator", - "Cluster": "Cluster", - "Control Plane": "Control Plane", - "Control Plane status": "Control Plane status", - "Cluster operators": "Cluster operators" -} \ No newline at end of file