diff --git a/.vscode/settings.json b/.vscode/settings.json index d2c1daf75..4c7ff4683 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,13 +1,4 @@ { - "files.associations": { - "console-extensions.json": "jsonc" - }, - "json.schemas": [ - { - "fileMatch": ["console-extensions.json"], - "url": "/node_modules/@openshift-console/dynamic-plugin-sdk-webpack/schema/console-extensions.json" - } - ], "search.exclude": { "**/node_modules": true, "**/.yarn": true, diff --git a/README.md b/README.md index bd2d6a42a..ec67d0c72 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ conster Header: React.FC = () => { }; ``` -For labels in `console-extensions.json`, you should use the format +For labels in console extensions files, you should use the format `%plugin__kubevirt-plugin~My Label%`. Console will replace the value with the message for the current language from the `plugin__kubevirt-plugin` namespace. For example: @@ -109,7 +109,7 @@ namespace. For example: Note that you will need to include a comment in `utils/i18n.ts` like the following for [i18next-parser](https://github.com/i18next/i18next-parser) to -add the message from `console-extensions.json` to your message catalog as follows: +add the message from console extensions files to your message catalog as follows: ```ts // t('plugin__kubevirt-plugin~VirtualMachines') diff --git a/console-extensions.json b/console-extensions.json deleted file mode 100644 index 43d0c9936..000000000 --- a/console-extensions.json +++ /dev/null @@ -1,822 +0,0 @@ -[ - { - "properties": { - "handler": { "$codeRef": "kubevirtFlags.enableKubevirtDynamicFlag" } - }, - "type": "console.flag" - }, - { - "properties": { "handler": { "$codeRef": "kubevirtFlags.useEnableKubevirtMenuFlags" } }, - "type": "console.flag/hookProvider" - }, - { - "properties": { - "flag": "KUBEVIRT_CDI", - "model": { - "group": "cdi.kubevirt.io", - "kind": "CDIConfig", - "version": "v1beta1" - } - }, - "type": "console.flag/model" - }, - { - "properties": { - "flag": "CONSOLE_CLI_DOWNLOAD", - "model": { - "group": "console.openshift.io", - "kind": "ConsoleCLIDownload", - "version": "v1" - } - }, - "type": "console.flag/model" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-sec-virtualization", - "data-test-id": "virtualization-nav-item" - }, - "id": "virtualization", - "insertAfter": "workloads", - "name": "%plugin__kubevirt-plugin~Virtualization%" - }, - "type": "console.navigation/section" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualization-catalog", - "data-test-id": "virtualization-catalog-nav-item" - }, - "href": "catalog", - "id": "virtualization-catalog", - "insertBefore": "virtualmachines", - "name": "%plugin__kubevirt-plugin~Catalog%", - "prefixNamespaced": true, - "section": "virtualization" - }, - "type": "console.navigation/href" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualmachines", - "data-test-id": "virtualmachines-nav-item" - }, - "id": "virtualmachines", - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachine", - "version": "v1" - }, - "name": "%plugin__kubevirt-plugin~VirtualMachines%", - "section": "virtualization" - }, - "type": "console.navigation/resource-ns" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-templates", - "data-test-id": "templates-nav-item" - }, - "id": "templates", - "model": { - "group": "template.openshift.io", - "kind": "Template", - "version": "v1" - }, - "name": "%plugin__kubevirt-plugin~Templates%", - "section": "virtualization" - }, - "type": "console.navigation/resource-ns" - }, - { - "properties": { - "component": { - "$codeRef": "VirtualMachinesList" - }, - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachine", - "version": "v1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { "$codeRef": "VirtualMachinesInstancesList" }, - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachineInstance", - "version": "v1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { "$codeRef": "VirtualMachineTemplatesList" }, - "model": { - "group": "template.openshift.io", - "kind": "Template", - "version": "v1" - } - }, - "type": "console.page/resource/list" - }, - { - "flags": { - "required": ["KUBEVIRT_INSTANCETYPES"] - }, - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualmachineclusterinstancetypes", - "data-test-id": "virtualmachineclusterinstancetypes-nav-item" - }, - "id": "virtualmachineclusterinstancetypes", - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterInstancetype", - "version": "v1beta1" - }, - "name": "%plugin__kubevirt-plugin~InstanceTypes%", - "section": "virtualization" - }, - "type": "console.navigation/resource-cluster" - }, - { - "properties": { - "component": { "$codeRef": "InstanceTypePage" }, - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterInstancetype", - "version": "v1beta1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { - "$codeRef": "InstanceTypePage" - }, - "exact": true, - "path": [ - "/k8s/ns/:ns/instancetype.kubevirt.io~v1beta1~VirtualMachineInstancetype", - "/k8s/all-namespaces/instancetype.kubevirt.io~v1beta1~VirtualMachineInstancetype" - ], - "prefixNamespaced": true - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT_PREFERENCES"] - }, - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualmachineclusterpreferences", - "data-test-id": "virtualmachineclusterpreferences-nav-item" - }, - "id": "virtualmachineclusterpreferences", - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterPreference", - "version": "v1beta1" - }, - "name": "%plugin__kubevirt-plugin~Preferences%", - "section": "virtualization" - }, - "type": "console.navigation/resource-cluster" - }, - { - "properties": { - "component": { - "$codeRef": "PreferencePage" - }, - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterPreference", - "version": "v1beta1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { - "$codeRef": "PreferencePage" - }, - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachinePreference", - "version": "v1beta1" - }, - "prefixNamespaced": true - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { - "$codeRef": "Catalog" - }, - "path": ["/k8s/ns/:ns/catalog", "/k8s/all-namespaces/catalog"] - }, - "type": "console.page/route" - }, - { - "properties": { - "component": { "$codeRef": "DataSourcePage" }, - "model": { - "group": "cdi.kubevirt.io", - "kind": "DataSource", - "version": "v1beta1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "component": { "$codeRef": "VirtualMachineNavPage" }, - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachine", - "version": "v1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "component": { "$codeRef": "VirtualMachinesInstancePage" }, - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachineInstance", - "version": "v1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "component": { "$codeRef": "TemplateNavPage" }, - "model": { - "group": "template.openshift.io", - "kind": "Template", - "version": "v1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachine", - "version": "v1" - }, - "provider": { - "$codeRef": "useVirtualMachineActionsProvider" - } - }, - "type": "console.action/resource-provider" - }, - { - "properties": { - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachineInstance", - "version": "v1" - }, - "provider": { - "$codeRef": "useVirtualMachineInstanceActionsProvider" - } - }, - "type": "console.action/resource-provider" - }, - { - "flags": { - "required": ["OPENSHIFT"] - }, - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualization-overview", - "data-test-id": "virtualization-overview-nav-item" - }, - "href": "virtualization-overview", - "id": "overview", - "insertBefore": "virtualization-catalog", - "name": "%plugin__kubevirt-plugin~Overview%", - "prefixNamespaced": true, - "section": "virtualization" - }, - "type": "console.navigation/href" - }, - { - "properties": { - "component": { - "$codeRef": "ClusterOverviewPage" - }, - "path": ["/k8s/ns/:ns/virtualization-overview", "/k8s/all-namespaces/virtualization-overview"] - }, - "type": "console.page/route" - }, - { - "properties": { - "provider": { "$codeRef": "modalProvider.ModalProvider" }, - "useValueHook": { "$codeRef": "modalProvider.useModalValue" } - }, - "type": "console.context-provider" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { "$codeRef": "ConsoleStandAlone" }, - "exact": false, - "path": ["/k8s/ns/:ns/kubevirt.io~v1~VirtualMachine/:name/console/standalone"] - }, - "type": "console.page/route/standalone" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { "$codeRef": "LogsStandAlone" }, - "exact": false, - "path": ["/k8s/ns/:ns/kubevirt.io~v1~VirtualMachine/:name/diagnostics/logs/standalone"] - }, - "type": "console.page/route/standalone" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "kubevirt.io", - "kind": "VirtualMachine", - "version": "v1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultVMYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "template.openshift.io", - "kind": "Template", - "version": "v1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultVMTemplateYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "cdi.kubevirt.io", - "kind": "DataVolume", - "version": "v1beta1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultBootableVolumeYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "migrations.kubevirt.io", - "kind": "MigrationPolicy", - "version": "v1alpha1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultMigrationPolicyYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterInstancetype", - "version": "v1beta1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultVirtualMachineClusterInstancetypeYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineInstancetype", - "version": "v1beta1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultVirtualMachineInstancetypeYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "model": { - "group": "instancetype.kubevirt.io", - "kind": "VirtualMachineClusterPreference", - "version": "v1beta1" - }, - "name": "default", - "template": { - "$codeRef": "yamlTemplates.defaultVirtualMachineClusterPreferenceYamlTemplate" - } - }, - "type": "console.yaml-template" - }, - { - "properties": { - "id": "VirtualizationSeparator", - "insertAfter": "virtualmachineclusterpreferences", - "insertBefore": "virtualization-bootablevolumes", - "perspective": "admin", - "section": "virtualization", - "testID": "VirtualizationSeparator" - }, - "type": "console.navigation/separator" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-bootablevolumes", - "data-test-id": "-bootablevolumes-nav-item" - }, - "href": "bootablevolumes", - "id": "virtualization-bootablevolumes", - "name": "%plugin__kubevirt-plugin~Bootable volumes%", - "prefixNamespaced": true, - "section": "virtualization" - }, - "type": "console.navigation/href" - }, - { - "properties": { - "component": { - "$codeRef": "BootableVolumesList" - }, - "path": ["/k8s/ns/:ns/bootablevolumes", "/k8s/all-namespaces/bootablevolumes"] - }, - "type": "console.page/route" - }, - { - "properties": { - "component": { "$codeRef": "DataSourcesList" }, - "model": { - "group": "cdi.kubevirt.io", - "kind": "DataSource", - "version": "v1beta1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { "$codeRef": "DataImportCronPage" }, - "model": { - "group": "cdi.kubevirt.io", - "kind": "DataImportCron", - "version": "v1beta1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-migrationpolicies", - "data-test-id": "migrationpolicies-nav-item" - }, - "id": "migrationpolicies", - "model": { - "group": "migrations.kubevirt.io", - "kind": "MigrationPolicy", - "version": "v1alpha1" - }, - "name": "%plugin__kubevirt-plugin~MigrationPolicies%", - "section": "virtualization" - }, - "type": "console.navigation/resource-cluster" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "dataAttributes": { - "data-quickstart-id": "qs-nav-virtualization-checkups", - "data-test-id": "virtualization-checkups-nav-item" - }, - "href": "checkups", - "id": "virtualization-checkups", - "insertAfter": "migrationpolicies", - "name": "%plugin__kubevirt-plugin~Checkups%", - "prefixNamespaced": true, - "section": "virtualization" - }, - "type": "console.navigation/href" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { - "$codeRef": "CheckupsNetworkForm" - }, - "path": ["/k8s/ns/:ns/checkups/network/form"] - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { - "$codeRef": "CheckupsNetworkDetailsPage" - }, - "path": ["/k8s/ns/:ns/checkups/network/:vmName"] - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { - "$codeRef": "CheckupsStorageForm" - }, - "path": ["/k8s/ns/:ns/checkups/storage/form"] - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { - "$codeRef": "CheckupsStorageDetailsPage" - }, - "path": ["/k8s/ns/:ns/checkups/storage/:vmName"] - }, - "type": "console.page/route" - }, - { - "properties": { - "component": { - "$codeRef": "Checkups" - }, - "path": ["/k8s/ns/:ns/checkups", "/k8s/all-namespaces/checkups"] - }, - "type": "console.page/route" - }, - { - "properties": { - "component": { "$codeRef": "MigrationPoliciesList" }, - "model": { - "group": "migrations.kubevirt.io", - "kind": "MigrationPolicy", - "version": "v1alpha1" - } - }, - "type": "console.page/resource/list" - }, - { - "properties": { - "component": { "$codeRef": "MigrationPolicyPage" }, - "model": { - "group": "migrations.kubevirt.io", - "kind": "MigrationPolicy", - "version": "v1alpha1" - } - }, - "type": "console.page/resource/details" - }, - { - "properties": { - "description": "%plugin__kubevirt-plugin~Create a Virtual Machine from a template%", - "groupId": "developer-catalog", - "href": "/k8s/ns/:namespace/catalog/template", - "icon": { "$codeRef": "icons.vmIconElement" }, - "id": "dev-catalog-virtualization", - "label": "%plugin__kubevirt-plugin~Virtual Machines%" - }, - "type": "dev-console.add/action" - }, - { - "properties": { - "healthHandler": { - "$codeRef": "dashboardExtensions.getKubevirtHealthState" - }, - "name": "%plugin__kubevirt-plugin~OpenShift Virtualization%", - "popupComponent": { "$codeRef": "dashboardStatus.default" }, - "popupTitle": "%plugin__kubevirt-plugin~OpenShift Virtualization%", - "queries": ["kubevirt_hyperconverged_operator_health_status"], - "title": "%plugin__kubevirt-plugin~OpenShift Virtualization%" - }, - "type": "console.dashboards/overview/health/prometheus" - }, - { - "properties": { - "href": "hardwaredevices", - "id": "hardwaredevices", - "insertBefore": "baremetalhosts", - "name": "%plugin__kubevirt-plugin~Hardware Devices%", - "section": "compute" - }, - "type": "console.navigation/href" - }, - { - "properties": { - "component": { - "$codeRef": "HardwareDevicesPage" - }, - "path": ["/hardwaredevices"] - }, - "type": "console.page/route" - }, - { - "properties": { - "component": { - "$codeRef": "MigrationPolicyCreateForm" - }, - "path": "/k8s/cluster/migrations.kubevirt.io~v1alpha1~MigrationPolicy/form" - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { - "$codeRef": "UploadPVC" - }, - "exact": true, - "path": ["/k8s/ns/:ns/persistentvolumeclaims/~new/data"] - }, - "type": "console.page/route" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "label": "%plugin__kubevirt-plugin~With Data upload form%", - "path": "~new/data" - }, - "type": "console.pvc/create-prop" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "alert": { "$codeRef": "pvcAlert" } - }, - "type": "console.pvc/alert" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "predicate": { "$codeRef": "pvcSelectors.isPvcUploading" }, - "priority": 10, - "status": { "$codeRef": "pvcUploadStatus" } - }, - "type": "console.pvc/status" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "predicate": { "$codeRef": "pvcSelectors.isPvcCloning" }, - "priority": 9, - "status": { "$codeRef": "pvcCloneStatus" } - }, - "type": "console.pvc/status" - }, - { - "properties": { - "alert": { "$codeRef": "pvcDelete" }, - "onPVCKill": { "$codeRef": "pvcUploadUtils.killCDIBoundPVC" }, - "predicate": { "$codeRef": "pvcSelectors.isPvcBoundToCDI" } - }, - "type": "console.pvc/delete" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "provider": { "$codeRef": "contextProvider.CDIUploadProvider" }, - "useValueHook": { "$codeRef": "useCDIUpload" } - }, - "type": "console.context-provider" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "mapper": { "$codeRef": "dashboardInventory.getVMStatusGroups" }, - "model": { "$codeRef": "dashboardActivityUtils.VirtualMachineModel" } - }, - "type": "console.dashboards/overview/inventory/item" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "mapper": { "$codeRef": "dashboardInventory.getVMStatusGroups" }, - "model": { "$codeRef": "dashboardActivityUtils.VirtualMachineModel" } - }, - "type": "console.dashboards/project/overview/item" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "icon": { "$codeRef": "dashboardInventory.VMOffGroupIcon" }, - "id": "vm-stopped" - }, - "type": "console.dashboards/overview/inventory/item/group" - }, - { - "flags": { - "required": ["KUBEVIRT"] - }, - "properties": { - "component": { "$codeRef": "dashboardActivity.DiskImportActivity" }, - "getTimestamp": { "$codeRef": "dashboardActivityUtils.getTimestamp" }, - "isActivity": { "$codeRef": "dashboardActivityUtils.isDVActivity" }, - "k8sResource": { - "$codeRef": "dashboardActivityUtils.k8sDVResource" - } - }, - "type": "console.dashboards/overview/activity/resource" - }, - { - "properties": { - "listener": { - "$codeRef": "telemetry.eventMonitor" - } - }, - "type": "console.telemetry/listener" - } -] diff --git a/i18next-parser.config.js b/i18next-parser.config.js index 63714d39f..5b17b6908 100644 --- a/i18next-parser.config.js +++ b/i18next-parser.config.js @@ -4,7 +4,7 @@ const { CustomJSONLexer } = require('./i18n-scripts/lexers'); module.exports = { createOldCatalogs: false, defaultNamespace: 'plugin__kubevirt-plugin', - input: ['src/**/*.{js,jsx,ts,tsx,json}', './console-extensions.json'], + input: ['src/**/*.{js,jsx,ts,tsx,json}'], keySeparator: false, // see below for more details lexers: { diff --git a/locales/en/plugin__kubevirt-plugin.json b/locales/en/plugin__kubevirt-plugin.json index 284fddb4f..68b42168b 100644 --- a/locales/en/plugin__kubevirt-plugin.json +++ b/locales/en/plugin__kubevirt-plugin.json @@ -876,7 +876,6 @@ "OpenShift Data Foundation": "OpenShift Data Foundation", "OpenShift Data Foundation (ODF)": "OpenShift Data Foundation (ODF)", "OpenShift Data Foundation (recommended for full functionality) or another persistent storage service is required for OpenShift Virtualization": "OpenShift Data Foundation (recommended for full functionality) or another persistent storage service is required for OpenShift Virtualization", - "OpenShift Virtualization": "OpenShift Virtualization", "OpenShift Virtualization 4.16 Highlights": "OpenShift Virtualization 4.16 Highlights", "Operating system": "Operating system", "Operating System": "Operating System", @@ -928,7 +927,6 @@ "Post-copy": "Post-copy", "Preference": "Preference", "preferences": "preferences", - "Preferences": "Preferences", "Preffered": "Preffered", "Preview features": "Preview features", "Preview features are for testing purposes and should not be used in production environments.": "Preview features are for testing purposes and should not be used in production environments.", @@ -1434,7 +1432,6 @@ "Will make disk persistent on next reboot": "Will make disk persistent on next reboot", "Windows": "Windows", "Windows only": "Windows only", - "With Data upload form": "With Data upload form", "With form": "With form", "With grace period": "With grace period", "With YAML": "With YAML", diff --git a/package.json b/package.json index c600be1a5..d5640896c 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@kubevirt-ui/kubevirt-api": "^1.3.2", "@openshift-console/dynamic-plugin-sdk": "1.4.0", "@openshift-console/dynamic-plugin-sdk-internal": "1.0.0", - "@openshift-console/dynamic-plugin-sdk-webpack": "1.1.1", + "@openshift-console/dynamic-plugin-sdk-webpack": "^1.2.0", "@openshift-console/plugin-shared": "^0.0.1", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", diff --git a/plugin-extensions.ts b/plugin-extensions.ts new file mode 100644 index 000000000..b736bcee7 --- /dev/null +++ b/plugin-extensions.ts @@ -0,0 +1,531 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; + +import { extensions as VirtualizationPerspectiveExtensions } from './src/perspective/extensions'; +import { extensions as utilsExtensions } from './src/utils/extension'; +import { extensions as CDIUploadProviderExtensions } from './src/views/cdi-upload-provider/extensions'; +import { extensions as CheckupsExtensions } from './src/views/checkups/extensions'; +import { extensions as dashboardExtensionsExtensions } from './src/views/dashboard-extensions/extensions'; +import { extensions as VirtualMachinesExtensions } from './src/views/virtualmachines/extensions'; + +const extensions: EncodedExtension[] = [ + ...VirtualizationPerspectiveExtensions, + ...CheckupsExtensions, + ...dashboardExtensionsExtensions, + ...utilsExtensions, + ...VirtualMachinesExtensions, + ...CDIUploadProviderExtensions, + { + properties: { + flag: 'KUBEVIRT_CDI', + model: { + group: 'cdi.kubevirt.io', + kind: 'CDIConfig', + version: 'v1beta1', + }, + }, + type: 'console.flag/model', + }, + { + properties: { + flag: 'CONSOLE_CLI_DOWNLOAD', + model: { + group: 'console.openshift.io', + kind: 'ConsoleCLIDownload', + version: 'v1', + }, + }, + type: 'console.flag/model', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-sec-virtualization', + 'data-test-id': 'virtualization-nav-item', + }, + id: 'virtualization', + insertAfter: 'workloads', + name: '%plugin__kubevirt-plugin~Virtualization%', + }, + type: 'console.navigation/section', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-catalog', + 'data-test-id': 'virtualization-catalog-nav-item', + }, + href: 'catalog', + id: 'virtualization-catalog', + insertBefore: 'virtualmachines', + name: '%plugin__kubevirt-plugin~Catalog%', + prefixNamespaced: true, + section: 'virtualization', + }, + type: 'console.navigation/href', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachines', + 'data-test-id': 'virtualmachines-nav-item', + }, + id: 'virtualmachines', + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + name: '%plugin__kubevirt-plugin~VirtualMachines%', + section: 'virtualization', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-templates', + 'data-test-id': 'templates-nav-item', + }, + id: 'templates', + model: { + group: 'template.openshift.io', + kind: 'Template', + version: 'v1', + }, + name: '%plugin__kubevirt-plugin~Templates%', + section: 'virtualization', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + component: { $codeRef: 'VirtualMachinesInstancesList' }, + model: { + group: 'kubevirt.io', + kind: 'VirtualMachineInstance', + version: 'v1', + }, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { $codeRef: 'VirtualMachineTemplatesList' }, + model: { + group: 'template.openshift.io', + kind: 'Template', + version: 'v1', + }, + }, + type: 'console.page/resource/list', + }, + { + flags: { + required: ['KUBEVIRT_INSTANCETYPES'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachineclusterinstancetypes', + 'data-test-id': 'virtualmachineclusterinstancetypes-nav-item', + }, + id: 'virtualmachineclusterinstancetypes', + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterInstancetype', + version: 'v1beta1', + }, + name: '%plugin__kubevirt-plugin~InstanceTypes%', + section: 'virtualization', + }, + type: 'console.navigation/resource-cluster', + }, + { + properties: { + component: { $codeRef: 'InstanceTypePage' }, + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterInstancetype', + version: 'v1beta1', + }, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { + $codeRef: 'InstanceTypePage', + }, + exact: true, + path: [ + '/k8s/ns/:ns/instancetype.kubevirt.io~v1beta1~VirtualMachineInstancetype', + '/k8s/all-namespaces/instancetype.kubevirt.io~v1beta1~VirtualMachineInstancetype', + ], + prefixNamespaced: true, + }, + type: 'console.page/route', + }, + { + flags: { + required: ['KUBEVIRT_PREFERENCES'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachineclusterpreferences', + 'data-test-id': 'virtualmachineclusterpreferences-nav-item', + }, + id: 'virtualmachineclusterpreferences', + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterPreference', + version: 'v1beta1', + }, + name: '%plugin__kubevirt-plugin~Preferences%', + section: 'virtualization', + }, + type: 'console.navigation/resource-cluster', + }, + { + properties: { + component: { + $codeRef: 'PreferencePage', + }, + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterPreference', + version: 'v1beta1', + }, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { + $codeRef: 'PreferencePage', + }, + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachinePreference', + version: 'v1beta1', + }, + prefixNamespaced: true, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { + $codeRef: 'Catalog', + }, + path: ['/k8s/ns/:ns/catalog', '/k8s/all-namespaces/catalog'], + }, + type: 'console.page/route', + }, + { + properties: { + component: { $codeRef: 'DataSourcePage' }, + model: { + group: 'cdi.kubevirt.io', + kind: 'DataSource', + version: 'v1beta1', + }, + }, + type: 'console.page/resource/details', + }, + { + properties: { + component: { $codeRef: 'VirtualMachinesInstancePage' }, + model: { + group: 'kubevirt.io', + kind: 'VirtualMachineInstance', + version: 'v1', + }, + }, + type: 'console.page/resource/details', + }, + { + properties: { + component: { $codeRef: 'TemplateNavPage' }, + model: { + group: 'template.openshift.io', + kind: 'Template', + version: 'v1', + }, + }, + type: 'console.page/resource/details', + }, + { + properties: { + model: { + group: 'kubevirt.io', + kind: 'VirtualMachineInstance', + version: 'v1', + }, + provider: { + $codeRef: 'useVirtualMachineInstanceActionsProvider', + }, + }, + type: 'console.action/resource-provider', + }, + { + flags: { + required: ['OPENSHIFT'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-overview', + 'data-test-id': 'virtualization-overview-nav-item', + }, + href: 'virtualization-overview', + id: 'overview', + insertBefore: 'virtualization-catalog', + name: '%plugin__kubevirt-plugin~Overview%', + prefixNamespaced: true, + section: 'virtualization', + }, + type: 'console.navigation/href', + }, + { + properties: { + component: { + $codeRef: 'ClusterOverviewPage', + }, + path: ['/k8s/ns/:ns/virtualization-overview', '/k8s/all-namespaces/virtualization-overview'], + }, + type: 'console.page/route', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultVMYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'template.openshift.io', + kind: 'Template', + version: 'v1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultVMTemplateYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'cdi.kubevirt.io', + kind: 'DataVolume', + version: 'v1beta1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultBootableVolumeYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'migrations.kubevirt.io', + kind: 'MigrationPolicy', + version: 'v1alpha1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultMigrationPolicyYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterInstancetype', + version: 'v1beta1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultVirtualMachineClusterInstancetypeYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineInstancetype', + version: 'v1beta1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultVirtualMachineInstancetypeYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterPreference', + version: 'v1beta1', + }, + name: 'default', + template: { + $codeRef: 'yamlTemplates.defaultVirtualMachineClusterPreferenceYamlTemplate', + }, + }, + type: 'console.yaml-template', + }, + { + properties: { + id: 'VirtualizationSeparator', + insertAfter: 'virtualmachineclusterpreferences', + insertBefore: 'virtualization-bootablevolumes', + perspective: 'admin', + section: 'virtualization', + testID: 'VirtualizationSeparator', + }, + type: 'console.navigation/separator', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-bootablevolumes', + 'data-test-id': '-bootablevolumes-nav-item', + }, + href: 'bootablevolumes', + id: 'virtualization-bootablevolumes', + name: '%plugin__kubevirt-plugin~Bootable volumes%', + prefixNamespaced: true, + section: 'virtualization', + }, + type: 'console.navigation/href', + }, + { + properties: { + component: { + $codeRef: 'BootableVolumesList', + }, + path: ['/k8s/ns/:ns/bootablevolumes', '/k8s/all-namespaces/bootablevolumes'], + }, + type: 'console.page/route', + }, + { + properties: { + component: { $codeRef: 'DataSourcesList' }, + model: { + group: 'cdi.kubevirt.io', + kind: 'DataSource', + version: 'v1beta1', + }, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { $codeRef: 'DataImportCronPage' }, + model: { + group: 'cdi.kubevirt.io', + kind: 'DataImportCron', + version: 'v1beta1', + }, + }, + type: 'console.page/resource/details', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-migrationpolicies', + 'data-test-id': 'migrationpolicies-nav-item', + }, + id: 'migrationpolicies', + model: { + group: 'migrations.kubevirt.io', + kind: 'MigrationPolicy', + version: 'v1alpha1', + }, + name: '%plugin__kubevirt-plugin~MigrationPolicies%', + section: 'virtualization', + }, + type: 'console.navigation/resource-cluster', + }, + { + properties: { + component: { $codeRef: 'MigrationPoliciesList' }, + model: { + group: 'migrations.kubevirt.io', + kind: 'MigrationPolicy', + version: 'v1alpha1', + }, + }, + type: 'console.page/resource/list', + }, + { + properties: { + component: { $codeRef: 'MigrationPolicyPage' }, + model: { + group: 'migrations.kubevirt.io', + kind: 'MigrationPolicy', + version: 'v1alpha1', + }, + }, + type: 'console.page/resource/details', + }, + { + properties: { + href: 'hardwaredevices', + id: 'hardwaredevices', + insertBefore: 'baremetalhosts', + name: '%plugin__kubevirt-plugin~Hardware Devices%', + section: 'compute', + }, + type: 'console.navigation/href', + }, + { + properties: { + component: { + $codeRef: 'MigrationPolicyCreateForm', + }, + path: '/k8s/cluster/migrations.kubevirt.io~v1alpha1~MigrationPolicy/form', + }, + type: 'console.page/route', + }, +]; + +export default extensions; diff --git a/plugin-metadata.ts b/plugin-metadata.ts index 5a0c5c50e..be9f9b26b 100644 --- a/plugin-metadata.ts +++ b/plugin-metadata.ts @@ -1,61 +1,43 @@ import { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; +import { exposedModules as VirtualizationPerspectiveExposedModules } from './src/perspective/extensions'; +import { exposedModules as utilsExposedModules } from './src/utils/extension'; +import { exposedModules as CDIUploadProviderExposedModules } from './src/views/cdi-upload-provider/extensions'; +import { exposedModules as CheckupsExposedModules } from './src/views/checkups/extensions'; +import { exposedModules as dashboardExtensionsExposedModules } from './src/views/dashboard-extensions/extensions'; +import { exposedModules as VirtualMachinesExposedModules } from './src/views/virtualmachines/extensions'; + const metadata: ConsolePluginBuildMetadata = { dependencies: { '@console/pluginAPI': '*', }, displayName: 'Kubevirt Plugin', exposedModules: { + ...CheckupsExposedModules, + ...VirtualizationPerspectiveExposedModules, + ...dashboardExtensionsExposedModules, + ...utilsExposedModules, + ...VirtualMachinesExposedModules, + ...CDIUploadProviderExposedModules, BootableVolumesList: './views/bootablevolumes/list/BootableVolumesList.tsx', Catalog: './views/catalog/Catalog.tsx', - Checkups: './views/checkups/Checkups.tsx', - CheckupsNetworkDetailsPage: './views/checkups/network/details/CheckupsNetworkDetailsPage.tsx', - CheckupsNetworkForm: './views/checkups/network/components/form/CheckupsNetworkForm.tsx', - CheckupsStorageDetailsPage: './views/checkups/storage/details/CheckupsStorageDetailsPage.tsx', - CheckupsStorageForm: './views/checkups/storage/components/form/CheckupsStorageForm.tsx', ClusterOverviewPage: './views/clusteroverview/ClusterOverviewPage.tsx', - ConsoleStandAlone: './utils/components/Consoles/ConsoleStandAlone.tsx', - contextProvider: 'src/views/cdi-upload-provider/utils/context.tsx', - dashboardActivity: 'src/views/dashboard-extensions/Activity.tsx', - dashboardActivityUtils: 'src/views/dashboard-extensions/utils.ts', - dashboardExtensions: './utils/extensions/dashboard/index.ts', - dashboardInventory: 'src/views/dashboard-extensions/Inventory.tsx', - dashboardStatus: 'src/views/dashboard-extensions/KubevirtHealthPopup/KubevirtHealthPopup.tsx', DataImportCronPage: './views/datasources/dataimportcron/details/DataImportCronPage.tsx', DataSourcePage: './views/datasources/details/DataSourcePage.tsx', DataSourcesList: './views/datasources/list/DataSourcesList.tsx', - HardwareDevicesPage: './utils/components/HardwareDevices/HardwareDevicesPage.tsx', - icons: './utils/icons.tsx', InstanceTypePage: './views/instancetypes/list/InstanceTypePage.tsx', - kubevirtFlags: './utils/flags', - LogsStandAlone: - './views/virtualmachines/details/tabs/diagnostic/VirtualMachineLogViewer/VirtualMachineLogViewerStandAlone/VirtualMachineLogViewerStandAlone.tsx', MigrationPoliciesList: './views/migrationpolicies/list/MigrationPoliciesList.tsx', MigrationPolicyCreateForm: './views/migrationpolicies/list/components/MigrationPolicyCreateForm/MigrationPolicyCreateForm.tsx', MigrationPolicyPage: './views/migrationpolicies/details/MigrationPolicyDetailsNav.tsx', - modalProvider: './utils/components/ModalProvider/ModalProvider.tsx', PreferencePage: './views/preferences/list/PreferencePage.tsx', - pvcAlert: 'src/views/cdi-upload-provider/PVCAlertExtension.tsx', - pvcCloneStatus: 'src/views/cdi-upload-provider/upload-pvc-form/statuses/ClonePVCStatus.tsx', - pvcDelete: 'src/views/cdi-upload-provider/PVCDeleteAlertExtension.tsx', - pvcSelectors: 'src/views/cdi-upload-provider/utils/selectors.ts', - pvcUploadStatus: 'src/views/cdi-upload-provider/popover/UploadPVCPopover.tsx', - pvcUploadUtils: 'src/views/cdi-upload-provider/utils/utils.tsx', - telemetry: 'src/utils/extensions/telemetry/telemetry.ts', TemplateNavPage: './views/templates/details/TemplateNavPage.tsx', - UploadPVC: 'src/views/cdi-upload-provider/upload-pvc-form/UploadPVC.tsx', - useCDIUpload: 'src/views/cdi-upload-provider/hooks/useCDIUpload.tsx', - useVirtualMachineActionsProvider: - './views/virtualmachines/actions/hooks/useVirtualMachineActionsProvider.ts', useVirtualMachineInstanceActionsProvider: './views/virtualmachinesinstance/actions/hooks/useVirtualMachineInstanceActionsProvider.tsx', - VirtualMachineNavPage: './views/virtualmachines/details/VirtualMachineNavPage.tsx', VirtualMachinesInstancePage: './views/virtualmachinesinstance/details/VirtualMachinesInstancePage.tsx', VirtualMachinesInstancesList: './views/virtualmachinesinstance/list/VirtualMachinesInstancesList.tsx', - VirtualMachinesList: './views/virtualmachines/list/VirtualMachinesList.tsx', VirtualMachineTemplatesList: './views/templates/list/VirtualMachineTemplatesList.tsx', yamlTemplates: 'src/templates/index.ts', }, diff --git a/src/perspective/extensions.ts b/src/perspective/extensions.ts new file mode 100644 index 000000000..0b0aa58c2 --- /dev/null +++ b/src/perspective/extensions.ts @@ -0,0 +1,632 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { + HrefNavItem, + NavSection, + ResourceClusterNavItem, + Separator, +} from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + perspective: './perspective/perspective.ts', +}; + +const virtualizationSection = [ + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-sec-virtualization', + 'data-test-id': 'virtualization-nav-item', + }, + id: 'virtualization-virt-perspective', + name: '%plugin__kubevirt-plugin~Virtualization%', + perspective: 'virtualization-perspective', + }, + type: 'console.navigation/section', + } as EncodedExtension, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-catalog', + 'data-test-id': 'virtualization-catalog-nav-item', + }, + href: 'catalog', + id: 'virtualization-catalog-virt-perspective', + insertBefore: 'virtualmachines', + name: '%plugin__kubevirt-plugin~Catalog%', + perspective: 'virtualization-perspective', + prefixNamespaced: true, + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachines', + 'data-test-id': 'virtualmachines-nav-item', + }, + id: 'virtualmachines-virt-perspective', + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + name: '%plugin__kubevirt-plugin~VirtualMachines%', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-templates', + 'data-test-id': 'templates-nav-item', + }, + id: 'templates-virt-perspective', + model: { + group: 'template.openshift.io', + kind: 'Template', + version: 'v1', + }, + name: '%plugin__kubevirt-plugin~Templates%', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + flags: { + required: ['KUBEVIRT_INSTANCETYPES'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachineclusterinstancetypes', + 'data-test-id': 'virtualmachineclusterinstancetypes-nav-item', + }, + id: 'virtualmachineclusterinstancetypes-virt-perspective', + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterInstancetype', + version: 'v1alpha2', + }, + name: '%plugin__kubevirt-plugin~InstanceTypes%', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT_PREFERENCES'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualmachineclusterpreferences', + 'data-test-id': 'virtualmachineclusterpreferences-nav-item', + }, + id: 'virtualmachineclusterpreferences-virt-perspective', + model: { + group: 'instancetype.kubevirt.io', + kind: 'VirtualMachineClusterPreference', + version: 'v1alpha2', + }, + name: '%plugin__kubevirt-plugin~Preferences%', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + flags: { + required: ['OPENSHIFT'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-overview', + 'data-test-id': 'virtualization-overview-nav-item', + }, + href: 'virtualization-overview', + id: 'overview-virt-perspective', + insertBefore: 'virtualization-catalog-virt-perspective', + name: '%plugin__kubevirt-plugin~Overview%', + perspective: 'virtualization-perspective', + prefixNamespaced: true, + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + properties: { + id: 'VirtualizationSeparator-virt-perspective', + insertAfter: 'virtualmachineclusterpreferences-virt-perspective', + insertBefore: 'virtualization-bootablevolumes-virt-perspective', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + testID: 'VirtualizationSeparator', + }, + type: 'console.navigation/separator', + }, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-bootablevolumes', + 'data-test-id': '-bootablevolumes-nav-item', + }, + href: 'bootablevolumes', + id: 'virtualization-bootablevolumes-virt-perspective', + name: '%plugin__kubevirt-plugin~Bootable volumes%', + perspective: 'virtualization-perspective', + prefixNamespaced: true, + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-migrationpolicies', + 'data-test-id': 'migrationpolicies-nav-item', + }, + id: 'migrationpolicies-virt-perspective', + model: { + group: 'migrations.kubevirt.io', + kind: 'MigrationPolicy', + version: 'v1alpha1', + }, + name: '%plugin__kubevirt-plugin~MigrationPolicies%', + perspective: 'virtualization-perspective', + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-checkups', + 'data-test-id': 'virtualization-checkups-nav-item', + }, + href: 'checkups', + id: 'virtualization-checkups-virt-perspective', + insertAfter: 'migrationpolicies-virt-perspective', + name: '%plugin__kubevirt-plugin~Checkups%', + perspective: 'virtualization-perspective', + prefixNamespaced: true, + section: 'virtualization-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, +]; + +const networkingSection = [ + { + properties: { + dataAttributes: { 'data-quickstart-id': 'qs-nav-networking' }, + id: 'networking-virt-perspective', + insertAfter: 'virtualization-virt-perspective', + name: '%console-app~Networking%', + perspective: 'virtualization-perspective', + }, + type: 'console.navigation/section', + } as EncodedExtension, + { + properties: { + id: 'services-virt-perspective', + model: { + kind: 'Service', + version: 'v1', + }, + name: '%console-app~Services%', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + flags: { required: ['OPENSHIFT'] }, + properties: { + id: 'routes-virt-perspective', + insertAfter: 'services-virt-perspective', + model: { + group: 'route.openshift.io', + kind: 'Route', + version: 'v1', + }, + name: '%console-app~Routes%', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + id: 'ingresses-virt-perspective', + insertAfter: 'routes-virt-perspective', + model: { + group: 'networking.k8s.io', + kind: 'Ingress', + version: 'v1', + }, + name: '%console-app~Ingresses%', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + id: 'networkpolicies-virt-perspective', + insertAfter: 'ingresses-virt-perspective', + model: { + group: 'networking.k8s.io', + kind: 'NetworkPolicy', + version: 'v1', + }, + name: '%console-app~NetworkPolicies%', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + flags: { required: ['MULTI_NETWORK_POLICY_ENABLED'] }, + properties: { + id: 'multinetworkpolicies-virt-perspective', + insertAfter: 'networkpolicies-virt-perspective', + model: { + group: 'k8s.cni.cncf.io', + kind: 'MultiNetworkPolicy', + version: 'v1beta1', + }, + name: '%console-app~MultiNetworkPolicies%', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + flags: { + required: ['NET_ATTACH_DEF', 'KUBEVIRT_DYNAMIC'], + }, + properties: { + id: 'networkattachmentdefinitions', + model: { + group: 'k8s.cni.cncf.io', + kind: 'NetworkAttachmentDefinition', + version: 'v1', + }, + name: 'NetworkAttachmentDefinitions', + perspective: 'virtualization-perspective', + section: 'networking-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, +]; + +const storageSection = [ + { + properties: { + dataAttributes: { 'data-quickstart-id': 'qs-nav-storage' }, + id: 'storage-virt-perspective', + name: '%console-app~Storage%', + perspective: 'virtualization-perspective', + }, + type: 'console.navigation/section', + } as EncodedExtension, + { + flags: { + required: ['CAN_LIST_VSC'], + }, + properties: { + id: 'volumesnapshotcontents-virt-perspective', + insertAfter: 'volumesnapshotclasses-virt-perspective', + model: { + group: 'snapshot.storage.k8s.io', + kind: 'VolumeSnapshotContent', + version: 'v1', + }, + name: '%console-app~VolumeSnapshotContents%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + + { + flags: { required: ['CAN_LIST_PV'] }, + properties: { + id: 'persistentvolumes-virt-perspective', + model: { + kind: 'PersistentVolume', + version: 'v1', + }, + name: '%console-app~PersistentVolumes%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + properties: { + id: 'persistentvolumeclaims-virt-perspective', + insertAfter: 'persistentvolumes-virt-perspective', + model: { + kind: 'PersistentVolumeClaim', + version: 'v1', + }, + name: '%console-app~PersistentVolumeClaims%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + id: 'storageclasses-virt-perspective', + insertAfter: 'persistentvolumeclaims-virt-perspective', + model: { + group: 'storage.k8s.io', + kind: 'StorageClass', + version: 'v1', + }, + name: '%console-app~StorageClasses%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + properties: { + id: 'volumesnapshots-virt-perspective', + insertAfter: 'storageclasses-virt-perspective', + model: { + group: 'snapshot.storage.k8s.io', + kind: 'VolumeSnapshot', + version: 'v1', + }, + name: '%console-app~VolumeSnapshots%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-ns', + }, + { + properties: { + id: 'volumesnapshotclasses-virt-perspective', + insertAfter: 'volumesnapshots-virt-perspective', + model: { + group: 'snapshot.storage.k8s.io', + kind: 'VolumeSnapshotClass', + version: 'v1', + }, + name: '%console-app~VolumeSnapshotClasses%', + perspective: 'virtualization-perspective', + section: 'storage-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, +]; + +const monitoringSection = [ + { + flags: { + required: ['PROMETHEUS', 'MONITORING', 'CAN_GET_NS'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-monitoring', + }, + id: 'observe-virt-perspective', + insertBefore: ['compute-virt-perspective', 'usermanagement-virt-perspective'], + name: '%console-app~Observe%', + perspective: 'virtualization-perspective', + }, + type: 'console.navigation/section', + } as EncodedExtension, + { + flags: { + required: ['PROMETHEUS', 'MONITORING', 'CAN_GET_NS'], + }, + properties: { + href: '/monitoring/alerts', + id: 'alerting-virt-perspective', + name: '%public~Alerting%', + perspective: 'virtualization-perspective', + section: 'observe-virt-perspective', + startsWith: ['monitoring/alertrules', 'monitoring/silences'], + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { + required: ['PROMETHEUS', 'MONITORING', 'CAN_GET_NS'], + }, + properties: { + href: '/monitoring/query-browser', + id: 'metrics-virt-perspective', + insertAfter: 'alerts-virt-perspective', + name: '%public~Metrics%', + perspective: 'virtualization-perspective', + section: 'observe-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { + required: ['PROMETHEUS', 'MONITORING', 'CAN_GET_NS'], + }, + properties: { + href: '/monitoring/dashboards', + id: 'dashboards-virt-perspective', + insertAfter: 'metrics-virt-perspective', + name: '%public~Dashboards%', + perspective: 'virtualization-perspective', + section: 'observe-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { + required: ['PROMETHEUS', 'MONITORING', 'CAN_GET_NS'], + }, + properties: { + href: '/monitoring/targets', + id: 'targets-virt-perspective', + insertAfter: 'dashboards-virt-perspective', + name: '%public~Targets%', + perspective: 'virtualization-perspective', + section: 'observe-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, +]; + +const computeSection = [ + { + flags: { required: ['CAN_LIST_NODE'] }, + properties: { + dataAttributes: { 'data-quickstart-id': 'qs-nav-compute' }, + id: 'compute-virt-perspective', + name: '%console-app~Compute%', + perspective: 'virtualization-perspective', + }, + type: 'console.navigation/section', + } as EncodedExtension, + { + properties: { + id: 'nodes-virt-perspective', + model: { + kind: 'Node', + version: 'v1', + }, + name: '%console-app~Nodes%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + flags: { required: ['CLUSTER_API'] }, + properties: { + href: '/k8s/ns/openshift-machine-api/machine.openshift.io~v1beta1~Machine', + id: 'machines-virt-perspective', + insertAfter: 'nodes-virt-perspective', + name: '%console-app~Machines%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { required: ['CLUSTER_API'] }, + properties: { + href: '/k8s/ns/openshift-machine-api/machine.openshift.io~v1beta1~MachineSet', + id: 'machinesets-virt-perspective', + insertAfter: 'machines-virt-perspective', + name: '%console-app~MachineSets%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { required: ['MACHINE_AUTOSCALER'] }, + properties: { + href: '/k8s/ns/openshift-machine-api/autoscaling.openshift.io~v1beta1~MachineAutoscaler', + id: 'machzineautoscaler-virt-perspective', + insertAfter: 'machinesets-virt-perspective', + name: '%console-app~MachineAutoscalers%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { required: ['MACHINE_HEALTH_CHECK'] }, + properties: { + href: '/k8s/ns/openshift-machine-api/machine.openshift.io~v1beta1~MachineHealthCheck', + id: 'machinehealthchecks-virt-perspective', + insertAfter: 'machzineautoscaler-virt-perspective', + name: '%console-app~MachineHealthChecks%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { required: ['MACHINE_CONFIG'] }, + properties: { + id: 'computeseparator-virt-perspective', + insertAfter: 'machinehealthchecks-virt-perspective', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + testID: 'ComputeSeparator', + }, + type: 'console.navigation/separator', + } as EncodedExtension, + { + flags: { required: ['MACHINE_CONFIG'] }, + properties: { + id: 'machineconfigs-virt-perspective', + insertAfter: 'computeseparator-virt-perspective', + model: { + group: 'machineconfiguration.openshift.io', + kind: 'MachineConfig', + version: 'v1', + }, + name: '%console-app~MachineConfigs%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + flags: { required: ['MACHINE_CONFIG'] }, + properties: { + id: 'machineconfigpools-virt-perspective', + insertAfter: 'machineconfigs-virt-perspective', + model: { + group: 'machineconfiguration.openshift.io', + kind: 'MachineConfigPool', + version: 'v1', + }, + name: '%console-app~MachineConfigPools%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/resource-cluster', + } as EncodedExtension, + { + properties: { + href: 'hardwaredevices', + id: 'hardwaredevices-virt-perspective', + insertBefore: 'baremetalhosts', + name: '%plugin__kubevirt-plugin~Hardware Devices%', + perspective: 'virtualization-perspective', + section: 'compute-virt-perspective', + }, + type: 'console.navigation/href', + } as EncodedExtension, +]; + +export const extensions: EncodedExtension[] = [ + { + properties: { + icon: { $codeRef: 'perspective.icon' }, + id: 'virtualization-perspective', + importRedirectURL: { $codeRef: 'perspective.getImportRedirectURL' }, + landingPageURL: { $codeRef: 'perspective.getLandingPageURL' }, + name: '%plugin__console-virt-perspective-plugin~Virtualization%', + }, + type: 'console.perspective', + }, + ...virtualizationSection, + ...networkingSection, + ...storageSection, + ...monitoringSection, + ...computeSection, +]; diff --git a/src/perspective/perspective.ts b/src/perspective/perspective.ts new file mode 100644 index 000000000..dca33bf47 --- /dev/null +++ b/src/perspective/perspective.ts @@ -0,0 +1,13 @@ +import { Perspective, ResolvedExtension } from '@openshift-console/dynamic-plugin-sdk'; + +import virtualizationIcon from './virtualization-icon'; + +export const icon: ResolvedExtension['properties']['icon'] = { + default: virtualizationIcon, +}; + +export const getLandingPageURL: ResolvedExtension['properties']['landingPageURL'] = + () => `/k8s/all-namespaces/virtualization-overview`; + +export const getImportRedirectURL: ResolvedExtension['properties']['importRedirectURL'] = + (namespace: string) => `/k8s/ns/${namespace}/virtualization-overview`; diff --git a/src/perspective/virtualization-icon.tsx b/src/perspective/virtualization-icon.tsx new file mode 100644 index 000000000..5649d5086 --- /dev/null +++ b/src/perspective/virtualization-icon.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +export default () => ( + +); diff --git a/src/utils/extension.ts b/src/utils/extension.ts new file mode 100644 index 000000000..95886134f --- /dev/null +++ b/src/utils/extension.ts @@ -0,0 +1,99 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { + AddAction, + ContextProvider, + DashboardsOverviewHealthPrometheusSubsystem, + FeatureFlag, + FeatureFlagHookProvider, + RoutePage, + StandaloneRoutePage, + TelemetryListener, +} from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + ConsoleStandAlone: './utils/components/Consoles/ConsoleStandAlone.tsx', + dashboardExtensions: './utils/extensions/dashboard/index.ts', + HardwareDevicesPage: './utils/components/HardwareDevices/HardwareDevicesPage.tsx', + icons: './utils/icons.tsx', + kubevirtFlags: './utils/flags', + modalProvider: './utils/components/ModalProvider/ModalProvider.tsx', + telemetry: 'src/utils/extensions/telemetry/telemetry.ts', +}; + +export const extensions: EncodedExtension[] = [ + { + properties: { + provider: { $codeRef: 'modalProvider.ModalProvider' }, + useValueHook: { $codeRef: 'modalProvider.useModalValue' }, + }, + type: 'console.context-provider', + } as EncodedExtension, + + { + properties: { + handler: { $codeRef: 'kubevirtFlags.enableKubevirtDynamicFlag' }, + }, + type: 'console.flag', + } as EncodedExtension, + { + properties: { handler: { $codeRef: 'kubevirtFlags.useEnableKubevirtMenuFlags' } }, + type: 'console.flag/hookProvider', + } as EncodedExtension, + + { + properties: { + description: '%plugin__kubevirt-plugin~Create a Virtual Machine from a template%', + groupId: 'developer-catalog', + href: '/k8s/ns/:namespace/catalog/template', + icon: { $codeRef: 'icons.vmIconElement' }, + id: 'dev-catalog-virtualization', + label: '%plugin__kubevirt-plugin~Virtual Machines%', + }, + type: 'dev-console.add/action', + } as EncodedExtension, + + { + properties: { + component: { + $codeRef: 'HardwareDevicesPage', + }, + path: ['/hardwaredevices'], + }, + type: 'console.page/route', + } as EncodedExtension, + + { + properties: { + healthHandler: { + $codeRef: 'dashboardExtensions.getKubevirtHealthState', + }, + name: '%plugin__kubevirt-plugin~OpenShift Virtualization%', + popupComponent: { $codeRef: 'dashboardStatus.default' }, + popupTitle: '%plugin__kubevirt-plugin~OpenShift Virtualization%', + queries: ['kubevirt_hyperconverged_operator_health_status'], + title: '%plugin__kubevirt-plugin~OpenShift Virtualization%', + }, + type: 'console.dashboards/overview/health/prometheus', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { $codeRef: 'ConsoleStandAlone' }, + exact: false, + path: ['/k8s/ns/:ns/kubevirt.io~v1~VirtualMachine/:name/console/standalone'], + }, + type: 'console.page/route/standalone', + } as EncodedExtension, + + { + properties: { + listener: { + $codeRef: 'telemetry.eventMonitor', + }, + }, + type: 'console.telemetry/listener', + } as EncodedExtension, +]; diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts index 5eb62e093..2703c544e 100644 --- a/src/utils/i18n.ts +++ b/src/utils/i18n.ts @@ -1,5 +1,5 @@ // IMPORTANT: This file adds comments recognized by the react-i18next-parser so that -// labels declared in console-extensions.json are added to the message catalog. +// labels declared in console extensions are added to the message catalog. // TODO: We should make the custom i18next JSON lexer available to plugins so // that they do not need this file. diff --git a/src/views/cdi-upload-provider/extensions.ts b/src/views/cdi-upload-provider/extensions.ts new file mode 100644 index 000000000..87a555fed --- /dev/null +++ b/src/views/cdi-upload-provider/extensions.ts @@ -0,0 +1,98 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { + ContextProvider, + PVCAlert, + PVCCreateProp, + PVCDelete, + PVCStatus, + RoutePage, +} from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + contextProvider: 'src/views/cdi-upload-provider/utils/context.tsx', + pvcAlert: 'src/views/cdi-upload-provider/PVCAlertExtension.tsx', + pvcCloneStatus: 'src/views/cdi-upload-provider/upload-pvc-form/statuses/ClonePVCStatus.tsx', + pvcDelete: 'src/views/cdi-upload-provider/PVCDeleteAlertExtension.tsx', + pvcSelectors: 'src/views/cdi-upload-provider/utils/selectors.ts', + pvcUploadStatus: 'src/views/cdi-upload-provider/popover/UploadPVCPopover.tsx', + pvcUploadUtils: 'src/views/cdi-upload-provider/utils/utils.tsx', + UploadPVC: 'src/views/cdi-upload-provider/upload-pvc-form/UploadPVC.tsx', + useCDIUpload: 'src/views/cdi-upload-provider/hooks/useCDIUpload.tsx', +}; + +export const extensions: EncodedExtension[] = [ + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { + $codeRef: 'UploadPVC', + }, + exact: true, + path: ['/k8s/ns/:ns/persistentvolumeclaims/~new/data'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + provider: { $codeRef: 'contextProvider.CDIUploadProvider' }, + useValueHook: { $codeRef: 'useCDIUpload' }, + }, + type: 'console.context-provider', + } as EncodedExtension, + + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + label: '%plugin__kubevirt-plugin~With Data upload form%', + path: '~new/data', + }, + type: 'console.pvc/create-prop', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + alert: { $codeRef: 'pvcAlert' }, + }, + type: 'console.pvc/alert', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + predicate: { $codeRef: 'pvcSelectors.isPvcUploading' }, + priority: 10, + status: { $codeRef: 'pvcUploadStatus' }, + }, + type: 'console.pvc/status', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + predicate: { $codeRef: 'pvcSelectors.isPvcCloning' }, + priority: 9, + status: { $codeRef: 'pvcCloneStatus' }, + }, + type: 'console.pvc/status', + } as EncodedExtension, + { + properties: { + alert: { $codeRef: 'pvcDelete' }, + onPVCKill: { $codeRef: 'pvcUploadUtils.killCDIBoundPVC' }, + predicate: { $codeRef: 'pvcSelectors.isPvcBoundToCDI' }, + }, + type: 'console.pvc/delete', + } as EncodedExtension, +]; diff --git a/src/views/checkups/extensions.ts b/src/views/checkups/extensions.ts new file mode 100644 index 000000000..4fedf83ce --- /dev/null +++ b/src/views/checkups/extensions.ts @@ -0,0 +1,89 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { HrefNavItem, RoutePage } from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + Checkups: './views/checkups/Checkups.tsx', + CheckupsNetworkDetailsPage: './views/checkups/network/details/CheckupsNetworkDetailsPage.tsx', + CheckupsNetworkForm: './views/checkups/network/components/form/CheckupsNetworkForm.tsx', + CheckupsStorageDetailsPage: './views/checkups/storage/details/CheckupsStorageDetailsPage.tsx', + CheckupsStorageForm: './views/checkups/storage/components/form/CheckupsStorageForm.tsx', +}; + +export const extensions: EncodedExtension[] = [ + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + dataAttributes: { + 'data-quickstart-id': 'qs-nav-virtualization-checkups', + 'data-test-id': 'virtualization-checkups-nav-item', + }, + href: 'checkups', + id: 'virtualization-checkups', + insertAfter: 'migrationpolicies', + name: '%plugin__kubevirt-plugin~Checkups%', + prefixNamespaced: true, + section: 'virtualization', + }, + type: 'console.navigation/href', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { + $codeRef: 'CheckupsNetworkForm', + }, + path: ['/k8s/ns/:ns/checkups/network/form'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { + $codeRef: 'CheckupsNetworkDetailsPage', + }, + path: ['/k8s/ns/:ns/checkups/network/:vmName'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { + $codeRef: 'CheckupsStorageForm', + }, + path: ['/k8s/ns/:ns/checkups/storage/form'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { + $codeRef: 'CheckupsStorageDetailsPage', + }, + path: ['/k8s/ns/:ns/checkups/storage/:vmName'], + }, + type: 'console.page/route', + } as EncodedExtension, + { + properties: { + component: { + $codeRef: 'Checkups', + }, + path: ['/k8s/ns/:ns/checkups', '/k8s/all-namespaces/checkups'], + }, + type: 'console.page/route', + } as EncodedExtension, +]; diff --git a/src/views/dashboard-extensions/extensions.ts b/src/views/dashboard-extensions/extensions.ts new file mode 100644 index 000000000..05c6256fc --- /dev/null +++ b/src/views/dashboard-extensions/extensions.ts @@ -0,0 +1,62 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { + DashboardsInventoryItemGroup, + DashboardsOverviewInventoryItem, + DashboardsOverviewResourceActivity, + DashboardsProjectOverviewInventoryItem, +} from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + dashboardActivity: 'src/views/dashboard-extensions/Activity.tsx', + dashboardActivityUtils: 'src/views/dashboard-extensions/utils.ts', + dashboardInventory: 'src/views/dashboard-extensions/Inventory.tsx', + dashboardStatus: 'src/views/dashboard-extensions/KubevirtHealthPopup/KubevirtHealthPopup.tsx', +}; + +export const extensions: EncodedExtension[] = [ + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + mapper: { $codeRef: 'dashboardInventory.getVMStatusGroups' }, + model: { $codeRef: 'dashboardActivityUtils.VirtualMachineModel' }, + }, + type: 'console.dashboards/overview/inventory/item', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + mapper: { $codeRef: 'dashboardInventory.getVMStatusGroups' }, + model: { $codeRef: 'dashboardActivityUtils.VirtualMachineModel' }, + }, + type: 'console.dashboards/project/overview/item', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + icon: { $codeRef: 'dashboardInventory.VMOffGroupIcon' }, + id: 'vm-stopped', + }, + type: 'console.dashboards/overview/inventory/item/group', + } as EncodedExtension, + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { $codeRef: 'dashboardActivity.DiskImportActivity' }, + getTimestamp: { $codeRef: 'dashboardActivityUtils.getTimestamp' }, + isActivity: { $codeRef: 'dashboardActivityUtils.isDVActivity' }, + k8sResource: { + $codeRef: 'dashboardActivityUtils.k8sDVResource', + }, + }, + type: 'console.dashboards/overview/activity/resource', + } as EncodedExtension, +]; diff --git a/src/views/virtualmachines/extensions.ts b/src/views/virtualmachines/extensions.ts new file mode 100644 index 000000000..b989501e0 --- /dev/null +++ b/src/views/virtualmachines/extensions.ts @@ -0,0 +1,70 @@ +import { EncodedExtension } from '@openshift/dynamic-plugin-sdk-webpack'; +import { + ResourceActionProvider, + ResourceDetailsPage, + ResourceListPage, + StandaloneRoutePage, +} from '@openshift-console/dynamic-plugin-sdk'; +import type { ConsolePluginBuildMetadata } from '@openshift-console/dynamic-plugin-sdk-webpack'; + +export const exposedModules: ConsolePluginBuildMetadata['exposedModules'] = { + LogsStandAlone: + './views/virtualmachines/details/tabs/diagnostic/VirtualMachineLogViewer/VirtualMachineLogViewerStandAlone/VirtualMachineLogViewerStandAlone.tsx', + useVirtualMachineActionsProvider: + './views/virtualmachines/actions/hooks/useVirtualMachineActionsProvider.ts', + VirtualMachineNavPage: './views/virtualmachines/details/VirtualMachineNavPage.tsx', + VirtualMachinesList: './views/virtualmachines/list/VirtualMachinesList.tsx', +}; + +export const extensions: EncodedExtension[] = [ + { + flags: { + required: ['KUBEVIRT'], + }, + properties: { + component: { $codeRef: 'LogsStandAlone' }, + exact: false, + path: ['/k8s/ns/:ns/kubevirt.io~v1~VirtualMachine/:name/diagnostics/logs/standalone'], + }, + type: 'console.page/route/standalone', + } as EncodedExtension, + + { + properties: { + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + provider: { + $codeRef: 'useVirtualMachineActionsProvider', + }, + }, + type: 'console.action/resource-provider', + } as EncodedExtension, + + { + properties: { + component: { $codeRef: 'VirtualMachineNavPage' }, + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + }, + type: 'console.page/resource/details', + } as EncodedExtension, + { + properties: { + component: { + $codeRef: 'VirtualMachinesList', + }, + model: { + group: 'kubevirt.io', + kind: 'VirtualMachine', + version: 'v1', + }, + }, + type: 'console.page/resource/list', + } as EncodedExtension, +]; diff --git a/webpack.config.ts b/webpack.config.ts index a7635f1f8..8e9935e5a 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -9,6 +9,7 @@ import { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-serv import { ConsoleRemotePlugin } from '@openshift-console/dynamic-plugin-sdk-webpack'; +import extensions from './plugin-extensions'; import pluginMetadata from './plugin-metadata'; interface Configuration extends WebpackConfiguration { @@ -138,6 +139,7 @@ const config: Configuration = { patterns: [{ from: '../locales', to: '../dist/locales' }], }), new ConsoleRemotePlugin({ + extensions, pluginMetadata, }), new ForkTsCheckerWebpackPlugin({ diff --git a/yarn.lock b/yarn.lock index 1539183ca..efab07303 100644 --- a/yarn.lock +++ b/yarn.lock @@ -870,10 +870,10 @@ redux "4.0.1" redux-thunk "2.4.0" -"@openshift-console/dynamic-plugin-sdk-webpack@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@openshift-console/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-1.1.1.tgz#349326366f84defa8c81baa8be411257d0b1e954" - integrity sha512-1m1iBpdj0HNWQIEFAhMlI5pmigyN5B/Eqcb2nGAI2n030hOOxAalxySO95dvEFa2hiyXMUt4z/Tyq4fDYKZ2nw== +"@openshift-console/dynamic-plugin-sdk-webpack@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@openshift-console/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-1.2.0.tgz#8598906ea88f34259912b4cc29d1c79f1ce06bcc" + integrity sha512-Bq1G279ez4q28C5ueBKh8BkSDv2Bwg9vrOn0CqdT2OYDFRRqwCKYTwjtlPm+Cm54+GaXKYF4+TJDmo12OGf/bQ== dependencies: "@openshift/dynamic-plugin-sdk-webpack" "^4.0.2" ajv "^6.12.3" @@ -922,6 +922,16 @@ semver "^7.3.7" yup "^0.32.11" +"@openshift/dynamic-plugin-sdk@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@openshift/dynamic-plugin-sdk/-/dynamic-plugin-sdk-5.0.1.tgz#3487afe57d07a28b9aba393e643d86ca13a3735c" + integrity sha512-+azUBN6FgcDmlcWMzG0bthcRUJC1u12wf9xa2aJGFbC/uTiOXwjrkcQ7LW/PyK5Em7wDhwaUdapaeOgh8I6Kjg== + dependencies: + lodash "^4.17.21" + semver "^7.3.7" + uuid "^8.3.2" + yup "^0.32.11" + "@patternfly/quickstarts@5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@patternfly/quickstarts/-/quickstarts-5.1.0.tgz#c60c782ca8e7019b82b6aa2a533deeed68da922b"