diff --git a/packages/forklift-console-plugin/locales/en/plugin__forklift-console-plugin.json b/packages/forklift-console-plugin/locales/en/plugin__forklift-console-plugin.json index 604d10e3b..7e495ed6d 100644 --- a/packages/forklift-console-plugin/locales/en/plugin__forklift-console-plugin.json +++ b/packages/forklift-console-plugin/locales/en/plugin__forklift-console-plugin.json @@ -11,11 +11,15 @@ "24 hours": "24 hours", "404: Not Found": "404: Not Found", "7 days": "7 days", + "A CA certificate to be trusted when connecting to the OpenStack Identity (Keystone) endpoint. Ensure the CA certificate format is valid. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.": "A CA certificate to be trusted when connecting to the OpenStack Identity (Keystone) endpoint. Ensure the CA certificate format is valid. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.", "A CA certificate to be trusted when connecting to the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the CA certificate format is in a PEM encoded X.509 format. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.": "A CA certificate to be trusted when connecting to the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the CA certificate format is in a PEM encoded X.509 format. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.", "A Secret containing credentials and other confidential information.": "A Secret containing credentials and other confidential information.", "A service account token with cluster admin privileges, required for authenticating the connection to the API server.": "A service account token with cluster admin privileges, required for authenticating the connection to the API server.", + "A user ID for connecting to the OpenStack Identity (Keystone) endpoint.": "A user ID for connecting to the OpenStack Identity (Keystone) endpoint.", + "A user name for connecting to the OpenStack Identity (Keystone) endpoint.": "A user name for connecting to the OpenStack Identity (Keystone) endpoint.", "A user name for connecting to the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the user name is in the format of username@user-domain. For example: admin@internal.": "A user name for connecting to the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the user name is in the format of username@user-domain. For example: admin@internal.", "A user name for connecting to the vCenter API endpoint. Ensure the user name is in the format of username@user-domain. For example: user@vsphere.local .": "A user name for connecting to the vCenter API endpoint. Ensure the user name is in the format of username@user-domain. For example: user@vsphere.local .", + "A user password for connecting to the OpenStack Identity (Keystone) endpoint.": "A user password for connecting to the OpenStack Identity (Keystone) endpoint.", "A user password for connecting to the Red Hat Virtualization Manager (RHVM) API endpoint.": "A user password for connecting to the Red Hat Virtualization Manager (RHVM) API endpoint.", "A user password for connecting to the vCenter API endpoint.": "A user password for connecting to the vCenter API endpoint.", "Actions": "Actions", @@ -35,10 +39,8 @@ "Authentication type": "Authentication type", "Bandwidth": "Bandwidth", "CA certificate": "CA certificate", - "CA certificate - disabled and ignored when 'Skip certificate validation' is checked": "CA certificate - disabled and ignored when 'Skip certificate validation' is checked", - "CA certificate - disabled when skip certificate validation is checked": "CA certificate - disabled when skip certificate validation is checked", + "CA certificate - disabled when 'Skip certificate validation' is checked": "CA certificate - disabled when 'Skip certificate validation' is checked", "CA certificate - leave empty to use system CA certificates": "CA certificate - leave empty to use system CA certificates", - "CA certificate - leave empty to use system certificates": "CA certificate - leave empty to use system certificates", "Cancel": "Cancel", "Cancel scheduled cutover": "Cancel scheduled cutover", "Cannot archive plan": "Cannot archive plan", @@ -126,22 +128,31 @@ "Ensure the URL includes the \"/ovirt-engine/api\" path. For example: https://rhv-host-example.com/ovirt-engine/api.": "Ensure the URL includes the \"/ovirt-engine/api\" path. For example: https://rhv-host-example.com/ovirt-engine/api.", "Ensure the URL includes the \"/sdk\" path. For example: https://vCenter-host-example.com/sdk .": "Ensure the URL includes the \"/sdk\" path. For example: https://vCenter-host-example.com/sdk .", "Error": "Error", - "Error: CA Certificate must be valid.": "Error: CA Certificate must be valid.", "Error: Fingerprint is required and must be valid.": "Error: Fingerprint is required and must be valid.", "Error: Insecure Skip Verify must be a boolean value.": "Error: Insecure Skip Verify must be a boolean value.", "Error: Name is required and must be a unique within a namespace and valid Kubernetes name (i.e., must contain no more than 253 characters, consists of lower case alphanumeric characters , '-' or '.' and starts and ends with an alphanumeric character).": "Error: Name is required and must be a unique within a namespace and valid Kubernetes name (i.e., must contain no more than 253 characters, consists of lower case alphanumeric characters , '-' or '.' and starts and ends with an alphanumeric character).", + "Error: The format of the provided application credential ID is invalid. Ensure the ID doesn't include whitespace characters.": "Error: The format of the provided application credential ID is invalid. Ensure the ID doesn't include whitespace characters.", + "Error: The format of the provided application credential name is invalid. Ensure the name doesn't include whitespace characters.": "Error: The format of the provided application credential name is invalid. Ensure the name doesn't include whitespace characters.", + "Error: The format of the provided application credential Secret is invalid. Ensure the secret doesn't include whitespace characters.": "Error: The format of the provided application credential Secret is invalid. Ensure the secret doesn't include whitespace characters.", "Error: The format of the provided CA Certificate is invalid. Ensure the CA certificate format is in a PEM encoded X.509 format.": "Error: The format of the provided CA Certificate is invalid. Ensure the CA certificate format is in a PEM encoded X.509 format.", + "Error: The format of the provided CA Certificate is invalid. Ensure the CA certificate format is valid.": "Error: The format of the provided CA Certificate is invalid. Ensure the CA certificate format is valid.", + "Error: The format of the provided domain name is invalid. Ensure the domain name doesn't include whitespace characters.": "Error: The format of the provided domain name is invalid. Ensure the domain name doesn't include whitespace characters.", + "Error: The format of the provided project ID is invalid. Ensure the project ID doesn't include whitespace characters.": "Error: The format of the provided project ID is invalid. Ensure the project ID doesn't include whitespace characters.", + "Error: The format of the provided project name is invalid. Ensure the project name doesn't include whitespace characters.": "Error: The format of the provided project name is invalid. Ensure the project name doesn't include whitespace characters.", + "Error: The format of the provided region name is invalid. Ensure the region name doesn't include whitespace characters.": "Error: The format of the provided region name is invalid. Ensure the region name doesn't include whitespace characters.", + "Error: The format of the provided token is invalid. Ensure the token doesn't include whitespace characters.": "Error: The format of the provided token is invalid. Ensure the token doesn't include whitespace characters.", "Error: The format of the provided token is invalid. Ensure the token is a valid Kubernetes service account token.": "Error: The format of the provided token is invalid. Ensure the token is a valid Kubernetes service account token.", + "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: <2>https://identity_service.com:5000/v3.": "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: <2>https://identity_service.com:5000/v3.", "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: https://vCenter-host-example.com/sdk .": "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: https://vCenter-host-example.com/sdk .", "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: https://rhv-host-example.com/ovirt-engine/api.": "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and a path. For example: https://rhv-host-example.com/ovirt-engine/api.", "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and, optionally, a port. For example: https://api.‹your-openshift-domain›:6443.": "Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a domain name, and, optionally, a port. For example: https://api.‹your-openshift-domain›:6443.", "Error: The format of the provided URL is invalid. Ensure the URL is in the following format: ip_or_hostname_of_nfs_server:/nfs_path. For example: 10.10.0.10:/ova .": "Error: The format of the provided URL is invalid. Ensure the URL is in the following format: ip_or_hostname_of_nfs_server:/nfs_path. For example: 10.10.0.10:/ova .", + "Error: The format of the provided user ID is invalid. Ensure the user ID doesn't include whitespace characters.": "Error: The format of the provided user ID is invalid. Ensure the user ID doesn't include whitespace characters.", "Error: The format of the provided user name is invalid. Ensure the user name doesn't include whitespace characters.": "Error: The format of the provided user name is invalid. Ensure the user name doesn't include whitespace characters.", "Error: The format of the provided user password is invalid. Ensure the user password doesn't include whitespace characters.": "Error: The format of the provided user password is invalid. Ensure the user password doesn't include whitespace characters.", "Error: The format of the provided VDDK init image is invalid. Ensure the path is a valid container image path. For example: quay.io/kubev2v/vddk:latest.": "Error: The format of the provided VDDK init image is invalid. Ensure the path is a valid container image path. For example: quay.io/kubev2v/vddk:latest.", "Error: This field must be a boolean.": "Error: This field must be a boolean.", "Error: this field must be set to a boolean value.": "Error: this field must be set to a boolean value.", - "Error: URL is required and must be valid.": "Error: URL is required and must be valid.", "Failed": "Failed", "False": "False", "Features": "Features", @@ -160,6 +171,7 @@ "Filter by template": "Filter by template", "Filter by tenant": "Filter by tenant", "Flavor": "Flavor", + "For example: <1>https://identity_service.com:5000/v3.": "For example: <1>https://identity_service.com:5000/v3.", "From": "From", "GPUs/Host Devices": "GPUs/Host Devices", "Hide from view": "Hide from view", @@ -168,27 +180,13 @@ "Host": "Host", "Host cluster": "Host cluster", "Hosts": "Hosts", + "If true (check box is checked), the provider's CA certificate won't be validated.": "If true (check box is checked), the provider's CA certificate won't be validated.", "If true, the provider's CA certificate won't be validated.": "If true, the provider's CA certificate won't be validated.", - "If true, the provider's REST API TLS certificate won't be validated.": "If true, the provider's REST API TLS certificate won't be validated.", "If true, the provider's TLS certificate won't be validated.": "If true, the provider's TLS certificate won't be validated.", "Image": "Image", "Information concerns": "Information concerns", - "Invalid application credential ID.": "Invalid application credential ID.", - "Invalid application credential name.": "Invalid application credential name.", - "Invalid application credential secret.": "Invalid application credential secret.", - "Invalid domain name.": "Invalid domain name.", - "Invalid Domain Name.": "Invalid Domain Name.", "Invalid password": "Invalid password", - "Invalid password.": "Invalid password.", - "Invalid Project ID.": "Invalid Project ID.", - "Invalid project name.": "Invalid project name.", - "Invalid Project.": "Invalid Project.", - "Invalid region name.": "Invalid region name.", - "Invalid token.": "Invalid token.", - "Invalid User ID.": "Invalid User ID.", "Invalid username": "Invalid username", - "Invalid username.": "Invalid username.", - "Invalid Username.": "Invalid Username.", "Inventory": "Inventory", "Inventory server is not reachable. To troubleshoot, check the Forklift controller pod logs.": "Inventory server is not reachable. To troubleshoot, check the Forklift controller pod logs.", "List of objects depended by this object. If ALL objects in the list have been deleted,\n this object will be garbage collected. If this object is managed by a controller,\n then an entry in this list will point to this controller, with the controller field set to true.\n There cannot be more than one managing controller.": "List of objects depended by this object. If ALL objects in the list have been deleted,\n this object will be garbage collected. If this object is managed by a controller,\n then an entry in this list will point to this controller, with the controller field set to true.\n There cannot be more than one managing controller.", @@ -205,6 +203,7 @@ "Maximum number of concurrent VM migrations. Default value is 20.": "Maximum number of concurrent VM migrations. Default value is 20.", "Message": "Message", "Message: {{message}}": "Message: {{message}}", + "Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.": "Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.", "Migrate": "Migrate", "Migrating virtualization workloads is a multi-step process. <2>Learn more.": "Migrating virtualization workloads is a multi-step process. <2>Learn more.", "Migration network maps are used to map network interfaces between source and target virtualization providers, at least one source and one target provider must be available in order to create a migration storage map, <2>Learn more.": "Migration network maps are used to map network interfaces between source and target virtualization providers, at least one source and one target provider must be available in order to create a migration storage map, <2>Learn more.", @@ -257,6 +256,8 @@ "No storages in this category": "No storages in this category", "Not Ready": "Not Ready", "Note: If 'Skip certificate validation' is selected, migrations from this provider will not be secure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.": "Note: If 'Skip certificate validation' is selected, migrations from this provider will not be secure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.", + "Note: If 'Skip certificate validation' is selected, migrations from this provider will not be secure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.": "Note: If 'Skip certificate validation' is selected, migrations from this provider will not be secure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.", + "Note: If this field is checked/true, the migration from this provider will be insecure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.": "Note: If this field is checked/true, the migration from this provider will be insecure.

Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.", "Note: It is strongly recommended to specify a VDDK init image to accelerate migrations.": "Note: It is strongly recommended to specify a VDDK init image to accelerate migrations.", "Note: Use the Manager CA certificate unless it was replaced by a third-party certificate, in which case use the Manager Apache CA certificate.

You can retrieve the Manager CA certificate at:
<1>https://‹rhv-host-example.com›/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA .": "Note: Use the Manager CA certificate unless it was replaced by a third-party certificate, in which case use the Manager Apache CA certificate.

You can retrieve the Manager CA certificate at:
<1>https://‹rhv-host-example.com›/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA .", "NUMA": "NUMA", @@ -276,21 +277,15 @@ "Number of virtual machines in OVA files": "Number of virtual machines in OVA files", "Off": "Off", "On": "On", - "OpenStack domain for application credential credentials.": "OpenStack domain for application credential credentials.", - "OpenStack domain for password credentials.": "OpenStack domain for password credentials.", - "OpenStack domain name for token credentials.": "OpenStack domain name for token credentials.", - "OpenStack Identity (Keystone) endpoint, for example, http://controller:5000/v3": "OpenStack Identity (Keystone) endpoint, for example, http://controller:5000/v3", - "OpenStack project for token credentials.": "OpenStack project for token credentials.", - "OpenStack project ID for token credentials.": "OpenStack project ID for token credentials.", - "OpenStack project.": "OpenStack project.", - "OpenStack region.": "OpenStack region.", - "OpenStack REST API application credential ID.": "OpenStack REST API application credential ID.", - "OpenStack REST API application credential name.": "OpenStack REST API application credential name.", - "OpenStack REST API application credential secret.": "OpenStack REST API application credential secret.", - "OpenStack REST API password credentials.": "OpenStack REST API password credentials.", - "OpenStack REST API token credentials.": "OpenStack REST API token credentials.", - "OpenStack REST API user ID.": "OpenStack REST API user ID.", - "OpenStack REST API user name.": "OpenStack REST API user name.", + "OpenStack application credential ID needed for the application credential authentication.": "OpenStack application credential ID needed for the application credential authentication.", + "OpenStack application credential name needed for application credential authentication.": "OpenStack application credential name needed for application credential authentication.", + "OpenStack application credential Secret needed for the application credential authentication.": "OpenStack application credential Secret needed for the application credential authentication.", + "OpenStack domain name.": "OpenStack domain name.", + "OpenStack project ID.": "OpenStack project ID.", + "OpenStack project name.": "OpenStack project name.", + "OpenStack region name.": "OpenStack region name.", + "OpenStack token for authentication using a user ID.": "OpenStack token for authentication using a user ID.", + "OpenStack token for authentication using a user name.": "OpenStack token for authentication using a user name.", "Operator": "Operator", "Operator conditions define the current state of the controller": "Operator conditions define the current state of the controller", "Other networks present on the source provider ": "Other networks present on the source provider ", @@ -311,7 +306,6 @@ "Please enter the limit for memory usage by the controller in Mi, if empty default value will be used.": "Please enter the limit for memory usage by the controller in Mi, if empty default value will be used.", "Please enter the maximum age in hours for must gather cleanup, if empty default value will be used.": "Please enter the maximum age in hours for must gather cleanup, if empty default value will be used.", "Please enter the maximum number of concurrent VM migrations, if empty default value will be used.": "Please enter the maximum number of concurrent VM migrations, if empty default value will be used.", - "Please enter URL for OpenStack services REST APIs.": "Please enter URL for OpenStack services REST APIs.", "Pod network": "Pod network", "Power state": "Power state", "Powered off": "Powered off", @@ -365,7 +359,6 @@ "Source Only": "Source Only", "Source provider": "Source provider", "Specifies the duration for retaining 'must gather' reports before they are automatically deleted. The default value is -1, which implies automatic cleanup is disabled.": "Specifies the duration for retaining 'must gather' reports before they are automatically deleted. The default value is -1, which implies automatic cleanup is disabled.", - "Specify OpenStack Identity (Keystone) endpoint, for example, http://controller:5000/v3.": "Specify OpenStack Identity (Keystone) endpoint, for example, http://controller:5000/v3.", "Specify the type of source provider. Allowed values are ova, ovirt, vsphere,\n openshift, and openstack. This label is needed to verify the credentials are correct when the remote system is accessible and, for RHV, to retrieve the Manager CA certificate when\n a third-party certificate is specified.": "Specify the type of source provider. Allowed values are ova, ovirt, vsphere,\n openshift, and openstack. This label is needed to verify the credentials are correct when the remote system is accessible and, for RHV, to retrieve the Manager CA certificate when\n a third-party certificate is specified.", "SSHA-1 fingerprint": "SSHA-1 fingerprint", "Staging": "Staging", @@ -418,7 +411,6 @@ "Total: {{length}}": "Total: {{length}}", "True": "True", "Type": "Type", - "Type of authentication to use when connecting to OpenStack REST API.": "Type of authentication to use when connecting to OpenStack REST API.", "Unable to retrieve data": "Unable to retrieve data", "Undefined": "Undefined", "Unique Kubernetes resource name identifier.": "Unique Kubernetes resource name identifier.", @@ -428,7 +420,6 @@ "Update credentials": "Update credentials", "Updated": "Updated", "URL": "URL", - "URL must start with https:// or http:// and contain valid hostname and path": "URL must start with https:// or http:// and contain valid hostname and path", "URL of the API endpoint of the Red Hat Virtualization Manager (RHVM) on which the source VM is mounted. Ensure that the URL includes the path leading to the RHVM API server, usually /ovirt-engine/api. For example, https://rhv-host-example.com/ovirt-engine/api.": "URL of the API endpoint of the Red Hat Virtualization Manager (RHVM) on which the source VM is mounted. Ensure that the URL includes the path leading to the RHVM API server, usually /ovirt-engine/api. For example, https://rhv-host-example.com/ovirt-engine/api.", "URL of the API endpoint of the vCenter on which the source VM is mounted. Ensure that the URL includes the sdk path, usually <1>/sdk.<3><4>For example, <6>https://vCenter-host-example.com/sdk.<8><9>If a certificate for FQDN is specified, the value of this field needs to match the FQDN in the certificate.": "URL of the API endpoint of the vCenter on which the source VM is mounted. Ensure that the URL includes the sdk path, usually <1>/sdk.<3><4>For example, <6>https://vCenter-host-example.com/sdk.<8><9>If a certificate for FQDN is specified, the value of this field needs to match the FQDN in the certificate.", "URL of the NFS file share that serves the OVA. Ensure the URL is in the following format: ip_or_hostname_of_nfs_server:/nfs_path. For example: 10.10.0.10:/ova .": "URL of the NFS file share that serves the OVA. Ensure the URL is in the following format: ip_or_hostname_of_nfs_server:/nfs_path. For example: 10.10.0.10:/ova .", @@ -436,7 +427,9 @@ "URL of the Openshift Virtualization API endpoint.": "URL of the Openshift Virtualization API endpoint.", "URL of the Openshift Virtualization API endpoint. Empty may be used for the host provider.": "URL of the Openshift Virtualization API endpoint. Empty may be used for the host provider.", "URL of the Openshift Virtualization API endpoint. If both URL and Service account bearer token are left blank, the local OpenShift cluster is used.": "URL of the Openshift Virtualization API endpoint. If both URL and Service account bearer token are left blank, the local OpenShift cluster is used.", - "URL of the provider": "URL of the provider", + "URL of the OpenStack Identity (Keystone) endpoint.": "URL of the OpenStack Identity (Keystone) endpoint.", + "URL of the OpenStack Identity (Keystone) endpoint. For example: <2>https://identity_service.com:5000/v3.": "URL of the OpenStack Identity (Keystone) endpoint. For example: <2>https://identity_service.com:5000/v3.", + "URL of the OpenStack Identity (Keystone) endpoint. For example: https://identity_service.com:5000/v3.": "URL of the OpenStack Identity (Keystone) endpoint. For example: https://identity_service.com:5000/v3.", "URL of the providers API endpoint. The URL must be a valid endpoint for the provider type, see\n the documentation for each provider type to learn more about the URL format.": "URL of the providers API endpoint. The URL must be a valid endpoint for the provider type, see\n the documentation for each provider type to learn more about the URL format.", "URL of the Red Hat Virtualization Manager (RHVM) API endpoint.": "URL of the Red Hat Virtualization Manager (RHVM) API endpoint.", "URL of the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the URL includes the \"/ovirt-engine/api\" path. For example: https://rhv-host-example.com/ovirt-engine/api.": "URL of the Red Hat Virtualization Manager (RHVM) API endpoint. Ensure the URL includes the \"/ovirt-engine/api\" path. For example: https://rhv-host-example.com/ovirt-engine/api.", @@ -461,6 +454,8 @@ "Volumes": "Volumes", "vSphere product name": "vSphere product name", "Warning concerns": "Warning concerns", + "Warning: The provided URL does not end with the API endpoint path: <2>\"/v3\". Ensure the URL includes the correct path. For example: <5>https://identity_service.com:5000/v3.": "Warning: The provided URL does not end with the API endpoint path: <2>\"/v3\". Ensure the URL includes the correct path. For example: <5>https://identity_service.com:5000/v3.", + "Warning: The provided URL does not end with the API endpoint path:<1>\"/v3\". Ensure the URL includes the correct path. For example: <5>https://identity_service.com:5000/v3.": "Warning: The provided URL does not end with the API endpoint path:<1>\"/v3\". Ensure the URL includes the correct path. For example: <5>https://identity_service.com:5000/v3.", "Warning: The provided URL does not end with the RHVM API endpoint path: \"/ovirt-engine/api\". Ensure the URL includes the correct path. For example: https://rhv-host-example.com/ovirt-engine/api.": "Warning: The provided URL does not end with the RHVM API endpoint path: \"/ovirt-engine/api\". Ensure the URL includes the correct path. For example: https://rhv-host-example.com/ovirt-engine/api.", "Warning: The provided URL does not end with the SDK endpoint path: \"/sdk\". Ensure the URL includes the correct path. For example: https://vCenter-host-example.com/sdk .": "Warning: The provided URL does not end with the SDK endpoint path: \"/sdk\". Ensure the URL includes the correct path. For example: https://vCenter-host-example.com/sdk .", "Warning: The provided user name does not include the user domain. Ensure the user name is in the format of username@user-domain. For example: user@vsphere.local .": "Warning: The provided user name does not include the user domain. Ensure the user name is in the format of username@user-domain. For example: user@vsphere.local .", diff --git a/packages/forklift-console-plugin/src/modules/Providers/modals/EditProviderURL/OpenstackEditURLModal.tsx b/packages/forklift-console-plugin/src/modules/Providers/modals/EditProviderURL/OpenstackEditURLModal.tsx index 8002fed3a..6c07b30d6 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/modals/EditProviderURL/OpenstackEditURLModal.tsx +++ b/packages/forklift-console-plugin/src/modules/Providers/modals/EditProviderURL/OpenstackEditURLModal.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Trans } from 'react-i18next'; import { useForkliftTranslation } from 'src/utils/i18n'; import { ProviderModel } from '@kubev2v/types'; @@ -13,20 +14,65 @@ import { EditProviderURLModalProps } from './EditProviderURLModal'; export const OpenstackEditURLModal: React.FC = (props) => { const { t } = useForkliftTranslation(); - const urlValidationHook: ValidationHookType = (value) => { - const isValidURL = validateURL(value.toString().trim()); + const helperTextMsgs = { + error: ( +
+ + Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a + domain name, and a path. For example:{' '} + https://identity_service.com:5000/v3. + +
+ ), + warning: ( +
+ + Warning: The provided URL does not end with the API endpoint path: + + {'"'}/v3{'"'} + + {'. '} + Ensure the URL includes the correct path. For example:{' '} + https://identity_service.com:5000/v3. + +
+ ), + success: ( +
+ + For example: https://identity_service.com:5000/v3. + +
+ ), + default: ( +
+ + For example: https://identity_service.com:5000/v3. + +
+ ), + }; - return isValidURL - ? { - validationHelpText: undefined, - validated: 'success', - } - : { - validationHelpText: t( - 'URL must start with https:// or http:// and contain valid hostname and path', - ), - validated: 'error', - }; + const urlValidationHook: ValidationHookType = (value) => { + const trimmedUrl: string = value.toString().trim(); + const isValidURL = validateURL(trimmedUrl); + // error + if (!isValidURL) + return { + validationHelpText: helperTextMsgs.error, + validated: 'error', + }; + // warning + if (!trimmedUrl.endsWith('v3') && !trimmedUrl.endsWith('v3/')) + return { + validationHelpText: helperTextMsgs.warning, + validated: 'warning', + }; + // success + return { + validationHelpText: helperTextMsgs.success, + validated: 'success', + }; }; return ( @@ -37,10 +83,8 @@ export const OpenstackEditURLModal: React.FC = (props label={props?.label || t('URL')} model={ProviderModel} variant={ModalVariant.large} - body={t( - 'Specify OpenStack Identity (Keystone) endpoint, for example, http://controller:5000/v3.', - )} - helperText={t('Please enter URL for OpenStack services REST APIs.')} + body={t('URL of the OpenStack Identity (Keystone) endpoint.')} + helperText={helperTextMsgs.default} onConfirmHook={patchProviderURL} validationHook={urlValidationHook} /> diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/create/components/OpenstackProviderCreateForm.tsx b/packages/forklift-console-plugin/src/modules/Providers/views/create/components/OpenstackProviderCreateForm.tsx index df202099f..da9fe8988 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/views/create/components/OpenstackProviderCreateForm.tsx +++ b/packages/forklift-console-plugin/src/modules/Providers/views/create/components/OpenstackProviderCreateForm.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useReducer } from 'react'; +import { Trans } from 'react-i18next'; import { validateURL, Validation } from 'src/modules/Providers/utils'; import { useForkliftTranslation } from 'src/utils/i18n'; @@ -18,9 +19,50 @@ export const OpenstackProviderCreateForm: React.FC + + Error: The format of the provided URL is invalid. Ensure the URL includes a scheme, a + domain name, and a path. For example:{' '} + https://identity_service.com:5000/v3. + + + ), + warning: ( +
+ + Warning: The provided URL does not end with the API endpoint path:{' '} + + {'"'}/v3{'"'} + + . Ensure the URL includes the correct path. For example:{' '} + https://identity_service.com:5000/v3. + +
+ ), + success: ( +
+ + URL of the OpenStack Identity (Keystone) endpoint. For example:{' '} + https://identity_service.com:5000/v3. + +
+ ), + default: ( +
+ + URL of the OpenStack Identity (Keystone) endpoint. For example: {''} + https://identity_service.com:5000/v3{''}. + +
+ ), + }; + const initialState = { validation: { url: 'default' as Validation, + urlHelperText: urlHelperTextMsgs.default, }, }; @@ -43,27 +85,44 @@ export const OpenstackProviderCreateForm: React.FC { - const trimmedValue = value.trim(); + if (id !== 'url') return; + + const trimmedValue: string = value.trim(); + const validationState = getURLValidationState(trimmedValue); - if (id === 'url') { - const validationState = validateURL(trimmedValue) ? 'success' : 'error'; - dispatch({ type: 'SET_FIELD_VALIDATED', payload: { field: id, validationState } }); + dispatch({ + type: 'SET_FIELD_VALIDATED', + payload: { field: 'url', validationState }, + }); - onChange({ ...provider, spec: { ...provider.spec, url: trimmedValue } }); - } + dispatch({ + type: 'SET_FIELD_VALIDATED', + payload: { + field: 'urlHelperText', + validationState: urlHelperTextMsgs[validationState], + }, + }); + + onChange({ ...provider, spec: { ...provider.spec, url: trimmedValue } }); }, [provider], ); + const getURLValidationState = (url: string): Validation => { + if (!validateURL(url)) return 'error'; + if (!url.endsWith('v3') && !url.endsWith('v3/')) return 'warning'; + return 'success'; + }; + return (
= ({ secret, onChange }) => { const { t } = useForkliftTranslation(); + const insecureSkipVerifyHelperTextMsgs = { + error: t('Error: this field must be set to a boolean value.'), + successAndSkipped: t("The provider's CA certificate won't be validated."), + successAndNotSkipped: t("The provider's CA certificate will be validated."), + }; + + const cacertHelperTextMsgs = { + error: t( + 'Error: The format of the provided CA Certificate is invalid. Ensure the CA certificate format is valid.', + ), + success: t( + 'A CA certificate to be trusted when connecting to the OpenStack Identity (Keystone) endpoint. Ensure the CA certificate format is valid. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.', + ), + }; + + const insecureSkipVerifyHelperTextPopover = ( + + Note: If {"'"}Skip certificate validation{"'"} is selected, migrations from this provider will + not be secure.{'

'}Insecure migration means that the transferred data is sent over an + insecure connection and potentially sensitive data could be exposed. +
+ ); + const authType = safeBase64Decode(secret?.data?.authType || ''); const username = safeBase64Decode(secret?.data?.username || ''); const insecureSkipVerify = safeBase64Decode(secret?.data?.insecureSkipVerify || '') === 'true'; @@ -62,6 +95,7 @@ export const OpenstackCredentialsEdit: React.FC = ({ secret, authenticationType: authenticationType, validation: { cacert: 'default' as Validation, + insecureSkipVerify: 'default' as Validation, }, }; @@ -151,7 +185,9 @@ export const OpenstackCredentialsEdit: React.FC = ({ secret, role="radiogroup" fieldId="authType" label={t('Authentication type')} - helperText={t('Type of authentication to use when connecting to OpenStack REST API.')} + helperText={t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + )} > = ({ secret, Skip certificate validation} + bodyContent={
{insecureSkipVerifyHelperTextPopover}
} + alertSeverityVariant="info" + > + + + } fieldId="insecureSkipVerify" validated={state.validation.insecureSkipVerify} helperTextInvalid={t('Error: Insecure Skip Verify must be a boolean value.')} @@ -220,9 +271,9 @@ export const OpenstackCredentialsEdit: React.FC = ({ secret, className="forklift-section-secret-edit-switch" id="insecureSkipVerify" name="insecureSkipVerify" - label={t("The provider's REST API TLS certificate won't be validated.")} - labelOff={t("The provider's REST API TLS certificate will be validated.")} - aria-label={t("If true, the provider's REST API TLS certificate won't be validated.")} + label={insecureSkipVerifyHelperTextMsgs.successAndSkipped} + labelOff={insecureSkipVerifyHelperTextMsgs.successAndNotSkipped} + aria-label={insecureSkipVerifyHelperTextMsgs.successAndSkipped} isChecked={insecureSkipVerify} hasCheckIcon onChange={(value) => handleChange('insecureSkipVerify', value ? 'true' : 'false')} @@ -231,15 +282,13 @@ export const OpenstackCredentialsEdit: React.FC = ({ secret, label={t('Application credential ID')} isRequired fieldId="applicationCredentialID" - helperText={t('OpenStack REST API application credential ID.')} - helperTextInvalid={t('Invalid application credential ID.')} + helperText={t( + 'OpenStack application credential ID needed for the application credential authentication.', + )} + helperTextInvalid={t( + "Error: The format of the provided application credential ID is invalid. Ensure the ID doesn't include whitespace characters.", + )} validated={state.validation.applicationCredentialID} > label={t('Application credential secret')} isRequired fieldId="applicationCredentialSecret" - helperText={t('OpenStack REST API application credential secret.')} - helperTextInvalid={t('Invalid application credential secret.')} + helperText={t( + 'OpenStack application credential Secret needed for the application credential authentication.', + )} + helperTextInvalid={t( + "Error: The format of the provided application credential Secret is invalid. Ensure the secret doesn't include whitespace characters.", + )} validated={state.validation.applicationCredentialSecret} > label={t('Region')} isRequired fieldId="regionName" - helperText={t('OpenStack region.')} - helperTextInvalid={t('Invalid region name.')} + helperText={t('OpenStack region name.')} + helperTextInvalid={t( + "Error: The format of the provided region name is invalid. Ensure the region name doesn't include whitespace characters.", + )} validated={state.validation.regionName} > label={t('Project')} isRequired fieldId="projectName" - helperText={t('OpenStack project.')} - helperTextInvalid={t('Invalid project name.')} + helperText={t('OpenStack project name.')} + helperTextInvalid={t( + "Error: The format of the provided project name is invalid. Ensure the project name doesn't include whitespace characters.", + )} validated={state.validation.projectName} > = ({ label={t('Username')} isRequired fieldId="username" - helperText={t('OpenStack REST API user name.')} - helperTextInvalid={t('Invalid username.')} + helperText={t('A user name for connecting to the OpenStack Identity (Keystone) endpoint.')} + helperTextInvalid={t( + "Error: The format of the provided user name is invalid. Ensure the user name doesn't include whitespace characters.", + )} validated={state.validation.username} > = ({ label={t('Password')} isRequired fieldId="password" - helperText={t('OpenStack REST API password credentials.')} - helperTextInvalid={t('Invalid password.')} + helperText={t( + 'A user password for connecting to the OpenStack Identity (Keystone) endpoint.', + )} + helperTextInvalid={t( + "Error: The format of the provided user password is invalid. Ensure the user password doesn't include whitespace characters.", + )} validated={state.validation.password} > = ({ label={t('Region')} isRequired fieldId="regionName" - helperText={t('OpenStack region.')} - helperTextInvalid={t('Invalid region name.')} + helperText={t('OpenStack region name.')} + helperTextInvalid={t( + "Error: The format of the provided region name is invalid. Ensure the region name doesn't include whitespace characters.", + )} validated={state.validation.regionName} > = ({ label={t('Project')} isRequired fieldId="projectName" - helperText={t('OpenStack project.')} - helperTextInvalid={t('Invalid project name.')} + helperText={t('OpenStack project name.')} + helperTextInvalid={t( + "Error: The format of the provided project name is invalid. Ensure the project name doesn't include whitespace characters.", + )} validated={state.validation.projectName} > = ({ label={t('Domain')} isRequired fieldId="domainName" - helperText={t('OpenStack domain for password credentials.')} - helperTextInvalid={t('Invalid domain name.')} + helperText={t('OpenStack domain name.')} + helperTextInvalid={t( + "Error: The format of the provided domain name is invalid. Ensure the domain name doesn't include whitespace characters.", + )} validated={state.validation.domainName} > label={t('Token')} isRequired fieldId="token" - helperText={t('OpenStack REST API token credentials.')} - helperTextInvalid={t('Invalid token.')} + helperText={t('OpenStack token for authentication using a user ID.')} + helperTextInvalid={t( + "Error: The format of the provided token is invalid. Ensure the token doesn't include whitespace characters.", + )} validated={state.validation.token} > label={t('User ID')} isRequired fieldId="userID" - helperText={t('OpenStack REST API user ID.')} - helperTextInvalid={t('Invalid User ID.')} + helperText={t('A user ID for connecting to the OpenStack Identity (Keystone) endpoint.')} + helperTextInvalid={t( + "Error: The format of the provided user ID is invalid. Ensure the user ID doesn't include whitespace characters.", + )} validated={state.validation.userID} > label={t('Project ID')} isRequired fieldId="projectID" - helperText={t('OpenStack project ID for token credentials.')} - helperTextInvalid={t('Invalid Project ID.')} + helperText={t('OpenStack project ID.')} + helperTextInvalid={t( + "Error: The format of the provided project ID is invalid. Ensure the project ID doesn't include whitespace characters.", + )} validated={state.validation.projectID} > label={t('Region')} isRequired fieldId="regionName" - helperText={t('OpenStack region.')} - helperTextInvalid={t('Invalid region name.')} + helperText={t('OpenStack region name.')} + helperTextInvalid={t( + "Error: The format of the provided region name is invalid. Ensure the region name doesn't include whitespace characters.", + )} validated={state.validation.regionName} > = ({ secret, onC = ({ secret, reveal }) => { const { t } = useForkliftTranslation(); + const usernameHelperTextMsg = t( + 'A user name for connecting to the OpenStack Identity (Keystone) endpoint.', + ); + const passwordHelperTextMsg = t( + 'A user password for connecting to the OpenStack Identity (Keystone) endpoint.', + ); + const regionHelperTextMsg = t('OpenStack region name.'); + const projectNameHelperTextMsg = t('OpenStack project name.'); + const domainHelperTextMsg = t('OpenStack domain name.'); + const tokenWithUserIdHelperTextMsg = t('OpenStack token for authentication using a user ID.'); + const tokenWithUsernameHelperTextMsg = t('OpenStack token for authentication using a user name.'); + const userIdHelperTextMsg = t( + 'A user ID for connecting to the OpenStack Identity (Keystone) endpoint.', + ); + const projectIdHelperTextMsg = t('OpenStack project ID.'); + const applicationCredentialIDHelperTextMsg = t( + 'OpenStack application credential ID needed for the application credential authentication.', + ); + const applicationCredentialNameHelperTextMsg = t( + 'OpenStack application credential name needed for application credential authentication.', + ); + const applicationCredentialSecretHelperTextMsg = t( + 'OpenStack application credential Secret needed for the application credential authentication.', + ); const items = []; const fields = { passwordSecretFields: { authType: { label: t('Authentication type'), - description: t('Type of authentication to use when connecting to OpenStack REST API.'), - }, - username: { label: t('Username'), description: t('OpenStack REST API user name.') }, - password: { - label: t('Password'), - description: t('OpenStack REST API password credentials.'), - }, - regionName: { - label: t('Region'), - description: t('OpenStack region.'), - }, - projectName: { - label: t('Project'), - description: t('OpenStack project.'), - }, - domainName: { - label: t('Domain'), - description: t('OpenStack domain for password credentials.'), + description: t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + ), }, + username: { label: t('Username'), description: usernameHelperTextMsg }, + password: { label: t('Password'), description: passwordHelperTextMsg }, + regionName: { label: t('Region'), description: regionHelperTextMsg }, + projectName: { label: t('Project'), description: projectNameHelperTextMsg }, + domainName: { label: t('Domain'), description: domainHelperTextMsg }, insecureSkipVerify: { label: t('Skip certificate validation'), - description: t("If true, the provider's REST API TLS certificate won't be validated."), + description: t( + "If true (check box is checked), the provider's CA certificate won't be validated.", + ), + helperTextPopover: ( + + Note: If this field is checked/true, the migration from this provider will be insecure. + {'

'} Insecure migration means that the transferred data is sent over an insecure + connection and potentially sensitive data could be exposed. +
+ ), }, cacert: { label: t('CA certificate'), description: t( - 'Custom certification used to verify the OpenStack REST API server, when empty use system certificate.', + 'A CA certificate to be trusted when connecting to the OpenStack Identity (Keystone) endpoint. Ensure the CA certificate format is valid. To use a CA certificate, drag the file to the text box or browse for it. To use the system CA certificates, leave the field empty.', ), }, }, @@ -50,27 +81,26 @@ export const OpenstackCredentialsList: React.FC = ({ secret, tokenWithUserIDSecretFields: { authType: { label: t('Authentication type'), - description: t('Type of authentication to use when connecting to OpenStack REST API.'), - }, - token: { - label: t('Token'), - description: t('OpenStack REST API token credentials.'), - }, - userID: { - label: t('User ID'), - description: t('OpenStack REST API user ID.'), - }, - projectID: { - label: t('Project ID'), - description: t('OpenStack project ID for token credentials.'), - }, - regionName: { - label: t('Region'), - description: t('OpenStack region.'), + description: t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + ), }, + token: { label: t('Token'), description: tokenWithUserIdHelperTextMsg }, + userID: { label: t('User ID'), description: userIdHelperTextMsg }, + projectID: { label: t('Project ID'), description: projectIdHelperTextMsg }, + regionName: { label: t('Region'), description: regionHelperTextMsg }, insecureSkipVerify: { label: t('Skip certificate validation'), - description: t("If true, the provider's REST API TLS certificate won't be validated."), + description: t( + "If true (check box is checked), the provider's CA certificate won't be validated.", + ), + helperTextPopover: ( + + Note: If this field is checked/true, the migration from this provider will be insecure. + {'

'} Insecure migration means that the transferred data is sent over an insecure + connection and potentially sensitive data could be exposed. +
+ ), }, cacert: { label: t('CA certificate'), @@ -83,31 +113,27 @@ export const OpenstackCredentialsList: React.FC = ({ secret, tokenWithUsernameSecretFields: { authType: { label: t('Authentication type'), - description: t('Type of authentication to use when connecting to OpenStack REST API.'), - }, - token: { - label: t('Token'), - description: t('OpenStack REST API token credentials.'), - }, - username: { - label: t('Username'), - description: t('OpenStack REST API user name.'), - }, - regionName: { - label: t('Region'), - description: t('OpenStack region.'), - }, - projectName: { - label: t('Project'), - description: t('OpenStack project for token credentials.'), - }, - domainName: { - label: t('Domain name'), - description: t('OpenStack domain name for token credentials.'), + description: t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + ), }, + token: { label: t('Token'), description: tokenWithUsernameHelperTextMsg }, + username: { label: t('Username'), description: t(usernameHelperTextMsg) }, + regionName: { label: t('Region'), description: regionHelperTextMsg }, + projectName: { label: t('Project'), description: projectNameHelperTextMsg }, + domainName: { label: t('Domain name'), description: domainHelperTextMsg }, insecureSkipVerify: { label: t('Skip certificate validation'), - description: t("If true, the provider's REST API TLS certificate won't be validated."), + description: t( + "If true (check box is checked), the provider's CA certificate won't be validated.", + ), + helperTextPopover: ( + + Note: If this field is checked/true, the migration from this provider will be insecure. + {'

'} Insecure migration means that the transferred data is sent over an insecure + connection and potentially sensitive data could be exposed. +
+ ), }, cacert: { label: t('CA certificate'), @@ -120,27 +146,32 @@ export const OpenstackCredentialsList: React.FC = ({ secret, applicationCredentialIdSecretFields: { authType: { label: t('Authentication type'), - description: t('Type of authentication to use when connecting to OpenStack REST API.'), + description: t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + ), }, applicationCredentialID: { label: t('Application credential ID'), - description: t('OpenStack REST API application credential ID.'), + description: applicationCredentialIDHelperTextMsg, }, applicationCredentialSecret: { label: t('Application credential secret'), - description: t('OpenStack REST API application credential secret.'), - }, - regionName: { - label: t('Region'), - description: t('OpenStack region.'), - }, - projectName: { - label: t('Project'), - description: t('OpenStack project.'), + description: applicationCredentialSecretHelperTextMsg, }, + regionName: { label: t('Region'), description: regionHelperTextMsg }, + projectName: { label: t('Project'), description: projectNameHelperTextMsg }, insecureSkipVerify: { label: t('Skip certificate validation'), - description: t("If true, the provider's REST API TLS certificate won't be validated."), + description: t( + "If true (check box is checked), the provider's CA certificate won't be validated.", + ), + helperTextPopover: ( + + Note: If this field is checked/true, the migration from this provider will be insecure. + {'

'} Insecure migration means that the transferred data is sent over an insecure + connection and potentially sensitive data could be exposed. +
+ ), }, cacert: { label: t('CA certificate'), @@ -153,35 +184,34 @@ export const OpenstackCredentialsList: React.FC = ({ secret, applicationCredentialNameSecretFields: { authType: { label: t('Authentication type'), - description: t('Type of authentication to use when connecting to OpenStack REST API.'), + description: t( + 'Method of authentication to use when connecting to the OpenStack Identity (Keystone) server.', + ), }, applicationCredentialName: { label: t('Application credential name'), - description: t('OpenStack REST API application credential name.'), + description: applicationCredentialNameHelperTextMsg, }, applicationCredentialSecret: { label: t('Application Credential Secret'), - description: t('OpenStack REST API application credential secret.'), - }, - username: { - label: t('Username'), - description: t('OpenStack REST API user name.'), - }, - regionName: { - label: t('Region'), - description: t('OpenStack region.'), - }, - projectName: { - label: t('Project'), - description: t('OpenStack project.'), - }, - domainName: { - label: t('Domain'), - description: t('OpenStack domain for application credential credentials.'), + description: applicationCredentialSecretHelperTextMsg, }, + username: { label: t('Username'), description: t(usernameHelperTextMsg) }, + regionName: { label: t('Region'), description: regionHelperTextMsg }, + projectName: { label: t('Project'), description: projectNameHelperTextMsg }, + domainName: { label: t('Domain'), description: domainHelperTextMsg }, insecureSkipVerify: { label: t('Skip certificate validation'), - description: t("If true, the provider's REST API TLS certificate won't be validated."), + description: t( + "If true (check box is checked), the provider's CA certificate won't be validated.", + ), + helperTextPopover: ( + + Note: If this field is checked/true, the migration from this provider will be insecure. + {'

'} Insecure migration means that the transferred data is sent over an insecure + connection and potentially sensitive data could be exposed. +
+ ), }, cacert: { label: t('CA certificate'), @@ -230,9 +260,16 @@ export const OpenstackCredentialsList: React.FC = ({ secret, items.push( <>
- - {field.label} - + + {field?.helperTextPopover} : null + } + showHelpIconNextToTitle={true} + content={''} + /> + {field.description} diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/details/components/DetailsSection/OpenstackDetailsSection.tsx b/packages/forklift-console-plugin/src/modules/Providers/views/details/components/DetailsSection/OpenstackDetailsSection.tsx index 966a3ca14..82da43a19 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/views/details/components/DetailsSection/OpenstackDetailsSection.tsx +++ b/packages/forklift-console-plugin/src/modules/Providers/views/details/components/DetailsSection/OpenstackDetailsSection.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Trans } from 'react-i18next'; import { useForkliftTranslation } from 'src/utils/i18n'; import { DescriptionList } from '@patternfly/react-core'; @@ -39,9 +40,12 @@ export const OpenstackDetailsSection: React.FC = ({ data }) + URL of the OpenStack Identity (Keystone) endpoint. For example: {''} + https://identity_service.com:5000/v3{''}. + + } />