From d45fc222dfa2ed777cd8bcca4dae0a5d1de274ec Mon Sep 17 00:00:00 2001 From: apinnick Date: Mon, 11 Nov 2024 18:43:45 -0600 Subject: [PATCH] [ci skip] Automated deployment to GitHub Pages on 1731372225 --- CNAME | 1 + CODE_OF_CONDUCT.md | 128 + CONTRIBUTING.md | 33 + Gemfile | 31 + Gemfile.lock | 325 + LICENSE | 202 + assets/css/style.css | 352 + assets/fonts/Noto-Sans-700/Noto-Sans-700.eot | Bin 0 -> 16716 bytes assets/fonts/Noto-Sans-700/Noto-Sans-700.svg | 336 + assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf | Bin 0 -> 29704 bytes assets/fonts/Noto-Sans-700/Noto-Sans-700.woff | Bin 0 -> 12632 bytes .../fonts/Noto-Sans-700/Noto-Sans-700.woff2 | Bin 0 -> 9724 bytes .../Noto-Sans-700italic.eot | Bin 0 -> 16849 bytes .../Noto-Sans-700italic.svg | 334 + .../Noto-Sans-700italic.ttf | Bin 0 -> 28932 bytes .../Noto-Sans-700italic.woff | Bin 0 -> 12612 bytes .../Noto-Sans-700italic.woff2 | Bin 0 -> 9612 bytes .../Noto-Sans-italic/Noto-Sans-italic.eot | Bin 0 -> 15864 bytes .../Noto-Sans-italic/Noto-Sans-italic.svg | 337 + .../Noto-Sans-italic/Noto-Sans-italic.ttf | Bin 0 -> 26644 bytes .../Noto-Sans-italic/Noto-Sans-italic.woff | Bin 0 -> 12536 bytes .../Noto-Sans-italic/Noto-Sans-italic.woff2 | Bin 0 -> 9572 bytes .../Noto-Sans-regular/Noto-Sans-regular.eot | Bin 0 -> 16639 bytes .../Noto-Sans-regular/Noto-Sans-regular.svg | 335 + .../Noto-Sans-regular/Noto-Sans-regular.ttf | Bin 0 -> 29288 bytes .../Noto-Sans-regular/Noto-Sans-regular.woff | Bin 0 -> 12840 bytes .../Noto-Sans-regular/Noto-Sans-regular.woff2 | Bin 0 -> 9932 bytes assets/img/forklift-logo-darkbg.svg | 164 + assets/img/forklift-logo-lightbg.svg | 159 + assets/img/konveyor-logo-forklift.jpg | Bin 0 -> 7258 bytes assets/img/logo_location.txt | 1 + assets/js/scale.fix.js | 30 + .../docinfo.xml | 15 + .../master/index.html | 8582 +++++++++++++++++ .../about-cold-warm-migration/index.html | 255 + .../index.html | 116 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + .../index.html | 302 + .../modules/adding-source-provider/index.html | 82 + .../modules/adding-virt-provider/index.html | 116 + .../canceling-migration-cli/index.html | 132 + .../modules/canceling-migration-ui/index.html | 92 + .../changing-precopy-intervals/index.html | 92 + .../modules/collected-logs-cr-info/index.html | 183 + .../modules/common-attributes/index.html | 66 + .../compatibility-guidelines/index.html | 137 + .../configuring-mtv-operator/index.html | 202 + .../creating-migration-plan-2-6-3/index.html | 139 + .../creating-migration-plan/index.html | 270 + .../creating-network-mapping/index.html | 122 + .../creating-storage-mapping/index.html | 138 + .../creating-validation-rule/index.html | 238 + .../modules/creating-vddk-image/index.html | 201 + .../modules/error-messages/index.html | 83 + ...ft_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...t_Migration_Toolkit_0121_virt-workflow.svg | 1 + ...am_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...m_Migration_Toolkit_0121_virt-workflow.svg | 1 + .../modules/images/forklift-logo-darkbg.png | Bin 0 -> 7554 bytes .../modules/images/forklift-logo-darkbg.svg | 164 + .../modules/images/forklift-logo-lightbg.png | Bin 0 -> 7667 bytes .../modules/images/forklift-logo-lightbg.svg | 159 + .../modules/images/kebab.png | Bin 0 -> 329 bytes .../modules/images/mtv-ui.png | Bin 0 -> 151049 bytes .../index.html | 103 + .../installing-mtv-operator/index.html | 79 + .../modules/issue_templates/issue.md | 15 + .../modules/issue_templates/issue/index.html | 79 + .../modules/known-issues-2-7/index.html | 87 + .../index.html | 69 + .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-changelog-2-7/index.html | 2330 +++++ .../modules/mtv-overview-page/index.html | 214 + .../mtv-performance-addendum/index.html | 291 + .../mtv-performance-recommendation/index.html | 382 + .../mtv-resources-and-services/index.html | 131 + .../mtv-selected-packages-2-7/index.html | 207 + .../modules/mtv-settings/index.html | 133 + .../modules/mtv-ui/index.html | 91 + .../modules/mtv-workflow/index.html | 113 + .../modules/network-prerequisites/index.html | 196 + .../index.html | 85 + .../index.html | 155 + .../non-admin-permissions-for-ui/index.html | 192 + .../modules/obtaining-console-url/index.html | 107 + .../openstack-prerequisites/index.html | 76 + .../modules/ostack-app-cred-auth/index.html | 189 + .../modules/ostack-token-auth/index.html | 180 + .../modules/ova-prerequisites/index.html | 130 + .../index.html | 483 + .../retrieving-vmware-moref/index.html | 149 + .../modules/rhv-prerequisites/index.html | 129 + .../modules/rn-2.0/index.html | 163 + .../modules/rn-2.1/index.html | 191 + .../modules/rn-2.2/index.html | 219 + .../modules/rn-2.3/index.html | 156 + .../modules/rn-2.4/index.html | 260 + .../modules/rn-2.5/index.html | 464 + .../modules/rn-2.6/index.html | 511 + .../modules/rn-2.7/index.html | 91 + .../modules/rn-27-resolved-issues/index.html | 168 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 142 + .../selecting-migration-network/index.html | 118 + .../snip-certificate-options/index.html | 114 + .../modules/snip-migrating-luns/index.html | 86 + .../index.html | 100 + .../snip_measured_boot_windows_vm/index.html | 72 + .../modules/snip_performance/index.html | 74 + .../modules/snip_permissions-info/index.html | 85 + .../modules/snip_plan-limits/index.html | 79 + .../modules/snip_qemu-guest-agent/index.html | 74 + .../modules/snip_secure_boot_issue/index.html | 72 + .../snip_vmware-name-change/index.html | 79 + .../snip_vmware-permissions/index.html | 86 + .../modules/snip_vmware_esxi_nfc/index.html | 79 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 127 + .../modules/storage-support/index.html | 211 + .../modules/technical-changes-2-7/index.html | 73 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 144 + .../modules/uninstalling-mtv-ui/index.html | 168 + .../index.html | 127 + .../modules/upgrading-mtv-ui/index.html | 127 + .../modules/using-must-gather/index.html | 157 + .../virt-migration-workflow/index.html | 209 + .../modules/vmware-prerequisites/index.html | 278 + documentation/doc-Release_notes/docinfo.xml | 15 + .../doc-Release_notes/master/index.html | 2674 +++++ .../about-cold-warm-migration/index.html | 255 + .../index.html | 116 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + .../index.html | 302 + .../modules/adding-source-provider/index.html | 82 + .../modules/adding-virt-provider/index.html | 116 + .../canceling-migration-cli/index.html | 132 + .../modules/canceling-migration-ui/index.html | 92 + .../changing-precopy-intervals/index.html | 92 + .../modules/collected-logs-cr-info/index.html | 183 + .../modules/common-attributes/index.html | 66 + .../compatibility-guidelines/index.html | 137 + .../configuring-mtv-operator/index.html | 202 + .../creating-migration-plan-2-6-3/index.html | 139 + .../creating-migration-plan/index.html | 270 + .../creating-network-mapping/index.html | 122 + .../creating-storage-mapping/index.html | 138 + .../creating-validation-rule/index.html | 238 + .../modules/creating-vddk-image/index.html | 201 + .../modules/error-messages/index.html | 83 + ...ft_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...t_Migration_Toolkit_0121_virt-workflow.svg | 1 + ...am_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...m_Migration_Toolkit_0121_virt-workflow.svg | 1 + .../modules/images/forklift-logo-darkbg.png | Bin 0 -> 7554 bytes .../modules/images/forklift-logo-darkbg.svg | 164 + .../modules/images/forklift-logo-lightbg.png | Bin 0 -> 7667 bytes .../modules/images/forklift-logo-lightbg.svg | 159 + .../modules/images/kebab.png | Bin 0 -> 329 bytes .../modules/images/mtv-ui.png | Bin 0 -> 151049 bytes .../index.html | 103 + .../installing-mtv-operator/index.html | 79 + .../modules/issue_templates/issue.md | 15 + .../modules/issue_templates/issue/index.html | 79 + .../modules/known-issues-2-7/index.html | 87 + .../index.html | 69 + .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-changelog-2-7/index.html | 2330 +++++ .../modules/mtv-overview-page/index.html | 214 + .../mtv-performance-addendum/index.html | 291 + .../mtv-performance-recommendation/index.html | 382 + .../mtv-resources-and-services/index.html | 131 + .../mtv-selected-packages-2-7/index.html | 207 + .../modules/mtv-settings/index.html | 133 + .../modules/mtv-ui/index.html | 91 + .../modules/mtv-workflow/index.html | 113 + .../modules/network-prerequisites/index.html | 196 + .../index.html | 85 + .../index.html | 155 + .../non-admin-permissions-for-ui/index.html | 192 + .../modules/obtaining-console-url/index.html | 107 + .../openstack-prerequisites/index.html | 76 + .../modules/ostack-app-cred-auth/index.html | 189 + .../modules/ostack-token-auth/index.html | 180 + .../modules/ova-prerequisites/index.html | 130 + .../index.html | 483 + .../retrieving-vmware-moref/index.html | 149 + .../modules/rhv-prerequisites/index.html | 129 + .../modules/rn-2.0/index.html | 163 + .../modules/rn-2.1/index.html | 191 + .../modules/rn-2.2/index.html | 219 + .../modules/rn-2.3/index.html | 156 + .../modules/rn-2.4/index.html | 260 + .../modules/rn-2.5/index.html | 464 + .../modules/rn-2.6/index.html | 511 + .../modules/rn-2.7/index.html | 91 + .../modules/rn-27-resolved-issues/index.html | 168 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 142 + .../selecting-migration-network/index.html | 118 + .../snip-certificate-options/index.html | 114 + .../modules/snip-migrating-luns/index.html | 86 + .../index.html | 100 + .../snip_measured_boot_windows_vm/index.html | 72 + .../modules/snip_performance/index.html | 74 + .../modules/snip_permissions-info/index.html | 85 + .../modules/snip_plan-limits/index.html | 79 + .../modules/snip_qemu-guest-agent/index.html | 74 + .../modules/snip_secure_boot_issue/index.html | 72 + .../snip_vmware-name-change/index.html | 79 + .../snip_vmware-permissions/index.html | 86 + .../modules/snip_vmware_esxi_nfc/index.html | 79 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 127 + .../modules/storage-support/index.html | 211 + .../modules/technical-changes-2-7/index.html | 73 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 144 + .../modules/uninstalling-mtv-ui/index.html | 168 + .../index.html | 127 + .../modules/upgrading-mtv-ui/index.html | 127 + .../modules/using-must-gather/index.html | 157 + .../virt-migration-workflow/index.html | 209 + .../modules/vmware-prerequisites/index.html | 278 + .../about-cold-warm-migration/index.html | 255 + .../index.html | 116 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + .../index.html | 302 + .../modules/adding-source-provider/index.html | 82 + .../modules/adding-virt-provider/index.html | 116 + .../canceling-migration-cli/index.html | 132 + .../modules/canceling-migration-ui/index.html | 92 + .../changing-precopy-intervals/index.html | 92 + .../modules/collected-logs-cr-info/index.html | 183 + .../modules/common-attributes/index.html | 66 + .../compatibility-guidelines/index.html | 137 + .../configuring-mtv-operator/index.html | 202 + .../creating-migration-plan-2-6-3/index.html | 139 + .../creating-migration-plan/index.html | 270 + .../creating-network-mapping/index.html | 122 + .../creating-storage-mapping/index.html | 138 + .../creating-validation-rule/index.html | 238 + .../modules/creating-vddk-image/index.html | 201 + .../modules/error-messages/index.html | 83 + ...ft_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...t_Migration_Toolkit_0121_virt-workflow.svg | 1 + ...am_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...m_Migration_Toolkit_0121_virt-workflow.svg | 1 + .../modules/images/forklift-logo-darkbg.png | Bin 0 -> 7554 bytes .../modules/images/forklift-logo-darkbg.svg | 164 + .../modules/images/forklift-logo-lightbg.png | Bin 0 -> 7667 bytes .../modules/images/forklift-logo-lightbg.svg | 159 + documentation/modules/images/kebab.png | Bin 0 -> 329 bytes documentation/modules/images/mtv-ui.png | Bin 0 -> 151049 bytes .../index.html | 103 + .../installing-mtv-operator/index.html | 79 + .../modules/issue_templates/issue.md | 15 + .../modules/issue_templates/issue/index.html | 79 + .../modules/known-issues-2-7/index.html | 87 + .../index.html | 69 + .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-changelog-2-7/index.html | 2330 +++++ .../modules/mtv-overview-page/index.html | 214 + .../mtv-performance-addendum/index.html | 291 + .../mtv-performance-recommendation/index.html | 382 + .../mtv-resources-and-services/index.html | 131 + .../mtv-selected-packages-2-7/index.html | 207 + documentation/modules/mtv-settings/index.html | 133 + documentation/modules/mtv-ui/index.html | 91 + documentation/modules/mtv-workflow/index.html | 113 + .../modules/network-prerequisites/index.html | 196 + .../index.html | 85 + .../index.html | 155 + .../non-admin-permissions-for-ui/index.html | 192 + .../modules/obtaining-console-url/index.html | 107 + .../openstack-prerequisites/index.html | 76 + .../modules/ostack-app-cred-auth/index.html | 189 + .../modules/ostack-token-auth/index.html | 180 + .../modules/ova-prerequisites/index.html | 130 + .../index.html | 483 + .../retrieving-vmware-moref/index.html | 149 + .../modules/rhv-prerequisites/index.html | 129 + documentation/modules/rn-2.0/index.html | 163 + documentation/modules/rn-2.1/index.html | 191 + documentation/modules/rn-2.2/index.html | 219 + documentation/modules/rn-2.3/index.html | 156 + documentation/modules/rn-2.4/index.html | 260 + documentation/modules/rn-2.5/index.html | 464 + documentation/modules/rn-2.6/index.html | 511 + documentation/modules/rn-2.7/index.html | 91 + .../modules/rn-27-resolved-issues/index.html | 168 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 142 + .../selecting-migration-network/index.html | 118 + .../snip-certificate-options/index.html | 114 + .../modules/snip-migrating-luns/index.html | 86 + .../index.html | 100 + .../snip_measured_boot_windows_vm/index.html | 72 + .../modules/snip_performance/index.html | 74 + .../modules/snip_permissions-info/index.html | 85 + .../modules/snip_plan-limits/index.html | 79 + .../modules/snip_qemu-guest-agent/index.html | 74 + .../modules/snip_secure_boot_issue/index.html | 72 + .../snip_vmware-name-change/index.html | 79 + .../snip_vmware-permissions/index.html | 86 + .../modules/snip_vmware_esxi_nfc/index.html | 79 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 127 + .../modules/storage-support/index.html | 211 + .../modules/technical-changes-2-7/index.html | 73 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 144 + .../modules/uninstalling-mtv-ui/index.html | 168 + .../index.html | 127 + .../modules/upgrading-mtv-ui/index.html | 127 + .../modules/using-must-gather/index.html | 157 + .../virt-migration-workflow/index.html | 209 + .../modules/vmware-prerequisites/index.html | 278 + feed.xml | 1 + index.html | 89 + jekyll-theme-cayman.gemspec | 22 + modules/about-cold-warm-migration/index.html | 255 + .../index.html | 116 + modules/about-rego-files/index.html | 104 + .../index.html | 108 + modules/accessing-logs-cli/index.html | 157 + modules/accessing-logs-ui/index.html | 92 + .../index.html | 302 + modules/adding-source-provider/index.html | 82 + modules/adding-virt-provider/index.html | 116 + modules/canceling-migration-cli/index.html | 132 + modules/canceling-migration-ui/index.html | 92 + modules/changing-precopy-intervals/index.html | 92 + modules/collected-logs-cr-info/index.html | 183 + modules/common-attributes/index.html | 66 + modules/compatibility-guidelines/index.html | 137 + modules/configuring-mtv-operator/index.html | 202 + .../creating-migration-plan-2-6-3/index.html | 139 + modules/creating-migration-plan/index.html | 270 + modules/creating-network-mapping/index.html | 122 + modules/creating-storage-mapping/index.html | 138 + modules/creating-validation-rule/index.html | 238 + modules/creating-vddk-image/index.html | 201 + modules/error-messages/index.html | 83 + ...ft_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...t_Migration_Toolkit_0121_virt-workflow.svg | 1 + ...am_Migration_Toolkit_0121_mtv-workflow.svg | 1 + ...m_Migration_Toolkit_0121_virt-workflow.svg | 1 + modules/images/forklift-logo-darkbg.png | Bin 0 -> 7554 bytes modules/images/forklift-logo-darkbg.svg | 164 + modules/images/forklift-logo-lightbg.png | Bin 0 -> 7667 bytes modules/images/forklift-logo-lightbg.svg | 159 + modules/images/kebab.png | Bin 0 -> 329 bytes modules/images/mtv-ui.png | Bin 0 -> 151049 bytes .../index.html | 103 + modules/installing-mtv-operator/index.html | 79 + modules/issue_templates/issue.md | 15 + modules/issue_templates/issue/index.html | 79 + modules/known-issues-2-7/index.html | 87 + .../index.html | 69 + modules/migration-plan-options-ui/index.html | 141 + modules/mtv-changelog-2-7/index.html | 2330 +++++ modules/mtv-overview-page/index.html | 214 + modules/mtv-performance-addendum/index.html | 291 + .../mtv-performance-recommendation/index.html | 382 + modules/mtv-resources-and-services/index.html | 131 + modules/mtv-selected-packages-2-7/index.html | 207 + modules/mtv-settings/index.html | 133 + modules/mtv-ui/index.html | 91 + modules/mtv-workflow/index.html | 113 + modules/network-prerequisites/index.html | 196 + .../index.html | 85 + .../index.html | 155 + .../non-admin-permissions-for-ui/index.html | 192 + modules/obtaining-console-url/index.html | 107 + modules/openstack-prerequisites/index.html | 76 + modules/ostack-app-cred-auth/index.html | 189 + modules/ostack-token-auth/index.html | 180 + modules/ova-prerequisites/index.html | 130 + .../index.html | 483 + modules/retrieving-vmware-moref/index.html | 149 + modules/rhv-prerequisites/index.html | 129 + modules/rn-2.0/index.html | 163 + modules/rn-2.1/index.html | 191 + modules/rn-2.2/index.html | 219 + modules/rn-2.3/index.html | 156 + modules/rn-2.4/index.html | 260 + modules/rn-2.5/index.html | 464 + modules/rn-2.6/index.html | 511 + modules/rn-2.7/index.html | 91 + modules/rn-27-resolved-issues/index.html | 168 + modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 142 + .../selecting-migration-network/index.html | 118 + modules/snip-certificate-options/index.html | 114 + modules/snip-migrating-luns/index.html | 86 + .../index.html | 100 + .../snip_measured_boot_windows_vm/index.html | 72 + modules/snip_performance/index.html | 74 + modules/snip_permissions-info/index.html | 85 + modules/snip_plan-limits/index.html | 79 + modules/snip_qemu-guest-agent/index.html | 74 + modules/snip_secure_boot_issue/index.html | 72 + modules/snip_vmware-name-change/index.html | 79 + modules/snip_vmware-permissions/index.html | 86 + modules/snip_vmware_esxi_nfc/index.html | 79 + .../index.html | 87 + .../index.html | 84 + modules/snippet_ova_tech_preview/index.html | 87 + modules/source-vm-prerequisites/index.html | 127 + modules/storage-support/index.html | 211 + modules/technical-changes-2-7/index.html | 73 + modules/technology-preview/index.html | 88 + modules/uninstalling-mtv-cli/index.html | 144 + modules/uninstalling-mtv-ui/index.html | 168 + .../index.html | 127 + modules/upgrading-mtv-ui/index.html | 127 + modules/using-must-gather/index.html | 157 + modules/virt-migration-workflow/index.html | 209 + modules/vmware-prerequisites/index.html | 278 + redirects.json | 1 + robots.txt | 1 + sitemap.xml | 1080 +++ 442 files changed, 79148 insertions(+) create mode 100644 CNAME create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 LICENSE create mode 100644 assets/css/style.css create mode 100755 assets/fonts/Noto-Sans-700/Noto-Sans-700.eot create mode 100644 assets/fonts/Noto-Sans-700/Noto-Sans-700.svg create mode 100755 assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf create mode 100755 assets/fonts/Noto-Sans-700/Noto-Sans-700.woff create mode 100755 assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 create mode 100755 assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot create mode 100644 assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg create mode 100755 assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf create mode 100755 assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff create mode 100755 assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 create mode 100755 assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot create mode 100644 assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg create mode 100755 assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf create mode 100755 assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff create mode 100755 assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 create mode 100755 assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot create mode 100644 assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg create mode 100755 assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf create mode 100755 assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff create mode 100755 assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 create mode 100644 assets/img/forklift-logo-darkbg.svg create mode 100644 assets/img/forklift-logo-lightbg.svg create mode 100644 assets/img/konveyor-logo-forklift.jpg create mode 100644 assets/img/logo_location.txt create mode 100644 assets/js/scale.fix.js create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/docinfo.xml create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/master/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-hook-crs-for-migration-plans-api/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-rego-files/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hook-crs-to-migration-plans-api/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-cli/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/collected-logs-cr-info/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/configuring-mtv-operator/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan-2-6-3/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-storage-mapping/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.png create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.png create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.svg create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/kebab.png create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/mtv-ui.png create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/increasing-nfc-memory-vmware-host/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue.md create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/known-issues-2-7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-changelog-2-7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-addendum/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-recommendation/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-selected-packages-2-7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-features-and-enhancements-2-7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-migrating-virtual-machines-cli/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-vmware-moref/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.6/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-27-resolved-issues/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-certificate-options/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_cold-warm-comparison-table/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_measured_boot_windows_vm/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_performance/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_plan-limits/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_qemu-guest-agent/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_secure_boot_issue/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-name-change/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-permissions/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware_esxi_nfc/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/technical-changes-2-7/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/upgrading-mtv-ui/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/using-must-gather/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/virt-migration-workflow/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/docinfo.xml create mode 100644 documentation/doc-Release_notes/master/index.html create mode 100644 documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html create mode 100644 documentation/doc-Release_notes/modules/about-hook-crs-for-migration-plans-api/index.html create mode 100644 documentation/doc-Release_notes/modules/about-rego-files/index.html create mode 100644 documentation/doc-Release_notes/modules/accessing-default-validation-rules/index.html create mode 100644 documentation/doc-Release_notes/modules/accessing-logs-cli/index.html create mode 100644 documentation/doc-Release_notes/modules/accessing-logs-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/adding-hook-crs-to-migration-plans-api/index.html create mode 100644 documentation/doc-Release_notes/modules/adding-source-provider/index.html create mode 100644 documentation/doc-Release_notes/modules/adding-virt-provider/index.html create mode 100644 documentation/doc-Release_notes/modules/canceling-migration-cli/index.html create mode 100644 documentation/doc-Release_notes/modules/canceling-migration-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/changing-precopy-intervals/index.html create mode 100644 documentation/doc-Release_notes/modules/collected-logs-cr-info/index.html create mode 100644 documentation/doc-Release_notes/modules/common-attributes/index.html create mode 100644 documentation/doc-Release_notes/modules/compatibility-guidelines/index.html create mode 100644 documentation/doc-Release_notes/modules/configuring-mtv-operator/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-migration-plan-2-6-3/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-migration-plan/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-network-mapping/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-storage-mapping/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-validation-rule/index.html create mode 100644 documentation/doc-Release_notes/modules/creating-vddk-image/index.html create mode 100644 documentation/doc-Release_notes/modules/error-messages/index.html create mode 100644 documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.png create mode 100644 documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.svg create mode 100644 documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.png create mode 100644 documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.svg create mode 100644 documentation/doc-Release_notes/modules/images/kebab.png create mode 100644 documentation/doc-Release_notes/modules/images/mtv-ui.png create mode 100644 documentation/doc-Release_notes/modules/increasing-nfc-memory-vmware-host/index.html create mode 100644 documentation/doc-Release_notes/modules/installing-mtv-operator/index.html create mode 100644 documentation/doc-Release_notes/modules/issue_templates/issue.md create mode 100644 documentation/doc-Release_notes/modules/issue_templates/issue/index.html create mode 100644 documentation/doc-Release_notes/modules/known-issues-2-7/index.html create mode 100644 documentation/doc-Release_notes/modules/making-open-source-more-inclusive/index.html create mode 100644 documentation/doc-Release_notes/modules/migration-plan-options-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-changelog-2-7/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-overview-page/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-performance-addendum/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-performance-recommendation/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-resources-and-services/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-selected-packages-2-7/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-settings/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/mtv-workflow/index.html create mode 100644 documentation/doc-Release_notes/modules/network-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/new-features-and-enhancements-2-7/index.html create mode 100644 documentation/doc-Release_notes/modules/new-migrating-virtual-machines-cli/index.html create mode 100644 documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/obtaining-console-url/index.html create mode 100644 documentation/doc-Release_notes/modules/openstack-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/ostack-app-cred-auth/index.html create mode 100644 documentation/doc-Release_notes/modules/ostack-token-auth/index.html create mode 100644 documentation/doc-Release_notes/modules/ova-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/retrieving-validation-service-json/index.html create mode 100644 documentation/doc-Release_notes/modules/retrieving-vmware-moref/index.html create mode 100644 documentation/doc-Release_notes/modules/rhv-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.0/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.1/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.2/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.3/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.4/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.5/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.6/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-2.7/index.html create mode 100644 documentation/doc-Release_notes/modules/rn-27-resolved-issues/index.html create mode 100644 documentation/doc-Release_notes/modules/running-migration-plan/index.html create mode 100644 documentation/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/index.html create mode 100644 documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/index.html create mode 100644 documentation/doc-Release_notes/modules/selecting-migration-network/index.html create mode 100644 documentation/doc-Release_notes/modules/snip-certificate-options/index.html create mode 100644 documentation/doc-Release_notes/modules/snip-migrating-luns/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_cold-warm-comparison-table/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_measured_boot_windows_vm/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_performance/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_permissions-info/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_plan-limits/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_qemu-guest-agent/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_secure_boot_issue/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_vmware-name-change/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_vmware-permissions/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_vmware_esxi_nfc/index.html create mode 100644 documentation/doc-Release_notes/modules/snippet_getting_web_console_url_cli/index.html create mode 100644 documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/index.html create mode 100644 documentation/doc-Release_notes/modules/snippet_ova_tech_preview/index.html create mode 100644 documentation/doc-Release_notes/modules/source-vm-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/storage-support/index.html create mode 100644 documentation/doc-Release_notes/modules/technical-changes-2-7/index.html create mode 100644 documentation/doc-Release_notes/modules/technology-preview/index.html create mode 100644 documentation/doc-Release_notes/modules/uninstalling-mtv-cli/index.html create mode 100644 documentation/doc-Release_notes/modules/uninstalling-mtv-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/updating-validation-rules-version/index.html create mode 100644 documentation/doc-Release_notes/modules/upgrading-mtv-ui/index.html create mode 100644 documentation/doc-Release_notes/modules/using-must-gather/index.html create mode 100644 documentation/doc-Release_notes/modules/virt-migration-workflow/index.html create mode 100644 documentation/doc-Release_notes/modules/vmware-prerequisites/index.html create mode 100644 documentation/modules/about-cold-warm-migration/index.html create mode 100644 documentation/modules/about-hook-crs-for-migration-plans-api/index.html create mode 100644 documentation/modules/about-rego-files/index.html create mode 100644 documentation/modules/accessing-default-validation-rules/index.html create mode 100644 documentation/modules/accessing-logs-cli/index.html create mode 100644 documentation/modules/accessing-logs-ui/index.html create mode 100644 documentation/modules/adding-hook-crs-to-migration-plans-api/index.html create mode 100644 documentation/modules/adding-source-provider/index.html create mode 100644 documentation/modules/adding-virt-provider/index.html create mode 100644 documentation/modules/canceling-migration-cli/index.html create mode 100644 documentation/modules/canceling-migration-ui/index.html create mode 100644 documentation/modules/changing-precopy-intervals/index.html create mode 100644 documentation/modules/collected-logs-cr-info/index.html create mode 100644 documentation/modules/common-attributes/index.html create mode 100644 documentation/modules/compatibility-guidelines/index.html create mode 100644 documentation/modules/configuring-mtv-operator/index.html create mode 100644 documentation/modules/creating-migration-plan-2-6-3/index.html create mode 100644 documentation/modules/creating-migration-plan/index.html create mode 100644 documentation/modules/creating-network-mapping/index.html create mode 100644 documentation/modules/creating-storage-mapping/index.html create mode 100644 documentation/modules/creating-validation-rule/index.html create mode 100644 documentation/modules/creating-vddk-image/index.html create mode 100644 documentation/modules/error-messages/index.html create mode 100644 documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 documentation/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 documentation/modules/images/forklift-logo-darkbg.png create mode 100644 documentation/modules/images/forklift-logo-darkbg.svg create mode 100644 documentation/modules/images/forklift-logo-lightbg.png create mode 100644 documentation/modules/images/forklift-logo-lightbg.svg create mode 100644 documentation/modules/images/kebab.png create mode 100644 documentation/modules/images/mtv-ui.png create mode 100644 documentation/modules/increasing-nfc-memory-vmware-host/index.html create mode 100644 documentation/modules/installing-mtv-operator/index.html create mode 100644 documentation/modules/issue_templates/issue.md create mode 100644 documentation/modules/issue_templates/issue/index.html create mode 100644 documentation/modules/known-issues-2-7/index.html create mode 100644 documentation/modules/making-open-source-more-inclusive/index.html create mode 100644 documentation/modules/migration-plan-options-ui/index.html create mode 100644 documentation/modules/mtv-changelog-2-7/index.html create mode 100644 documentation/modules/mtv-overview-page/index.html create mode 100644 documentation/modules/mtv-performance-addendum/index.html create mode 100644 documentation/modules/mtv-performance-recommendation/index.html create mode 100644 documentation/modules/mtv-resources-and-services/index.html create mode 100644 documentation/modules/mtv-selected-packages-2-7/index.html create mode 100644 documentation/modules/mtv-settings/index.html create mode 100644 documentation/modules/mtv-ui/index.html create mode 100644 documentation/modules/mtv-workflow/index.html create mode 100644 documentation/modules/network-prerequisites/index.html create mode 100644 documentation/modules/new-features-and-enhancements-2-7/index.html create mode 100644 documentation/modules/new-migrating-virtual-machines-cli/index.html create mode 100644 documentation/modules/non-admin-permissions-for-ui/index.html create mode 100644 documentation/modules/obtaining-console-url/index.html create mode 100644 documentation/modules/openstack-prerequisites/index.html create mode 100644 documentation/modules/ostack-app-cred-auth/index.html create mode 100644 documentation/modules/ostack-token-auth/index.html create mode 100644 documentation/modules/ova-prerequisites/index.html create mode 100644 documentation/modules/retrieving-validation-service-json/index.html create mode 100644 documentation/modules/retrieving-vmware-moref/index.html create mode 100644 documentation/modules/rhv-prerequisites/index.html create mode 100644 documentation/modules/rn-2.0/index.html create mode 100644 documentation/modules/rn-2.1/index.html create mode 100644 documentation/modules/rn-2.2/index.html create mode 100644 documentation/modules/rn-2.3/index.html create mode 100644 documentation/modules/rn-2.4/index.html create mode 100644 documentation/modules/rn-2.5/index.html create mode 100644 documentation/modules/rn-2.6/index.html create mode 100644 documentation/modules/rn-2.7/index.html create mode 100644 documentation/modules/rn-27-resolved-issues/index.html create mode 100644 documentation/modules/running-migration-plan/index.html create mode 100644 documentation/modules/selecting-migration-network-for-virt-provider/index.html create mode 100644 documentation/modules/selecting-migration-network-for-vmware-source-provider/index.html create mode 100644 documentation/modules/selecting-migration-network/index.html create mode 100644 documentation/modules/snip-certificate-options/index.html create mode 100644 documentation/modules/snip-migrating-luns/index.html create mode 100644 documentation/modules/snip_cold-warm-comparison-table/index.html create mode 100644 documentation/modules/snip_measured_boot_windows_vm/index.html create mode 100644 documentation/modules/snip_performance/index.html create mode 100644 documentation/modules/snip_permissions-info/index.html create mode 100644 documentation/modules/snip_plan-limits/index.html create mode 100644 documentation/modules/snip_qemu-guest-agent/index.html create mode 100644 documentation/modules/snip_secure_boot_issue/index.html create mode 100644 documentation/modules/snip_vmware-name-change/index.html create mode 100644 documentation/modules/snip_vmware-permissions/index.html create mode 100644 documentation/modules/snip_vmware_esxi_nfc/index.html create mode 100644 documentation/modules/snippet_getting_web_console_url_cli/index.html create mode 100644 documentation/modules/snippet_getting_web_console_url_web/index.html create mode 100644 documentation/modules/snippet_ova_tech_preview/index.html create mode 100644 documentation/modules/source-vm-prerequisites/index.html create mode 100644 documentation/modules/storage-support/index.html create mode 100644 documentation/modules/technical-changes-2-7/index.html create mode 100644 documentation/modules/technology-preview/index.html create mode 100644 documentation/modules/uninstalling-mtv-cli/index.html create mode 100644 documentation/modules/uninstalling-mtv-ui/index.html create mode 100644 documentation/modules/updating-validation-rules-version/index.html create mode 100644 documentation/modules/upgrading-mtv-ui/index.html create mode 100644 documentation/modules/using-must-gather/index.html create mode 100644 documentation/modules/virt-migration-workflow/index.html create mode 100644 documentation/modules/vmware-prerequisites/index.html create mode 100644 feed.xml create mode 100644 index.html create mode 100644 jekyll-theme-cayman.gemspec create mode 100644 modules/about-cold-warm-migration/index.html create mode 100644 modules/about-hook-crs-for-migration-plans-api/index.html create mode 100644 modules/about-rego-files/index.html create mode 100644 modules/accessing-default-validation-rules/index.html create mode 100644 modules/accessing-logs-cli/index.html create mode 100644 modules/accessing-logs-ui/index.html create mode 100644 modules/adding-hook-crs-to-migration-plans-api/index.html create mode 100644 modules/adding-source-provider/index.html create mode 100644 modules/adding-virt-provider/index.html create mode 100644 modules/canceling-migration-cli/index.html create mode 100644 modules/canceling-migration-ui/index.html create mode 100644 modules/changing-precopy-intervals/index.html create mode 100644 modules/collected-logs-cr-info/index.html create mode 100644 modules/common-attributes/index.html create mode 100644 modules/compatibility-guidelines/index.html create mode 100644 modules/configuring-mtv-operator/index.html create mode 100644 modules/creating-migration-plan-2-6-3/index.html create mode 100644 modules/creating-migration-plan/index.html create mode 100644 modules/creating-network-mapping/index.html create mode 100644 modules/creating-storage-mapping/index.html create mode 100644 modules/creating-validation-rule/index.html create mode 100644 modules/creating-vddk-image/index.html create mode 100644 modules/error-messages/index.html create mode 100644 modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg create mode 100644 modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg create mode 100644 modules/images/forklift-logo-darkbg.png create mode 100644 modules/images/forklift-logo-darkbg.svg create mode 100644 modules/images/forklift-logo-lightbg.png create mode 100644 modules/images/forklift-logo-lightbg.svg create mode 100644 modules/images/kebab.png create mode 100644 modules/images/mtv-ui.png create mode 100644 modules/increasing-nfc-memory-vmware-host/index.html create mode 100644 modules/installing-mtv-operator/index.html create mode 100644 modules/issue_templates/issue.md create mode 100644 modules/issue_templates/issue/index.html create mode 100644 modules/known-issues-2-7/index.html create mode 100644 modules/making-open-source-more-inclusive/index.html create mode 100644 modules/migration-plan-options-ui/index.html create mode 100644 modules/mtv-changelog-2-7/index.html create mode 100644 modules/mtv-overview-page/index.html create mode 100644 modules/mtv-performance-addendum/index.html create mode 100644 modules/mtv-performance-recommendation/index.html create mode 100644 modules/mtv-resources-and-services/index.html create mode 100644 modules/mtv-selected-packages-2-7/index.html create mode 100644 modules/mtv-settings/index.html create mode 100644 modules/mtv-ui/index.html create mode 100644 modules/mtv-workflow/index.html create mode 100644 modules/network-prerequisites/index.html create mode 100644 modules/new-features-and-enhancements-2-7/index.html create mode 100644 modules/new-migrating-virtual-machines-cli/index.html create mode 100644 modules/non-admin-permissions-for-ui/index.html create mode 100644 modules/obtaining-console-url/index.html create mode 100644 modules/openstack-prerequisites/index.html create mode 100644 modules/ostack-app-cred-auth/index.html create mode 100644 modules/ostack-token-auth/index.html create mode 100644 modules/ova-prerequisites/index.html create mode 100644 modules/retrieving-validation-service-json/index.html create mode 100644 modules/retrieving-vmware-moref/index.html create mode 100644 modules/rhv-prerequisites/index.html create mode 100644 modules/rn-2.0/index.html create mode 100644 modules/rn-2.1/index.html create mode 100644 modules/rn-2.2/index.html create mode 100644 modules/rn-2.3/index.html create mode 100644 modules/rn-2.4/index.html create mode 100644 modules/rn-2.5/index.html create mode 100644 modules/rn-2.6/index.html create mode 100644 modules/rn-2.7/index.html create mode 100644 modules/rn-27-resolved-issues/index.html create mode 100644 modules/running-migration-plan/index.html create mode 100644 modules/selecting-migration-network-for-virt-provider/index.html create mode 100644 modules/selecting-migration-network-for-vmware-source-provider/index.html create mode 100644 modules/selecting-migration-network/index.html create mode 100644 modules/snip-certificate-options/index.html create mode 100644 modules/snip-migrating-luns/index.html create mode 100644 modules/snip_cold-warm-comparison-table/index.html create mode 100644 modules/snip_measured_boot_windows_vm/index.html create mode 100644 modules/snip_performance/index.html create mode 100644 modules/snip_permissions-info/index.html create mode 100644 modules/snip_plan-limits/index.html create mode 100644 modules/snip_qemu-guest-agent/index.html create mode 100644 modules/snip_secure_boot_issue/index.html create mode 100644 modules/snip_vmware-name-change/index.html create mode 100644 modules/snip_vmware-permissions/index.html create mode 100644 modules/snip_vmware_esxi_nfc/index.html create mode 100644 modules/snippet_getting_web_console_url_cli/index.html create mode 100644 modules/snippet_getting_web_console_url_web/index.html create mode 100644 modules/snippet_ova_tech_preview/index.html create mode 100644 modules/source-vm-prerequisites/index.html create mode 100644 modules/storage-support/index.html create mode 100644 modules/technical-changes-2-7/index.html create mode 100644 modules/technology-preview/index.html create mode 100644 modules/uninstalling-mtv-cli/index.html create mode 100644 modules/uninstalling-mtv-ui/index.html create mode 100644 modules/updating-validation-rules-version/index.html create mode 100644 modules/upgrading-mtv-ui/index.html create mode 100644 modules/using-must-gather/index.html create mode 100644 modules/virt-migration-workflow/index.html create mode 100644 modules/vmware-prerequisites/index.html create mode 100644 redirects.json create mode 100644 robots.txt create mode 100644 sitemap.xml diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..4993baf651d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +forklift-docs.konveyor.io diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..ddee4673182 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +konveyor.io. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..7f375065b01 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing to Forklift documentation + +This project is [Apache 2.0 licensed](LICENSE) and accepts contributions via +GitHub pull requests. + +Read the [Guidelines for Red Hat Documentation](https://redhat-documentation.github.io/) before opening a pull request. + +### Upstream and downstream variables + +This document uses the following variables to ensure that upstream and downstream product names and versions are rendered correctly. + +| Variable | Upstream value | Downstream value | +| -------- | -------------- | ---------------- | +| project-full | Forklift | Migration Toolkit for Virtualization | +| project-short | Forklift | MTV | +| project-version | 2.0 | 2.0 | +| virt | KubeVirt | OpenShift Virtualization | +| ocp | OKD | Red Hat OpenShift Container Platform | +| ocp-version | 4.7 | 4.7 | +| ocp-short | OKD | OCP | + +Variables cannot be used in CLI commands or code blocks unless you include the "attributes" keyword: + + [options="nowrap" subs="+quotes,+attributes"] + ---- + # ls {VariableName} + ---- + +You can hide or show specific blocks, paragraphs, warnings or chapters with the `build` variable. Its value can be set to "downstream" or "upstream": + + ifeval::["build" == "upstream"] + This content is only relevant for Forklift. + endif::[] diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000000..c7b0183bfd4 --- /dev/null +++ b/Gemfile @@ -0,0 +1,31 @@ +# frozen_string_literal: true +# Encoding.default_external = Encoding::UTF_8 +# Encoding.default_internal = Encoding::UTF_8 + +source "https://rubygems.org" + +# gem "asciidoctor-pdf" +gem "asciidoctor" +# gem "bundle" +# gem "html-proofer" +# gem "jekyll-theme-minimal" +# gem "jekyll-feed" +gem "jekyll-paginate" +# gem "jekyll-redirect-from" +# gem "jekyll-sitemap" +# gem "jekyll-tagging" +# gem 'jekyll-seo-tag' +# gem "jekyll", ">= 3.5" +# gem "premonition", ">= 4.0.0" +# gem "pygments.rb" +# gem "rake" +# +# +gem "github-pages", group: :jekyll_plugins + +# ensures that jekyll-asciidoc is loaded first +group :jekyll_plugins do + gem 'jekyll-asciidoc' +end + +gemspec diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000000..c7aec156081 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,325 @@ +PATH + remote: . + specs: + jekyll-theme-cayman (0.1.1) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.2.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + asciidoctor (2.0.23) + ast (2.4.2) + base64 (0.2.0) + benchmark (0.4.0) + bigdecimal (3.1.8) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + colorator (1.1.0) + commonmarker (0.23.10) + concurrent-ruby (1.3.4) + connection_pool (2.4.1) + csv (3.3.0) + dnsruby (1.72.2) + simpleidn (~> 0.2.1) + drb (2.2.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.10.0) + faraday (2.12.0) + faraday-net_http (>= 2.0, < 3.4) + json + logger + faraday-net_http (3.3.0) + net-http + ffi (1.17.0-x86_64-linux-musl) + forwardable-extended (2.6.0) + gemoji (4.1.0) + github-pages (232) + github-pages-health-check (= 1.18.2) + jekyll (= 3.10.0) + jekyll-avatar (= 0.8.0) + jekyll-coffeescript (= 1.2.2) + jekyll-commonmark-ghpages (= 0.5.1) + jekyll-default-layout (= 0.1.5) + jekyll-feed (= 0.17.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.16.1) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.13.0) + kramdown (= 2.4.0) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.16.2, < 2.0) + rouge (= 3.30.0) + terminal-table (~> 1.4) + webrick (~> 1.8) + github-pages-health-check (1.18.2) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (>= 4, < 8) + public_suffix (>= 3.0, < 6.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + html-proofer (3.19.4) + addressable (~> 2.3) + mercenary (~> 0.3) + nokogiri (~> 1.13) + parallel (~> 1.10) + rainbow (~> 3.0) + typhoeus (~> 1.3) + yell (~> 2.0) + http_parser.rb (0.8.0) + i18n (1.14.6) + concurrent-ruby (~> 1.0) + jekyll (3.10.0) + addressable (~> 2.4) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + webrick (>= 1.0) + jekyll-asciidoc (3.0.1) + asciidoctor (>= 1.5.0, < 3.0.0) + jekyll (>= 3.0.0) + jekyll-avatar (0.8.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.2.2) + coffee-script (~> 2.2) + coffee-script-source (~> 1.12) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.5.1) + commonmarker (>= 0.23.7, < 1.1.0) + jekyll (>= 3.9, < 4.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.5) + jekyll (>= 3.0, < 5.0) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.16.1) + jekyll (>= 3.4, < 5.0) + octokit (>= 4, < 7, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.8.1) + kramdown (2.4.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.6.1) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.25.1) + net-http (0.5.0) + uri + nokogiri (1.16.7-x86_64-linux) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + parallel (1.26.3) + parser (3.3.6.0) + ast (~> 2.4.1) + racc + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (5.1.1) + racc (1.8.1) + rainbow (3.1.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + regexp_parser (2.9.2) + rexml (3.3.9) + rouge (3.30.0) + rubocop (0.93.1) + parallel (~> 1.10) + parser (>= 2.7.1.5) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8) + rexml + rubocop-ast (>= 0.6.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 2.0) + rubocop-ast (1.35.0) + parser (>= 3.3.1.0) + ruby-progressbar (1.13.0) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + securerandom (0.3.2) + simpleidn (0.2.3) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.1) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (1.8.0) + uri (1.0.1) + w3c_validators (1.3.7) + json (>= 1.8) + nokogiri (~> 1.6) + rexml (~> 3.2) + webrick (1.9.0) + yell (2.2.2) + +PLATFORMS + x86_64-linux-musl + +DEPENDENCIES + asciidoctor + github-pages + html-proofer (~> 3.0) + jekyll-asciidoc + jekyll-paginate + jekyll-theme-cayman! + rubocop (~> 0.50) + w3c_validators (~> 1.3) + +BUNDLED WITH + 2.3.25 diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..d6456956733 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 00000000000..266420bdba9 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,352 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700"); +html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } + +/** Remove default margin. */ +body { margin: 0; } + +/* HTML5 display definitions ========================================================================== */ +/** Correct `block` display not defined for any HTML5 element in IE 8/9. Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. Correct `block` display not defined for `main` in IE 11. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } + +/** 1. Correct `inline-block` display not defined in IE 8/9. 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. */ +audio, canvas, progress, video { display: inline-block; /* 1 */ vertical-align: baseline; /* 2 */ } + +/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ +audio:not([controls]) { display: none; height: 0; } + +/** Address `[hidden]` styling not present in IE 8/9/10. Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. */ +[hidden], template { display: none; } + +/* Links ========================================================================== */ +/** Remove the gray background color from active links in IE 10. */ +a { background-color: transparent; } + +/** Improve readability when focused and also mouse hovered in all browsers. */ +a:active, a:hover { outline: 0; } + +/* Text-level semantics ========================================================================== */ +/** Address styling not present in IE 8/9/10/11, Safari, and Chrome. */ +abbr[title] { border-bottom: 1px dotted; } + +/** Address style set to `bolder` in Firefox 4+, Safari, and Chrome. */ +b, strong { font-weight: bold; } + +/** Address styling not present in Safari and Chrome. */ +dfn { font-style: italic; } + +/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari, and Chrome. */ +h1 { font-size: 2em; margin: 0.67em 0; } + +/** Address styling not present in IE 8/9. */ +mark { background: #ff0; color: #000; } + +/** Address inconsistent and variable font size in all browsers. */ +small { font-size: 80%; } + +/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } + +sup { top: -0.5em; } + +sub { bottom: -0.25em; } + +/* Embedded content ========================================================================== */ +/** Remove border when inside `a` element in IE 8/9/10. */ +img { border: 0; } + +/** Correct overflow not hidden in IE 9/10/11. */ +svg:not(:root) { overflow: hidden; } + +/* Grouping content ========================================================================== */ +/** Address margin not present in IE 8/9 and Safari. */ +figure { margin: 1em 40px; } + +/** Address differences between Firefox and other browsers. */ +hr { box-sizing: content-box; height: 0; } + +/** Contain overflow in all browsers. */ +pre { overflow: auto; } + +/** Address odd `em`-unit font size rendering in all browsers. */ +code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } + +/* Forms ========================================================================== */ +/** Known limitation: by default, Chrome and Safari on OS X allow very limited styling of `select`, unless a `border` property is set. */ +/** 1. Correct color not being inherited. Known issue: affects color of disabled elements. 2. Correct font properties not being inherited. 3. Address margins set differently in Firefox 4+, Safari, and Chrome. */ +button, input, optgroup, select, textarea { color: inherit; /* 1 */ font: inherit; /* 2 */ margin: 0; /* 3 */ } + +/** Address `overflow` set to `hidden` in IE 8/9/10/11. */ +button { overflow: visible; } + +/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. Correct `select` style inheritance in Firefox. */ +button, select { text-transform: none; } + +/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ +button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } + +/** Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { cursor: default; } + +/** Remove inner padding and border in Firefox 4+. */ +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } + +/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ +input { line-height: normal; } + +/** It's recommended that you don't attempt to style these elements. Firefox's implementation doesn't respect box-sizing, padding, or width. 1. Address box sizing set to `content-box` in IE 8/9/10. 2. Remove excess padding in IE 8/9/10. */ +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } + +/** Fix the cursor style for Chrome's increment/decrement buttons. For certain `font-size` values of the `input`, it causes the cursor style of the decrement button to change from `default` to `text`. */ +input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } + +/** 1. Address `appearance` set to `searchfield` in Safari and Chrome. 2. Address `box-sizing` set to `border-box` in Safari and Chrome (include `-moz` to future-proof). */ +input[type="search"] { -webkit-appearance: textfield; /* 1 */ /* 2 */ box-sizing: content-box; } + +/** Remove inner padding and search cancel button in Safari and Chrome on OS X. Safari (but not Chrome) clips the cancel button when the search input has padding (and `textfield` appearance). */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/** Define consistent border, margin, and padding. */ +fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } + +/** 1. Correct `color` not being inherited in IE 8/9/10/11. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ +legend { border: 0; /* 1 */ padding: 0; /* 2 */ } + +/** Remove default vertical scrollbar in IE 8/9/10/11. */ +textarea { overflow: auto; } + +/** Don't inherit the `font-weight` (applied by a rule above). NOTE: the default cannot safely be changed in Chrome and Safari on OS X. */ +optgroup { font-weight: bold; } + +/* Tables ========================================================================== */ +/** Remove most spacing between table cells. */ +table { border-collapse: collapse; border-spacing: 0; } + +td, th { padding: 0; } + +.highlight table td { padding: 5px; } + +.highlight table pre { margin: 0; } + +.highlight .cm { color: #999988; font-style: italic; } + +.highlight .cp { color: #999999; font-weight: bold; } + +.highlight .c1 { color: #999988; font-style: italic; } + +.highlight .cs { color: #999999; font-weight: bold; font-style: italic; } + +.highlight .c, .highlight .cd { color: #999988; font-style: italic; } + +.highlight .err { color: #a61717; background-color: #e3d2d2; } + +.highlight .gd { color: #000000; background-color: #ffdddd; } + +.highlight .ge { color: #000000; font-style: italic; } + +.highlight .gr { color: #aa0000; } + +.highlight .gh { color: #999999; } + +.highlight .gi { color: #000000; background-color: #ddffdd; } + +.highlight .go { color: #888888; } + +.highlight .gp { color: #555555; } + +.highlight .gs { font-weight: bold; } + +.highlight .gu { color: #aaaaaa; } + +.highlight .gt { color: #aa0000; } + +.highlight .kc { color: #000000; font-weight: bold; } + +.highlight .kd { color: #000000; font-weight: bold; } + +.highlight .kn { color: #000000; font-weight: bold; } + +.highlight .kp { color: #000000; font-weight: bold; } + +.highlight .kr { color: #000000; font-weight: bold; } + +.highlight .kt { color: #445588; font-weight: bold; } + +.highlight .k, .highlight .kv { color: #000000; font-weight: bold; } + +.highlight .mf { color: #009999; } + +.highlight .mh { color: #009999; } + +.highlight .il { color: #009999; } + +.highlight .mi { color: #009999; } + +.highlight .mo { color: #009999; } + +.highlight .m, .highlight .mb, .highlight .mx { color: #009999; } + +.highlight .sb { color: #d14; } + +.highlight .sc { color: #d14; } + +.highlight .sd { color: #d14; } + +.highlight .s2 { color: #d14; } + +.highlight .se { color: #d14; } + +.highlight .sh { color: #d14; } + +.highlight .si { color: #d14; } + +.highlight .sx { color: #d14; } + +.highlight .sr { color: #009926; } + +.highlight .s1 { color: #d14; } + +.highlight .ss { color: #990073; } + +.highlight .s { color: #d14; } + +.highlight .na { color: #008080; } + +.highlight .bp { color: #999999; } + +.highlight .nb { color: #0086B3; } + +.highlight .nc { color: #445588; font-weight: bold; } + +.highlight .no { color: #008080; } + +.highlight .nd { color: #3c5d5d; font-weight: bold; } + +.highlight .ni { color: #800080; } + +.highlight .ne { color: #990000; font-weight: bold; } + +.highlight .nf { color: #990000; font-weight: bold; } + +.highlight .nl { color: #990000; font-weight: bold; } + +.highlight .nn { color: #555555; } + +.highlight .nt { color: #000080; } + +.highlight .vc { color: #008080; } + +.highlight .vg { color: #008080; } + +.highlight .vi { color: #008080; } + +.highlight .nv { color: #008080; } + +.highlight .ow { color: #000000; font-weight: bold; } + +.highlight .o { color: #000000; font-weight: bold; } + +.highlight .w { color: #bbbbbb; } + +.highlight { background-color: #f8f8f8; } + +* { box-sizing: border-box; } + +body { padding: 0; margin: 0; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.5; color: #606c71; } + +#skip-to-content { height: 1px; width: 1px; position: absolute; overflow: hidden; top: -10px; } +#skip-to-content:focus { position: fixed; top: 10px; left: 10px; height: auto; width: auto; background: #e19447; outline: thick solid #e19447; } + +a { color: #1e6bb8; text-decoration: none; } +a:hover { text-decoration: underline; } + +.btn { display: inline-block; margin-bottom: 1rem; color: rgba(255, 255, 255, 0.7); background-color: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); border-style: solid; border-width: 1px; border-radius: 0.3rem; transition: color 0.2s, background-color 0.2s, border-color 0.2s; } +.btn:hover { color: rgba(255, 255, 255, 0.8); text-decoration: none; background-color: rgba(255, 255, 255, 0.2); border-color: rgba(255, 255, 255, 0.3); } +.btn + .btn { margin-left: 1rem; } +@media screen and (min-width: 64em) { .btn { padding: 0.75rem 1rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .btn { padding: 0.6rem 0.9rem; font-size: 0.9rem; } } +@media screen and (max-width: 42em) { .btn { display: block; width: 100%; padding: 0.75rem; font-size: 0.9rem; } + .btn + .btn { margin-top: 1rem; margin-left: 0; } } + +.page-header { color: #fff; text-align: center; background-color: #1f2067; background-image: linear-gradient(90deg, #3b3c93, #1f2067); } +@media screen and (min-width: 64em) { .page-header { padding: 5rem 6rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .page-header { padding: 3rem 4rem; } } +@media screen and (max-width: 42em) { .page-header { padding: 2rem 1rem; } } + +.project-name { margin-top: 0; margin-bottom: 0.1rem; } +@media screen and (min-width: 64em) { .project-name { font-size: 3.25rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .project-name { font-size: 2.25rem; } } +@media screen and (max-width: 42em) { .project-name { font-size: 1.75rem; } } + +.project-tagline { margin-bottom: 2rem; font-weight: normal; opacity: 0.7; } +@media screen and (min-width: 64em) { .project-tagline { font-size: 1.25rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .project-tagline { font-size: 1.15rem; } } +@media screen and (max-width: 42em) { .project-tagline { font-size: 1rem; } } + +.main-content { word-wrap: break-word; } +.main-content :first-child { margin-top: 0; } +@media screen and (min-width: 64em) { .main-content { max-width: 64rem; padding: 2rem 6rem; margin: 0 auto; font-size: 1.1rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .main-content { padding: 2rem 4rem; font-size: 1.1rem; } } +@media screen and (max-width: 42em) { .main-content { padding: 2rem 1rem; font-size: 1rem; } } +.main-content kbd { background-color: #fafbfc; border: 1px solid #c6cbd1; border-bottom-color: #959da5; border-radius: 3px; box-shadow: inset 0 -1px 0 #959da5; color: #444d56; display: inline-block; font-size: 11px; line-height: 10px; padding: 3px 5px; vertical-align: middle; } +.main-content img { max-width: 100%; } +.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6 { margin-top: 2rem; margin-bottom: 1rem; font-weight: normal; color: #3d3c93; } +.main-content p { margin-bottom: 1em; } +.main-content code { padding: 2px 4px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 0.9rem; color: #567482; background-color: #f3f6fa; border-radius: 0.3rem; } +.main-content pre { padding: 0.8rem; margin-top: 0; margin-bottom: 1rem; font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace; color: #567482; word-wrap: normal; background-color: #f3f6fa; border: solid 1px #dce6f0; border-radius: 0.3rem; } +.main-content pre > code { padding: 0; margin: 0; font-size: 0.9rem; color: #567482; word-break: normal; white-space: pre; background: transparent; border: 0; } +.main-content .highlight { margin-bottom: 1rem; } +.main-content .highlight pre { margin-bottom: 0; word-break: normal; } +.main-content .highlight pre, .main-content pre { padding: 0.8rem; overflow: auto; font-size: 0.9rem; line-height: 1.45; border-radius: 0.3rem; -webkit-overflow-scrolling: touch; } +.main-content pre code, .main-content pre tt { display: inline; max-width: initial; padding: 0; margin: 0; overflow: initial; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } +.main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after { content: normal; } +.main-content ul, .main-content ol { margin-top: 0; } +.main-content blockquote { padding: 0 1rem; margin-left: 0; color: #819198; border-left: 0.3rem solid #dce6f0; } +.main-content blockquote > :first-child { margin-top: 0; } +.main-content blockquote > :last-child { margin-bottom: 0; } +.main-content table { display: block; width: 100%; overflow: auto; word-break: normal; word-break: keep-all; -webkit-overflow-scrolling: touch; } +.main-content table th { font-weight: bold; } +.main-content table th, .main-content table td { padding: 0.5rem 1rem; border: 1px solid #e9ebec; } +.main-content dl { padding: 0; } +.main-content dl dt { padding: 0; margin-top: 1rem; font-size: 1rem; font-weight: bold; } +.main-content dl dd { padding: 0; margin-bottom: 1rem; } +.main-content hr { height: 2px; padding: 0; margin: 1rem 0; background-color: #eff0f1; border: 0; } + +.site-footer { padding-top: 2rem; margin-top: 2rem; border-top: solid 1px #eff0f1; } +@media screen and (min-width: 64em) { .site-footer { font-size: 1rem; } } +@media screen and (min-width: 42em) and (max-width: 64em) { .site-footer { font-size: 1rem; } } +@media screen and (max-width: 42em) { .site-footer { font-size: 0.9rem; } } + +.site-footer-owner { display: block; font-weight: bold; } + +.site-footer-credits { color: #819198; } + +h1#logo img { max-width: 100%; } + +h1#logo { margin-bottom: 0; } + +.main-logo { position: relative; z-index: 9; max-width: 70%; display: block; margin: 0 auto; margin-bottom: -5em; } + +.belt { width: 100%; color: #fff; } + +@keyframes beltmove { 100% { stroke-dashoffset: 600; } } +.belt path { transform: skew(-45deg); stroke-width: 35; stroke-dasharray: 2 10 2 10 2 10 2 10 2 10; animation: beltmove 20s linear infinite; } + +.main-logo use { fill: #a73; opacity: 0; animation: convey 3s linear forwards; } + +use:nth-child(1) { animation-delay: 5s; } + +use:nth-child(2) { animation-delay: 3s; } + +use:nth-child(3) { animation-delay: 1s; } + +@keyframes convey { 0% { transform: translate(40%, 40%); opacity: 0; } + 20% { opacity: 1; } + 80% { transform: translate(0%, 40%); } + 100% { opacity: 1; } } +@keyframes convey2 { 0% { transform: translate(50%, 60%); opacity: 0; } + 20% { opacity: 1; } + 80% { transform: translate(0%, 60%); } + 100% { opacity: 1; } } +use:nth-child(1) { animation: convey2 3s linear forwards 5s; } diff --git a/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot b/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot new file mode 100755 index 0000000000000000000000000000000000000000..03bf93fec2a7341b1a6192ff0d596b05c1765c93 GIT binary patch literal 16716 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 aO1sP&w|8H~0KVcsPu#OW` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf b/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf new file mode 100755 index 0000000000000000000000000000000000000000..4599e3ca9af9bf758f3b5d0b79314701f853c371 GIT binary patch literal 29704 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 b/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..55fc44bcd1257bb772fb9c041cea4ad61381224f GIT binary patch literal 9724 zcmV5XbXcl00bZff>;M28(=%LqIR@i+KVFC zIEe=g*HM({O_lv061Xu0dqe9PMWR$KG{n)I_BJjS4by7c(RdWy@-Cf{UGU%0Ax?xa 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

;(FD;K}#opskZpBcOOtLB-BMn(Ptu%pT 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf b/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..6640dbeb333be6474e52c20ced829b8c071634cd GIT binary patch literal 28932 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 Zg>x^Qd*R#*=U!G_8GbU#&kp(1`UCwMR@49h literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff b/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff new file mode 100755 index 0000000000000000000000000000000000000000..209739eeb0921ce1475ed1f357911ef9faaf0f3b GIT binary patch literal 12612 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf b/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..7f75a2d90964f801e9b9f916fc77d0fb46071a09 GIT binary patch literal 26644 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 Tox|}wpnWXuG8F&21R?()4C4-I literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff b/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff new file mode 100755 index 0000000000000000000000000000000000000000..6dce67cede1847a0bb49092dbd2203b1bfac8b91 GIT binary patch literal 12536 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 Di>nx! literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 b/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..a9c14c4920648bc420b1d68cf13d6672af6ded3c GIT binary patch literal 9572 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 O$@oD12Gp?wlQ{ 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 Ez~snGSpWb4 literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg b/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg new file mode 100644 index 00000000000..bd2894d6a27 --- /dev/null +++ b/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf b/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a83bbf9fc8935b8187f289299a802aa01ca008f7 GIT binary patch literal 29288 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 E0c9`PF#rGn literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff b/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff new file mode 100755 index 0000000000000000000000000000000000000000..17c85006d0de2c50a19dd67150ef4d825c92fb9c GIT binary patch literal 12840 zcmZvDQ*>rc(C(Xwok=G4#I`1$*tTu!jVHEkYhpW@*tTuHv2*hM|G799r}utVuX=WM zb#<*>ebKwNo1Ca901WWem?;5B|MijrU-JJj|4ILE6B8B@1pvT=zc~Ics6)Vl+lk4` zDSdH)001~V001ql$r;Nbrlj&40Dy@7(n0tipabCKlo*)5xXdqE|3A3Rq~RIa7}$St zZ(s7lmksvi`t=Pn1E((za{h}$`5#~aNX)F=O~1H(0DwXl0N}#HH@_G*H!&~<0Oc z77|UScpC%Y*St*s*(3T7;7*X-wgxsPU)GpO`&R?(3I2er;UN_GJ`IZp_7^;Q?NIio`ZuU#tgx`gyC6VxXKmwt!EUX|2EsGcW-YD1DNCXzmNtI~+bq-K zD9Yi|eKZI>lQa|9(U3mtMQ@g5y6?cxU(^x1g!PB$pWl1qs$M(L9lIzKX!ehvFmKQDv(y_w?<4w6}QpC5YitVnIn(Yd;Oq(j$5co2Kts zc4m)RkKxt+&@Tixp%jT2w}RLQqv(c3>SU^GMwRMj*1U+Uv&ys(_>R9$@-qlLo>y$m z?x!?-vmr4w4AaoPiF<`ZQAuR|NvURy !MOL$lwsjXi4GHp81C?UkMMkMGR(>&`4 zu4Bb`W>h7y4^IErxRO+e`~O-zS>pIdB!s}yOId%IYV?2Y{tgU7ArsAnkWeffNu~KR zTTxf+J*H;o^p?T!wo;|q`m(`7iAnRU_o};hj#=)dy<=zk0!)~K$eY?6jdoLnv2|>3 zd7aDPDDqX|`IyLfS}9eLZ5La-sj}rP$yitHrrX>RWAKvPO7^yK>PKKcDU7i7I5v@b zU`MQT?Oxg7?FNDW7m!uSi=s%!d$?M~3e@sS6&m)D6Gk-(9p^bA27d3X!?gdOzso|& zcyjKK%(sMkhqc=^=}KO1{-asWGcw4XcJ-J6Hb_3NS4Q(J4p&2Hn|r#fkRLKp+#@3N zd%+M(CYv>`diIC35_}O$49qXS((Eg%;Qr_ON>_+Duvh>j z00uH0@+-^12>-VSp8=SD1HgRy1`qiS0utieH;8S3|EB-|`1v)K_zM6TIaxV?008j$ z4ioiW3IM=FeN!g_faPp0eeE}rkWF7IL;wgNSX2y|av&HA6ttV$R)|nQVEX~d4r_

kN=vRciky;L+ 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 b/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..a87d9cd7c6124a9fb103fe349dd91f55eed52c5b GIT binary patch literal 9932 zcmV;-CNtT0Pew8T0RR9104B@;4gdfE07^gr048?;0SY|;00000000000000000000 z0000QSR0N+91I3v0D?9V5DM}b+B5++0we>5XbXcl00bZff-VOj8?ie@2V&Sb0K(%p z8bvJ*q&lN05tJ(X|8hJTqOf|0BV#Utu-P=>pcG2r7N^s|*P&wijc5^m=MIiAJx(h^ zriqOBwdLEtark4i*_$4Dr`fPFy!>0nt1cpk5+o1N+M{o0XYT^YE*?-3sCaB^QB^jw zwQNbFMGKNxIKV&V|8$qMWi5sL!x%L0kTfiX@+cR^lyxYFaSXvWJ9B8ys$pUjf{j6_ zfMVpBC>AzoW7Mz`QS2ExXZ3#CYuCgL?=RKYTsVQGhurWlrEe+2GDfG4P3M#tjmLNU z0DLV270xrB>B#4CIXoVR%LBFcs$W3T3Ar*ZCtPA|l)7wiXTxL(3yw$_)D^z+s`_gg zRE?}QoqwI?Dp|=p6=@^dx=b3ijr#vfvj6{*Q2{xGvX5lvKq<-R^gTIF0bskSuUlDi zu07>YIRKanxDihs#`4@@SbCk>v9IvtUX^!r4eYB!wnZI8$);oTS#=xJj{Y2Wt{_1$ zL;|kwpVa`Y04~R*ZU6yo5b=Q2Z1aH(dz(l_vErVLieke%?WrgZ+6s59xEieZ6|f8} zQSgO7n;Z{h?kCgY0Q8B_R0c4_4?vB$LVC)x6cllHlNms!n+2j{%(4Q}R-)$rgrgUd zlDBezttqF8`{{<9T&kb9TFp?3x~5wW49A{69iB<4ZmSPX$@I@sa>|HoO*uKBgY;** zlD46=;yCH2UW=TpOF0vZ55&tsn94fR1dS+wm{TX>Un1-)g$v@yJ93sK}UH!MS7Ek%%ER3Ra(ijE;c zq9n;7tIU=oSDt(Yj$$cPq*#?|HEPvir+UHBpiygXi;@SAMwHwQdlXCFUx|LC9V!18 zK1cuVma5(qv>QXE6 zp*Fc%>S=KUtvfN*cIWLXR)r`?RaGN^g*Nw&XWN?5zM}({^whS=GgaI0m@Ob6gZZ`0 zs9r}zL~eqg?W`jEPL5o8@)bCWrBIP#RjSpfRfiqwA4kJ@V_&q{mR3n5!{8u$0DuVe zJ?<0id2(C(Brm(WJX)xp6hJ09Dk$Sg5C8xYisW#@j5B^lw0WIM&lg)A0Xkk92%zou zFX~^244@IqN90KJ{`mveH=`bV0j^xD4URzlzhwRY2I#&Z4)5W4{reQ;#W4rigI}fj zssxU6I|evoX9T#~l};QSL6xO2f7qCDH+R2%|JUwsK5;ryyAyZ!$Uv2#YETWR4HO4W zg^p-QX~_Qjms}UXI0_UZ+vqmomLIL&K^m$6Rq1X0cZakC9@QE2TIWsp-zzk#4bQ)q z>T!Ki(S`rteBd~x*?>ru;Ji7~D@LmBqztxFqC0M!ZY6Azjm^cW9Bz7TDobbQ6$7N2HT@N-K8-; zT?RzvxewagYH(GHpKF!{Tyz8;@)}ZriHKg+&gZNRoSA6B$?#`+zmj56LL@~X1W(ljaDC0Gpx~p zRAQy`15YV{DRG-s0M|JW<^TjAY;KXoNThA3odTSwusCZ|G6i)moAuK+Pga9V*^;z0 ziwoQHMIa1E+dU(-s^ z+2W#emNw(ELMs(mKI5=_&aq*`<{pOZTp0<7#n{`MwFnyWIUvkA4d~>#Z1K3mM6+8g zzri&X;9^;0rEytY@=^twQk$OYw&6W%H40hQ>L5L~HP+Yum;!AQXaSi|!E^rF&9wmM>(D*Juho zf=H&d+XiY!$>J9>iyC7;ihN>Y491g$L%XRY48ZTjji*Ea(V;Sb?F(Ua7{*3%WDJLW zwFNn7h)}khL3v(aL4m-S7dUGDd_fGIIZFyECp=l0Z0~){HIZ6lXrh{ligea=84zY- zfvHvD}xS~w1mfMhBFOpViQJsU7K z9%@F}gR3<&F2i7uA@w+`fa)CSb!qyBkWFp`MH4TJZ5LeDyc7W9(yB4+QBweMBX4Ej zE2!)ME+sOXS-DtK&gSsIW=M(%!;Y{+yZF&pU&$^EF6=ZX{lqkguv&HT#`H*g#~0dV zFUK_w5{@4j0wKfw_fX6HDt+*tDu>vu9a0vOka3Dm7lz=g(s60j4}u`+echj$NZsk1 zN!pc2Pr4KXq$@Nt;R?^*0^vy`gKa|j`H)9u)iyi>S&Q4; z;y8+gjgToQb))h?{9u! zJ+TsP&<+`BvM019b=bHofTTjrCj&iTrtu@WfNo z?fBS!Z)i{sbkB(|7hN@j?%tD>$b(ub7GE(|uZ1wq>AUu|aI{m}U+F>QVajLE#)qtd z$Zmi!ZGHoAY#7&|MDrP3c2t%i935n7zJ76$7ieTX8h6PIDvRY**ooQE*Yef?Sg%DU-(4Ql<10oibI zm@ii{W9Oi3F`=8vh_Y-FHBl48p@K=qrRlw>T?WHpWrtEDnk`*6t_V1A9fU^$95%WU zmFl}(6`?NY=cLlPOI^xOX=$3DNd6Q6(c+@b^4GDe8(GtX9q`uP4jixHa%R-e-|V~w zFyIy+!yK{?68W(ZLl9w*{I`BNa&qlI%>G{UKVWLzzcdXxox&8IgxYTvp`_Y@+a9P> zu$W=Nwn1?VD?;_eDxOFV3Z1EsTp*F#pn`XR+u4=W(^R5Tl?scaE*Mj*jdg~8Tv19u zn%3()k9nwdwK~`tQnAnNZWHZAuhc7h+C}GBmw+U`5JY{Kf34hw_rZ7R^S!Z)+pJTP z1J&Z98Hf&DVrotGj_UL{5;RR{)agnt?`V_DnQMPm)@{NY!coH*O3%j*bqjBOo#akv zpr1Lk)Y(B7!1UItQPeBBD(Dv8YW>Cp8OY{2VIx{utG9rU|Ni^;i-yTK;_<;x@RfeH z1GYHxCa+7r{l%Zst}+lSF=;z*W>XX-o+9wC!%iZMNd|}#MqaaT&s>$=^|hUF6vNgx zcdaG~7|XqJOFoZfrVr}ZSD&CG!GOAnDc5-mpSoE_DEnWnnPC0D48*|rAVG%y zg(0Bz?>h4c|G*kh(0et?4G5B0G`>7tKh6Knz@OSRH3!(SXU}b1McukpKR&s0au&IJ z|Nc9f0&Lr6I=gC|7=0)Zi|C3FWgo|MmC-HVyxAVeO^ViilTc9<9UPYttXmyDkX7Jq#7y+u=-ZJPD{g^lYlb5 zi5uNq(wzNoK(qh9{;1w1r#q@lXjuOe5KWuw*5MyJ$*LYIRS+IhIX2GT6xrM7#X`LJ zNE`iV#&FEyr#LCt#PQOK!s(nDfN0cvD`qRDEMWGjecif?qJBal5lbnHemvk~KY#1x z2|q&Hm1%=VQfhMh*=M}L5BS}*@Se=GzFoe;nIL~*`#1@D zcY6b*CjZav6s-^1$K2_a;m>CM{AXUhKIiAux$3hZplvIqp=cz=snnQ418+~TF#LX4 zGi)LDee41VlZ-u~Q-4A?cERZGunss-6x`b8EKQ0C&qxLWV~aqb^YrEp_;Ootv4Lf& z6>v4T0^+ob$pL3}LVVUcfMf`A37yfkYf;)nKAMAS0Ti=))G)RKHl!k&7F_0HA6kP)hiZH^ zdHd$GfsXb^-8b*Q8Up7pkQ4CtazoZ`%uuNP;XdciMpb+DY~|XL_7_3+UeX1ppg4#U zK^oh6Vyhbm@xp-Z%awxCsjEu2D!| ze=dVy8&u_0gE&tZJ==K#oV&I+?`73-lGMYhPoUwgg7ZkF@E+UFMAv%2M0rZ0+~T^pX7(x= zy2{Eb%i4JM^YqDW8Y&vKzA+E5&vP!FR!hmZTr}wdOV0t^w@Op3(${_G9!}8m0RH86 zCee0k*+q8u5ISw{8SvF;gLp;u;B$KBkGHvtODqbabK}yP0j&t^A&U}kgAI7dnYHoN zw_kIbMtZp6-GcuKj>IJUM+X9f2+Hj@`l6B_baxU)JuKYC)tKH#fuPJxR+3PnFr)W$ z!$9rHhmc40tAh=7x3;gaF9VwNy8{}MGQ#@bJ=>vr7L65%uz`*%m(O%uYhzbBbS2pU zGwGXeU=m_)jdt&)cZ+EXWysFW;QfuVmFgkM16vJ!+^LJ|&zjf!Dx2Hx`Zqw=F@(IDRlaUc(RFmArp z6&HJFB;m8yTQ|?Msri6&dZ429!P#@IH-J|`H)ovhy!Ml(&Hn1fdl%0&++egJuM9*) z-y82dN<9uyYOKZimo&4(XcJ8y0QygZ3E8s!+cp6WRG*WSg`; z8@h5kAJ;b%FjSTuKt!jLo2*-HbA4@M+)DS_R!{a2P&ETiC5b7{_NZ|8Ij1r+R)8HH zsN`t|iDgt&M9WxUeDd4;+g)5<#r?6Xvdf|#p#j+<;zn_LLGJOElUGr*#0JGWAyfBh zKj!JPr>xV)&qb^F_ATC8U z#PY7bJrrMGogF_ZjP|4UciNr#h-!36izS&i>3`?Jz4gNYP|!J#jIp z`dF&vW918O^fLL7iuc67;<1iS_V$iA90rTGwZ*ys)c*c#t1AA}m>ANCjz`8Ko-SW!*a=j%7qc={~{c zbH*QcH_J9nW*=^Y`D%UF@PtfElo z5>_a+sMIB{JUyYgIU%97DKWXVC4te>3S8dM&z)-f_kWrXnd{Xd6A+6+i=hwyFYdo( zrpA@wigI6Z#kc^%(F^b^an&Tiyb^q~FIR0+xXQ757G)tirOL#VcpE#b6rWa$Sq!&1 zex^B)>%p#h(|YY%DW=t5=aeC-pq$`h7vtW6+Qip1wiF@Ei5X5kb}ZKfugdsYYsZ6L zVL)0o#XL_JcFf$I4bx33K+ZMkyh(JDfaQ%t%#z`jj?}?YD$}@dDO3)UjMxuEk~YviEIS1t!#S|`VEjhxWaA91GMiII_Ow)H?g zMODEsD6A?pF+3`&Bc@Lvna{|MWQ&W4L3WsD+Lp)xp=Yg6o(f}ZO__x9G5A8QfR}DS zTLD2WNG-U47|`0FL}|;r{q;AGNNEKajVe#C2QQ`b-5o=*8tJots(Zh?Lxgf2`Wl#FKS>V7%R9V zJiP-yKB)t+)E7-nR+9$(`SaDo%_-JLtDOqA+p8a?C8b3LlhC$qXiRh#i4a7vs5SB` zYtH}*$WPSN2^i_N?8@TWLna6<;{Wy)#$Q9tRIgkw96xZco*W1fA`ClzCHc$%XEc90 z5FEIwA1Wr|s_(7yKY!<{e_z5u{WY{B0cDRNIyz#BcD85&m{bYp#x`Y^$*UpG!D=H>kR|aBO}P^ znVIC2hzPSK03{_(Y0V?51*-++5h!g<0^rb}PgmFd_+lZh^hcWdqvWy&m*gr7k65 zw5$5*#bM?z&)teDJDOHn*xc33neofcSR*UQs!BipM(?6OTlB8Y0$Sjx}<^bl#eq~L9yPYFmL)QVF>RJ{U-X77td1B!t9oO^y zm=W&!go|fXf^!-%Iw!yZ8|{K5SU3hE+>8A358fM@8JT@@>e00qogm26{jZxwtpUr|3f;};|EPZBamvHl+=A3Te%t9y$8Gd^tEB^Qyui*VhLFt7y zJL?m|&29-#S$@``X85c&JdOCKj6^@5%B}3Ln3b;`>*o%1j!gFtP8~bmw)O2A*p!Iz zN>1|#%wx5I@7Qf`N+ozCXOJib1+9oH-v&&n>q&S-yaTJV**JVX8D|{-!|M;^uydFr z18%W9@AO5lw`1o%^O&eeq3(ql00IA>cNQSoNp?3(@od4qb&J|VS8BGajW;z&fC3Sk zbcj=Mc}&#d5_BwCPQJ(Otag{Sup4To{L}Zlq3YjF_tX3|D85iYE|Ag4e{7$4C8_MO zDB^(d0sVKZ3rThi+xV4~yzLK=r}Wzga&Sjl)S?WJQDCFD0|{e$g}u|;RexpsX2aE< z?%HeED?8aW$3&XtnhLsrByK;aI5IzL0TFTGf_y$1S;S)H2UunUv#&F>oV3U&W@^MM zm!V}6Ltd*V!_AnHn7ghY3A|3#~Tm$x~vAwp6pVPz92ljtnQJd&~a*C+>c0R+;`9 z6$EM$+?_y&yHd3(`~%d>@xckEB%%bm1#6dgHe@)ZySIFZyjuE7Mu2+RdL^295Ey0z zs&-jGfJV7XPy(FfN}3qN8%R9C!F_*q!Bc;2C%L_azw9cfYBdhx|1stkHGqqc`#|8+ z6fKiyi`U#8a*JW?;{`QjtZwkbd475Vm+sYg;yGSCbK8x!zUr4%F%(xbmA^PmQpaf> zw0Y`Br*vhN)e?q&8R6GP9WU{P+`=MmQTNlx;_~7UAm-ik9i2?$Y_qJ=inl6-N-Wu& zR1hvQv_Dky4%9OWJ}sPkT)pYfu=@O;6JuK##gTPy(o8;aZIYIsK1NGkvyz`&+&hfb z30fX=JR)V)TK?@MSM>q9A(luY#Sw5EwTDeywFfv(9Krkr#}d#S)d%3r1ls_F@`msp z=HY1>yo2UsP_y#%xnRGpJt&9hnO5wbZ&2W7t4@CJcgURD?1r95XA!{(+4&iEh+}7A$~lJ$`l`CG;jq8a zd3X?|80JsVjl<%QA))qFs^sFPVy|47FTsFjht%{!TLr3G#r0qa=7BlE6mz<6j=Xbx zkN;mJ#IgurKjL@r6Zqavy_DVmuIv;?Sn+1@rSj8wgu)#QI>uY6KtuXy_^?G@oJ(g+ zGIq8&cN0^92opLY<)z9uB6wIcR6a~p-y>Vgk7ShQRXffdQhxfP3`@4M7@r!D(dqdb zEe2*M#>iYoE(i8jXKdk$rLR66;BPYs5HUDXrXNni#Obl5IlLaCh#FVJU`1PMi%ndT zOl@!omAewr_{Lo>neUt{?Iab5PQ8UmAspErpp*g(2mus8f zdNABKHYbK=t>N{+-wgKE7h#Xq^s%7j#%SjNN33&<%oXIRz`knc-d=KJmcQNb>z0lN z(Yo|^_|wG@xvoakJ-yg|E;+C7WZG!#lNjdWBf!y@8%sxnvA6T|Y#37Vp0d(ANhC}g z(O(`S4-1Ol8TUf+ZQR0+&<^Xhp-5fnqptgL_tBcy{{w>I@{R3{z1~)CJNL|)3utx^ z&=2Ce9tW%ZIUJJx5(J7nw5`Phbv)2+ia)RzeVmNDxv8pqnXj6aPb0!f-M-FK@1#v= zP=i?%)v_W0s}yZc_V5Wtp)tW?XhW$bo%Te+u27)qwLUjQIU?0 z_6{@}8ilfnjFb-V2Q>UE=tt%VSsQBZdRKLseEZ*B`_T<`u#O~eS;6W@{T?= z0eA(q036mA<$yzc|7BnXpRV`+{B4t4?5FeAJ(xbZHwSvk;+6=4`hUi&0|Hi>-Av-rxH*Te>na(%7{q2r!kf=I)T~3JILljV0w$1N05<|VF7R&zmrn)! zjh2K+*l2k(esWK*mZ&beKMEnEhW8^7c1e_Lc;qt=Wwx7Gu^4!8V-J^^!bgz z?g)H^;PU&)+{#%B(uV?jQs5g-=3dTLV4HbYR}TMz#f_a5|;q7lnH(oeRoplwDCyaW$AKB zi;FrZgOSLja!hq`jNMW|OO%TTfxy~o9Efn(*9m=W#(;Fo4P*7_lx2H$2w2<$i>qz{ zn771O24pv4>@G5as2y`6LNspYuYYrGqVUPTXph3E5~$yS2n6uiv6Ez09Qgab|L&-M zNf==1U#B}8z+c(Z%jO37KbMrhc)LzQzRYcF04W26?t|pWAA9J*;XT7Khbk}-&J1y< zvFl8x7zUOZ*B6=hJ~78TOe!S5gc!JO#yB&{$UFzRx$BuMz>d~JahIn_%tLU_Uu_wyh&sk zV1J;~WiOiB;7T=jH|)>Yu#*(pIBlD1sKc%ErdghoHy6tq7oj~9qKwt(pG9j?T2xlI z04U1l=j!ilc<_E|JY!`#qcR;-x5<#5S3k0lX!ljoc45gXH%g z)|{tKY0>UY+)!n}%QJEhH={)c!0A{JVK3_m{4-h@riAb&uTYXBZ7lYp2sBOt)8mwC zsgK+4=&)_(@3I9?8X27|rV012XMFAF|-g5Yg3d|k8q6H=r{YK!R zfV%{#x?@m2LNTQ9MiV7XyimzV5-{-3l!yk3fG+gRjKSzkC?i`X1M6Q*mLewgmQZlU zOd+GxGaS8OPnF1qNy9NMW1$k&3KxwgehHFAF%d7OPiZNbX3I^uA;A8h7W;G^M$9&l K;{%RVQL6!h1TU%p literal 0 HcmV?d00001 diff --git a/assets/img/forklift-logo-darkbg.svg b/assets/img/forklift-logo-darkbg.svg new file mode 100644 index 00000000000..8a846e6361a --- /dev/null +++ b/assets/img/forklift-logo-darkbg.svg @@ -0,0 +1,164 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/forklift-logo-lightbg.svg b/assets/img/forklift-logo-lightbg.svg new file mode 100644 index 00000000000..a8038cdf923 --- /dev/null +++ b/assets/img/forklift-logo-lightbg.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/konveyor-logo-forklift.jpg b/assets/img/konveyor-logo-forklift.jpg new file mode 100644 index 0000000000000000000000000000000000000000..185460764ef46c74b6b01eec493f48520dba044b GIT binary patch literal 7258 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 literal 0 HcmV?d00001 diff --git a/assets/img/logo_location.txt b/assets/img/logo_location.txt new file mode 100644 index 00000000000..2d6d6c6b515 --- /dev/null +++ b/assets/img/logo_location.txt @@ -0,0 +1 @@ +https://github.com/konveyor/community/tree/main/brand/logo diff --git a/assets/js/scale.fix.js b/assets/js/scale.fix.js new file mode 100644 index 00000000000..2f4f8fd4d31 --- /dev/null +++ b/assets/js/scale.fix.js @@ -0,0 +1,30 @@ +(function (document) { + var metas = document.getElementsByTagName("meta"), + changeViewportContent = function (content) { + for (var i = 0; i < metas.length; i++) { + if (metas[i].name == "viewport") { + metas[i].content = content; + } + } + }, + initialize = function () { + changeViewportContent( + "width=device-width, minimum-scale=1.0, maximum-scale=1.0" + ); + }, + gestureStart = function () { + changeViewportContent( + "width=device-width, minimum-scale=0.25, maximum-scale=1.6" + ); + }, + gestureEnd = function () { + initialize(); + }; + + if (navigator.userAgent.match(/iPhone/i)) { + initialize(); + + document.addEventListener("touchstart", gestureStart, false); + document.addEventListener("touchend", gestureEnd, false); + } +})(document); diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/docinfo.xml b/documentation/doc-Migration_Toolkit_for_Virtualization/docinfo.xml new file mode 100644 index 00000000000..bb612757d2b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/docinfo.xml @@ -0,0 +1,15 @@ +{user-guide-title} +{project-full} +{project-version} +{subtitle} + + {abstract} + + + + Red Hat Modernization and Migration + Documentation Team + ccs-mms-docs@redhat.com + + + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/master/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/master/index.html new file mode 100644 index 00000000000..6044896fd8f --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/master/index.html @@ -0,0 +1,8582 @@ + + + + + + + + Installing and using Forklift 2.3 | Forklift Documentation + + + + + + + + + + + + + +Installing and using Forklift 2.3 | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + +

+ +
+

Installing and using Forklift 2.3

+
+
+ +
+
+

About Forklift

+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    OpenStack

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+ +
+

About cold and warm migration

+
+

Forklift supports cold migration from:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    OpenStack

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

Forklift supports warm migration from VMware vSphere and from oVirt.

+
+
+

Cold migration

+
+

Cold migration is the default migration type. The source virtual machines are shut down while the data is copied.

+
+
+ + + + + +
+ + +
+

VMware only: In cold migrations, in situations in which a package manager cannot be used during the migration, Forklift does not install the qemu-guest-agent daemon on the migrated VMs. This has some impact on the functionality of the migrated VMs, but overall, they are still expected to function.

+
+
+

To enable Forklift to automatically install qemu-guest-agent on the migrated VMs, ensure that your package manager can install the daemon during the first boot of the VM after migration.

+
+
+

If that is not possible, use your preferred automated or manual procedure to install qemu-guest-agent manually.

+
+
+
+
+
+

Warm migration

+
+

Most of the data is copied during the precopy stage while the source virtual machines (VMs) are running.

+
+
+

Then the VMs are shut down and the remaining data is copied during the cutover stage.

+
+
+
Precopy stage
+

The VMs are not shut down during the precopy stage.

+
+
+

The VM disks are copied incrementally by using changed block tracking (CBT) snapshots. The snapshots are created at one-hour intervals by default. You can change the snapshot interval by updating the forklift-controller deployment.

+
+
+ + + + + +
+ + +
+

You must enable CBT for each source VM and each VM disk.

+
+
+

A VM can support up to 28 CBT snapshots. If the source VM has too many CBT snapshots and the Migration Controller service is not able to create a new snapshot, warm migration might fail. The Migration Controller service deletes each snapshot when the snapshot is no longer required.

+
+
+
+
+

The precopy stage runs until the cutover stage is started manually or is scheduled to start.

+
+
+
Cutover stage
+

The VMs are shut down during the cutover stage and the remaining data is migrated. Data stored in RAM is not migrated.

+
+
+

You can start the cutover stage manually by using the Forklift console or you can schedule a cutover time in the Migration manifest.

+
+
+
+

Advantages and disadvantages of cold and warm migrations

+
+
Overview
+
+

Both cold migration and warm migration have advantages and disadvantages, as described in the table that follows:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Advantages and disadvantages of cold and warm migrations
Cold migrationWarm migration

Duration

Correlates to the amount of data on the disks

Correlates to the amount of data on the disks and VM utilization

Data transferred

Approximate sum of all disks

Approximate sum of all disks and VM utilization

VM downtime

High

Low

+
+
+
Detailed description
+
+

The table that follows offers a more detailed description of the advantages and disadvantages of each type of migration. It assumes that you have installed Red Hat Enterprise Linux (RHEL) 9 on the OKD platform on which you installed Forklift.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Detailed description of advantages and disadvantages
Cold migrationWarm migration

Fail fast

Each VM is converted to be compatible with OKD and, if the conversion is successful, the VM is transferred. If a VM cannot be converted, the migration fails immediately.

For each VM, Forklift creates a snapshot and transfers it to OKD. When you start the cutover, Forklift creates the last snapshot, transfers it, and then converts the VM.

Tools

Forklift only.

Forklift and CDI from KubeVirt.

Parallelism

Disks must be transferred sequentially.

Disks can be transferred in parallel using different pods.

+
+ + + + + +
+ + +
+

The preceding table describes the situation for VMs that are running because the main benefit of warm migration is the reduced downtime, and there is no reason to initiate warm migration for VMs that are down. However, performing warm migration for VMs that are down is not the same as cold migration, even when Forklift uses virt-v2v and RHEL 9. For VMs that are down, Forklift transfers the disks using CDI, unlike in cold migration.

+
+
+
+
+ + + + + +
+ + +
+

When importing from VMware, there are additional factors which impact the migration speed such as limits related to ESXi, vSphere. or VDDK.

+
+
+
+
+
+
Conclusions
+
+

Based on the preceding information, we can draw the following conclusions about cold migration vs. warm migration:

+
+
+
    +
  • +

    The shortest downtime of VMs can be achieved by using warm migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data on a single disk can be achieved by using cold migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data that is spread evenly across multiple disks can be achieved by using warm migration.

    +
  • +
+
+
+
+
+
+
+
+

Prerequisites

+
+
+

Review the following prerequisites to ensure that your environment is prepared for migration.

+
+
+

Software requirements

+
+

You must install compatible versions of OKD and KubeVirt.

+
+
+
+

Storage support and default modes

+
+

Forklift uses the following default volume and access modes for supported storage.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Default volume and access modes
ProvisionerVolume modeAccess mode

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

+
+ + + + + +
+ + +
+

If the KubeVirt storage does not support dynamic provisioning, you must apply the following settings:

+
+
+
    +
  • +

    Filesystem volume mode

    +
    +

    Filesystem volume mode is slower than Block volume mode.

    +
    +
  • +
  • +

    ReadWriteOnce access mode

    +
    +

    ReadWriteOnce access mode does not support live virtual machine migration.

    +
    +
  • +
+
+
+

See Enabling a statically-provisioned storage class for details on editing the storage profile.

+
+
+
+
+ + + + + +
+ + +
+

If your migration uses block storage and persistent volumes created with an EXT4 file system, increase the file system overhead in CDI to be more than 10%. The default overhead that is assumed by CDI does not completely include the reserved place for the root partition. If you do not increase the file system overhead in CDI by this amount, your migration might fail.

+
+
+
+
+ + + + + +
+ + +
+

When migrating from OpenStack or running a cold-migration from RHV to the OCP cluster that MTV is deployed on, the migration allocates persistent volumes without CDI. In these cases, you might need to adjust the file system overhead.

+
+
+

If the configured file system overhead, which has a default value of 10%, is too low, the disk transfer will fail due to lack of space. In such a case, you would want to increase the file system overhead.

+
+
+

In some cases, however, you might want to decrease the file system overhead to reduce storage consumption.

+
+
+

You can change the file system overhead by changing the value of the controller_filesystem_overhead in the spec portion of the forklift-controller CR, as described in Configuring the MTV Operator.

+
+
+
+
+
+

Network prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    IP addresses, VLANs, and other network configuration settings must not be changed before or during migration. The MAC addresses of the virtual machines are preserved during migration.

    +
  • +
  • +

    The network connections between the source environment, the KubeVirt cluster, and the replication repository must be reliable and uninterrupted.

    +
  • +
  • +

    If you are mapping more than one source and destination network, you must create a network attachment definition for each additional destination network.

    +
  • +
+
+
+

Ports

+
+

The firewalls must enable traffic over the following ports:

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4. Network ports required for migrating from VMware vSphere
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

VMware vCenter

+

VMware provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer authentication

+

902

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer data copy

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 5. Network ports required for migrating from oVirt
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

oVirt Engine

+

oVirt provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer authentication

+

54322

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer data copy

+
+
+
+
+

Source virtual machine prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    ISO/CDROM disks must be unmounted.

    +
  • +
  • +

    Each NIC must contain one IPv4 and/or one IPv6 address.

    +
  • +
  • +

    The operating system of a VM must be certified and supported as a guest operating system with KubeVirt.

    +
  • +
  • +

    The name of a VM must not contain a period (.). Forklift changes any period in a VM name to a dash (-).

    +
  • +
  • +

    The name of a VM must not be the same as any other VM in the KubeVirt environment.

    +
    + + + + + +
    + + +
    +

    Forklift automatically assigns a new name to a VM that does not comply with the rules.

    +
    +
    +

    Forklift makes the following changes when it automatically generates a new VM name:

    +
    +
    +
      +
    • +

      Excluded characters are removed.

      +
    • +
    • +

      Uppercase letters are switched to lowercase letters.

      +
    • +
    • +

      Any underscore (_) is changed to a dash (-).

      +
    • +
    +
    +
    +

    This feature allows a migration to proceed smoothly even if someone enters a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+
+
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+
    +
  • +

    To create a source provider, you must have at least the UserRole and ReadOnlyAdmin roles assigned to you. These are the minimum required permissions, however, any other administrator or superuser permissions will also work.

    +
  • +
+
+
+ + + + + +
+ + +
+

You must keep the UserRole and ReadOnlyAdmin roles until the virtual machines of the source provider have been migrated. Otherwise, the migration will fail.

+
+
+
+
+
    +
  • +

    To migrate virtual machines:

    +
    +
      +
    • +

      You must have one of the following:

      +
      +
        +
      • +

        oVirt admin permissions. These permissions allow you to migrate any virtual machine in the system.

        +
      • +
      • +

        DiskCreator and UserVmManager permissions on every virtual machine you want to migrate.

        +
      • +
      +
      +
    • +
    • +

      You must use a compatible version of oVirt.

      +
    • +
    • +

      You must have the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate.

      +
      +

      You can obtain the Engine CA certificate by navigating to https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA in a browser.

      +
      +
    • +
    • +

      If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+ + +
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+
+
+

OpenStack prerequisites

+
+

The following prerequisites apply to OpenStack migrations:

+
+
+ +
+
+

Additional authentication methods for migrations with OpenStack source providers

+
+

Forklift versions 2.6 and later support the following authentication methods for migrations with OpenStack source providers in addition to the standard username and password credential set:

+
+
+
    +
  • +

    Token authentication

    +
  • +
  • +

    Application credential authentication

    +
  • +
+
+
+

You can use these methods to migrate virtual machines with OpenStack source providers using the CLI the same way you migrate other virtual machines, except for how you prepare the Secret manifest.

+
+
+
Using token authentication with an OpenStack source provider
+
+

You can use token authentication, instead of username and password authentication, when you create an OpenStack source provider.

+
+
+

Forklift supports both of the following types of token authentication:

+
+
+
    +
  • +

    Token with user ID

    +
  • +
  • +

    Token with user name

    +
  • +
+
+
+

For each type of token authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

Have an OpenStack account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the OpenStack web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for token authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for token authentication, run the following command:

    +
    +
    +
    $ openstack token issue
    +
    +
    +
    +

    The output, referred to here as <openstack_token_output>, includes the token, userID, and projectID that you need for authentication using a token with user ID.

    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using a token with user ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  projectID: <projectID_from_openstack_token_output>
      +  userID: <userID_from_openstack_token_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using a token with user name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  projectName: <OS_PROJECT_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+
+
+
Using application credential authentication with an OpenStack source provider
+
+

You can use application credential authentication, instead of username and password authentication, when you create an OpenStack source provider.

+
+
+

Forklift supports both of the following types of application credential authentication:

+
+
+
    +
  • +

    Application credential ID

    +
  • +
  • +

    Application credential name

    +
  • +
+
+
+

For each type of application credential authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

You have an OpenStack account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the OpenStack web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for application credential authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for application credential authentication, run the following command:

    +
    +
    +
    $ openstack application credential create --role member --role reader --secret redhat forklift
    +
    +
    +
    +

    The output, referred to here as <openstack_credential_output>, includes:

    +
    +
    +
      +
    • +

      The id and secret that you need for authentication using an application credential ID

      +
    • +
    • +

      The name and secret that you need for authentication using an application credential name

      +
    • +
    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using the application credential ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialID: <id_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using the application credential name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialName: <name_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+
+
+
+
+

VMware prerequisites

+
+

It is strongly recommended to create a VDDK image to accelerate migrations. For more information, see Creating a VDDK image.

+
+
+

The following prerequisites apply to VMware migrations:

+
+
+
    +
  • +

    You must use a compatible version of VMware vSphere.

    +
  • +
  • +

    You must be logged in as a user with at least the minimal set of VMware privileges.

    +
  • +
  • +

    To access the virtual machine using a pre-migration hook, VMware Tools must be installed on the source virtual machine.

    +
  • +
  • +

    The VM operating system must be certified and supported for use as a guest operating system with KubeVirt and for conversion to KVM with virt-v2v.

    +
  • +
  • +

    If you are running a warm migration, you must enable changed block tracking (CBT) on the VMs and on the VM disks.

    +
  • +
  • +

    If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host.

    +
  • +
  • +

    It is strongly recommended to disable hibernation because Forklift does not support migrating hibernated VMs.

    +
  • +
+
+
+ + + + + +
+ + +
+

In the event of a power outage, data might be lost for a VM with disabled hibernation. However, if hibernation is not disabled, migration will fail

+
+
+
+
+ + + + + +
+ + +
+

Neither Forklift nor OpenShift Virtualization support conversion of Btrfs for migrating VMs from VMWare.

+
+
+
+

VMware privileges

+
+

The following minimal set of VMware privileges is required to migrate virtual machines to KubeVirt with the Forklift.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 6. VMware privileges
PrivilegeDescription

Virtual machine.Interaction privileges:

Virtual machine.Interaction.Power Off

Allows powering off a powered-on virtual machine. This operation powers down the guest operating system.

Virtual machine.Interaction.Power On

Allows powering on a powered-off virtual machine and resuming a suspended virtual machine.

Virtual machine.Guest operating system management by VIX API

Allows managing a virtual machine by the VMware VIX API.

+

Virtual machine.Provisioning privileges:

+
+
+ + + + + +
+ + +
+

All Virtual machine.Provisioning privileges are required.

+
+
+

Virtual machine.Provisioning.Allow disk access

Allows opening a disk on a virtual machine for random read and write access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow file access

Allows operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow read-only disk access

Allows opening a disk on a virtual machine for random read access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow virtual machine download

Allows read operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow virtual machine files upload

Allows write operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Clone template

Allows cloning of a template.

Virtual machine.Provisioning.Clone virtual machine

Allows cloning of an existing virtual machine and allocation of resources.

Virtual machine.Provisioning.Create template from virtual machine

Allows creation of a new template from a virtual machine.

Virtual machine.Provisioning.Customize guest

Allows customization of a virtual machine’s guest operating system without moving the virtual machine.

Virtual machine.Provisioning.Deploy template

Allows deployment of a virtual machine from a template.

Virtual machine.Provisioning.Mark as template

Allows marking an existing powered-off virtual machine as a template.

Virtual machine.Provisioning.Mark as virtual machine

Allows marking an existing template as a virtual machine.

Virtual machine.Provisioning.Modify customization specification

Allows creation, modification, or deletion of customization specifications.

Virtual machine.Provisioning.Promote disks

Allows promote operations on a virtual machine’s disks.

Virtual machine.Provisioning.Read customization specifications

Allows reading a customization specification.

Virtual machine.Snapshot management privileges:

Virtual machine.Snapshot management.Create snapshot

Allows creation of a snapshot from the virtual machine’s current state.

Virtual machine.Snapshot management.Remove Snapshot

Allows removal of a snapshot from the snapshot history.

Datastore privileges:

Datastore.Browse datastore

Allows exploring the contents of a datastore.

Datastore.Low level file operations

Allows performing low-level file operations - read, write, delete, and rename - in a datastore.

Sessions privileges:

Sessions.Validate session

Allows verification of the validity of a session.

Cryptographic privileges:

Cryptographic.Decrypt

Allows decryption of an encrypted virtual machine.

Cryptographic.Direct access

Allows access to encrypted resources.

+
+

Creating a VDDK image

+
+

Forklift can use the VMware Virtual Disk Development Kit (VDDK) SDK to accelerate transferring virtual disks from VMware vSphere.

+
+
+ + + + + +
+ + +
+

Creating a VDDK image, although optional, is highly recommended.

+
+
+
+
+

To make use of this feature, you download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry.

+
+
+

The VDDK package contains symbolic links, therefore, the procedure of creating a VDDK image must be performed on a file system that preserves symbolic links (symlinks).

+
+
+ + + + + +
+ + +
+

Storing the VDDK image in a public registry might violate the VMware license terms.

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    You are working on a file system that preserves symbolic links (symlinks).

    +
  • +
  • +

    If you are using an external registry, KubeVirt must be able to access it.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create and navigate to a temporary directory:

    +
    +
    +
    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
    +
    +
    +
  2. +
  3. +

    In a browser, navigate to the VMware VDDK version 8 download page.

    +
  4. +
  5. +

    Select version 8.0.1 and click Download.

    +
  6. +
+
+
+ + + + + +
+ + +
+

In order to migrate to KubeVirt 4.12, download VDDK version 7.0.3.2 from the VMware VDDK version 7 download page.

+
+
+
+
+
    +
  1. +

    Save the VDDK archive file in the temporary directory.

    +
  2. +
  3. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  4. +
  5. +

    Create a Dockerfile:

    +
    +
    +
    $ cat > Dockerfile <<EOF
    +FROM registry.access.redhat.com/ubi8/ubi-minimal
    +USER 1001
    +COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    +RUN mkdir -p /opt
    +ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    +EOF
    +
    +
    +
  6. +
  7. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  8. +
  9. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  10. +
  11. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  12. +
+
+
+
+

Increasing the NFC service memory of an ESXi host

+
+

If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host. Otherwise, the migration will fail because the NFC service memory is limited to 10 parallel connections.

+
+
+
Procedure
+
    +
  1. +

    Log in to the ESXi host as root.

    +
  2. +
  3. +

    Change the value of maxMemory to 1000000000 in /etc/vmware/hostd/config.xml:

    +
    +
    +
    ...
    +      <nfcsvc>
    +         <path>libnfcsvc.so</path>
    +         <enabled>true</enabled>
    +         <maxMemory>1000000000</maxMemory>
    +         <maxStreamMemory>10485760</maxStreamMemory>
    +      </nfcsvc>
    +...
    +
    +
    +
  4. +
  5. +

    Restart hostd:

    +
    +
    +
    # /etc/init.d/hostd restart
    +
    +
    +
    +

    You do not need to reboot the host.

    +
    +
  6. +
+
+
+
+
+

Open Virtual Appliance (OVA) prerequisites

+
+

The following prerequisites apply to Open Virtual Appliance (OVA) file migrations:

+
+
+
    +
  • +

    All OVA files are created by VMware vSphere.

    +
  • +
+
+
+ + + + + +
+ + +
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+
    +
  • +

    The OVA files are in one or more folders under an NFS shared directory in one of the following structures:

    +
    +
      +
    • +

      In one or more compressed Open Virtualization Format (OVF) packages that hold all the VM information.

      +
      +

      The filename of each compressed package must have the .ova extension. Several compressed packages can be stored in the same folder.

      +
      +
      +

      When this structure is used, Forklift scans the root folder and the first-level subfolders for compressed packages.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The folder /nfs is scanned.
      +The folder /nfs/subfolder1 is scanned.
      +But, /nfs/subfolder1/subfolder2 is not scanned.

      +
      +
    • +
    • +

      In extracted OVF packages.

      +
      +

      When this structure is used, Forklift scans the root folder, first-level subfolders, and second-level subfolders for extracted OVF packages. +However, there can be only one .ovf file in a folder. Otherwise, the migration will fail.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The OVF file /nfs/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/subfolder2/vm.ovf is scanned.
      +But, the OVF file /nfs/subfolder1/subfolder2/subfolder3/vm.ovf is not scanned.

      +
      +
    • +
    +
    +
  • +
+
+
+
+

Software compatibility guidelines

+
+

You must install compatible software versions.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + +
Table 7. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.3.0

4.10 or later

4.10 or later

6.5 or later

4.4 SP1 or later

16.1 or later

+
+ + + + + +
+ + +
Migration from oVirt 4.3
+
+

Forklift was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3. While not supported, basic migrations from oVirt 4.3 are expected to work.

+
+
+

Generally it is advised to upgrade oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+

Therefore, it is recommended to upgrade oVirt to the supported version above before the migration to KubeVirt.

+
+
+

However, migrations from oVirt 4.3.11 were tested with Forklift 2.3, and may work in practice in many environments using Forklift 2.3. In this case, we advise upgrading oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+
+
+

OpenShift Operator Life Cycles

+
+

For more information about the software maintenance Life Cycle classifications for Operators shipped by Red Hat for use with OpenShift Container Platform, see OpenShift Operator Life Cycles.

+
+
+
+
+
+
+

Installing and configuring the Forklift Operator

+
+
+

You can install the Forklift Operator by using the OKD web console or the command line interface (CLI).

+
+
+

In Forklift version 2.4 and later, the Forklift Operator includes the Forklift plugin for the OKD web console.

+
+
+

After you install the Forklift Operator by using either the OKD web console or the CLI, you can configure the Operator.

+
+
+

Installing the Forklift Operator by using the OKD web console

+
+

You can install the Forklift Operator by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsOperatorHub.

    +
  2. +
  3. +

    Use the Filter by keyword field to search for forklift-operator.

    +
    + + + + + +
    + + +
    +

    The Forklift Operator is a Community Operator. Red Hat does not support Community Operators.

    +
    +
    +
    +
  4. +
  5. +

    Click Migration Toolkit for Virtualization Operator and then click Install.

    +
  6. +
  7. +

    Click Create ForkliftController when the button becomes active.

    +
  8. +
  9. +

    Click Create.

    +
    +

    Your ForkliftController appears in the list that is displayed.

    +
    +
  10. +
  11. +

    Click WorkloadsPods to verify that the Forklift pods are running.

    +
  12. +
  13. +

    Click OperatorsInstalled Operators to verify that Migration Toolkit for Virtualization Operator appears in the konveyor-forklift project with the status Succeeded.

    +
    +

    When the plugin is ready you will be prompted to reload the page. The Migration menu item is automatically added to the navigation bar, displayed on the left of the OKD web console.

    +
    +
  14. +
+
+
+
+

Installing the Forklift Operator from the command line interface

+
+

You can install the Forklift Operator from the command line interface (CLI).

+
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create the konveyor-forklift project:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: project.openshift.io/v1
    +kind: Project
    +metadata:
    +  name: konveyor-forklift
    +EOF
    +
    +
    +
  2. +
  3. +

    Create an OperatorGroup CR called migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: operators.coreos.com/v1
    +kind: OperatorGroup
    +metadata:
    +  name: migration
    +  namespace: konveyor-forklift
    +spec:
    +  targetNamespaces:
    +    - konveyor-forklift
    +EOF
    +
    +
    +
  4. +
  5. +

    Create a Subscription CR for the Operator:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: operators.coreos.com/v1alpha1
    +kind: Subscription
    +metadata:
    +  name: forklift-operator
    +  namespace: konveyor-forklift
    +spec:
    +  channel: development
    +  installPlanApproval: Automatic
    +  name: forklift-operator
    +  source: community-operators
    +  sourceNamespace: openshift-marketplace
    +  startingCSV: "konveyor-forklift-operator.2.3.0"
    +EOF
    +
    +
    +
  6. +
  7. +

    Create a ForkliftController CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: ForkliftController
    +metadata:
    +  name: forklift-controller
    +  namespace: konveyor-forklift
    +spec:
    +  olm_managed: true
    +EOF
    +
    +
    +
  8. +
  9. +

    Verify that the Forklift pods are running:

    +
    +
    +
    $ kubectl get pods -n konveyor-forklift
    +
    +
    +
    +
    Example output
    +
    +
    NAME                                                    READY   STATUS    RESTARTS   AGE
    +forklift-api-bb45b8db4-cpzlg                            1/1     Running   0          6m34s
    +forklift-controller-7649db6845-zd25p                    2/2     Running   0          6m38s
    +forklift-must-gather-api-78fb4bcdf6-h2r4m               1/1     Running   0          6m28s
    +forklift-operator-59c87cfbdc-pmkfc                      1/1     Running   0          28m
    +forklift-ui-plugin-5c5564f6d6-zpd85                     1/1     Running   0          6m24s
    +forklift-validation-7d84c74c6f-fj9xg                    1/1     Running   0          6m30s
    +forklift-volume-populator-controller-85d5cb64b6-mrlmc   1/1     Running   0          6m36s
    +
    +
    +
  10. +
+
+
+
+

Configuring the Forklift Operator

+
+

You can configure all of the following settings of the Forklift Operator by modifying the ForkliftController CR, or in the Settings section of the Overview page, unless otherwise indicated.

+
+
+
    +
  • +

    Maximum number of virtual machines (VMs) per plan that can be migrated simultaneously.

    +
  • +
  • +

    How long must gather reports are retained before being automatically deleted.

    +
  • +
  • +

    CPU limit allocated to the main controller container.

    +
  • +
  • +

    Memory limit allocated to the main controller container.

    +
  • +
  • +

    Interval at which a new snapshot is requested before initiating a warm migration.

    +
  • +
  • +

    Frequency with which the system checks the status of snapshot creation or removal during a warm migration.

    +
  • +
  • +

    Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem (ForkliftController CR only).

    +
  • +
  • +

    Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for vSphere source providers (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for oVirt (oVirt) source providers (ForkliftController CR only).

    +
  • +
+
+
+

The procedure for configuring these settings using the user interface is presented in Configuring MTV settings. The procedure for configuring these settings by modifying the ForkliftController CR is presented following.

+
+
+
Procedure
+
    +
  • +

    Change a parameter’s value in the spec portion of the ForkliftController CR by adding the label and value as follows:

    +
  • +
+
+
+
+
spec:
+  label: value (1)
+
+
+
+ + + + + +
1Labels you can configure using the CLI are shown in the table that follows, along with a description of each label and its default value.
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 8. Forklift Operator labels
LabelDescriptionDefault value

controller_max_vm_inflight

The maximum number of VMs per plan that can be migrated simultaneously.

20

must_gather_api_cleanup_max_age

The duration in hours for retaining must gather reports before they are automatically deleted.

-1 (disabled)

controller_container_limits_cpu

The CPU limit allocated to the main controller container.

500m

controller_container_limits_memory

The memory limit allocated to the main controller container.

800Mi

controller_precopy_interval

The interval in minutes at which a new snapshot is requested before initiating a warm migration.

60

controller_snapshot_status_check_rate_seconds

The frequency in seconds with which the system checks the status of snapshot creation or removal during a warm migration.

10

controller_filesystem_overhead

Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem.

+

ForkliftController CR only.

10

controller_block_overhead

Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based. It can be used when data, such as encryption headers, is written to the persistent volumes in addition to the content of the virtual disk.

+

ForkliftController CR only.

0

vsphere_osmap_configmap_name

Configuration map for vSphere source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the OpenShift web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-vsphere-osmap. In order to override or delete values, specify a configuration map that is different from forklift-vsphere-osmap.

+

ForkliftController CR only.

forklift-vsphere-osmap

ovirt_osmap_configmap_name

Configuration map for oVirt source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the OpenShift web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-ovirt-osmap. In order to override or delete values, specify a configuration map that is different from forklift-ovirt-osmap.

+

ForkliftController CR only.

forklift-ovirt-osmap

+
+
+
+
+

Migrating virtual machines by using the OKD web console

+
+
+

You can migrate virtual machines (VMs) by using the OKD web console to:

+
+ +
+ + + + + +
+ + +
+

You must ensure that all prerequisites are met.

+
+
+

VMware only: You must have the minimal set of VMware privileges.

+
+
+

VMware only: Creating a VMware Virtual Disk Development Kit (VDDK) image will increase migration speed.

+
+
+
+
+

The MTV user interface

+
+

The Forklift user interface is integrated into the OKD web console.

+
+
+

In the left-hand panel, you can choose a page related to a component of the migration progress, for example, Providers for Migration, or, if you are an administrator, you can choose Overview, which contains information about migrations and lets you configure Forklift settings.

+
+
+
+Forklift user interface +
+
Figure 1. Forklift extension interface
+
+
+

In pages related to components, you can click on the Projects list, which is in the upper-left portion of the page, and see which projects (namespaces) you are allowed to work with.

+
+
+
    +
  • +

    If you are an administrator, you can see all projects.

    +
  • +
  • +

    If you are a non-administrator, you can see only the projects that you have permissions to work with.

    +
  • +
+
+
+
+

The MTV Overview page

+
+

The Forklift Overview page displays system-wide information about migrations and a list of Settings you can change.

+
+
+

If you have Administrator privileges, you can access the Overview page by clicking MigrationOverview in the OKD web console.

+
+
+

The Overview page has 3 tabs:

+
+
+
    +
  • +

    Overview

    +
  • +
  • +

    YAML

    +
  • +
  • +

    Metrics

    +
  • +
+
+
+

Overview tab

+
+

The Overview tab lets you see:

+
+
+
    +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the Operator

    +
  • +
  • +

    Pods: The name, status, and creation time of each pod that was deployed by the Forklift Operator

    +
  • +
  • +

    Conditions: Status of the Forklift Operator:

    +
    +
      +
    • +

      Failure: Last failure. False indicates no failure since deployment.

      +
    • +
    • +

      Running: Whether the Operator is currently running and waiting for the next reconciliation.

      +
    • +
    • +

      Successful: Last successful reconciliation.

      +
    • +
    +
    +
  • +
+
+
+
+

YAML tab

+
+

The custom resource ForkliftController that defines the operation of the Forklift Operator. You can modify the custom resource from this tab.

+
+
+
+

Metrics tab

+
+

The Metrics tab lets you see:

+
+
+
    +
  • +

    Migrations: The number of migrations performed using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
  • +

    Virtual Machine Migrations: The number of VMs migrated using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+ + +
+

Since a single migration might involve many virtual machines, the number of migrations performed using Forklift might vary significantly from the number of virtual machines that have been migrated using Forklift.

+
+
+
+
+
    +
  • +

    Chart showing the number of running, failed, and succeeded migrations performed using Forklift for each of the last 7 days

    +
  • +
  • +

    Chart showing the number of running, failed, and succeeded virtual machine migrations performed using Forklift for each of the last 7 days

    +
  • +
+
+
+
+
+

Configuring MTV settings

+
+

If you have Administrator privileges, you can access the Overview page and change the following settings in it:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 9. Forklift settings
SettingDescriptionDefault value

Max concurrent virtual machine migrations

The maximum number of VMs per plan that can be migrated simultaneously

20

Must gather cleanup after (hours)

The duration for retaining must gather reports before they are automatically deleted

Disabled

Controller main container CPU limit

The CPU limit allocated to the main controller container

500 m

Controller main container Memory limit

The memory limit allocated to the main controller container

800 Mi

Precopy internal (minutes)

The interval at which a new snapshot is requested before initiating a warm migration

60

Snapshot polling interval (seconds)

The frequency with which the system checks the status of snapshot creation or removal during a warm migration

10

+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationOverview. The Settings list is on the right-hand side of the page.

    +
  2. +
  3. +

    In the Settings list, click the Edit icon of the setting you want to change.

    +
  4. +
  5. +

    Choose a setting from the list.

    +
  6. +
  7. +

    Click Save.

    +
  8. +
+
+
+
+

Adding providers

+
+

You can add source providers and destination providers for a virtual machine migration by using the OKD web console.

+
+
+

Adding source providers

+
+

You can use Forklift to migrate VMs from the following source providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt

    +
  • +
  • +

    OpenStack

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    KubeVirt

    +
  • +
+
+
+

You can add a source provider by using the OKD web console.

+
+
+
Adding a VMware vSphere source provider
+
+

You can migrate VMware vSphere VMs from VMware vCenter or from a VMWare ESX/ESXi server. In Forklift versions 2.6 and later, you can migrate directly from an ESX/ESXi server, without going through vCenter, by specifying the SDK endpoint to that of an ESX/ESXi server.

+
+
+ + + + + +
+ + +
+

EMS enforcement is disabled for migrations with VMware vSphere source providers in order to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements. Therefore, users should consider whether migrations from vSphere source providers risk their compliance with FIPS. Supported versions of vSphere are specified in Software compatibility guidelines.

+
+
+
+
+
Prerequisites
+
    +
  • +

    It is strongly recommended to create a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters. A VDDK image accelerates migration and reduces the risk of a plan failing. If you are not using VDDK and a plan fails, then please retry with VDDK installed. For more information, see Creating a VDDK image.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click vSphere.

    +
  6. +
  7. +

    Specify the following fields:

    +
  8. +
+
+
+

Provider Details

+
+
+
    +
  • +

    Provider resource name: Name of the source provider.

    +
  • +
  • +

    Endpoint type: Select the vSphere provider endpoint type. Options: vCenter or ESXi. You can migrate virtual machines from vCenter, an ESX/ESXi server that is not managed by vCenter, or from an ESX/ESXi server that is managed by vCenter but does not go through vCenter.

    +
  • +
  • +

    URL: URL of the SDK endpoint of the vCenter on which the source VM is mounted. Ensure that the URL includes the sdk path, usually /sdk. For example, https://vCenter-host-example.com/sdk. If a certificate for FQDN is specified, the value of this field needs to match the FQDN in the certificate.

    +
  • +
  • +

    VDDK init image: VDDKInitImage path. It is strongly recommended to create a VDDK init image to accelerate migrations. For more information, see Creating a VDDK image.

    +
  • +
+
+
+

Provider details

+
+
+
    +
  • +

    Username: vCenter user or ESXi user. For example, user@vsphere.local.

    +
  • +
  • +

    Password: vCenter user password or ESXi user password.

    +
    +
      +
    1. +

      Choose one of the following options for validating CA certificates:

      +
      +
        +
      • +

        Use a custom CA certificate: Migrate after validating a custom CA certificate.

        +
      • +
      • +

        Use the system CA certificate: Migrate after validating the system CA certificate.

        +
      • +
      • +

        Skip certificate validation : Migrate without validating a CA certificate.

        +
        +
          +
        1. +

          To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

          +
        2. +
        3. +

          To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

          +
        4. +
        5. +

          To skip certificate validation, toggle the Skip certificate validation switch to the right.

          +
        6. +
        +
        +
      • +
      +
      +
    2. +
    3. +

      Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

      +
      +
        +
      1. +

        Click Fetch certificate from URL. The Verify certificate window opens.

        +
      2. +
      3. +

        If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

        +
        +

        Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

        +
        +
      4. +
      +
      +
    4. +
    5. +

      Click Create provider to add and save the provider.

      +
      +

      The provider appears in the list of providers.

      +
      +
    6. +
    +
    +
    + + + + + +
    + + +
    +

    It might take a few minutes for the provider to have the status Ready.

    +
    +
    +
    +
  • +
+
+
+
Selecting a migration network for a VMware source provider
+
+

You can select a migration network in the OKD web console for a source provider to reduce risk to the source environment and to improve performance.

+
+
+

Using the default network for migration can result in poor performance because the network might not have sufficient bandwidth. This situation can have a negative effect on the source platform because the disk transfer operation might saturate the network.

+
+
+ + + + + +
+ + +
+

You can also control the network from which disks are transferred from a host by using the Network File Copy (NFC) service in vSphere.

+
+
+
+
+
Prerequisites
+
    +
  • +

    The migration network must have sufficient throughput, minimum speed of 10 Gbps, for disk transfer.

    +
  • +
  • +

    The migration network must be accessible to the KubeVirt nodes through the default gateway.

    +
    + + + + + +
    + + +
    +

    The source virtual disks are copied by a pod that is connected to the pod network of the target namespace.

    +
    +
    +
    +
  • +
  • +

    The migration network should have jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click the host number in the Hosts column beside a provider to view a list of hosts.

    +
  4. +
  5. +

    Select one or more hosts and click Select migration network.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Network: Network name

      +
    • +
    • +

      ESXi host admin username: For example, root

      +
    • +
    • +

      ESXi host admin password: Password

      +
    • +
    +
    +
  8. +
  9. +

    Click Save.

    +
  10. +
  11. +

    Verify that the status of each host is Ready.

    +
    +

    If a host status is not Ready, the host might be unreachable on the migration network or the credentials might be incorrect. You can modify the host configuration and save the changes.

    +
    +
  12. +
+
+
+
+
+
Adding an oVirt source provider
+
+

You can add an oVirt source provider by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Red Hat Virtualization

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider.

      +
    • +
    • +

      URL: URL of the API endpoint of the oVirt 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.

      +
    • +
    • +

      Username: Username.

      +
    • +
    • +

      Password: Password.

      +
    • +
    +
    +
  8. +
  9. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  12. +
  13. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  14. +
+
+
+
+
Adding an OpenStack source provider
+
+

You can add an OpenStack source provider by using the OKD web console.

+
+
+ + + + + +
+ + +
+

When you migrate an image-based VM from an OpenStack provider, a snapshot is created for the image that is attached to the source VM and the data from the snapshot is copied over to the target VM. This means that the target VM will have the same state as that of the source VM at the time the snapshot was created.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click OpenStack.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider.

      +
    • +
    • +

      URL: URL of the OpenStack Identity (Keystone) endpoint. For example, http://controller:5000/v3.

      +
    • +
    • +

      Authentication type: Choose one of the following methods of authentication and supply the information related to your choice. For example, if you choose Application credential ID as the authentication type, the Application credential ID and the Application credential secret fields become active, and you need to supply the ID and the secret.

      +
      +
        +
      • +

        Application credential ID

        +
        + +
        +
      • +
      • +

        Application credential name

        +
        +
          +
        • +

          Application credential name: OpenStack application credential name

          +
        • +
        • +

          Application credential secret: : OpenStack application credential Secret

          +
        • +
        • +

          Username: OpenStack username

          +
        • +
        • +

          Domain: OpenStack domain name

          +
        • +
        +
        +
      • +
      • +

        Token with user ID

        +
        +
          +
        • +

          Token: OpenStack token

          +
        • +
        • +

          User ID: OpenStack user ID

          +
        • +
        • +

          Project ID: OpenStack project ID

          +
        • +
        +
        +
      • +
      • +

        Token with user Name

        +
        +
          +
        • +

          Token: OpenStack token

          +
        • +
        • +

          Username: OpenStack username

          +
        • +
        • +

          Project: OpenStack project

          +
        • +
        • +

          Domain name: OpenStack domain name

          +
        • +
        +
        +
      • +
      • +

        Password

        +
        +
          +
        • +

          Username: OpenStack username

          +
        • +
        • +

          Password: OpenStack password

          +
        • +
        • +

          Project: OpenStack project

          +
        • +
        • +

          Domain: OpenStack domain name

          +
        • +
        +
        +
      • +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  12. +
  13. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  14. +
+
+
+
+
Adding an Open Virtual Appliance (OVA) source provider
+
+

You can add Open Virtual Appliance (OVA) files that were created by VMware vSphere as a source provider by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Open Virtual Appliance (OVA).

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider

      +
    • +
    • +

      URL: URL of the NFS file share that serves the OVA

      +
    • +
    +
    +
  8. +
  9. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
    + + + + + +
    + + +
    +

    An error message might appear that states that an error has occurred. You can ignore this message.

    +
    +
    +
    +
  10. +
+
+
+
+
Adding a Red Hat KubeVirt source provider
+
+

You can use a Red Hat KubeVirt provider as both a source provider and destination provider.

+
+
+

Specifically, the host cluster that is automatically added as a KubeVirt provider can be used as both a source provider and a destination provider.

+
+
+

You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on.

+
+
+ + + + + +
+ + +
+

The OKD cluster version of the source provider must be 4.13 or later.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click KubeVirt.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider

      +
    • +
    • +

      URL: URL of the endpoint of the API server

      +
    • +
    • +

      Service account bearer token: Token for a service account with cluster-admin privileges

      +
      +

      If both URL and Service account bearer token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  12. +
  13. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  14. +
+
+
+
+
+

Adding destination providers

+
+

You can add a KubeVirt destination provider by using the OKD web console.

+
+
+
Adding a KubeVirt destination provider
+
+

You can use a Red Hat KubeVirt provider as both a source provider and destination provider.

+
+
+

Specifically, the host cluster that is automatically added as a KubeVirt provider can be used as both a source provider and a destination provider.

+
+
+

You can also add another KubeVirt destination provider to the OKD web console in addition to the default KubeVirt destination provider, which is the cluster where you installed Forklift.

+
+
+

You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click KubeVirt.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider

      +
    • +
    • +

      URL: URL of the endpoint of the API server

      +
    • +
    • +

      Service account bearer token: Token for a service account with cluster-admin privileges

      +
      +

      If both URL and Service account bearer token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  12. +
  13. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  14. +
+
+
+
+
Selecting a migration network for a KubeVirt provider
+
+

You can select a default migration network for a KubeVirt provider in the OKD web console to improve performance. The default migration network is used to transfer disks to the namespaces in which it is configured.

+
+
+

If you do not select a migration network, the default migration network is the pod network, which might not be optimal for disk transfer.

+
+
+ + + + + +
+ + +
+

You can override the default migration network of the provider by selecting a different network when you create a migration plan.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    On the right side of the provider, select Select migration network from the Options menu kebab.

    +
  4. +
  5. +

    Select a network from the list of available networks and click Select.

    +
  6. +
+
+
+
+
+
+

Creating migration plans

+
+

You can create a migration plan by using the OKD web console to specify a source provider, the virtual machines (VMs) you want to migrate, and other plan details.

+
+
+

For your convenience, there are two procedures to create migration plans, starting with either a source provider or with specific VMs:

+
+
+ +
+
+ + + + + +
+ + +
+

Virtual machines with guest initiated storage connections, such as Internet Small Computer Systems Interface (iSCSI) connections or Network File System (NFS) mounts, are not handled by Forklift and could require additional planning before or reconfiguration after the migration.

+
+
+

This is to ensure that no issues arise due to the addition or newly migrated VM accessing this storage.

+
+
+
+
+ + + + + +
+ + +
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+
+

Creating a migration plan starting with a source provider

+
+

You can create a migration plan based on a source provider, starting on the Plans for virtualization page. Note the specific options for migrations from VMware or oVirt providers.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization and then click Create Plan.

    +
    +

    The Create migration plan wizard opens to the Select source provider interface.

    +
    +
  2. +
  3. +

    Select the source provider of the VMs you want to migrate.

    +
    +

    The Select virtual machines interface opens.

    +
    +
  4. +
  5. +

    Select the VMs you want to migrate and click Next.

    +
    +

    The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map.

    +
    +
  6. +
  7. +

    Enter the Plan name.

    +
  8. +
  9. +

    Make any needed changes to the editable items.

    +
  10. +
  11. +

    Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings.

    +
  12. +
  13. +

    Click Create migration plan.

    +
    +

    Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

    +
    +
  14. +
  15. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  16. +
  17. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  18. +
  19. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      + + + + + +
      + + +
      +

      When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

      +
      +
      +
      +
    4. +
    +
    +
  20. +
+
+
+
+

Creating a migration plan starting with specific VMs

+
+

You can create a migration plan based on specific VMs, starting on the Providers for virtualization page. Note the specific options for migrations from VMware or oVirt providers.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Providers for virtualization.

    +
  2. +
  3. +

    In the row of the appropriate source provider, click VMs.

    +
    +

    The Virtual Machines tab opens.

    +
    +
  4. +
  5. +

    Select the VMs you want to migrate and click Create migration plan.

    +
    +

    The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map.

    +
    +
  6. +
  7. +

    Enter the Plan name.

    +
  8. +
  9. +

    Make any needed changes to the editable items.

    +
  10. +
  11. +

    Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings.

    +
  12. +
  13. +

    Click Create migration plan.

    +
    +

    Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

    +
    +
  14. +
  15. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  16. +
  17. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  18. +
  19. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      + + + + + +
      + + +
      +

      When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

      +
      +
      +
      +
    4. +
    +
    +
  20. +
+
+
+
+
+

Running a migration plan

+
+

You can run a migration plan and view its progress in the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Valid migration plan.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
    +

    The Plans list displays the source and target providers, the number of virtual machines (VMs) being migrated, the status, and the description of each plan.

    +
    +
  2. +
  3. +

    Click Start beside a migration plan to start the migration.

    +
  4. +
  5. +

    Click Start in the confirmation window that opens.

    +
    +

    The Migration details by VM screen opens, displaying the migration’s progress

    +
    +
    +

    Warm migration only:

    +
    +
    +
      +
    • +

      The precopy stage starts.

      +
    • +
    • +

      Click Cutover to complete the migration.

      +
    • +
    +
    +
  6. +
  7. +

    If the migration fails:

    +
    +
      +
    1. +

      Click Get logs to retrieve the migration logs.

      +
    2. +
    3. +

      Click Get logs in the confirmation window that opens.

      +
    4. +
    5. +

      Wait until Get logs changes to Download logs and then click the button to download the logs.

      +
    6. +
    +
    +
  8. +
  9. +

    Click a migration’s Status, whether it failed or succeeded or is still ongoing, to view the details of the migration.

    +
    +

    The Migration details by VM screen opens, displaying the start and end times of the migration, the amount of data copied, and a progress pipeline for each VM being migrated.

    +
    +
  10. +
  11. +

    Expand an individual VM to view its steps and the elapsed time and state of each step.

    +
  12. +
+
+
+
+

Migration plan options

+
+

On the Plans for virtualization page of the OKD web console, you can click the Options menu kebab beside a migration plan to access the following options:

+
+
+
    +
  • +

    Get logs: Retrieves the logs of a migration. When you click Get logs, a confirmation window opens. After you click Get logs in the window, wait until Get logs changes to Download logs and then click the button to download the logs.

    +
  • +
  • +

    Edit: Edit the details of a migration plan. You cannot edit a migration plan while it is running or after it has completed successfully.

    +
  • +
  • +

    Duplicate: Create a new migration plan with the same virtual machines (VMs), parameters, mappings, and hooks as an existing plan. You can use this feature for the following tasks:

    +
    +
      +
    • +

      Migrate VMs to a different namespace.

      +
    • +
    • +

      Edit an archived migration plan.

      +
    • +
    • +

      Edit a migration plan with a different status, for example, failed, canceled, running, critical, or ready.

      +
    • +
    +
    +
  • +
  • +

    Archive: Delete the logs, history, and metadata of a migration plan. The plan cannot be edited or restarted. It can only be viewed.

    +
    + + + + + +
    + + +
    +

    The Archive option is irreversible. However, you can duplicate an archived plan.

    +
    +
    +
    +
  • +
  • +

    Delete: Permanently remove a migration plan. You cannot delete a running migration plan.

    +
    + + + + + +
    + + +
    +

    The Delete option is irreversible.

    +
    +
    +

    Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

    +
    +
    +
    +
  • +
  • +

    View details: Display the details of a migration plan.

    +
  • +
  • +

    Restart: Restart a failed or canceled migration plan.

    +
  • +
  • +

    Cancel scheduled cutover: Cancel a scheduled cutover migration for a warm migration plan.

    +
  • +
+
+
+
+

Canceling a migration

+
+

You can cancel the migration of some or all virtual machines (VMs) while a migration plan is in progress by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization.

    +
  2. +
  3. +

    Click the name of a running migration plan to view the migration details.

    +
  4. +
  5. +

    Select one or more VMs and click Cancel.

    +
  6. +
  7. +

    Click Yes, cancel to confirm the cancellation.

    +
    +

    In the Migration details by VM list, the status of the canceled VMs is Canceled. The unmigrated and the migrated virtual machines are not affected.

    +
    +
  8. +
+
+
+

You can restart a canceled migration by clicking Restart beside the migration plan on the Migration plans page.

+
+
+
+
+
+

Migrating virtual machines from the command line

+
+
+

You can migrate virtual machines to KubeVirt from the command line.

+
+
+ + + + + +
+ + +
+

You must ensure that all prerequisites are met.

+
+
+
+
+ + + + + +
+ + +
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+
+

Permissions needed by non-administrators to work with migration plan components

+
+

If you are an administrator, you can work with all components of migration plans (for example, providers, network mappings, and migration plans).

+
+
+

By default, non-administrators have limited ability to work with migration plans and their components. As an administrator, you can modify their roles to allow them full access to all components, or you can give them limited permissions.

+
+
+

For example, administrators can assign non-administrators one or more of the following cluster roles for migration plans:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + +
Table 10. Example migration plan roles and their privileges
RoleDescription

plans.forklift.konveyor.io-v1beta1-view

Can view migration plans but not to create, delete or modify them

plans.forklift.konveyor.io-v1beta1-edit

Can create, delete or modify (all parts of edit permissions) individual migration plans

plans.forklift.konveyor.io-v1beta1-admin

All edit privileges and the ability to delete the entire collection of migration plans

+
+

Note that pre-defined cluster roles include a resource (for example, plans), an API group (for example, forklift.konveyor.io-v1beta1) and an action (for example, view, edit).

+
+
+

As a more comprehensive example, you can grant non-administrators the following set of permissions per namespace:

+
+
+
    +
  • +

    Create and modify storage maps, network maps, and migration plans for the namespaces they have access to

    +
  • +
  • +

    Attach providers created by administrators to storage maps, network maps, and migration plans

    +
  • +
  • +

    Not be able to create providers or to change system settings

    +
  • +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 11. Example permissions required for non-adminstrators to work with migration plan components but not create providers
ActionsAPI groupResource

get, list, watch, create, update, patch, delete

forklift.konveyor.io

plans

get, list, watch, create, update, patch, delete

forklift.konveyor.io

migrations

get, list, watch, create, update, patch, delete

forklift.konveyor.io

hooks

get, list, watch

forklift.konveyor.io

providers

get, list, watch, create, update, patch, delete

forklift.konveyor.io

networkmaps

get, list, watch, create, update, patch, delete

forklift.konveyor.io

storagemaps

get, list, watch

forklift.konveyor.io

forkliftcontrollers

create, patch, delete

Empty string

secrets

+
+ + + + + +
+ + +
+

Non-administrators need to have the create permissions that are part of edit roles for network maps and for storage maps to create migration plans, even when using a template for a network map or a storage map.

+
+
+
+
+ + + + + +
+ + +
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+
+
+

Retrieving a VMware vSphere moRef

+
+

When you migrate VMs with a VMware vSphere source provider using Forklift from the CLI, you need to know the managed object reference (moRef) of certain entities in vSphere, such as datastores, networks, and VMs.

+
+
+

You can retrieve the moRef of one or more vSphere entities from the Inventory service. You can then use each moRef as a reference for retrieving the moRef of another entity.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Retrieve the moRef of a VMware vSphere provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    +
    +
    +
  8. +
  9. +

    Retrieve the datastores of a VMware vSphere source provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    +
    +
    +
    +
    Example output
    +
    +
    [
    +  {
    +    "id": "datastore-11",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
    +    "revision": 46,
    +    "name": "v2v_general_porpuse_ISCSI_DC",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
    +  },
    +  {
    +    "id": "datastore-730",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
    +    "revision": 46,
    +    "name": "f01-h27-640-SSD_2",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
    +  },
    + ...
    +
    +
    +
  10. +
+
+
+

In this example, the moRef of the datastore v2v_general_porpuse_ISCSI_DC is datastore-11 and the moRef of the datastore f01-h27-640-SSD_2 is datastore-730.

+
+
+
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs). The CRs and the migration procedure vary by source provider.

+
+
+ + + + + +
+ + +
+

You must specify a name for cluster-scoped CRs.

+
+
+

You must specify both a name and a namespace for namespace-scoped CRs.

+
+
+

To migrate to or from an OKD cluster that is different from the one the migration plan is defined on, you must have an KubeVirt service account token with cluster-admin privileges.

+
+
+
+
+

Migrating from a VMware vSphere source provider

+
+

You can migrate from a VMware vSphere source provider by using the CLI.

+
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: <secret>
    +  namespace: <namespace>
    +  ownerReferences: (1)
    +    - apiVersion: forklift.konveyor.io/v1beta1
    +      kind: Provider
    +      name: <provider_name>
    +      uid: <provider_uid>
    +  labels:
    +    createdForProviderType: vsphere
    +    createdForResourceType: providers
    +type: Opaque
    +stringData:
    +  user: <user> (2)
    +  password: <password> (3)
    +  insecureSkipVerify: <"true"/"false"> (4)
    +  cacert: | (5)
    +    <ca_certificate>
    +  url: <api_end_point> (6)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The ownerReferences section is optional.
    2Specify the vCenter user or the ESX/ESXi user.
    3Specify the password of the vCenter user or the ESX/ESXi user.
    4Specify "true" to skip certificate verification, specify "false" to verify the certificate. Defaults to "false" if not specified. Skipping certificate verification proceeds with an insecure migration and then the certificate is not required. Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.
    5When this field is not set and skip certificate verification is disabled, Forklift attempts to use the system CA.
    6Specify the API endpoint URL of the vCenter or the ESX/ESXi, for example, https://<vCenter_host>/sdk.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <source_provider>
    +  namespace: <namespace>
    +spec:
    +  type: vsphere
    +  url: <api_end_point> (1)
    +  settings:
    +    vddkInitImage: <VDDK_image> (2)
    +    sdkEndpoint: vcenter (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Specify the URL of the API endpoint, for example, https://<vCenter_host>/sdk.
    2Optional, but it is strongly recommended to create a VDDK image to accelerate migrations. Follow OpenShift documentation to specify the VDDK image you created.
    3Options: vcenter or esxi.
    4Specify the name of the provider Secret CR.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Host manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Host
    +metadata:
    +  name: <vmware_host>
    +  namespace: <namespace>
    +spec:
    +  provider:
    +    namespace: <namespace>
    +    name: <source_provider> (1)
    +  id: <source_host_mor> (2)
    +  ipAddress: <source_network_ip> (3)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + +
    1Specify the name of the VMware vSphere Provider CR.
    2Specify the Managed Object Reference (moRef) of the VMware vSphere host. To retrieve the moRef, see Retrieving a VMware vSphere moRef.
    3Specify the IP address of the VMware vSphere migration network.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a NetworkMap manifest to map the source and destination networks:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: NetworkMap
    +metadata:
    +  name: <network_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        name: <network_name>
    +        type: pod (1)
    +      source: (2)
    +        id: <source_network_id>
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (3)
    +        namespace: <network_attachment_definition_namespace> (4)
    +        type: multus
    +      source:
    +        id: <source_network_id>
    +        name: <source_network_name>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Allowed values are pod and multus.
    2You can use either the id or the name parameter to specify the source network. For id, specify the VMware vSphere network Managed Object Reference (moRef). To retrieve the moRef, see Retrieving a VMware vSphere moRef.
    3Specify a network attachment definition for each additional KubeVirt network.
    4Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a StorageMap manifest to map source and destination storage:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: StorageMap
    +metadata:
    +  name: <storage_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode> (1)
    +      source:
    +        id: <source_datastore> (2)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    2Specify the VMware vSphere datastore moRef. For example, f2737930-b567-451a-9ceb-2887f6207009. To retrieve the moRef, see Retrieving a VMware vSphere moRef.
    +
    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    + + +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
+
+
+
    +
  1. +

    Create a Plan manifest for the migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Plan
    +metadata:
    +  name: <plan> (1)
    +  namespace: <namespace>
    +spec:
    +  warm: false (2)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +  map: (3)
    +    network: (4)
    +      name: <network_map> (5)
    +      namespace: <namespace>
    +    storage: (6)
    +      name: <storage_map> (7)
    +      namespace: <namespace>
    +  preserveStaticIPs: (8)
    +  targetNamespace: <target_namespace>
    +  vms: (9)
    +    - id: <source_vm> (10)
    +    - name: <source_vm>
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1Specify the name of the Plan CR.
    2Specify whether the migration is warm - true - or cold - false. If you specify a warm migration without specifying a value for the cutover parameter in the Migration manifest, only the precopy stage will run.
    3Specify only one network map and one storage map per plan.
    4Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.
    5Specify the name of the NetworkMap CR.
    6Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.
    7Specify the name of the StorageMap CR.
    8By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. +To avoid this, set preserveStaticIPs to true. Forklift issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.
    9You can use either the id or the name parameter to specify the source VMs.
    10Specify the VMware vSphere VM moRef. To retrieve the moRef, see Retrieving a VMware vSphere moRef.
    11Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.
    12Specify the name of the Hook CR.
    13Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete. +
    + + + + + +
    + + +
    +

    When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

    +
    +
    +
    +
    +
  2. +
  3. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    + + +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  4. +
+
+
+ + + + + +
+ + +
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+
+
+

Migrating from a oVirt source provider

+
+

You can migrate from a oVirt (oVirt) source provider by using the CLI.

+
+
+
Prerequisites
+

If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

+
+
+ + + + + +
+ + +
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: <secret>
    +  namespace: <namespace>
    +  ownerReferences: (1)
    +    - apiVersion: forklift.konveyor.io/v1beta1
    +      kind: Provider
    +      name: <provider_name>
    +      uid: <provider_uid>
    +  labels:
    +    createdForProviderType: ovirt
    +    createdForResourceType: providers
    +type: Opaque
    +stringData:
    +  user: <user> (2)
    +  password: <password> (3)
    +  insecureSkipVerify: <"true"/"false"> (4)
    +  cacert: | (5)
    +    <ca_certificate>
    +  url: <api_end_point> (6)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The ownerReferences section is optional.
    2Specify the oVirt Engine user.
    3Specify the user password.
    4Specify "true" to skip certificate verification, specify "false" to verify the certificate. Defaults to "false" if not specified. Skipping certificate verification proceeds with an insecure migration and then the certificate is not required. Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.
    5Enter the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, enter the Engine Apache CA certificate. You can retrieve the Engine CA certificate at https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA.
    6Specify the API endpoint URL, for example, https://<engine_host>/ovirt-engine/api.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <source_provider>
    +  namespace: <namespace>
    +spec:
    +  type: ovirt
    +  url: <api_end_point> (1)
    +  secret:
    +    name: <secret> (2)
    +    namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Specify the URL of the API endpoint, for example, https://<engine_host>/ovirt-engine/api.
    2Specify the name of provider Secret CR.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a NetworkMap manifest to map the source and destination networks:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: NetworkMap
    +metadata:
    +  name: <network_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        name: <network_name>
    +        type: pod (1)
    +      source: (2)
    +        id: <source_network_id>
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (3)
    +        namespace: <network_attachment_definition_namespace> (4)
    +        type: multus
    +      source:
    +        id: <source_network_id>
    +        name: <source_network_name>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Allowed values are pod and multus.
    2You can use either the id or the name parameter to specify the source network. For id, specify the oVirt network Universal Unique ID (UUID).
    3Specify a network attachment definition for each additional KubeVirt network.
    4Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a StorageMap manifest to map source and destination storage:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: StorageMap
    +metadata:
    +  name: <storage_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode> (1)
    +      source:
    +        id: <source_storage_domain> (2)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    2Specify the oVirt storage domain UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.
    +
    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    + + +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
+
+
+
    +
  1. +

    Create a Plan manifest for the migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Plan
    +metadata:
    +  name: <plan> (1)
    +  namespace: <namespace>
    +  preserveClusterCpuModel: true (2)
    +spec:
    +  warm: false (3)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +  map: (4)
    +    network: (5)
    +      name: <network_map> (6)
    +      namespace: <namespace>
    +    storage: (7)
    +      name: <storage_map> (8)
    +      namespace: <namespace>
    +  targetNamespace: <target_namespace>
    +  vms: (9)
    +    - id: <source_vm> (10)
    +    - name: <source_vm>
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1Specify the name of the Plan CR.
    2See note below.
    3Specify whether the migration is warm or cold. If you specify a warm migration without specifying a value for the cutover parameter in the Migration manifest, only the precopy stage will run.
    4Specify only one network map and one storage map per plan.
    5Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.
    6Specify the name of the NetworkMap CR.
    7Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.
    8Specify the name of the StorageMap CR.
    9You can use either the id or the name parameter to specify the source VMs.
    10Specify the oVirt VM UUID.
    11Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.
    12Specify the name of the Hook CR.
    13Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete. +
    + + + + + +
    + + +
    +
      +
    • +

      If the migrated machines is set with a custom CPU model, it will be set with that CPU model in the destination cluster, regardless of the setting of preserveClusterCpuModel.

      +
    • +
    • +

      If the migrated machine is not set with a custom CPU model:

      +
      +
        +
      • +

        If preserveClusterCpuModel is set to 'true`, Forklift checks the CPU model of the VM when it runs in oVirt, based on the cluster’s configuration, and then sets the migrated VM with that CPU model.

        +
      • +
      • +

        If preserveClusterCpuModel is set to 'false`, Forklift does not set a CPU type and the VM is set with the default CPU model of the destination cluster.

        +
      • +
      +
      +
    • +
    +
    +
    +
    +
    +
  2. +
  3. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    + + +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  4. +
+
+
+
+

Migrating from an OpenStack source provider

+
+

You can migrate from an OpenStack source provider by using the CLI.

+
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: <secret>
    +  namespace: <namespace>
    +  ownerReferences: (1)
    +    - apiVersion: forklift.konveyor.io/v1beta1
    +      kind: Provider
    +      name: <provider_name>
    +      uid: <provider_uid>
    +  labels:
    +    createdForProviderType: openstack
    +    createdForResourceType: providers
    +type: Opaque
    +stringData:
    +  user: <user> (2)
    +  password: <password> (3)
    +  insecureSkipVerify: <"true"/"false"> (4)
    +  domainName: <domain_name>
    +  projectName: <project_name>
    +  regionName: <region_name>
    +  cacert: | (5)
    +    <ca_certificate>
    +  url: <api_end_point> (6)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The ownerReferences section is optional.
    2Specify the OpenStack user.
    3Specify the user OpenStack password.
    4Specify "true" to skip certificate verification, specify "false" to verify the certificate. Defaults to "false" if not specified. Skipping certificate verification proceeds with an insecure migration and then the certificate is not required. Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.
    5When this field is not set and skip certificate verification is disabled, Forklift attempts to use the system CA.
    6Specify the API endpoint URL, for example, https://<identity_service>/v3.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <source_provider>
    +  namespace: <namespace>
    +spec:
    +  type: openstack
    +  url: <api_end_point> (1)
    +  secret:
    +    name: <secret> (2)
    +    namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Specify the URL of the API endpoint.
    2Specify the name of provider Secret CR.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a NetworkMap manifest to map the source and destination networks:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: NetworkMap
    +metadata:
    +  name: <network_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        name: <network_name>
    +        type: pod (1)
    +      source:(2)
    +        id: <source_network_id>
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (3)
    +        namespace: <network_attachment_definition_namespace> (4)
    +        type: multus
    +      source:
    +        id: <source_network_id>
    +        name: <source_network_name>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Allowed values are pod and multus.
    2You can use either the id or the name parameter to specify the source network. For id, specify the OpenStack network UUID.
    3Specify a network attachment definition for each additional KubeVirt network.
    4Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a StorageMap manifest to map source and destination storage:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: StorageMap
    +metadata:
    +  name: <storage_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode> (1)
    +      source:
    +        id: <source_volume_type> (2)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    2Specify the OpenStack volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.
    +
    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    + + +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
+
+
+
    +
  1. +

    Create a Plan manifest for the migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Plan
    +metadata:
    +  name: <plan> (1)
    +  namespace: <namespace>
    +spec:
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +  map: (2)
    +    network: (3)
    +      name: <network_map> (4)
    +      namespace: <namespace>
    +    storage: (5)
    +      name: <storage_map> (6)
    +      namespace: <namespace>
    +  targetNamespace: <target_namespace>
    +  vms: (7)
    +    - id: <source_vm> (8)
    +    - name: <source_vm>
    +      hooks: (9)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (10)
    +          step: <step> (11)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1Specify the name of the Plan CR.
    2Specify only one network map and one storage map per plan.
    3Specify a network mapping, even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.
    4Specify the name of the NetworkMap CR.
    5Specify a storage mapping, even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.
    6Specify the name of the StorageMap CR.
    7You can use either the id or the name parameter to specify the source VMs.
    8Specify the OpenStack VM UUID.
    9Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.
    10Specify the name of the Hook CR.
    11Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.
    +
    +
  2. +
  3. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    + + +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  4. +
+
+
+
+

Migrating from an Open Virtual Appliance (OVA) source provider

+
+

You can migrate from Open Virtual Appliance (OVA) files that were created by VMware vSphere as a source provider by using the CLI.

+
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: <secret>
    +  namespace: <namespace>
    +  ownerReferences: (1)
    +    - apiVersion: forklift.konveyor.io/v1beta1
    +      kind: Provider
    +      name: <provider_name>
    +      uid: <provider_uid>
    +  labels:
    +    createdForProviderType: ova
    +    createdForResourceType: providers
    +type: Opaque
    +stringData:
    +  url: <nfs_server:/nfs_path> (2)
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1The ownerReferences section is optional.
    2where: nfs_server is an IP or hostname of the server where the share was created and nfs_path is the path on the server where the OVA files are stored.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <source_provider>
    +  namespace: <namespace>
    +spec:
    +  type: ova
    +  url:  <nfs_server:/nfs_path> (1)
    +  secret:
    +    name: <secret> (2)
    +    namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1where: nfs_server is an IP or hostname of the server where the share was created and nfs_path is the path on the server where the OVA files are stored.
    2Specify the name of provider Secret CR.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a NetworkMap manifest to map the source and destination networks:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: NetworkMap
    +metadata:
    +  name: <network_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        name: <network_name>
    +        type: pod (1)
    +      source:
    +        id: <source_network_id> (2)
    +    - destination:
    +        name: <network_attachment_definition> (3)
    +        namespace: <network_attachment_definition_namespace> (4)
    +        type: multus
    +      source:
    +        id: <source_network_id>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Allowed values are pod and multus.
    2Specify the OVA network Universal Unique ID (UUID).
    3Specify a network attachment definition for each additional KubeVirt network.
    4Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a StorageMap manifest to map source and destination storage:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: StorageMap
    +metadata:
    +  name: <storage_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode> (1)
    +      source:
    +        name:  Dummy storage for source provider <provider_name> (2)
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    2For OVA, the StorageMap can map only a single storage, which all the disks from the OVA are associated with, to a storage class at the destination. For this reason, the storage is referred to in the UI as "Dummy storage for source provider <provider_name>". In the YAML, write the phrase as it appears above, without the quotation marks and replacing <provider_name> with the actual name of the provider.
    +
    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    + + +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
+
+
+
    +
  1. +

    Create a Plan manifest for the migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Plan
    +metadata:
    +  name: <plan> (1)
    +  namespace: <namespace>
    +spec:
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +  map: (2)
    +    network: (3)
    +      name: <network_map> (4)
    +      namespace: <namespace>
    +    storage: (5)
    +      name: <storage_map> (6)
    +      namespace: <namespace>
    +  targetNamespace: <target_namespace>
    +  vms: (7)
    +    - id: <source_vm> (8)
    +    - name: <source_vm>
    +      hooks: (9)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (10)
    +          step: <step> (11)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1Specify the name of the Plan CR.
    2Specify only one network map and one storage map per plan.
    3Specify a network mapping, even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.
    4Specify the name of the NetworkMap CR.
    5Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.
    6Specify the name of the StorageMap CR.
    7You can use either the id or the name parameter to specify the source VMs.
    8Specify the OVA VM UUID.
    9Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.
    10Specify the name of the Hook CR.
    11Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.
    +
    +
  2. +
  3. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    + + +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  4. +
+
+
+
+

Migrating from a Red Hat KubeVirt source provider

+
+

You can use a Red Hat KubeVirt provider as either a source provider or as a destination provider.

+
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: <secret>
    +  namespace: <namespace>
    +  ownerReferences: (1)
    +    - apiVersion: forklift.konveyor.io/v1beta1
    +      kind: Provider
    +      name: <provider_name>
    +      uid: <provider_uid>
    +  labels:
    +    createdForProviderType: openshift
    +    createdForResourceType: providers
    +type: Opaque
    +stringData:
    +  token: <token> (2)
    +  password: <password> (3)
    +  insecureSkipVerify: <"true"/"false"> (4)
    +  cacert: | (5)
    +    <ca_certificate>
    +  url: <api_end_point> (6)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The ownerReferences section is optional.
    2Specify a token for a service account with cluster-admin privileges. If both token and url are left blank, the local OKD cluster is used.
    3Specify the user password.
    4Specify "true" to skip certificate verification, specify "false" to verify the certificate. Defaults to "false" if not specified. Skipping certificate verification proceeds with an insecure migration and then the certificate is not required. Insecure migration means that the transferred data is sent over an insecure connection and potentially sensitive data could be exposed.
    5When this field is not set and skip certificate verification is disabled, Forklift attempts to use the system CA.
    6Specify the URL of the endpoint of the API server.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <source_provider>
    +  namespace: <namespace>
    +spec:
    +  type: openshift
    +  url: <api_end_point> (1)
    +  secret:
    +    name: <secret> (2)
    +    namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Specify the URL of the endpoint of the API server.
    2Specify the name of provider Secret CR.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a NetworkMap manifest to map the source and destination networks:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: NetworkMap
    +metadata:
    +  name: <network_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        name: <network_name>
    +        type: pod (1)
    +      source:
    +        name: <network_name>
    +        type: pod
    +    - destination:
    +        name: <network_attachment_definition> (2)
    +        namespace: <network_attachment_definition_namespace> (3)
    +        type: multus
    +      source:
    +        name: <network_attachment_definition>
    +        namespace: <network_attachment_definition_namespace>
    +        type: multus
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + +
    1Allowed values are pod and multus.
    2Specify a network attachment definition for each additional KubeVirt network. Specify the +namespace either by using the namespace property or with a name built as follows: <network_namespace>/<network_name>.
    3Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  2. +
+
+
+
    +
  1. +

    Create a StorageMap manifest to map source and destination storage:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: StorageMap
    +metadata:
    +  name: <storage_map>
    +  namespace: <namespace>
    +spec:
    +  map:
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode> (1)
    +      source:
    +        name: <storage_class>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    +
    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    + + +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
+
+
+
    +
  1. +

    Create a Plan manifest for the migration:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Plan
    +metadata:
    +  name: <plan> (1)
    +  namespace: <namespace>
    +spec:
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +  map: (2)
    +    network: (3)
    +      name: <network_map> (4)
    +      namespace: <namespace>
    +    storage: (5)
    +      name: <storage_map> (6)
    +      namespace: <namespace>
    +  targetNamespace: <target_namespace>
    +  vms:
    +    - name: <source_vm>
    +      namespace: <namespace>
    +      hooks: (7)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (8)
    +          step: <step> (9)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1Specify the name of the Plan CR.
    2Specify only one network map and one storage map per plan.
    3Specify a network mapping, even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.
    4Specify the name of the NetworkMap CR.
    5Specify a storage mapping, even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.
    6Specify the name of the StorageMap CR.
    7Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.
    8Specify the name of the Hook CR.
    9Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.
    +
    +
  2. +
  3. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    + + +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  4. +
+
+
+
+
+

Canceling a migration

+
+

You can cancel an entire migration or individual virtual machines (VMs) while a migration is in progress from the command line interface (CLI).

+
+
+
Canceling an entire migration
+
    +
  • +

    Delete the Migration CR:

    +
    +
    +
    $ kubectl delete migration <migration> -n <namespace> (1)
    +
    +
    +
    + + + + + +
    1Specify the name of the Migration CR.
    +
    +
  • +
+
+
+
Canceling the migration of individual VMs
+
    +
  1. +

    Add the individual VMs to the spec.cancel block of the Migration manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration>
    +  namespace: <namespace>
    +...
    +spec:
    +  cancel:
    +  - id: vm-102 (1)
    +  - id: vm-203
    +  - name: rhel8-vm
    +EOF
    +
    +
    +
    + + + + + +
    1You can specify a VM by using the id key or the name key. +
    +

    The value of the id key is the managed object reference, for a VMware VM, or the VM UUID, for a oVirt VM.

    +
    +
    +
  2. +
  3. +

    Retrieve the Migration CR to monitor the progress of the remaining VMs:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  4. +
+
+
+
+
+
+

Advanced migration options

+
+
+

Changing precopy intervals for warm migration

+
+

You can change the snapshot interval by patching the ForkliftController custom resource (CR).

+
+
+
Procedure
+
    +
  • +

    Patch the ForkliftController CR:

    +
    +
    +
    $ kubectl patch forkliftcontroller/<forklift-controller> -n konveyor-forklift -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge (1)
    +
    +
    +
    + + + + + +
    1Specify the precopy interval in minutes. The default value is 60. +
    +

    You do not need to restart the forklift-controller pod.

    +
    +
    +
  • +
+
+
+
+

Creating custom rules for the Validation service

+
+

The Validation service uses Open Policy Agent (OPA) policy rules to check the suitability of each virtual machine (VM) for migration. The Validation service generates a list of concerns for each VM, which are stored in the Provider Inventory service as VM attributes. The web console displays the concerns for each VM in the provider inventory.

+
+
+

You can create custom rules to extend the default ruleset of the Validation service. For example, you can create a rule that checks whether a VM has multiple disks.

+
+
+

About Rego files

+
+

Validation rules are written in Rego, the Open Policy Agent (OPA) native query language. The rules are stored as .rego files in the /usr/share/opa/policies/io/konveyor/forklift/<provider> directory of the Validation pod.

+
+
+

Each validation rule is defined in a separate .rego file and tests for a specific condition. If the condition evaluates as true, the rule adds a {“category”, “label”, “assessment”} hash to the concerns. The concerns content is added to the concerns key in the inventory record of the VM. The web console displays the content of the concerns key for each VM in the provider inventory.

+
+
+

The following .rego file example checks for distributed resource scheduling enabled in the cluster of a VMware VM:

+
+
+
drs_enabled.rego example
+
+
package io.konveyor.forklift.vmware (1)
+
+has_drs_enabled {
+    input.host.cluster.drsEnabled (2)
+}
+
+concerns[flag] {
+    has_drs_enabled
+    flag := {
+        "category": "Information",
+        "label": "VM running in a DRS-enabled cluster",
+        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
+    }
+}
+
+
+
+ + + + + + + + + +
1Each validation rule is defined within a package. The package namespaces are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.
2Query parameters are based on the input key of the Validation service JSON.
+
+
+
+

Checking the default validation rules

+
+

Before you create a custom rule, you must check the default rules of the Validation service to ensure that you do not create a rule that redefines an existing default value.

+
+
+

Example: If a default rule contains the line default valid_input = false and you create a custom rule that contains the line default valid_input = true, the Validation service will not start.

+
+
+
Procedure
+
    +
  1. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  2. +
  3. +

    Go to the OPA policies directory for your provider:

    +
    +
    +
    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> (1)
    +
    +
    +
    + + + + + +
    1Specify vmware or ovirt.
    +
    +
  4. +
  5. +

    Search for the default policies:

    +
    +
    +
    $ grep -R "default" *
    +
    +
    +
  6. +
+
+
+
+

Creating a validation rule

+
+

You create a validation rule by applying a config map custom resource (CR) containing the rule to the Validation service.

+
+
+ + + + + +
+ + +
+
    +
  • +

    If you create a rule with the same name as an existing rule, the Validation service performs an OR operation with the rules.

    +
  • +
  • +

    If you create a rule that contradicts a default rule, the Validation service will not start.

    +
  • +
+
+
+
+
+
Validation rule example
+

Validation rules are based on virtual machine (VM) attributes collected by the Provider Inventory service.

+
+
+

For example, the VMware API uses this path to check whether a VMware VM has NUMA node affinity configured: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"].

+
+
+

The Provider Inventory service simplifies this configuration and returns a testable attribute with a list value:

+
+
+
+
"numaNodeAffinity": [
+    "0",
+    "1"
+],
+
+
+
+

You create a Rego query, based on this attribute, and add it to the forklift-validation-config config map:

+
+
+
+
`count(input.numaNodeAffinity) != 0`
+
+
+
+
Procedure
+
    +
  1. +

    Create a config map CR according to the following example:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: <forklift-validation-config>
    +  namespace: konveyor-forklift
    +data:
    +  vmware_multiple_disks.rego: |-
    +    package <provider_package> (1)
    +
    +    has_multiple_disks { (2)
    +      count(input.disks) > 1
    +    }
    +
    +    concerns[flag] {
    +      has_multiple_disks (3)
    +        flag := {
    +          "category": "<Information>", (4)
    +          "label": "Multiple disks detected",
    +          "assessment": "Multiple disks detected on this VM."
    +        }
    +    }
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    1Specify the provider package name. Allowed values are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.
    2Specify the concerns name and Rego query.
    3Specify the concerns name and flag parameter values.
    4Allowed values are Critical, Warning, and Information.
    +
    +
  2. +
  3. +

    Stop the Validation pod by scaling the forklift-controller deployment to 0:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=0 deployment/forklift-controller
    +
    +
    +
  4. +
  5. +

    Start the Validation pod by scaling the forklift-controller deployment to 1:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=1 deployment/forklift-controller
    +
    +
    +
  6. +
  7. +

    Check the Validation pod log to verify that the pod started:

    +
    +
    +
    $ kubectl logs -f <validation_pod>
    +
    +
    +
    +

    If the custom rule conflicts with a default rule, the Validation pod will not start.

    +
    +
  8. +
  9. +

    Remove the source provider:

    +
    +
    +
    $ kubectl delete provider <provider> -n konveyor-forklift
    +
    +
    +
  10. +
  11. +

    Add the source provider to apply the new rule:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <provider>
    +  namespace: konveyor-forklift
    +spec:
    +  type: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  secret:
    +    name: <secret> (3)
    +    namespace: konveyor-forklift
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + +
    1Allowed values are ovirt, vsphere, and openstack.
    2Specify the API end point URL, for example, https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for oVirt, or https://<identity_service>/v3 for OpenStack.
    3Specify the name of the provider Secret CR.
    +
    +
  12. +
+
+
+

You must update the rules version after creating a custom rule so that the Inventory service detects the changes and validates the VMs.

+
+
+
+

Updating the inventory rules version

+
+

You must update the inventory rules version each time you update the rules so that the Provider Inventory service detects the changes and triggers the Validation service.

+
+
+

The rules version is recorded in a rules_version.rego file for each provider.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the current rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 5
    +   }
    +}
    +
    +
    +
  2. +
  3. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  4. +
  5. +

    Update the rules version in the /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego file.

    +
  6. +
  7. +

    Log out of the Validation pod terminal.

    +
  8. +
  9. +

    Verify the updated rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 6
    +   }
    +}
    +
    +
    +
  10. +
+
+
+
+
+

Retrieving the Inventory service JSON

+
+

You retrieve the Inventory service JSON by sending an Inventory service query to a virtual machine (VM). The output contains an "input" key, which contains the inventory attributes that are queried by the Validation service rules.

+
+
+

You can create a validation rule based on any attribute in the "input" key, for example, input.snapshot.kind.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Trigger an HTTP GET request (for example, using Curl):

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    +
    +
    +
  8. +
  9. +

    Retrieve the UUID of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k (1)
    +
    +
    +
    + + + + + +
    1Allowed values for the provider are vsphere, ovirt, and openstack.
    +
    +
  10. +
  11. +

    Retrieve the VMs of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    +
    +
    +
  12. +
  13. +

    Retrieve the details of a VM:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    +
    +
    +
    +
    Example output
    +
    +
    {
    +    "input": {
    +        "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
    +        "id": "vm-431",
    +        "parent": {
    +            "kind": "Folder",
    +            "id": "group-v22"
    +        },
    +        "revision": 1,
    +        "name": "iscsi-target",
    +        "revisionValidated": 1,
    +        "isTemplate": false,
    +        "networks": [
    +            {
    +                "kind": "Network",
    +                "id": "network-31"
    +            },
    +            {
    +                "kind": "Network",
    +                "id": "network-33"
    +            }
    +        ],
    +        "disks": [
    +            {
    +                "key": 2000,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 17179869184,
    +                "shared": false,
    +                "rdm": false
    +            },
    +            {
    +                "key": 2001,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 10737418240,
    +                "shared": false,
    +                "rdm": false
    +            }
    +        ],
    +        "concerns": [],
    +        "policyVersion": 5,
    +        "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
    +        "firmware": "bios",
    +        "powerState": "poweredOn",
    +        "connectionState": "connected",
    +        "snapshot": {
    +            "kind": "VirtualMachineSnapshot",
    +            "id": "snapshot-3034"
    +        },
    +        "changeTrackingEnabled": false,
    +        "cpuAffinity": [
    +            0,
    +            2
    +        ],
    +        "cpuHotAddEnabled": true,
    +        "cpuHotRemoveEnabled": false,
    +        "memoryHotAddEnabled": false,
    +        "faultToleranceEnabled": false,
    +        "cpuCount": 2,
    +        "coresPerSocket": 1,
    +        "memoryMB": 2048,
    +        "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
    +        "balloonedMemory": 0,
    +        "ipAddress": "10.19.2.96",
    +        "storageUsed": 30436770129,
    +        "numaNodeAffinity": [
    +            "0",
    +            "1"
    +        ],
    +        "devices": [
    +            {
    +                "kind": "RealUSBController"
    +            }
    +        ],
    +        "host": {
    +            "id": "host-29",
    +            "parent": {
    +                "kind": "Cluster",
    +                "id": "domain-c26"
    +            },
    +            "revision": 1,
    +            "name": "IP address or host name of the vCenter host or oVirt Engine host",
    +            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
    +            "status": "green",
    +            "inMaintenance": false,
    +            "managementServerIp": "10.19.2.96",
    +            "thumbprint": <thumbprint>,
    +            "timezone": "UTC",
    +            "cpuSockets": 2,
    +            "cpuCores": 16,
    +            "productName": "VMware ESXi",
    +            "productVersion": "6.5.0",
    +            "networking": {
    +                "pNICs": [
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic0",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic1",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic2",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic3",
    +                        "linkSpeed": 10000
    +                    }
    +                ],
    +                "vNICs": [
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk2",
    +                        "portGroup": "VM_Migration",
    +                        "dPortGroup": "",
    +                        "ipAddress": "192.168.79.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 9000
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk0",
    +                        "portGroup": "Management Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.13",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk1",
    +                        "portGroup": "Storage Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "172.31.2.13",
    +                        "subnetMask": "255.255.0.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk3",
    +                        "portGroup": "",
    +                        "dPortGroup": "dvportgroup-48",
    +                        "ipAddress": "192.168.61.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk4",
    +                        "portGroup": "VM_DHCP_Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.231",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    }
    +                ],
    +                "portGroups": [
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM Network",
    +                        "name": "VM Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Management Network",
    +                        "name": "Management Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_10G_Network",
    +                        "name": "VM_10G_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Storage",
    +                        "name": "VM_Storage",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_DHCP_Network",
    +                        "name": "VM_DHCP_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Storage Network",
    +                        "name": "Storage Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Isolated_67",
    +                        "name": "VM_Isolated_67",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Migration",
    +                        "name": "VM_Migration",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    }
    +                ],
    +                "switches": [
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch0",
    +                        "name": "vSwitch0",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM Network",
    +                            "key-vim.host.PortGroup-Management Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic4"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch1",
    +                        "name": "vSwitch1",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_10G_Network",
    +                            "key-vim.host.PortGroup-VM_Storage",
    +                            "key-vim.host.PortGroup-VM_DHCP_Network",
    +                            "key-vim.host.PortGroup-Storage Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic2",
    +                            "key-vim.host.PhysicalNic-vmnic0"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch2",
    +                        "name": "vSwitch2",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_Isolated_67",
    +                            "key-vim.host.PortGroup-VM_Migration"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic3",
    +                            "key-vim.host.PhysicalNic-vmnic1"
    +                        ]
    +                    }
    +                ]
    +            },
    +            "networks": [
    +                {
    +                    "kind": "Network",
    +                    "id": "network-31"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-34"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-57"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-33"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "dvportgroup-47"
    +                }
    +            ],
    +            "datastores": [
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-35"
    +                },
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                }
    +            ],
    +            "vms": null,
    +            "networkAdapters": [],
    +            "cluster": {
    +                "id": "domain-c26",
    +                "parent": {
    +                    "kind": "Folder",
    +                    "id": "group-h23"
    +                },
    +                "revision": 1,
    +                "name": "mycluster",
    +                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
    +                "folder": "group-h23",
    +                "networks": [
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-31"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-34"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-57"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-33"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "dvportgroup-47"
    +                    }
    +                ],
    +                "datastores": [
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-35"
    +                    },
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-63"
    +                    }
    +                ],
    +                "hosts": [
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-44"
    +                    },
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-29"
    +                    }
    +                ],
    +                "dasEnabled": false,
    +                "dasVms": [],
    +                "drsEnabled": true,
    +                "drsBehavior": "fullyAutomated",
    +                "drsVms": [],
    +                "datacenter": null
    +            }
    +        }
    +    }
    +}
    +
    +
    +
  14. +
+
+
+
+

Adding hooks to a migration plan

+
+

You can add hooks a migration plan from the command line by using the Forklift API.

+
+
+

API-based hooks for Forklift migration plans

+
+

You can add hooks to a migration plan from the command line by using the Forklift API.

+
+
Default hook image
+
+

The default hook image for an Forklift hook is registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2. The image is based on the Ansible Runner image with the addition of python-openshift to provide Ansible Kubernetes resources and a recent oc binary.

+
+
Hook execution
+
+

An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a ConfigMap. The hook container is run as a job on the desired cluster, using the default ServiceAccount in the konveyor-forklift namespace.

+
+
PreHooks and PostHooks
+
+

You specify hooks per VM and you can run each as a PreHook or a PostHook. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration.

+
+
+

When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook.

+
+
+ + + + + +
+ + +
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
Example PreHook:
+
+
kind: Plan
+apiVersion: forklift.konveyor.io/v1beta1
+metadata:
+  name: test
+  namespace: konveyor-forklift
+spec:
+  vms:
+    - id: vm-2861
+      hooks:
+        - hook:
+            namespace: konveyor-forklift
+            name: playbook
+          step: PreHook
+
+
+
+
+

Adding Hook CRs to a VM migration by using the Forklift API

+
+

You can add a PreHook or a PostHook Hook CR when you migrate a virtual machine from the command line by using the Forklift API. A PreHook runs before a migration, a PostHook, after.

+
+
+ + + + + +
+ + +
+

You can retrieve additional information stored in a secret or in a configMap by using a k8s module.

+
+
+
+
+

For example, you can create a hook CR to install cloud-init on a VM and write a file before migration.

+
+
+
Procedure
+
    +
  1. +

    If needed, create a secret with an SSH private key for the VM. You can either use an existing key or generate a key pair, install the public key on the VM, and base64 encode the private key in the secret.

    +
    +
    +
    apiVersion: v1
    +data:
    +  key: VGhpcyB3YXMgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbiBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZS4KSXQgaXMgbm90IHVzZWQgYW55d2hlcmUuCi0tLS0tQkVHSU4gT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCmIzQmxibk56YUMxclpYa3RkakVBQUFBQUJHNXZibVVBQUFBRWJtOXVaUUFBQUFBQUFBQUJBQUFCbHdBQUFBZHpjMmd0Y24KTmhBQUFBQXdFQUFRQUFBWUVBMzVTTFRReDBFVjdPTWJQR0FqcEsxK2JhQURTTVFuK1NBU2pyTGZLNWM5NGpHdzhDbnA4LwovRHErZHFBR1pxQkg2ZnAxYmVJM1BZZzVWVDk0RVdWQ2RrTjgwY3dEcEo0Z1R0NHFUQ1gzZUYvY2x5VXQyUC9zaTNjcnQ0CjBQdi9wVnZXU1U2TlhHaDJIZC93V0MwcGh5Z0RQOVc5SHRQSUF0OFpnZmV2ZnUwZHpraVl6OHNVaElWU2ZsRGpaNUFqcUcKUjV2TVVUaGlrczEvZVlCeTdiMkFFSEdzYU8xN3NFbWNiYUlHUHZuUFVwWmQrdjkyYU1JdWZoYjhLZkFSbzZ3Ty9ISW1VbQovdDdHWFBJUmxBMUhSV0p1U05odTQzZS9DY3ZYd3Z6RnZrdE9kYXlEQzBMTklHMkpVaURlNWd0UUQ1WHZXc1p3MHQvbEs1CklacjFrZXZRNUJsYWNISmViV1ZNYUQvdllpdFdhSFo4OEF1Y0czaGh2bjkrOGNSTGhNVExiVlFSMWh2UVpBL1JtQXN3eE0KT3VJSmRaUmtxTThLZlF4Z28zQThRNGJhQW1VbnpvM3Zwa0FWdC9uaGtIOTRaRE5rV2U2RlRhdThONStyYTJCZkdjZVA4VApvbjFEeTBLRlpaUlpCREVVRVc0eHdTYUVOYXQ3c2RDNnhpL1d5OURaQUFBRm1NRFBXeDdBejFzZUFBQUFCM056YUMxeWMyCkVBQUFHQkFOK1VpMDBNZEJGZXpqR3p4Z0k2U3RmbTJnQTBqRUova2dFbzZ5M3l1WFBlSXhzUEFwNmZQL3c2dm5hZ0JtYWcKUituNmRXM2lOejJJT1ZVL2VCRmxRblpEZk5ITUE2U2VJRTdlS2t3bDkzaGYzSmNsTGRqLzdJdDNLN2VORDcvNlZiMWtsTwpqVnhvZGgzZjhGZ3RLWWNvQXovVnZSN1R5QUxmR1lIM3IzN3RIYzVJbU0vTEZJU0ZVbjVRNDJlUUk2aGtlYnpGRTRZcExOCmYzbUFjdTI5Z0JCeHJHanRlN0JKbkcyaUJqNzV6MUtXWGZyL2RtakNMbjRXL0Nud0VhT3NEdnh5SmxKdjdleGx6eUVaUU4KUjBWaWJrallidU4zdnduTDE4TDh4YjVMVG5Xc2d3dEN6U0J0aVZJZzN1WUxVQStWNzFyR2NOTGY1U3VTR2E5WkhyME9RWgpXbkJ5WG0xbFRHZy83MklyVm1oMmZQQUxuQnQ0WWI1L2Z2SEVTNFRFeTIxVUVkWWIwR1FQMFpnTE1NVERyaUNYV1VaS2pQCkNuME1ZS053UEVPRzJnSmxKODZONzZaQUZiZjU0WkIvZUdRelpGbnVoVTJydkRlZnEydGdYeG5Iai9FNko5UTh0Q2hXV1UKV1FReEZCRnVNY0VtaERXcmU3SFF1c1l2MXN2UTJRQUFBQU1CQUFFQUFBR0JBSlZtZklNNjdDQmpXcU9KdnFua2EvakRrUwo4TDdpSE5mekg1TnRZWVdPWmRMTlk2L0lRa1pDeFcwTWtSKzlUK0M3QUZKZzBNV2Q5ck5PeUxJZDkxNjZoOVJsNG0xdFJjCnViZ1o2dWZCZ3hGVDlXS21mSEdCNm4zelh5b2pQOEFJTnR6ODVpaUVHVXFFRWtVRVdMd0RGSmdvcFllQ3l1VmZ2ZE92MUgKRm1WWmEwNVo0b3NQNkNENXVmc2djQ1RYQTR6VnZ5ZHVCYkxqdHN5RjdYZjNUdjZUQ1QxU0swZHErQk1OOXRvb0RZaXpwagpzbDh6NzlybXp3eUFyWFlVcnFUUkpsNmpwRkNrWHJLcy9LeG96MHhhbXlMY2RORk9hWE51LzlnTkpjRERsV2hPcFRqNHk4CkpkNXBuV1Jueis1RHJLRFdhY0loUW1CMUxVd2ZLWmQwbVFxaUpzMUMxcXZVUmlKOGExaThKUTI4bHFuWTFRRk9wbk13emcKWEpla2FndThpT1ExRFJlQkhaM0NkcVJUYnY3bVJZSGxramx0dXJmZGc4M3hvM0ErZ1JSR001eUVOcW5xSkplQjhJQVB5UwptMFp0dGdqbHNqNTJ2K1B1NmExMHoxZndKK1VML2N6dTRKeEpOYlp6WTFIMnpLODJBaVI1T3JYNmx2aUEvSWFSRVcwUUFBCkFNQndVeUJpcUc5bEZCUnltL2UvU1VORVMzdHpicUZNdTdIcy84WTV5SnAxKzR6OXUxNGtJR2ttV0Y5eE5HT3hrY3V0cWwKeHVUcndMbjFUaFNQTHQrTjUwTGhVdzR4ZjBhNUxqemdPbklPU0FRbm5HY1Nxa0dTRDlMR21obGE2WmpydFBHY29lQ3JHdAo5M1Vvcmx5YkxNRzFFRFAxWmpKS1RaZzl6OUMwdDlTTGd3ei9DbFhydW9UNXNQVUdKWnUrbHlIZXpSTDRtcHl6OEZMcnlOCkdNci9leVM5bWdISjNVVkZEYjNIZ3BaK1E1SUdBRU5rZVZEcHIwMGhCZXZndGd6YWtBQUFEQkFQVXQ1RitoMnBVby94V1YKenRkcVQvMzA4dFB5MXVMMU1lWFoydEJPQmRwSDJyd0JzdWt0aTIySGtWZUZXQjJFdUlFUXppMzY3MGc1UGdxR1p4Vng4dQpobEE0Rkg4ZXN1NTNQckZqVW9EeFJhb3d3WXBFcFh5Y2pnNUE1MStwR1VQcWljWjB0YjliaWlhc3BWWXZhWW5sdGlnVG5iClN0UExMY29nemNiL0dGcVYyaXlzc3lwTlMwKzBNRTUxcEtxWGNaS2swbi8vVHpZWWs4TW8vZzRsQ3pmUEZQUlZrVVM5blIKWU1pQzRlcEk0TERmbVdnM0xLQ2N1Zk85all3aWgwYlFBQUFNRUE2WEtldDhEMHNvc0puZVh5WFZGd0dyVyszNlhBVGRQTwpMWDdjaStjYzFoOGV1eHdYQWx3aTJJNFhxSmJBVjBsVEhuVGEycXN3Uy9RQlpJUUJWSkZlVjVyS1daZTc4R2F3d1pWTFZNCldETmNwdFFyRTFaM2pGNS9TdUVzdlVxSDE0Tkc5RUFXWG1iUkNzelE0Vlk3NzQrSi9sTFkvMnlDT1diNzlLYTJ5OGxvYUoKVXczWWVtSld3blp2R3hKNldsL3BmQ2xYN3lEVXlXUktLdGl0cWNjbmpCWVkyRE1tZURwdURDYy9ZdDZDc3dLRmRkMkJ1UwpGZGt5cDlZY3VMaDlLZEFBQUFIR3BoYzI5dVFFRlVMVGd3TWxVdWJXOXVkR3hsYjI0dWFXNTBjbUVCQWdNRUJRWT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCgo=
    +kind: Secret
    +metadata:
    +  name: ssh-credentials
    +  namespace: konveyor-forklift
    +type: Opaque
    +
    +
    +
  2. +
  3. +

    Encode your playbook by conncatenating a file and piping it for base64, for example:

    +
    +
    +
    $ cat playbook.yml | base64 -w0
    +
    +
    +
    + + + + + +
    + + +
    +

    You can also use a here document to encode a playbook:

    +
    +
    +
    +
    $ cat << EOF | base64 -w0
    +- hosts: localhost
    +  tasks:
    +  - debug:
    +      msg: test
    +EOF
    +
    +
    +
    +
    +
  4. +
  5. +

    Create a Hook CR:

    +
    +
    +
    apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: playbook
    +  namespace: konveyor-forklift
    +spec:
    +  image: registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2
    +  playbook: LSBuYW1lOiBNYWluCiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogIC0gbmFtZTogTG9hZCBQbGFuCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHBsYW4ueW1sCiAgICAgIG5hbWU6IHBsYW4KCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHdvcmtsb2FkLnltbAogICAgICBuYW1lOiB3b3JrbG9hZAoKICAtIG5hbWU6IAogICAgZ2V0ZW50OgogICAgICBkYXRhYmFzZTogcGFzc3dkCiAgICAgIGtleTogInt7IGFuc2libGVfdXNlcl9pZCB9fSIKICAgICAgc3BsaXQ6ICc6JwoKICAtIG5hbWU6IEVuc3VyZSBTU0ggZGlyZWN0b3J5IGV4aXN0cwogICAgZmlsZToKICAgICAgcGF0aDogfi8uc3NoCiAgICAgIHN0YXRlOiBkaXJlY3RvcnkKICAgICAgbW9kZTogMDc1MAogICAgZW52aXJvbm1lbnQ6CiAgICAgIEhPTUU6ICJ7eyBhbnNpYmxlX2ZhY3RzLmdldGVudF9wYXNzd2RbYW5zaWJsZV91c2VyX2lkXVs0XSB9fSIKCiAgLSBrOHNfaW5mbzoKICAgICAgYXBpX3ZlcnNpb246IHYxCiAgICAgIGtpbmQ6IFNlY3JldAogICAgICBuYW1lOiBzc2gtY3JlZGVudGlhbHMKICAgICAgbmFtZXNwYWNlOiBrb252ZXlvci1mb3JrbGlmdAogICAgcmVnaXN0ZXI6IHNzaF9jcmVkZW50aWFscwoKICAtIG5hbWU6IENyZWF0ZSBTU0gga2V5CiAgICBjb3B5OgogICAgICBkZXN0OiB+Ly5zc2gvaWRfcnNhCiAgICAgIGNvbnRlbnQ6ICJ7eyBzc2hfY3JlZGVudGlhbHMucmVzb3VyY2VzWzBdLmRhdGEua2V5IHwgYjY0ZGVjb2RlIH19IgogICAgICBtb2RlOiAwNjAwCgogIC0gYWRkX2hvc3Q6CiAgICAgIG5hbWU6ICJ7eyB3b3JrbG9hZC52bS5pcGFkZHJlc3MgfX0iCiAgICAgIGFuc2libGVfdXNlcjogcm9vdAogICAgICBncm91cHM6IHZtcwoKLSBob3N0czogdm1zCiAgdGFza3M6CiAgLSBuYW1lOiBJbnN0YWxsIGNsb3VkLWluaXQKICAgIGRuZjoKICAgICAgbmFtZToKICAgICAgLSBjbG91ZC1pbml0CiAgICAgIHN0YXRlOiBsYXRlc3QKCiAgLSBuYW1lOiBDcmVhdGUgVGVzdCBGaWxlCiAgICBjb3B5OgogICAgICBkZXN0OiAvdGVzdC50eHQKICAgICAgY29udGVudDogIkhlbGxvIFdvcmxkIgogICAgICBtb2RlOiAwNjQ0Cg==
    +  serviceAccount: forklift-controller (1)
    +
    +
    +
    + + + + + +
    1Specify a serviceAccount to run the hook with in order to control access to resources on the cluster. +
    + + + + + +
    + + +
    +

    To decode an attached playbook retrieve the resource with custom output and pipe it to base64. For example:

    +
    +
    +
    +
     oc get -n konveyor-forklift hook playbook -o \
    +   go-template='{{ .spec.playbook }}' | base64 -d
    +
    +
    +
    +
    +
    +

    The playbook encoded here runs the following:

    +
    +
    +
    +
    - name: Main
    +  hosts: localhost
    +  tasks:
    +  - name: Load Plan
    +    include_vars:
    +      file: plan.yml
    +      name: plan
    +
    +  - name: Load Workload
    +    include_vars:
    +      file: workload.yml
    +      name: workload
    +
    +  - name:
    +    getent:
    +      database: passwd
    +      key: "{{ ansible_user_id }}"
    +      split: ':'
    +
    +  - name: Ensure SSH directory exists
    +    file:
    +      path: ~/.ssh
    +      state: directory
    +      mode: 0750
    +    environment:
    +      HOME: "{{ ansible_facts.getent_passwd[ansible_user_id][4] }}"
    +
    +  - k8s_info:
    +      api_version: v1
    +      kind: Secret
    +      name: ssh-credentials
    +      namespace: konveyor-forklift
    +    register: ssh_credentials
    +
    +  - name: Create SSH key
    +    copy:
    +      dest: ~/.ssh/id_rsa
    +      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
    +      mode: 0600
    +
    +  - add_host:
    +      name: "{{ workload.vm.ipaddress }}"
    +      ansible_user: root
    +      groups: vms
    +
    +- hosts: vms
    +  tasks:
    +  - name: Install cloud-init
    +    dnf:
    +      name:
    +      - cloud-init
    +      state: latest
    +
    +  - name: Create Test File
    +    copy:
    +      dest: /test.txt
    +      content: "Hello World"
    +      mode: 0644
    +
    +
    +
    +
  6. +
  7. +

    Create a Plan CR using the hook:

    +
    +
    +
    kind: Plan
    +apiVersion: forklift.konveyor.io/v1beta1
    +metadata:
    +  name: test
    +  namespace: konveyor-forklift
    +spec:
    +  map:
    +    network:
    +      namespace: "konveyor-forklift"
    +      name: "network"
    +    storage:
    +      namespace: "konveyor-forklift"
    +      name: "storage"
    +  provider:
    +    source:
    +      namespace: "konveyor-forklift"
    +      name: "boston"
    +    destination:
    +      namespace: "konveyor-forklift"
    +      name: host
    +  targetNamespace: "konveyor-forklift"
    +  vms:
    +    - id: vm-2861
    +      hooks:
    +        - hook:
    +            namespace: konveyor-forklift
    +            name: playbook
    +          step: PreHook (1)
    +
    +
    +
    + + + + + +
    1Options are PreHook, to run the hook before the migration, and PostHook, to run the hook after the migration.
    +
    +
  8. +
+
+
+ + + + + +
+ + +
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
+
+
+
+

Upgrading Forklift

+
+
+

You can upgrade the Forklift Operator by using the OKD web console to install the new version.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsInstalled OperatorsMigration Toolkit for Virtualization OperatorSubscription.

    +
  2. +
  3. +

    Change the update channel to the correct release.

    +
    +

    See Changing update channel in the OKD documentation.

    +
    +
  4. +
  5. +

    Confirm that Upgrade status changes from Up to date to Upgrade available. If it does not, restart the CatalogSource pod:

    +
    +
      +
    1. +

      Note the catalog source, for example, redhat-operators.

      +
    2. +
    3. +

      From the command line, retrieve the catalog source pod:

      +
      +
      +
      $ kubectl get pod -n openshift-marketplace | grep <catalog_source>
      +
      +
      +
    4. +
    5. +

      Delete the pod:

      +
      +
      +
      $ kubectl delete pod -n openshift-marketplace <catalog_source_pod>
      +
      +
      +
      +

      Upgrade status changes from Up to date to Upgrade available.

      +
      +
      +

      If you set Update approval on the Subscriptions tab to Automatic, the upgrade starts automatically.

      +
      +
    6. +
    +
    +
  6. +
  7. +

    If you set Update approval on the Subscriptions tab to Manual, approve the upgrade.

    +
    +

    See Manually approving a pending upgrade in the OKD documentation.

    +
    +
  8. +
  9. +

    If you are upgrading from Forklift 2.2 and have defined VMware source providers, edit the VMware provider by adding a VDDK init image. Otherwise, the update will change the state of any VMware providers to Critical. For more information, see Adding a VMSphere source provider.

    +
  10. +
  11. +

    If you mapped to NFS on the OKD destination provider in Forklift 2.2, edit the AccessModes and VolumeMode parameters in the NFS storage profile. Otherwise, the upgrade will invalidate the NFS mapping. For more information, see Customizing the storage profile.

    +
  12. +
+
+
+
+
+

Uninstalling Forklift

+
+
+

You can uninstall Forklift by using the OKD web console or the command line interface (CLI).

+
+
+

Uninstalling Forklift by using the OKD web console

+
+

You can uninstall Forklift by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Operators > Installed Operators.

    +
  2. +
  3. +

    Click Forklift Operator.

    +
    +

    The Operator Details page opens in the Details tab.

    +
    +
  4. +
  5. +

    Click the ForkliftController tab.

    +
  6. +
  7. +

    Click Actions and select Delete ForkLiftController.

    +
    +

    A confirmation window opens.

    +
    +
  8. +
  9. +

    Click Delete.

    +
    +

    The controller is removed.

    +
    +
  10. +
  11. +

    Open the Details tab.

    +
    +

    The Create ForkliftController button appears instead of the controller you deleted. There is no need to click it.

    +
    +
  12. +
  13. +

    On the upper-right side of the page, click Actions and select Uninstall Operator.

    +
    +

    A confirmation window opens, displaying any operand instances.

    +
    +
  14. +
  15. +

    To delete all instances, select the Delete all operand instances for this operator checkbox. By default, the checkbox is cleared.

    +
    + + + + + +
    + + +
    +

    If your Operator configured off-cluster resources, these will continue to run and will require manual cleanup.

    +
    +
    +
    +
  16. +
  17. +

    Click Uninstall.

    +
    +

    The Installed Operators page opens, and the Forklift Operator is removed from the list of installed Operators.

    +
    +
  18. +
  19. +

    Click Home > Overview.

    +
  20. +
  21. +

    In the Status section of the page, click Dynamic Plugins.

    +
    +

    The Dynamic Plugins popup opens, listing forklift-console-plugin as a failed plugin. If the forklift-console-plugin does not appear as a failed plugin, refresh the web console.

    +
    +
  22. +
  23. +

    Click forklift-console-plugin.

    +
    +

    The ConsolePlugin details page opens in the Details tab.

    +
    +
  24. +
  25. +

    On the upper right-hand side of the page, click Actions and select Delete ConsolePlugin from the list.

    +
    +

    A confirmation window opens.

    +
    +
  26. +
  27. +

    Click Delete.

    +
    +

    The plugin is removed from the list of Dynamic plugins on the Overview page. If the plugin still appears, restart the Overview page.

    +
    +
  28. +
+
+
+
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI).

+
+
+ + + + + +
+ + +
+

This action does not remove resources managed by the Forklift Operator, including custom resource definitions (CRDs) and custom resources (CRs). To remove these after uninstalling the Forklift Operator, you might need to manually delete the Forklift Operator CRDs.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Delete the forklift controller by running the following command:

    +
    +
    +
    $ oc delete ForkliftController --all -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Delete the subscription to the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  4. +
  5. +

    Delete the clusterserviceversion for the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  6. +
  7. +

    Delete the plugin console CR by running the following command:

    +
    +
    +
    $ oc delete ConsolePlugin forklift-console-plugin
    +
    +
    +
  8. +
  9. +

    Optional: Delete the custom resource definitions (CRDs) by running the following command:

    +
    +
    +
    kubectl get crd -o name | grep 'forklift.konveyor.io' | xargs kubectl delete
    +
    +
    +
  10. +
  11. +

    Optional: Perform cleanup by deleting the Forklift project by running the following command:

    +
    +
    +
    oc delete project openshift-mtv
    +
    +
    +
  12. +
+
+
+
+
+
+

Forklift performance recommendations

+
+
+

The purpose of this section is to share recommendations for efficient and effective migration of virtual machines (VMs) using Forklift, based on findings observed through testing.

+
+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+
+

Ensure fast storage and network speeds

+
+

Ensure fast storage and network speeds, both for VMware and OKD (OCP) environments.

+
+
+
    +
  • +

    To perform fast migrations, VMware must have fast read access to datastores.  Networking between VMware ESXi hosts should be fast, ensure a 10 GiB network connection, and avoid network bottlenecks.

    +
    +
      +
    • +

      Extend the VMware network to the OCP Workers Interface network environment.

      +
    • +
    • +

      It is important to ensure that the VMware network offers high throughput (10 Gigabit Ethernet) and rapid networking to guarantee that the reception rates align with the read rate of the ESXi datastore.

      +
    • +
    • +

      Be aware that the migration process uses significant network bandwidth and that the migration network is utilized. If other services utilize that network, it may have an impact on those services and their migration rates.

      +
    • +
    • +

      For example, 200 to 325 MiB/s was the average network transfer rate from the vmnic for each ESXi host associated with transferring data to the OCP interface.

      +
    • +
    +
    +
  • +
+
+
+
+

Ensure fast datastore read speeds to ensure efficient and performant migrations.

+
+

Datastores read rates impact the total transfer times, so it is essential to ensure fast reads are possible from the ESXi datastore to the ESXi host.  

+
+
+

Example in numbers: 200 to 300 MiB/s was the average read rate for both vSphere and ESXi endpoints for a single ESXi server. When multiple ESXi servers are used, higher datastore read rates are possible.

+
+
+
+

Endpoint types 

+
+

Forklift 2.6 allows for the following vSphere provider options:

+
+
+
    +
  • +

    ESXi endpoint (inventory and disk transfers from ESXi), introduced in Forklift 2.6

    +
  • +
  • +

    vCenter Server endpoint; no networks for the ESXi host (inventory and disk transfers from vCenter)

    +
  • +
  • +

    vCenter endpoint and ESXi networks are available (inventory from vCenter, disk transfers from ESXi).

    +
  • +
+
+
+

When transferring many VMs that are registered to multiple ESXi hosts, using the vCenter endpoint and ESXi network is suggested.

+
+
+ + + + + +
+ + +
+

As of vSphere 7.0, ESXi hosts can label which network to use for NBD transport. This is accomplished by tagging the desired virtual network interface card (NIC) with the appropriate vSphereBackupNFC label.  When this is done, Forklift will be able to utilize the ESXi interface for network transfer to Openshift as long as the worker and ESXi host interfaces are reachable.  This is especially useful when migration users may not have access to the ESXi credentials yet would like to be able to control which ESXi interface is used for migration. 

+
+
+

For more details, see: (Forklift-1230)

+
+
+
+
+

You can use the following ESXi command, which designates interface vmk2 for NBD backup:

+
+
+
+
esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
+
+
+
+
+

Set ESXi hosts BIOS profile and ESXi Host Power Management for High Performance

+
+

Where possible, ensure that hosts used to perform migrations are set with BIOS profiles related to maximum performance.  Hosts which use Host Power Management controlled within vSphere should check that High Performance is set.

+
+
+

Testing showed that when transferring more than 10 VMs with both BIOS and host power management set accordingly, migrations had an increase of 15 MiB in the average datastore read rate.

+
+
+
+

Avoid additional network load on VMware networks

+
+

You can reduce the network load on VMware networks by selecting the migration network when using the ESXi endpoint.

+
+
+

By incorporating a virtualization provider, Forklift enables the selection of a specific network, which is accessible on the ESXi hosts, for the purpose of migrating virtual machines to OCP.  Selecting this migration network from the ESXi host in the Forklift UI will ensure that the transfer is performed using the selected network as an ESXi endpoint..

+
+
+

It is imperative to ensure that the network selected has connectivity to the OCP interface, has adequate bandwidth for migrations, and that the network interface is not saturated.

+
+
+

In environments with fast networks, such as 10GbE networks, migration network impacts can be expected to match the rate of ESXi datastore reads.

+
+
+
+

Control maximum concurrent disk migrations per ESXi host.

+
+

Set the MAX_VM_INFLIGHT MTV variable to control the maximum number of concurrent VMs transfers allowed for the ESXi host. 

+
+
+

Forklift allows for concurrency to be controlled using this variable; by default, it is set to 20.

+
+
+

When setting MAX_VM_INFLIGHT, consider the number of maximum concurrent VMs transfers are required for ESXi hosts. It is important to consider the type of migration to be transferred concurrently. Warm migrations, which are defined by migrations of a running VM that will be migrated over a scheduled time.

+
+
+

Warm migrations use snapshots to compare and migrate only the differences between previous snapshots of the disk.  The migration of the differences between snapshots happens over specific intervals before a final cut-over of the running VM to OKD occurs. 

+
+
+

In Forklift 2.6, MAX_VM_INFLIGHT reserves one transfer slot per VM, regardless of current migration activity for a specific snapshot or the number of disks that belong to a single vm. The total set by MAX_VM_INFLIGHT is used to indicate how many concurrent VM tranfers per ESXi host is allowed.

+
+
+
Examples
+
    +
  • +

    MAX_VM_INFLIGHT = 20 and 2 ESXi hosts defined in the provider mean each host can transfer 20 VMs.

    +
  • +
+
+
+
+

Migrations are completed faster when migrating multiple VMs concurrently

+
+

When multiple VMs from a specific ESXi host are to be migrated, starting concurrent migrations for multiple VMs leads to faster migration times. 

+
+
+

Testing demonstrated that migrating 10 VMs (each containing 35 GiB of data, with a total size of 50 GiB) from a single host is significantly faster than migrating the same number of VMs sequentially, one after another. 

+
+
+

It is possible to increase concurrent migration to more than 10 virtual machines from a single host, but it does not show a significant improvement. 

+
+
+
Examples
+
    +
  • +

    1 single disk VMs took 6 minutes, with migration rate of 100 MiB/s

    +
  • +
  • +

    10 single disk VMs took 22 minutes, with migration rate of 272 MiB/s

    +
  • +
  • +

    20 single disk VMs took 42 minutes, with migration rate of 284 MiB/s

    +
  • +
+
+
+ + + + + +
+ + +
+

From the aforementioned examples, it is evident that the migration of 10 virtual machines simultaneously is three times faster than the migration of identical virtual machines in a sequential manner.

+
+
+

The migration rate was almost the same when moving 10 or 20 virtual machines simultaneously.

+
+
+
+
+
+

Migrations complete faster using multiple hosts.

+
+

Using multiple hosts with registered VMs equally distributed among the ESXi hosts used for migrations leads to faster migration times.

+
+
+

Testing showed that when transferring more than 10 single disk VMS, each containing 35 GiB of data out of a total of 50G total, using an additional host can reduce migration time.

+
+
+
Examples
+
    +
  • +

    80 single disk VMs, containing 35 GiB of data each, using a single host took 2 hours and 43 minutes, with a migration rate of 294 MiB/s.

    +
  • +
  • +

    80 single disk VMs, containing 35 GiB of data each, using 8 ESXi hosts took 41 minutes, with a migration rate of 1,173 MiB/s.

    +
  • +
+
+
+ + + + + +
+ + +
+

From the aforementioned examples, it is evident that migrating 80 VMs from 8 ESXi hosts, 10 from each host, concurrently is four times faster than running the same VMs from a single ESXi host. 

+
+
+

Migrating a larger number of VMs from more than 8 ESXi hosts concurrently could potentially show increased performance. However, it was not tested and therefore not recommended.

+
+
+
+
+
+

Multiple migration plans compared to a single large migration plan

+
+

The maximum number of disks that can be referenced by a single migration plan is 500. For more details, see (MTV-1203)

+
+
+

When attempting to migrate many VMs in a single migration plan, it can take some time for all migrations to start.  By breaking up one migration plan into several migration plans, it is possible to start them at the same time.

+
+
+

Comparing migrations of:

+
+
+
    +
  • +

    500 VMs using 8 ESXi hosts in 1 plan, max_vm_inflight=100, took 5 hours and 10 minutes.

    +
  • +
  • +

    800 VMs using 8 ESXi hosts with 8 plans, max_vm_inflight=100, took 57 minutes.

    +
  • +
+
+
+

Testing showed that by breaking one single large plan into multiple moderately sized plans, for example, 100 VMS per plan, the total migration time can be reduced.

+
+
+
+

Maximum values tested

+
+
    +
  • +

    Maximum number of ESXi hosts tested: 8

    +
  • +
  • +

    Maximum number of VMs in a single migration plan: 500

    +
  • +
  • +

    Maximum number of VMs migrated in a single test: 5000

    +
  • +
  • +

    Maximum number of migration plans performed concurrently: 40

    +
  • +
  • +

    Maximum single disk size migrated: 6 T disks, which contained 3 Tb of data

    +
  • +
  • +

    Maximum number of disks on a single VM migrated: 50

    +
  • +
  • +

    Highest observed single datastore read rate from a single ESXi server:  312 MiB/second

    +
  • +
  • +

    Highest observed multi-datastore read rate using eight ESXi servers and two datastores: 1,242 MiB/second

    +
  • +
  • +

    Highest observed virtual NIC transfer rate to an OpenShift worker: 327 MiB/second

    +
  • +
  • +

    Maximum migration transfer rate of a single disk: 162 MiB/second (rate observed when transferring nonconcurrent migration of 1.5 Tb utilized data)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from a single ESXi host: 294 MiB/s (concurrent migration of 30 VMs, 35/50 GiB used, from Single ESXi)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from multiple ESXi hosts: 1173MB/s (concurrent migration of 80 VMs, 35/50 GiB used, from 8 ESXi servers, 10 VMs from each ESXi)

    +
  • +
+
+
+

For additional details on performance, see Forklift performance addendum

+
+
+
+
+
+

Troubleshooting

+
+
+

This section provides information for troubleshooting common migration issues.

+
+
+

Error messages

+
+

This section describes error messages and how to resolve them.

+
+
+
warm import retry limit reached
+

The warm import retry limit reached error message is displayed during a warm migration if a VMware virtual machine (VM) has reached the maximum number (28) of changed block tracking (CBT) snapshots during the precopy stage.

+
+
+

To resolve this problem, delete some of the CBT snapshots from the VM and restart the migration plan.

+
+
+
Unable to resize disk image to required size
+

The Unable to resize disk image to required size error message is displayed when migration fails because a virtual machine on the target provider uses persistent volumes with an EXT4 file system on block storage. The problem occurs because the default overhead that is assumed by CDI does not completely include the reserved place for the root partition.

+
+
+

To resolve this problem, increase the file system overhead in CDI to more than 10%.

+
+
+
+

Using the must-gather tool

+
+

You can collect logs and information about Forklift custom resources (CRs) by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, migration plan, or virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+ + +
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Collecting logs and CR information
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_id> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      + + + + + +
      1Specify the VM ID as it appears in the Plan CR.
      +
      +
    • +
    +
    +
  6. +
+
+
+
+

Architecture

+
+

This section describes Forklift custom resources, services, and workflows.

+
+
+

Forklift custom resources and services

+
+

Forklift is provided as an OKD Operator. It creates and manages the following custom resources (CRs) and services.

+
+
+
Forklift custom resources
+
    +
  • +

    Provider CR stores attributes that enable Forklift to connect to and interact with the source and target providers.

    +
  • +
  • +

    NetworkMapping CR maps the networks of the source and target providers.

    +
  • +
  • +

    StorageMapping CR maps the storage of the source and target providers.

    +
  • +
  • +

    Plan CR contains a list of VMs with the same migration parameters and associated network and storage mappings.

    +
  • +
  • +

    Migration CR runs a migration plan.

    +
    +

    Only one Migration CR per migration plan can run at a given time. You can create multiple Migration CRs for a single Plan CR.

    +
    +
  • +
+
+
+
Forklift services
+
    +
  • +

    The Inventory service performs the following actions:

    +
    +
      +
    • +

      Connects to the source and target providers.

      +
    • +
    • +

      Maintains a local inventory for mappings and plans.

      +
    • +
    • +

      Stores VM configurations.

      +
    • +
    • +

      Runs the Validation service if a VM configuration change is detected.

      +
    • +
    +
    +
  • +
  • +

    The Validation service checks the suitability of a VM for migration by applying rules.

    +
  • +
  • +

    The Migration Controller service orchestrates migrations.

    +
    +

    When you create a migration plan, the Migration Controller service validates the plan and adds a status label. If the plan fails validation, the plan status is Not ready and the plan cannot be used to perform a migration. If the plan passes validation, the plan status is Ready and it can be used to perform a migration. After a successful migration, the Migration Controller service changes the plan status to Completed.

    +
    +
  • +
  • +

    The Populator Controller service orchestrates disk transfers using Volume Populators.

    +
  • +
  • +

    The Kubevirt Controller and Containerized Data Import (CDI) Controller services handle most technical operations.

    +
  • +
+
+
+
+

High-level migration workflow

+
+

The high-level workflow shows the migration process from the point of view of the user:

+
+
+
    +
  1. +

    You create a source provider, a target provider, a network mapping, and a storage mapping.

    +
  2. +
  3. +

    You create a Plan custom resource (CR) that includes the following resources:

    +
    +
      +
    • +

      Source provider

      +
    • +
    • +

      Target provider, if Forklift is not installed on the target cluster

      +
    • +
    • +

      Network mapping

      +
    • +
    • +

      Storage mapping

      +
    • +
    • +

      One or more virtual machines (VMs)

      +
    • +
    +
    +
  4. +
  5. +

    You run a migration plan by creating a Migration CR that references the Plan CR.

    +
    +

    If you cannot migrate all the VMs for any reason, you can create multiple Migration CRs for the same Plan CR until all VMs are migrated.

    +
    +
  6. +
  7. +

    For each VM in the Plan CR, the Migration Controller service records the VM migration progress in the Migration CR.

    +
  8. +
  9. +

    Once the data transfer for each VM in the Plan CR completes, the Migration Controller service creates a VirtualMachine CR.

    +
    +

    When all VMs have been migrated, the Migration Controller service updates the status of the Plan CR to Completed. The power state of each source VM is maintained after migration.

    +
    +
  10. +
+
+
+
+

Detailed migration workflow

+
+

You can use the detailed migration workflow to troubleshoot a failed migration.

+
+
+

The workflow describes the following steps:

+
+
+

Warm Migration or migration to a remote OpenShift cluster:

+
+
+
    +
  1. +

    When you create the Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
  7. +

    The CDI Controller service creates an importer pod.

    +
  8. +
  9. +

    The importer pod streams the VM disk to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The Migration Controller service creates a conversion pod with the PVCs attached to it when importing from VMWare.

    +
    +

    The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the target VM.

    +
    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from oVirt or OpenStack to the local OpenShift cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates for each source VM disk a PersistentVolumeClaim CR, and an OvirtVolumePopulator when the source is oVirt, or an OpenstackVolumePopulator CR when the source is OpenStack.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Populator Controller service creates a temporarily persistent volume claim (PVC).

    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
    +
      +
    • +

      The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

      +
    • +
    +
    +
  6. +
  7. +

    The Populator Controller service creates a populator pod.

    +
  8. +
  9. +

    The populator pod transfers the disk data to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The temporary PVC is deleted, and the initial PVC points to the PV with the data.

    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from VMWare to the local OpenShift cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a blank persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
+
+
+

For all VM disks:

+
+
+
    +
  1. +

    The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

    +
  2. +
  3. +

    The Migration Controller service creates a conversion pod for all PVCs.

    +
  4. +
  5. +

    The conversion pod runs virt-v2v, which converts the VM to the KVM hypervisor and transfers the disks' data to their corresponding PVs.

    +
    +

    After the VM disks are transferred:

    +
    +
  6. +
  7. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  8. +
  9. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  10. +
+
+
+
+
+

Logs and custom resources

+
+

You can download logs and custom resource (CR) information for troubleshooting. For more information, see the detailed migration workflow.

+
+
+

Collected logs and custom resource information

+
+

You can download logs and custom resource (CR) yaml files for the following targets by using the OKD web console or the command line interface (CLI):

+
+
+
    +
  • +

    Migration plan: Web console or CLI.

    +
  • +
  • +

    Virtual machine: Web console or CLI.

    +
  • +
  • +

    Namespace: CLI only.

    +
  • +
+
+
+

The must-gather tool collects the following logs and CR files in an archive file:

+
+
+
    +
  • +

    CRs:

    +
    +
      +
    • +

      DataVolume CR: Represents a disk mounted on a migrated VM.

      +
    • +
    • +

      VirtualMachine CR: Represents a migrated VM.

      +
    • +
    • +

      Plan CR: Defines the VMs and storage and network mapping.

      +
    • +
    • +

      Job CR: Optional: Represents a pre-migration hook, a post-migration hook, or both.

      +
    • +
    +
    +
  • +
  • +

    Logs:

    +
    +
      +
    • +

      importer pod: Disk-to-data-volume conversion log. The importer pod naming convention is importer-<migration_plan>-<vm_id><5_char_id>, for example, importer-mig-plan-ed90dfc6-9a17-4a8btnfh, where ed90dfc6-9a17-4a8 is a truncated oVirt VM ID and btnfh is the generated 5-character ID.

      +
    • +
    • +

      conversion pod: VM conversion log. The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the VM. The conversion pod naming convention is <migration_plan>-<vm_id><5_char_id>.

      +
    • +
    • +

      virt-launcher pod: VM launcher log. When a migrated VM is powered on, the virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

      +
    • +
    • +

      forklift-controller pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      forklift-must-gather-api pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      hook-job pod: The log is filtered for hook jobs. The hook-job naming convention is <migration_plan>-<vm_id><5_char_id>, for example, plan2j-vm-3696-posthook-4mx85 or plan2j-vm-3696-prehook-mwqnl.

      +
      + + + + + +
      + + +
      +

      Empty or excluded log files are not included in the must-gather archive file.

      +
      +
      +
      +
    • +
    +
    +
  • +
+
+
+
Example must-gather archive structure for a VMware migration plan
+
+
must-gather
+└── namespaces
+    ├── target-vm-ns
+    │   ├── crs
+    │   │   ├── datavolume
+    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
+    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
+    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
+    │   │   └── virtualmachine
+    │   │       ├── test-test-rhel8-2disks2nics.yaml
+    │   │       └── test-x2019.yaml
+    │   └── logs
+    │       ├── importer-mig-plan-vm-7595-tkhdz
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-7595-5qvqp
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-8325-xccfw
+    │       │   └── current.log
+    │       ├── mig-plan-vm-7595-4glzd
+    │       │   └── current.log
+    │       └── mig-plan-vm-8325-4zw49
+    │           └── current.log
+    └── openshift-mtv
+        ├── crs
+        │   └── plan
+        │       └── mig-plan-cold.yaml
+        └── logs
+            ├── forklift-controller-67656d574-w74md
+            │   └── current.log
+            └── forklift-must-gather-api-89fc7f4b6-hlwb6
+                └── current.log
+
+
+
+
+

Downloading logs and custom resource information from the web console

+
+

You can download logs and information about custom resources (CRs) for a completed, failed, or canceled migration plan or for migrated virtual machines (VMs) by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Get logs beside a migration plan name.

    +
  4. +
  5. +

    In the Get logs window, click Get logs.

    +
    +

    The logs are collected. A Log collection complete message is displayed.

    +
    +
  6. +
  7. +

    Click Download logs to download the archive file.

    +
  8. +
  9. +

    To download logs for a migrated VM, click a migration plan name and then click Get logs beside the VM.

    +
  10. +
+
+
+
+

Accessing logs and custom resource information from the command line interface

+
+

You can access logs and information about custom resources (CRs) from the command line interface by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, a completed, failed, or canceled migration plan, or a migrated virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+ + +
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_name> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      + + + + + +
      1You must specify the VM name, not the VM ID, as it appears in the Plan CR.
      +
      +
    • +
    +
    +
  6. +
+
+
+
+
+
+
+

Additional information

+
+
+

Forklift performance addendum

+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+
+

ESXi performance

+
+
Single ESXi performance
+

Test migration using the same ESXi host.

+
+
+

In each iteration, the total VMs are increased, to display the impact of concurrent migration on the duration.

+
+
+

The results show that migration time is linear when increasing the total VMs (50 GiB disk, Utilization 70%).

+
+
+

The optimal number of VMs per ESXi is 10.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 12. Single ESXi tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, Private Network [1]

2.6

7.0.3

100

cold

0:21:39

cold migration, 20 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

0:41:16

cold migration, 30 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:00:59

cold migration, 40 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:23:02

cold migration, 50 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:46:24

cold migration, 80 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

2:42:49

cold migration, 100 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

3:25:15

+
+
Multi ESXi hosts and single data store
+

In each iteration, the number of ESXi hosts were increased, to show that increasing the number of ESXi hosts improves the migration time (50 GiB disk, Utilization 70%).

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 13. Multi ESXi hosts and single data store
Test Case DescriptionMTVVDDKMax_vm inflightMigration TypeTotal Duration

cold migration, 100 VMs, Single ESXi, Private Network [2]

2.6

7.0.3

100

cold

3:25:15

cold migration, 100 VMs, 4 ESXs (25 VMs per ESX), Private Network

2.6

7.0.3

100

cold

1:22:27

cold migration, 100 VMs, 5 ESXs (20 VMs per ESX), Private Network, 1 DataStore

2.6

7.0.3

100

cold

1:04:57

+
+
+

Different migration network performance

+
+

Each iteration the Migration Network was changed, using the Provider, to find the fastest network for migration.

+
+
+

The results show that there is no degradation using management compared to non-managment networks when all interfaces and network speeds are the same.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 14. Different migration network tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, MGMT Network

2.6

7.0.3

100

cold

0:21:30

cold migration, 10 VMs, Single ESXi, Private Network [3]

2.6

7.0.3

20

cold

0:21:20

cold migration, 10 VMs, Single ESXi, Default Network

2.6.2

7.0.3

20

cold

0:21:30

+
+
+
+
+
+
+
+1. Private Network refers to a non -Management network +
+
+2. Private Network refers to a non-Management network +
+
+3. Private Network refers to a non-Management network +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/index.html new file mode 100644 index 00000000000..2f9ce3de4d9 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/index.html @@ -0,0 +1,255 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About cold and warm migration

+
+
+
+

Forklift supports cold migration from:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

Forklift supports warm migration from VMware vSphere and from oVirt.

+
+
+
+
+

Cold migration

+
+
+

Cold migration is the default migration type. The source virtual machines are shut down while the data is copied.

+
+
+ + + + + +
+
Note
+
+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_qemu-guest-agent.adoc[]

+
+
+
+
+
+
+

Warm migration

+
+
+

Most of the data is copied during the precopy stage while the source virtual machines (VMs) are running.

+
+
+

Then the VMs are shut down and the remaining data is copied during the cutover stage.

+
+
+
Precopy stage
+

The VMs are not shut down during the precopy stage.

+
+
+

The VM disks are copied incrementally by using changed block tracking (CBT) snapshots. The snapshots are created at one-hour intervals by default. You can change the snapshot interval by updating the forklift-controller deployment.

+
+
+ + + + + +
+
Important
+
+
+

You must enable CBT for each source VM and each VM disk.

+
+
+

A VM can support up to 28 CBT snapshots. If the source VM has too many CBT snapshots and the Migration Controller service is not able to create a new snapshot, warm migration might fail. The Migration Controller service deletes each snapshot when the snapshot is no longer required.

+
+
+
+
+

The precopy stage runs until the cutover stage is started manually or is scheduled to start.

+
+
+
Cutover stage
+

The VMs are shut down during the cutover stage and the remaining data is migrated. Data stored in RAM is not migrated.

+
+
+

You can start the cutover stage manually by using the Forklift console or you can schedule a cutover time in the Migration manifest.

+
+
+
+
+

Advantages and disadvantages of cold and warm migrations

+
+
+

Overview

+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_cold-warm-comparison-table.adoc[]

+
+
+
+

Detailed description

+
+

The table that follows offers a more detailed description of the advantages and disadvantages of each type of migration. It assumes that you have installed Red Hat Enterprise Linux (RHEL) 9 on the OKD platform on which you installed Forklift.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Detailed description of advantages and disadvantages
Cold migrationWarm migration

Fail fast

Each VM is converted to be compatible with OKD and, if the conversion is successful, the VM is transferred. If a VM cannot be converted, the migration fails immediately.

For each VM, Forklift creates a snapshot and transfers it to OKD. When you start the cutover, Forklift creates the last snapshot, transfers it, and then converts the VM.

Tools

Forklift only.

Forklift and CDI from KubeVirt.

Parallelism

Disks must be transferred sequentially.

Disks can be transferred in parallel using different pods.

+
+ + + + + +
+
Note
+
+
+

The preceding table describes the situation for VMs that are running because the main benefit of warm migration is the reduced downtime, and there is no reason to initiate warm migration for VMs that are down. However, performing warm migration for VMs that are down is not the same as cold migration, even when Forklift uses virt-v2v and RHEL 9. For VMs that are down, Forklift transfers the disks using CDI, unlike in cold migration.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When importing from VMware, there are additional factors which impact the migration speed such as limits related to ESXi, vSphere. or VDDK.

+
+
+
+
+
+

Conclusions

+
+

Based on the preceding information, we can draw the following conclusions about cold migration vs. warm migration:

+
+
+
    +
  • +

    The shortest downtime of VMs can be achieved by using warm migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data on a single disk can be achieved by using cold migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data that is spread evenly across multiple disks can be achieved by using warm migration.

    +
  • +
+
+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-hook-crs-for-migration-plans-api/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-hook-crs-for-migration-plans-api/index.html new file mode 100644 index 00000000000..f73614f35c0 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-hook-crs-for-migration-plans-api/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

API-based hooks for Forklift migration plans

+
+

You can add hooks to a migration plan from the command line by using the Forklift API.

+
+

Default hook image

+
+

The default hook image for an Forklift hook is registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2. The image is based on the Ansible Runner image with the addition of python-openshift to provide Ansible Kubernetes resources and a recent oc binary.

+
+

Hook execution

+
+

An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a ConfigMap. The hook container is run as a job on the desired cluster, using the default ServiceAccount in the konveyor-forklift namespace.

+
+

PreHooks and PostHooks

+
+

You specify hooks per VM and you can run each as a PreHook or a PostHook. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration.

+
+
+

When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook.

+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
Example PreHook:
+
+
kind: Plan
+apiVersion: forklift.konveyor.io/v1beta1
+metadata:
+  name: test
+  namespace: konveyor-forklift
+spec:
+  vms:
+    - id: vm-2861
+      hooks:
+        - hook:
+            namespace: konveyor-forklift
+            name: playbook
+          step: PreHook
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-rego-files/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-rego-files/index.html new file mode 100644 index 00000000000..8d382c1a370 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-rego-files/index.html @@ -0,0 +1,104 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About Rego files

+
+

Validation rules are written in Rego, the Open Policy Agent (OPA) native query language. The rules are stored as .rego files in the /usr/share/opa/policies/io/konveyor/forklift/<provider> directory of the Validation pod.

+
+
+

Each validation rule is defined in a separate .rego file and tests for a specific condition. If the condition evaluates as true, the rule adds a {“category”, “label”, “assessment”} hash to the concerns. The concerns content is added to the concerns key in the inventory record of the VM. The web console displays the content of the concerns key for each VM in the provider inventory.

+
+
+

The following .rego file example checks for distributed resource scheduling enabled in the cluster of a VMware VM:

+
+
+
drs_enabled.rego example
+
+
package io.konveyor.forklift.vmware (1)
+
+has_drs_enabled {
+    input.host.cluster.drsEnabled (2)
+}
+
+concerns[flag] {
+    has_drs_enabled
+    flag := {
+        "category": "Information",
+        "label": "VM running in a DRS-enabled cluster",
+        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
+    }
+}
+
+
+
+
    +
  1. +

    Each validation rule is defined within a package. The package namespaces are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

    +
  2. +
  3. +

    Query parameters are based on the input key of the Validation service JSON.

    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/index.html new file mode 100644 index 00000000000..015598b9240 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/index.html @@ -0,0 +1,108 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Checking the default validation rules

+
+

Before you create a custom rule, you must check the default rules of the Validation service to ensure that you do not create a rule that redefines an existing default value.

+
+
+

Example: If a default rule contains the line default valid_input = false and you create a custom rule that contains the line default valid_input = true, the Validation service will not start.

+
+
+
Procedure
+
    +
  1. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  2. +
  3. +

    Go to the OPA policies directory for your provider:

    +
    +
    +
    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> (1)
    +
    +
    +
    +
      +
    1. +

      Specify vmware or ovirt.

      +
    2. +
    +
    +
  4. +
  5. +

    Search for the default policies:

    +
    +
    +
    $ grep -R "default" *
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/index.html new file mode 100644 index 00000000000..7891fb4bce1 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Accessing logs and custom resource information from the command line interface

+
+

You can access logs and information about custom resources (CRs) from the command line interface by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, a completed, failed, or canceled migration plan, or a migrated virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_name> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        You must specify the VM name, not the VM ID, as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/index.html new file mode 100644 index 00000000000..bbdce8ba627 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Downloading logs and custom resource information from the web console

+
+

You can download logs and information about custom resources (CRs) for a completed, failed, or canceled migration plan or for migrated virtual machines (VMs) by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Get logs beside a migration plan name.

    +
  4. +
  5. +

    In the Get logs window, click Get logs.

    +
    +

    The logs are collected. A Log collection complete message is displayed.

    +
    +
  6. +
  7. +

    Click Download logs to download the archive file.

    +
  8. +
  9. +

    To download logs for a migrated VM, click a migration plan name and then click Get logs beside the VM.

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hook-crs-to-migration-plans-api/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hook-crs-to-migration-plans-api/index.html new file mode 100644 index 00000000000..e78d1905ee2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hook-crs-to-migration-plans-api/index.html @@ -0,0 +1,302 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding Hook CRs to a VM migration by using the Forklift API

+
+

You can add a PreHook or a PostHook Hook CR when you migrate a virtual machine from the command line by using the Forklift API. A PreHook runs before a migration, a PostHook, after.

+
+
+ + + + + +
+
Note
+
+
+

You can retrieve additional information stored in a secret or in a configMap by using a k8s module.

+
+
+
+
+

For example, you can create a hook CR to install cloud-init on a VM and write a file before migration.

+
+
+
Procedure
+
    +
  1. +

    If needed, create a secret with an SSH private key for the VM. You can either use an existing key or generate a key pair, install the public key on the VM, and base64 encode the private key in the secret.

    +
    +
    +
    apiVersion: v1
    +data:
    +  key: VGhpcyB3YXMgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbiBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZS4KSXQgaXMgbm90IHVzZWQgYW55d2hlcmUuCi0tLS0tQkVHSU4gT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCmIzQmxibk56YUMxclpYa3RkakVBQUFBQUJHNXZibVVBQUFBRWJtOXVaUUFBQUFBQUFBQUJBQUFCbHdBQUFBZHpjMmd0Y24KTmhBQUFBQXdFQUFRQUFBWUVBMzVTTFRReDBFVjdPTWJQR0FqcEsxK2JhQURTTVFuK1NBU2pyTGZLNWM5NGpHdzhDbnA4LwovRHErZHFBR1pxQkg2ZnAxYmVJM1BZZzVWVDk0RVdWQ2RrTjgwY3dEcEo0Z1R0NHFUQ1gzZUYvY2x5VXQyUC9zaTNjcnQ0CjBQdi9wVnZXU1U2TlhHaDJIZC93V0MwcGh5Z0RQOVc5SHRQSUF0OFpnZmV2ZnUwZHpraVl6OHNVaElWU2ZsRGpaNUFqcUcKUjV2TVVUaGlrczEvZVlCeTdiMkFFSEdzYU8xN3NFbWNiYUlHUHZuUFVwWmQrdjkyYU1JdWZoYjhLZkFSbzZ3Ty9ISW1VbQovdDdHWFBJUmxBMUhSV0p1U05odTQzZS9DY3ZYd3Z6RnZrdE9kYXlEQzBMTklHMkpVaURlNWd0UUQ1WHZXc1p3MHQvbEs1CklacjFrZXZRNUJsYWNISmViV1ZNYUQvdllpdFdhSFo4OEF1Y0czaGh2bjkrOGNSTGhNVExiVlFSMWh2UVpBL1JtQXN3eE0KT3VJSmRaUmtxTThLZlF4Z28zQThRNGJhQW1VbnpvM3Zwa0FWdC9uaGtIOTRaRE5rV2U2RlRhdThONStyYTJCZkdjZVA4VApvbjFEeTBLRlpaUlpCREVVRVc0eHdTYUVOYXQ3c2RDNnhpL1d5OURaQUFBRm1NRFBXeDdBejFzZUFBQUFCM056YUMxeWMyCkVBQUFHQkFOK1VpMDBNZEJGZXpqR3p4Z0k2U3RmbTJnQTBqRUova2dFbzZ5M3l1WFBlSXhzUEFwNmZQL3c2dm5hZ0JtYWcKUituNmRXM2lOejJJT1ZVL2VCRmxRblpEZk5ITUE2U2VJRTdlS2t3bDkzaGYzSmNsTGRqLzdJdDNLN2VORDcvNlZiMWtsTwpqVnhvZGgzZjhGZ3RLWWNvQXovVnZSN1R5QUxmR1lIM3IzN3RIYzVJbU0vTEZJU0ZVbjVRNDJlUUk2aGtlYnpGRTRZcExOCmYzbUFjdTI5Z0JCeHJHanRlN0JKbkcyaUJqNzV6MUtXWGZyL2RtakNMbjRXL0Nud0VhT3NEdnh5SmxKdjdleGx6eUVaUU4KUjBWaWJrallidU4zdnduTDE4TDh4YjVMVG5Xc2d3dEN6U0J0aVZJZzN1WUxVQStWNzFyR2NOTGY1U3VTR2E5WkhyME9RWgpXbkJ5WG0xbFRHZy83MklyVm1oMmZQQUxuQnQ0WWI1L2Z2SEVTNFRFeTIxVUVkWWIwR1FQMFpnTE1NVERyaUNYV1VaS2pQCkNuME1ZS053UEVPRzJnSmxKODZONzZaQUZiZjU0WkIvZUdRelpGbnVoVTJydkRlZnEydGdYeG5Iai9FNko5UTh0Q2hXV1UKV1FReEZCRnVNY0VtaERXcmU3SFF1c1l2MXN2UTJRQUFBQU1CQUFFQUFBR0JBSlZtZklNNjdDQmpXcU9KdnFua2EvakRrUwo4TDdpSE5mekg1TnRZWVdPWmRMTlk2L0lRa1pDeFcwTWtSKzlUK0M3QUZKZzBNV2Q5ck5PeUxJZDkxNjZoOVJsNG0xdFJjCnViZ1o2dWZCZ3hGVDlXS21mSEdCNm4zelh5b2pQOEFJTnR6ODVpaUVHVXFFRWtVRVdMd0RGSmdvcFllQ3l1VmZ2ZE92MUgKRm1WWmEwNVo0b3NQNkNENXVmc2djQ1RYQTR6VnZ5ZHVCYkxqdHN5RjdYZjNUdjZUQ1QxU0swZHErQk1OOXRvb0RZaXpwagpzbDh6NzlybXp3eUFyWFlVcnFUUkpsNmpwRkNrWHJLcy9LeG96MHhhbXlMY2RORk9hWE51LzlnTkpjRERsV2hPcFRqNHk4CkpkNXBuV1Jueis1RHJLRFdhY0loUW1CMUxVd2ZLWmQwbVFxaUpzMUMxcXZVUmlKOGExaThKUTI4bHFuWTFRRk9wbk13emcKWEpla2FndThpT1ExRFJlQkhaM0NkcVJUYnY3bVJZSGxramx0dXJmZGc4M3hvM0ErZ1JSR001eUVOcW5xSkplQjhJQVB5UwptMFp0dGdqbHNqNTJ2K1B1NmExMHoxZndKK1VML2N6dTRKeEpOYlp6WTFIMnpLODJBaVI1T3JYNmx2aUEvSWFSRVcwUUFBCkFNQndVeUJpcUc5bEZCUnltL2UvU1VORVMzdHpicUZNdTdIcy84WTV5SnAxKzR6OXUxNGtJR2ttV0Y5eE5HT3hrY3V0cWwKeHVUcndMbjFUaFNQTHQrTjUwTGhVdzR4ZjBhNUxqemdPbklPU0FRbm5HY1Nxa0dTRDlMR21obGE2WmpydFBHY29lQ3JHdAo5M1Vvcmx5YkxNRzFFRFAxWmpKS1RaZzl6OUMwdDlTTGd3ei9DbFhydW9UNXNQVUdKWnUrbHlIZXpSTDRtcHl6OEZMcnlOCkdNci9leVM5bWdISjNVVkZEYjNIZ3BaK1E1SUdBRU5rZVZEcHIwMGhCZXZndGd6YWtBQUFEQkFQVXQ1RitoMnBVby94V1YKenRkcVQvMzA4dFB5MXVMMU1lWFoydEJPQmRwSDJyd0JzdWt0aTIySGtWZUZXQjJFdUlFUXppMzY3MGc1UGdxR1p4Vng4dQpobEE0Rkg4ZXN1NTNQckZqVW9EeFJhb3d3WXBFcFh5Y2pnNUE1MStwR1VQcWljWjB0YjliaWlhc3BWWXZhWW5sdGlnVG5iClN0UExMY29nemNiL0dGcVYyaXlzc3lwTlMwKzBNRTUxcEtxWGNaS2swbi8vVHpZWWs4TW8vZzRsQ3pmUEZQUlZrVVM5blIKWU1pQzRlcEk0TERmbVdnM0xLQ2N1Zk85all3aWgwYlFBQUFNRUE2WEtldDhEMHNvc0puZVh5WFZGd0dyVyszNlhBVGRQTwpMWDdjaStjYzFoOGV1eHdYQWx3aTJJNFhxSmJBVjBsVEhuVGEycXN3Uy9RQlpJUUJWSkZlVjVyS1daZTc4R2F3d1pWTFZNCldETmNwdFFyRTFaM2pGNS9TdUVzdlVxSDE0Tkc5RUFXWG1iUkNzelE0Vlk3NzQrSi9sTFkvMnlDT1diNzlLYTJ5OGxvYUoKVXczWWVtSld3blp2R3hKNldsL3BmQ2xYN3lEVXlXUktLdGl0cWNjbmpCWVkyRE1tZURwdURDYy9ZdDZDc3dLRmRkMkJ1UwpGZGt5cDlZY3VMaDlLZEFBQUFIR3BoYzI5dVFFRlVMVGd3TWxVdWJXOXVkR3hsYjI0dWFXNTBjbUVCQWdNRUJRWT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCgo=
    +kind: Secret
    +metadata:
    +  name: ssh-credentials
    +  namespace: konveyor-forklift
    +type: Opaque
    +
    +
    +
  2. +
  3. +

    Encode your playbook by conncatenating a file and piping it for base64, for example:

    +
    +
    +
    $ cat playbook.yml | base64 -w0
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can also use a here document to encode a playbook:

    +
    +
    +
    +
    $ cat << EOF | base64 -w0
    +- hosts: localhost
    +  tasks:
    +  - debug:
    +      msg: test
    +EOF
    +
    +
    +
    +
    +
  4. +
  5. +

    Create a Hook CR:

    +
    +
    +
    apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: playbook
    +  namespace: konveyor-forklift
    +spec:
    +  image: registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2
    +  playbook: LSBuYW1lOiBNYWluCiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogIC0gbmFtZTogTG9hZCBQbGFuCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHBsYW4ueW1sCiAgICAgIG5hbWU6IHBsYW4KCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHdvcmtsb2FkLnltbAogICAgICBuYW1lOiB3b3JrbG9hZAoKICAtIG5hbWU6IAogICAgZ2V0ZW50OgogICAgICBkYXRhYmFzZTogcGFzc3dkCiAgICAgIGtleTogInt7IGFuc2libGVfdXNlcl9pZCB9fSIKICAgICAgc3BsaXQ6ICc6JwoKICAtIG5hbWU6IEVuc3VyZSBTU0ggZGlyZWN0b3J5IGV4aXN0cwogICAgZmlsZToKICAgICAgcGF0aDogfi8uc3NoCiAgICAgIHN0YXRlOiBkaXJlY3RvcnkKICAgICAgbW9kZTogMDc1MAogICAgZW52aXJvbm1lbnQ6CiAgICAgIEhPTUU6ICJ7eyBhbnNpYmxlX2ZhY3RzLmdldGVudF9wYXNzd2RbYW5zaWJsZV91c2VyX2lkXVs0XSB9fSIKCiAgLSBrOHNfaW5mbzoKICAgICAgYXBpX3ZlcnNpb246IHYxCiAgICAgIGtpbmQ6IFNlY3JldAogICAgICBuYW1lOiBzc2gtY3JlZGVudGlhbHMKICAgICAgbmFtZXNwYWNlOiBrb252ZXlvci1mb3JrbGlmdAogICAgcmVnaXN0ZXI6IHNzaF9jcmVkZW50aWFscwoKICAtIG5hbWU6IENyZWF0ZSBTU0gga2V5CiAgICBjb3B5OgogICAgICBkZXN0OiB+Ly5zc2gvaWRfcnNhCiAgICAgIGNvbnRlbnQ6ICJ7eyBzc2hfY3JlZGVudGlhbHMucmVzb3VyY2VzWzBdLmRhdGEua2V5IHwgYjY0ZGVjb2RlIH19IgogICAgICBtb2RlOiAwNjAwCgogIC0gYWRkX2hvc3Q6CiAgICAgIG5hbWU6ICJ7eyB3b3JrbG9hZC52bS5pcGFkZHJlc3MgfX0iCiAgICAgIGFuc2libGVfdXNlcjogcm9vdAogICAgICBncm91cHM6IHZtcwoKLSBob3N0czogdm1zCiAgdGFza3M6CiAgLSBuYW1lOiBJbnN0YWxsIGNsb3VkLWluaXQKICAgIGRuZjoKICAgICAgbmFtZToKICAgICAgLSBjbG91ZC1pbml0CiAgICAgIHN0YXRlOiBsYXRlc3QKCiAgLSBuYW1lOiBDcmVhdGUgVGVzdCBGaWxlCiAgICBjb3B5OgogICAgICBkZXN0OiAvdGVzdC50eHQKICAgICAgY29udGVudDogIkhlbGxvIFdvcmxkIgogICAgICBtb2RlOiAwNjQ0Cg==
    +  serviceAccount: forklift-controller (1)
    +
    +
    +
    +
      +
    1. +

      Specify a serviceAccount to run the hook with in order to control access to resources on the cluster.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      To decode an attached playbook retrieve the resource with custom output and pipe it to base64. For example:

      +
      +
      +
      +
       oc get -n konveyor-forklift hook playbook -o \
      +   go-template='{{ .spec.playbook }}' | base64 -d
      +
      +
      +
      +
      +
      +

      The playbook encoded here runs the following:

      +
      +
      +
      +
      - name: Main
      +  hosts: localhost
      +  tasks:
      +  - name: Load Plan
      +    include_vars:
      +      file: plan.yml
      +      name: plan
      +
      +  - name: Load Workload
      +    include_vars:
      +      file: workload.yml
      +      name: workload
      +
      +  - name:
      +    getent:
      +      database: passwd
      +      key: "{{ ansible_user_id }}"
      +      split: ':'
      +
      +  - name: Ensure SSH directory exists
      +    file:
      +      path: ~/.ssh
      +      state: directory
      +      mode: 0750
      +    environment:
      +      HOME: "{{ ansible_facts.getent_passwd[ansible_user_id][4] }}"
      +
      +  - k8s_info:
      +      api_version: v1
      +      kind: Secret
      +      name: ssh-credentials
      +      namespace: konveyor-forklift
      +    register: ssh_credentials
      +
      +  - name: Create SSH key
      +    copy:
      +      dest: ~/.ssh/id_rsa
      +      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      +      mode: 0600
      +
      +  - add_host:
      +      name: "{{ workload.vm.ipaddress }}"
      +      ansible_user: root
      +      groups: vms
      +
      +- hosts: vms
      +  tasks:
      +  - name: Install cloud-init
      +    dnf:
      +      name:
      +      - cloud-init
      +      state: latest
      +
      +  - name: Create Test File
      +    copy:
      +      dest: /test.txt
      +      content: "Hello World"
      +      mode: 0644
      +
      +
      +
    2. +
    +
    +
  6. +
  7. +

    Create a Plan CR using the hook:

    +
    +
    +
    kind: Plan
    +apiVersion: forklift.konveyor.io/v1beta1
    +metadata:
    +  name: test
    +  namespace: konveyor-forklift
    +spec:
    +  map:
    +    network:
    +      namespace: "konveyor-forklift"
    +      name: "network"
    +    storage:
    +      namespace: "konveyor-forklift"
    +      name: "storage"
    +  provider:
    +    source:
    +      namespace: "konveyor-forklift"
    +      name: "boston"
    +    destination:
    +      namespace: "konveyor-forklift"
    +      name: host
    +  targetNamespace: "konveyor-forklift"
    +  vms:
    +    - id: vm-2861
    +      hooks:
    +        - hook:
    +            namespace: konveyor-forklift
    +            name: playbook
    +          step: PreHook (1)
    +
    +
    +
    +
      +
    1. +

      Options are PreHook, to run the hook before the migration, and PostHook, to run the hook after the migration.

      +
    2. +
    +
    +
  8. +
+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/index.html new file mode 100644 index 00000000000..ff885be082c --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/index.html @@ -0,0 +1,82 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/index.html new file mode 100644 index 00000000000..09569d2008e --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding a KubeVirt destination provider

+
+

You can add a KubeVirt destination provider to the OKD web console in addition to the default KubeVirt destination provider, which is the provider where you installed Forklift.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select KubeVirt from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Specify the provider name to display in the list of target providers.

      +
    • +
    • +

      Kubernetes API server URL: Specify the OKD cluster API endpoint.

      +
    • +
    • +

      Service account token: Specify the cluster-admin service account token.

      +
      +

      If both URL and Service account token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-cli/index.html new file mode 100644 index 00000000000..63e88682b81 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-cli/index.html @@ -0,0 +1,132 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel an entire migration or individual virtual machines (VMs) while a migration is in progress from the command line interface (CLI).

+
+
+
Canceling an entire migration
+
    +
  • +

    Delete the Migration CR:

    +
    +
    +
    $ kubectl delete migration <migration> -n <namespace> (1)
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    +
    +
  • +
+
+
+
Canceling the migration of individual VMs
+
    +
  1. +

    Add the individual VMs to the spec.cancel block of the Migration manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration>
    +  namespace: <namespace>
    +...
    +spec:
    +  cancel:
    +  - id: vm-102 (1)
    +  - id: vm-203
    +  - name: rhel8-vm
    +EOF
    +
    +
    +
    +
      +
    1. +

      You can specify a VM by using the id key or the name key.

      +
      +

      The value of the id key is the managed object reference, for a VMware VM, or the VM UUID, for a oVirt VM.

      +
      +
    2. +
    +
    +
  2. +
  3. +

    Retrieve the Migration CR to monitor the progress of the remaining VMs:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/index.html new file mode 100644 index 00000000000..cedb188de5b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel the migration of some or all virtual machines (VMs) while a migration plan is in progress by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization.

    +
  2. +
  3. +

    Click the name of a running migration plan to view the migration details.

    +
  4. +
  5. +

    Select one or more VMs and click Cancel.

    +
  6. +
  7. +

    Click Yes, cancel to confirm the cancellation.

    +
    +

    In the Migration details by VM list, the status of the canceled VMs is Canceled. The unmigrated and the migrated virtual machines are not affected.

    +
    +
  8. +
+
+
+

You can restart a canceled migration by clicking Restart beside the migration plan on the Migration plans page.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/index.html new file mode 100644 index 00000000000..41ade68818b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Changing precopy intervals for warm migration

+
+

You can change the snapshot interval by patching the ForkliftController custom resource (CR).

+
+
+
Procedure
+
    +
  • +

    Patch the ForkliftController CR:

    +
    +
    +
    $ kubectl patch forkliftcontroller/<forklift-controller> -n konveyor-forklift -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge (1)
    +
    +
    +
    +
      +
    1. +

      Specify the precopy interval in minutes. The default value is 60.

      +
      +

      You do not need to restart the forklift-controller pod.

      +
      +
    2. +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/collected-logs-cr-info/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/collected-logs-cr-info/index.html new file mode 100644 index 00000000000..2358db5fb13 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/collected-logs-cr-info/index.html @@ -0,0 +1,183 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Collected logs and custom resource information

+
+

You can download logs and custom resource (CR) yaml files for the following targets by using the OKD web console or the command line interface (CLI):

+
+
+
    +
  • +

    Migration plan: Web console or CLI.

    +
  • +
  • +

    Virtual machine: Web console or CLI.

    +
  • +
  • +

    Namespace: CLI only.

    +
  • +
+
+
+

The must-gather tool collects the following logs and CR files in an archive file:

+
+
+
    +
  • +

    CRs:

    +
    +
      +
    • +

      DataVolume CR: Represents a disk mounted on a migrated VM.

      +
    • +
    • +

      VirtualMachine CR: Represents a migrated VM.

      +
    • +
    • +

      Plan CR: Defines the VMs and storage and network mapping.

      +
    • +
    • +

      Job CR: Optional: Represents a pre-migration hook, a post-migration hook, or both.

      +
    • +
    +
    +
  • +
  • +

    Logs:

    +
    +
      +
    • +

      importer pod: Disk-to-data-volume conversion log. The importer pod naming convention is importer-<migration_plan>-<vm_id><5_char_id>, for example, importer-mig-plan-ed90dfc6-9a17-4a8btnfh, where ed90dfc6-9a17-4a8 is a truncated oVirt VM ID and btnfh is the generated 5-character ID.

      +
    • +
    • +

      conversion pod: VM conversion log. The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the VM. The conversion pod naming convention is <migration_plan>-<vm_id><5_char_id>.

      +
    • +
    • +

      virt-launcher pod: VM launcher log. When a migrated VM is powered on, the virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

      +
    • +
    • +

      forklift-controller pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      forklift-must-gather-api pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      hook-job pod: The log is filtered for hook jobs. The hook-job naming convention is <migration_plan>-<vm_id><5_char_id>, for example, plan2j-vm-3696-posthook-4mx85 or plan2j-vm-3696-prehook-mwqnl.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Empty or excluded log files are not included in the must-gather archive file.

      +
      +
      +
      +
    • +
    +
    +
  • +
+
+
+
Example must-gather archive structure for a VMware migration plan
+
+
must-gather
+└── namespaces
+    ├── target-vm-ns
+    │   ├── crs
+    │   │   ├── datavolume
+    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
+    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
+    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
+    │   │   └── virtualmachine
+    │   │       ├── test-test-rhel8-2disks2nics.yaml
+    │   │       └── test-x2019.yaml
+    │   └── logs
+    │       ├── importer-mig-plan-vm-7595-tkhdz
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-7595-5qvqp
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-8325-xccfw
+    │       │   └── current.log
+    │       ├── mig-plan-vm-7595-4glzd
+    │       │   └── current.log
+    │       └── mig-plan-vm-8325-4zw49
+    │           └── current.log
+    └── openshift-mtv
+        ├── crs
+        │   └── plan
+        │       └── mig-plan-cold.yaml
+        └── logs
+            ├── forklift-controller-67656d574-w74md
+            │   └── current.log
+            └── forklift-must-gather-api-89fc7f4b6-hlwb6
+                └── current.log
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/index.html new file mode 100644 index 00000000000..1c7d2835188 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/index.html @@ -0,0 +1,66 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/index.html new file mode 100644 index 00000000000..0a4cbe3a5eb --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Software compatibility guidelines

+
+
+
+

You must install compatible software versions.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.3.0

4.10 or later

4.10 or later

6.5 or later

4.4 SP1 or later

16.1 or later

+
+ + + + + +
+
Note
+
+
Migration from oVirt 4.3
+
+

Forklift was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3. While not supported, basic migrations from oVirt 4.3 are expected to work.

+
+
+

Generally it is advised to upgrade oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+

Therefore, it is recommended to upgrade oVirt to the supported version above before the migration to KubeVirt.

+
+
+

However, migrations from oVirt 4.3.11 were tested with Forklift 2.3, and may work in practice in many environments using Forklift 2.3. In this case, we advise upgrading oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+
+
+
+
+

OpenShift Operator Life Cycles

+
+
+

For more information about the software maintenance Life Cycle classifications for Operators shipped by Red Hat for use with OpenShift Container Platform, see OpenShift Operator Life Cycles.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/configuring-mtv-operator/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/configuring-mtv-operator/index.html new file mode 100644 index 00000000000..20b4893bcb4 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/configuring-mtv-operator/index.html @@ -0,0 +1,202 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring the Forklift Operator

+
+

You can configure all of the following settings of the Forklift Operator by modifying the ForkliftController CR, or in the Settings section of the Overview page, unless otherwise indicated.

+
+
+
    +
  • +

    Maximum number of virtual machines (VMs) per plan that can be migrated simultaneously.

    +
  • +
  • +

    How long must gather reports are retained before being automatically deleted.

    +
  • +
  • +

    CPU limit allocated to the main controller container.

    +
  • +
  • +

    Memory limit allocated to the main controller container.

    +
  • +
  • +

    Interval at which a new snapshot is requested before initiating a warm migration.

    +
  • +
  • +

    Frequency with which the system checks the status of snapshot creation or removal during a warm migration.

    +
  • +
  • +

    Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem (ForkliftController CR only).

    +
  • +
  • +

    Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for vSphere source providers (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for oVirt (oVirt) source providers (ForkliftController CR only).

    +
  • +
+
+
+

The procedure for configuring these settings using the user interface is presented in Configuring MTV settings. The procedure for configuring these settings by modifying the ForkliftController CR is presented following.

+
+
+
Procedure
+
    +
  • +

    Change a parameter’s value in the spec portion of the ForkliftController CR by adding the label and value as follows:

    +
  • +
+
+
+
+
spec:
+  label: value (1)
+
+
+
+
    +
  1. +

    Labels you can configure using the CLI are shown in the table that follows, along with a description of each label and its default value.

    +
  2. +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift Operator labels
LabelDescriptionDefault value

controller_max_vm_inflight

The maximum number of VMs per plan that can be migrated simultaneously.

20

must_gather_api_cleanup_max_age

The duration in hours for retaining must gather reports before they are automatically deleted.

-1 (disabled)

controller_container_limits_cpu

The CPU limit allocated to the main controller container.

500m

controller_container_limits_memory

The memory limit allocated to the main controller container.

800Mi

controller_precopy_interval

The interval in minutes at which a new snapshot is requested before initiating a warm migration.

60

controller_snapshot_status_check_rate_seconds

The frequency in seconds with which the system checks the status of snapshot creation or removal during a warm migration.

10

controller_filesystem_overhead

Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem.

+

ForkliftController CR only.

10

controller_block_overhead

Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based. It can be used when data, such as encryption headers, is written to the persistent volumes in addition to the content of the virtual disk.

+

ForkliftController CR only.

0

vsphere_osmap_configmap_name

Configuration map for vSphere source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-vsphere-osmap. In order to override or delete values, specify a configuration map that is different from forklift-vsphere-osmap.

+

ForkliftController CR only.

forklift-vsphere-osmap

ovirt_osmap_configmap_name

Configuration map for oVirt source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-ovirt-osmap. In order to override or delete values, specify a configuration map that is different from forklift-ovirt-osmap.

+

ForkliftController CR only.

forklift-ovirt-osmap

+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan-2-6-3/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan-2-6-3/index.html new file mode 100644 index 00000000000..59998ab4acf --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan-2-6-3/index.html @@ -0,0 +1,139 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map. +. Enter the Plan name. +. Make any needed changes to the editable items. +. Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings. +. Click Create migration plan.

+
+
+

+ +Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

+
+
+
    +
  1. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  2. +
  3. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  4. +
  5. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      +

      Unresolved directive in creating-migration-plan-2-6-3.adoc - include::snip_vmware-name-change.adoc[]

      +
      +
    4. +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/index.html new file mode 100644 index 00000000000..036b89a58e4 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/index.html @@ -0,0 +1,270 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a migration plan

+
+

You can create a migration plan by using the OKD web console.

+
+
+

A migration plan allows you to group virtual machines to be migrated together or with the same migration parameters, for example, a percentage of the members of a cluster or a complete application.

+
+
+

You can configure a hook to run an Ansible playbook or custom container image during a specified stage of the migration plan.

+
+
+
Prerequisites
+
    +
  • +

    If Forklift is not installed on the target cluster, you must add a target provider on the Providers page of the web console.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Create plan.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Plan name: Enter a migration plan name to display in the migration plan list.

      +
    • +
    • +

      Plan description: Optional: Brief description of the migration plan.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    • +

      Target namespace: Do one of the following:

      +
      +
        +
      • +

        Select a target namespace from the list

        +
      • +
      • +

        Create a target namespace by typing its name in the text box, and then clicking create "<the_name_you_entered>"

        +
      • +
      +
      +
    • +
    • +

      You can change the migration transfer network for this plan by clicking Select a different network, selecting a network from the list, and then clicking Select.

      +
      +

      If you defined a migration transfer network for the KubeVirt provider and if the network is in the target namespace, the network that you defined is the default network for all migration plans. Otherwise, the pod network is used.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Click Next.

    +
  8. +
  9. +

    Select options to filter the list of source VMs and click Next.

    +
  10. +
  11. +

    Select the VMs to migrate and then click Next.

    +
  12. +
  13. +

    Select an existing network mapping or create a new network mapping.

    +
  14. +
  15. +

    . Optional: Click Add to add an additional network mapping.

    +
    +

    To create a new network mapping:

    +
    +
    +
      +
    • +

      Select a target network for each source network.

      +
    • +
    • +

      Optional: Select Save current mapping as a template and enter a name for the network mapping.

      +
    • +
    +
    +
  16. +
  17. +

    Click Next.

    +
  18. +
  19. +

    Select an existing storage mapping, which you can modify, or create a new storage mapping.

    +
    +

    To create a new storage mapping:

    +
    +
    +
      +
    1. +

      If your source provider is VMware, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    +
    +
  20. +
  21. +

    Optional: Select Save current mapping as a template and enter a name for the storage mapping.

    +
  22. +
  23. +

    Click Next.

    +
  24. +
  25. +

    Select a migration type and click Next.

    +
    +
      +
    • +

      Cold migration: The source VMs are stopped while the data is copied.

      +
    • +
    • +

      Warm migration: The source VMs run while the data is copied incrementally. Later, you will run the cutover, which stops the VMs and copies the remaining VM data and metadata.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Warm migration is supported only from vSphere and oVirt.

      +
      +
      +
      +
    • +
    +
    +
  26. +
  27. +

    Click Next.

    +
  28. +
  29. +

    Optional: You can create a migration hook to run an Ansible playbook before or after migration:

    +
    +
      +
    1. +

      Click Add hook.

      +
    2. +
    3. +

      Select the Step when the hook will be run: pre-migration or post-migration.

      +
    4. +
    5. +

      Select a Hook definition:

      +
      +
        +
      • +

        Ansible playbook: Browse to the Ansible playbook or paste it into the field.

        +
      • +
      • +

        Custom container image: If you do not want to use the default hook-runner image, enter the image path: <registry_path>/<image_name>:<tag>.

        +
        + + + + + +
        +
        Note
        +
        +
        +

        The registry must be accessible to your OKD cluster.

        +
        +
        +
        +
      • +
      +
      +
    6. +
    +
    +
  30. +
  31. +

    Click Next.

    +
  32. +
  33. +

    Review your migration plan and click Finish.

    +
    +

    The migration plan is saved on the Plans page.

    +
    +
    +

    You can click the {kebab} of the migration plan and select View details to verify the migration plan details.

    +
    +
  34. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/index.html new file mode 100644 index 00000000000..3296969c677 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/index.html @@ -0,0 +1,122 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a network mapping

+
+

You can create one or more network mappings by using the OKD web console to map source networks to KubeVirt networks.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    If you map more than one source and target network, each additional KubeVirt network requires its own network attachment definition.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationNetworkMaps for virtualization.

    +
  2. +
  3. +

    Click Create NetworkMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the network mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    Select a Source network and a Target namespace/network.

    +
  8. +
  9. +

    Optional: Click Add to create additional network mappings or to map multiple source networks to a single target network.

    +
  10. +
  11. +

    If you create an additional network mapping, select the network attachment definition as the target network.

    +
  12. +
  13. +

    Click Create.

    +
    +

    The network mapping is displayed on the NetworkMaps screen.

    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-storage-mapping/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-storage-mapping/index.html new file mode 100644 index 00000000000..3c7b6803215 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-storage-mapping/index.html @@ -0,0 +1,138 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a storage mapping

+
+

You can create a storage mapping by using the OKD web console to map source disk storages to KubeVirt storage classes.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    Local and shared persistent storage that support VM migration.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationStorageMaps for virtualization.

    +
  2. +
  3. +

    Click Create StorageMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the storage mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    To create a storage mapping, click Add and map storage sources to target storage classes as follows:

    +
    +
      +
    1. +

      If your source provider is VMware vSphere, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    7. +

      If your source provider is a set of one or more OVA files, select a Source and a Target storage class for the dummy storage that applies to all virtual disks within the OVA files.

      +
    8. +
    9. +

      If your storage provider is KubeVirt. select a Source storage class and a Target storage class.

      +
    10. +
    11. +

      Optional: Click Add to create additional storage mappings, including mapping multiple storage sources to a single target storage class.

      +
    12. +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The mapping is displayed on the StorageMaps page.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/index.html new file mode 100644 index 00000000000..d025862940e --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/index.html @@ -0,0 +1,238 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a validation rule

+
+

You create a validation rule by applying a config map custom resource (CR) containing the rule to the Validation service.

+
+
+ + + + + +
+
Important
+
+
+
    +
  • +

    If you create a rule with the same name as an existing rule, the Validation service performs an OR operation with the rules.

    +
  • +
  • +

    If you create a rule that contradicts a default rule, the Validation service will not start.

    +
  • +
+
+
+
+
+
Validation rule example
+

Validation rules are based on virtual machine (VM) attributes collected by the Provider Inventory service.

+
+
+

For example, the VMware API uses this path to check whether a VMware VM has NUMA node affinity configured: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"].

+
+
+

The Provider Inventory service simplifies this configuration and returns a testable attribute with a list value:

+
+
+
+
"numaNodeAffinity": [
+    "0",
+    "1"
+],
+
+
+
+

You create a Rego query, based on this attribute, and add it to the forklift-validation-config config map:

+
+
+
+
`count(input.numaNodeAffinity) != 0`
+
+
+
+
Procedure
+
    +
  1. +

    Create a config map CR according to the following example:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: <forklift-validation-config>
    +  namespace: konveyor-forklift
    +data:
    +  vmware_multiple_disks.rego: |-
    +    package <provider_package> (1)
    +
    +    has_multiple_disks { (2)
    +      count(input.disks) > 1
    +    }
    +
    +    concerns[flag] {
    +      has_multiple_disks (3)
    +        flag := {
    +          "category": "<Information>", (4)
    +          "label": "Multiple disks detected",
    +          "assessment": "Multiple disks detected on this VM."
    +        }
    +    }
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the provider package name. Allowed values are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

      +
    2. +
    3. +

      Specify the concerns name and Rego query.

      +
    4. +
    5. +

      Specify the concerns name and flag parameter values.

      +
    6. +
    7. +

      Allowed values are Critical, Warning, and Information.

      +
    8. +
    +
    +
  2. +
  3. +

    Stop the Validation pod by scaling the forklift-controller deployment to 0:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=0 deployment/forklift-controller
    +
    +
    +
  4. +
  5. +

    Start the Validation pod by scaling the forklift-controller deployment to 1:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=1 deployment/forklift-controller
    +
    +
    +
  6. +
  7. +

    Check the Validation pod log to verify that the pod started:

    +
    +
    +
    $ kubectl logs -f <validation_pod>
    +
    +
    +
    +

    If the custom rule conflicts with a default rule, the Validation pod will not start.

    +
    +
  8. +
  9. +

    Remove the source provider:

    +
    +
    +
    $ kubectl delete provider <provider> -n konveyor-forklift
    +
    +
    +
  10. +
  11. +

    Add the source provider to apply the new rule:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <provider>
    +  namespace: konveyor-forklift
    +spec:
    +  type: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  secret:
    +    name: <secret> (3)
    +    namespace: konveyor-forklift
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ovirt, vsphere, and openstack.

      +
    2. +
    3. +

      Specify the API end point URL, for example, https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for oVirt, or https://<identity_service>/v3 for {osp}.

      +
    4. +
    5. +

      Specify the name of the provider Secret CR.

      +
    6. +
    +
    +
  12. +
+
+
+

You must update the rules version after creating a custom rule so that the Inventory service detects the changes and validates the VMs.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/index.html new file mode 100644 index 00000000000..ea6c6cc92c4 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/index.html @@ -0,0 +1,201 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift can use the VMware Virtual Disk Development Kit (VDDK) SDK to accelerate transferring virtual disks from VMware vSphere.

+
+
+ + + + + +
+
Note
+
+
+

Creating a VDDK image, although optional, is highly recommended.

+
+
+
+
+

To make use of this feature, you download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry.

+
+
+

The VDDK package contains symbolic links, therefore, the procedure of creating a VDDK image must be performed on a file system that preserves symbolic links (symlinks).

+
+
+ + + + + +
+
Note
+
+
+

Storing the VDDK image in a public registry might violate the VMware license terms.

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    You are working on a file system that preserves symbolic links (symlinks).

    +
  • +
  • +

    If you are using an external registry, KubeVirt must be able to access it.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create and navigate to a temporary directory:

    +
    +
    +
    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
    +
    +
    +
  2. +
  3. +

    In a browser, navigate to the VMware VDDK version 8 download page.

    +
  4. +
  5. +

    Select version 8.0.1 and click Download.

    +
  6. +
+
+
+ + + + + +
+
Note
+
+
+

In order to migrate to KubeVirt 4.12, download VDDK version 7.0.3.2 from the VMware VDDK version 7 download page.

+
+
+
+
+
    +
  1. +

    Save the VDDK archive file in the temporary directory.

    +
  2. +
  3. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  4. +
  5. +

    Create a Dockerfile:

    +
    +
    +
    $ cat > Dockerfile <<EOF
    +FROM registry.access.redhat.com/ubi8/ubi-minimal
    +USER 1001
    +COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    +RUN mkdir -p /opt
    +ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    +EOF
    +
    +
    +
  6. +
  7. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  8. +
  9. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  10. +
  11. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/index.html new file mode 100644 index 00000000000..9d2e86ffc93 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/index.html @@ -0,0 +1,83 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Error messages

+
+

This section describes error messages and how to resolve them.

+
+
+
warm import retry limit reached
+

The warm import retry limit reached error message is displayed during a warm migration if a VMware virtual machine (VM) has reached the maximum number (28) of changed block tracking (CBT) snapshots during the precopy stage.

+
+
+

To resolve this problem, delete some of the CBT snapshots from the VM and restart the migration plan.

+
+
+
Unable to resize disk image to required size
+

The Unable to resize disk image to required size error message is displayed when migration fails because a virtual machine on the target provider uses persistent volumes with an EXT4 file system on block storage. The problem occurs because the default overhead that is assumed by CDI does not completely include the reserved place for the root partition.

+
+
+

To resolve this problem, increase the file system overhead in CDI to more than 10%.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..999c62adec4 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_OpenShift_0121 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..473e21ba4e2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_OpenShift_0121 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..33a031a0909 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_0121 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..e73192c0102 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_0121 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.png b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..06e9d1b249453946a449c8ba5d88c1014e7e3940 GIT binary patch literal 7554 zcmb`MhdW%)7x0x8gkTA)i%#^_HfnT>sEJ-y+Ylvs?@^;An+_xBgP&-1>|Gjr$Od*+#E&Y3yqe(sqxQ)9hbH`#BJkdWMh>T8=5Tf%>p z>IU(ex^1gUY^eS8Z32n%iT^68rbuBJ@g-#t^nniL3N1aof*|uatv3k?7cW#><6+qJ zzoN%)xVn&-lF$UO2#p}ZTUtY)H~ki)^9vG=T$uFNUB;6FfrNH1SSWVOT@@ZZQSDfm zuA%LUkvWm)a~fe!)CB;&3iP08GU~8FPK48=yQD9$IJU^Ydh?U>_rli zK}5L#{cMnL$%7&#h+v_I2iYIfG;Y?nJ3}QDhexq^#nr$dVftxXyFyD^yRRkAuO1lP zpd*d2^v|6*-rSbo$WO=2Wpxj+{13C`S+;y{DA(jtio?5n~9QHBvtx^=97C7nx0-hKDPIQHV**{Uw>u^ zut?bSwov@cZ-d>#T!!D3Ayb?bjRgRH0PigafjQ_&gze79E*gY^uiA z62>Z*`(TAp-0{S0(p74?R=urfI+(+?lc}U)%G3ab|Hi#VcY`|=rJS~$m>$!(UFEsn zTIfn?tU|Q*s(gJPCLbwRL{X(UPbmkbo zYdRUZtA=>lL9lB2IB=`{gc`?#AXG*FR$ZEv|Mw;dSM|YQcM1doA2w1P{hjJ}Ea4ec zYtD8%N{yde818x`9DAO-D|oC*G>@N=f?+9w`tq&6E5u_q|B3jMck7$C=Eq)TO*5Jq zxX%7lZ~ItUd11d{+%8uxD_T-i5TWR!(wVd)fMAj&tb!LS1zyX4c<7R{D;Y%Tmd4te z!eLMBtQlPVB3!BZT6Mw!GWlQU?(S~n!z7dZgL?c!tw_H0P065?SA%W)=lUEKJr%bL&Bv~@+eCl+i}+a~rsMG&$3ySLCn88GKR7`)XGSf_4iToj zUfXWi`w`(bFzT?;%dF(a(JJg#Z2WzV zsFT~??HB*v?D5w%BHn}(*2@-xc8n#1%6z43$?rvU&NpqLqGj*=r0aw$g<|) zR~`M{K3w_vF-wUxF=wKCn&3|Y_x`g;K&rZl6?kn^^A*v;SQ(B<2EC0;=v0aCw%p}( zP3QwnGlvao-fv#9YCkJ41$=^Um0S|!riw22CL-jY-Lp0qROOP(da z%5^^NlIuBa$UjF`3eNY1m74wFTzn|uwDA1oK-`1eN&25%r)^@qPHLEmi$&q zWhQYUZPVmU^4vVt8OkMN?t~z|{T9k@=gEqS4||_npuMLy$tAixnL9q76(RB1A=X@< z4AD)7>85I`M`CkXc3l<=#FqvYYV1a({&U-uIM=`EJ~fKsJQ*#IZqfDYKRPu8b=Zi> zlk(^_@}KcQ;8GUA(ePY-LM2)ZMKfIylGJ)5%(tf6=^S=6ON_E(k3*$WOJ1Pk0UUAT zg;Vc|^K;2Z3aHY(VF3m)+Tj-uKEStHnCWO<^(#Qt+We{PXC#(HO%FpZ zkjW>VlIijeIbfU~%I&9>>$hGwmAMJpDF_*i#!){qouzx02bA@I>F#DZnk0psC5_oJ zRXd6N9l(ZQ@_%JZe=ah~o_{|<3a@)O!hz!kY6#cVk{U^NAUR~KYJ*=5*E5E!C&$#3 z*#`t`sFtI3Vb^kIJU6|aV6CPF}BVHP9iu!nH|TsL@~yZrQ+ zuKU_%(G4l;fn0f&N?q-urEgtA{UapKz)LVVDGpNM=F63UXF& zcnP|T$QAO2lhOU&^SOSLsuLxL@i6_gnqtis(vxrO`Crny*~%RKIzI9Jb*8mT{_~2e zZYwu|ZqYq~XN(Ouy1D+-N|~q;y(~4IqeoWQLJApuse{*+=7!#j5XUCArY)sn9HjBI zVp_A4R$f|5Rf(r0;G~i#=l hf4Ncv*-{;YlcCgNx+du7|i{_A59EX|F#7*kV=hm z)x|t{I567e`pnXbeJr_x1eNl=Zp>R=PE~F7f+LSbbUO_ow(LX^BJM0N>1LR%+R<-m zCfqQ*mCh!USls9n{1RP1HSXWFgkT@22uvSDBA<(Sk9upFD1JJ8$s~30yIF@SQd?xZ z7iZ=cT5WdIc}T7%=XhE=D$7w%Ux_xKnVFW=9sYCl&n4rjWp4HIz;>6!Qgt&%{junb z?Gl#!8+EOG5cqH+T=T#dHX|-ZYR8_ux!pN9FjN@H30HKmb%iK)ZX-wpF zZJlJ|JXw@bkZjO;u)RySAnYk$?FV$7DCp9~4EUW}Q~KtVHyWHZ5`6zB_1c7NoO=G0 z^1Sw&ru!ou&)2Nj{B=WsJMG{VObNOdQT19*&%Df_CjdICWzyix3 z_~&cyO8r|hIL~p;o)atI{o!vQc%tY^wR?~O5zeum z_y^xIMonB9hHWg1qO#?C{QE?XFkK9*y3kATAFOp^HD%<0vax%T+8s_MJ%1zJ7DJbt z=d?bNW3QGWb9YYGU8pY0*!&~(n*{A4uh2;d-<+TV^h?LjSr*Zn*JiY+wppE7($=sw zNGz~DT3}tfS1Cr^+FCCIv>BkH1)w4E*W}2_sXeOdpiw{ znnm@L5Y&WRPftLd`m|``E6rSaMLu3=ui~psXESi<`qT`Ukl`guoP!AFlF*IcwY2;( z02rjLIsOqz7X3V`^IEZn30&N$F0H6Lt6Ha&+*>Zzq9=vTk7R7%oEKj_nh$^c_De?g zQ?u!_C%jVRJR}`_e~fR~ZxHG1L4V`g&*tIi^fxoWQ>Vy)!=ydwE+kHo|Bo?Q>Df#$ zO4%-~$S0eliY3bc6!BwOCUO29Eq>7Wa_%8#9r#1E8&p4=orV5y~3X2Q|^mQL|Z+hpT+OkKz$8$F#W+ zdE`=6$xZP^_?yMVVf&-E-Gi4Q_8U+Zf(JCR)JeJ~8>;LmO8M%7xp}x~nnB5J_jhzL z@$clX(ZHOl2KSY!gv`f=-WF~9pup)w2n){vF+U21itjQ@oboE`STmO-bOZf-qbNJ26eg&wx>#f`ge-!9J zWt6Sq`i5WM%fa_De{PX)9GCwBD@z`AQeR3#v9d(RGzacSkTG4>67fn`Lb99mh|jg85m_lPy$~rJ-xl7J zR4nqORxjnW1D}K&z}<%BBOR78*pvNNwg-1qT*4OE2d>26bxykBS%4Ut{+l}29u0iE z4Z}(+W|G{zW&^@oHEiE$le9tXkuVE<->%;?wENC_&vI0gXadkB$~dG?f#<5 z7Zy)SW0{(>EB04uJiWI|Y#maW_9SE@r7dCQJbs+%GVHPcfwPLe`aS^kJR- z;}afOh_NN9k*QCBXaB)JanAyDZ8-X}9Bn7~Z$qN99E6IkyrFY7!@3HFF8s7uL{{V+ zJ+;XQ;4E89j4{qki;8)D_6hw@V9w$D36KQc(U>6DJ?f4Hfz~ z55KSP(D&!cjTffVU@bj`rym8>`ZXg}Uuvyj<03_~!?%oa9X9sX_vTVL`d2hOVBlm} zEM5(8vdlzfFJ{GbUNH6fUf({);y3X667{0KtQS6adF89h!$GYRCgS+iB zc{U|F%Jse|>KE9qtbcNuRMeZl3e7kz(I-S?1aOOc+GHG69at`n)hyD#I0{M9Y1N%k zN-!E4l?Cok7%GWmgLm$F>S!12_F{XL9*K{UB6RiHO|{vz1hJ+XsJ55+))a&D;{3O{V!y5^c|ibao>P-MPBjBX@f`7a9YFyu@btJEG1H1QPQ0#8 zXLM`ox*D_pf+DtIxLIc51U zH2k=h^3$RIIZtI@2}^%GHhbx^xC~~&IAukeu{@ap?azwvhBl1ZZ{*xQ>%xWhy}qEp zsjuIJ!Ffm~a=xT0uQz~xZ?U-ITO&I!nIV!#H`6Zk7azOF^fM!}GN}T&eqp^(84o8S zzb_Cq@&*p6s{Og*kd!ZDeYC<{s; zQH=I1C?_S4m13>cEK6+s$I#QjyLS%M5NgkPUla-)XXt;n85wdxAD5%!?~SmT>7uR; zv(_Cs_^-$jgzk?MLQus{{h>CLGBc3iDZ{>88(tdjo*`GJi{3XzCdTMxJ>Dq|YaU!n z@nU!Q5cmQ;B{KqrDoxs;5J@mQ0Hak8Kx`EMC!RM-s*fM01 zwQ?B8R^=WAaPOBz(gfWVJQ5ilU8XU@ivc&QEa{kRpjJ5=D_kf@VSq~L#{GGtHkyDy^`7~HYZLZYQ=SZKs0?x8qua8vresi|#t}+l3 zQuVy4x|G$m#xMm_e_if&^{*v+QC;hVdy8K6_D2B+lN@CTI%zdrDy zxkvZlCkr>0K={qEL_rU*CdHa=X z#?pE@ak-;tX=-S&CtPI#nhW>j1bVxapu$~7yVevO^6zM^k|X~Sk)|s~FT)XQ(cYc= z(g7`F9uGo7>i*P+S1SM3=A*ND{Y`oA?l8aZp7A2vq97T~H&PrZUJBTd`P_wTk3!b& z&%jUryHY2+<>1rygsjm_&H8+;Qsw&_hx%r#Q zzwJG)7C|#xF3PyirE2nvo*!c2187$m3&sV&;*r=b`4vdk^8ZC)diMOEBsbSW`OV~HE%d(Wxt;z zuKixZ1+L$52pCJU7x>mHOHL`yu!EeJlDsYT$G9kb+)SI}Of9}=uBxG{pL;Mh@aCSP zptr>?$u-^VLsFYJ?7_v+1Hj^~M^EUo_h-MLEPmXQ8THN!YD1GBh}g9;=B&Fzdpe`m znt`5N1^m7>=pL7q_3z&x?_Cpj&D=P`Mffh$zjijZbox9gMmvbD$b{Yha5Q0R)h1-8 z7-xp?rF6VeN}}qj>qC}Bxu#F3MFW}pPg-$W2;aQ1nv9{dd+i%SAa$7<&*Nz|gs#I) zhY@WUo!=9nyEn-oiQ~qNY;YMFJ!nQN#7yy;*(oXve z=k%j&%+9d|Tm;WaFx-=SWD_%eNLymy^}{vpJT7{>7gS9%+#}&OVBmgB>@9xHc7E5TvXXtWCt7Z4xv|F?UG9@)vF5^<-e*rVk z-DC@`9`jK)@DC{j$04y?%ybRBe;Ow`!^Z!jZ(@hLRe+Fte3M{U3(^4&4;=93k3&|< z*4V&9*rlmY1^9|+(t(aj@H*Dh8`Wx7(u;d!TOW8YNN1#o_ujIREp$3NW3PteY4~@Z z0$Lf}?OowMxHR+w>aW8bkhX_xiZ%GS3H}6TLPvmnd)asUi{btYl~7PbFq7>EE)L*! z8T{ml(NZmG+jFWAm$Y-T$%vbKCtK^6bXQ-BM{5r#bC5SG^5L{WE(R_CPwYwoNUyiLqv`hC2U;lVQn zVvel+YwG#ALEldS%Mm|VSt`u%r+rl;ZpuBTTL$MY`HWCDy|xk9yWqW7zGrKtYT>jf zh9eJOS>6KTmE-dItm)}Vi7{GUP+v@Ehv(>;-!p^@1Bumc2`&gFa)IktWb|tjfUMnJ zPr4UgVw-qDRd4u9V%98zJQf7>&P7IBcSl&8@x5#V7*TMO*X{Bd$+jmKk@wk`?);&L zpC|@fSG9Zu{cQLczMU5*=9)Si=ZRbAOPDvi&mBuX%Xy{qK=Dc;FC{;}MSrj3OmA@p z=p5Zj%*#^y^6fR}rvDU}Vm(1PAZ({pQnu!S z&KlkkN>9@G#%B9gR36OAk=L!t{f!7VVD!y<)r&U2 zp=jR2<5-b9g9Zr{kIFK}GEtceEux2qKaYmJs@ z#OL&&if|l%CkD1h!7IT`?X&luP)-FS2)P?b(S+LPABXbQbLH9viDU@>QeQaLl^8QZ zqt8b%OTFz5x5^0=D?_T1Ua0X+8spS+_K=2gA1ezB*SDTI2uU720bNANo_i&zZq+kh zUJ~RN@4}wS7Mef5T$5=`gxPsZUOA2w3sw|1$6r6ET01|`5wI0GMvqQMv!k(xl#P^`|hb3x2HO|Cc9%#`Q`cNUa;&8!^_>` z&Kck4d|1R6nh)z81ICOUNybF*#Hi7TQ gbg{?(Q^_@H&scJLf*92(@%)qos$;BOr3p*;KPV)_)c^nh literal 0 HcmV?d00001 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.svg new file mode 100644 index 00000000000..8a846e6361a --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-darkbg.svg @@ -0,0 +1,164 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.png b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8dba83d97f88dbd1722f30a77c915edd4640fe2c GIT binary patch literal 7667 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 V*?3s0ee+>Uq@!i1Spl(){C|U8&Q|~c literal 0 HcmV?d00001 diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.svg b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.svg new file mode 100644 index 00000000000..a8038cdf923 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/forklift-logo-lightbg.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/kebab.png b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/images/kebab.png new file mode 100644 index 0000000000000000000000000000000000000000..81893bd4ad103557f7180529ae228e313e8319c5 GIT binary patch literal 329 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 A + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Increasing the NFC service memory of an ESXi host

+
+

If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host. Otherwise, the migration will fail because the NFC service memory is limited to 10 parallel connections.

+
+
+
Procedure
+
    +
  1. +

    Log in to the ESXi host as root.

    +
  2. +
  3. +

    Change the value of maxMemory to 1000000000 in /etc/vmware/hostd/config.xml:

    +
    +
    +
    ...
    +      <nfcsvc>
    +         <path>libnfcsvc.so</path>
    +         <enabled>true</enabled>
    +         <maxMemory>1000000000</maxMemory>
    +         <maxStreamMemory>10485760</maxStreamMemory>
    +      </nfcsvc>
    +...
    +
    +
    +
  4. +
  5. +

    Restart hostd:

    +
    +
    +
    # /etc/init.d/hostd restart
    +
    +
    +
    +

    You do not need to reboot the host.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/index.html new file mode 100644 index 00000000000..6723c35ac88 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue.md b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue.md new file mode 100644 index 00000000000..30d52ab9cba --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue.md @@ -0,0 +1,15 @@ +## Summary + +(Describe the problem. Don't worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.) + +## What is the problem? + +(Paste the text or a screenshot here. Remember to include the **task number** so that we know which module is affected.) + +## What is the solution? + +(Correct text, link, or task.) + +## Notes + +(Do we need to fix something else?) diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue/index.html new file mode 100644 index 00000000000..52cdcab5357 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue/index.html @@ -0,0 +1,79 @@ + + + + + + + + Summary | Forklift Documentation + + + + + + + + + + + + + +Summary | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + +
+

Summary

+ +

(Describe the problem. Don’t worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.)

+ +

What is the problem?

+ +

(Paste the text or a screenshot here. Remember to include the task number so that we know which module is affected.)

+ +

What is the solution?

+ +

(Correct text, link, or task.)

+ +

Notes

+ +

(Do we need to fix something else?)

+ + + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/known-issues-2-7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/known-issues-2-7/index.html new file mode 100644 index 00000000000..ae43f112ac8 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/known-issues-2-7/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Known issues

+
+

Forklift 2.7 has the following known issues:

+
+
+
Select Migration Network from the endpoint type ESXi displays multiple incorrect networks
+

When you choose Select Migration Network, from the endpoint type of ESXi, multiple incorrect networks are displayed. (MTV-1291)

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+
+
Network and Storage maps in the UI are not correct when created from the command line
+

When creating Network and Storage maps from the UI, the correct names are not shown in the UI. (MTV-1421)

+
+
+
Migration fails with module network-legacy configured in RHEL guests
+

Migration fails if the module configuration file is available in the guest and the dhcp-client package is not installed, returning a dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found error. (MTV-1615)

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 00000000000..fd0eece1bda --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/index.html @@ -0,0 +1,69 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Making open source more inclusive

+
+

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/index.html new file mode 100644 index 00000000000..2d5234ade02 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/index.html @@ -0,0 +1,141 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migration plan options

+
+

On the Plans for virtualization page of the OKD web console, you can click the {kebab} beside a migration plan to access the following options:

+
+
+
    +
  • +

    Get logs: Retrieves the logs of a migration. When you click Get logs, a confirmation window opens. After you click Get logs in the window, wait until Get logs changes to Download logs and then click the button to download the logs.

    +
  • +
  • +

    Edit: Edit the details of a migration plan. You cannot edit a migration plan while it is running or after it has completed successfully.

    +
  • +
  • +

    Duplicate: Create a new migration plan with the same virtual machines (VMs), parameters, mappings, and hooks as an existing plan. You can use this feature for the following tasks:

    +
    +
      +
    • +

      Migrate VMs to a different namespace.

      +
    • +
    • +

      Edit an archived migration plan.

      +
    • +
    • +

      Edit a migration plan with a different status, for example, failed, canceled, running, critical, or ready.

      +
    • +
    +
    +
  • +
  • +

    Archive: Delete the logs, history, and metadata of a migration plan. The plan cannot be edited or restarted. It can only be viewed.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Archive option is irreversible. However, you can duplicate an archived plan.

    +
    +
    +
    +
  • +
  • +

    Delete: Permanently remove a migration plan. You cannot delete a running migration plan.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Delete option is irreversible.

    +
    +
    +

    Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

    +
    +
    +
    +
  • +
  • +

    View details: Display the details of a migration plan.

    +
  • +
  • +

    Restart: Restart a failed or canceled migration plan.

    +
  • +
  • +

    Cancel scheduled cutover: Cancel a scheduled cutover migration for a warm migration plan.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-changelog-2-7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-changelog-2-7/index.html new file mode 100644 index 00000000000..c467dab9c9b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-changelog-2-7/index.html @@ -0,0 +1,2330 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift changelog

+
+
+
+

The following changelog for Forklift includes a full list of packages used in the Forklift 2.7 releases.

+
+
+
+
+

Forklift 2.7 packages

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift packages
Forklift 2.7.0Forklift 2.7.2Forklift 2.7.3

abattis-cantarell-fonts-0.301-4.el9.noarch

abattis-cantarell-fonts-0.301-4.el9.noarch

Abattis-cantarell-fonts-0.301-4.el9.noarch

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glibc-2.34-100.el9_4.3.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.3.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.3.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.3.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtpms-0.9.1-3.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

linux-firmware-20240716-143.2.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240716-143.2.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.46.1-2.el9_4.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html new file mode 100644 index 00000000000..99c663f2770 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html @@ -0,0 +1,214 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV Overview page

+
+
+
+

The Forklift Overview page displays system-wide information about migrations and a list of Settings you can change.

+
+
+

If you have Administrator privileges, you can access the Overview page by clicking MigrationOverview in the OKD web console.

+
+
+

The Overview page has 3 tabs:

+
+
+
    +
  • +

    Overview

    +
  • +
  • +

    YAML

    +
  • +
  • +

    Metrics

    +
  • +
+
+
+
+
+

Overview tab

+
+
+

The Overview tab lets you see:

+
+
+
    +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the Operator

    +
  • +
  • +

    Pods: The name, status, and creation time of each pod that was deployed by the Forklift Operator

    +
  • +
  • +

    Conditions: Status of the Forklift Operator:

    +
    +
      +
    • +

      Failure: Last failure. False indicates no failure since deployment.

      +
    • +
    • +

      Running: Whether the Operator is currently running and waiting for the next reconciliation.

      +
    • +
    • +

      Successful: Last successful reconciliation.

      +
    • +
    +
    +
  • +
+
+
+
+
+

YAML tab

+
+
+

The custom resource ForkliftController that defines the operation of the Forklift Operator. You can modify the custom resource from this tab.

+
+
+
+
+

Metrics tab

+
+
+

The Metrics tab lets you see:

+
+
+
    +
  • +

    Migrations: The number of migrations performed using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
  • +

    Virtual Machine Migrations: The number of VMs migrated using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Since a single migration might involve many virtual machines, the number of migrations performed using Forklift might vary significantly from the number of virtual machines that have been migrated using Forklift.

+
+
+
+
+
    +
  • +

    Chart showing the number of running, failed, and succeeded migrations performed using Forklift for each of the last 7 days

    +
  • +
  • +

    Chart showing the number of running, failed, and succeeded virtual machine migrations performed using Forklift for each of the last 7 days

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-addendum/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-addendum/index.html new file mode 100644 index 00000000000..8fce82d5b2a --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-addendum/index.html @@ -0,0 +1,291 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance addendum

+
+
+
+

Unresolved directive in mtv-performance-addendum.adoc - include::snip_performance.adoc[]

+
+
+
+
+

ESXi performance

+
+
+
Single ESXi performance
+

Test migration using the same ESXi host.

+
+
+

In each iteration, the total VMs are increased, to display the impact of concurrent migration on the duration.

+
+
+

The results show that migration time is linear when increasing the total VMs (50 GiB disk, Utilization 70%).

+
+
+

The optimal number of VMs per ESXi is 10.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Single ESXi tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, Private Network [1]

2.6

7.0.3

100

cold

0:21:39

cold migration, 20 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

0:41:16

cold migration, 30 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:00:59

cold migration, 40 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:23:02

cold migration, 50 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:46:24

cold migration, 80 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

2:42:49

cold migration, 100 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

3:25:15

+
+
Multi ESXi hosts and single data store
+

In each iteration, the number of ESXi hosts were increased, to show that increasing the number of ESXi hosts improves the migration time (50 GiB disk, Utilization 70%).

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Multi ESXi hosts and single data store
Test Case DescriptionMTVVDDKMax_vm inflightMigration TypeTotal Duration

cold migration, 100 VMs, Single ESXi, Private Network [2]

2.6

7.0.3

100

cold

3:25:15

cold migration, 100 VMs, 4 ESXs (25 VMs per ESX), Private Network

2.6

7.0.3

100

cold

1:22:27

cold migration, 100 VMs, 5 ESXs (20 VMs per ESX), Private Network, 1 DataStore

2.6

7.0.3

100

cold

1:04:57

+
+
+
+

Different migration network performance

+
+
+

Each iteration the Migration Network was changed, using the Provider, to find the fastest network for migration.

+
+
+

The results show that there is no degradation using management compared to non-managment networks when all interfaces and network speeds are the same.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Different migration network tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, MGMT Network

2.6

7.0.3

100

cold

0:21:30

cold migration, 10 VMs, Single ESXi, Private Network [3]

2.6

7.0.3

20

cold

0:21:20

cold migration, 10 VMs, Single ESXi, Default Network

2.6.2

7.0.3

20

cold

0:21:30

+
+
+
+
+
+1. Private Network refers to a non -Management network +
+
+2. Private Network refers to a non-Management network +
+
+3. Private Network refers to a non-Management network +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-recommendation/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-recommendation/index.html new file mode 100644 index 00000000000..8b989bce88d --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-recommendation/index.html @@ -0,0 +1,382 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance recommendations

+
+
+
+

The purpose of this section is to share recommendations for efficient and effective migration of virtual machines (VMs) using Forklift, based on findings observed through testing.

+
+
+

Unresolved directive in mtv-performance-recommendation.adoc - include::snip_performance.adoc[]

+
+
+
+
+

Ensure fast storage and network speeds

+
+
+

Ensure fast storage and network speeds, both for VMware and OKD (OCP) environments.

+
+
+
    +
  • +

    To perform fast migrations, VMware must have fast read access to datastores.  Networking between VMware ESXi hosts should be fast, ensure a 10 GiB network connection, and avoid network bottlenecks.

    +
    +
      +
    • +

      Extend the VMware network to the OCP Workers Interface network environment.

      +
    • +
    • +

      It is important to ensure that the VMware network offers high throughput (10 Gigabit Ethernet) and rapid networking to guarantee that the reception rates align with the read rate of the ESXi datastore.

      +
    • +
    • +

      Be aware that the migration process uses significant network bandwidth and that the migration network is utilized. If other services utilize that network, it may have an impact on those services and their migration rates.

      +
    • +
    • +

      For example, 200 to 325 MiB/s was the average network transfer rate from the vmnic for each ESXi host associated with transferring data to the OCP interface.

      +
    • +
    +
    +
  • +
+
+
+
+
+

Ensure fast datastore read speeds to ensure efficient and performant migrations.

+
+
+

Datastores read rates impact the total transfer times, so it is essential to ensure fast reads are possible from the ESXi datastore to the ESXi host.  

+
+
+

Example in numbers: 200 to 300 MiB/s was the average read rate for both vSphere and ESXi endpoints for a single ESXi server. When multiple ESXi servers are used, higher datastore read rates are possible.

+
+
+
+
+

Endpoint types 

+
+
+

Forklift 2.6 allows for the following vSphere provider options:

+
+
+
    +
  • +

    ESXi endpoint (inventory and disk transfers from ESXi), introduced in Forklift 2.6

    +
  • +
  • +

    vCenter Server endpoint; no networks for the ESXi host (inventory and disk transfers from vCenter)

    +
  • +
  • +

    vCenter endpoint and ESXi networks are available (inventory from vCenter, disk transfers from ESXi).

    +
  • +
+
+
+

When transferring many VMs that are registered to multiple ESXi hosts, using the vCenter endpoint and ESXi network is suggested.

+
+
+ + + + + +
+
Note
+
+
+

As of vSphere 7.0, ESXi hosts can label which network to use for NBD transport. This is accomplished by tagging the desired virtual network interface card (NIC) with the appropriate vSphereBackupNFC label.  When this is done, Forklift will be able to utilize the ESXi interface for network transfer to Openshift as long as the worker and ESXi host interfaces are reachable.  This is especially useful when migration users may not have access to the ESXi credentials yet would like to be able to control which ESXi interface is used for migration. 

+
+
+

For more details, see: (Forklift-1230)

+
+
+
+
+

You can use the following ESXi command, which designates interface vmk2 for NBD backup:

+
+
+
+
esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
+
+
+
+
+
+

Set ESXi hosts BIOS profile and ESXi Host Power Management for High Performance

+
+
+

Where possible, ensure that hosts used to perform migrations are set with BIOS profiles related to maximum performance.  Hosts which use Host Power Management controlled within vSphere should check that High Performance is set.

+
+
+

Testing showed that when transferring more than 10 VMs with both BIOS and host power management set accordingly, migrations had an increase of 15 MiB in the average datastore read rate.

+
+
+
+
+

Avoid additional network load on VMware networks

+
+
+

You can reduce the network load on VMware networks by selecting the migration network when using the ESXi endpoint.

+
+
+

By incorporating a virtualization provider, Forklift enables the selection of a specific network, which is accessible on the ESXi hosts, for the purpose of migrating virtual machines to OCP.  Selecting this migration network from the ESXi host in the Forklift UI will ensure that the transfer is performed using the selected network as an ESXi endpoint..

+
+
+

It is imperative to ensure that the network selected has connectivity to the OCP interface, has adequate bandwidth for migrations, and that the network interface is not saturated.

+
+
+

In environments with fast networks, such as 10GbE networks, migration network impacts can be expected to match the rate of ESXi datastore reads.

+
+
+
+
+

Control maximum concurrent disk migrations per ESXi host.

+
+
+

Set the MAX_VM_INFLIGHT MTV variable to control the maximum number of concurrent VMs transfers allowed for the ESXi host. 

+
+
+

Forklift allows for concurrency to be controlled using this variable; by default, it is set to 20.

+
+
+

When setting MAX_VM_INFLIGHT, consider the number of maximum concurrent VMs transfers are required for ESXi hosts. It is important to consider the type of migration to be transferred concurrently. Warm migrations, which are defined by migrations of a running VM that will be migrated over a scheduled time.

+
+
+

Warm migrations use snapshots to compare and migrate only the differences between previous snapshots of the disk.  The migration of the differences between snapshots happens over specific intervals before a final cut-over of the running VM to OKD occurs. 

+
+
+

In Forklift 2.6, MAX_VM_INFLIGHT reserves one transfer slot per VM, regardless of current migration activity for a specific snapshot or the number of disks that belong to a single vm. The total set by MAX_VM_INFLIGHT is used to indicate how many concurrent VM tranfers per ESXi host is allowed.

+
+
+
Examples
+
    +
  • +

    MAX_VM_INFLIGHT = 20 and 2 ESXi hosts defined in the provider mean each host can transfer 20 VMs.

    +
  • +
+
+
+
+
+

Migrations are completed faster when migrating multiple VMs concurrently

+
+
+

When multiple VMs from a specific ESXi host are to be migrated, starting concurrent migrations for multiple VMs leads to faster migration times. 

+
+
+

Testing demonstrated that migrating 10 VMs (each containing 35 GiB of data, with a total size of 50 GiB) from a single host is significantly faster than migrating the same number of VMs sequentially, one after another. 

+
+
+

It is possible to increase concurrent migration to more than 10 virtual machines from a single host, but it does not show a significant improvement. 

+
+
+
Examples
+
    +
  • +

    1 single disk VMs took 6 minutes, with migration rate of 100 MiB/s

    +
  • +
  • +

    10 single disk VMs took 22 minutes, with migration rate of 272 MiB/s

    +
  • +
  • +

    20 single disk VMs took 42 minutes, with migration rate of 284 MiB/s

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that the migration of 10 virtual machines simultaneously is three times faster than the migration of identical virtual machines in a sequential manner.

+
+
+

The migration rate was almost the same when moving 10 or 20 virtual machines simultaneously.

+
+
+
+
+
+
+

Migrations complete faster using multiple hosts.

+
+
+

Using multiple hosts with registered VMs equally distributed among the ESXi hosts used for migrations leads to faster migration times.

+
+
+

Testing showed that when transferring more than 10 single disk VMS, each containing 35 GiB of data out of a total of 50G total, using an additional host can reduce migration time.

+
+
+
Examples
+
    +
  • +

    80 single disk VMs, containing 35 GiB of data each, using a single host took 2 hours and 43 minutes, with a migration rate of 294 MiB/s.

    +
  • +
  • +

    80 single disk VMs, containing 35 GiB of data each, using 8 ESXi hosts took 41 minutes, with a migration rate of 1,173 MiB/s.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that migrating 80 VMs from 8 ESXi hosts, 10 from each host, concurrently is four times faster than running the same VMs from a single ESXi host. 

+
+
+

Migrating a larger number of VMs from more than 8 ESXi hosts concurrently could potentially show increased performance. However, it was not tested and therefore not recommended.

+
+
+
+
+
+
+

Multiple migration plans compared to a single large migration plan

+
+
+

The maximum number of disks that can be referenced by a single migration plan is 500. For more details, see (MTV-1203)

+
+
+

When attempting to migrate many VMs in a single migration plan, it can take some time for all migrations to start.  By breaking up one migration plan into several migration plans, it is possible to start them at the same time.

+
+
+

Comparing migrations of:

+
+
+
    +
  • +

    500 VMs using 8 ESXi hosts in 1 plan, max_vm_inflight=100, took 5 hours and 10 minutes.

    +
  • +
  • +

    800 VMs using 8 ESXi hosts with 8 plans, max_vm_inflight=100, took 57 minutes.

    +
  • +
+
+
+

Testing showed that by breaking one single large plan into multiple moderately sized plans, for example, 100 VMS per plan, the total migration time can be reduced.

+
+
+
+
+

Maximum values tested

+
+
+
    +
  • +

    Maximum number of ESXi hosts tested: 8

    +
  • +
  • +

    Maximum number of VMs in a single migration plan: 500

    +
  • +
  • +

    Maximum number of VMs migrated in a single test: 5000

    +
  • +
  • +

    Maximum number of migration plans performed concurrently: 40

    +
  • +
  • +

    Maximum single disk size migrated: 6 T disks, which contained 3 Tb of data

    +
  • +
  • +

    Maximum number of disks on a single VM migrated: 50

    +
  • +
  • +

    Highest observed single datastore read rate from a single ESXi server:  312 MiB/second

    +
  • +
  • +

    Highest observed multi-datastore read rate using eight ESXi servers and two datastores: 1,242 MiB/second

    +
  • +
  • +

    Highest observed virtual NIC transfer rate to an {ocp-name} worker: 327 MiB/second

    +
  • +
  • +

    Maximum migration transfer rate of a single disk: 162 MiB/second (rate observed when transferring nonconcurrent migration of 1.5 Tb utilized data)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from a single ESXi host: 294 MiB/s (concurrent migration of 30 VMs, 35/50 GiB used, from Single ESXi)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from multiple ESXi hosts: 1173MB/s (concurrent migration of 80 VMs, 35/50 GiB used, from 8 ESXi servers, 10 VMs from each ESXi)

    +
  • +
+
+
+

For additional details on performance, see Forklift performance addendum

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/index.html new file mode 100644 index 00000000000..ee0eb836f52 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/index.html @@ -0,0 +1,131 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift custom resources and services

+
+

Forklift is provided as an OKD Operator. It creates and manages the following custom resources (CRs) and services.

+
+
+
Forklift custom resources
+
    +
  • +

    Provider CR stores attributes that enable Forklift to connect to and interact with the source and target providers.

    +
  • +
  • +

    NetworkMapping CR maps the networks of the source and target providers.

    +
  • +
  • +

    StorageMapping CR maps the storage of the source and target providers.

    +
  • +
  • +

    Plan CR contains a list of VMs with the same migration parameters and associated network and storage mappings.

    +
  • +
  • +

    Migration CR runs a migration plan.

    +
    +

    Only one Migration CR per migration plan can run at a given time. You can create multiple Migration CRs for a single Plan CR.

    +
    +
  • +
+
+
+
Forklift services
+
    +
  • +

    The Inventory service performs the following actions:

    +
    +
      +
    • +

      Connects to the source and target providers.

      +
    • +
    • +

      Maintains a local inventory for mappings and plans.

      +
    • +
    • +

      Stores VM configurations.

      +
    • +
    • +

      Runs the Validation service if a VM configuration change is detected.

      +
    • +
    +
    +
  • +
  • +

    The Validation service checks the suitability of a VM for migration by applying rules.

    +
  • +
  • +

    The Migration Controller service orchestrates migrations.

    +
    +

    When you create a migration plan, the Migration Controller service validates the plan and adds a status label. If the plan fails validation, the plan status is Not ready and the plan cannot be used to perform a migration. If the plan passes validation, the plan status is Ready and it can be used to perform a migration. After a successful migration, the Migration Controller service changes the plan status to Completed.

    +
    +
  • +
  • +

    The Populator Controller service orchestrates disk transfers using Volume Populators.

    +
  • +
  • +

    The Kubevirt Controller and Containerized Data Import (CDI) Controller services handle most technical operations.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-selected-packages-2-7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-selected-packages-2-7/index.html new file mode 100644 index 00000000000..8c1a84cd8ff --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-selected-packages-2-7/index.html @@ -0,0 +1,207 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift selected packages

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Selected Forklift packages
Package summaryForklift 2.7.0Forklift 2.7.2Forklift 2.7.3

The skeleton package which defines a simple Red Hat Enterprise Linux system

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

Core kernel modules to match the core kernel

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

The Linux kernel

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

Access and modify virtual machine disk images

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

Client side utilities of the libvirt library

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

Libvirt libraries

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

QEMU driver plugin for the libvirtd daemon

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

NBD server

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

Basic filters for nbdkit

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

Basic plugins for nbdkit

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

HTTP/FTP (cURL) plugin for nbdkit

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

NBD proxy / forward plugin for nbdkit

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

Python 3 plugin for nbdkit

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

The nbdkit server

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

SSH plugin for nbdkit

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

VMware VDDK plugin for nbdkit

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

QEMU command line tool for manipulating disk images

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

QEMU common files needed by all QEMU targets

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

+

qemu-kvm core components

+

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

Convert a virtual machine to run on KVM

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/index.html new file mode 100644 index 00000000000..cf80ce08d29 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/index.html @@ -0,0 +1,133 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring MTV settings

+
+

If you have Administrator privileges, you can access the Overview page and change the following settings in it:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift settings
SettingDescriptionDefault value

Max concurrent virtual machine migrations

The maximum number of VMs per plan that can be migrated simultaneously

20

Must gather cleanup after (hours)

The duration for retaining must gather reports before they are automatically deleted

Disabled

Controller main container CPU limit

The CPU limit allocated to the main controller container

500 m

Controller main container Memory limit

The memory limit allocated to the main controller container

800 Mi

Precopy internal (minutes)

The interval at which a new snapshot is requested before initiating a warm migration

60

Snapshot polling interval (seconds)

The frequency with which the system checks the status of snapshot creation or removal during a warm migration

10

+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationOverview. The Settings list is on the right-hand side of the page.

    +
  2. +
  3. +

    In the Settings list, click the Edit icon of the setting you want to change.

    +
  4. +
  5. +

    Choose a setting from the list.

    +
  6. +
  7. +

    Click Save.

    +
  8. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-ui/index.html new file mode 100644 index 00000000000..fe46270f79d --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-ui/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV user interface

+
+

The Forklift user interface is integrated into the OKD web console.

+
+
+

In the left-hand panel, you can choose a page related to a component of the migration progress, for example, Providers for Migration, or, if you are an administrator, you can choose Overview, which contains information about migrations and lets you configure Forklift settings.

+
+
+
+Forklift user interface +
+
Figure 1. Forklift extension interface
+
+
+

In pages related to components, you can click on the Projects list, which is in the upper-left portion of the page, and see which projects (namespaces) you are allowed to work with.

+
+
+
    +
  • +

    If you are an administrator, you can see all projects.

    +
  • +
  • +

    If you are a non-administrator, you can see only the projects that you have permissions to work with.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/index.html new file mode 100644 index 00000000000..1e64183ed1f --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/index.html @@ -0,0 +1,113 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

High-level migration workflow

+
+

The high-level workflow shows the migration process from the point of view of the user:

+
+
+
    +
  1. +

    You create a source provider, a target provider, a network mapping, and a storage mapping.

    +
  2. +
  3. +

    You create a Plan custom resource (CR) that includes the following resources:

    +
    +
      +
    • +

      Source provider

      +
    • +
    • +

      Target provider, if Forklift is not installed on the target cluster

      +
    • +
    • +

      Network mapping

      +
    • +
    • +

      Storage mapping

      +
    • +
    • +

      One or more virtual machines (VMs)

      +
    • +
    +
    +
  4. +
  5. +

    You run a migration plan by creating a Migration CR that references the Plan CR.

    +
    +

    If you cannot migrate all the VMs for any reason, you can create multiple Migration CRs for the same Plan CR until all VMs are migrated.

    +
    +
  6. +
  7. +

    For each VM in the Plan CR, the Migration Controller service records the VM migration progress in the Migration CR.

    +
  8. +
  9. +

    Once the data transfer for each VM in the Plan CR completes, the Migration Controller service creates a VirtualMachine CR.

    +
    +

    When all VMs have been migrated, the Migration Controller service updates the status of the Plan CR to Completed. The power state of each source VM is maintained after migration.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/index.html new file mode 100644 index 00000000000..41abaef39ad --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/index.html @@ -0,0 +1,196 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Network prerequisites

+
+
+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    IP addresses, VLANs, and other network configuration settings must not be changed before or during migration. The MAC addresses of the virtual machines are preserved during migration.

    +
  • +
  • +

    The network connections between the source environment, the KubeVirt cluster, and the replication repository must be reliable and uninterrupted.

    +
  • +
  • +

    If you are mapping more than one source and destination network, you must create a network attachment definition for each additional destination network.

    +
  • +
+
+
+
+
+

Ports

+
+
+

The firewalls must enable traffic over the following ports:

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Network ports required for migrating from VMware vSphere
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

VMware vCenter

+

VMware provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer authentication

+

902

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer data copy

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Network ports required for migrating from oVirt
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

oVirt Engine

+

oVirt provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer authentication

+

54322

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer data copy

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-features-and-enhancements-2-7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-features-and-enhancements-2-7/index.html new file mode 100644 index 00000000000..972834ffb21 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-features-and-enhancements-2-7/index.html @@ -0,0 +1,85 @@ + + + + + + + + New features and enhancements | Forklift Documentation + + + + + + + + + + + + + +New features and enhancements | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

New features and enhancements

+
+
+
+

Forklift 2.7 introduces the following features and enhancements:

+
+
+
+
+

New features and enhancements 2.7.0

+
+
+
    +
  • +

    In Forklift 2.7.0, warm migration is now based on RHEL 9 inheriting features and bug fixes.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-migrating-virtual-machines-cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-migrating-virtual-machines-cli/index.html new file mode 100644 index 00000000000..7d53d0228bb --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-migrating-virtual-machines-cli/index.html @@ -0,0 +1,155 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
  5. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 00000000000..1f5a612da3e --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,192 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Permissions needed by non-administrators to work with migration plan components

+
+

If you are an administrator, you can work with all components of migration plans (for example, providers, network mappings, and migration plans).

+
+
+

By default, non-administrators have limited ability to work with migration plans and their components. As an administrator, you can modify their roles to allow them full access to all components, or you can give them limited permissions.

+
+
+

For example, administrators can assign non-administrators one or more of the following cluster roles for migration plans:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Example migration plan roles and their privileges
RoleDescription

plans.forklift.konveyor.io-v1beta1-view

Can view migration plans but not to create, delete or modify them

plans.forklift.konveyor.io-v1beta1-edit

Can create, delete or modify (all parts of edit permissions) individual migration plans

plans.forklift.konveyor.io-v1beta1-admin

All edit privileges and the ability to delete the entire collection of migration plans

+
+

Note that pre-defined cluster roles include a resource (for example, plans), an API group (for example, forklift.konveyor.io-v1beta1) and an action (for example, view, edit).

+
+
+

As a more comprehensive example, you can grant non-administrators the following set of permissions per namespace:

+
+
+
    +
  • +

    Create and modify storage maps, network maps, and migration plans for the namespaces they have access to

    +
  • +
  • +

    Attach providers created by administrators to storage maps, network maps, and migration plans

    +
  • +
  • +

    Not be able to create providers or to change system settings

    +
  • +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Example permissions required for non-adminstrators to work with migration plan components but not create providers
ActionsAPI groupResource

get, list, watch, create, update, patch, delete

forklift.konveyor.io

plans

get, list, watch, create, update, patch, delete

forklift.konveyor.io

migrations

get, list, watch, create, update, patch, delete

forklift.konveyor.io

hooks

get, list, watch

forklift.konveyor.io

providers

get, list, watch, create, update, patch, delete

forklift.konveyor.io

networkmaps

get, list, watch, create, update, patch, delete

forklift.konveyor.io

storagemaps

get, list, watch

forklift.konveyor.io

forkliftcontrollers

create, patch, delete

Empty string

secrets

+
+ + + + + +
+
Note
+
+
+

Non-administrators need to have the create permissions that are part of edit roles for network maps and for storage maps to create migration plans, even when using a template for a network map or a storage map.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/index.html new file mode 100644 index 00000000000..a7484bc6176 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/index.html @@ -0,0 +1,107 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Getting the Forklift web console URL

+
+

You can get the Forklift web console URL at any time by using either the OKD web console, or the command line.

+
+
+
Prerequisites
+
    +
  • +

    KubeVirt Operator installed.

    +
  • +
  • +

    Forklift Operator installed.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  • +

    If you are using the OKD web console, follow these steps:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_web.adoc[]

+
+
+
    +
  • +

    If you are using the command line, get the Forklift web console URL with the following command:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_cli.adoc[]

+
+
+

You can now launch a browser and navigate to the Forklift web console.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/index.html new file mode 100644 index 00000000000..1d763c12759 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/index.html @@ -0,0 +1,76 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/index.html new file mode 100644 index 00000000000..057e57c61db --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/index.html @@ -0,0 +1,189 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using application credential authentication with an {osp} source provider

+
+

You can use application credential authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of application credential authentication:

+
+
+
    +
  • +

    Application credential ID

    +
  • +
  • +

    Application credential name

    +
  • +
+
+
+

For each type of application credential authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

You have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for application credential authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for application credential authentication, run the following command:

    +
    +
    +
    $ openstack application credential create --role member --role reader --secret redhat forklift
    +
    +
    +
    +

    The output, referred to here as <openstack_credential_output>, includes:

    +
    +
    +
      +
    • +

      The id and secret that you need for authentication using an application credential ID

      +
    • +
    • +

      The name and secret that you need for authentication using an application credential name

      +
    • +
    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using the application credential ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialID: <id_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using the application credential name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialName: <name_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/index.html new file mode 100644 index 00000000000..2682f17e9c2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/index.html @@ -0,0 +1,180 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using token authentication with an {osp} source provider

+
+

You can use token authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of token authentication:

+
+
+
    +
  • +

    Token with user ID

    +
  • +
  • +

    Token with user name

    +
  • +
+
+
+

For each type of token authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

Have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for token authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for token authentication, run the following command:

    +
    +
    +
    $ openstack token issue
    +
    +
    +
    +

    The output, referred to here as <openstack_token_output>, includes the token, userID, and projectID that you need for authentication using a token with user ID.

    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using a token with user ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  projectID: <projectID_from_openstack_token_output>
      +  userID: <userID_from_openstack_token_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using a token with user name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  projectName: <OS_PROJECT_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/index.html new file mode 100644 index 00000000000..8a80106602f --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/index.html @@ -0,0 +1,130 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Open Virtual Appliance (OVA) prerequisites

+
+

The following prerequisites apply to Open Virtual Appliance (OVA) file migrations:

+
+
+
    +
  • +

    All OVA files are created by VMware vSphere.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+
    +
  • +

    The OVA files are in one or more folders under an NFS shared directory in one of the following structures:

    +
    +
      +
    • +

      In one or more compressed Open Virtualization Format (OVF) packages that hold all the VM information.

      +
      +

      The filename of each compressed package must have the .ova extension. Several compressed packages can be stored in the same folder.

      +
      +
      +

      When this structure is used, Forklift scans the root folder and the first-level subfolders for compressed packages.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The folder /nfs is scanned.
      +The folder /nfs/subfolder1 is scanned.
      +But, /nfs/subfolder1/subfolder2 is not scanned.

      +
      +
    • +
    • +

      In extracted OVF packages.

      +
      +

      When this structure is used, Forklift scans the root folder, first-level subfolders, and second-level subfolders for extracted OVF packages. +However, there can be only one .ovf file in a folder. Otherwise, the migration will fail.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The OVF file /nfs/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/subfolder2/vm.ovf is scanned.
      +But, the OVF file /nfs/subfolder1/subfolder2/subfolder3/vm.ovf is not scanned.

      +
      +
    • +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/index.html new file mode 100644 index 00000000000..e4357f734b1 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/index.html @@ -0,0 +1,483 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving the Inventory service JSON

+
+

You retrieve the Inventory service JSON by sending an Inventory service query to a virtual machine (VM). The output contains an "input" key, which contains the inventory attributes that are queried by the Validation service rules.

+
+
+

You can create a validation rule based on any attribute in the "input" key, for example, input.snapshot.kind.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Trigger an HTTP GET request (for example, using Curl):

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    +
    +
    +
  8. +
  9. +

    Retrieve the UUID of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k (1)
    +
    +
    +
    +
      +
    1. +

      Allowed values for the provider are vsphere, ovirt, and openstack.

      +
    2. +
    +
    +
  10. +
  11. +

    Retrieve the VMs of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    +
    +
    +
  12. +
  13. +

    Retrieve the details of a VM:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    +
    +
    +
    +
    Example output
    +
    +
    {
    +    "input": {
    +        "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
    +        "id": "vm-431",
    +        "parent": {
    +            "kind": "Folder",
    +            "id": "group-v22"
    +        },
    +        "revision": 1,
    +        "name": "iscsi-target",
    +        "revisionValidated": 1,
    +        "isTemplate": false,
    +        "networks": [
    +            {
    +                "kind": "Network",
    +                "id": "network-31"
    +            },
    +            {
    +                "kind": "Network",
    +                "id": "network-33"
    +            }
    +        ],
    +        "disks": [
    +            {
    +                "key": 2000,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 17179869184,
    +                "shared": false,
    +                "rdm": false
    +            },
    +            {
    +                "key": 2001,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 10737418240,
    +                "shared": false,
    +                "rdm": false
    +            }
    +        ],
    +        "concerns": [],
    +        "policyVersion": 5,
    +        "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
    +        "firmware": "bios",
    +        "powerState": "poweredOn",
    +        "connectionState": "connected",
    +        "snapshot": {
    +            "kind": "VirtualMachineSnapshot",
    +            "id": "snapshot-3034"
    +        },
    +        "changeTrackingEnabled": false,
    +        "cpuAffinity": [
    +            0,
    +            2
    +        ],
    +        "cpuHotAddEnabled": true,
    +        "cpuHotRemoveEnabled": false,
    +        "memoryHotAddEnabled": false,
    +        "faultToleranceEnabled": false,
    +        "cpuCount": 2,
    +        "coresPerSocket": 1,
    +        "memoryMB": 2048,
    +        "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
    +        "balloonedMemory": 0,
    +        "ipAddress": "10.19.2.96",
    +        "storageUsed": 30436770129,
    +        "numaNodeAffinity": [
    +            "0",
    +            "1"
    +        ],
    +        "devices": [
    +            {
    +                "kind": "RealUSBController"
    +            }
    +        ],
    +        "host": {
    +            "id": "host-29",
    +            "parent": {
    +                "kind": "Cluster",
    +                "id": "domain-c26"
    +            },
    +            "revision": 1,
    +            "name": "IP address or host name of the vCenter host or oVirt Engine host",
    +            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
    +            "status": "green",
    +            "inMaintenance": false,
    +            "managementServerIp": "10.19.2.96",
    +            "thumbprint": <thumbprint>,
    +            "timezone": "UTC",
    +            "cpuSockets": 2,
    +            "cpuCores": 16,
    +            "productName": "VMware ESXi",
    +            "productVersion": "6.5.0",
    +            "networking": {
    +                "pNICs": [
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic0",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic1",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic2",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic3",
    +                        "linkSpeed": 10000
    +                    }
    +                ],
    +                "vNICs": [
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk2",
    +                        "portGroup": "VM_Migration",
    +                        "dPortGroup": "",
    +                        "ipAddress": "192.168.79.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 9000
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk0",
    +                        "portGroup": "Management Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.13",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk1",
    +                        "portGroup": "Storage Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "172.31.2.13",
    +                        "subnetMask": "255.255.0.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk3",
    +                        "portGroup": "",
    +                        "dPortGroup": "dvportgroup-48",
    +                        "ipAddress": "192.168.61.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk4",
    +                        "portGroup": "VM_DHCP_Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.231",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    }
    +                ],
    +                "portGroups": [
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM Network",
    +                        "name": "VM Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Management Network",
    +                        "name": "Management Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_10G_Network",
    +                        "name": "VM_10G_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Storage",
    +                        "name": "VM_Storage",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_DHCP_Network",
    +                        "name": "VM_DHCP_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Storage Network",
    +                        "name": "Storage Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Isolated_67",
    +                        "name": "VM_Isolated_67",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Migration",
    +                        "name": "VM_Migration",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    }
    +                ],
    +                "switches": [
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch0",
    +                        "name": "vSwitch0",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM Network",
    +                            "key-vim.host.PortGroup-Management Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic4"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch1",
    +                        "name": "vSwitch1",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_10G_Network",
    +                            "key-vim.host.PortGroup-VM_Storage",
    +                            "key-vim.host.PortGroup-VM_DHCP_Network",
    +                            "key-vim.host.PortGroup-Storage Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic2",
    +                            "key-vim.host.PhysicalNic-vmnic0"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch2",
    +                        "name": "vSwitch2",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_Isolated_67",
    +                            "key-vim.host.PortGroup-VM_Migration"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic3",
    +                            "key-vim.host.PhysicalNic-vmnic1"
    +                        ]
    +                    }
    +                ]
    +            },
    +            "networks": [
    +                {
    +                    "kind": "Network",
    +                    "id": "network-31"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-34"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-57"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-33"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "dvportgroup-47"
    +                }
    +            ],
    +            "datastores": [
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-35"
    +                },
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                }
    +            ],
    +            "vms": null,
    +            "networkAdapters": [],
    +            "cluster": {
    +                "id": "domain-c26",
    +                "parent": {
    +                    "kind": "Folder",
    +                    "id": "group-h23"
    +                },
    +                "revision": 1,
    +                "name": "mycluster",
    +                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
    +                "folder": "group-h23",
    +                "networks": [
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-31"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-34"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-57"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-33"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "dvportgroup-47"
    +                    }
    +                ],
    +                "datastores": [
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-35"
    +                    },
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-63"
    +                    }
    +                ],
    +                "hosts": [
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-44"
    +                    },
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-29"
    +                    }
    +                ],
    +                "dasEnabled": false,
    +                "dasVms": [],
    +                "drsEnabled": true,
    +                "drsBehavior": "fullyAutomated",
    +                "drsVms": [],
    +                "datacenter": null
    +            }
    +        }
    +    }
    +}
    +
    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-vmware-moref/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-vmware-moref/index.html new file mode 100644 index 00000000000..84f320538da --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-vmware-moref/index.html @@ -0,0 +1,149 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving a VMware vSphere moRef

+
+

When you migrate VMs with a VMware vSphere source provider using Forklift from the CLI, you need to know the managed object reference (moRef) of certain entities in vSphere, such as datastores, networks, and VMs.

+
+
+

You can retrieve the moRef of one or more vSphere entities from the Inventory service. You can then use each moRef as a reference for retrieving the moRef of another entity.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Retrieve the moRef of a VMware vSphere provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    +
    +
    +
  8. +
  9. +

    Retrieve the datastores of a VMware vSphere source provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    +
    +
    +
    +
    Example output
    +
    +
    [
    +  {
    +    "id": "datastore-11",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
    +    "revision": 46,
    +    "name": "v2v_general_porpuse_ISCSI_DC",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
    +  },
    +  {
    +    "id": "datastore-730",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
    +    "revision": 46,
    +    "name": "f01-h27-640-SSD_2",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
    +  },
    + ...
    +
    +
    +
  10. +
+
+
+

In this example, the moRef of the datastore v2v_general_porpuse_ISCSI_DC is datastore-11 and the moRef of the datastore f01-h27-640-SSD_2 is datastore-730.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html new file mode 100644 index 00000000000..f116bc8fa86 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html @@ -0,0 +1,129 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+
    +
  • +

    To create a source provider, you must have at least the UserRole and ReadOnlyAdmin roles assigned to you. These are the minimum required permissions, however, any other administrator or superuser permissions will also work.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

You must keep the UserRole and ReadOnlyAdmin roles until the virtual machines of the source provider have been migrated. Otherwise, the migration will fail.

+
+
+
+
+
    +
  • +

    To migrate virtual machines:

    +
    +
      +
    • +

      You must have one of the following:

      +
      +
        +
      • +

        oVirt admin permissions. These permissions allow you to migrate any virtual machine in the system.

        +
      • +
      • +

        DiskCreator and UserVmManager permissions on every virtual machine you want to migrate.

        +
      • +
      +
      +
    • +
    • +

      You must use a compatible version of oVirt.

      +
    • +
    • +

      You must have the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate.

      +
      +

      You can obtain the Engine CA certificate by navigating to https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA in a browser.

      +
      +
    • +
    • +

      If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

      +
    • +
    +
    +
  • +
+
+
+

Unresolved directive in rhv-prerequisites.adoc - include::snip-migrating-luns.adoc[]

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/index.html new file mode 100644 index 00000000000..569b98c9f91 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/index.html @@ -0,0 +1,163 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.0

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Warm migration
+

Warm migration reduces downtime by copying most of the VM data during a precopy stage while the VMs are running. During the cutover stage, the VMs are stopped and the rest of the data is copied.

+
+
+
Cancel migration
+

You can cancel an entire migration plan or individual VMs while a migration is in progress. A canceled migration plan can be restarted in order to migrate the remaining VMs.

+
+
+
Migration network
+

You can select a migration network for the source and target providers for improved performance. By default, data is copied using the VMware administration network and the OKD pod network.

+
+
+
Validation service
+

The validation service checks source VMs for issues that might affect migration and flags the VMs with concerns in the migration plan.

+
+
+ + + + + +
+
Important
+
+
+

The validation service is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+
+
+
+

Known issues

+
+
+

This section describes known issues and mitigations.

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Network map displays a "Destination network not found" error
+

If the network map remains in a NotReady state and the NetworkMap manifest displays a Destination network not found error, the cause is a missing network attachment definition. You must create a network attachment definition for each additional destination network before you create the network map. (BZ#1971259)

+
+
+
Warm migration gets stuck during third precopy
+

Warm migration uses changed block tracking snapshots to copy data during the precopy stage. The snapshots are created at one-hour intervals by default. When a snapshot is created, its contents are copied to the destination cluster. However, when the third snapshot is created, the first snapshot is deleted and the block tracking is lost. (BZ#1969894)

+
+
+

You can do one of the following to mitigate this issue:

+
+
+
    +
  • +

    Start the cutover stage no more than one hour after the precopy stage begins so that only one internal snapshot is created.

    +
  • +
  • +

    Increase the snapshot interval in the vm-import-controller-config config map to 720 minutes:

    +
    +
    +
    $ kubectl patch configmap/vm-import-controller-config \
    +  -n openshift-cnv -p '{"data": \
    +  {"warmImport.intervalMinutes": "720"}}'
    +
    +
    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/index.html new file mode 100644 index 00000000000..69fce95165c --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/index.html @@ -0,0 +1,191 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.1

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

Technical changes

+
+
+
VDDK image added to HyperConverged custom resource
+

The VMware Virtual Disk Development Kit (VDDK) SDK image must be added to the HyperConverged custom resource. Before this release, it was referenced in the v2v-vmware config map.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Cold migration from oVirt
+

You can perform a cold migration of VMs from oVirt.

+
+
+
Migration hooks
+

You can create migration hooks to run Ansible playbooks or custom code before or after migration.

+
+
+
Filtered must-gather data collection
+

You can specify options for the must-gather tool that enable you to filter the data by namespace, migration plan, or VMs.

+
+
+
SR-IOV network support
+

You can migrate VMs with a single root I/O virtualization (SR-IOV) network interface if the KubeVirt environment has an SR-IOV network.

+
+
+
+
+

Known issues

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Disk copy stage does not progress
+

The disk copy stage of a oVirt VM does not progress and the Forklift web console does not display an error message. (BZ#1990596)

+
+
+

The cause of this problem might be one of the following conditions:

+
+
+
    +
  • +

    The storage class does not exist on the target cluster.

    +
  • +
  • +

    The VDDK image has not been added to the HyperConverged custom resource.

    +
  • +
  • +

    The VM does not have a disk.

    +
  • +
  • +

    The VM disk is locked.

    +
  • +
  • +

    The VM time zone is not set to UTC.

    +
  • +
  • +

    The VM is configured for a USB device.

    +
  • +
+
+
+

To disable USB devices, see Configuring USB Devices in the Red Hat Virtualization documentation.

+
+
+

To determine the cause:

+
+
+
    +
  1. +

    Click WorkloadsVirtualization in the OKD web console.

    +
  2. +
  3. +

    Click the Virtual Machines tab.

    +
  4. +
  5. +

    Select a virtual machine to open the Virtual Machine Overview screen.

    +
  6. +
  7. +

    Click Status to view the status of the virtual machine.

    +
  8. +
+
+
+
VM time zone must be UTC with no offset
+

The time zone of the source VMs must be UTC with no offset. You can set the time zone to GMT Standard Time after first assessing the potential impact on the workload. (BZ#1993259)

+
+
+
oVirt resource UUID causes a "Provider not found" error
+

If a oVirt resource UUID is used in a Host, NetworkMap, StorageMap, or Plan custom resource (CR), a "Provider not found" error is displayed.

+
+
+

You must use the resource name. (BZ#1994037)

+
+
+
Same oVirt resource name in different data centers causes ambiguous reference
+

If a oVirt resource name is used in a NetworkMap, StorageMap, or Plan custom resource (CR) and if the same resource name exists in another data center, the Plan CR displays a critical "Ambiguous reference" condition. You must rename the resource or use the resource UUID in the CR.

+
+
+

In the web console, the resource name appears twice in the same list without a data center reference to distinguish them. You must rename the resource. (BZ#1993089)

+
+
+
Snapshots are not deleted after warm migration
+

Snapshots are not deleted automatically after a successful warm migration of a VMware VM. You must delete the snapshots manually in VMware vSphere. (BZ#2001270)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/index.html new file mode 100644 index 00000000000..21f7dba5da7 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/index.html @@ -0,0 +1,219 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.2

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the precopy time interval for warm migration
+

You can set the time interval between snapshots taken during the precopy stage of warm migration.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Creating validation rules
+

You can create custom validation rules to check the suitability of VMs for migration. Validation rules are based on the VM attributes collected by the Provider Inventory service and written in Rego, the Open Policy Agent native query language.

+
+
+
Downloading logs by using the web console
+

You can download logs for a migration plan or a migrated VM by using the Forklift web console.

+
+
+
Duplicating a migration plan by using the web console
+

You can duplicate a migration plan by using the web console, including its VMs, mappings, and hooks, in order to edit the copy and run as a new migration plan.

+
+
+
Archiving a migration plan by using the web console
+

You can archive a migration plan by using the MTV web console. Archived plans can be viewed or duplicated. They cannot be run, edited, or unarchived.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Certain Validation service issues do not block migration
+

Certain Validation service issues, which are marked as Critical and display the assessment text, The VM will not be migrated, do not block migration. (BZ#2025977)

+
+
+

The following Validation service assessments do not block migration:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Issues that do not block migration
AssessmentResult

The disk interface type is not supported by OpenShift Virtualization (only sata, virtio_scsi and virtio interface types are currently supported).

The migrated VM will have a virtio disk if the source interface is not recognized.

The NIC interface type is not supported by OpenShift Virtualization (only e1000, rtl8139 and virtio interface types are currently supported).

The migrated VM will have a virtio NIC if the source interface is not recognized.

The VM is using a vNIC profile configured for host device passthrough, which is not currently supported by OpenShift Virtualization.

The migrated VM will have an SR-IOV NIC. The destination network must be set up correctly.

One or more of the VM’s disks has an illegal or locked status condition.

The migration will proceed but the disk transfer is likely to fail.

The VM has a disk with a storage type other than image, and this is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has one or more snapshots with disks in ILLEGAL state. This is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has USB support enabled, but USB devices are not currently supported by OpenShift Virtualization.

The migrated VM will not have USB devices.

The VM is configured with a watchdog device, which is not currently supported by OpenShift Virtualization.

The migrated VM will not have a watchdog device.

The VM’s status is not up or down.

The migration will proceed but it might hang if the VM cannot be powered off.

+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Missing resource causes error message in current.log file
+

If a resource does not exist, for example, if the virt-launcher pod does not exist because the migrated VM is powered off, its log is unavailable.

+
+
+

The following error appears in the missing resource’s current.log file when it is downloaded from the web console or created with the must-gather tool: error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'. (BZ#2023260)

+
+
+
Importer pod log is unavailable after warm migration
+

Retaining the importer pod for debug purposes causes warm migration to hang during the precopy stage. (BZ#2016290)

+
+
+

As a temporary workaround, the importer pod is removed at the end of the precopy stage so that the precopy succeeds. However, this means that the importer pod log is not retained after warm migration is complete. You can only view the importer pod log by using the oc logs -f <cdi-importer_pod> command during the precopy stage.

+
+
+

This issue only affects the importer pod log and warm migration. Cold migration and the virt-v2v logs are not affected.

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Network, storage, and VM referenced by name in the Plan CR are not displayed in the web console.
+

If a Plan CR references storage, network, or VMs by name instead of by ID, the resources do not appear in the Forklift web console. The migration plan cannot be edited or duplicated. (BZ#1986020)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
If a target VM is deleted during migration, its migration status is Succeeded in the Plan CR
+

If you delete a target VirtualMachine CR during the 'Convert image to kubevirt' step of the migration, the Migration details page of the web console displays the state of the step as VirtualMachine CR not found. However, the status of the VM migration is Succeeded in the Plan CR file and in the web console. (BZ#2031529)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/index.html new file mode 100644 index 00000000000..dd92f4c652c --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/index.html @@ -0,0 +1,156 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.3

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the VddkInitImage path is part of the procedure of adding VMware provider.
+

In the web console, you enter the VddkInitImage path when adding a VMware provider. Alternatively, from the CLI, you add the VddkInitImage path to the Provider CR for VMware migrations.

+
+
+
The StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS. The documentation includes a link to the relevant procedure.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Forklift 2.3 supports warm migration from oVirt
+

You can use warm migration to migrate VMs from both VMware and oVirt.

+
+
+
The minimal sufficient set of privileges for VMware users is established
+

VMware users do not have to have full cluster-admin privileges to perform a VM migration. The minimal sufficient set of user’s privileges is established and documented.

+
+
+
Forklift documentation is updated with instructions on using hooks
+

Forklift documentation includes instructions on adding hooks to migration plans and running hooks on VMs.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Some warm migrations from oVirt might fail
+

When you run a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run. (BZ#2063531)

+
+
+
Snapshots are not deleted after warm migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. You can delete the snapshots manually. (BZ#22053183)

+
+
+
Warm migration from oVirt fails if a snapshot operation is performed on the source VM
+

If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (BZ#2057459)

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

The problem occurs for both vSphere and oVirt migrations.

+
+
+
Forklift 2.3.4 only: When the source provider is oVirt, duplicating a migration plan fails in either the network mapping stage or the storage mapping stage.
+

Possible workaround: Delete cache in the browser or restart the browser. (BZ#2143191)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/index.html new file mode 100644 index 00000000000..798ac9a723c --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/index.html @@ -0,0 +1,260 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.4

+
+
+
+

Migrate virtual machines (VMs) from VMware vSphere or oVirt or {osp} to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Faster disk image migration from oVirt
+

Disk images are not converted anymore using virt-v2v when migrating from oVirt. This change speeds up migrations and also allows migration for guest operating systems that are not supported by virt-vsv. (forklift-controller#403)

+
+
+
Faster disk transfers by ovirt-imageio client (ovirt-img)
+

Disk transfers use ovirt-imageio client (ovirt-img) instead of Containerized Data Import (CDI) when migrating from RHV to the local OpenShift Container Platform cluster, accelerating the migration.

+
+
+
Faster migration using conversion pod disk transfer
+

When migrating from vSphere to the local OpenShift Container Platform cluster, the conversion pod transfers the disk data instead of Containerized Data Importer (CDI), accelerating the migration.

+
+
+
Migrated virtual machines are not scheduled on the target OCP cluster
+

The migrated virtual machines are no longer scheduled on the target OpenShift Container Platform cluster. This enables migrating VMs that cannot start due to limit constraints on the target at migration time.

+
+
+
StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS.

+
+
+
VDDK 8 can be used in the VDDK image
+

Previous versions of Forklift supported only using VDDK version 7 for the VDDK image. Forklift supports both versions 7 and 8, as follows:

+
+
+
    +
  • +

    If you are migrating to OCP 4.12 or earlier, use VDDK version 7.

    +
  • +
  • +

    If you are migrating to OCP 4.13 or later, use VDDK version 8.

    +
  • +
+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
OpenStack migration
+

Forklift now supports migrations with {osp} as a source provider. This feature is a provided as a Technology Preview and only supports cold migrations.

+
+
+
OCP console plugin
+

The Forklift Operator now integrates the Forklift web console into the OKD web console. The new UI operates as an OCP Console plugin that adds the sub-menu Migration to the navigation bar. It is implemented in version 2.4, disabling the old UI. You can enable the old UI by setting feature_ui: true in ForkliftController. (MTV-427)

+
+
+
Skip certification option
+

'Skip certificate validation' option was added to VMware and oVirt providers. If selected, the provider’s certificate will not be validated and the UI will not ask for specifying a CA certificate.

+
+
+
Only third-party certificate required
+

Only the third-party certificate needs to be specified when defining a oVirt provider that sets with the Manager CA certificate.

+
+
+
Conversion of VMs with RHEL9 guest operating system
+

Cold migrations from vSphere to a local Red Hat OpenShift cluster use virt-v2v on RHEL 9. (MTV-332)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If deleting a migration plan and then running a new migration plan with the same name, or if deleting a migrated VM and then remigrate the source VM, then the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack don’t fail, but the encryption key may be missing on the target OCP cluster.

+
+
+
Snapshots that are created during the migration in OpenStack are not deleted
+

The Migration Controller service does not delete snapshots that are created during the migration for source virtual machines in OpenStack automatically. Workaround: the snapshots can be removed manually on OpenStack.

+
+
+
oVirt snapshots are not deleted after a successful migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. Workaround: Snapshots can be removed from oVirt instead. (MTV-349)

+
+
+
Migration fails during precopy/cutover while a snapshot operation is executed on the source VM
+

Some warm migrations from oVirt might fail. When running a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run.

+
+
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (MTV-456)

+
+
+
Cannot schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it may result in a VM that cannot be scheduled. Workaround: It is recommended to use shared storage on the target OCP cluster.

+
+
+
Deleting migrated VM does not remove PVC and PV
+

When removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) are not deleted. Workaround: remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

When a migration fails, its PVCs and PVs are not deleted as expected when its migration plan is archived and deleted. Workaround: Remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-493)

+
+
+
VM with multiple disks may boot from non-bootable disk after migration
+

VM with multiple disks that was migrated might not be able to boot on the target OCP cluster. Workaround: Set the boot order appropriately to boot from the bootable disk. (MTV-433)

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OCP clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OCP cluster. It is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system may start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, their network interfaces could be disabled when they start in OpenShift Virtualization. (MTV-491)

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. The user needs to refresh the OCP Console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of MTV, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in MTV 2.4.3 and 2.5.2. It is advised to update to one of these versions of MTV or later.

+
+ +
+
Improve invalid/conflicting VM name handling
+

Improve the automatic renaming of VMs during migration to fit RFC 1123. This feature that was introduced in 2.3.4 is enhanced to cover more special cases. (MTV-212)

+
+
+
Prevent locking user accounts due to incorrect credentials
+

If a user specifies an incorrect password for oVirt providers, they are no longer locked in oVirt. An error returns when the oVirt manager is accessible and adding the provider. If the oVirt manager is inaccessible, the provider is added, but there would be no further attempt after failing, due to incorrect credentials. (MTV-324)

+
+
+
Users without cluster-admin role can create new providers
+

Previously, the cluster-admin role was required to browse and create providers. In this release, users with sufficient permissions on MTV resources (providers, plans, migrations, NetworkMaps, StorageMaps, hooks) can operate MTV without cluster-admin permissions. (MTV-334)

+
+
+
Convert i440fx to q35
+

Migration of virtual machines with i440fx chipset is now supported. The chipset is converted to q35 during the migration. (MTV-430)

+
+
+
Preserve the UUID setting in SMBIOS for a VM that is migrated from oVirt
+

The Universal Unique ID (UUID) number within the System Management BIOS (SMBIOS) no longer changes for VMs that are migrated from oVirt. This enhancement enables applications that operate within the guest operating system and rely on this setting, such as for licensing purposes, to operate on the target OCP cluster in a manner similar to that of oVirt. (MTV-597)

+
+
+
Do not expose password for oVirt in error messages
+

Previously, the password that was specified for oVirt manager appeared in error messages that were displayed in the web console and logs when failing to connect to oVirt. In this release, error messages that are generated when failing to connect to oVirt do not reveal the password for oVirt manager.

+
+
+
QEMU guest agent is now installed on migrated VMs
+

The QEMU guest agent is installed on VMs during cold migration from vSphere. (BZ#2018062)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/index.html new file mode 100644 index 00000000000..12c6a393b48 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/index.html @@ -0,0 +1,464 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.5

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, and known issues for Forklift.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version of Forklift, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

Forklift enables migrations from vSphere source providers by not enforcing Enterprise Master Secret (EMS). This enables migrating from all vSphere versions that Forklift supports, including migrations that do not meet 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of the create and update providers now aligns with the look and feel of the OKD web console and displays up-to-date data.

+
+
+
Standalone UI
+

The old UI of Forklift 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
Support deployment on {ocp-name} 4.15
+

Forklift 2.5.6 can be deployed on {ocp-name} 4.15 clusters.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration of OVA files from VMware vSphere
+

In Forklift 2.3, you can migrate using Open Virtual Appliance (OVA) files that were created by VMware vSphere as source providers. (MTV-336)

+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+

Unresolved directive in rn-2.5.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+
Migrating VMs between OKD clusters
+

In Forklift 2.3, you can now use Red Hat KubeVirt provider as a source provider and a destination provider. You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on. (MTV-571)

+
+
+
Migration of VMs with direct LUNs from RHV
+

During the migration from oVirt (oVirt), direct Logical Units (LUNs) are detached from the source virtual machines and attached to the target virtual machines. Note that this mechanism does not work yet for Fibre Channel. (MTV-329)

+
+
+
Additional authentication methods for OpenStack
+

In addition to standard password authentication, Forklift supports the following authentication methods: Token authentication and Application credential authentication. (MTV-539)

+
+
+
Validation rules for OpenStack
+

The validation service includes default validation rules for virtual machines from OpenStack. (MTV-508)

+
+
+
VDDK is now optional for VMware vSphere providers
+

You can now create the VMware vSphere source provider without specifying a VMware Virtual Disk Development Kit (VDDK) init image. It is strongly recommended you create a VDDK init image to accelerate migrations.

+
+
+
Deployment on OKE enabled
+

In Forklift 2.5.3, deployment on {ocp-name} Kubernetes Engine (OKE) has been enabled. For more information, see About {ocp-name} Kubernetes Engine. (MTV-803)

+
+
+
Migration of VMs to destination storage classes with encrypted RBD now supported
+

In Forklift 2.5.4, migration of VMs to destination storage classes that have encrypted RADOS Block Devices (RBD) volumes is now supported.

+
+
+

To make use of this new feature, set the value of the parameter controller_block_overhead to 1Gi, following the procedure in Configuring the MTV Operator. (MTV-851)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OKD cluster. This is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Import OVA: ConnectionTestFailed message appears when adding OVA provider
+

When adding an OVA provider, the error message ConnectionTestFailed can appear, although the provider is created successfully. If the message does not disappear after a few minutes and the provider status does not move to Ready, this means that the ova server pod creation has failed. (MTV-671)

+
+
+
Left over ovirtvolumepopulator from failed migration causes plan to stay indefinitely in CopyDisks phase
+

An outdated ovirtvolumepopulator in the namespace, left over from an earlier failed migration, stops a new plan of the same VM when it transitions to CopyDisks phase. The plan remains in that phase indefinitely. (MTV-929)

+
+
+
Unclear error message when Forklift fails to build a PVC
+

The migration fails to build the Persistent Volume Claim (PVC) if the destination storage class does not have a configured storage profile. The forklift-controller raises an error message without a clear reason for failing to create a PVC. (MTV-928)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Flaw was found in jsrsasign package which is vulnerable to Observable Discrepancy
+

Versions of the package jsrsasign before 11.0.0, used in earlier releases of Forklift, are vulnerable to Observable Discrepancy in the RSA PKCS1.5 or RSA-OAEP decryption process. This discrepancy means an attacker could decrypt ciphertexts by exploiting this vulnerability. However, exploiting this vulnerability requires the attacker to have access to a large number of ciphertexts encrypted with the same key. This issue has been resolved in Forklift 2.5.5 by upgrading the package jsrasign to version 11.0.0.

+
+
+

For more information, see CVE-2024-21484.

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of Forklift, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of MTV or later.

+
+ +
+
Gin Web Framework does not properly sanitize filename parameter of Context.FileAttachment function
+

A flaw was found in the Gin-Gonic Gin Web Framework, used by Forklift. The filename parameter of the Context.FileAttachment function was not properly sanitized. This flaw in the package could allow a remote attacker to bypass security restrictions caused by improper input validation by the filename parameter of the Context.FileAttachment function. A maliciously created filename could cause the Content-Disposition header to be sent with an unexpected filename value, or otherwise modify the Content-Disposition header.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+ +
+
CVE-2023-26144: mtv-console-plugin-container: graphql: Insufficient checks in the OverlappingFieldsCanBeMergedRule.ts
+

A flaw was found in the package GraphQL from 16.3.0 and before 16.8.1. This flaw means Forklift versions before Forklift 2.5.2 are vulnerable to Denial of Service (DoS) due to insufficient checks in the OverlappingFieldsCanBeMergedRule.ts file when parsing large queries. This issue may allow an attacker to degrade system performance. (MTV-712)

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
CVE-2023-45142: Memory leak found in the otelhttp handler of open-telemetry
+

A flaw was found in otelhttp handler of OpenTelemetry-Go. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to a memory leak caused by http.user_agent and http.method having unbound cardinality, which could allow a remote, unauthenticated attacker to exhaust the server’s memory by sending many malicious requests, affecting the availability. (MTV-795)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-45142.

+
+
+
CVE-2023-39322: QUIC connections do not set an upper bound on the amount of data buffered when reading post-handshake messages
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to QUIC connections not setting an upper bound on the amount of data buffered when reading post-handshake messages, allowing a malicious QUIC connection to cause unbounded memory growth. With the fix, connections now consistently reject messages larger than 65KiB in size. (MTV-708)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39322.

+
+
+
CVE-2023-39321: Processing an incomplete post-handshake message for a QUIC connection can cause a panic
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to processing an incomplete post-handshake message for a QUIC connection, which causes a panic. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39321.

+
+
+
CVE-2023-39319: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable, as the html/template package did not properly handle occurrences of <script, <!--, and </script within JavaScript literals in <script> contexts. This flaw could cause the template parser to improperly consider script contexts to be terminated early, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39319.

+
+
+
CVE-2023-39318: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable as the html/template package did not properly handle HMTL-like "" comment tokens, nor hashbang \#! comment tokens. This flaw could cause the template parser to improperly interpret the contents of <script> contexts, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39318.

+
+
+
Logs archive file downloaded from UI includes logs related to deleted migration plan/VM
+

In earlier releases of Forklift 2.3, the log files downloaded from UI could contain logs that are related to an earlier migration plan. (MTV-783)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Extending a VM disk in RHV is not reflected in the MTV inventory
+

In earlier releases of Forklift 2.3, the size of disks that are extended in RHV was not adequately monitored. This resulted in the inability to migrate virtual machines with extended disks from a RHV provider. (MTV-830)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Filesystem overhead configurable
+

In earlier releases of Forklift 2.3, the filesystem overhead for new persistent volumes was hard-coded to 10%. The overhead was insufficient for certain filesystem types, resulting in failures during cold-migrations from oVirt and OSP to the cluster where Forklift is deployed. In other filesystem types, the hard-coded overhead was too high, resulting in excessive storage consumption.

+
+
+

In Forklift 2.5.3, the filesystem overhead can be configured, as it is no longer hard-coded. If your migration allocates persistent volumes without CDI, you can adjust the file system overhead. You adjust the file system overhead by adding the following label and value to the spec portion of the forklift-controller CR:

+
+
+
+
spec:
+  `controller_filesystem_overhead: <percentage>` (1)
+
+
+
+
    +
  1. +

    The percentage of overhead. If this label is not added, the default value of 10% is used. This setting is valid only if the storageclass is filesystem. (MTV-699)

    +
  2. +
+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In earlier releases of Forklift, the create and update provider forms could have presented stale data.

+
+
+

This issue is resolved in Forklift 2.3, the new forms of create and update provider display up-to-date properties of the provider. (MTV-603)

+
+
+
Snapshots that are created during a migration in OpenStack are not deleted
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots that were created during a migration of source virtual machines in OpenStack automatically.

+
+
+

This issue is resolved in Forklift 2.3, all the snapshots created during the migration are removed after the migration has been completed. (MTV-620)

+
+
+
oVirt snapshots are not deleted after a successful migration
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots automatically after a successful warm migration of a VM from oVirt.

+
+
+

This issue is resolved in Forklift 2.3, the snapshots generated during migration are removed after a successful migration, and the original snapshots are not removed after a successful migration. (MTV-349)

+
+
+
Warm migration fails when cutover conflicts with precopy
+

In earlier releases of Forklift, the cutover operation failed when it was triggered while precopy was being performed. The VM was locked in oVirt and therefore the ovirt-engine rejected the snapshot creation, or disk transfer, operation.

+
+
+

This issue is resolved in Forklift 2.3, the cutover operation is triggered, but it is not performed at that time because the VM is locked. Once the precopy operation completes, the cutover operation is triggered. (MTV-686)

+
+
+
Warm migration fails when VM is locked
+

In earlier releases of Forklift, triggering a warm migration while there was an ongoing operation in oVirt that locked the VM caused the migration to fail because it could not trigger the snapshot creation.

+
+
+

This issue is resolved in Forklift 2.3, warm migration does not fail when an operation that locks the VM is performed in oVirt. The migration does not fail, but starts when the VM is unlocked. (MTV-687)

+
+
+
Deleting migrated VM does not remove PVC and PV
+

In earlier releases of Forklift, when removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) were not deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs and PVs are deleted when deleting migrated VM.(MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

In earlier releases of Forklift, when a migration failed, its PVCs and PVs were not deleted as expected when its migration plan was archived and deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs are deleted when archiving and deleting migration plan.(MTV-493)

+
+
+
VM with multiple disks can boot from a non-bootable disk after migration
+

In earlier releases of Forklift, VM with multiple disks that were migrated might not have been able to boot on the target OKD cluster.

+
+
+

This issue is resolved in Forklift 2.3, VM with multiple disks that are migrated can boot on the target OKD cluster. (MTV-433)

+
+
+
Transfer network not taken into account for cold migrations from vSphere
+

In Forklift releases 2.4.0-2.5.3, cold migrations from vSphere to the local cluster on which Forklift was deployed did not take a specified transfer network into account. This issue is resolved in Forklift 2.5.4. (MTV-846)

+
+
+
Fix migration of VMs with multi-boot guest operating system from vSphere
+

In Forklift 2.5.6, the virt-v2v arguments include –root first, which mitigates an issue with multi-boot VMs where the pod fails. This is a fix for a regression that was introduced in Forklift 2.4, in which the '--root' argument was dropped. (MTV-987)

+
+
+
Errors logged in populator pods are improved
+

In earlier releases of Forklift 2.3, populator pods were always restarted on failure. This made it difficult to gather the logs from the failed pods. In Forklift 2.5.3, the number of restarts of populator pods is limited to three times. On the third and final time, the populator pod remains in the fail status and its logs can then be easily gathered by must-gather and by forklift-controller to know this step has failed. (MTV-818)

+
+
+
npm IP package vulnerability
+

A vulnerability found in the Node.js Package Manager (npm) IP Package can allow an attacker to obtain sensitive information and obtain access to normally inaccessible resources. MTV-941

+
+
+

This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-42282

+
+
+
Flaw was found in the Golang net/http/internal package
+

A flaw was found in the versions of the Golang net/http/internal package, that were used in earlier releases of Forklift. This flaw could allow a malicious user to send an HTTP request and cause the receiver to read more bytes from the network than are in the body (up to 1GiB), causing the receiver to fail reading the response, possibly leading to a Denial of Service (DoS). This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-39326.

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+

Upgrade notes

+
+
+

It is recommended to upgrade from Forklift 2.4.2 to Forklift 2.3.

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: Remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. Refresh the OKD console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.6/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.6/index.html new file mode 100644 index 00000000000..d2cf202a0f7 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.6/index.html @@ -0,0 +1,511 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.6

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Simplified the creation of vSphere providers
+

In earlier releases of Forklift, users had to specify a fingerprint when creating a vSphere provider. This required users to retrieve the fingerprint from the server that vCenter runs on. Forklift no longer requires this fingerprint as an input, but rather computes it from the specified certificate in the case of a secure connection or automatically retrieves it from the server that runs vCenter/ESXi in the case of an insecure connection.

+
+
+
Redesigned the migration plan creation dialog
+

The user interface console has improved the process of creating a migration plan. The new migration plan dialog enables faster creation of migration plans.

+
+
+

It includes only the minimal settings that are required, while you can confirgure advanced settings separately. The new dialog also provides defaults for network and storage mappings, where applicable. The new dialog can also be invoked from the the Provider > Virtual Machines tab, after selecting the virtual machines to migrate. It also better aligns with the user experience in the OCP console.

+
+
+
virtual machine preferences have replaced {ocp-name} templates
+

The virtual machine preferences have replaced {ocp-name} templates. Forklift currently falls back to using {ocp-name} templates when a relevant preference is not available.

+
+
+

Custom mappings of guest operating system type to virtual machine preference can be configured using config maps. This is in order to use custom virtual machine preferences, or to support more guest operating system types.

+
+
+
Full support for migration from OVA
+

Migration from OVA moves from being a Technical Preview and is now a fully supported feature.

+
+
+
The VM is posted with its desired Running state
+

Forklift creates the VM with its desired Running state on the target provider, instead of creating the VM and then running it as an additional operation. (MTV-794)

+
+
+
The must-gather logs can now be loaded only by using the CLI
+

The Forklift web console can no longer download logs. With this update, you must download must-gather logs by using CLI commands. For more information, see Must Gather Operator.

+
+
+
Forklift no longer runs pvc-init pods when migrating from vSphere
+

Forklift no longer runs pvc-init pods during cold migration from a vSphere provider to the {ocp-name} cluster that Forklift is deployed on. However, in other flows where data volumes are used, they are set with the cdi.kubevirt.io/storage.bind.immediate.requested annotation, and CDI runs first-consume pods for storage classes with volume binding mode WaitForFirstConsumer.

+
+
+
+
+

New features and enhancements

+
+
+

This section provides features and enhancements introduced in Forklift 2.6.

+
+
+

New features and enhancements 2.6.3

+
+
Support for migrating LUKS-encrypted devices in migrations from vSphere
+

You can now perform cold migrations from a vSphere provider of VMs whose virtual disks are encrypted by Linux Unified Key Setup (LUKS). (MTV-831)

+
+
+
Specifying the primary disk when migrating from vSphere
+

You can now specify the primary disk when you migrate VMs from vSphere with more than one bootable disk. This avoids Forklift automatically attempting to convert the first bootable disk that it detects while it examines all the disks of a virtual machine. This feature is needed because the first bootable disk is not necessarily the disk that the VM is expected to boot from in KubeVirt. (MTV-1079)

+
+
+
Links to remote provider UIs
+

You can now remotely access the UI of a remote cluster when you create a source provider. For example, if the provider is a remote oVirt oVirt cluster, Forklift adds a link to the remote oVirt web console when you define the provider. This feature makes it easier for you to manage and debug a migration from remote clusters. (MTV-1054)

+
+
+
+

New features and enhancements 2.6.0

+
+
Migration from vSphere over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the server that runs vCenter or ESXi, depending on the specified SDK endpoint of the vSphere provider. (MTV-530)

+
+
+
Migration to or from a remote {ocp-name} over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the API server of a remote {ocp-name} cluster. (MTV-728)

+
+
+
Migration from an ESXi server without going through vCenter
+

Forklift enables the configuration of vSphere providers with the SDK of ESXi. You need to select ESXi as the Endpoint type of the vSphere provider and specify the URL of the SDK of the ESXi server. (MTV-514)

+
+
+
Migration of image-based VMs from {osp}
+

Forklift supports the migration of VMs that were created from images in {osp}. (MTV-644)

+
+
+
Migration of VMs with Fibre Channel LUNs from oVirt
+

Forklift supports migrations of VMs that are set with Fibre Channel (FC) LUNs from oVirt. As with other LUN disks, you need to ensure the {ocp-name} nodes have access to the FC LUNs. During the migrations, the FC LUNs are detached from the source VMs in oVirt and attached to the migrated VMs in {ocp-name}. (MTV-659)

+
+
+
Preserve CPU types of VMs that are migrated from oVirt
+

Forklift sets the CPU type of migrated VMs in {ocp-name} with their custom CPU type in oVirt. In addition, a new option was added to migration plans that are set with oVirt as a source provider to preserve the original CPU types of source VMs. When this option is selected, Forklift identifies the CPU type based on the cluster configuration and sets this CPU type for the migrated VMs, for which the source VMs are not set with a custom CPU. (MTV-547)

+
+
+
Validation for RHEL 6 guest operating system is now available when migrating VMs with RHEL 6 guest operating system
+

Red Hat Enterprise Linux (RHEL) 9 does not support RHEL 6 as a guest operating system. Therefore, RHEL 6 is not supported in {ocp-name} Virtualization. With this update, a validation of RHEL 6 guest operating system was added to {ocp-name} Virtualization. (MTV413)

+
+
+
Automatic retrieval of CA certificates for the provider’s URL in the console
+

The ability to retrieve CA certificates, which was available in previous versions, has been restored. The vSphere Verify certificate option is in the add-provider dialog. This option was removed in the transition to the OKD console and has now been added to the console. This functionality is also available for oVirt, {osp}, and {ocp-name} providers now. (MTV-737)

+
+
+
Validation of a specified VDDK image
+

Forklift validates the availability of a VDDK image that is specified for a vSphere provider on the target {ocp-name} name as part of the validation of a migration plan. Forklift also checks whether the libvixDiskLib.so symbolic link (symlink) exists within the image. If the validation fails, the migration plan cannot be started. (MTV-618)

+
+
+
Add a warning and partial support for TPM
+

Forklift presents a warning when attempting to migrate a VM that is set with a TPM device from oVirt or vSphere. The migrated VM in {ocp-name} would be set with a TPM device but without the content of the TPM device on the source environment. (MTV-378)

+
+
+
Plans that failed to migrate VMs can now be edited
+

With this update, you can edit plans that have failed to migrate any VMs. Some plans fail or are canceled because of incorrect network and storage mappings. You can now edit these plans until they succeed. (MTV-779)

+
+
+
Validation rules are now available for OVA
+

The validation service includes default validation rules for virtual machines from the Open Virtual Appliance (OVA). (MTV-669)

+
+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+

Resolved issues 2.6.7

+
+
Incorrect handling of quotes in ifcfg files
+

In earlier releases of Forklift, there was an issue with the incorrect handling of single and double quotes in interface configuration (ifcfg) files, which control the software interfaces for individual network devices. This issue has been resolved in Forklift 2.6.7, in order to cover additional IP configurations on Red Hat Enterprise Linux, CentOS, Rocky Linux and similar distributions. (MTV-1439)

+
+
+
Failure to preserve netplan based network configuration
+

In earlier releases of Forklift, there was an issue with the preservation of netplan-based network configurations. This issue has been resolved in Forklift 2.6.7, so that static IP configurations are preserved if netplan (netplan.io) is used by using the netplan configuration files to generate udev rules for known mac-address and ifname tuples. (MTV-1440)

+
+
+
Error messages are written into udev .rules files
+

In earlier releases of Forklift, there was an issue with the accidental leakage of error messages into udev .rules files. This issue has been resolved in Forklift 2.6.7, with a static IP persistence script added to the udev rule file. (MTV-1441)

+
+
+
+

Resolved issues 2.6.6

+
+
Runtime error: invalid memory address or nil pointer dereference
+

In earlier releases of Forklift, there was a runtime error of invalid memory address or nil pointer dereference caused by a pointer that was nil, and there was an attempt to access the value that it points to. This issue has been resolved in Forklift 2.6.6. (MTV-1353)

+
+
+
All Plan and Migration pods scheduled to same node causing the node to crash
+

In earlier releases of Forklift, the scheduler could place all migration pods on a single node. When this happened, the node ran out of the resources. This issue has been resolved in Forklift 2.6.6. (MTV-1354)

+
+
+
Empty bearer token is sufficient for authentication
+

In earlier releases of Forklift, a vulnerability was found in the Forklift Controller.  There is no verification against the authorization header, except to ensure it uses bearer authentication. Without an authorization header and a bearer token, a 401 error occurs. The presence of a token value provides a 200 response with the requested information. This issue has been resolved in Forklift 2.6.6.

+
+
+

For more details, see (CVE-2024-8509).

+
+
+
+

Resolved issues 2.6.5

+
+
VMware Linux interface name changes during migration
+

In earlier releases of Forklift, during the migration of Rocky Linux 8, CentOS 7.2 and later, and Ubuntu 22 virtual machines (VM) from VMware to OKD (OCP), the name of the network interfaces is modified, and the static IP configuration for the VM is no longer functional. This issue has been resolved for static IPs in Rocky Linux 8, Centos 7.2 and later, Ubuntu 22 in Forklift 2.6.5. (MTV-595)

+
+
+
+

Resolved issues 2.6.4

+
+
Disks and drives are offline after migrating Windows virtual machines from RHV or VMware to OCP
+

Windows (Windows 2022) VMs configured with multiple disks, which are Online before the migration, are Offline after a successful migration from oVirt or VMware to OKD, using Forklift. Only the C:\ primary disk is Online. This issue has been resolved for basic disks in Forklift 2.6.4. (MTV-1299)

+
+
+

For details of the known issue of dynamic disks being Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd, see (MTV-1344).

+
+
+
Preserve IP option for Windows does not preserve all settings
+

In earlier releases of Forklift, while migrating a Windows 2022 Server with a static IP address assigned, and selecting the Preserve static IPs option, after a successful Windows migration, while the node started and the IP address was preserved, the subnet mask, gateway, and DNS servers were not preserved. This resulted in an incomplete migration, and the customer was forced to log in locally from the console to fully configure the network. This issue has been resolved in Forklift 2.6.4. (MTV-1286)

+
+
+
qemu-guest-agent not being installed at first boot in Windows Server 2022
+

After a successful Windows 2022 server guest migration using Forklift 2.6.1, the qemu-guest-agent is not completely installed. The Windows Scheduled task is being created, however it is being set to run 4 hours in the future instead of the intended 2 minutes in the future. (MTV-1325)

+
+
+
+

Resolved issues 2.6.3

+
+
CVE-2024-24788: golang: net malformed DNS message can cause infinite loop
+

In earlier releases of Forklift, there was a flaw was discovered in the stdlib package of the Go programming language, which impacts previous versions of Forklift. This vulnerability primarily threatens web-facing applications and services that rely on Go for DNS queries. This issue has been resolved in Forklift 2.6.3.

+
+
+

For more details, see (CVE-2024-24788).

+
+
+
Migration scheduling does not take into account that virt-v2v copies disks sequentially (vSphere only)
+

In earlier releases of Forklift, there was a problem with the way Forklift interpreted the controller_max_vm_inflight setting for vSphere to schedule migrations. This issue has been resolved in Forklift 2.6.3. (MTV-1191)

+
+
+
Cold migrations fail after changing the ESXi network (vSphere only)
+

In earlier versions of Forklift, cold migrations from a vSphere provider with an ESXi SDK endpoint failed if any network was used except for the default network for disk transfers. This issue has been resolved in Forklift 2.6.3. (MTV-1180)

+
+
+
Warm migrations over an ESXi network are stuck in DiskTransfer state (vSphere only)
+

In earlier versions of Forklift, warm migrations over an ESXi network from a vSphere provider with a vCenter SDK endpoint were stuck in DiskTransfer state because Forklift was unable to locate image snapshots. This issue has been resolved in Forklift 2.6.3. (MTV-1161)

+
+
+
Leftover PVCs are in Lost state after cold migrations
+

In earlier versions of Forklift, after cold migrations, there were leftover PVCs that had a status of Lost instead of being deleted, even after the migration plan that created them was archived and deleted. Investigation showed that this was because importer pods were retained after copying, by default, rather than in only specific cases. This issue has been resolved in Forklift 2.6.3. (MTV-1095)

+
+
+
Guest operating system from vSphere might be missing (vSphere only)
+

In earlier versions of Forklift, some VMs that were imported from vSphere were not mapped to a template in OKD while other VMs, with the same guest operating system, were mapped to the corresponding template. Investigations indicated that this was because vSphere stopped reporting the operating system after not receiving updates from VMware tools for some time. This issue has been resolved in Forklift 2.6.3 by taking the value of the operating system from the output of the investigation that virt-v2v performs on the disks. (MTV-1046)

+
+
+
+

Resolved issues 2.6.2

+
+
CVE-2023-45288: Golang net/http, x/net/http2: unlimited number of CONTINUATION frames can cause a denial-of-service (DoS) attack
+

A flaw was discovered with the implementation of the HTTP/2 protocol in the Go programming language, which impacts previous versions of Forklift. There were insufficient limitations on the number of CONTINUATION frames sent within a single stream. An attacker could potentially exploit this to cause a denial-of-service (DoS) attack. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45288).

+
+
+
CVE-2024-24785: mtv-api-container: Golang html/template: errors returned from MarshalJSON methods may break template escaping
+

A flaw was found in the html/template Golang standard library package, which impacts previous versions of Forklift. If errors returned from MarshalJSON methods contain user-controlled data, they may be used to break the contextual auto-escaping behavior of the HTML/template package, allowing subsequent actions to inject unexpected content into the templates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24785).

+
+
+
CVE-2024-24784: mtv-validation-container: Golang net/mail: comments in display names are incorrectly handled
+

A flaw was found in the net/mail Golang standard library package, which impacts previous versions of Forklift. The ParseAddressList function incorrectly handles comments, text in parentheses, and display names. As this is a misalignment with conforming address parsers, it can result in different trust decisions being made by programs using different parsers. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24784).

+
+
+
CVE-2024-24783: mtv-api-container: Golang crypto/x509: Verify panics on certificates with an unknown public key algorithm
+

A flaw was found in the crypto/x509 Golang standard library package, which impacts previous versions of Forklift. Verifying a certificate chain that contains a certificate with an unknown public key algorithm causes Certificate.Verify to panic. This affects all crypto/tls clients and servers that set Config.ClientAuth to VerifyClientCertIfGiven or RequireAndVerifyClientCert. The default behavior is for TLS servers to not verify client certificates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24783).

+
+
+
CVE-2023-45290: mtv-api-container: Golang net/http memory exhaustion in Request.ParseMultipartForm
+

A flaw was found in the net/http Golang standard library package, which impacts previous versions of Forklift. When parsing a multipart form, either explicitly with Request.ParseMultipartForm or implicitly with Request.FormValue, Request.PostFormValue, or Request.FormFile, limits on the total size of the parsed form are not applied to the memory consumed while reading a single form line. This permits a maliciously crafted input containing long lines to cause the allocation of arbitrarily large amounts of memory, potentially leading to memory exhaustion. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45290).

+
+
+
ImageConversion does not run when target storage is set with WaitForFirstConsumer (WFFC)
+

In earlier releases of Forklift, migration of VMs failed because the migration was stuck in the AllocateDisks phase. As a result of being stuck, the migration did not progress, and PVCs were not bound. The root cause of the issue was that ImageConversion did not run when target storage was set for wait-for-first-consumer. The problem was resolved in Forklift 2.6.2. (MTV-1126)

+
+
+
forklift-controller panics when importing VMs with direct LUNs
+

In earlier releases of Forklift, forklift-controller panicked when a user attempted to import VMs that had direct LUNs. The problem was resolved in Forklift 2.6.2. (MTV-1134)

+
+
+
+

Resolved issues 2.6.1

+
+
VMs with multiple disks that are migrated from vSphere and OVA files are not being fully copied
+

In Forklift 2.6.0, there was a problem in copying VMs with multiple disks from VMware vSphere and from OVA files. The migrations appeared to succeed but all the disks were transferred to the same PV in the target environment while other disks were empty. In some cases, bootable disks were overridden, so the VM could not boot. In other cases, data from the other disks was missing. The problem was resolved in Forklift 2.6.1. (MTV-1067)

+
+
+
Migrating VMs from one OKD cluster to another fails due to a timeout
+

In Forklift 2.6.0, migrations from one OKD cluster to another failed when the time to transfer the disks of a VM exceeded the time to live (TTL) of the Export API in {ocp-name}, which was set to 2 hours by default. The problem was resolved in Forklift 2.6.1 by setting the default TTL of the Export API to 12 hours, which greatly reduces the possibility of an expiration of the Export API. Additionally, you can increase or decrease the TTL setting as needed. (MTV-1052)

+
+
+
Forklift forklift-controller pod crashes when receiving a disk without a datastore
+

In earlier releases of Forklift, if a VM was configured with a disk that was on a datastore that was no longer available in vSphere at the time a migration was attempted, the forklift-controller crashed, rendering Forklift unusable. In Forklift 2.6.1, Forklift presents a critical validation for VMs with such disks, informing users of the problem, and the forklift-controller no longer crashes, although it cannot transfer the disk. (MTV-1029)

+
+
+
+

Resolved issues 2.6.0

+
+
Deleting an OVA provider automatically also deletes the PV
+

In earlier releases of Forklift, the PV was not removed when the OVA provider was deleted. This has been resolved in Forklift 2.6.0, and the PV is automatically deleted when the OVA provider is deleted. (MTV-848)

+
+
+
Fix for data being lost when migrating VMware VMs with snapshots
+

In earlier releases of Forklift, when migrating a VM that has a snapshot from VMware, the VM that was created in {ocp-name} Virtualization contained the data in the snapshot but not the latest data of the VM. This has been resolved in Forklift 2.6.0. (MTV-447)

+
+
+
Canceling and deleting a failed migration plan does not clean up the populate pods and PVC
+

In earlier releases of Forklift, when you canceled and deleted a failed migration plan, and after creating a PVC and spawning the populate pods, the populate pods and PVC were not deleted. You had to delete the pods and PVC manually. This issue has been resolved in Forklift 2.6.0. (MTV-678)

+
+
+
OKD to OKD migrations require the cluster version to be 4.13 or later
+

In earlier releases of Forklift, when migrating from OKD to OKD, the version of the source provider cluster had to be OKD version 4.13 or later. This issue has been resolved in Forklift 2.6.0, with validation being shown when migrating from versions of {ocp-name} before 4.13. (MTV-734)

+
+
+
Multiple storage domains from RHV were always mapped to a single storage class
+

In earlier releases of Forklift, multiple disks from different storage domains were always mapped to a single storage class, regardless of the storage mapping that was configured. This issue has been resolved in Forklift 2.6.0. (MTV-1008)

+
+
+
Firmware detection by virt-v2v
+

In earlier releases of Forklift, a VM that was migrated from an OVA that did not include the firmware type in its OVF configuration was set with UEFI. This was incorrect for VMs that were configured with BIOS. This issue has been resolved in Forklift 2.6.0, as Forklift now consumes the firmware that is detected by virt-v2v during the conversion of the disks. (MTV-759)

+
+
+
Creating a host secret requires validation of the secret before creation of the host
+

In earlier releases of Forklift, when configuring a transfer network for vSphere hosts, the console plugin created the Host CR before creating its secret. The secret should be specified first in order to validate it before the Host CR is posted. This issue has been resolved in Forklift 2.6.0. (MTV-868)

+
+
+
When adding OVA provider a ConnectionTestFailed message appears
+

In earlier releases of Forklift, when adding an OVA provider, the error message ConnectionTestFailed instantly appeared, although the provider had been created successfully. This issue has been resolved in Forklift 2.6.0. (MTV-671)

+
+
+
RHV provider ConnectionTestSucceeded True response from the wrong URL
+

In earlier releases of Forklift, the ConnectionTestSucceeded condition was set to True even when the URL was different than the API endpoint for the RHV Manager. This issue has been resolved in Forklift 2.6.0. (MTV-740)

+
+
+
Migration does not fail when a vSphere Data Center is nested inside a folder
+

In earlier releases of Forklift, migrating a VM that is placed in a Data Center that is stored directly under the /vcenter in vSphere succeeded. However, it failed when the Data Center was stored inside a folder. This issue was resolved in Forklift 2.6.0. (MTV-796)

+
+
+
The OVA inventory watcher detects deleted files
+

The OVA inventory watcher detects files changes, including deleted files. Updates from the ova-provider-server pod are now sent every five minutes to the forklift-controller pod that updates the inventory. (MTV-733)

+
+
+
Unclear error message when Forklift fails to build or create a PVC
+

In earlier releases of Forklift, the error logs lacked clear information to identify the reason for a failure to create a PV on a destination storage class that does not have a configured storage profile. This issue was resolved in Forklift 2.6.0. (MTV-928)

+
+
+
Plans stay indefinitely in the CopyDisks phase when there is an outdated ovirtvolumepopulator
+

In earlier releases of Forklift, an earlier failed migration could have left an outdated ovirtvolumepopulator. When starting a new plan for the same VM to the same project, the CreateDataVolumes phase did not create populator PVCs when transitioning to CopyDisks, causing the CopyDisks phase to stay indefinitely. This issue was resolved in Forklift 2.6.0. (MTV-929)

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+ + + + + +
+
Warning
+
+
Warm migration and remote migration flows are impacted by multiple bugs
+
+

Warm migration and remote migration flows are impacted by multiple bugs. It is strongly recommended to fall back to cold migration until this issue is resolved. (MTV-1366)

+
+
+
+
+
Migrating older Linux distributions from VMware to OKD, the name of the network interfaces changes
+

When migrating older Linux distributions, such as CentOS 7.0 and 7.1, virtual machines (VMs) from VMware to OKD, the name of the network interfaces changes, and the static IP configuration for the VM no longer functions. This issue is caused by RHEL 7.0 and 7.1 still requiring virtio-transitional. Workaround: Manually update the guest to RHEL 7.2 or update the VM specification post-migration to use transitional. (MTV-1382)

+
+
+
Dynamic disks are offline in Windows Server 2022 after migration from vSphere to CNV with ceph-rbd
+

The dynamic disks are Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd. (MTV-1344)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during a conversion (vSphere only)
+

vSphere only: Migrations from oVirt and {osp} do not fail, but the encryption key might be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage class of type hostPath
+

When migrating a VM with multiple disks to more than one storage class of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support the same guest operating systems that are supported in cold migrations and migrations to the local OKD cluster. RHEL 8 and RHEL 9 might cause this limitation.

+
+ +
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as a guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Migration of a VM with NVME disks from vSphere fails
+

When migrating a virtual machine (VM) with NVME disks from vSphere, the migration process fails, and the Web Console shows that the Convert image to kubevirt stage is running but did not finish successfully. (MTV-963)

+
+
+
Importing image-based VMs can fail
+

Migrating an image-based VM without the virtual_size field can fail on a block mode storage class. (MTV-946)

+
+
+
Deleting a migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Migrating VMs with independent persistent disks from VMware to OCP-V fails
+

Migrating VMs with independent persistent disks from VMware to OCP-V fails. (MTV-993)

+
+
+
Guest operating system from vSphere might be missing
+

When vSphere does not receive updates about the guest operating system from the VMware tools, it considers the information about the guest operating system to be outdated and ceases to report it. When this occurs, Forklift is unaware of the guest operating system of the VM and is unable to associate it with the appropriate virtual machine preference or {ocp-name} template. (MTV-1046)

+
+
+
Failure to migrate an image-based VM from {osp} to the default project
+

The migration process fails when migrating an image-based VM from {osp} to the default project. (MTV-964)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.7/index.html new file mode 100644 index 00000000000..42955c29c65 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.7/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.7

+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere versions 6, 7, and 8

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-27-resolved-issues/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-27-resolved-issues/index.html new file mode 100644 index 00000000000..c021b01cfd0 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-27-resolved-issues/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Resolved issues

+
+
+
+

Forklift 2.7 has the following resolved issues:

+
+
+
+
+

Resolved issues 2.7.3

+
+
+
Migration plan does not fail when conversion pod fails
+

In earlier releases of Forklift, when running the virt-v2v guest conversion, the migration plan did not fail if the conversion pod failed, as expected. This issue has been resolved in Forklift 2.7.3. (MTV-1569)

+
+
+
Large number of VMs in the inventory can cause the inventory controller to panic
+

In earlier releases of Forklift, having a large number of virtual machines (VMs) in the inventory could cause the inventory controller to panic and return a concurrent write to websocket connection warning. This issue was caused by the concurrent write to the WebSocket connection and has been addressed by the addition of a lock, so the Go routine waits before sending the response from the server. This issue has been resolved in Forklift 2.7.3. (MTV-1220)

+
+
+
VM selection disappears when selecting multiple VMs in the Migration Plan
+

In earlier releases of Forklift, VM selection checkbox disappeared after selecting multiple VMs in the Migration Plan. This issue has been resolved in Forklift 2.7.3. (MTV-1546)

+
+
+
forklift-controller crashing during OVA plan migration
+

In earlier releases of Forklift, the forklift-controller would crash during an OVA plan migration, returning a runtime error: invalid memory address or nil pointer dereference panic.  This issue has been resolved in Forklift 2.7.3. (MTV-1577)

+
+
+
+
+

Resolved issues 2.7.2

+
+
+
VMNetworksNotMapped error occurs after creating a plan from the UI with the source provider set to KubeVirt
+

In earlier releases of Forklift, after creating a plan with an KubeVirt source provider, the Migration Plan failed with the error The plan is not ready - VMNetworksNotMapped. This issue has been resolved in Forklift 2.7.2. (MTV-1201)

+
+
+
Migration Plan for KubeVirt to KubeVirt missing the source namespace causing VMNetworkNotMapped error
+

In earlier releases of Forklift, when creating a Migration Plan for an KubeVirt to KubeVirt migration using the Plan Creation Form, the network map generated was missing the source namespace, which caused a VMNetworkNotMapped error on the plan. This issue has been resolved in Forklift 2.7.2. (MTV-1297)

+
+
+
DV, PVC, and PV are not cleaned up and removed if the migration plan is Archived and Deleted
+

In earlier releases of Forklift, the DataVolume (DV), PersistentVolumeClaim (PVC), and PersistentVolume (PV) continued to exist after the migration plan was archived and deleted. This issue has been resolved in Forklift 2.7.2. (MTV-1477)

+
+
+
Other migrations are halted from starting as the scheduler is waiting for the complete VM to get transferred
+

In earlier releases of Forklift, when warm migrating a virtual machine (VM) that has several disks, you had to wait for the complete VM to get migrated, and the scheduler was halted until all the disks finished before the migration would be started. This issue has been resolved in Forklift 2.7.2. (MTV-1537)

+
+
+
Warm migration is not functioning as expected
+

In earlier releases of Forklift, warm migration did not function as expected. When running the warm migration with VMs larger than the MaxInFlight disks, the VMs over this number did not start the migration until the cutover. This issue has been resolved in Forklift 2.7.2. (MTV-1543)

+
+
+
Migration hanging due to error: virt-v2v: error: -i libvirt: expecting a libvirt guest name
+

In earlier releases of Forklift, when attempting to migrate a VMware VM with a non-compliant Kubernetes name, the Openshift console returned a warning that the VM would be renamed. However, after starting the Migration Plan, it hangs since the migration pod is in an Error state. This issue has been resolved in Forklift 2.7.2. This issue has been resolved in Forklift 2.7.2. (MTV-1555)

+
+
+
VMs are not migrated if they have more disks than MAX_VM_INFLIGHT
+

In earlier releases of Forklift, when migrating the VM using the warm migration, if there were more disks than the MAX_VM_INFLIGHT the VM was not scheduled and the migration was not started. This issue has been resolved in Forklift 2.7.2. (MTV-1573)

+
+
+
Migration Plan returns an error even when Changed Block Tracking (CBT) is enabled
+

In earlier releases of Forklift, when running a VM in VMware, if the CBT flag was enabled while the VM was running by adding both ctkEnabled=TRUE and scsi0:0.ctkEnabled=TRUE parameters, an error message Danger alert:The plan is not ready - VMMissingChangedBlockTracking was returned, and the migration plan was prevented from working. This issue has been resolved in Forklift 2.7.2. (MTV-1576)

+
+
+
+
+

Resolved issues 2.7.0

+
+
+
Change . to - in the names of VMs that are migrated
+

In earlier releases of Forklift, if the name of the virtual machines (VMs) contained ., this was changed to - when they were migrated. This issue has been resolved in Forklift 2.7.0. (MTV-1292)

+
+
+
Status condition indicating a failed mapping resource in a plan is not added to the plan
+

In earlier releases of Forklift, a status condition indicating a failed mapping resource of a plan was not added to the plan. This issue has been resolved in Forklift 2.7.0, with a status condition indicating the failed mapping being added. (MTV-1461)

+
+
+
ifcfg files with HWaddr cause the NIC name to change
+

In earlier releases of Forklift, interface configuration (ifcfg) files with a hardware address (HWaddr) of the Ethernet interface caused the name of the network interface controller (NIC) to change. This issue has been resolved in Forklift 2.7.0. (MTV-1463)

+
+
+
Import fails with special characters in VMX file
+

In earlier releases of Forklift, imports failed when there were special characters in the parameters of the VMX file. This issue has been resolved in Forklift 2.7.0. (MTV-1472)

+
+
+
Observed invalid memory address or nil pointer dereference panic
+

In earlier releases of Forklift, an invalid memory address or nil pointer dereference panic was observed, which was caused by a refactor and could be triggered when there was a problem with the inventory pod. This issue has been resolved in Forklift 2.7.0. (MTV-1482)

+
+
+
Static IPv4 changed after warm migrating win2022/2019 VMs
+

In earlier releases of Forklift, the static Internet Protocol version 4 (IPv4) address was changed after a warm migration of Windows Server 2022 and Windows Server 2019 VMs. This issue has been resolved in Forklift 2.7.0. (MTV-1491)

+
+
+
Warm migration is missing arguments
+

In earlier releases of Forklift, virt-v2v-in-place for the warm migration was missing arguments that were available in virt-v2v for the cold migration. This issue has been resolved in Forklift 2.7.0. (MTV-1495)

+
+
+
Default gateway settings changed after migrating Windows Server 2022 VMs with preserve static IPs
+

In earlier releases of Forklift, the default gateway settings were changed after migrating Windows Server 2022 VMs with the preserve static IPs setting. This issue has been resolved in Forklift 2.7.0. (MTV-1497)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/index.html new file mode 100644 index 00000000000..2e334f30bf3 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/index.html @@ -0,0 +1,135 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Running a migration plan

+
+

You can run a migration plan and view its progress in the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Valid migration plan.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
    +

    The Plans list displays the source and target providers, the number of virtual machines (VMs) being migrated, the status, and the description of each plan.

    +
    +
  2. +
  3. +

    Click Start beside a migration plan to start the migration.

    +
  4. +
  5. +

    Click Start in the confirmation window that opens.

    +
    +

    The Migration details by VM screen opens, displaying the migration’s progress

    +
    +
    +

    Warm migration only:

    +
    +
    +
      +
    • +

      The precopy stage starts.

      +
    • +
    • +

      Click Cutover to complete the migration.

      +
    • +
    +
    +
  6. +
  7. +

    If the migration fails:

    +
    +
      +
    1. +

      Click Get logs to retrieve the migration logs.

      +
    2. +
    3. +

      Click Get logs in the confirmation window that opens.

      +
    4. +
    5. +

      Wait until Get logs changes to Download logs and then click the button to download the logs.

      +
    6. +
    +
    +
  8. +
  9. +

    Click a migration’s Status, whether it failed or succeeded or is still ongoing, to view the details of the migration.

    +
    +

    The Migration details by VM screen opens, displaying the start and end times of the migration, the amount of data copied, and a progress pipeline for each VM being migrated.

    +
    +
  10. +
  11. +

    Expand an individual VM to view its steps and the elapsed time and state of each step.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/index.html new file mode 100644 index 00000000000..98f3e25d5dd --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a KubeVirt provider

+
+

You can select a default migration network for a KubeVirt provider in the OKD web console to improve performance. The default migration network is used to transfer disks to the namespaces in which it is configured.

+
+
+

If you do not select a migration network, the default migration network is the pod network, which might not be optimal for disk transfer.

+
+
+ + + + + +
+
Note
+
+
+

You can override the default migration network of the provider by selecting a different network when you create a migration plan.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    On the right side of the provider, select Select migration network from the {kebab}.

    +
  4. +
  5. +

    Select a network from the list of available networks and click Select.

    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/index.html new file mode 100644 index 00000000000..9f8218d08a9 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,142 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a VMware source provider

+
+

You can select a migration network in the OKD web console for a source provider to reduce risk to the source environment and to improve performance.

+
+
+

Using the default network for migration can result in poor performance because the network might not have sufficient bandwidth. This situation can have a negative effect on the source platform because the disk transfer operation might saturate the network.

+
+
+

Unresolved directive in selecting-migration-network-for-vmware-source-provider.adoc - include::snip_vmware_esxi_nfc.adoc[]

+
+
+
Prerequisites
+
    +
  • +

    The migration network must have sufficient throughput, minimum speed of 10 Gbps, for disk transfer.

    +
  • +
  • +

    The migration network must be accessible to the KubeVirt nodes through the default gateway.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The source virtual disks are copied by a pod that is connected to the pod network of the target namespace.

    +
    +
    +
    +
  • +
  • +

    The migration network should have jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click the host number in the Hosts column beside a provider to view a list of hosts.

    +
  4. +
  5. +

    Select one or more hosts and click Select migration network.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Network: Network name

      +
    • +
    • +

      ESXi host admin username: For example, root

      +
    • +
    • +

      ESXi host admin password: Password

      +
    • +
    +
    +
  8. +
  9. +

    Click Save.

    +
  10. +
  11. +

    Verify that the status of each host is Ready.

    +
    +

    If a host status is not Ready, the host might be unreachable on the migration network or the credentials might be incorrect. You can modify the host configuration and save the changes.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/index.html new file mode 100644 index 00000000000..a6e11c3a7eb --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/index.html @@ -0,0 +1,118 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a source provider

+
+

You can select a migration network for a source provider in the Forklift web console for improved performance.

+
+
+

If a source network is not optimal for migration, a Warning icon is displayed beside the host number in the Hosts column of the provider list.

+
+
+
Prerequisites
+

The migration network has the following prerequisites:

+
+
+
    +
  • +

    Minimum speed of 10 Gbps.

    +
  • +
  • +

    Accessible to the OpenShift nodes through the default gateway. The source disks are copied by a pod that is connected to the pod network of the target namespace.

    +
  • +
  • +

    Jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Click Providers.

    +
  2. +
  3. +

    Click the host number of a provider to view the host list and network details.

    +
  4. +
  5. +

    Select the host to be updated and click Select migration network.

    +
  6. +
  7. +

    Select a Network from the list of available networks.

    +
    +

    The network list displays only the networks accessible to all the selected hosts. The hosts must have

    +
    +
  8. +
  9. +

    Click Check connection to verify the credentials.

    +
  10. +
  11. +

    Click Select to select the migration network.

    +
    +

    The migration network appears in the network details of the updated hosts.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-certificate-options/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-certificate-options/index.html new file mode 100644 index 00000000000..27f7d0a5cb2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-certificate-options/index.html @@ -0,0 +1,114 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  2. +
  3. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html new file mode 100644 index 00000000000..89ea20fc7cb --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_cold-warm-comparison-table/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_cold-warm-comparison-table/index.html new file mode 100644 index 00000000000..3de7ebdc31b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_cold-warm-comparison-table/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Both cold migration and warm migration have advantages and disadvantages, as described in the table that follows:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Advantages and disadvantages of cold and warm migrations
Cold migrationWarm migration

Duration

Correlates to the amount of data on the disks

Correlates to the amount of data on the disks and VM utilization

Data transferred

Approximate sum of all disks

Approximate sum of all disks and VM utilization

VM downtime

High

Low

+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_measured_boot_windows_vm/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_measured_boot_windows_vm/index.html new file mode 100644 index 00000000000..cb7ba0bcc04 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_measured_boot_windows_vm/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_performance/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_performance/index.html new file mode 100644 index 00000000000..5cb6e8b3fe8 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_performance/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/index.html new file mode 100644 index 00000000000..6d00955ab3c --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/index.html @@ -0,0 +1,85 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

If you are an administrator, you can see and work with components (providers, plans, etc.) for all projects.

+
+
+

If you are a non-administrator, you can only see and work only with the components of projects you have permissions for.

+
+
+ + + + + +
+
Tip
+
+
+

You can see which projects you have permissions for by clicking the Project list, which is in the upper-left of every page in the Migrations section except for the Overview.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_plan-limits/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_plan-limits/index.html new file mode 100644 index 00000000000..23bf00cb45b --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_plan-limits/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_qemu-guest-agent/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_qemu-guest-agent/index.html new file mode 100644 index 00000000000..56abc669f59 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_qemu-guest-agent/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

VMware only: In cold migrations, in situations in which a package manager cannot be used during the migration, Forklift does not install the qemu-guest-agent daemon on the migrated VMs. This has some impact on the functionality of the migrated VMs, but overall, they are still expected to function.

+
+
+

To enable Forklift to automatically install qemu-guest-agent on the migrated VMs, ensure that your package manager can install the daemon during the first boot of the VM after migration.

+
+
+

If that is not possible, use your preferred automated or manual procedure to install qemu-guest-agent manually.

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_secure_boot_issue/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_secure_boot_issue/index.html new file mode 100644 index 00000000000..7b9913db1f7 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_secure_boot_issue/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-name-change/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-name-change/index.html new file mode 100644 index 00000000000..99a71e99bc3 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-name-change/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-permissions/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-permissions/index.html new file mode 100644 index 00000000000..8c70e95d1a1 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-permissions/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware_esxi_nfc/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware_esxi_nfc/index.html new file mode 100644 index 00000000000..56c44d6d197 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware_esxi_nfc/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+

You can also control the network from which disks are transferred from a host by using the Network File Copy (NFC) service in vSphere.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 00000000000..c2e318d94bd --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

+
+
+
+
$ kubectl get route virt -n konveyor-forklift \
+  -o custom-columns=:.spec.host
+
+
+
+

+ +The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

+
+
+

+ +.Example output

+
+
+
+
https://virt-konveyor-forklift.apps.cluster.openshift.com.
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/index.html new file mode 100644 index 00000000000..f289a4342a0 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/index.html @@ -0,0 +1,84 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Log in to the OKD web console.

    +
  2. +
  3. +

    Click NetworkingRoutes.

    +
  4. +
  5. +

    Select the {namespace} project in the Project: list.

    +
    +

    The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

    +
    +
    +

    Click the URL to navigate to the Forklift web console.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/index.html new file mode 100644 index 00000000000..7d120299050 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

+
+
+ + + + + +
+
Important
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/index.html new file mode 100644 index 00000000000..8a970accab2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Source virtual machine prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    ISO/CDROM disks must be unmounted.

    +
  • +
  • +

    Each NIC must contain one IPv4 and/or one IPv6 address.

    +
  • +
  • +

    The operating system of a VM must be certified and supported as a guest operating system with KubeVirt.

    +
  • +
  • +

    The name of a VM must not contain a period (.). Forklift changes any period in a VM name to a dash (-).

    +
  • +
  • +

    The name of a VM must not be the same as any other VM in the KubeVirt environment.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    Forklift automatically assigns a new name to a VM that does not comply with the rules.

    +
    +
    +

    Forklift makes the following changes when it automatically generates a new VM name:

    +
    +
    +
      +
    • +

      Excluded characters are removed.

      +
    • +
    • +

      Uppercase letters are switched to lowercase letters.

      +
    • +
    • +

      Any underscore (_) is changed to a dash (-).

      +
    • +
    +
    +
    +

    This feature allows a migration to proceed smoothly even if someone enters a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/index.html new file mode 100644 index 00000000000..bedbf978eda --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/index.html @@ -0,0 +1,211 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Storage support and default modes

+
+

Forklift uses the following default volume and access modes for supported storage.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Default volume and access modes
ProvisionerVolume modeAccess mode

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

+
+ + + + + +
+
Note
+
+
+

If the KubeVirt storage does not support dynamic provisioning, you must apply the following settings:

+
+
+
    +
  • +

    Filesystem volume mode

    +
    +

    Filesystem volume mode is slower than Block volume mode.

    +
    +
  • +
  • +

    ReadWriteOnce access mode

    +
    +

    ReadWriteOnce access mode does not support live virtual machine migration.

    +
    +
  • +
+
+
+

See Enabling a statically-provisioned storage class for details on editing the storage profile.

+
+
+
+
+ + + + + +
+
Note
+
+
+

If your migration uses block storage and persistent volumes created with an EXT4 file system, increase the file system overhead in CDI to be more than 10%. The default overhead that is assumed by CDI does not completely include the reserved place for the root partition. If you do not increase the file system overhead in CDI by this amount, your migration might fail.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When migrating from OpenStack or running a cold-migration from RHV to the OCP cluster that MTV is deployed on, the migration allocates persistent volumes without CDI. In these cases, you might need to adjust the file system overhead.

+
+
+

If the configured file system overhead, which has a default value of 10%, is too low, the disk transfer will fail due to lack of space. In such a case, you would want to increase the file system overhead.

+
+
+

In some cases, however, you might want to decrease the file system overhead to reduce storage consumption.

+
+
+

You can change the file system overhead by changing the value of the controller_filesystem_overhead in the spec portion of the forklift-controller CR, as described in Configuring the MTV Operator.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technical-changes-2-7/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technical-changes-2-7/index.html new file mode 100644 index 00000000000..2db2a342c87 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technical-changes-2-7/index.html @@ -0,0 +1,73 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Technical changes

+
+

Forklift 2.7 has the following technical changes:

+
+
+
Upgraded virt-v2v to RHEL9 for warm migrations
+

Forklift previously used virt-v2v from Red Hat Enterprise Linux (RHEL) 8, which does not include bug fixes and features that are available in virt-v2v in RHEL9. In Forklift 2.7.0, components are updated to RHEL 9 in order to improve the functionality of warm migration. (MTV-1152)

+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/index.html new file mode 100644 index 00000000000..1ec520ebece --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

{FeatureName} is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/index.html new file mode 100644 index 00000000000..b7238048181 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,144 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI).

+
+
+ + + + + +
+
Note
+
+
+

This action does not remove resources managed by the Forklift Operator, including custom resource definitions (CRDs) and custom resources (CRs). To remove these after uninstalling the Forklift Operator, you might need to manually delete the Forklift Operator CRDs.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Delete the forklift controller by running the following command:

    +
    +
    +
    $ oc delete ForkliftController --all -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Delete the subscription to the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  4. +
  5. +

    Delete the clusterserviceversion for the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  6. +
  7. +

    Delete the plugin console CR by running the following command:

    +
    +
    +
    $ oc delete ConsolePlugin forklift-console-plugin
    +
    +
    +
  8. +
  9. +

    Optional: Delete the custom resource definitions (CRDs) by running the following command:

    +
    +
    +
    kubectl get crd -o name | grep 'forklift.konveyor.io' | xargs kubectl delete
    +
    +
    +
  10. +
  11. +

    Optional: Perform cleanup by deleting the Forklift project by running the following command:

    +
    +
    +
    oc delete project openshift-mtv
    +
    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 00000000000..99653afed57 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift by using the OKD web console

+
+

You can uninstall Forklift by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Operators > Installed Operators.

    +
  2. +
  3. +

    Click Forklift Operator.

    +
    +

    The Operator Details page opens in the Details tab.

    +
    +
  4. +
  5. +

    Click the ForkliftController tab.

    +
  6. +
  7. +

    Click Actions and select Delete ForkLiftController.

    +
    +

    A confirmation window opens.

    +
    +
  8. +
  9. +

    Click Delete.

    +
    +

    The controller is removed.

    +
    +
  10. +
  11. +

    Open the Details tab.

    +
    +

    The Create ForkliftController button appears instead of the controller you deleted. There is no need to click it.

    +
    +
  12. +
  13. +

    On the upper-right side of the page, click Actions and select Uninstall Operator.

    +
    +

    A confirmation window opens, displaying any operand instances.

    +
    +
  14. +
  15. +

    To delete all instances, select the Delete all operand instances for this operator checkbox. By default, the checkbox is cleared.

    +
    + + + + + +
    +
    Important
    +
    +
    +

    If your Operator configured off-cluster resources, these will continue to run and will require manual cleanup.

    +
    +
    +
    +
  16. +
  17. +

    Click Uninstall.

    +
    +

    The Installed Operators page opens, and the Forklift Operator is removed from the list of installed Operators.

    +
    +
  18. +
  19. +

    Click Home > Overview.

    +
  20. +
  21. +

    In the Status section of the page, click Dynamic Plugins.

    +
    +

    The Dynamic Plugins popup opens, listing forklift-console-plugin as a failed plugin. If the forklift-console-plugin does not appear as a failed plugin, refresh the web console.

    +
    +
  22. +
  23. +

    Click forklift-console-plugin.

    +
    +

    The ConsolePlugin details page opens in the Details tab.

    +
    +
  24. +
  25. +

    On the upper right-hand side of the page, click Actions and select Delete ConsolePlugin from the list.

    +
    +

    A confirmation window opens.

    +
    +
  26. +
  27. +

    Click Delete.

    +
    +

    The plugin is removed from the list of Dynamic plugins on the Overview page. If the plugin still appears, restart the Overview page.

    +
    +
  28. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/index.html new file mode 100644 index 00000000000..8efcea4ade9 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Updating the inventory rules version

+
+

You must update the inventory rules version each time you update the rules so that the Provider Inventory service detects the changes and triggers the Validation service.

+
+
+

The rules version is recorded in a rules_version.rego file for each provider.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the current rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 5
    +   }
    +}
    +
    +
    +
  2. +
  3. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  4. +
  5. +

    Update the rules version in the /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego file.

    +
  6. +
  7. +

    Log out of the Validation pod terminal.

    +
  8. +
  9. +

    Verify the updated rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 6
    +   }
    +}
    +
    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/upgrading-mtv-ui/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/upgrading-mtv-ui/index.html new file mode 100644 index 00000000000..38e0b7cd6f7 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/upgrading-mtv-ui/index.html @@ -0,0 +1,127 @@ + + + + + + + + Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + +Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Upgrading Forklift

+
+

You can upgrade the Forklift Operator by using the OKD web console to install the new version.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsInstalled Operators{operator-name-ui}Subscription.

    +
  2. +
  3. +

    Change the update channel to the correct release.

    +
    +

    See Changing update channel in the OKD documentation.

    +
    +
  4. +
  5. +

    Confirm that Upgrade status changes from Up to date to Upgrade available. If it does not, restart the CatalogSource pod:

    +
    +
      +
    1. +

      Note the catalog source, for example, redhat-operators.

      +
    2. +
    3. +

      From the command line, retrieve the catalog source pod:

      +
      +
      +
      $ kubectl get pod -n openshift-marketplace | grep <catalog_source>
      +
      +
      +
    4. +
    5. +

      Delete the pod:

      +
      +
      +
      $ kubectl delete pod -n openshift-marketplace <catalog_source_pod>
      +
      +
      +
      +

      Upgrade status changes from Up to date to Upgrade available.

      +
      +
      +

      If you set Update approval on the Subscriptions tab to Automatic, the upgrade starts automatically.

      +
      +
    6. +
    +
    +
  6. +
  7. +

    If you set Update approval on the Subscriptions tab to Manual, approve the upgrade.

    +
    +

    See Manually approving a pending upgrade in the OKD documentation.

    +
    +
  8. +
  9. +

    If you are upgrading from Forklift 2.2 and have defined VMware source providers, edit the VMware provider by adding a VDDK init image. Otherwise, the update will change the state of any VMware providers to Critical. For more information, see Adding a VMSphere source provider.

    +
  10. +
  11. +

    If you mapped to NFS on the OKD destination provider in Forklift 2.2, edit the AccessModes and VolumeMode parameters in the NFS storage profile. Otherwise, the upgrade will invalidate the NFS mapping. For more information, see Customizing the storage profile.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/using-must-gather/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/using-must-gather/index.html new file mode 100644 index 00000000000..857998b1851 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/using-must-gather/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using the must-gather tool

+
+

You can collect logs and information about Forklift custom resources (CRs) by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, migration plan, or virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Collecting logs and CR information
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_id> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        Specify the VM ID as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/virt-migration-workflow/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/virt-migration-workflow/index.html new file mode 100644 index 00000000000..1297608f51e --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/virt-migration-workflow/index.html @@ -0,0 +1,209 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Detailed migration workflow

+
+

You can use the detailed migration workflow to troubleshoot a failed migration.

+
+
+

The workflow describes the following steps:

+
+
+

Warm Migration or migration to a remote {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create the Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
  7. +

    The CDI Controller service creates an importer pod.

    +
  8. +
  9. +

    The importer pod streams the VM disk to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The Migration Controller service creates a conversion pod with the PVCs attached to it when importing from VMWare.

    +
    +

    The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the target VM.

    +
    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from oVirt or {osp} to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates for each source VM disk a PersistentVolumeClaim CR, and an OvirtVolumePopulator when the source is oVirt, or an OpenstackVolumePopulator CR when the source is {osp}.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Populator Controller service creates a temporarily persistent volume claim (PVC).

    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
    +
      +
    • +

      The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

      +
    • +
    +
    +
  6. +
  7. +

    The Populator Controller service creates a populator pod.

    +
  8. +
  9. +

    The populator pod transfers the disk data to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The temporary PVC is deleted, and the initial PVC points to the PV with the data.

    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from VMWare to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a blank persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
+
+
+

For all VM disks:

+
+
+
    +
  1. +

    The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

    +
  2. +
  3. +

    The Migration Controller service creates a conversion pod for all PVCs.

    +
  4. +
  5. +

    The conversion pod runs virt-v2v, which converts the VM to the KVM hypervisor and transfers the disks' data to their corresponding PVs.

    +
    +

    After the VM disks are transferred:

    +
    +
  6. +
  7. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  8. +
  9. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/index.html new file mode 100644 index 00000000000..8a935d57d25 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/index.html @@ -0,0 +1,278 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

VMware prerequisites

+
+

It is strongly recommended to create a VDDK image to accelerate migrations. For more information, see Creating a VDDK image.

+
+
+

The following prerequisites apply to VMware migrations:

+
+
+
    +
  • +

    You must use a compatible version of VMware vSphere.

    +
  • +
  • +

    You must be logged in as a user with at least the minimal set of VMware privileges.

    +
  • +
  • +

    To access the virtual machine using a pre-migration hook, VMware Tools must be installed on the source virtual machine.

    +
  • +
  • +

    The VM operating system must be certified and supported for use as a guest operating system with KubeVirt and for conversion to KVM with virt-v2v.

    +
  • +
  • +

    If you are running a warm migration, you must enable changed block tracking (CBT) on the VMs and on the VM disks.

    +
  • +
  • +

    If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host.

    +
  • +
  • +

    It is strongly recommended to disable hibernation because Forklift does not support migrating hibernated VMs.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

In the event of a power outage, data might be lost for a VM with disabled hibernation. However, if hibernation is not disabled, migration will fail

+
+
+
+
+ + + + + +
+
Note
+
+
+

Neither Forklift nor OpenShift Virtualization support conversion of Btrfs for migrating VMs from VMWare.

+
+
+
+

VMware privileges

+
+

The following minimal set of VMware privileges is required to migrate virtual machines to KubeVirt with the Forklift.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. VMware privileges
PrivilegeDescription

Virtual machine.Interaction privileges:

Virtual machine.Interaction.Power Off

Allows powering off a powered-on virtual machine. This operation powers down the guest operating system.

Virtual machine.Interaction.Power On

Allows powering on a powered-off virtual machine and resuming a suspended virtual machine.

Virtual machine.Guest operating system management by VIX API

Allows managing a virtual machine by the VMware VIX API.

+

Virtual machine.Provisioning privileges:

+
+
+ + + + + +
+
Note
+
+
+

All Virtual machine.Provisioning privileges are required.

+
+
+

Virtual machine.Provisioning.Allow disk access

Allows opening a disk on a virtual machine for random read and write access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow file access

Allows operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow read-only disk access

Allows opening a disk on a virtual machine for random read access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow virtual machine download

Allows read operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow virtual machine files upload

Allows write operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Clone template

Allows cloning of a template.

Virtual machine.Provisioning.Clone virtual machine

Allows cloning of an existing virtual machine and allocation of resources.

Virtual machine.Provisioning.Create template from virtual machine

Allows creation of a new template from a virtual machine.

Virtual machine.Provisioning.Customize guest

Allows customization of a virtual machine’s guest operating system without moving the virtual machine.

Virtual machine.Provisioning.Deploy template

Allows deployment of a virtual machine from a template.

Virtual machine.Provisioning.Mark as template

Allows marking an existing powered-off virtual machine as a template.

Virtual machine.Provisioning.Mark as virtual machine

Allows marking an existing template as a virtual machine.

Virtual machine.Provisioning.Modify customization specification

Allows creation, modification, or deletion of customization specifications.

Virtual machine.Provisioning.Promote disks

Allows promote operations on a virtual machine’s disks.

Virtual machine.Provisioning.Read customization specifications

Allows reading a customization specification.

Virtual machine.Snapshot management privileges:

Virtual machine.Snapshot management.Create snapshot

Allows creation of a snapshot from the virtual machine’s current state.

Virtual machine.Snapshot management.Remove Snapshot

Allows removal of a snapshot from the snapshot history.

Datastore privileges:

Datastore.Browse datastore

Allows exploring the contents of a datastore.

Datastore.Low level file operations

Allows performing low-level file operations - read, write, delete, and rename - in a datastore.

Sessions privileges:

Sessions.Validate session

Allows verification of the validity of a session.

Cryptographic privileges:

Cryptographic.Decrypt

Allows decryption of an encrypted virtual machine.

Cryptographic.Direct access

Allows access to encrypted resources.

+ + +
+ + diff --git a/documentation/doc-Release_notes/docinfo.xml b/documentation/doc-Release_notes/docinfo.xml new file mode 100644 index 00000000000..b35cd5a2260 --- /dev/null +++ b/documentation/doc-Release_notes/docinfo.xml @@ -0,0 +1,15 @@ +{rn-title} +{project-full} +{project-version} +Version {project-version} + + This document describes new features, known issues, and resolved issues for {the-lc} {project-full} {project-version}. + + + + Red Hat Modernization and Migration + Documentation Team + ccs-mms-docs@redhat.com + + + diff --git a/documentation/doc-Release_notes/master/index.html b/documentation/doc-Release_notes/master/index.html new file mode 100644 index 00000000000..73c8972bd3a --- /dev/null +++ b/documentation/doc-Release_notes/master/index.html @@ -0,0 +1,2674 @@ + + + + + + + + Release notes | Forklift Documentation + + + + + + + + + + + + + +Release notes | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Release notes

+ +
+

Forklift 2.7

+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere versions 6, 7, and 8

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    OpenStack

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+
+

Technical changes

+
+

Forklift 2.7 has the following technical changes:

+
+
+
Upgraded virt-v2v to RHEL9 for warm migrations
+

Forklift previously used virt-v2v from Red Hat Enterprise Linux (RHEL) 8, which does not include bug fixes and features that are available in virt-v2v in RHEL9. In Forklift 2.7.0, components are updated to RHEL 9 in order to improve the functionality of warm migration. (MTV-1152)

+
+
+

Forklift selected packages

+
+

The following listed packages are from the virt-v2v guest conversion pod:

+
+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Selected Forklift packages
Package summaryForklift 2.7.0Forklift 2.7.2Forklift 2.7.3

The skeleton package which defines a simple Red Hat Enterprise Linux system

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

Core kernel modules to match the core kernel

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

The Linux kernel

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

Access and modify virtual machine disk images

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

Client side utilities of the libvirt library

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

Libvirt libraries

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

QEMU driver plugin for the libvirtd daemon

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

NBD server

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

Basic filters for nbdkit

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

Basic plugins for nbdkit

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

HTTP/FTP (cURL) plugin for nbdkit

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

NBD proxy / forward plugin for nbdkit

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

Python 3 plugin for nbdkit

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

The nbdkit server

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

SSH plugin for nbdkit

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

VMware VDDK plugin for nbdkit

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

QEMU command line tool for manipulating disk images

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

QEMU common files needed by all QEMU targets

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

+

qemu-kvm core components

+

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

Convert a virtual machine to run on KVM

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

+
+

For a full list of packages in Forklift, see Forklift changelog.

+
+
+
+
+

New features and enhancements

+
+

Forklift 2.7 introduces the following features and enhancements:

+
+
+

New features and enhancements 2.7.0

+
+
    +
  • +

    In Forklift 2.7.0, warm migration is now based on RHEL 9 inheriting features and bug fixes.

    +
  • +
+
+
+
+
+

Resolved issues

+
+

Forklift 2.7 has the following resolved issues:

+
+
+

Resolved issues 2.7.3

+
+
Migration plan does not fail when conversion pod fails
+

In earlier releases of Forklift, when running the virt-v2v guest conversion, the migration plan did not fail if the conversion pod failed, as expected. This issue has been resolved in Forklift 2.7.3. (MTV-1569)

+
+
+
Large number of VMs in the inventory can cause the inventory controller to panic
+

In earlier releases of Forklift, having a large number of virtual machines (VMs) in the inventory could cause the inventory controller to panic and return a concurrent write to websocket connection warning. This issue was caused by the concurrent write to the WebSocket connection and has been addressed by the addition of a lock, so the Go routine waits before sending the response from the server. This issue has been resolved in Forklift 2.7.3. (MTV-1220)

+
+
+
VM selection disappears when selecting multiple VMs in the Migration Plan
+

In earlier releases of Forklift, VM selection checkbox disappeared after selecting multiple VMs in the Migration Plan. This issue has been resolved in Forklift 2.7.3. (MTV-1546)

+
+
+
forklift-controller crashing during OVA plan migration
+

In earlier releases of Forklift, the forklift-controller would crash during an OVA plan migration, returning a runtime error: invalid memory address or nil pointer dereference panic.  This issue has been resolved in Forklift 2.7.3. (MTV-1577)

+
+
+
+

Resolved issues 2.7.2

+
+
VMNetworksNotMapped error occurs after creating a plan from the UI with the source provider set to KubeVirt
+

In earlier releases of Forklift, after creating a plan with an KubeVirt source provider, the Migration Plan failed with the error The plan is not ready - VMNetworksNotMapped. This issue has been resolved in Forklift 2.7.2. (MTV-1201)

+
+
+
Migration Plan for KubeVirt to KubeVirt missing the source namespace causing VMNetworkNotMapped error
+

In earlier releases of Forklift, when creating a Migration Plan for an KubeVirt to KubeVirt migration using the Plan Creation Form, the network map generated was missing the source namespace, which caused a VMNetworkNotMapped error on the plan. This issue has been resolved in Forklift 2.7.2. (MTV-1297)

+
+
+
DV, PVC, and PV are not cleaned up and removed if the migration plan is Archived and Deleted
+

In earlier releases of Forklift, the DataVolume (DV), PersistentVolumeClaim (PVC), and PersistentVolume (PV) continued to exist after the migration plan was archived and deleted. This issue has been resolved in Forklift 2.7.2. (MTV-1477)

+
+
+
Other migrations are halted from starting as the scheduler is waiting for the complete VM to get transferred
+

In earlier releases of Forklift, when warm migrating a virtual machine (VM) that has several disks, you had to wait for the complete VM to get migrated, and the scheduler was halted until all the disks finished before the migration would be started. This issue has been resolved in Forklift 2.7.2. (MTV-1537)

+
+
+
Warm migration is not functioning as expected
+

In earlier releases of Forklift, warm migration did not function as expected. When running the warm migration with VMs larger than the MaxInFlight disks, the VMs over this number did not start the migration until the cutover. This issue has been resolved in Forklift 2.7.2. (MTV-1543)

+
+
+
Migration hanging due to error: virt-v2v: error: -i libvirt: expecting a libvirt guest name
+

In earlier releases of Forklift, when attempting to migrate a VMware VM with a non-compliant Kubernetes name, the Openshift console returned a warning that the VM would be renamed. However, after starting the Migration Plan, it hangs since the migration pod is in an Error state. This issue has been resolved in Forklift 2.7.2. This issue has been resolved in Forklift 2.7.2. (MTV-1555)

+
+
+
VMs are not migrated if they have more disks than MAX_VM_INFLIGHT
+

In earlier releases of Forklift, when migrating the VM using the warm migration, if there were more disks than the MAX_VM_INFLIGHT the VM was not scheduled and the migration was not started. This issue has been resolved in Forklift 2.7.2. (MTV-1573)

+
+
+
Migration Plan returns an error even when Changed Block Tracking (CBT) is enabled
+

In earlier releases of Forklift, when running a VM in VMware, if the CBT flag was enabled while the VM was running by adding both ctkEnabled=TRUE and scsi0:0.ctkEnabled=TRUE parameters, an error message Danger alert:The plan is not ready - VMMissingChangedBlockTracking was returned, and the migration plan was prevented from working. This issue has been resolved in Forklift 2.7.2. (MTV-1576)

+
+
+
+

Resolved issues 2.7.0

+
+
Change . to - in the names of VMs that are migrated
+

In earlier releases of Forklift, if the name of the virtual machines (VMs) contained ., this was changed to - when they were migrated. This issue has been resolved in Forklift 2.7.0. (MTV-1292)

+
+
+
Status condition indicating a failed mapping resource in a plan is not added to the plan
+

In earlier releases of Forklift, a status condition indicating a failed mapping resource of a plan was not added to the plan. This issue has been resolved in Forklift 2.7.0, with a status condition indicating the failed mapping being added. (MTV-1461)

+
+
+
ifcfg files with HWaddr cause the NIC name to change
+

In earlier releases of Forklift, interface configuration (ifcfg) files with a hardware address (HWaddr) of the Ethernet interface caused the name of the network interface controller (NIC) to change. This issue has been resolved in Forklift 2.7.0. (MTV-1463)

+
+
+
Import fails with special characters in VMX file
+

In earlier releases of Forklift, imports failed when there were special characters in the parameters of the VMX file. This issue has been resolved in Forklift 2.7.0. (MTV-1472)

+
+
+
Observed invalid memory address or nil pointer dereference panic
+

In earlier releases of Forklift, an invalid memory address or nil pointer dereference panic was observed, which was caused by a refactor and could be triggered when there was a problem with the inventory pod. This issue has been resolved in Forklift 2.7.0. (MTV-1482)

+
+
+
Static IPv4 changed after warm migrating win2022/2019 VMs
+

In earlier releases of Forklift, the static Internet Protocol version 4 (IPv4) address was changed after a warm migration of Windows Server 2022 and Windows Server 2019 VMs. This issue has been resolved in Forklift 2.7.0. (MTV-1491)

+
+
+
Warm migration is missing arguments
+

In earlier releases of Forklift, virt-v2v-in-place for the warm migration was missing arguments that were available in virt-v2v for the cold migration. This issue has been resolved in Forklift 2.7.0. (MTV-1495)

+
+
+
Default gateway settings changed after migrating Windows Server 2022 VMs with preserve static IPs
+

In earlier releases of Forklift, the default gateway settings were changed after migrating Windows Server 2022 VMs with the preserve static IPs setting. This issue has been resolved in Forklift 2.7.0. (MTV-1497)

+
+
+
+
+

Known issues

+
+

Forklift 2.7 has the following known issues:

+
+
+
Select Migration Network from the endpoint type ESXi displays multiple incorrect networks
+

When you choose Select Migration Network, from the endpoint type of ESXi, multiple incorrect networks are displayed. (MTV-1291)

+
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+
+
Network and Storage maps in the UI are not correct when created from the command line
+

When creating Network and Storage maps from the UI, the correct names are not shown in the UI. (MTV-1421)

+
+
+
Migration fails with module network-legacy configured in RHEL guests
+

Migration fails if the module configuration file is available in the guest and the dhcp-client package is not installed, returning a dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found error. (MTV-1615)

+
+
+
+

Forklift changelog

+
+

The following changelog for Forklift includes a full list of packages used in the Forklift 2.7 releases.

+
+
+

Forklift 2.7 packages

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Forklift packages
Forklift 2.7.0Forklift 2.7.2Forklift 2.7.3

abattis-cantarell-fonts-0.301-4.el9.noarch

abattis-cantarell-fonts-0.301-4.el9.noarch

Abattis-cantarell-fonts-0.301-4.el9.noarch

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glibc-2.34-100.el9_4.3.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.3.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.3.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.3.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtpms-0.9.1-3.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

linux-firmware-20240716-143.2.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240716-143.2.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.46.1-2.el9_4.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

+
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html b/documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html new file mode 100644 index 00000000000..b9c877a8c6e --- /dev/null +++ b/documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html @@ -0,0 +1,255 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About cold and warm migration

+
+
+
+

Forklift supports cold migration from:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

Forklift supports warm migration from VMware vSphere and from oVirt.

+
+
+
+
+

Cold migration

+
+
+

Cold migration is the default migration type. The source virtual machines are shut down while the data is copied.

+
+
+ + + + + +
+
Note
+
+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_qemu-guest-agent.adoc[]

+
+
+
+
+
+
+

Warm migration

+
+
+

Most of the data is copied during the precopy stage while the source virtual machines (VMs) are running.

+
+
+

Then the VMs are shut down and the remaining data is copied during the cutover stage.

+
+
+
Precopy stage
+

The VMs are not shut down during the precopy stage.

+
+
+

The VM disks are copied incrementally by using changed block tracking (CBT) snapshots. The snapshots are created at one-hour intervals by default. You can change the snapshot interval by updating the forklift-controller deployment.

+
+
+ + + + + +
+
Important
+
+
+

You must enable CBT for each source VM and each VM disk.

+
+
+

A VM can support up to 28 CBT snapshots. If the source VM has too many CBT snapshots and the Migration Controller service is not able to create a new snapshot, warm migration might fail. The Migration Controller service deletes each snapshot when the snapshot is no longer required.

+
+
+
+
+

The precopy stage runs until the cutover stage is started manually or is scheduled to start.

+
+
+
Cutover stage
+

The VMs are shut down during the cutover stage and the remaining data is migrated. Data stored in RAM is not migrated.

+
+
+

You can start the cutover stage manually by using the Forklift console or you can schedule a cutover time in the Migration manifest.

+
+
+
+
+

Advantages and disadvantages of cold and warm migrations

+
+
+

Overview

+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_cold-warm-comparison-table.adoc[]

+
+
+
+

Detailed description

+
+

The table that follows offers a more detailed description of the advantages and disadvantages of each type of migration. It assumes that you have installed Red Hat Enterprise Linux (RHEL) 9 on the OKD platform on which you installed Forklift.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Detailed description of advantages and disadvantages
Cold migrationWarm migration

Fail fast

Each VM is converted to be compatible with OKD and, if the conversion is successful, the VM is transferred. If a VM cannot be converted, the migration fails immediately.

For each VM, Forklift creates a snapshot and transfers it to OKD. When you start the cutover, Forklift creates the last snapshot, transfers it, and then converts the VM.

Tools

Forklift only.

Forklift and CDI from KubeVirt.

Parallelism

Disks must be transferred sequentially.

Disks can be transferred in parallel using different pods.

+
+ + + + + +
+
Note
+
+
+

The preceding table describes the situation for VMs that are running because the main benefit of warm migration is the reduced downtime, and there is no reason to initiate warm migration for VMs that are down. However, performing warm migration for VMs that are down is not the same as cold migration, even when Forklift uses virt-v2v and RHEL 9. For VMs that are down, Forklift transfers the disks using CDI, unlike in cold migration.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When importing from VMware, there are additional factors which impact the migration speed such as limits related to ESXi, vSphere. or VDDK.

+
+
+
+
+
+

Conclusions

+
+

Based on the preceding information, we can draw the following conclusions about cold migration vs. warm migration:

+
+
+
    +
  • +

    The shortest downtime of VMs can be achieved by using warm migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data on a single disk can be achieved by using cold migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data that is spread evenly across multiple disks can be achieved by using warm migration.

    +
  • +
+
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/about-hook-crs-for-migration-plans-api/index.html b/documentation/doc-Release_notes/modules/about-hook-crs-for-migration-plans-api/index.html new file mode 100644 index 00000000000..c2d56327d44 --- /dev/null +++ b/documentation/doc-Release_notes/modules/about-hook-crs-for-migration-plans-api/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

API-based hooks for Forklift migration plans

+
+

You can add hooks to a migration plan from the command line by using the Forklift API.

+
+

Default hook image

+
+

The default hook image for an Forklift hook is registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2. The image is based on the Ansible Runner image with the addition of python-openshift to provide Ansible Kubernetes resources and a recent oc binary.

+
+

Hook execution

+
+

An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a ConfigMap. The hook container is run as a job on the desired cluster, using the default ServiceAccount in the konveyor-forklift namespace.

+
+

PreHooks and PostHooks

+
+

You specify hooks per VM and you can run each as a PreHook or a PostHook. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration.

+
+
+

When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook.

+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
Example PreHook:
+
+
kind: Plan
+apiVersion: forklift.konveyor.io/v1beta1
+metadata:
+  name: test
+  namespace: konveyor-forklift
+spec:
+  vms:
+    - id: vm-2861
+      hooks:
+        - hook:
+            namespace: konveyor-forklift
+            name: playbook
+          step: PreHook
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/about-rego-files/index.html b/documentation/doc-Release_notes/modules/about-rego-files/index.html new file mode 100644 index 00000000000..d8d236537bc --- /dev/null +++ b/documentation/doc-Release_notes/modules/about-rego-files/index.html @@ -0,0 +1,104 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About Rego files

+
+

Validation rules are written in Rego, the Open Policy Agent (OPA) native query language. The rules are stored as .rego files in the /usr/share/opa/policies/io/konveyor/forklift/<provider> directory of the Validation pod.

+
+
+

Each validation rule is defined in a separate .rego file and tests for a specific condition. If the condition evaluates as true, the rule adds a {“category”, “label”, “assessment”} hash to the concerns. The concerns content is added to the concerns key in the inventory record of the VM. The web console displays the content of the concerns key for each VM in the provider inventory.

+
+
+

The following .rego file example checks for distributed resource scheduling enabled in the cluster of a VMware VM:

+
+
+
drs_enabled.rego example
+
+
package io.konveyor.forklift.vmware (1)
+
+has_drs_enabled {
+    input.host.cluster.drsEnabled (2)
+}
+
+concerns[flag] {
+    has_drs_enabled
+    flag := {
+        "category": "Information",
+        "label": "VM running in a DRS-enabled cluster",
+        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
+    }
+}
+
+
+
+
    +
  1. +

    Each validation rule is defined within a package. The package namespaces are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

    +
  2. +
  3. +

    Query parameters are based on the input key of the Validation service JSON.

    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/accessing-default-validation-rules/index.html b/documentation/doc-Release_notes/modules/accessing-default-validation-rules/index.html new file mode 100644 index 00000000000..975c3931256 --- /dev/null +++ b/documentation/doc-Release_notes/modules/accessing-default-validation-rules/index.html @@ -0,0 +1,108 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Checking the default validation rules

+
+

Before you create a custom rule, you must check the default rules of the Validation service to ensure that you do not create a rule that redefines an existing default value.

+
+
+

Example: If a default rule contains the line default valid_input = false and you create a custom rule that contains the line default valid_input = true, the Validation service will not start.

+
+
+
Procedure
+
    +
  1. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  2. +
  3. +

    Go to the OPA policies directory for your provider:

    +
    +
    +
    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> (1)
    +
    +
    +
    +
      +
    1. +

      Specify vmware or ovirt.

      +
    2. +
    +
    +
  4. +
  5. +

    Search for the default policies:

    +
    +
    +
    $ grep -R "default" *
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/accessing-logs-cli/index.html b/documentation/doc-Release_notes/modules/accessing-logs-cli/index.html new file mode 100644 index 00000000000..96350457664 --- /dev/null +++ b/documentation/doc-Release_notes/modules/accessing-logs-cli/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Accessing logs and custom resource information from the command line interface

+
+

You can access logs and information about custom resources (CRs) from the command line interface by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, a completed, failed, or canceled migration plan, or a migrated virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_name> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        You must specify the VM name, not the VM ID, as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/accessing-logs-ui/index.html b/documentation/doc-Release_notes/modules/accessing-logs-ui/index.html new file mode 100644 index 00000000000..213192773d2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/accessing-logs-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Downloading logs and custom resource information from the web console

+
+

You can download logs and information about custom resources (CRs) for a completed, failed, or canceled migration plan or for migrated virtual machines (VMs) by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Get logs beside a migration plan name.

    +
  4. +
  5. +

    In the Get logs window, click Get logs.

    +
    +

    The logs are collected. A Log collection complete message is displayed.

    +
    +
  6. +
  7. +

    Click Download logs to download the archive file.

    +
  8. +
  9. +

    To download logs for a migrated VM, click a migration plan name and then click Get logs beside the VM.

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/adding-hook-crs-to-migration-plans-api/index.html b/documentation/doc-Release_notes/modules/adding-hook-crs-to-migration-plans-api/index.html new file mode 100644 index 00000000000..359426ae22b --- /dev/null +++ b/documentation/doc-Release_notes/modules/adding-hook-crs-to-migration-plans-api/index.html @@ -0,0 +1,302 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding Hook CRs to a VM migration by using the Forklift API

+
+

You can add a PreHook or a PostHook Hook CR when you migrate a virtual machine from the command line by using the Forklift API. A PreHook runs before a migration, a PostHook, after.

+
+
+ + + + + +
+
Note
+
+
+

You can retrieve additional information stored in a secret or in a configMap by using a k8s module.

+
+
+
+
+

For example, you can create a hook CR to install cloud-init on a VM and write a file before migration.

+
+
+
Procedure
+
    +
  1. +

    If needed, create a secret with an SSH private key for the VM. You can either use an existing key or generate a key pair, install the public key on the VM, and base64 encode the private key in the secret.

    +
    +
    +
    apiVersion: v1
    +data:
    +  key: VGhpcyB3YXMgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbiBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZS4KSXQgaXMgbm90IHVzZWQgYW55d2hlcmUuCi0tLS0tQkVHSU4gT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCmIzQmxibk56YUMxclpYa3RkakVBQUFBQUJHNXZibVVBQUFBRWJtOXVaUUFBQUFBQUFBQUJBQUFCbHdBQUFBZHpjMmd0Y24KTmhBQUFBQXdFQUFRQUFBWUVBMzVTTFRReDBFVjdPTWJQR0FqcEsxK2JhQURTTVFuK1NBU2pyTGZLNWM5NGpHdzhDbnA4LwovRHErZHFBR1pxQkg2ZnAxYmVJM1BZZzVWVDk0RVdWQ2RrTjgwY3dEcEo0Z1R0NHFUQ1gzZUYvY2x5VXQyUC9zaTNjcnQ0CjBQdi9wVnZXU1U2TlhHaDJIZC93V0MwcGh5Z0RQOVc5SHRQSUF0OFpnZmV2ZnUwZHpraVl6OHNVaElWU2ZsRGpaNUFqcUcKUjV2TVVUaGlrczEvZVlCeTdiMkFFSEdzYU8xN3NFbWNiYUlHUHZuUFVwWmQrdjkyYU1JdWZoYjhLZkFSbzZ3Ty9ISW1VbQovdDdHWFBJUmxBMUhSV0p1U05odTQzZS9DY3ZYd3Z6RnZrdE9kYXlEQzBMTklHMkpVaURlNWd0UUQ1WHZXc1p3MHQvbEs1CklacjFrZXZRNUJsYWNISmViV1ZNYUQvdllpdFdhSFo4OEF1Y0czaGh2bjkrOGNSTGhNVExiVlFSMWh2UVpBL1JtQXN3eE0KT3VJSmRaUmtxTThLZlF4Z28zQThRNGJhQW1VbnpvM3Zwa0FWdC9uaGtIOTRaRE5rV2U2RlRhdThONStyYTJCZkdjZVA4VApvbjFEeTBLRlpaUlpCREVVRVc0eHdTYUVOYXQ3c2RDNnhpL1d5OURaQUFBRm1NRFBXeDdBejFzZUFBQUFCM056YUMxeWMyCkVBQUFHQkFOK1VpMDBNZEJGZXpqR3p4Z0k2U3RmbTJnQTBqRUova2dFbzZ5M3l1WFBlSXhzUEFwNmZQL3c2dm5hZ0JtYWcKUituNmRXM2lOejJJT1ZVL2VCRmxRblpEZk5ITUE2U2VJRTdlS2t3bDkzaGYzSmNsTGRqLzdJdDNLN2VORDcvNlZiMWtsTwpqVnhvZGgzZjhGZ3RLWWNvQXovVnZSN1R5QUxmR1lIM3IzN3RIYzVJbU0vTEZJU0ZVbjVRNDJlUUk2aGtlYnpGRTRZcExOCmYzbUFjdTI5Z0JCeHJHanRlN0JKbkcyaUJqNzV6MUtXWGZyL2RtakNMbjRXL0Nud0VhT3NEdnh5SmxKdjdleGx6eUVaUU4KUjBWaWJrallidU4zdnduTDE4TDh4YjVMVG5Xc2d3dEN6U0J0aVZJZzN1WUxVQStWNzFyR2NOTGY1U3VTR2E5WkhyME9RWgpXbkJ5WG0xbFRHZy83MklyVm1oMmZQQUxuQnQ0WWI1L2Z2SEVTNFRFeTIxVUVkWWIwR1FQMFpnTE1NVERyaUNYV1VaS2pQCkNuME1ZS053UEVPRzJnSmxKODZONzZaQUZiZjU0WkIvZUdRelpGbnVoVTJydkRlZnEydGdYeG5Iai9FNko5UTh0Q2hXV1UKV1FReEZCRnVNY0VtaERXcmU3SFF1c1l2MXN2UTJRQUFBQU1CQUFFQUFBR0JBSlZtZklNNjdDQmpXcU9KdnFua2EvakRrUwo4TDdpSE5mekg1TnRZWVdPWmRMTlk2L0lRa1pDeFcwTWtSKzlUK0M3QUZKZzBNV2Q5ck5PeUxJZDkxNjZoOVJsNG0xdFJjCnViZ1o2dWZCZ3hGVDlXS21mSEdCNm4zelh5b2pQOEFJTnR6ODVpaUVHVXFFRWtVRVdMd0RGSmdvcFllQ3l1VmZ2ZE92MUgKRm1WWmEwNVo0b3NQNkNENXVmc2djQ1RYQTR6VnZ5ZHVCYkxqdHN5RjdYZjNUdjZUQ1QxU0swZHErQk1OOXRvb0RZaXpwagpzbDh6NzlybXp3eUFyWFlVcnFUUkpsNmpwRkNrWHJLcy9LeG96MHhhbXlMY2RORk9hWE51LzlnTkpjRERsV2hPcFRqNHk4CkpkNXBuV1Jueis1RHJLRFdhY0loUW1CMUxVd2ZLWmQwbVFxaUpzMUMxcXZVUmlKOGExaThKUTI4bHFuWTFRRk9wbk13emcKWEpla2FndThpT1ExRFJlQkhaM0NkcVJUYnY3bVJZSGxramx0dXJmZGc4M3hvM0ErZ1JSR001eUVOcW5xSkplQjhJQVB5UwptMFp0dGdqbHNqNTJ2K1B1NmExMHoxZndKK1VML2N6dTRKeEpOYlp6WTFIMnpLODJBaVI1T3JYNmx2aUEvSWFSRVcwUUFBCkFNQndVeUJpcUc5bEZCUnltL2UvU1VORVMzdHpicUZNdTdIcy84WTV5SnAxKzR6OXUxNGtJR2ttV0Y5eE5HT3hrY3V0cWwKeHVUcndMbjFUaFNQTHQrTjUwTGhVdzR4ZjBhNUxqemdPbklPU0FRbm5HY1Nxa0dTRDlMR21obGE2WmpydFBHY29lQ3JHdAo5M1Vvcmx5YkxNRzFFRFAxWmpKS1RaZzl6OUMwdDlTTGd3ei9DbFhydW9UNXNQVUdKWnUrbHlIZXpSTDRtcHl6OEZMcnlOCkdNci9leVM5bWdISjNVVkZEYjNIZ3BaK1E1SUdBRU5rZVZEcHIwMGhCZXZndGd6YWtBQUFEQkFQVXQ1RitoMnBVby94V1YKenRkcVQvMzA4dFB5MXVMMU1lWFoydEJPQmRwSDJyd0JzdWt0aTIySGtWZUZXQjJFdUlFUXppMzY3MGc1UGdxR1p4Vng4dQpobEE0Rkg4ZXN1NTNQckZqVW9EeFJhb3d3WXBFcFh5Y2pnNUE1MStwR1VQcWljWjB0YjliaWlhc3BWWXZhWW5sdGlnVG5iClN0UExMY29nemNiL0dGcVYyaXlzc3lwTlMwKzBNRTUxcEtxWGNaS2swbi8vVHpZWWs4TW8vZzRsQ3pmUEZQUlZrVVM5blIKWU1pQzRlcEk0TERmbVdnM0xLQ2N1Zk85all3aWgwYlFBQUFNRUE2WEtldDhEMHNvc0puZVh5WFZGd0dyVyszNlhBVGRQTwpMWDdjaStjYzFoOGV1eHdYQWx3aTJJNFhxSmJBVjBsVEhuVGEycXN3Uy9RQlpJUUJWSkZlVjVyS1daZTc4R2F3d1pWTFZNCldETmNwdFFyRTFaM2pGNS9TdUVzdlVxSDE0Tkc5RUFXWG1iUkNzelE0Vlk3NzQrSi9sTFkvMnlDT1diNzlLYTJ5OGxvYUoKVXczWWVtSld3blp2R3hKNldsL3BmQ2xYN3lEVXlXUktLdGl0cWNjbmpCWVkyRE1tZURwdURDYy9ZdDZDc3dLRmRkMkJ1UwpGZGt5cDlZY3VMaDlLZEFBQUFIR3BoYzI5dVFFRlVMVGd3TWxVdWJXOXVkR3hsYjI0dWFXNTBjbUVCQWdNRUJRWT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCgo=
    +kind: Secret
    +metadata:
    +  name: ssh-credentials
    +  namespace: konveyor-forklift
    +type: Opaque
    +
    +
    +
  2. +
  3. +

    Encode your playbook by conncatenating a file and piping it for base64, for example:

    +
    +
    +
    $ cat playbook.yml | base64 -w0
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can also use a here document to encode a playbook:

    +
    +
    +
    +
    $ cat << EOF | base64 -w0
    +- hosts: localhost
    +  tasks:
    +  - debug:
    +      msg: test
    +EOF
    +
    +
    +
    +
    +
  4. +
  5. +

    Create a Hook CR:

    +
    +
    +
    apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: playbook
    +  namespace: konveyor-forklift
    +spec:
    +  image: registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2
    +  playbook: LSBuYW1lOiBNYWluCiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogIC0gbmFtZTogTG9hZCBQbGFuCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHBsYW4ueW1sCiAgICAgIG5hbWU6IHBsYW4KCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHdvcmtsb2FkLnltbAogICAgICBuYW1lOiB3b3JrbG9hZAoKICAtIG5hbWU6IAogICAgZ2V0ZW50OgogICAgICBkYXRhYmFzZTogcGFzc3dkCiAgICAgIGtleTogInt7IGFuc2libGVfdXNlcl9pZCB9fSIKICAgICAgc3BsaXQ6ICc6JwoKICAtIG5hbWU6IEVuc3VyZSBTU0ggZGlyZWN0b3J5IGV4aXN0cwogICAgZmlsZToKICAgICAgcGF0aDogfi8uc3NoCiAgICAgIHN0YXRlOiBkaXJlY3RvcnkKICAgICAgbW9kZTogMDc1MAogICAgZW52aXJvbm1lbnQ6CiAgICAgIEhPTUU6ICJ7eyBhbnNpYmxlX2ZhY3RzLmdldGVudF9wYXNzd2RbYW5zaWJsZV91c2VyX2lkXVs0XSB9fSIKCiAgLSBrOHNfaW5mbzoKICAgICAgYXBpX3ZlcnNpb246IHYxCiAgICAgIGtpbmQ6IFNlY3JldAogICAgICBuYW1lOiBzc2gtY3JlZGVudGlhbHMKICAgICAgbmFtZXNwYWNlOiBrb252ZXlvci1mb3JrbGlmdAogICAgcmVnaXN0ZXI6IHNzaF9jcmVkZW50aWFscwoKICAtIG5hbWU6IENyZWF0ZSBTU0gga2V5CiAgICBjb3B5OgogICAgICBkZXN0OiB+Ly5zc2gvaWRfcnNhCiAgICAgIGNvbnRlbnQ6ICJ7eyBzc2hfY3JlZGVudGlhbHMucmVzb3VyY2VzWzBdLmRhdGEua2V5IHwgYjY0ZGVjb2RlIH19IgogICAgICBtb2RlOiAwNjAwCgogIC0gYWRkX2hvc3Q6CiAgICAgIG5hbWU6ICJ7eyB3b3JrbG9hZC52bS5pcGFkZHJlc3MgfX0iCiAgICAgIGFuc2libGVfdXNlcjogcm9vdAogICAgICBncm91cHM6IHZtcwoKLSBob3N0czogdm1zCiAgdGFza3M6CiAgLSBuYW1lOiBJbnN0YWxsIGNsb3VkLWluaXQKICAgIGRuZjoKICAgICAgbmFtZToKICAgICAgLSBjbG91ZC1pbml0CiAgICAgIHN0YXRlOiBsYXRlc3QKCiAgLSBuYW1lOiBDcmVhdGUgVGVzdCBGaWxlCiAgICBjb3B5OgogICAgICBkZXN0OiAvdGVzdC50eHQKICAgICAgY29udGVudDogIkhlbGxvIFdvcmxkIgogICAgICBtb2RlOiAwNjQ0Cg==
    +  serviceAccount: forklift-controller (1)
    +
    +
    +
    +
      +
    1. +

      Specify a serviceAccount to run the hook with in order to control access to resources on the cluster.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      To decode an attached playbook retrieve the resource with custom output and pipe it to base64. For example:

      +
      +
      +
      +
       oc get -n konveyor-forklift hook playbook -o \
      +   go-template='{{ .spec.playbook }}' | base64 -d
      +
      +
      +
      +
      +
      +

      The playbook encoded here runs the following:

      +
      +
      +
      +
      - name: Main
      +  hosts: localhost
      +  tasks:
      +  - name: Load Plan
      +    include_vars:
      +      file: plan.yml
      +      name: plan
      +
      +  - name: Load Workload
      +    include_vars:
      +      file: workload.yml
      +      name: workload
      +
      +  - name:
      +    getent:
      +      database: passwd
      +      key: "{{ ansible_user_id }}"
      +      split: ':'
      +
      +  - name: Ensure SSH directory exists
      +    file:
      +      path: ~/.ssh
      +      state: directory
      +      mode: 0750
      +    environment:
      +      HOME: "{{ ansible_facts.getent_passwd[ansible_user_id][4] }}"
      +
      +  - k8s_info:
      +      api_version: v1
      +      kind: Secret
      +      name: ssh-credentials
      +      namespace: konveyor-forklift
      +    register: ssh_credentials
      +
      +  - name: Create SSH key
      +    copy:
      +      dest: ~/.ssh/id_rsa
      +      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      +      mode: 0600
      +
      +  - add_host:
      +      name: "{{ workload.vm.ipaddress }}"
      +      ansible_user: root
      +      groups: vms
      +
      +- hosts: vms
      +  tasks:
      +  - name: Install cloud-init
      +    dnf:
      +      name:
      +      - cloud-init
      +      state: latest
      +
      +  - name: Create Test File
      +    copy:
      +      dest: /test.txt
      +      content: "Hello World"
      +      mode: 0644
      +
      +
      +
    2. +
    +
    +
  6. +
  7. +

    Create a Plan CR using the hook:

    +
    +
    +
    kind: Plan
    +apiVersion: forklift.konveyor.io/v1beta1
    +metadata:
    +  name: test
    +  namespace: konveyor-forklift
    +spec:
    +  map:
    +    network:
    +      namespace: "konveyor-forklift"
    +      name: "network"
    +    storage:
    +      namespace: "konveyor-forklift"
    +      name: "storage"
    +  provider:
    +    source:
    +      namespace: "konveyor-forklift"
    +      name: "boston"
    +    destination:
    +      namespace: "konveyor-forklift"
    +      name: host
    +  targetNamespace: "konveyor-forklift"
    +  vms:
    +    - id: vm-2861
    +      hooks:
    +        - hook:
    +            namespace: konveyor-forklift
    +            name: playbook
    +          step: PreHook (1)
    +
    +
    +
    +
      +
    1. +

      Options are PreHook, to run the hook before the migration, and PostHook, to run the hook after the migration.

      +
    2. +
    +
    +
  8. +
+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/adding-source-provider/index.html b/documentation/doc-Release_notes/modules/adding-source-provider/index.html new file mode 100644 index 00000000000..76106511701 --- /dev/null +++ b/documentation/doc-Release_notes/modules/adding-source-provider/index.html @@ -0,0 +1,82 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/adding-virt-provider/index.html b/documentation/doc-Release_notes/modules/adding-virt-provider/index.html new file mode 100644 index 00000000000..c8e68008cdd --- /dev/null +++ b/documentation/doc-Release_notes/modules/adding-virt-provider/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding a KubeVirt destination provider

+
+

You can add a KubeVirt destination provider to the OKD web console in addition to the default KubeVirt destination provider, which is the provider where you installed Forklift.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select KubeVirt from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Specify the provider name to display in the list of target providers.

      +
    • +
    • +

      Kubernetes API server URL: Specify the OKD cluster API endpoint.

      +
    • +
    • +

      Service account token: Specify the cluster-admin service account token.

      +
      +

      If both URL and Service account token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/canceling-migration-cli/index.html b/documentation/doc-Release_notes/modules/canceling-migration-cli/index.html new file mode 100644 index 00000000000..e5508c9c505 --- /dev/null +++ b/documentation/doc-Release_notes/modules/canceling-migration-cli/index.html @@ -0,0 +1,132 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel an entire migration or individual virtual machines (VMs) while a migration is in progress from the command line interface (CLI).

+
+
+
Canceling an entire migration
+
    +
  • +

    Delete the Migration CR:

    +
    +
    +
    $ kubectl delete migration <migration> -n <namespace> (1)
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    +
    +
  • +
+
+
+
Canceling the migration of individual VMs
+
    +
  1. +

    Add the individual VMs to the spec.cancel block of the Migration manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration>
    +  namespace: <namespace>
    +...
    +spec:
    +  cancel:
    +  - id: vm-102 (1)
    +  - id: vm-203
    +  - name: rhel8-vm
    +EOF
    +
    +
    +
    +
      +
    1. +

      You can specify a VM by using the id key or the name key.

      +
      +

      The value of the id key is the managed object reference, for a VMware VM, or the VM UUID, for a oVirt VM.

      +
      +
    2. +
    +
    +
  2. +
  3. +

    Retrieve the Migration CR to monitor the progress of the remaining VMs:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/canceling-migration-ui/index.html b/documentation/doc-Release_notes/modules/canceling-migration-ui/index.html new file mode 100644 index 00000000000..7f415c27acb --- /dev/null +++ b/documentation/doc-Release_notes/modules/canceling-migration-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel the migration of some or all virtual machines (VMs) while a migration plan is in progress by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization.

    +
  2. +
  3. +

    Click the name of a running migration plan to view the migration details.

    +
  4. +
  5. +

    Select one or more VMs and click Cancel.

    +
  6. +
  7. +

    Click Yes, cancel to confirm the cancellation.

    +
    +

    In the Migration details by VM list, the status of the canceled VMs is Canceled. The unmigrated and the migrated virtual machines are not affected.

    +
    +
  8. +
+
+
+

You can restart a canceled migration by clicking Restart beside the migration plan on the Migration plans page.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/changing-precopy-intervals/index.html b/documentation/doc-Release_notes/modules/changing-precopy-intervals/index.html new file mode 100644 index 00000000000..20c4b305c89 --- /dev/null +++ b/documentation/doc-Release_notes/modules/changing-precopy-intervals/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Changing precopy intervals for warm migration

+
+

You can change the snapshot interval by patching the ForkliftController custom resource (CR).

+
+
+
Procedure
+
    +
  • +

    Patch the ForkliftController CR:

    +
    +
    +
    $ kubectl patch forkliftcontroller/<forklift-controller> -n konveyor-forklift -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge (1)
    +
    +
    +
    +
      +
    1. +

      Specify the precopy interval in minutes. The default value is 60.

      +
      +

      You do not need to restart the forklift-controller pod.

      +
      +
    2. +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/collected-logs-cr-info/index.html b/documentation/doc-Release_notes/modules/collected-logs-cr-info/index.html new file mode 100644 index 00000000000..8e707ef52b9 --- /dev/null +++ b/documentation/doc-Release_notes/modules/collected-logs-cr-info/index.html @@ -0,0 +1,183 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Collected logs and custom resource information

+
+

You can download logs and custom resource (CR) yaml files for the following targets by using the OKD web console or the command line interface (CLI):

+
+
+
    +
  • +

    Migration plan: Web console or CLI.

    +
  • +
  • +

    Virtual machine: Web console or CLI.

    +
  • +
  • +

    Namespace: CLI only.

    +
  • +
+
+
+

The must-gather tool collects the following logs and CR files in an archive file:

+
+
+
    +
  • +

    CRs:

    +
    +
      +
    • +

      DataVolume CR: Represents a disk mounted on a migrated VM.

      +
    • +
    • +

      VirtualMachine CR: Represents a migrated VM.

      +
    • +
    • +

      Plan CR: Defines the VMs and storage and network mapping.

      +
    • +
    • +

      Job CR: Optional: Represents a pre-migration hook, a post-migration hook, or both.

      +
    • +
    +
    +
  • +
  • +

    Logs:

    +
    +
      +
    • +

      importer pod: Disk-to-data-volume conversion log. The importer pod naming convention is importer-<migration_plan>-<vm_id><5_char_id>, for example, importer-mig-plan-ed90dfc6-9a17-4a8btnfh, where ed90dfc6-9a17-4a8 is a truncated oVirt VM ID and btnfh is the generated 5-character ID.

      +
    • +
    • +

      conversion pod: VM conversion log. The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the VM. The conversion pod naming convention is <migration_plan>-<vm_id><5_char_id>.

      +
    • +
    • +

      virt-launcher pod: VM launcher log. When a migrated VM is powered on, the virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

      +
    • +
    • +

      forklift-controller pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      forklift-must-gather-api pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      hook-job pod: The log is filtered for hook jobs. The hook-job naming convention is <migration_plan>-<vm_id><5_char_id>, for example, plan2j-vm-3696-posthook-4mx85 or plan2j-vm-3696-prehook-mwqnl.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Empty or excluded log files are not included in the must-gather archive file.

      +
      +
      +
      +
    • +
    +
    +
  • +
+
+
+
Example must-gather archive structure for a VMware migration plan
+
+
must-gather
+└── namespaces
+    ├── target-vm-ns
+    │   ├── crs
+    │   │   ├── datavolume
+    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
+    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
+    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
+    │   │   └── virtualmachine
+    │   │       ├── test-test-rhel8-2disks2nics.yaml
+    │   │       └── test-x2019.yaml
+    │   └── logs
+    │       ├── importer-mig-plan-vm-7595-tkhdz
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-7595-5qvqp
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-8325-xccfw
+    │       │   └── current.log
+    │       ├── mig-plan-vm-7595-4glzd
+    │       │   └── current.log
+    │       └── mig-plan-vm-8325-4zw49
+    │           └── current.log
+    └── openshift-mtv
+        ├── crs
+        │   └── plan
+        │       └── mig-plan-cold.yaml
+        └── logs
+            ├── forklift-controller-67656d574-w74md
+            │   └── current.log
+            └── forklift-must-gather-api-89fc7f4b6-hlwb6
+                └── current.log
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/common-attributes/index.html b/documentation/doc-Release_notes/modules/common-attributes/index.html new file mode 100644 index 00000000000..1887404da45 --- /dev/null +++ b/documentation/doc-Release_notes/modules/common-attributes/index.html @@ -0,0 +1,66 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + diff --git a/documentation/doc-Release_notes/modules/compatibility-guidelines/index.html b/documentation/doc-Release_notes/modules/compatibility-guidelines/index.html new file mode 100644 index 00000000000..49ac5c53ec7 --- /dev/null +++ b/documentation/doc-Release_notes/modules/compatibility-guidelines/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Software compatibility guidelines

+
+
+
+

You must install compatible software versions.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.3.0

4.10 or later

4.10 or later

6.5 or later

4.4 SP1 or later

16.1 or later

+
+ + + + + +
+
Note
+
+
Migration from oVirt 4.3
+
+

Forklift was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3. While not supported, basic migrations from oVirt 4.3 are expected to work.

+
+
+

Generally it is advised to upgrade oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+

Therefore, it is recommended to upgrade oVirt to the supported version above before the migration to KubeVirt.

+
+
+

However, migrations from oVirt 4.3.11 were tested with Forklift 2.3, and may work in practice in many environments using Forklift 2.3. In this case, we advise upgrading oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+
+
+
+
+

OpenShift Operator Life Cycles

+
+
+

For more information about the software maintenance Life Cycle classifications for Operators shipped by Red Hat for use with OpenShift Container Platform, see OpenShift Operator Life Cycles.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/configuring-mtv-operator/index.html b/documentation/doc-Release_notes/modules/configuring-mtv-operator/index.html new file mode 100644 index 00000000000..51fd24c7245 --- /dev/null +++ b/documentation/doc-Release_notes/modules/configuring-mtv-operator/index.html @@ -0,0 +1,202 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring the Forklift Operator

+
+

You can configure all of the following settings of the Forklift Operator by modifying the ForkliftController CR, or in the Settings section of the Overview page, unless otherwise indicated.

+
+
+
    +
  • +

    Maximum number of virtual machines (VMs) per plan that can be migrated simultaneously.

    +
  • +
  • +

    How long must gather reports are retained before being automatically deleted.

    +
  • +
  • +

    CPU limit allocated to the main controller container.

    +
  • +
  • +

    Memory limit allocated to the main controller container.

    +
  • +
  • +

    Interval at which a new snapshot is requested before initiating a warm migration.

    +
  • +
  • +

    Frequency with which the system checks the status of snapshot creation or removal during a warm migration.

    +
  • +
  • +

    Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem (ForkliftController CR only).

    +
  • +
  • +

    Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for vSphere source providers (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for oVirt (oVirt) source providers (ForkliftController CR only).

    +
  • +
+
+
+

The procedure for configuring these settings using the user interface is presented in Configuring MTV settings. The procedure for configuring these settings by modifying the ForkliftController CR is presented following.

+
+
+
Procedure
+
    +
  • +

    Change a parameter’s value in the spec portion of the ForkliftController CR by adding the label and value as follows:

    +
  • +
+
+
+
+
spec:
+  label: value (1)
+
+
+
+
    +
  1. +

    Labels you can configure using the CLI are shown in the table that follows, along with a description of each label and its default value.

    +
  2. +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift Operator labels
LabelDescriptionDefault value

controller_max_vm_inflight

The maximum number of VMs per plan that can be migrated simultaneously.

20

must_gather_api_cleanup_max_age

The duration in hours for retaining must gather reports before they are automatically deleted.

-1 (disabled)

controller_container_limits_cpu

The CPU limit allocated to the main controller container.

500m

controller_container_limits_memory

The memory limit allocated to the main controller container.

800Mi

controller_precopy_interval

The interval in minutes at which a new snapshot is requested before initiating a warm migration.

60

controller_snapshot_status_check_rate_seconds

The frequency in seconds with which the system checks the status of snapshot creation or removal during a warm migration.

10

controller_filesystem_overhead

Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem.

+

ForkliftController CR only.

10

controller_block_overhead

Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based. It can be used when data, such as encryption headers, is written to the persistent volumes in addition to the content of the virtual disk.

+

ForkliftController CR only.

0

vsphere_osmap_configmap_name

Configuration map for vSphere source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-vsphere-osmap. In order to override or delete values, specify a configuration map that is different from forklift-vsphere-osmap.

+

ForkliftController CR only.

forklift-vsphere-osmap

ovirt_osmap_configmap_name

Configuration map for oVirt source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-ovirt-osmap. In order to override or delete values, specify a configuration map that is different from forklift-ovirt-osmap.

+

ForkliftController CR only.

forklift-ovirt-osmap

+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-migration-plan-2-6-3/index.html b/documentation/doc-Release_notes/modules/creating-migration-plan-2-6-3/index.html new file mode 100644 index 00000000000..1d2e3d350a2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-migration-plan-2-6-3/index.html @@ -0,0 +1,139 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map. +. Enter the Plan name. +. Make any needed changes to the editable items. +. Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings. +. Click Create migration plan.

+
+
+

+ +Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

+
+
+
    +
  1. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  2. +
  3. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  4. +
  5. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      +

      Unresolved directive in creating-migration-plan-2-6-3.adoc - include::snip_vmware-name-change.adoc[]

      +
      +
    4. +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-migration-plan/index.html b/documentation/doc-Release_notes/modules/creating-migration-plan/index.html new file mode 100644 index 00000000000..dd8d25a3483 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-migration-plan/index.html @@ -0,0 +1,270 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a migration plan

+
+

You can create a migration plan by using the OKD web console.

+
+
+

A migration plan allows you to group virtual machines to be migrated together or with the same migration parameters, for example, a percentage of the members of a cluster or a complete application.

+
+
+

You can configure a hook to run an Ansible playbook or custom container image during a specified stage of the migration plan.

+
+
+
Prerequisites
+
    +
  • +

    If Forklift is not installed on the target cluster, you must add a target provider on the Providers page of the web console.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Create plan.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Plan name: Enter a migration plan name to display in the migration plan list.

      +
    • +
    • +

      Plan description: Optional: Brief description of the migration plan.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    • +

      Target namespace: Do one of the following:

      +
      +
        +
      • +

        Select a target namespace from the list

        +
      • +
      • +

        Create a target namespace by typing its name in the text box, and then clicking create "<the_name_you_entered>"

        +
      • +
      +
      +
    • +
    • +

      You can change the migration transfer network for this plan by clicking Select a different network, selecting a network from the list, and then clicking Select.

      +
      +

      If you defined a migration transfer network for the KubeVirt provider and if the network is in the target namespace, the network that you defined is the default network for all migration plans. Otherwise, the pod network is used.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Click Next.

    +
  8. +
  9. +

    Select options to filter the list of source VMs and click Next.

    +
  10. +
  11. +

    Select the VMs to migrate and then click Next.

    +
  12. +
  13. +

    Select an existing network mapping or create a new network mapping.

    +
  14. +
  15. +

    . Optional: Click Add to add an additional network mapping.

    +
    +

    To create a new network mapping:

    +
    +
    +
      +
    • +

      Select a target network for each source network.

      +
    • +
    • +

      Optional: Select Save current mapping as a template and enter a name for the network mapping.

      +
    • +
    +
    +
  16. +
  17. +

    Click Next.

    +
  18. +
  19. +

    Select an existing storage mapping, which you can modify, or create a new storage mapping.

    +
    +

    To create a new storage mapping:

    +
    +
    +
      +
    1. +

      If your source provider is VMware, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    +
    +
  20. +
  21. +

    Optional: Select Save current mapping as a template and enter a name for the storage mapping.

    +
  22. +
  23. +

    Click Next.

    +
  24. +
  25. +

    Select a migration type and click Next.

    +
    +
      +
    • +

      Cold migration: The source VMs are stopped while the data is copied.

      +
    • +
    • +

      Warm migration: The source VMs run while the data is copied incrementally. Later, you will run the cutover, which stops the VMs and copies the remaining VM data and metadata.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Warm migration is supported only from vSphere and oVirt.

      +
      +
      +
      +
    • +
    +
    +
  26. +
  27. +

    Click Next.

    +
  28. +
  29. +

    Optional: You can create a migration hook to run an Ansible playbook before or after migration:

    +
    +
      +
    1. +

      Click Add hook.

      +
    2. +
    3. +

      Select the Step when the hook will be run: pre-migration or post-migration.

      +
    4. +
    5. +

      Select a Hook definition:

      +
      +
        +
      • +

        Ansible playbook: Browse to the Ansible playbook or paste it into the field.

        +
      • +
      • +

        Custom container image: If you do not want to use the default hook-runner image, enter the image path: <registry_path>/<image_name>:<tag>.

        +
        + + + + + +
        +
        Note
        +
        +
        +

        The registry must be accessible to your OKD cluster.

        +
        +
        +
        +
      • +
      +
      +
    6. +
    +
    +
  30. +
  31. +

    Click Next.

    +
  32. +
  33. +

    Review your migration plan and click Finish.

    +
    +

    The migration plan is saved on the Plans page.

    +
    +
    +

    You can click the {kebab} of the migration plan and select View details to verify the migration plan details.

    +
    +
  34. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-network-mapping/index.html b/documentation/doc-Release_notes/modules/creating-network-mapping/index.html new file mode 100644 index 00000000000..49965fade17 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-network-mapping/index.html @@ -0,0 +1,122 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a network mapping

+
+

You can create one or more network mappings by using the OKD web console to map source networks to KubeVirt networks.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    If you map more than one source and target network, each additional KubeVirt network requires its own network attachment definition.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationNetworkMaps for virtualization.

    +
  2. +
  3. +

    Click Create NetworkMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the network mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    Select a Source network and a Target namespace/network.

    +
  8. +
  9. +

    Optional: Click Add to create additional network mappings or to map multiple source networks to a single target network.

    +
  10. +
  11. +

    If you create an additional network mapping, select the network attachment definition as the target network.

    +
  12. +
  13. +

    Click Create.

    +
    +

    The network mapping is displayed on the NetworkMaps screen.

    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-storage-mapping/index.html b/documentation/doc-Release_notes/modules/creating-storage-mapping/index.html new file mode 100644 index 00000000000..71a83673557 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-storage-mapping/index.html @@ -0,0 +1,138 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a storage mapping

+
+

You can create a storage mapping by using the OKD web console to map source disk storages to KubeVirt storage classes.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    Local and shared persistent storage that support VM migration.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationStorageMaps for virtualization.

    +
  2. +
  3. +

    Click Create StorageMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the storage mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    To create a storage mapping, click Add and map storage sources to target storage classes as follows:

    +
    +
      +
    1. +

      If your source provider is VMware vSphere, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    7. +

      If your source provider is a set of one or more OVA files, select a Source and a Target storage class for the dummy storage that applies to all virtual disks within the OVA files.

      +
    8. +
    9. +

      If your storage provider is KubeVirt. select a Source storage class and a Target storage class.

      +
    10. +
    11. +

      Optional: Click Add to create additional storage mappings, including mapping multiple storage sources to a single target storage class.

      +
    12. +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The mapping is displayed on the StorageMaps page.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-validation-rule/index.html b/documentation/doc-Release_notes/modules/creating-validation-rule/index.html new file mode 100644 index 00000000000..ab6079299c8 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-validation-rule/index.html @@ -0,0 +1,238 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a validation rule

+
+

You create a validation rule by applying a config map custom resource (CR) containing the rule to the Validation service.

+
+
+ + + + + +
+
Important
+
+
+
    +
  • +

    If you create a rule with the same name as an existing rule, the Validation service performs an OR operation with the rules.

    +
  • +
  • +

    If you create a rule that contradicts a default rule, the Validation service will not start.

    +
  • +
+
+
+
+
+
Validation rule example
+

Validation rules are based on virtual machine (VM) attributes collected by the Provider Inventory service.

+
+
+

For example, the VMware API uses this path to check whether a VMware VM has NUMA node affinity configured: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"].

+
+
+

The Provider Inventory service simplifies this configuration and returns a testable attribute with a list value:

+
+
+
+
"numaNodeAffinity": [
+    "0",
+    "1"
+],
+
+
+
+

You create a Rego query, based on this attribute, and add it to the forklift-validation-config config map:

+
+
+
+
`count(input.numaNodeAffinity) != 0`
+
+
+
+
Procedure
+
    +
  1. +

    Create a config map CR according to the following example:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: <forklift-validation-config>
    +  namespace: konveyor-forklift
    +data:
    +  vmware_multiple_disks.rego: |-
    +    package <provider_package> (1)
    +
    +    has_multiple_disks { (2)
    +      count(input.disks) > 1
    +    }
    +
    +    concerns[flag] {
    +      has_multiple_disks (3)
    +        flag := {
    +          "category": "<Information>", (4)
    +          "label": "Multiple disks detected",
    +          "assessment": "Multiple disks detected on this VM."
    +        }
    +    }
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the provider package name. Allowed values are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

      +
    2. +
    3. +

      Specify the concerns name and Rego query.

      +
    4. +
    5. +

      Specify the concerns name and flag parameter values.

      +
    6. +
    7. +

      Allowed values are Critical, Warning, and Information.

      +
    8. +
    +
    +
  2. +
  3. +

    Stop the Validation pod by scaling the forklift-controller deployment to 0:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=0 deployment/forklift-controller
    +
    +
    +
  4. +
  5. +

    Start the Validation pod by scaling the forklift-controller deployment to 1:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=1 deployment/forklift-controller
    +
    +
    +
  6. +
  7. +

    Check the Validation pod log to verify that the pod started:

    +
    +
    +
    $ kubectl logs -f <validation_pod>
    +
    +
    +
    +

    If the custom rule conflicts with a default rule, the Validation pod will not start.

    +
    +
  8. +
  9. +

    Remove the source provider:

    +
    +
    +
    $ kubectl delete provider <provider> -n konveyor-forklift
    +
    +
    +
  10. +
  11. +

    Add the source provider to apply the new rule:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <provider>
    +  namespace: konveyor-forklift
    +spec:
    +  type: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  secret:
    +    name: <secret> (3)
    +    namespace: konveyor-forklift
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ovirt, vsphere, and openstack.

      +
    2. +
    3. +

      Specify the API end point URL, for example, https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for oVirt, or https://<identity_service>/v3 for {osp}.

      +
    4. +
    5. +

      Specify the name of the provider Secret CR.

      +
    6. +
    +
    +
  12. +
+
+
+

You must update the rules version after creating a custom rule so that the Inventory service detects the changes and validates the VMs.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/creating-vddk-image/index.html b/documentation/doc-Release_notes/modules/creating-vddk-image/index.html new file mode 100644 index 00000000000..1c2c2df32b5 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-vddk-image/index.html @@ -0,0 +1,201 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift can use the VMware Virtual Disk Development Kit (VDDK) SDK to accelerate transferring virtual disks from VMware vSphere.

+
+
+ + + + + +
+
Note
+
+
+

Creating a VDDK image, although optional, is highly recommended.

+
+
+
+
+

To make use of this feature, you download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry.

+
+
+

The VDDK package contains symbolic links, therefore, the procedure of creating a VDDK image must be performed on a file system that preserves symbolic links (symlinks).

+
+
+ + + + + +
+
Note
+
+
+

Storing the VDDK image in a public registry might violate the VMware license terms.

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    You are working on a file system that preserves symbolic links (symlinks).

    +
  • +
  • +

    If you are using an external registry, KubeVirt must be able to access it.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create and navigate to a temporary directory:

    +
    +
    +
    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
    +
    +
    +
  2. +
  3. +

    In a browser, navigate to the VMware VDDK version 8 download page.

    +
  4. +
  5. +

    Select version 8.0.1 and click Download.

    +
  6. +
+
+
+ + + + + +
+
Note
+
+
+

In order to migrate to KubeVirt 4.12, download VDDK version 7.0.3.2 from the VMware VDDK version 7 download page.

+
+
+
+
+
    +
  1. +

    Save the VDDK archive file in the temporary directory.

    +
  2. +
  3. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  4. +
  5. +

    Create a Dockerfile:

    +
    +
    +
    $ cat > Dockerfile <<EOF
    +FROM registry.access.redhat.com/ubi8/ubi-minimal
    +USER 1001
    +COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    +RUN mkdir -p /opt
    +ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    +EOF
    +
    +
    +
  6. +
  7. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  8. +
  9. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  10. +
  11. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/error-messages/index.html b/documentation/doc-Release_notes/modules/error-messages/index.html new file mode 100644 index 00000000000..04dc21ee5d8 --- /dev/null +++ b/documentation/doc-Release_notes/modules/error-messages/index.html @@ -0,0 +1,83 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Error messages

+
+

This section describes error messages and how to resolve them.

+
+
+
warm import retry limit reached
+

The warm import retry limit reached error message is displayed during a warm migration if a VMware virtual machine (VM) has reached the maximum number (28) of changed block tracking (CBT) snapshots during the precopy stage.

+
+
+

To resolve this problem, delete some of the CBT snapshots from the VM and restart the migration plan.

+
+
+
Unable to resize disk image to required size
+

The Unable to resize disk image to required size error message is displayed when migration fails because a virtual machine on the target provider uses persistent volumes with an EXT4 file system on block storage. The problem occurs because the default overhead that is assumed by CDI does not completely include the reserved place for the root partition.

+
+
+

To resolve this problem, increase the file system overhead in CDI to more than 10%.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..999c62adec4 --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_OpenShift_0121 diff --git a/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg b/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..473e21ba4e2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_OpenShift_0121 diff --git a/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..33a031a0909 --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_0121 diff --git a/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg b/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..e73192c0102 --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_0121 diff --git a/documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.png b/documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..06e9d1b249453946a449c8ba5d88c1014e7e3940 GIT binary patch literal 7554 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 literal 0 HcmV?d00001 diff --git a/documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.svg b/documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.svg new file mode 100644 index 00000000000..8a846e6361a --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/forklift-logo-darkbg.svg @@ -0,0 +1,164 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.png b/documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8dba83d97f88dbd1722f30a77c915edd4640fe2c GIT binary patch literal 7667 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 V*?3s0ee+>Uq@!i1Spl(){C|U8&Q|~c literal 0 HcmV?d00001 diff --git a/documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.svg b/documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.svg new file mode 100644 index 00000000000..a8038cdf923 --- /dev/null +++ b/documentation/doc-Release_notes/modules/images/forklift-logo-lightbg.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/doc-Release_notes/modules/images/kebab.png b/documentation/doc-Release_notes/modules/images/kebab.png new file mode 100644 index 0000000000000000000000000000000000000000..81893bd4ad103557f7180529ae228e313e8319c5 GIT binary patch literal 329 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 A + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Increasing the NFC service memory of an ESXi host

+
+

If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host. Otherwise, the migration will fail because the NFC service memory is limited to 10 parallel connections.

+
+
+
Procedure
+
    +
  1. +

    Log in to the ESXi host as root.

    +
  2. +
  3. +

    Change the value of maxMemory to 1000000000 in /etc/vmware/hostd/config.xml:

    +
    +
    +
    ...
    +      <nfcsvc>
    +         <path>libnfcsvc.so</path>
    +         <enabled>true</enabled>
    +         <maxMemory>1000000000</maxMemory>
    +         <maxStreamMemory>10485760</maxStreamMemory>
    +      </nfcsvc>
    +...
    +
    +
    +
  4. +
  5. +

    Restart hostd:

    +
    +
    +
    # /etc/init.d/hostd restart
    +
    +
    +
    +

    You do not need to reboot the host.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/installing-mtv-operator/index.html b/documentation/doc-Release_notes/modules/installing-mtv-operator/index.html new file mode 100644 index 00000000000..c1a682d9f34 --- /dev/null +++ b/documentation/doc-Release_notes/modules/installing-mtv-operator/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/issue_templates/issue.md b/documentation/doc-Release_notes/modules/issue_templates/issue.md new file mode 100644 index 00000000000..30d52ab9cba --- /dev/null +++ b/documentation/doc-Release_notes/modules/issue_templates/issue.md @@ -0,0 +1,15 @@ +## Summary + +(Describe the problem. Don't worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.) + +## What is the problem? + +(Paste the text or a screenshot here. Remember to include the **task number** so that we know which module is affected.) + +## What is the solution? + +(Correct text, link, or task.) + +## Notes + +(Do we need to fix something else?) diff --git a/documentation/doc-Release_notes/modules/issue_templates/issue/index.html b/documentation/doc-Release_notes/modules/issue_templates/issue/index.html new file mode 100644 index 00000000000..472b85e102b --- /dev/null +++ b/documentation/doc-Release_notes/modules/issue_templates/issue/index.html @@ -0,0 +1,79 @@ + + + + + + + + Summary | Forklift Documentation + + + + + + + + + + + + + +Summary | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + +
+

Summary

+ +

(Describe the problem. Don’t worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.)

+ +

What is the problem?

+ +

(Paste the text or a screenshot here. Remember to include the task number so that we know which module is affected.)

+ +

What is the solution?

+ +

(Correct text, link, or task.)

+ +

Notes

+ +

(Do we need to fix something else?)

+ + + +
+ + diff --git a/documentation/doc-Release_notes/modules/known-issues-2-7/index.html b/documentation/doc-Release_notes/modules/known-issues-2-7/index.html new file mode 100644 index 00000000000..2e500f474f4 --- /dev/null +++ b/documentation/doc-Release_notes/modules/known-issues-2-7/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Known issues

+
+

Forklift 2.7 has the following known issues:

+
+
+
Select Migration Network from the endpoint type ESXi displays multiple incorrect networks
+

When you choose Select Migration Network, from the endpoint type of ESXi, multiple incorrect networks are displayed. (MTV-1291)

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+
+
Network and Storage maps in the UI are not correct when created from the command line
+

When creating Network and Storage maps from the UI, the correct names are not shown in the UI. (MTV-1421)

+
+
+
Migration fails with module network-legacy configured in RHEL guests
+

Migration fails if the module configuration file is available in the guest and the dhcp-client package is not installed, returning a dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found error. (MTV-1615)

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/making-open-source-more-inclusive/index.html b/documentation/doc-Release_notes/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 00000000000..a4060515181 --- /dev/null +++ b/documentation/doc-Release_notes/modules/making-open-source-more-inclusive/index.html @@ -0,0 +1,69 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Making open source more inclusive

+
+

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/migration-plan-options-ui/index.html b/documentation/doc-Release_notes/modules/migration-plan-options-ui/index.html new file mode 100644 index 00000000000..e6b4a07e6eb --- /dev/null +++ b/documentation/doc-Release_notes/modules/migration-plan-options-ui/index.html @@ -0,0 +1,141 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migration plan options

+
+

On the Plans for virtualization page of the OKD web console, you can click the {kebab} beside a migration plan to access the following options:

+
+
+
    +
  • +

    Get logs: Retrieves the logs of a migration. When you click Get logs, a confirmation window opens. After you click Get logs in the window, wait until Get logs changes to Download logs and then click the button to download the logs.

    +
  • +
  • +

    Edit: Edit the details of a migration plan. You cannot edit a migration plan while it is running or after it has completed successfully.

    +
  • +
  • +

    Duplicate: Create a new migration plan with the same virtual machines (VMs), parameters, mappings, and hooks as an existing plan. You can use this feature for the following tasks:

    +
    +
      +
    • +

      Migrate VMs to a different namespace.

      +
    • +
    • +

      Edit an archived migration plan.

      +
    • +
    • +

      Edit a migration plan with a different status, for example, failed, canceled, running, critical, or ready.

      +
    • +
    +
    +
  • +
  • +

    Archive: Delete the logs, history, and metadata of a migration plan. The plan cannot be edited or restarted. It can only be viewed.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Archive option is irreversible. However, you can duplicate an archived plan.

    +
    +
    +
    +
  • +
  • +

    Delete: Permanently remove a migration plan. You cannot delete a running migration plan.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Delete option is irreversible.

    +
    +
    +

    Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

    +
    +
    +
    +
  • +
  • +

    View details: Display the details of a migration plan.

    +
  • +
  • +

    Restart: Restart a failed or canceled migration plan.

    +
  • +
  • +

    Cancel scheduled cutover: Cancel a scheduled cutover migration for a warm migration plan.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-changelog-2-7/index.html b/documentation/doc-Release_notes/modules/mtv-changelog-2-7/index.html new file mode 100644 index 00000000000..2f516752cc0 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-changelog-2-7/index.html @@ -0,0 +1,2330 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift changelog

+
+
+
+

The following changelog for Forklift includes a full list of packages used in the Forklift 2.7 releases.

+
+
+
+
+

Forklift 2.7 packages

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift packages
Forklift 2.7.0Forklift 2.7.2Forklift 2.7.3

abattis-cantarell-fonts-0.301-4.el9.noarch

abattis-cantarell-fonts-0.301-4.el9.noarch

Abattis-cantarell-fonts-0.301-4.el9.noarch

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glibc-2.34-100.el9_4.3.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.3.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.3.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.3.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtpms-0.9.1-3.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

linux-firmware-20240716-143.2.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240716-143.2.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.46.1-2.el9_4.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-overview-page/index.html b/documentation/doc-Release_notes/modules/mtv-overview-page/index.html new file mode 100644 index 00000000000..cb799a58ac8 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-overview-page/index.html @@ -0,0 +1,214 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV Overview page

+
+
+
+

The Forklift Overview page displays system-wide information about migrations and a list of Settings you can change.

+
+
+

If you have Administrator privileges, you can access the Overview page by clicking MigrationOverview in the OKD web console.

+
+
+

The Overview page has 3 tabs:

+
+
+
    +
  • +

    Overview

    +
  • +
  • +

    YAML

    +
  • +
  • +

    Metrics

    +
  • +
+
+
+
+
+

Overview tab

+
+
+

The Overview tab lets you see:

+
+
+
    +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the Operator

    +
  • +
  • +

    Pods: The name, status, and creation time of each pod that was deployed by the Forklift Operator

    +
  • +
  • +

    Conditions: Status of the Forklift Operator:

    +
    +
      +
    • +

      Failure: Last failure. False indicates no failure since deployment.

      +
    • +
    • +

      Running: Whether the Operator is currently running and waiting for the next reconciliation.

      +
    • +
    • +

      Successful: Last successful reconciliation.

      +
    • +
    +
    +
  • +
+
+
+
+
+

YAML tab

+
+
+

The custom resource ForkliftController that defines the operation of the Forklift Operator. You can modify the custom resource from this tab.

+
+
+
+
+

Metrics tab

+
+
+

The Metrics tab lets you see:

+
+
+
    +
  • +

    Migrations: The number of migrations performed using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
  • +

    Virtual Machine Migrations: The number of VMs migrated using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Since a single migration might involve many virtual machines, the number of migrations performed using Forklift might vary significantly from the number of virtual machines that have been migrated using Forklift.

+
+
+
+
+
    +
  • +

    Chart showing the number of running, failed, and succeeded migrations performed using Forklift for each of the last 7 days

    +
  • +
  • +

    Chart showing the number of running, failed, and succeeded virtual machine migrations performed using Forklift for each of the last 7 days

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-performance-addendum/index.html b/documentation/doc-Release_notes/modules/mtv-performance-addendum/index.html new file mode 100644 index 00000000000..1e26b32346b --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-performance-addendum/index.html @@ -0,0 +1,291 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance addendum

+
+
+
+

Unresolved directive in mtv-performance-addendum.adoc - include::snip_performance.adoc[]

+
+
+
+
+

ESXi performance

+
+
+
Single ESXi performance
+

Test migration using the same ESXi host.

+
+
+

In each iteration, the total VMs are increased, to display the impact of concurrent migration on the duration.

+
+
+

The results show that migration time is linear when increasing the total VMs (50 GiB disk, Utilization 70%).

+
+
+

The optimal number of VMs per ESXi is 10.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Single ESXi tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, Private Network [1]

2.6

7.0.3

100

cold

0:21:39

cold migration, 20 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

0:41:16

cold migration, 30 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:00:59

cold migration, 40 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:23:02

cold migration, 50 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:46:24

cold migration, 80 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

2:42:49

cold migration, 100 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

3:25:15

+
+
Multi ESXi hosts and single data store
+

In each iteration, the number of ESXi hosts were increased, to show that increasing the number of ESXi hosts improves the migration time (50 GiB disk, Utilization 70%).

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Multi ESXi hosts and single data store
Test Case DescriptionMTVVDDKMax_vm inflightMigration TypeTotal Duration

cold migration, 100 VMs, Single ESXi, Private Network [2]

2.6

7.0.3

100

cold

3:25:15

cold migration, 100 VMs, 4 ESXs (25 VMs per ESX), Private Network

2.6

7.0.3

100

cold

1:22:27

cold migration, 100 VMs, 5 ESXs (20 VMs per ESX), Private Network, 1 DataStore

2.6

7.0.3

100

cold

1:04:57

+
+
+
+

Different migration network performance

+
+
+

Each iteration the Migration Network was changed, using the Provider, to find the fastest network for migration.

+
+
+

The results show that there is no degradation using management compared to non-managment networks when all interfaces and network speeds are the same.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Different migration network tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, MGMT Network

2.6

7.0.3

100

cold

0:21:30

cold migration, 10 VMs, Single ESXi, Private Network [3]

2.6

7.0.3

20

cold

0:21:20

cold migration, 10 VMs, Single ESXi, Default Network

2.6.2

7.0.3

20

cold

0:21:30

+
+
+
+
+
+1. Private Network refers to a non -Management network +
+
+2. Private Network refers to a non-Management network +
+
+3. Private Network refers to a non-Management network +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-performance-recommendation/index.html b/documentation/doc-Release_notes/modules/mtv-performance-recommendation/index.html new file mode 100644 index 00000000000..b1241241580 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-performance-recommendation/index.html @@ -0,0 +1,382 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance recommendations

+
+
+
+

The purpose of this section is to share recommendations for efficient and effective migration of virtual machines (VMs) using Forklift, based on findings observed through testing.

+
+
+

Unresolved directive in mtv-performance-recommendation.adoc - include::snip_performance.adoc[]

+
+
+
+
+

Ensure fast storage and network speeds

+
+
+

Ensure fast storage and network speeds, both for VMware and OKD (OCP) environments.

+
+
+
    +
  • +

    To perform fast migrations, VMware must have fast read access to datastores.  Networking between VMware ESXi hosts should be fast, ensure a 10 GiB network connection, and avoid network bottlenecks.

    +
    +
      +
    • +

      Extend the VMware network to the OCP Workers Interface network environment.

      +
    • +
    • +

      It is important to ensure that the VMware network offers high throughput (10 Gigabit Ethernet) and rapid networking to guarantee that the reception rates align with the read rate of the ESXi datastore.

      +
    • +
    • +

      Be aware that the migration process uses significant network bandwidth and that the migration network is utilized. If other services utilize that network, it may have an impact on those services and their migration rates.

      +
    • +
    • +

      For example, 200 to 325 MiB/s was the average network transfer rate from the vmnic for each ESXi host associated with transferring data to the OCP interface.

      +
    • +
    +
    +
  • +
+
+
+
+
+

Ensure fast datastore read speeds to ensure efficient and performant migrations.

+
+
+

Datastores read rates impact the total transfer times, so it is essential to ensure fast reads are possible from the ESXi datastore to the ESXi host.  

+
+
+

Example in numbers: 200 to 300 MiB/s was the average read rate for both vSphere and ESXi endpoints for a single ESXi server. When multiple ESXi servers are used, higher datastore read rates are possible.

+
+
+
+
+

Endpoint types 

+
+
+

Forklift 2.6 allows for the following vSphere provider options:

+
+
+
    +
  • +

    ESXi endpoint (inventory and disk transfers from ESXi), introduced in Forklift 2.6

    +
  • +
  • +

    vCenter Server endpoint; no networks for the ESXi host (inventory and disk transfers from vCenter)

    +
  • +
  • +

    vCenter endpoint and ESXi networks are available (inventory from vCenter, disk transfers from ESXi).

    +
  • +
+
+
+

When transferring many VMs that are registered to multiple ESXi hosts, using the vCenter endpoint and ESXi network is suggested.

+
+
+ + + + + +
+
Note
+
+
+

As of vSphere 7.0, ESXi hosts can label which network to use for NBD transport. This is accomplished by tagging the desired virtual network interface card (NIC) with the appropriate vSphereBackupNFC label.  When this is done, Forklift will be able to utilize the ESXi interface for network transfer to Openshift as long as the worker and ESXi host interfaces are reachable.  This is especially useful when migration users may not have access to the ESXi credentials yet would like to be able to control which ESXi interface is used for migration. 

+
+
+

For more details, see: (Forklift-1230)

+
+
+
+
+

You can use the following ESXi command, which designates interface vmk2 for NBD backup:

+
+
+
+
esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
+
+
+
+
+
+

Set ESXi hosts BIOS profile and ESXi Host Power Management for High Performance

+
+
+

Where possible, ensure that hosts used to perform migrations are set with BIOS profiles related to maximum performance.  Hosts which use Host Power Management controlled within vSphere should check that High Performance is set.

+
+
+

Testing showed that when transferring more than 10 VMs with both BIOS and host power management set accordingly, migrations had an increase of 15 MiB in the average datastore read rate.

+
+
+
+
+

Avoid additional network load on VMware networks

+
+
+

You can reduce the network load on VMware networks by selecting the migration network when using the ESXi endpoint.

+
+
+

By incorporating a virtualization provider, Forklift enables the selection of a specific network, which is accessible on the ESXi hosts, for the purpose of migrating virtual machines to OCP.  Selecting this migration network from the ESXi host in the Forklift UI will ensure that the transfer is performed using the selected network as an ESXi endpoint..

+
+
+

It is imperative to ensure that the network selected has connectivity to the OCP interface, has adequate bandwidth for migrations, and that the network interface is not saturated.

+
+
+

In environments with fast networks, such as 10GbE networks, migration network impacts can be expected to match the rate of ESXi datastore reads.

+
+
+
+
+

Control maximum concurrent disk migrations per ESXi host.

+
+
+

Set the MAX_VM_INFLIGHT MTV variable to control the maximum number of concurrent VMs transfers allowed for the ESXi host. 

+
+
+

Forklift allows for concurrency to be controlled using this variable; by default, it is set to 20.

+
+
+

When setting MAX_VM_INFLIGHT, consider the number of maximum concurrent VMs transfers are required for ESXi hosts. It is important to consider the type of migration to be transferred concurrently. Warm migrations, which are defined by migrations of a running VM that will be migrated over a scheduled time.

+
+
+

Warm migrations use snapshots to compare and migrate only the differences between previous snapshots of the disk.  The migration of the differences between snapshots happens over specific intervals before a final cut-over of the running VM to OKD occurs. 

+
+
+

In Forklift 2.6, MAX_VM_INFLIGHT reserves one transfer slot per VM, regardless of current migration activity for a specific snapshot or the number of disks that belong to a single vm. The total set by MAX_VM_INFLIGHT is used to indicate how many concurrent VM tranfers per ESXi host is allowed.

+
+
+
Examples
+
    +
  • +

    MAX_VM_INFLIGHT = 20 and 2 ESXi hosts defined in the provider mean each host can transfer 20 VMs.

    +
  • +
+
+
+
+
+

Migrations are completed faster when migrating multiple VMs concurrently

+
+
+

When multiple VMs from a specific ESXi host are to be migrated, starting concurrent migrations for multiple VMs leads to faster migration times. 

+
+
+

Testing demonstrated that migrating 10 VMs (each containing 35 GiB of data, with a total size of 50 GiB) from a single host is significantly faster than migrating the same number of VMs sequentially, one after another. 

+
+
+

It is possible to increase concurrent migration to more than 10 virtual machines from a single host, but it does not show a significant improvement. 

+
+
+
Examples
+
    +
  • +

    1 single disk VMs took 6 minutes, with migration rate of 100 MiB/s

    +
  • +
  • +

    10 single disk VMs took 22 minutes, with migration rate of 272 MiB/s

    +
  • +
  • +

    20 single disk VMs took 42 minutes, with migration rate of 284 MiB/s

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that the migration of 10 virtual machines simultaneously is three times faster than the migration of identical virtual machines in a sequential manner.

+
+
+

The migration rate was almost the same when moving 10 or 20 virtual machines simultaneously.

+
+
+
+
+
+
+

Migrations complete faster using multiple hosts.

+
+
+

Using multiple hosts with registered VMs equally distributed among the ESXi hosts used for migrations leads to faster migration times.

+
+
+

Testing showed that when transferring more than 10 single disk VMS, each containing 35 GiB of data out of a total of 50G total, using an additional host can reduce migration time.

+
+
+
Examples
+
    +
  • +

    80 single disk VMs, containing 35 GiB of data each, using a single host took 2 hours and 43 minutes, with a migration rate of 294 MiB/s.

    +
  • +
  • +

    80 single disk VMs, containing 35 GiB of data each, using 8 ESXi hosts took 41 minutes, with a migration rate of 1,173 MiB/s.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that migrating 80 VMs from 8 ESXi hosts, 10 from each host, concurrently is four times faster than running the same VMs from a single ESXi host. 

+
+
+

Migrating a larger number of VMs from more than 8 ESXi hosts concurrently could potentially show increased performance. However, it was not tested and therefore not recommended.

+
+
+
+
+
+
+

Multiple migration plans compared to a single large migration plan

+
+
+

The maximum number of disks that can be referenced by a single migration plan is 500. For more details, see (MTV-1203)

+
+
+

When attempting to migrate many VMs in a single migration plan, it can take some time for all migrations to start.  By breaking up one migration plan into several migration plans, it is possible to start them at the same time.

+
+
+

Comparing migrations of:

+
+
+
    +
  • +

    500 VMs using 8 ESXi hosts in 1 plan, max_vm_inflight=100, took 5 hours and 10 minutes.

    +
  • +
  • +

    800 VMs using 8 ESXi hosts with 8 plans, max_vm_inflight=100, took 57 minutes.

    +
  • +
+
+
+

Testing showed that by breaking one single large plan into multiple moderately sized plans, for example, 100 VMS per plan, the total migration time can be reduced.

+
+
+
+
+

Maximum values tested

+
+
+
    +
  • +

    Maximum number of ESXi hosts tested: 8

    +
  • +
  • +

    Maximum number of VMs in a single migration plan: 500

    +
  • +
  • +

    Maximum number of VMs migrated in a single test: 5000

    +
  • +
  • +

    Maximum number of migration plans performed concurrently: 40

    +
  • +
  • +

    Maximum single disk size migrated: 6 T disks, which contained 3 Tb of data

    +
  • +
  • +

    Maximum number of disks on a single VM migrated: 50

    +
  • +
  • +

    Highest observed single datastore read rate from a single ESXi server:  312 MiB/second

    +
  • +
  • +

    Highest observed multi-datastore read rate using eight ESXi servers and two datastores: 1,242 MiB/second

    +
  • +
  • +

    Highest observed virtual NIC transfer rate to an {ocp-name} worker: 327 MiB/second

    +
  • +
  • +

    Maximum migration transfer rate of a single disk: 162 MiB/second (rate observed when transferring nonconcurrent migration of 1.5 Tb utilized data)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from a single ESXi host: 294 MiB/s (concurrent migration of 30 VMs, 35/50 GiB used, from Single ESXi)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from multiple ESXi hosts: 1173MB/s (concurrent migration of 80 VMs, 35/50 GiB used, from 8 ESXi servers, 10 VMs from each ESXi)

    +
  • +
+
+
+

For additional details on performance, see Forklift performance addendum

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-resources-and-services/index.html b/documentation/doc-Release_notes/modules/mtv-resources-and-services/index.html new file mode 100644 index 00000000000..27e819d0c9a --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-resources-and-services/index.html @@ -0,0 +1,131 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift custom resources and services

+
+

Forklift is provided as an OKD Operator. It creates and manages the following custom resources (CRs) and services.

+
+
+
Forklift custom resources
+
    +
  • +

    Provider CR stores attributes that enable Forklift to connect to and interact with the source and target providers.

    +
  • +
  • +

    NetworkMapping CR maps the networks of the source and target providers.

    +
  • +
  • +

    StorageMapping CR maps the storage of the source and target providers.

    +
  • +
  • +

    Plan CR contains a list of VMs with the same migration parameters and associated network and storage mappings.

    +
  • +
  • +

    Migration CR runs a migration plan.

    +
    +

    Only one Migration CR per migration plan can run at a given time. You can create multiple Migration CRs for a single Plan CR.

    +
    +
  • +
+
+
+
Forklift services
+
    +
  • +

    The Inventory service performs the following actions:

    +
    +
      +
    • +

      Connects to the source and target providers.

      +
    • +
    • +

      Maintains a local inventory for mappings and plans.

      +
    • +
    • +

      Stores VM configurations.

      +
    • +
    • +

      Runs the Validation service if a VM configuration change is detected.

      +
    • +
    +
    +
  • +
  • +

    The Validation service checks the suitability of a VM for migration by applying rules.

    +
  • +
  • +

    The Migration Controller service orchestrates migrations.

    +
    +

    When you create a migration plan, the Migration Controller service validates the plan and adds a status label. If the plan fails validation, the plan status is Not ready and the plan cannot be used to perform a migration. If the plan passes validation, the plan status is Ready and it can be used to perform a migration. After a successful migration, the Migration Controller service changes the plan status to Completed.

    +
    +
  • +
  • +

    The Populator Controller service orchestrates disk transfers using Volume Populators.

    +
  • +
  • +

    The Kubevirt Controller and Containerized Data Import (CDI) Controller services handle most technical operations.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-selected-packages-2-7/index.html b/documentation/doc-Release_notes/modules/mtv-selected-packages-2-7/index.html new file mode 100644 index 00000000000..03e0ec1b3b8 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-selected-packages-2-7/index.html @@ -0,0 +1,207 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift selected packages

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Selected Forklift packages
Package summaryForklift 2.7.0Forklift 2.7.2Forklift 2.7.3

The skeleton package which defines a simple Red Hat Enterprise Linux system

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

Core kernel modules to match the core kernel

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

The Linux kernel

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

Access and modify virtual machine disk images

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

Client side utilities of the libvirt library

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

Libvirt libraries

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

QEMU driver plugin for the libvirtd daemon

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

NBD server

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

Basic filters for nbdkit

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

Basic plugins for nbdkit

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

HTTP/FTP (cURL) plugin for nbdkit

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

NBD proxy / forward plugin for nbdkit

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

Python 3 plugin for nbdkit

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

The nbdkit server

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

SSH plugin for nbdkit

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

VMware VDDK plugin for nbdkit

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

QEMU command line tool for manipulating disk images

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

QEMU common files needed by all QEMU targets

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

+

qemu-kvm core components

+

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

Convert a virtual machine to run on KVM

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-settings/index.html b/documentation/doc-Release_notes/modules/mtv-settings/index.html new file mode 100644 index 00000000000..2ad1bd3c508 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-settings/index.html @@ -0,0 +1,133 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring MTV settings

+
+

If you have Administrator privileges, you can access the Overview page and change the following settings in it:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift settings
SettingDescriptionDefault value

Max concurrent virtual machine migrations

The maximum number of VMs per plan that can be migrated simultaneously

20

Must gather cleanup after (hours)

The duration for retaining must gather reports before they are automatically deleted

Disabled

Controller main container CPU limit

The CPU limit allocated to the main controller container

500 m

Controller main container Memory limit

The memory limit allocated to the main controller container

800 Mi

Precopy internal (minutes)

The interval at which a new snapshot is requested before initiating a warm migration

60

Snapshot polling interval (seconds)

The frequency with which the system checks the status of snapshot creation or removal during a warm migration

10

+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationOverview. The Settings list is on the right-hand side of the page.

    +
  2. +
  3. +

    In the Settings list, click the Edit icon of the setting you want to change.

    +
  4. +
  5. +

    Choose a setting from the list.

    +
  6. +
  7. +

    Click Save.

    +
  8. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-ui/index.html b/documentation/doc-Release_notes/modules/mtv-ui/index.html new file mode 100644 index 00000000000..d5e6d0e28aa --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-ui/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV user interface

+
+

The Forklift user interface is integrated into the OKD web console.

+
+
+

In the left-hand panel, you can choose a page related to a component of the migration progress, for example, Providers for Migration, or, if you are an administrator, you can choose Overview, which contains information about migrations and lets you configure Forklift settings.

+
+
+
+Forklift user interface +
+
Figure 1. Forklift extension interface
+
+
+

In pages related to components, you can click on the Projects list, which is in the upper-left portion of the page, and see which projects (namespaces) you are allowed to work with.

+
+
+
    +
  • +

    If you are an administrator, you can see all projects.

    +
  • +
  • +

    If you are a non-administrator, you can see only the projects that you have permissions to work with.

    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/mtv-workflow/index.html b/documentation/doc-Release_notes/modules/mtv-workflow/index.html new file mode 100644 index 00000000000..45b90dda312 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-workflow/index.html @@ -0,0 +1,113 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

High-level migration workflow

+
+

The high-level workflow shows the migration process from the point of view of the user:

+
+
+
    +
  1. +

    You create a source provider, a target provider, a network mapping, and a storage mapping.

    +
  2. +
  3. +

    You create a Plan custom resource (CR) that includes the following resources:

    +
    +
      +
    • +

      Source provider

      +
    • +
    • +

      Target provider, if Forklift is not installed on the target cluster

      +
    • +
    • +

      Network mapping

      +
    • +
    • +

      Storage mapping

      +
    • +
    • +

      One or more virtual machines (VMs)

      +
    • +
    +
    +
  4. +
  5. +

    You run a migration plan by creating a Migration CR that references the Plan CR.

    +
    +

    If you cannot migrate all the VMs for any reason, you can create multiple Migration CRs for the same Plan CR until all VMs are migrated.

    +
    +
  6. +
  7. +

    For each VM in the Plan CR, the Migration Controller service records the VM migration progress in the Migration CR.

    +
  8. +
  9. +

    Once the data transfer for each VM in the Plan CR completes, the Migration Controller service creates a VirtualMachine CR.

    +
    +

    When all VMs have been migrated, the Migration Controller service updates the status of the Plan CR to Completed. The power state of each source VM is maintained after migration.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/network-prerequisites/index.html b/documentation/doc-Release_notes/modules/network-prerequisites/index.html new file mode 100644 index 00000000000..6bc83209c47 --- /dev/null +++ b/documentation/doc-Release_notes/modules/network-prerequisites/index.html @@ -0,0 +1,196 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Network prerequisites

+
+
+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    IP addresses, VLANs, and other network configuration settings must not be changed before or during migration. The MAC addresses of the virtual machines are preserved during migration.

    +
  • +
  • +

    The network connections between the source environment, the KubeVirt cluster, and the replication repository must be reliable and uninterrupted.

    +
  • +
  • +

    If you are mapping more than one source and destination network, you must create a network attachment definition for each additional destination network.

    +
  • +
+
+
+
+
+

Ports

+
+
+

The firewalls must enable traffic over the following ports:

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Network ports required for migrating from VMware vSphere
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

VMware vCenter

+

VMware provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer authentication

+

902

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer data copy

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Network ports required for migrating from oVirt
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

oVirt Engine

+

oVirt provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer authentication

+

54322

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer data copy

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/new-features-and-enhancements-2-7/index.html b/documentation/doc-Release_notes/modules/new-features-and-enhancements-2-7/index.html new file mode 100644 index 00000000000..e7d5e79e2bb --- /dev/null +++ b/documentation/doc-Release_notes/modules/new-features-and-enhancements-2-7/index.html @@ -0,0 +1,85 @@ + + + + + + + + New features and enhancements | Forklift Documentation + + + + + + + + + + + + + +New features and enhancements | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

New features and enhancements

+
+
+
+

Forklift 2.7 introduces the following features and enhancements:

+
+
+
+
+

New features and enhancements 2.7.0

+
+
+
    +
  • +

    In Forklift 2.7.0, warm migration is now based on RHEL 9 inheriting features and bug fixes.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/new-migrating-virtual-machines-cli/index.html b/documentation/doc-Release_notes/modules/new-migrating-virtual-machines-cli/index.html new file mode 100644 index 00000000000..84936d4f21b --- /dev/null +++ b/documentation/doc-Release_notes/modules/new-migrating-virtual-machines-cli/index.html @@ -0,0 +1,155 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
  5. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/index.html b/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 00000000000..4ef0782e1a8 --- /dev/null +++ b/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,192 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Permissions needed by non-administrators to work with migration plan components

+
+

If you are an administrator, you can work with all components of migration plans (for example, providers, network mappings, and migration plans).

+
+
+

By default, non-administrators have limited ability to work with migration plans and their components. As an administrator, you can modify their roles to allow them full access to all components, or you can give them limited permissions.

+
+
+

For example, administrators can assign non-administrators one or more of the following cluster roles for migration plans:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Example migration plan roles and their privileges
RoleDescription

plans.forklift.konveyor.io-v1beta1-view

Can view migration plans but not to create, delete or modify them

plans.forklift.konveyor.io-v1beta1-edit

Can create, delete or modify (all parts of edit permissions) individual migration plans

plans.forklift.konveyor.io-v1beta1-admin

All edit privileges and the ability to delete the entire collection of migration plans

+
+

Note that pre-defined cluster roles include a resource (for example, plans), an API group (for example, forklift.konveyor.io-v1beta1) and an action (for example, view, edit).

+
+
+

As a more comprehensive example, you can grant non-administrators the following set of permissions per namespace:

+
+
+
    +
  • +

    Create and modify storage maps, network maps, and migration plans for the namespaces they have access to

    +
  • +
  • +

    Attach providers created by administrators to storage maps, network maps, and migration plans

    +
  • +
  • +

    Not be able to create providers or to change system settings

    +
  • +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Example permissions required for non-adminstrators to work with migration plan components but not create providers
ActionsAPI groupResource

get, list, watch, create, update, patch, delete

forklift.konveyor.io

plans

get, list, watch, create, update, patch, delete

forklift.konveyor.io

migrations

get, list, watch, create, update, patch, delete

forklift.konveyor.io

hooks

get, list, watch

forklift.konveyor.io

providers

get, list, watch, create, update, patch, delete

forklift.konveyor.io

networkmaps

get, list, watch, create, update, patch, delete

forklift.konveyor.io

storagemaps

get, list, watch

forklift.konveyor.io

forkliftcontrollers

create, patch, delete

Empty string

secrets

+
+ + + + + +
+
Note
+
+
+

Non-administrators need to have the create permissions that are part of edit roles for network maps and for storage maps to create migration plans, even when using a template for a network map or a storage map.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/obtaining-console-url/index.html b/documentation/doc-Release_notes/modules/obtaining-console-url/index.html new file mode 100644 index 00000000000..e166a2f5375 --- /dev/null +++ b/documentation/doc-Release_notes/modules/obtaining-console-url/index.html @@ -0,0 +1,107 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Getting the Forklift web console URL

+
+

You can get the Forklift web console URL at any time by using either the OKD web console, or the command line.

+
+
+
Prerequisites
+
    +
  • +

    KubeVirt Operator installed.

    +
  • +
  • +

    Forklift Operator installed.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  • +

    If you are using the OKD web console, follow these steps:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_web.adoc[]

+
+
+
    +
  • +

    If you are using the command line, get the Forklift web console URL with the following command:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_cli.adoc[]

+
+
+

You can now launch a browser and navigate to the Forklift web console.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/openstack-prerequisites/index.html b/documentation/doc-Release_notes/modules/openstack-prerequisites/index.html new file mode 100644 index 00000000000..f5234fb18b2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/openstack-prerequisites/index.html @@ -0,0 +1,76 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/ostack-app-cred-auth/index.html b/documentation/doc-Release_notes/modules/ostack-app-cred-auth/index.html new file mode 100644 index 00000000000..729de6cc1b2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/ostack-app-cred-auth/index.html @@ -0,0 +1,189 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using application credential authentication with an {osp} source provider

+
+

You can use application credential authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of application credential authentication:

+
+
+
    +
  • +

    Application credential ID

    +
  • +
  • +

    Application credential name

    +
  • +
+
+
+

For each type of application credential authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

You have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for application credential authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for application credential authentication, run the following command:

    +
    +
    +
    $ openstack application credential create --role member --role reader --secret redhat forklift
    +
    +
    +
    +

    The output, referred to here as <openstack_credential_output>, includes:

    +
    +
    +
      +
    • +

      The id and secret that you need for authentication using an application credential ID

      +
    • +
    • +

      The name and secret that you need for authentication using an application credential name

      +
    • +
    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using the application credential ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialID: <id_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using the application credential name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialName: <name_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/ostack-token-auth/index.html b/documentation/doc-Release_notes/modules/ostack-token-auth/index.html new file mode 100644 index 00000000000..dab7371ed1c --- /dev/null +++ b/documentation/doc-Release_notes/modules/ostack-token-auth/index.html @@ -0,0 +1,180 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using token authentication with an {osp} source provider

+
+

You can use token authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of token authentication:

+
+
+
    +
  • +

    Token with user ID

    +
  • +
  • +

    Token with user name

    +
  • +
+
+
+

For each type of token authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

Have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for token authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for token authentication, run the following command:

    +
    +
    +
    $ openstack token issue
    +
    +
    +
    +

    The output, referred to here as <openstack_token_output>, includes the token, userID, and projectID that you need for authentication using a token with user ID.

    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using a token with user ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  projectID: <projectID_from_openstack_token_output>
      +  userID: <userID_from_openstack_token_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using a token with user name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  projectName: <OS_PROJECT_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/ova-prerequisites/index.html b/documentation/doc-Release_notes/modules/ova-prerequisites/index.html new file mode 100644 index 00000000000..64363640d36 --- /dev/null +++ b/documentation/doc-Release_notes/modules/ova-prerequisites/index.html @@ -0,0 +1,130 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Open Virtual Appliance (OVA) prerequisites

+
+

The following prerequisites apply to Open Virtual Appliance (OVA) file migrations:

+
+
+
    +
  • +

    All OVA files are created by VMware vSphere.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+
    +
  • +

    The OVA files are in one or more folders under an NFS shared directory in one of the following structures:

    +
    +
      +
    • +

      In one or more compressed Open Virtualization Format (OVF) packages that hold all the VM information.

      +
      +

      The filename of each compressed package must have the .ova extension. Several compressed packages can be stored in the same folder.

      +
      +
      +

      When this structure is used, Forklift scans the root folder and the first-level subfolders for compressed packages.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The folder /nfs is scanned.
      +The folder /nfs/subfolder1 is scanned.
      +But, /nfs/subfolder1/subfolder2 is not scanned.

      +
      +
    • +
    • +

      In extracted OVF packages.

      +
      +

      When this structure is used, Forklift scans the root folder, first-level subfolders, and second-level subfolders for extracted OVF packages. +However, there can be only one .ovf file in a folder. Otherwise, the migration will fail.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The OVF file /nfs/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/subfolder2/vm.ovf is scanned.
      +But, the OVF file /nfs/subfolder1/subfolder2/subfolder3/vm.ovf is not scanned.

      +
      +
    • +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/retrieving-validation-service-json/index.html b/documentation/doc-Release_notes/modules/retrieving-validation-service-json/index.html new file mode 100644 index 00000000000..f515f1259b3 --- /dev/null +++ b/documentation/doc-Release_notes/modules/retrieving-validation-service-json/index.html @@ -0,0 +1,483 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving the Inventory service JSON

+
+

You retrieve the Inventory service JSON by sending an Inventory service query to a virtual machine (VM). The output contains an "input" key, which contains the inventory attributes that are queried by the Validation service rules.

+
+
+

You can create a validation rule based on any attribute in the "input" key, for example, input.snapshot.kind.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Trigger an HTTP GET request (for example, using Curl):

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    +
    +
    +
  8. +
  9. +

    Retrieve the UUID of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k (1)
    +
    +
    +
    +
      +
    1. +

      Allowed values for the provider are vsphere, ovirt, and openstack.

      +
    2. +
    +
    +
  10. +
  11. +

    Retrieve the VMs of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    +
    +
    +
  12. +
  13. +

    Retrieve the details of a VM:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    +
    +
    +
    +
    Example output
    +
    +
    {
    +    "input": {
    +        "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
    +        "id": "vm-431",
    +        "parent": {
    +            "kind": "Folder",
    +            "id": "group-v22"
    +        },
    +        "revision": 1,
    +        "name": "iscsi-target",
    +        "revisionValidated": 1,
    +        "isTemplate": false,
    +        "networks": [
    +            {
    +                "kind": "Network",
    +                "id": "network-31"
    +            },
    +            {
    +                "kind": "Network",
    +                "id": "network-33"
    +            }
    +        ],
    +        "disks": [
    +            {
    +                "key": 2000,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 17179869184,
    +                "shared": false,
    +                "rdm": false
    +            },
    +            {
    +                "key": 2001,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 10737418240,
    +                "shared": false,
    +                "rdm": false
    +            }
    +        ],
    +        "concerns": [],
    +        "policyVersion": 5,
    +        "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
    +        "firmware": "bios",
    +        "powerState": "poweredOn",
    +        "connectionState": "connected",
    +        "snapshot": {
    +            "kind": "VirtualMachineSnapshot",
    +            "id": "snapshot-3034"
    +        },
    +        "changeTrackingEnabled": false,
    +        "cpuAffinity": [
    +            0,
    +            2
    +        ],
    +        "cpuHotAddEnabled": true,
    +        "cpuHotRemoveEnabled": false,
    +        "memoryHotAddEnabled": false,
    +        "faultToleranceEnabled": false,
    +        "cpuCount": 2,
    +        "coresPerSocket": 1,
    +        "memoryMB": 2048,
    +        "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
    +        "balloonedMemory": 0,
    +        "ipAddress": "10.19.2.96",
    +        "storageUsed": 30436770129,
    +        "numaNodeAffinity": [
    +            "0",
    +            "1"
    +        ],
    +        "devices": [
    +            {
    +                "kind": "RealUSBController"
    +            }
    +        ],
    +        "host": {
    +            "id": "host-29",
    +            "parent": {
    +                "kind": "Cluster",
    +                "id": "domain-c26"
    +            },
    +            "revision": 1,
    +            "name": "IP address or host name of the vCenter host or oVirt Engine host",
    +            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
    +            "status": "green",
    +            "inMaintenance": false,
    +            "managementServerIp": "10.19.2.96",
    +            "thumbprint": <thumbprint>,
    +            "timezone": "UTC",
    +            "cpuSockets": 2,
    +            "cpuCores": 16,
    +            "productName": "VMware ESXi",
    +            "productVersion": "6.5.0",
    +            "networking": {
    +                "pNICs": [
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic0",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic1",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic2",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic3",
    +                        "linkSpeed": 10000
    +                    }
    +                ],
    +                "vNICs": [
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk2",
    +                        "portGroup": "VM_Migration",
    +                        "dPortGroup": "",
    +                        "ipAddress": "192.168.79.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 9000
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk0",
    +                        "portGroup": "Management Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.13",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk1",
    +                        "portGroup": "Storage Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "172.31.2.13",
    +                        "subnetMask": "255.255.0.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk3",
    +                        "portGroup": "",
    +                        "dPortGroup": "dvportgroup-48",
    +                        "ipAddress": "192.168.61.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk4",
    +                        "portGroup": "VM_DHCP_Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.231",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    }
    +                ],
    +                "portGroups": [
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM Network",
    +                        "name": "VM Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Management Network",
    +                        "name": "Management Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_10G_Network",
    +                        "name": "VM_10G_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Storage",
    +                        "name": "VM_Storage",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_DHCP_Network",
    +                        "name": "VM_DHCP_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Storage Network",
    +                        "name": "Storage Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Isolated_67",
    +                        "name": "VM_Isolated_67",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Migration",
    +                        "name": "VM_Migration",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    }
    +                ],
    +                "switches": [
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch0",
    +                        "name": "vSwitch0",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM Network",
    +                            "key-vim.host.PortGroup-Management Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic4"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch1",
    +                        "name": "vSwitch1",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_10G_Network",
    +                            "key-vim.host.PortGroup-VM_Storage",
    +                            "key-vim.host.PortGroup-VM_DHCP_Network",
    +                            "key-vim.host.PortGroup-Storage Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic2",
    +                            "key-vim.host.PhysicalNic-vmnic0"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch2",
    +                        "name": "vSwitch2",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_Isolated_67",
    +                            "key-vim.host.PortGroup-VM_Migration"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic3",
    +                            "key-vim.host.PhysicalNic-vmnic1"
    +                        ]
    +                    }
    +                ]
    +            },
    +            "networks": [
    +                {
    +                    "kind": "Network",
    +                    "id": "network-31"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-34"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-57"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-33"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "dvportgroup-47"
    +                }
    +            ],
    +            "datastores": [
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-35"
    +                },
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                }
    +            ],
    +            "vms": null,
    +            "networkAdapters": [],
    +            "cluster": {
    +                "id": "domain-c26",
    +                "parent": {
    +                    "kind": "Folder",
    +                    "id": "group-h23"
    +                },
    +                "revision": 1,
    +                "name": "mycluster",
    +                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
    +                "folder": "group-h23",
    +                "networks": [
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-31"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-34"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-57"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-33"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "dvportgroup-47"
    +                    }
    +                ],
    +                "datastores": [
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-35"
    +                    },
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-63"
    +                    }
    +                ],
    +                "hosts": [
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-44"
    +                    },
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-29"
    +                    }
    +                ],
    +                "dasEnabled": false,
    +                "dasVms": [],
    +                "drsEnabled": true,
    +                "drsBehavior": "fullyAutomated",
    +                "drsVms": [],
    +                "datacenter": null
    +            }
    +        }
    +    }
    +}
    +
    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/retrieving-vmware-moref/index.html b/documentation/doc-Release_notes/modules/retrieving-vmware-moref/index.html new file mode 100644 index 00000000000..8c169acf9d9 --- /dev/null +++ b/documentation/doc-Release_notes/modules/retrieving-vmware-moref/index.html @@ -0,0 +1,149 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving a VMware vSphere moRef

+
+

When you migrate VMs with a VMware vSphere source provider using Forklift from the CLI, you need to know the managed object reference (moRef) of certain entities in vSphere, such as datastores, networks, and VMs.

+
+
+

You can retrieve the moRef of one or more vSphere entities from the Inventory service. You can then use each moRef as a reference for retrieving the moRef of another entity.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Retrieve the moRef of a VMware vSphere provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    +
    +
    +
  8. +
  9. +

    Retrieve the datastores of a VMware vSphere source provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    +
    +
    +
    +
    Example output
    +
    +
    [
    +  {
    +    "id": "datastore-11",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
    +    "revision": 46,
    +    "name": "v2v_general_porpuse_ISCSI_DC",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
    +  },
    +  {
    +    "id": "datastore-730",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
    +    "revision": 46,
    +    "name": "f01-h27-640-SSD_2",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
    +  },
    + ...
    +
    +
    +
  10. +
+
+
+

In this example, the moRef of the datastore v2v_general_porpuse_ISCSI_DC is datastore-11 and the moRef of the datastore f01-h27-640-SSD_2 is datastore-730.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rhv-prerequisites/index.html b/documentation/doc-Release_notes/modules/rhv-prerequisites/index.html new file mode 100644 index 00000000000..e4d6b30ce92 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rhv-prerequisites/index.html @@ -0,0 +1,129 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+
    +
  • +

    To create a source provider, you must have at least the UserRole and ReadOnlyAdmin roles assigned to you. These are the minimum required permissions, however, any other administrator or superuser permissions will also work.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

You must keep the UserRole and ReadOnlyAdmin roles until the virtual machines of the source provider have been migrated. Otherwise, the migration will fail.

+
+
+
+
+
    +
  • +

    To migrate virtual machines:

    +
    +
      +
    • +

      You must have one of the following:

      +
      +
        +
      • +

        oVirt admin permissions. These permissions allow you to migrate any virtual machine in the system.

        +
      • +
      • +

        DiskCreator and UserVmManager permissions on every virtual machine you want to migrate.

        +
      • +
      +
      +
    • +
    • +

      You must use a compatible version of oVirt.

      +
    • +
    • +

      You must have the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate.

      +
      +

      You can obtain the Engine CA certificate by navigating to https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA in a browser.

      +
      +
    • +
    • +

      If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

      +
    • +
    +
    +
  • +
+
+
+

Unresolved directive in rhv-prerequisites.adoc - include::snip-migrating-luns.adoc[]

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.0/index.html b/documentation/doc-Release_notes/modules/rn-2.0/index.html new file mode 100644 index 00000000000..356d249ba49 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.0/index.html @@ -0,0 +1,163 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.0

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Warm migration
+

Warm migration reduces downtime by copying most of the VM data during a precopy stage while the VMs are running. During the cutover stage, the VMs are stopped and the rest of the data is copied.

+
+
+
Cancel migration
+

You can cancel an entire migration plan or individual VMs while a migration is in progress. A canceled migration plan can be restarted in order to migrate the remaining VMs.

+
+
+
Migration network
+

You can select a migration network for the source and target providers for improved performance. By default, data is copied using the VMware administration network and the OKD pod network.

+
+
+
Validation service
+

The validation service checks source VMs for issues that might affect migration and flags the VMs with concerns in the migration plan.

+
+
+ + + + + +
+
Important
+
+
+

The validation service is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+
+
+
+

Known issues

+
+
+

This section describes known issues and mitigations.

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Network map displays a "Destination network not found" error
+

If the network map remains in a NotReady state and the NetworkMap manifest displays a Destination network not found error, the cause is a missing network attachment definition. You must create a network attachment definition for each additional destination network before you create the network map. (BZ#1971259)

+
+
+
Warm migration gets stuck during third precopy
+

Warm migration uses changed block tracking snapshots to copy data during the precopy stage. The snapshots are created at one-hour intervals by default. When a snapshot is created, its contents are copied to the destination cluster. However, when the third snapshot is created, the first snapshot is deleted and the block tracking is lost. (BZ#1969894)

+
+
+

You can do one of the following to mitigate this issue:

+
+
+
    +
  • +

    Start the cutover stage no more than one hour after the precopy stage begins so that only one internal snapshot is created.

    +
  • +
  • +

    Increase the snapshot interval in the vm-import-controller-config config map to 720 minutes:

    +
    +
    +
    $ kubectl patch configmap/vm-import-controller-config \
    +  -n openshift-cnv -p '{"data": \
    +  {"warmImport.intervalMinutes": "720"}}'
    +
    +
    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.1/index.html b/documentation/doc-Release_notes/modules/rn-2.1/index.html new file mode 100644 index 00000000000..40e42e04211 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.1/index.html @@ -0,0 +1,191 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.1

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

Technical changes

+
+
+
VDDK image added to HyperConverged custom resource
+

The VMware Virtual Disk Development Kit (VDDK) SDK image must be added to the HyperConverged custom resource. Before this release, it was referenced in the v2v-vmware config map.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Cold migration from oVirt
+

You can perform a cold migration of VMs from oVirt.

+
+
+
Migration hooks
+

You can create migration hooks to run Ansible playbooks or custom code before or after migration.

+
+
+
Filtered must-gather data collection
+

You can specify options for the must-gather tool that enable you to filter the data by namespace, migration plan, or VMs.

+
+
+
SR-IOV network support
+

You can migrate VMs with a single root I/O virtualization (SR-IOV) network interface if the KubeVirt environment has an SR-IOV network.

+
+
+
+
+

Known issues

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Disk copy stage does not progress
+

The disk copy stage of a oVirt VM does not progress and the Forklift web console does not display an error message. (BZ#1990596)

+
+
+

The cause of this problem might be one of the following conditions:

+
+
+
    +
  • +

    The storage class does not exist on the target cluster.

    +
  • +
  • +

    The VDDK image has not been added to the HyperConverged custom resource.

    +
  • +
  • +

    The VM does not have a disk.

    +
  • +
  • +

    The VM disk is locked.

    +
  • +
  • +

    The VM time zone is not set to UTC.

    +
  • +
  • +

    The VM is configured for a USB device.

    +
  • +
+
+
+

To disable USB devices, see Configuring USB Devices in the Red Hat Virtualization documentation.

+
+
+

To determine the cause:

+
+
+
    +
  1. +

    Click WorkloadsVirtualization in the OKD web console.

    +
  2. +
  3. +

    Click the Virtual Machines tab.

    +
  4. +
  5. +

    Select a virtual machine to open the Virtual Machine Overview screen.

    +
  6. +
  7. +

    Click Status to view the status of the virtual machine.

    +
  8. +
+
+
+
VM time zone must be UTC with no offset
+

The time zone of the source VMs must be UTC with no offset. You can set the time zone to GMT Standard Time after first assessing the potential impact on the workload. (BZ#1993259)

+
+
+
oVirt resource UUID causes a "Provider not found" error
+

If a oVirt resource UUID is used in a Host, NetworkMap, StorageMap, or Plan custom resource (CR), a "Provider not found" error is displayed.

+
+
+

You must use the resource name. (BZ#1994037)

+
+
+
Same oVirt resource name in different data centers causes ambiguous reference
+

If a oVirt resource name is used in a NetworkMap, StorageMap, or Plan custom resource (CR) and if the same resource name exists in another data center, the Plan CR displays a critical "Ambiguous reference" condition. You must rename the resource or use the resource UUID in the CR.

+
+
+

In the web console, the resource name appears twice in the same list without a data center reference to distinguish them. You must rename the resource. (BZ#1993089)

+
+
+
Snapshots are not deleted after warm migration
+

Snapshots are not deleted automatically after a successful warm migration of a VMware VM. You must delete the snapshots manually in VMware vSphere. (BZ#2001270)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.2/index.html b/documentation/doc-Release_notes/modules/rn-2.2/index.html new file mode 100644 index 00000000000..550ff82fdc0 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.2/index.html @@ -0,0 +1,219 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.2

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the precopy time interval for warm migration
+

You can set the time interval between snapshots taken during the precopy stage of warm migration.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Creating validation rules
+

You can create custom validation rules to check the suitability of VMs for migration. Validation rules are based on the VM attributes collected by the Provider Inventory service and written in Rego, the Open Policy Agent native query language.

+
+
+
Downloading logs by using the web console
+

You can download logs for a migration plan or a migrated VM by using the Forklift web console.

+
+
+
Duplicating a migration plan by using the web console
+

You can duplicate a migration plan by using the web console, including its VMs, mappings, and hooks, in order to edit the copy and run as a new migration plan.

+
+
+
Archiving a migration plan by using the web console
+

You can archive a migration plan by using the MTV web console. Archived plans can be viewed or duplicated. They cannot be run, edited, or unarchived.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Certain Validation service issues do not block migration
+

Certain Validation service issues, which are marked as Critical and display the assessment text, The VM will not be migrated, do not block migration. (BZ#2025977)

+
+
+

The following Validation service assessments do not block migration:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Issues that do not block migration
AssessmentResult

The disk interface type is not supported by OpenShift Virtualization (only sata, virtio_scsi and virtio interface types are currently supported).

The migrated VM will have a virtio disk if the source interface is not recognized.

The NIC interface type is not supported by OpenShift Virtualization (only e1000, rtl8139 and virtio interface types are currently supported).

The migrated VM will have a virtio NIC if the source interface is not recognized.

The VM is using a vNIC profile configured for host device passthrough, which is not currently supported by OpenShift Virtualization.

The migrated VM will have an SR-IOV NIC. The destination network must be set up correctly.

One or more of the VM’s disks has an illegal or locked status condition.

The migration will proceed but the disk transfer is likely to fail.

The VM has a disk with a storage type other than image, and this is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has one or more snapshots with disks in ILLEGAL state. This is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has USB support enabled, but USB devices are not currently supported by OpenShift Virtualization.

The migrated VM will not have USB devices.

The VM is configured with a watchdog device, which is not currently supported by OpenShift Virtualization.

The migrated VM will not have a watchdog device.

The VM’s status is not up or down.

The migration will proceed but it might hang if the VM cannot be powered off.

+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Missing resource causes error message in current.log file
+

If a resource does not exist, for example, if the virt-launcher pod does not exist because the migrated VM is powered off, its log is unavailable.

+
+
+

The following error appears in the missing resource’s current.log file when it is downloaded from the web console or created with the must-gather tool: error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'. (BZ#2023260)

+
+
+
Importer pod log is unavailable after warm migration
+

Retaining the importer pod for debug purposes causes warm migration to hang during the precopy stage. (BZ#2016290)

+
+
+

As a temporary workaround, the importer pod is removed at the end of the precopy stage so that the precopy succeeds. However, this means that the importer pod log is not retained after warm migration is complete. You can only view the importer pod log by using the oc logs -f <cdi-importer_pod> command during the precopy stage.

+
+
+

This issue only affects the importer pod log and warm migration. Cold migration and the virt-v2v logs are not affected.

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Network, storage, and VM referenced by name in the Plan CR are not displayed in the web console.
+

If a Plan CR references storage, network, or VMs by name instead of by ID, the resources do not appear in the Forklift web console. The migration plan cannot be edited or duplicated. (BZ#1986020)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
If a target VM is deleted during migration, its migration status is Succeeded in the Plan CR
+

If you delete a target VirtualMachine CR during the 'Convert image to kubevirt' step of the migration, the Migration details page of the web console displays the state of the step as VirtualMachine CR not found. However, the status of the VM migration is Succeeded in the Plan CR file and in the web console. (BZ#2031529)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.3/index.html b/documentation/doc-Release_notes/modules/rn-2.3/index.html new file mode 100644 index 00000000000..467981f7016 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.3/index.html @@ -0,0 +1,156 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.3

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the VddkInitImage path is part of the procedure of adding VMware provider.
+

In the web console, you enter the VddkInitImage path when adding a VMware provider. Alternatively, from the CLI, you add the VddkInitImage path to the Provider CR for VMware migrations.

+
+
+
The StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS. The documentation includes a link to the relevant procedure.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Forklift 2.3 supports warm migration from oVirt
+

You can use warm migration to migrate VMs from both VMware and oVirt.

+
+
+
The minimal sufficient set of privileges for VMware users is established
+

VMware users do not have to have full cluster-admin privileges to perform a VM migration. The minimal sufficient set of user’s privileges is established and documented.

+
+
+
Forklift documentation is updated with instructions on using hooks
+

Forklift documentation includes instructions on adding hooks to migration plans and running hooks on VMs.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Some warm migrations from oVirt might fail
+

When you run a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run. (BZ#2063531)

+
+
+
Snapshots are not deleted after warm migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. You can delete the snapshots manually. (BZ#22053183)

+
+
+
Warm migration from oVirt fails if a snapshot operation is performed on the source VM
+

If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (BZ#2057459)

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

The problem occurs for both vSphere and oVirt migrations.

+
+
+
Forklift 2.3.4 only: When the source provider is oVirt, duplicating a migration plan fails in either the network mapping stage or the storage mapping stage.
+

Possible workaround: Delete cache in the browser or restart the browser. (BZ#2143191)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.4/index.html b/documentation/doc-Release_notes/modules/rn-2.4/index.html new file mode 100644 index 00000000000..dbbfaae7b4c --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.4/index.html @@ -0,0 +1,260 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.4

+
+
+
+

Migrate virtual machines (VMs) from VMware vSphere or oVirt or {osp} to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Faster disk image migration from oVirt
+

Disk images are not converted anymore using virt-v2v when migrating from oVirt. This change speeds up migrations and also allows migration for guest operating systems that are not supported by virt-vsv. (forklift-controller#403)

+
+
+
Faster disk transfers by ovirt-imageio client (ovirt-img)
+

Disk transfers use ovirt-imageio client (ovirt-img) instead of Containerized Data Import (CDI) when migrating from RHV to the local OpenShift Container Platform cluster, accelerating the migration.

+
+
+
Faster migration using conversion pod disk transfer
+

When migrating from vSphere to the local OpenShift Container Platform cluster, the conversion pod transfers the disk data instead of Containerized Data Importer (CDI), accelerating the migration.

+
+
+
Migrated virtual machines are not scheduled on the target OCP cluster
+

The migrated virtual machines are no longer scheduled on the target OpenShift Container Platform cluster. This enables migrating VMs that cannot start due to limit constraints on the target at migration time.

+
+
+
StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS.

+
+
+
VDDK 8 can be used in the VDDK image
+

Previous versions of Forklift supported only using VDDK version 7 for the VDDK image. Forklift supports both versions 7 and 8, as follows:

+
+
+
    +
  • +

    If you are migrating to OCP 4.12 or earlier, use VDDK version 7.

    +
  • +
  • +

    If you are migrating to OCP 4.13 or later, use VDDK version 8.

    +
  • +
+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
OpenStack migration
+

Forklift now supports migrations with {osp} as a source provider. This feature is a provided as a Technology Preview and only supports cold migrations.

+
+
+
OCP console plugin
+

The Forklift Operator now integrates the Forklift web console into the OKD web console. The new UI operates as an OCP Console plugin that adds the sub-menu Migration to the navigation bar. It is implemented in version 2.4, disabling the old UI. You can enable the old UI by setting feature_ui: true in ForkliftController. (MTV-427)

+
+
+
Skip certification option
+

'Skip certificate validation' option was added to VMware and oVirt providers. If selected, the provider’s certificate will not be validated and the UI will not ask for specifying a CA certificate.

+
+
+
Only third-party certificate required
+

Only the third-party certificate needs to be specified when defining a oVirt provider that sets with the Manager CA certificate.

+
+
+
Conversion of VMs with RHEL9 guest operating system
+

Cold migrations from vSphere to a local Red Hat OpenShift cluster use virt-v2v on RHEL 9. (MTV-332)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If deleting a migration plan and then running a new migration plan with the same name, or if deleting a migrated VM and then remigrate the source VM, then the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack don’t fail, but the encryption key may be missing on the target OCP cluster.

+
+
+
Snapshots that are created during the migration in OpenStack are not deleted
+

The Migration Controller service does not delete snapshots that are created during the migration for source virtual machines in OpenStack automatically. Workaround: the snapshots can be removed manually on OpenStack.

+
+
+
oVirt snapshots are not deleted after a successful migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. Workaround: Snapshots can be removed from oVirt instead. (MTV-349)

+
+
+
Migration fails during precopy/cutover while a snapshot operation is executed on the source VM
+

Some warm migrations from oVirt might fail. When running a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run.

+
+
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (MTV-456)

+
+
+
Cannot schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it may result in a VM that cannot be scheduled. Workaround: It is recommended to use shared storage on the target OCP cluster.

+
+
+
Deleting migrated VM does not remove PVC and PV
+

When removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) are not deleted. Workaround: remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

When a migration fails, its PVCs and PVs are not deleted as expected when its migration plan is archived and deleted. Workaround: Remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-493)

+
+
+
VM with multiple disks may boot from non-bootable disk after migration
+

VM with multiple disks that was migrated might not be able to boot on the target OCP cluster. Workaround: Set the boot order appropriately to boot from the bootable disk. (MTV-433)

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OCP clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OCP cluster. It is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system may start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, their network interfaces could be disabled when they start in OpenShift Virtualization. (MTV-491)

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. The user needs to refresh the OCP Console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of MTV, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in MTV 2.4.3 and 2.5.2. It is advised to update to one of these versions of MTV or later.

+
+ +
+
Improve invalid/conflicting VM name handling
+

Improve the automatic renaming of VMs during migration to fit RFC 1123. This feature that was introduced in 2.3.4 is enhanced to cover more special cases. (MTV-212)

+
+
+
Prevent locking user accounts due to incorrect credentials
+

If a user specifies an incorrect password for oVirt providers, they are no longer locked in oVirt. An error returns when the oVirt manager is accessible and adding the provider. If the oVirt manager is inaccessible, the provider is added, but there would be no further attempt after failing, due to incorrect credentials. (MTV-324)

+
+
+
Users without cluster-admin role can create new providers
+

Previously, the cluster-admin role was required to browse and create providers. In this release, users with sufficient permissions on MTV resources (providers, plans, migrations, NetworkMaps, StorageMaps, hooks) can operate MTV without cluster-admin permissions. (MTV-334)

+
+
+
Convert i440fx to q35
+

Migration of virtual machines with i440fx chipset is now supported. The chipset is converted to q35 during the migration. (MTV-430)

+
+
+
Preserve the UUID setting in SMBIOS for a VM that is migrated from oVirt
+

The Universal Unique ID (UUID) number within the System Management BIOS (SMBIOS) no longer changes for VMs that are migrated from oVirt. This enhancement enables applications that operate within the guest operating system and rely on this setting, such as for licensing purposes, to operate on the target OCP cluster in a manner similar to that of oVirt. (MTV-597)

+
+
+
Do not expose password for oVirt in error messages
+

Previously, the password that was specified for oVirt manager appeared in error messages that were displayed in the web console and logs when failing to connect to oVirt. In this release, error messages that are generated when failing to connect to oVirt do not reveal the password for oVirt manager.

+
+
+
QEMU guest agent is now installed on migrated VMs
+

The QEMU guest agent is installed on VMs during cold migration from vSphere. (BZ#2018062)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.5/index.html b/documentation/doc-Release_notes/modules/rn-2.5/index.html new file mode 100644 index 00000000000..89dd1136125 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.5/index.html @@ -0,0 +1,464 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.5

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, and known issues for Forklift.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version of Forklift, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

Forklift enables migrations from vSphere source providers by not enforcing Enterprise Master Secret (EMS). This enables migrating from all vSphere versions that Forklift supports, including migrations that do not meet 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of the create and update providers now aligns with the look and feel of the OKD web console and displays up-to-date data.

+
+
+
Standalone UI
+

The old UI of Forklift 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
Support deployment on {ocp-name} 4.15
+

Forklift 2.5.6 can be deployed on {ocp-name} 4.15 clusters.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration of OVA files from VMware vSphere
+

In Forklift 2.3, you can migrate using Open Virtual Appliance (OVA) files that were created by VMware vSphere as source providers. (MTV-336)

+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+

Unresolved directive in rn-2.5.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+
Migrating VMs between OKD clusters
+

In Forklift 2.3, you can now use Red Hat KubeVirt provider as a source provider and a destination provider. You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on. (MTV-571)

+
+
+
Migration of VMs with direct LUNs from RHV
+

During the migration from oVirt (oVirt), direct Logical Units (LUNs) are detached from the source virtual machines and attached to the target virtual machines. Note that this mechanism does not work yet for Fibre Channel. (MTV-329)

+
+
+
Additional authentication methods for OpenStack
+

In addition to standard password authentication, Forklift supports the following authentication methods: Token authentication and Application credential authentication. (MTV-539)

+
+
+
Validation rules for OpenStack
+

The validation service includes default validation rules for virtual machines from OpenStack. (MTV-508)

+
+
+
VDDK is now optional for VMware vSphere providers
+

You can now create the VMware vSphere source provider without specifying a VMware Virtual Disk Development Kit (VDDK) init image. It is strongly recommended you create a VDDK init image to accelerate migrations.

+
+
+
Deployment on OKE enabled
+

In Forklift 2.5.3, deployment on {ocp-name} Kubernetes Engine (OKE) has been enabled. For more information, see About {ocp-name} Kubernetes Engine. (MTV-803)

+
+
+
Migration of VMs to destination storage classes with encrypted RBD now supported
+

In Forklift 2.5.4, migration of VMs to destination storage classes that have encrypted RADOS Block Devices (RBD) volumes is now supported.

+
+
+

To make use of this new feature, set the value of the parameter controller_block_overhead to 1Gi, following the procedure in Configuring the MTV Operator. (MTV-851)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OKD cluster. This is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Import OVA: ConnectionTestFailed message appears when adding OVA provider
+

When adding an OVA provider, the error message ConnectionTestFailed can appear, although the provider is created successfully. If the message does not disappear after a few minutes and the provider status does not move to Ready, this means that the ova server pod creation has failed. (MTV-671)

+
+
+
Left over ovirtvolumepopulator from failed migration causes plan to stay indefinitely in CopyDisks phase
+

An outdated ovirtvolumepopulator in the namespace, left over from an earlier failed migration, stops a new plan of the same VM when it transitions to CopyDisks phase. The plan remains in that phase indefinitely. (MTV-929)

+
+
+
Unclear error message when Forklift fails to build a PVC
+

The migration fails to build the Persistent Volume Claim (PVC) if the destination storage class does not have a configured storage profile. The forklift-controller raises an error message without a clear reason for failing to create a PVC. (MTV-928)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Flaw was found in jsrsasign package which is vulnerable to Observable Discrepancy
+

Versions of the package jsrsasign before 11.0.0, used in earlier releases of Forklift, are vulnerable to Observable Discrepancy in the RSA PKCS1.5 or RSA-OAEP decryption process. This discrepancy means an attacker could decrypt ciphertexts by exploiting this vulnerability. However, exploiting this vulnerability requires the attacker to have access to a large number of ciphertexts encrypted with the same key. This issue has been resolved in Forklift 2.5.5 by upgrading the package jsrasign to version 11.0.0.

+
+
+

For more information, see CVE-2024-21484.

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of Forklift, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of MTV or later.

+
+ +
+
Gin Web Framework does not properly sanitize filename parameter of Context.FileAttachment function
+

A flaw was found in the Gin-Gonic Gin Web Framework, used by Forklift. The filename parameter of the Context.FileAttachment function was not properly sanitized. This flaw in the package could allow a remote attacker to bypass security restrictions caused by improper input validation by the filename parameter of the Context.FileAttachment function. A maliciously created filename could cause the Content-Disposition header to be sent with an unexpected filename value, or otherwise modify the Content-Disposition header.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+ +
+
CVE-2023-26144: mtv-console-plugin-container: graphql: Insufficient checks in the OverlappingFieldsCanBeMergedRule.ts
+

A flaw was found in the package GraphQL from 16.3.0 and before 16.8.1. This flaw means Forklift versions before Forklift 2.5.2 are vulnerable to Denial of Service (DoS) due to insufficient checks in the OverlappingFieldsCanBeMergedRule.ts file when parsing large queries. This issue may allow an attacker to degrade system performance. (MTV-712)

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
CVE-2023-45142: Memory leak found in the otelhttp handler of open-telemetry
+

A flaw was found in otelhttp handler of OpenTelemetry-Go. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to a memory leak caused by http.user_agent and http.method having unbound cardinality, which could allow a remote, unauthenticated attacker to exhaust the server’s memory by sending many malicious requests, affecting the availability. (MTV-795)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-45142.

+
+
+
CVE-2023-39322: QUIC connections do not set an upper bound on the amount of data buffered when reading post-handshake messages
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to QUIC connections not setting an upper bound on the amount of data buffered when reading post-handshake messages, allowing a malicious QUIC connection to cause unbounded memory growth. With the fix, connections now consistently reject messages larger than 65KiB in size. (MTV-708)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39322.

+
+
+
CVE-2023-39321: Processing an incomplete post-handshake message for a QUIC connection can cause a panic
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to processing an incomplete post-handshake message for a QUIC connection, which causes a panic. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39321.

+
+
+
CVE-2023-39319: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable, as the html/template package did not properly handle occurrences of <script, <!--, and </script within JavaScript literals in <script> contexts. This flaw could cause the template parser to improperly consider script contexts to be terminated early, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39319.

+
+
+
CVE-2023-39318: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable as the html/template package did not properly handle HMTL-like "" comment tokens, nor hashbang \#! comment tokens. This flaw could cause the template parser to improperly interpret the contents of <script> contexts, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39318.

+
+
+
Logs archive file downloaded from UI includes logs related to deleted migration plan/VM
+

In earlier releases of Forklift 2.3, the log files downloaded from UI could contain logs that are related to an earlier migration plan. (MTV-783)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Extending a VM disk in RHV is not reflected in the MTV inventory
+

In earlier releases of Forklift 2.3, the size of disks that are extended in RHV was not adequately monitored. This resulted in the inability to migrate virtual machines with extended disks from a RHV provider. (MTV-830)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Filesystem overhead configurable
+

In earlier releases of Forklift 2.3, the filesystem overhead for new persistent volumes was hard-coded to 10%. The overhead was insufficient for certain filesystem types, resulting in failures during cold-migrations from oVirt and OSP to the cluster where Forklift is deployed. In other filesystem types, the hard-coded overhead was too high, resulting in excessive storage consumption.

+
+
+

In Forklift 2.5.3, the filesystem overhead can be configured, as it is no longer hard-coded. If your migration allocates persistent volumes without CDI, you can adjust the file system overhead. You adjust the file system overhead by adding the following label and value to the spec portion of the forklift-controller CR:

+
+
+
+
spec:
+  `controller_filesystem_overhead: <percentage>` (1)
+
+
+
+
    +
  1. +

    The percentage of overhead. If this label is not added, the default value of 10% is used. This setting is valid only if the storageclass is filesystem. (MTV-699)

    +
  2. +
+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In earlier releases of Forklift, the create and update provider forms could have presented stale data.

+
+
+

This issue is resolved in Forklift 2.3, the new forms of create and update provider display up-to-date properties of the provider. (MTV-603)

+
+
+
Snapshots that are created during a migration in OpenStack are not deleted
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots that were created during a migration of source virtual machines in OpenStack automatically.

+
+
+

This issue is resolved in Forklift 2.3, all the snapshots created during the migration are removed after the migration has been completed. (MTV-620)

+
+
+
oVirt snapshots are not deleted after a successful migration
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots automatically after a successful warm migration of a VM from oVirt.

+
+
+

This issue is resolved in Forklift 2.3, the snapshots generated during migration are removed after a successful migration, and the original snapshots are not removed after a successful migration. (MTV-349)

+
+
+
Warm migration fails when cutover conflicts with precopy
+

In earlier releases of Forklift, the cutover operation failed when it was triggered while precopy was being performed. The VM was locked in oVirt and therefore the ovirt-engine rejected the snapshot creation, or disk transfer, operation.

+
+
+

This issue is resolved in Forklift 2.3, the cutover operation is triggered, but it is not performed at that time because the VM is locked. Once the precopy operation completes, the cutover operation is triggered. (MTV-686)

+
+
+
Warm migration fails when VM is locked
+

In earlier releases of Forklift, triggering a warm migration while there was an ongoing operation in oVirt that locked the VM caused the migration to fail because it could not trigger the snapshot creation.

+
+
+

This issue is resolved in Forklift 2.3, warm migration does not fail when an operation that locks the VM is performed in oVirt. The migration does not fail, but starts when the VM is unlocked. (MTV-687)

+
+
+
Deleting migrated VM does not remove PVC and PV
+

In earlier releases of Forklift, when removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) were not deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs and PVs are deleted when deleting migrated VM.(MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

In earlier releases of Forklift, when a migration failed, its PVCs and PVs were not deleted as expected when its migration plan was archived and deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs are deleted when archiving and deleting migration plan.(MTV-493)

+
+
+
VM with multiple disks can boot from a non-bootable disk after migration
+

In earlier releases of Forklift, VM with multiple disks that were migrated might not have been able to boot on the target OKD cluster.

+
+
+

This issue is resolved in Forklift 2.3, VM with multiple disks that are migrated can boot on the target OKD cluster. (MTV-433)

+
+
+
Transfer network not taken into account for cold migrations from vSphere
+

In Forklift releases 2.4.0-2.5.3, cold migrations from vSphere to the local cluster on which Forklift was deployed did not take a specified transfer network into account. This issue is resolved in Forklift 2.5.4. (MTV-846)

+
+
+
Fix migration of VMs with multi-boot guest operating system from vSphere
+

In Forklift 2.5.6, the virt-v2v arguments include –root first, which mitigates an issue with multi-boot VMs where the pod fails. This is a fix for a regression that was introduced in Forklift 2.4, in which the '--root' argument was dropped. (MTV-987)

+
+
+
Errors logged in populator pods are improved
+

In earlier releases of Forklift 2.3, populator pods were always restarted on failure. This made it difficult to gather the logs from the failed pods. In Forklift 2.5.3, the number of restarts of populator pods is limited to three times. On the third and final time, the populator pod remains in the fail status and its logs can then be easily gathered by must-gather and by forklift-controller to know this step has failed. (MTV-818)

+
+
+
npm IP package vulnerability
+

A vulnerability found in the Node.js Package Manager (npm) IP Package can allow an attacker to obtain sensitive information and obtain access to normally inaccessible resources. MTV-941

+
+
+

This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-42282

+
+
+
Flaw was found in the Golang net/http/internal package
+

A flaw was found in the versions of the Golang net/http/internal package, that were used in earlier releases of Forklift. This flaw could allow a malicious user to send an HTTP request and cause the receiver to read more bytes from the network than are in the body (up to 1GiB), causing the receiver to fail reading the response, possibly leading to a Denial of Service (DoS). This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-39326.

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+

Upgrade notes

+
+
+

It is recommended to upgrade from Forklift 2.4.2 to Forklift 2.3.

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: Remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. Refresh the OKD console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.6/index.html b/documentation/doc-Release_notes/modules/rn-2.6/index.html new file mode 100644 index 00000000000..dec12ab819f --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.6/index.html @@ -0,0 +1,511 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.6

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Simplified the creation of vSphere providers
+

In earlier releases of Forklift, users had to specify a fingerprint when creating a vSphere provider. This required users to retrieve the fingerprint from the server that vCenter runs on. Forklift no longer requires this fingerprint as an input, but rather computes it from the specified certificate in the case of a secure connection or automatically retrieves it from the server that runs vCenter/ESXi in the case of an insecure connection.

+
+
+
Redesigned the migration plan creation dialog
+

The user interface console has improved the process of creating a migration plan. The new migration plan dialog enables faster creation of migration plans.

+
+
+

It includes only the minimal settings that are required, while you can confirgure advanced settings separately. The new dialog also provides defaults for network and storage mappings, where applicable. The new dialog can also be invoked from the the Provider > Virtual Machines tab, after selecting the virtual machines to migrate. It also better aligns with the user experience in the OCP console.

+
+
+
virtual machine preferences have replaced {ocp-name} templates
+

The virtual machine preferences have replaced {ocp-name} templates. Forklift currently falls back to using {ocp-name} templates when a relevant preference is not available.

+
+
+

Custom mappings of guest operating system type to virtual machine preference can be configured using config maps. This is in order to use custom virtual machine preferences, or to support more guest operating system types.

+
+
+
Full support for migration from OVA
+

Migration from OVA moves from being a Technical Preview and is now a fully supported feature.

+
+
+
The VM is posted with its desired Running state
+

Forklift creates the VM with its desired Running state on the target provider, instead of creating the VM and then running it as an additional operation. (MTV-794)

+
+
+
The must-gather logs can now be loaded only by using the CLI
+

The Forklift web console can no longer download logs. With this update, you must download must-gather logs by using CLI commands. For more information, see Must Gather Operator.

+
+
+
Forklift no longer runs pvc-init pods when migrating from vSphere
+

Forklift no longer runs pvc-init pods during cold migration from a vSphere provider to the {ocp-name} cluster that Forklift is deployed on. However, in other flows where data volumes are used, they are set with the cdi.kubevirt.io/storage.bind.immediate.requested annotation, and CDI runs first-consume pods for storage classes with volume binding mode WaitForFirstConsumer.

+
+
+
+
+

New features and enhancements

+
+
+

This section provides features and enhancements introduced in Forklift 2.6.

+
+
+

New features and enhancements 2.6.3

+
+
Support for migrating LUKS-encrypted devices in migrations from vSphere
+

You can now perform cold migrations from a vSphere provider of VMs whose virtual disks are encrypted by Linux Unified Key Setup (LUKS). (MTV-831)

+
+
+
Specifying the primary disk when migrating from vSphere
+

You can now specify the primary disk when you migrate VMs from vSphere with more than one bootable disk. This avoids Forklift automatically attempting to convert the first bootable disk that it detects while it examines all the disks of a virtual machine. This feature is needed because the first bootable disk is not necessarily the disk that the VM is expected to boot from in KubeVirt. (MTV-1079)

+
+
+
Links to remote provider UIs
+

You can now remotely access the UI of a remote cluster when you create a source provider. For example, if the provider is a remote oVirt oVirt cluster, Forklift adds a link to the remote oVirt web console when you define the provider. This feature makes it easier for you to manage and debug a migration from remote clusters. (MTV-1054)

+
+
+
+

New features and enhancements 2.6.0

+
+
Migration from vSphere over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the server that runs vCenter or ESXi, depending on the specified SDK endpoint of the vSphere provider. (MTV-530)

+
+
+
Migration to or from a remote {ocp-name} over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the API server of a remote {ocp-name} cluster. (MTV-728)

+
+
+
Migration from an ESXi server without going through vCenter
+

Forklift enables the configuration of vSphere providers with the SDK of ESXi. You need to select ESXi as the Endpoint type of the vSphere provider and specify the URL of the SDK of the ESXi server. (MTV-514)

+
+
+
Migration of image-based VMs from {osp}
+

Forklift supports the migration of VMs that were created from images in {osp}. (MTV-644)

+
+
+
Migration of VMs with Fibre Channel LUNs from oVirt
+

Forklift supports migrations of VMs that are set with Fibre Channel (FC) LUNs from oVirt. As with other LUN disks, you need to ensure the {ocp-name} nodes have access to the FC LUNs. During the migrations, the FC LUNs are detached from the source VMs in oVirt and attached to the migrated VMs in {ocp-name}. (MTV-659)

+
+
+
Preserve CPU types of VMs that are migrated from oVirt
+

Forklift sets the CPU type of migrated VMs in {ocp-name} with their custom CPU type in oVirt. In addition, a new option was added to migration plans that are set with oVirt as a source provider to preserve the original CPU types of source VMs. When this option is selected, Forklift identifies the CPU type based on the cluster configuration and sets this CPU type for the migrated VMs, for which the source VMs are not set with a custom CPU. (MTV-547)

+
+
+
Validation for RHEL 6 guest operating system is now available when migrating VMs with RHEL 6 guest operating system
+

Red Hat Enterprise Linux (RHEL) 9 does not support RHEL 6 as a guest operating system. Therefore, RHEL 6 is not supported in {ocp-name} Virtualization. With this update, a validation of RHEL 6 guest operating system was added to {ocp-name} Virtualization. (MTV413)

+
+
+
Automatic retrieval of CA certificates for the provider’s URL in the console
+

The ability to retrieve CA certificates, which was available in previous versions, has been restored. The vSphere Verify certificate option is in the add-provider dialog. This option was removed in the transition to the OKD console and has now been added to the console. This functionality is also available for oVirt, {osp}, and {ocp-name} providers now. (MTV-737)

+
+
+
Validation of a specified VDDK image
+

Forklift validates the availability of a VDDK image that is specified for a vSphere provider on the target {ocp-name} name as part of the validation of a migration plan. Forklift also checks whether the libvixDiskLib.so symbolic link (symlink) exists within the image. If the validation fails, the migration plan cannot be started. (MTV-618)

+
+
+
Add a warning and partial support for TPM
+

Forklift presents a warning when attempting to migrate a VM that is set with a TPM device from oVirt or vSphere. The migrated VM in {ocp-name} would be set with a TPM device but without the content of the TPM device on the source environment. (MTV-378)

+
+
+
Plans that failed to migrate VMs can now be edited
+

With this update, you can edit plans that have failed to migrate any VMs. Some plans fail or are canceled because of incorrect network and storage mappings. You can now edit these plans until they succeed. (MTV-779)

+
+
+
Validation rules are now available for OVA
+

The validation service includes default validation rules for virtual machines from the Open Virtual Appliance (OVA). (MTV-669)

+
+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+

Resolved issues 2.6.7

+
+
Incorrect handling of quotes in ifcfg files
+

In earlier releases of Forklift, there was an issue with the incorrect handling of single and double quotes in interface configuration (ifcfg) files, which control the software interfaces for individual network devices. This issue has been resolved in Forklift 2.6.7, in order to cover additional IP configurations on Red Hat Enterprise Linux, CentOS, Rocky Linux and similar distributions. (MTV-1439)

+
+
+
Failure to preserve netplan based network configuration
+

In earlier releases of Forklift, there was an issue with the preservation of netplan-based network configurations. This issue has been resolved in Forklift 2.6.7, so that static IP configurations are preserved if netplan (netplan.io) is used by using the netplan configuration files to generate udev rules for known mac-address and ifname tuples. (MTV-1440)

+
+
+
Error messages are written into udev .rules files
+

In earlier releases of Forklift, there was an issue with the accidental leakage of error messages into udev .rules files. This issue has been resolved in Forklift 2.6.7, with a static IP persistence script added to the udev rule file. (MTV-1441)

+
+
+
+

Resolved issues 2.6.6

+
+
Runtime error: invalid memory address or nil pointer dereference
+

In earlier releases of Forklift, there was a runtime error of invalid memory address or nil pointer dereference caused by a pointer that was nil, and there was an attempt to access the value that it points to. This issue has been resolved in Forklift 2.6.6. (MTV-1353)

+
+
+
All Plan and Migration pods scheduled to same node causing the node to crash
+

In earlier releases of Forklift, the scheduler could place all migration pods on a single node. When this happened, the node ran out of the resources. This issue has been resolved in Forklift 2.6.6. (MTV-1354)

+
+
+
Empty bearer token is sufficient for authentication
+

In earlier releases of Forklift, a vulnerability was found in the Forklift Controller.  There is no verification against the authorization header, except to ensure it uses bearer authentication. Without an authorization header and a bearer token, a 401 error occurs. The presence of a token value provides a 200 response with the requested information. This issue has been resolved in Forklift 2.6.6.

+
+
+

For more details, see (CVE-2024-8509).

+
+
+
+

Resolved issues 2.6.5

+
+
VMware Linux interface name changes during migration
+

In earlier releases of Forklift, during the migration of Rocky Linux 8, CentOS 7.2 and later, and Ubuntu 22 virtual machines (VM) from VMware to OKD (OCP), the name of the network interfaces is modified, and the static IP configuration for the VM is no longer functional. This issue has been resolved for static IPs in Rocky Linux 8, Centos 7.2 and later, Ubuntu 22 in Forklift 2.6.5. (MTV-595)

+
+
+
+

Resolved issues 2.6.4

+
+
Disks and drives are offline after migrating Windows virtual machines from RHV or VMware to OCP
+

Windows (Windows 2022) VMs configured with multiple disks, which are Online before the migration, are Offline after a successful migration from oVirt or VMware to OKD, using Forklift. Only the C:\ primary disk is Online. This issue has been resolved for basic disks in Forklift 2.6.4. (MTV-1299)

+
+
+

For details of the known issue of dynamic disks being Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd, see (MTV-1344).

+
+
+
Preserve IP option for Windows does not preserve all settings
+

In earlier releases of Forklift, while migrating a Windows 2022 Server with a static IP address assigned, and selecting the Preserve static IPs option, after a successful Windows migration, while the node started and the IP address was preserved, the subnet mask, gateway, and DNS servers were not preserved. This resulted in an incomplete migration, and the customer was forced to log in locally from the console to fully configure the network. This issue has been resolved in Forklift 2.6.4. (MTV-1286)

+
+
+
qemu-guest-agent not being installed at first boot in Windows Server 2022
+

After a successful Windows 2022 server guest migration using Forklift 2.6.1, the qemu-guest-agent is not completely installed. The Windows Scheduled task is being created, however it is being set to run 4 hours in the future instead of the intended 2 minutes in the future. (MTV-1325)

+
+
+
+

Resolved issues 2.6.3

+
+
CVE-2024-24788: golang: net malformed DNS message can cause infinite loop
+

In earlier releases of Forklift, there was a flaw was discovered in the stdlib package of the Go programming language, which impacts previous versions of Forklift. This vulnerability primarily threatens web-facing applications and services that rely on Go for DNS queries. This issue has been resolved in Forklift 2.6.3.

+
+
+

For more details, see (CVE-2024-24788).

+
+
+
Migration scheduling does not take into account that virt-v2v copies disks sequentially (vSphere only)
+

In earlier releases of Forklift, there was a problem with the way Forklift interpreted the controller_max_vm_inflight setting for vSphere to schedule migrations. This issue has been resolved in Forklift 2.6.3. (MTV-1191)

+
+
+
Cold migrations fail after changing the ESXi network (vSphere only)
+

In earlier versions of Forklift, cold migrations from a vSphere provider with an ESXi SDK endpoint failed if any network was used except for the default network for disk transfers. This issue has been resolved in Forklift 2.6.3. (MTV-1180)

+
+
+
Warm migrations over an ESXi network are stuck in DiskTransfer state (vSphere only)
+

In earlier versions of Forklift, warm migrations over an ESXi network from a vSphere provider with a vCenter SDK endpoint were stuck in DiskTransfer state because Forklift was unable to locate image snapshots. This issue has been resolved in Forklift 2.6.3. (MTV-1161)

+
+
+
Leftover PVCs are in Lost state after cold migrations
+

In earlier versions of Forklift, after cold migrations, there were leftover PVCs that had a status of Lost instead of being deleted, even after the migration plan that created them was archived and deleted. Investigation showed that this was because importer pods were retained after copying, by default, rather than in only specific cases. This issue has been resolved in Forklift 2.6.3. (MTV-1095)

+
+
+
Guest operating system from vSphere might be missing (vSphere only)
+

In earlier versions of Forklift, some VMs that were imported from vSphere were not mapped to a template in OKD while other VMs, with the same guest operating system, were mapped to the corresponding template. Investigations indicated that this was because vSphere stopped reporting the operating system after not receiving updates from VMware tools for some time. This issue has been resolved in Forklift 2.6.3 by taking the value of the operating system from the output of the investigation that virt-v2v performs on the disks. (MTV-1046)

+
+
+
+

Resolved issues 2.6.2

+
+
CVE-2023-45288: Golang net/http, x/net/http2: unlimited number of CONTINUATION frames can cause a denial-of-service (DoS) attack
+

A flaw was discovered with the implementation of the HTTP/2 protocol in the Go programming language, which impacts previous versions of Forklift. There were insufficient limitations on the number of CONTINUATION frames sent within a single stream. An attacker could potentially exploit this to cause a denial-of-service (DoS) attack. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45288).

+
+
+
CVE-2024-24785: mtv-api-container: Golang html/template: errors returned from MarshalJSON methods may break template escaping
+

A flaw was found in the html/template Golang standard library package, which impacts previous versions of Forklift. If errors returned from MarshalJSON methods contain user-controlled data, they may be used to break the contextual auto-escaping behavior of the HTML/template package, allowing subsequent actions to inject unexpected content into the templates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24785).

+
+
+
CVE-2024-24784: mtv-validation-container: Golang net/mail: comments in display names are incorrectly handled
+

A flaw was found in the net/mail Golang standard library package, which impacts previous versions of Forklift. The ParseAddressList function incorrectly handles comments, text in parentheses, and display names. As this is a misalignment with conforming address parsers, it can result in different trust decisions being made by programs using different parsers. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24784).

+
+
+
CVE-2024-24783: mtv-api-container: Golang crypto/x509: Verify panics on certificates with an unknown public key algorithm
+

A flaw was found in the crypto/x509 Golang standard library package, which impacts previous versions of Forklift. Verifying a certificate chain that contains a certificate with an unknown public key algorithm causes Certificate.Verify to panic. This affects all crypto/tls clients and servers that set Config.ClientAuth to VerifyClientCertIfGiven or RequireAndVerifyClientCert. The default behavior is for TLS servers to not verify client certificates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24783).

+
+
+
CVE-2023-45290: mtv-api-container: Golang net/http memory exhaustion in Request.ParseMultipartForm
+

A flaw was found in the net/http Golang standard library package, which impacts previous versions of Forklift. When parsing a multipart form, either explicitly with Request.ParseMultipartForm or implicitly with Request.FormValue, Request.PostFormValue, or Request.FormFile, limits on the total size of the parsed form are not applied to the memory consumed while reading a single form line. This permits a maliciously crafted input containing long lines to cause the allocation of arbitrarily large amounts of memory, potentially leading to memory exhaustion. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45290).

+
+
+
ImageConversion does not run when target storage is set with WaitForFirstConsumer (WFFC)
+

In earlier releases of Forklift, migration of VMs failed because the migration was stuck in the AllocateDisks phase. As a result of being stuck, the migration did not progress, and PVCs were not bound. The root cause of the issue was that ImageConversion did not run when target storage was set for wait-for-first-consumer. The problem was resolved in Forklift 2.6.2. (MTV-1126)

+
+
+
forklift-controller panics when importing VMs with direct LUNs
+

In earlier releases of Forklift, forklift-controller panicked when a user attempted to import VMs that had direct LUNs. The problem was resolved in Forklift 2.6.2. (MTV-1134)

+
+
+
+

Resolved issues 2.6.1

+
+
VMs with multiple disks that are migrated from vSphere and OVA files are not being fully copied
+

In Forklift 2.6.0, there was a problem in copying VMs with multiple disks from VMware vSphere and from OVA files. The migrations appeared to succeed but all the disks were transferred to the same PV in the target environment while other disks were empty. In some cases, bootable disks were overridden, so the VM could not boot. In other cases, data from the other disks was missing. The problem was resolved in Forklift 2.6.1. (MTV-1067)

+
+
+
Migrating VMs from one OKD cluster to another fails due to a timeout
+

In Forklift 2.6.0, migrations from one OKD cluster to another failed when the time to transfer the disks of a VM exceeded the time to live (TTL) of the Export API in {ocp-name}, which was set to 2 hours by default. The problem was resolved in Forklift 2.6.1 by setting the default TTL of the Export API to 12 hours, which greatly reduces the possibility of an expiration of the Export API. Additionally, you can increase or decrease the TTL setting as needed. (MTV-1052)

+
+
+
Forklift forklift-controller pod crashes when receiving a disk without a datastore
+

In earlier releases of Forklift, if a VM was configured with a disk that was on a datastore that was no longer available in vSphere at the time a migration was attempted, the forklift-controller crashed, rendering Forklift unusable. In Forklift 2.6.1, Forklift presents a critical validation for VMs with such disks, informing users of the problem, and the forklift-controller no longer crashes, although it cannot transfer the disk. (MTV-1029)

+
+
+
+

Resolved issues 2.6.0

+
+
Deleting an OVA provider automatically also deletes the PV
+

In earlier releases of Forklift, the PV was not removed when the OVA provider was deleted. This has been resolved in Forklift 2.6.0, and the PV is automatically deleted when the OVA provider is deleted. (MTV-848)

+
+
+
Fix for data being lost when migrating VMware VMs with snapshots
+

In earlier releases of Forklift, when migrating a VM that has a snapshot from VMware, the VM that was created in {ocp-name} Virtualization contained the data in the snapshot but not the latest data of the VM. This has been resolved in Forklift 2.6.0. (MTV-447)

+
+
+
Canceling and deleting a failed migration plan does not clean up the populate pods and PVC
+

In earlier releases of Forklift, when you canceled and deleted a failed migration plan, and after creating a PVC and spawning the populate pods, the populate pods and PVC were not deleted. You had to delete the pods and PVC manually. This issue has been resolved in Forklift 2.6.0. (MTV-678)

+
+
+
OKD to OKD migrations require the cluster version to be 4.13 or later
+

In earlier releases of Forklift, when migrating from OKD to OKD, the version of the source provider cluster had to be OKD version 4.13 or later. This issue has been resolved in Forklift 2.6.0, with validation being shown when migrating from versions of {ocp-name} before 4.13. (MTV-734)

+
+
+
Multiple storage domains from RHV were always mapped to a single storage class
+

In earlier releases of Forklift, multiple disks from different storage domains were always mapped to a single storage class, regardless of the storage mapping that was configured. This issue has been resolved in Forklift 2.6.0. (MTV-1008)

+
+
+
Firmware detection by virt-v2v
+

In earlier releases of Forklift, a VM that was migrated from an OVA that did not include the firmware type in its OVF configuration was set with UEFI. This was incorrect for VMs that were configured with BIOS. This issue has been resolved in Forklift 2.6.0, as Forklift now consumes the firmware that is detected by virt-v2v during the conversion of the disks. (MTV-759)

+
+
+
Creating a host secret requires validation of the secret before creation of the host
+

In earlier releases of Forklift, when configuring a transfer network for vSphere hosts, the console plugin created the Host CR before creating its secret. The secret should be specified first in order to validate it before the Host CR is posted. This issue has been resolved in Forklift 2.6.0. (MTV-868)

+
+
+
When adding OVA provider a ConnectionTestFailed message appears
+

In earlier releases of Forklift, when adding an OVA provider, the error message ConnectionTestFailed instantly appeared, although the provider had been created successfully. This issue has been resolved in Forklift 2.6.0. (MTV-671)

+
+
+
RHV provider ConnectionTestSucceeded True response from the wrong URL
+

In earlier releases of Forklift, the ConnectionTestSucceeded condition was set to True even when the URL was different than the API endpoint for the RHV Manager. This issue has been resolved in Forklift 2.6.0. (MTV-740)

+
+
+
Migration does not fail when a vSphere Data Center is nested inside a folder
+

In earlier releases of Forklift, migrating a VM that is placed in a Data Center that is stored directly under the /vcenter in vSphere succeeded. However, it failed when the Data Center was stored inside a folder. This issue was resolved in Forklift 2.6.0. (MTV-796)

+
+
+
The OVA inventory watcher detects deleted files
+

The OVA inventory watcher detects files changes, including deleted files. Updates from the ova-provider-server pod are now sent every five minutes to the forklift-controller pod that updates the inventory. (MTV-733)

+
+
+
Unclear error message when Forklift fails to build or create a PVC
+

In earlier releases of Forklift, the error logs lacked clear information to identify the reason for a failure to create a PV on a destination storage class that does not have a configured storage profile. This issue was resolved in Forklift 2.6.0. (MTV-928)

+
+
+
Plans stay indefinitely in the CopyDisks phase when there is an outdated ovirtvolumepopulator
+

In earlier releases of Forklift, an earlier failed migration could have left an outdated ovirtvolumepopulator. When starting a new plan for the same VM to the same project, the CreateDataVolumes phase did not create populator PVCs when transitioning to CopyDisks, causing the CopyDisks phase to stay indefinitely. This issue was resolved in Forklift 2.6.0. (MTV-929)

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+ + + + + +
+
Warning
+
+
Warm migration and remote migration flows are impacted by multiple bugs
+
+

Warm migration and remote migration flows are impacted by multiple bugs. It is strongly recommended to fall back to cold migration until this issue is resolved. (MTV-1366)

+
+
+
+
+
Migrating older Linux distributions from VMware to OKD, the name of the network interfaces changes
+

When migrating older Linux distributions, such as CentOS 7.0 and 7.1, virtual machines (VMs) from VMware to OKD, the name of the network interfaces changes, and the static IP configuration for the VM no longer functions. This issue is caused by RHEL 7.0 and 7.1 still requiring virtio-transitional. Workaround: Manually update the guest to RHEL 7.2 or update the VM specification post-migration to use transitional. (MTV-1382)

+
+
+
Dynamic disks are offline in Windows Server 2022 after migration from vSphere to CNV with ceph-rbd
+

The dynamic disks are Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd. (MTV-1344)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during a conversion (vSphere only)
+

vSphere only: Migrations from oVirt and {osp} do not fail, but the encryption key might be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage class of type hostPath
+

When migrating a VM with multiple disks to more than one storage class of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support the same guest operating systems that are supported in cold migrations and migrations to the local OKD cluster. RHEL 8 and RHEL 9 might cause this limitation.

+
+ +
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as a guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Migration of a VM with NVME disks from vSphere fails
+

When migrating a virtual machine (VM) with NVME disks from vSphere, the migration process fails, and the Web Console shows that the Convert image to kubevirt stage is running but did not finish successfully. (MTV-963)

+
+
+
Importing image-based VMs can fail
+

Migrating an image-based VM without the virtual_size field can fail on a block mode storage class. (MTV-946)

+
+
+
Deleting a migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Migrating VMs with independent persistent disks from VMware to OCP-V fails
+

Migrating VMs with independent persistent disks from VMware to OCP-V fails. (MTV-993)

+
+
+
Guest operating system from vSphere might be missing
+

When vSphere does not receive updates about the guest operating system from the VMware tools, it considers the information about the guest operating system to be outdated and ceases to report it. When this occurs, Forklift is unaware of the guest operating system of the VM and is unable to associate it with the appropriate virtual machine preference or {ocp-name} template. (MTV-1046)

+
+
+
Failure to migrate an image-based VM from {osp} to the default project
+

The migration process fails when migrating an image-based VM from {osp} to the default project. (MTV-964)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-2.7/index.html b/documentation/doc-Release_notes/modules/rn-2.7/index.html new file mode 100644 index 00000000000..3f3e6c1af42 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.7/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.7

+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere versions 6, 7, and 8

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/rn-27-resolved-issues/index.html b/documentation/doc-Release_notes/modules/rn-27-resolved-issues/index.html new file mode 100644 index 00000000000..bb1bd0bb729 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-27-resolved-issues/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Resolved issues

+
+
+
+

Forklift 2.7 has the following resolved issues:

+
+
+
+
+

Resolved issues 2.7.3

+
+
+
Migration plan does not fail when conversion pod fails
+

In earlier releases of Forklift, when running the virt-v2v guest conversion, the migration plan did not fail if the conversion pod failed, as expected. This issue has been resolved in Forklift 2.7.3. (MTV-1569)

+
+
+
Large number of VMs in the inventory can cause the inventory controller to panic
+

In earlier releases of Forklift, having a large number of virtual machines (VMs) in the inventory could cause the inventory controller to panic and return a concurrent write to websocket connection warning. This issue was caused by the concurrent write to the WebSocket connection and has been addressed by the addition of a lock, so the Go routine waits before sending the response from the server. This issue has been resolved in Forklift 2.7.3. (MTV-1220)

+
+
+
VM selection disappears when selecting multiple VMs in the Migration Plan
+

In earlier releases of Forklift, VM selection checkbox disappeared after selecting multiple VMs in the Migration Plan. This issue has been resolved in Forklift 2.7.3. (MTV-1546)

+
+
+
forklift-controller crashing during OVA plan migration
+

In earlier releases of Forklift, the forklift-controller would crash during an OVA plan migration, returning a runtime error: invalid memory address or nil pointer dereference panic.  This issue has been resolved in Forklift 2.7.3. (MTV-1577)

+
+
+
+
+

Resolved issues 2.7.2

+
+
+
VMNetworksNotMapped error occurs after creating a plan from the UI with the source provider set to KubeVirt
+

In earlier releases of Forklift, after creating a plan with an KubeVirt source provider, the Migration Plan failed with the error The plan is not ready - VMNetworksNotMapped. This issue has been resolved in Forklift 2.7.2. (MTV-1201)

+
+
+
Migration Plan for KubeVirt to KubeVirt missing the source namespace causing VMNetworkNotMapped error
+

In earlier releases of Forklift, when creating a Migration Plan for an KubeVirt to KubeVirt migration using the Plan Creation Form, the network map generated was missing the source namespace, which caused a VMNetworkNotMapped error on the plan. This issue has been resolved in Forklift 2.7.2. (MTV-1297)

+
+
+
DV, PVC, and PV are not cleaned up and removed if the migration plan is Archived and Deleted
+

In earlier releases of Forklift, the DataVolume (DV), PersistentVolumeClaim (PVC), and PersistentVolume (PV) continued to exist after the migration plan was archived and deleted. This issue has been resolved in Forklift 2.7.2. (MTV-1477)

+
+
+
Other migrations are halted from starting as the scheduler is waiting for the complete VM to get transferred
+

In earlier releases of Forklift, when warm migrating a virtual machine (VM) that has several disks, you had to wait for the complete VM to get migrated, and the scheduler was halted until all the disks finished before the migration would be started. This issue has been resolved in Forklift 2.7.2. (MTV-1537)

+
+
+
Warm migration is not functioning as expected
+

In earlier releases of Forklift, warm migration did not function as expected. When running the warm migration with VMs larger than the MaxInFlight disks, the VMs over this number did not start the migration until the cutover. This issue has been resolved in Forklift 2.7.2. (MTV-1543)

+
+
+
Migration hanging due to error: virt-v2v: error: -i libvirt: expecting a libvirt guest name
+

In earlier releases of Forklift, when attempting to migrate a VMware VM with a non-compliant Kubernetes name, the Openshift console returned a warning that the VM would be renamed. However, after starting the Migration Plan, it hangs since the migration pod is in an Error state. This issue has been resolved in Forklift 2.7.2. This issue has been resolved in Forklift 2.7.2. (MTV-1555)

+
+
+
VMs are not migrated if they have more disks than MAX_VM_INFLIGHT
+

In earlier releases of Forklift, when migrating the VM using the warm migration, if there were more disks than the MAX_VM_INFLIGHT the VM was not scheduled and the migration was not started. This issue has been resolved in Forklift 2.7.2. (MTV-1573)

+
+
+
Migration Plan returns an error even when Changed Block Tracking (CBT) is enabled
+

In earlier releases of Forklift, when running a VM in VMware, if the CBT flag was enabled while the VM was running by adding both ctkEnabled=TRUE and scsi0:0.ctkEnabled=TRUE parameters, an error message Danger alert:The plan is not ready - VMMissingChangedBlockTracking was returned, and the migration plan was prevented from working. This issue has been resolved in Forklift 2.7.2. (MTV-1576)

+
+
+
+
+

Resolved issues 2.7.0

+
+
+
Change . to - in the names of VMs that are migrated
+

In earlier releases of Forklift, if the name of the virtual machines (VMs) contained ., this was changed to - when they were migrated. This issue has been resolved in Forklift 2.7.0. (MTV-1292)

+
+
+
Status condition indicating a failed mapping resource in a plan is not added to the plan
+

In earlier releases of Forklift, a status condition indicating a failed mapping resource of a plan was not added to the plan. This issue has been resolved in Forklift 2.7.0, with a status condition indicating the failed mapping being added. (MTV-1461)

+
+
+
ifcfg files with HWaddr cause the NIC name to change
+

In earlier releases of Forklift, interface configuration (ifcfg) files with a hardware address (HWaddr) of the Ethernet interface caused the name of the network interface controller (NIC) to change. This issue has been resolved in Forklift 2.7.0. (MTV-1463)

+
+
+
Import fails with special characters in VMX file
+

In earlier releases of Forklift, imports failed when there were special characters in the parameters of the VMX file. This issue has been resolved in Forklift 2.7.0. (MTV-1472)

+
+
+
Observed invalid memory address or nil pointer dereference panic
+

In earlier releases of Forklift, an invalid memory address or nil pointer dereference panic was observed, which was caused by a refactor and could be triggered when there was a problem with the inventory pod. This issue has been resolved in Forklift 2.7.0. (MTV-1482)

+
+
+
Static IPv4 changed after warm migrating win2022/2019 VMs
+

In earlier releases of Forklift, the static Internet Protocol version 4 (IPv4) address was changed after a warm migration of Windows Server 2022 and Windows Server 2019 VMs. This issue has been resolved in Forklift 2.7.0. (MTV-1491)

+
+
+
Warm migration is missing arguments
+

In earlier releases of Forklift, virt-v2v-in-place for the warm migration was missing arguments that were available in virt-v2v for the cold migration. This issue has been resolved in Forklift 2.7.0. (MTV-1495)

+
+
+
Default gateway settings changed after migrating Windows Server 2022 VMs with preserve static IPs
+

In earlier releases of Forklift, the default gateway settings were changed after migrating Windows Server 2022 VMs with the preserve static IPs setting. This issue has been resolved in Forklift 2.7.0. (MTV-1497)

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/running-migration-plan/index.html b/documentation/doc-Release_notes/modules/running-migration-plan/index.html new file mode 100644 index 00000000000..b1a854bc519 --- /dev/null +++ b/documentation/doc-Release_notes/modules/running-migration-plan/index.html @@ -0,0 +1,135 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Running a migration plan

+
+

You can run a migration plan and view its progress in the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Valid migration plan.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
    +

    The Plans list displays the source and target providers, the number of virtual machines (VMs) being migrated, the status, and the description of each plan.

    +
    +
  2. +
  3. +

    Click Start beside a migration plan to start the migration.

    +
  4. +
  5. +

    Click Start in the confirmation window that opens.

    +
    +

    The Migration details by VM screen opens, displaying the migration’s progress

    +
    +
    +

    Warm migration only:

    +
    +
    +
      +
    • +

      The precopy stage starts.

      +
    • +
    • +

      Click Cutover to complete the migration.

      +
    • +
    +
    +
  6. +
  7. +

    If the migration fails:

    +
    +
      +
    1. +

      Click Get logs to retrieve the migration logs.

      +
    2. +
    3. +

      Click Get logs in the confirmation window that opens.

      +
    4. +
    5. +

      Wait until Get logs changes to Download logs and then click the button to download the logs.

      +
    6. +
    +
    +
  8. +
  9. +

    Click a migration’s Status, whether it failed or succeeded or is still ongoing, to view the details of the migration.

    +
    +

    The Migration details by VM screen opens, displaying the start and end times of the migration, the amount of data copied, and a progress pipeline for each VM being migrated.

    +
    +
  10. +
  11. +

    Expand an individual VM to view its steps and the elapsed time and state of each step.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/index.html b/documentation/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/index.html new file mode 100644 index 00000000000..3dbc80c07a6 --- /dev/null +++ b/documentation/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a KubeVirt provider

+
+

You can select a default migration network for a KubeVirt provider in the OKD web console to improve performance. The default migration network is used to transfer disks to the namespaces in which it is configured.

+
+
+

If you do not select a migration network, the default migration network is the pod network, which might not be optimal for disk transfer.

+
+
+ + + + + +
+
Note
+
+
+

You can override the default migration network of the provider by selecting a different network when you create a migration plan.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    On the right side of the provider, select Select migration network from the {kebab}.

    +
  4. +
  5. +

    Select a network from the list of available networks and click Select.

    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/index.html b/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/index.html new file mode 100644 index 00000000000..5e8b8f18a43 --- /dev/null +++ b/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,142 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a VMware source provider

+
+

You can select a migration network in the OKD web console for a source provider to reduce risk to the source environment and to improve performance.

+
+
+

Using the default network for migration can result in poor performance because the network might not have sufficient bandwidth. This situation can have a negative effect on the source platform because the disk transfer operation might saturate the network.

+
+
+

Unresolved directive in selecting-migration-network-for-vmware-source-provider.adoc - include::snip_vmware_esxi_nfc.adoc[]

+
+
+
Prerequisites
+
    +
  • +

    The migration network must have sufficient throughput, minimum speed of 10 Gbps, for disk transfer.

    +
  • +
  • +

    The migration network must be accessible to the KubeVirt nodes through the default gateway.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The source virtual disks are copied by a pod that is connected to the pod network of the target namespace.

    +
    +
    +
    +
  • +
  • +

    The migration network should have jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click the host number in the Hosts column beside a provider to view a list of hosts.

    +
  4. +
  5. +

    Select one or more hosts and click Select migration network.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Network: Network name

      +
    • +
    • +

      ESXi host admin username: For example, root

      +
    • +
    • +

      ESXi host admin password: Password

      +
    • +
    +
    +
  8. +
  9. +

    Click Save.

    +
  10. +
  11. +

    Verify that the status of each host is Ready.

    +
    +

    If a host status is not Ready, the host might be unreachable on the migration network or the credentials might be incorrect. You can modify the host configuration and save the changes.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/selecting-migration-network/index.html b/documentation/doc-Release_notes/modules/selecting-migration-network/index.html new file mode 100644 index 00000000000..c62b1f69eeb --- /dev/null +++ b/documentation/doc-Release_notes/modules/selecting-migration-network/index.html @@ -0,0 +1,118 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a source provider

+
+

You can select a migration network for a source provider in the Forklift web console for improved performance.

+
+
+

If a source network is not optimal for migration, a Warning icon is displayed beside the host number in the Hosts column of the provider list.

+
+
+
Prerequisites
+

The migration network has the following prerequisites:

+
+
+
    +
  • +

    Minimum speed of 10 Gbps.

    +
  • +
  • +

    Accessible to the OpenShift nodes through the default gateway. The source disks are copied by a pod that is connected to the pod network of the target namespace.

    +
  • +
  • +

    Jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Click Providers.

    +
  2. +
  3. +

    Click the host number of a provider to view the host list and network details.

    +
  4. +
  5. +

    Select the host to be updated and click Select migration network.

    +
  6. +
  7. +

    Select a Network from the list of available networks.

    +
    +

    The network list displays only the networks accessible to all the selected hosts. The hosts must have

    +
    +
  8. +
  9. +

    Click Check connection to verify the credentials.

    +
  10. +
  11. +

    Click Select to select the migration network.

    +
    +

    The migration network appears in the network details of the updated hosts.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip-certificate-options/index.html b/documentation/doc-Release_notes/modules/snip-certificate-options/index.html new file mode 100644 index 00000000000..ded6a1417f6 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip-certificate-options/index.html @@ -0,0 +1,114 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  2. +
  3. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip-migrating-luns/index.html b/documentation/doc-Release_notes/modules/snip-migrating-luns/index.html new file mode 100644 index 00000000000..c319896f0e4 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip-migrating-luns/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_cold-warm-comparison-table/index.html b/documentation/doc-Release_notes/modules/snip_cold-warm-comparison-table/index.html new file mode 100644 index 00000000000..b931c08d002 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_cold-warm-comparison-table/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Both cold migration and warm migration have advantages and disadvantages, as described in the table that follows:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Advantages and disadvantages of cold and warm migrations
Cold migrationWarm migration

Duration

Correlates to the amount of data on the disks

Correlates to the amount of data on the disks and VM utilization

Data transferred

Approximate sum of all disks

Approximate sum of all disks and VM utilization

VM downtime

High

Low

+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_measured_boot_windows_vm/index.html b/documentation/doc-Release_notes/modules/snip_measured_boot_windows_vm/index.html new file mode 100644 index 00000000000..422ba0242e6 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_measured_boot_windows_vm/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_performance/index.html b/documentation/doc-Release_notes/modules/snip_performance/index.html new file mode 100644 index 00000000000..011a47a1573 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_performance/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_permissions-info/index.html b/documentation/doc-Release_notes/modules/snip_permissions-info/index.html new file mode 100644 index 00000000000..ac706c2b377 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_permissions-info/index.html @@ -0,0 +1,85 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

If you are an administrator, you can see and work with components (providers, plans, etc.) for all projects.

+
+
+

If you are a non-administrator, you can only see and work only with the components of projects you have permissions for.

+
+
+ + + + + +
+
Tip
+
+
+

You can see which projects you have permissions for by clicking the Project list, which is in the upper-left of every page in the Migrations section except for the Overview.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_plan-limits/index.html b/documentation/doc-Release_notes/modules/snip_plan-limits/index.html new file mode 100644 index 00000000000..69b4b5c45e1 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_plan-limits/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_qemu-guest-agent/index.html b/documentation/doc-Release_notes/modules/snip_qemu-guest-agent/index.html new file mode 100644 index 00000000000..706a2520dee --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_qemu-guest-agent/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

VMware only: In cold migrations, in situations in which a package manager cannot be used during the migration, Forklift does not install the qemu-guest-agent daemon on the migrated VMs. This has some impact on the functionality of the migrated VMs, but overall, they are still expected to function.

+
+
+

To enable Forklift to automatically install qemu-guest-agent on the migrated VMs, ensure that your package manager can install the daemon during the first boot of the VM after migration.

+
+
+

If that is not possible, use your preferred automated or manual procedure to install qemu-guest-agent manually.

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_secure_boot_issue/index.html b/documentation/doc-Release_notes/modules/snip_secure_boot_issue/index.html new file mode 100644 index 00000000000..bbd6bab953a --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_secure_boot_issue/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_vmware-name-change/index.html b/documentation/doc-Release_notes/modules/snip_vmware-name-change/index.html new file mode 100644 index 00000000000..649d713f614 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_vmware-name-change/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_vmware-permissions/index.html b/documentation/doc-Release_notes/modules/snip_vmware-permissions/index.html new file mode 100644 index 00000000000..ea5a1f3e484 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_vmware-permissions/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snip_vmware_esxi_nfc/index.html b/documentation/doc-Release_notes/modules/snip_vmware_esxi_nfc/index.html new file mode 100644 index 00000000000..7f3630ca336 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip_vmware_esxi_nfc/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+

You can also control the network from which disks are transferred from a host by using the Network File Copy (NFC) service in vSphere.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_cli/index.html b/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 00000000000..0670ac7546e --- /dev/null +++ b/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_cli/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

+
+
+
+
$ kubectl get route virt -n konveyor-forklift \
+  -o custom-columns=:.spec.host
+
+
+
+

+ +The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

+
+
+

+ +.Example output

+
+
+
+
https://virt-konveyor-forklift.apps.cluster.openshift.com.
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/index.html b/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/index.html new file mode 100644 index 00000000000..15275919b32 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/index.html @@ -0,0 +1,84 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Log in to the OKD web console.

    +
  2. +
  3. +

    Click NetworkingRoutes.

    +
  4. +
  5. +

    Select the {namespace} project in the Project: list.

    +
    +

    The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

    +
    +
    +

    Click the URL to navigate to the Forklift web console.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/snippet_ova_tech_preview/index.html b/documentation/doc-Release_notes/modules/snippet_ova_tech_preview/index.html new file mode 100644 index 00000000000..27ec75b9bf9 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snippet_ova_tech_preview/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

+
+
+ + + + + +
+
Important
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/source-vm-prerequisites/index.html b/documentation/doc-Release_notes/modules/source-vm-prerequisites/index.html new file mode 100644 index 00000000000..c85add9fd7e --- /dev/null +++ b/documentation/doc-Release_notes/modules/source-vm-prerequisites/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Source virtual machine prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    ISO/CDROM disks must be unmounted.

    +
  • +
  • +

    Each NIC must contain one IPv4 and/or one IPv6 address.

    +
  • +
  • +

    The operating system of a VM must be certified and supported as a guest operating system with KubeVirt.

    +
  • +
  • +

    The name of a VM must not contain a period (.). Forklift changes any period in a VM name to a dash (-).

    +
  • +
  • +

    The name of a VM must not be the same as any other VM in the KubeVirt environment.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    Forklift automatically assigns a new name to a VM that does not comply with the rules.

    +
    +
    +

    Forklift makes the following changes when it automatically generates a new VM name:

    +
    +
    +
      +
    • +

      Excluded characters are removed.

      +
    • +
    • +

      Uppercase letters are switched to lowercase letters.

      +
    • +
    • +

      Any underscore (_) is changed to a dash (-).

      +
    • +
    +
    +
    +

    This feature allows a migration to proceed smoothly even if someone enters a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/storage-support/index.html b/documentation/doc-Release_notes/modules/storage-support/index.html new file mode 100644 index 00000000000..5ca3795889c --- /dev/null +++ b/documentation/doc-Release_notes/modules/storage-support/index.html @@ -0,0 +1,211 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Storage support and default modes

+
+

Forklift uses the following default volume and access modes for supported storage.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Default volume and access modes
ProvisionerVolume modeAccess mode

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

+
+ + + + + +
+
Note
+
+
+

If the KubeVirt storage does not support dynamic provisioning, you must apply the following settings:

+
+
+
    +
  • +

    Filesystem volume mode

    +
    +

    Filesystem volume mode is slower than Block volume mode.

    +
    +
  • +
  • +

    ReadWriteOnce access mode

    +
    +

    ReadWriteOnce access mode does not support live virtual machine migration.

    +
    +
  • +
+
+
+

See Enabling a statically-provisioned storage class for details on editing the storage profile.

+
+
+
+
+ + + + + +
+
Note
+
+
+

If your migration uses block storage and persistent volumes created with an EXT4 file system, increase the file system overhead in CDI to be more than 10%. The default overhead that is assumed by CDI does not completely include the reserved place for the root partition. If you do not increase the file system overhead in CDI by this amount, your migration might fail.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When migrating from OpenStack or running a cold-migration from RHV to the OCP cluster that MTV is deployed on, the migration allocates persistent volumes without CDI. In these cases, you might need to adjust the file system overhead.

+
+
+

If the configured file system overhead, which has a default value of 10%, is too low, the disk transfer will fail due to lack of space. In such a case, you would want to increase the file system overhead.

+
+
+

In some cases, however, you might want to decrease the file system overhead to reduce storage consumption.

+
+
+

You can change the file system overhead by changing the value of the controller_filesystem_overhead in the spec portion of the forklift-controller CR, as described in Configuring the MTV Operator.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/technical-changes-2-7/index.html b/documentation/doc-Release_notes/modules/technical-changes-2-7/index.html new file mode 100644 index 00000000000..1dbd520b49d --- /dev/null +++ b/documentation/doc-Release_notes/modules/technical-changes-2-7/index.html @@ -0,0 +1,73 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Technical changes

+
+

Forklift 2.7 has the following technical changes:

+
+
+
Upgraded virt-v2v to RHEL9 for warm migrations
+

Forklift previously used virt-v2v from Red Hat Enterprise Linux (RHEL) 8, which does not include bug fixes and features that are available in virt-v2v in RHEL9. In Forklift 2.7.0, components are updated to RHEL 9 in order to improve the functionality of warm migration. (MTV-1152)

+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/technology-preview/index.html b/documentation/doc-Release_notes/modules/technology-preview/index.html new file mode 100644 index 00000000000..7ecdb2fa8cc --- /dev/null +++ b/documentation/doc-Release_notes/modules/technology-preview/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

{FeatureName} is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/index.html b/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/index.html new file mode 100644 index 00000000000..e46484dbe39 --- /dev/null +++ b/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,144 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI).

+
+
+ + + + + +
+
Note
+
+
+

This action does not remove resources managed by the Forklift Operator, including custom resource definitions (CRDs) and custom resources (CRs). To remove these after uninstalling the Forklift Operator, you might need to manually delete the Forklift Operator CRDs.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Delete the forklift controller by running the following command:

    +
    +
    +
    $ oc delete ForkliftController --all -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Delete the subscription to the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  4. +
  5. +

    Delete the clusterserviceversion for the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  6. +
  7. +

    Delete the plugin console CR by running the following command:

    +
    +
    +
    $ oc delete ConsolePlugin forklift-console-plugin
    +
    +
    +
  8. +
  9. +

    Optional: Delete the custom resource definitions (CRDs) by running the following command:

    +
    +
    +
    kubectl get crd -o name | grep 'forklift.konveyor.io' | xargs kubectl delete
    +
    +
    +
  10. +
  11. +

    Optional: Perform cleanup by deleting the Forklift project by running the following command:

    +
    +
    +
    oc delete project openshift-mtv
    +
    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/index.html b/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 00000000000..c436f342bf5 --- /dev/null +++ b/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift by using the OKD web console

+
+

You can uninstall Forklift by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Operators > Installed Operators.

    +
  2. +
  3. +

    Click Forklift Operator.

    +
    +

    The Operator Details page opens in the Details tab.

    +
    +
  4. +
  5. +

    Click the ForkliftController tab.

    +
  6. +
  7. +

    Click Actions and select Delete ForkLiftController.

    +
    +

    A confirmation window opens.

    +
    +
  8. +
  9. +

    Click Delete.

    +
    +

    The controller is removed.

    +
    +
  10. +
  11. +

    Open the Details tab.

    +
    +

    The Create ForkliftController button appears instead of the controller you deleted. There is no need to click it.

    +
    +
  12. +
  13. +

    On the upper-right side of the page, click Actions and select Uninstall Operator.

    +
    +

    A confirmation window opens, displaying any operand instances.

    +
    +
  14. +
  15. +

    To delete all instances, select the Delete all operand instances for this operator checkbox. By default, the checkbox is cleared.

    +
    + + + + + +
    +
    Important
    +
    +
    +

    If your Operator configured off-cluster resources, these will continue to run and will require manual cleanup.

    +
    +
    +
    +
  16. +
  17. +

    Click Uninstall.

    +
    +

    The Installed Operators page opens, and the Forklift Operator is removed from the list of installed Operators.

    +
    +
  18. +
  19. +

    Click Home > Overview.

    +
  20. +
  21. +

    In the Status section of the page, click Dynamic Plugins.

    +
    +

    The Dynamic Plugins popup opens, listing forklift-console-plugin as a failed plugin. If the forklift-console-plugin does not appear as a failed plugin, refresh the web console.

    +
    +
  22. +
  23. +

    Click forklift-console-plugin.

    +
    +

    The ConsolePlugin details page opens in the Details tab.

    +
    +
  24. +
  25. +

    On the upper right-hand side of the page, click Actions and select Delete ConsolePlugin from the list.

    +
    +

    A confirmation window opens.

    +
    +
  26. +
  27. +

    Click Delete.

    +
    +

    The plugin is removed from the list of Dynamic plugins on the Overview page. If the plugin still appears, restart the Overview page.

    +
    +
  28. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/updating-validation-rules-version/index.html b/documentation/doc-Release_notes/modules/updating-validation-rules-version/index.html new file mode 100644 index 00000000000..2a3e075c44e --- /dev/null +++ b/documentation/doc-Release_notes/modules/updating-validation-rules-version/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Updating the inventory rules version

+
+

You must update the inventory rules version each time you update the rules so that the Provider Inventory service detects the changes and triggers the Validation service.

+
+
+

The rules version is recorded in a rules_version.rego file for each provider.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the current rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 5
    +   }
    +}
    +
    +
    +
  2. +
  3. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  4. +
  5. +

    Update the rules version in the /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego file.

    +
  6. +
  7. +

    Log out of the Validation pod terminal.

    +
  8. +
  9. +

    Verify the updated rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 6
    +   }
    +}
    +
    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/upgrading-mtv-ui/index.html b/documentation/doc-Release_notes/modules/upgrading-mtv-ui/index.html new file mode 100644 index 00000000000..a78a72a8ce0 --- /dev/null +++ b/documentation/doc-Release_notes/modules/upgrading-mtv-ui/index.html @@ -0,0 +1,127 @@ + + + + + + + + Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + +Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Upgrading Forklift

+
+

You can upgrade the Forklift Operator by using the OKD web console to install the new version.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsInstalled Operators{operator-name-ui}Subscription.

    +
  2. +
  3. +

    Change the update channel to the correct release.

    +
    +

    See Changing update channel in the OKD documentation.

    +
    +
  4. +
  5. +

    Confirm that Upgrade status changes from Up to date to Upgrade available. If it does not, restart the CatalogSource pod:

    +
    +
      +
    1. +

      Note the catalog source, for example, redhat-operators.

      +
    2. +
    3. +

      From the command line, retrieve the catalog source pod:

      +
      +
      +
      $ kubectl get pod -n openshift-marketplace | grep <catalog_source>
      +
      +
      +
    4. +
    5. +

      Delete the pod:

      +
      +
      +
      $ kubectl delete pod -n openshift-marketplace <catalog_source_pod>
      +
      +
      +
      +

      Upgrade status changes from Up to date to Upgrade available.

      +
      +
      +

      If you set Update approval on the Subscriptions tab to Automatic, the upgrade starts automatically.

      +
      +
    6. +
    +
    +
  6. +
  7. +

    If you set Update approval on the Subscriptions tab to Manual, approve the upgrade.

    +
    +

    See Manually approving a pending upgrade in the OKD documentation.

    +
    +
  8. +
  9. +

    If you are upgrading from Forklift 2.2 and have defined VMware source providers, edit the VMware provider by adding a VDDK init image. Otherwise, the update will change the state of any VMware providers to Critical. For more information, see Adding a VMSphere source provider.

    +
  10. +
  11. +

    If you mapped to NFS on the OKD destination provider in Forklift 2.2, edit the AccessModes and VolumeMode parameters in the NFS storage profile. Otherwise, the upgrade will invalidate the NFS mapping. For more information, see Customizing the storage profile.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/using-must-gather/index.html b/documentation/doc-Release_notes/modules/using-must-gather/index.html new file mode 100644 index 00000000000..8555eb39ffa --- /dev/null +++ b/documentation/doc-Release_notes/modules/using-must-gather/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using the must-gather tool

+
+

You can collect logs and information about Forklift custom resources (CRs) by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, migration plan, or virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Collecting logs and CR information
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_id> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        Specify the VM ID as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/virt-migration-workflow/index.html b/documentation/doc-Release_notes/modules/virt-migration-workflow/index.html new file mode 100644 index 00000000000..72ddf46a01d --- /dev/null +++ b/documentation/doc-Release_notes/modules/virt-migration-workflow/index.html @@ -0,0 +1,209 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Detailed migration workflow

+
+

You can use the detailed migration workflow to troubleshoot a failed migration.

+
+
+

The workflow describes the following steps:

+
+
+

Warm Migration or migration to a remote {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create the Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
  7. +

    The CDI Controller service creates an importer pod.

    +
  8. +
  9. +

    The importer pod streams the VM disk to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The Migration Controller service creates a conversion pod with the PVCs attached to it when importing from VMWare.

    +
    +

    The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the target VM.

    +
    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from oVirt or {osp} to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates for each source VM disk a PersistentVolumeClaim CR, and an OvirtVolumePopulator when the source is oVirt, or an OpenstackVolumePopulator CR when the source is {osp}.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Populator Controller service creates a temporarily persistent volume claim (PVC).

    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
    +
      +
    • +

      The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

      +
    • +
    +
    +
  6. +
  7. +

    The Populator Controller service creates a populator pod.

    +
  8. +
  9. +

    The populator pod transfers the disk data to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The temporary PVC is deleted, and the initial PVC points to the PV with the data.

    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from VMWare to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a blank persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
+
+
+

For all VM disks:

+
+
+
    +
  1. +

    The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

    +
  2. +
  3. +

    The Migration Controller service creates a conversion pod for all PVCs.

    +
  4. +
  5. +

    The conversion pod runs virt-v2v, which converts the VM to the KVM hypervisor and transfers the disks' data to their corresponding PVs.

    +
    +

    After the VM disks are transferred:

    +
    +
  6. +
  7. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  8. +
  9. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/vmware-prerequisites/index.html b/documentation/doc-Release_notes/modules/vmware-prerequisites/index.html new file mode 100644 index 00000000000..840f7372ed0 --- /dev/null +++ b/documentation/doc-Release_notes/modules/vmware-prerequisites/index.html @@ -0,0 +1,278 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

VMware prerequisites

+
+

It is strongly recommended to create a VDDK image to accelerate migrations. For more information, see Creating a VDDK image.

+
+
+

The following prerequisites apply to VMware migrations:

+
+
+
    +
  • +

    You must use a compatible version of VMware vSphere.

    +
  • +
  • +

    You must be logged in as a user with at least the minimal set of VMware privileges.

    +
  • +
  • +

    To access the virtual machine using a pre-migration hook, VMware Tools must be installed on the source virtual machine.

    +
  • +
  • +

    The VM operating system must be certified and supported for use as a guest operating system with KubeVirt and for conversion to KVM with virt-v2v.

    +
  • +
  • +

    If you are running a warm migration, you must enable changed block tracking (CBT) on the VMs and on the VM disks.

    +
  • +
  • +

    If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host.

    +
  • +
  • +

    It is strongly recommended to disable hibernation because Forklift does not support migrating hibernated VMs.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

In the event of a power outage, data might be lost for a VM with disabled hibernation. However, if hibernation is not disabled, migration will fail

+
+
+
+
+ + + + + +
+
Note
+
+
+

Neither Forklift nor OpenShift Virtualization support conversion of Btrfs for migrating VMs from VMWare.

+
+
+
+

VMware privileges

+
+

The following minimal set of VMware privileges is required to migrate virtual machines to KubeVirt with the Forklift.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. VMware privileges
PrivilegeDescription

Virtual machine.Interaction privileges:

Virtual machine.Interaction.Power Off

Allows powering off a powered-on virtual machine. This operation powers down the guest operating system.

Virtual machine.Interaction.Power On

Allows powering on a powered-off virtual machine and resuming a suspended virtual machine.

Virtual machine.Guest operating system management by VIX API

Allows managing a virtual machine by the VMware VIX API.

+

Virtual machine.Provisioning privileges:

+
+
+ + + + + +
+
Note
+
+
+

All Virtual machine.Provisioning privileges are required.

+
+
+

Virtual machine.Provisioning.Allow disk access

Allows opening a disk on a virtual machine for random read and write access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow file access

Allows operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow read-only disk access

Allows opening a disk on a virtual machine for random read access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow virtual machine download

Allows read operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow virtual machine files upload

Allows write operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Clone template

Allows cloning of a template.

Virtual machine.Provisioning.Clone virtual machine

Allows cloning of an existing virtual machine and allocation of resources.

Virtual machine.Provisioning.Create template from virtual machine

Allows creation of a new template from a virtual machine.

Virtual machine.Provisioning.Customize guest

Allows customization of a virtual machine’s guest operating system without moving the virtual machine.

Virtual machine.Provisioning.Deploy template

Allows deployment of a virtual machine from a template.

Virtual machine.Provisioning.Mark as template

Allows marking an existing powered-off virtual machine as a template.

Virtual machine.Provisioning.Mark as virtual machine

Allows marking an existing template as a virtual machine.

Virtual machine.Provisioning.Modify customization specification

Allows creation, modification, or deletion of customization specifications.

Virtual machine.Provisioning.Promote disks

Allows promote operations on a virtual machine’s disks.

Virtual machine.Provisioning.Read customization specifications

Allows reading a customization specification.

Virtual machine.Snapshot management privileges:

Virtual machine.Snapshot management.Create snapshot

Allows creation of a snapshot from the virtual machine’s current state.

Virtual machine.Snapshot management.Remove Snapshot

Allows removal of a snapshot from the snapshot history.

Datastore privileges:

Datastore.Browse datastore

Allows exploring the contents of a datastore.

Datastore.Low level file operations

Allows performing low-level file operations - read, write, delete, and rename - in a datastore.

Sessions privileges:

Sessions.Validate session

Allows verification of the validity of a session.

Cryptographic privileges:

Cryptographic.Decrypt

Allows decryption of an encrypted virtual machine.

Cryptographic.Direct access

Allows access to encrypted resources.

+ + +
+ + diff --git a/documentation/modules/about-cold-warm-migration/index.html b/documentation/modules/about-cold-warm-migration/index.html new file mode 100644 index 00000000000..be7006ff1e6 --- /dev/null +++ b/documentation/modules/about-cold-warm-migration/index.html @@ -0,0 +1,255 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About cold and warm migration

+
+
+
+

Forklift supports cold migration from:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

Forklift supports warm migration from VMware vSphere and from oVirt.

+
+
+
+
+

Cold migration

+
+
+

Cold migration is the default migration type. The source virtual machines are shut down while the data is copied.

+
+
+ + + + + +
+
Note
+
+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_qemu-guest-agent.adoc[]

+
+
+
+
+
+
+

Warm migration

+
+
+

Most of the data is copied during the precopy stage while the source virtual machines (VMs) are running.

+
+
+

Then the VMs are shut down and the remaining data is copied during the cutover stage.

+
+
+
Precopy stage
+

The VMs are not shut down during the precopy stage.

+
+
+

The VM disks are copied incrementally by using changed block tracking (CBT) snapshots. The snapshots are created at one-hour intervals by default. You can change the snapshot interval by updating the forklift-controller deployment.

+
+
+ + + + + +
+
Important
+
+
+

You must enable CBT for each source VM and each VM disk.

+
+
+

A VM can support up to 28 CBT snapshots. If the source VM has too many CBT snapshots and the Migration Controller service is not able to create a new snapshot, warm migration might fail. The Migration Controller service deletes each snapshot when the snapshot is no longer required.

+
+
+
+
+

The precopy stage runs until the cutover stage is started manually or is scheduled to start.

+
+
+
Cutover stage
+

The VMs are shut down during the cutover stage and the remaining data is migrated. Data stored in RAM is not migrated.

+
+
+

You can start the cutover stage manually by using the Forklift console or you can schedule a cutover time in the Migration manifest.

+
+
+
+
+

Advantages and disadvantages of cold and warm migrations

+
+
+

Overview

+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_cold-warm-comparison-table.adoc[]

+
+
+
+

Detailed description

+
+

The table that follows offers a more detailed description of the advantages and disadvantages of each type of migration. It assumes that you have installed Red Hat Enterprise Linux (RHEL) 9 on the OKD platform on which you installed Forklift.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Detailed description of advantages and disadvantages
Cold migrationWarm migration

Fail fast

Each VM is converted to be compatible with OKD and, if the conversion is successful, the VM is transferred. If a VM cannot be converted, the migration fails immediately.

For each VM, Forklift creates a snapshot and transfers it to OKD. When you start the cutover, Forklift creates the last snapshot, transfers it, and then converts the VM.

Tools

Forklift only.

Forklift and CDI from KubeVirt.

Parallelism

Disks must be transferred sequentially.

Disks can be transferred in parallel using different pods.

+
+ + + + + +
+
Note
+
+
+

The preceding table describes the situation for VMs that are running because the main benefit of warm migration is the reduced downtime, and there is no reason to initiate warm migration for VMs that are down. However, performing warm migration for VMs that are down is not the same as cold migration, even when Forklift uses virt-v2v and RHEL 9. For VMs that are down, Forklift transfers the disks using CDI, unlike in cold migration.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When importing from VMware, there are additional factors which impact the migration speed such as limits related to ESXi, vSphere. or VDDK.

+
+
+
+
+
+

Conclusions

+
+

Based on the preceding information, we can draw the following conclusions about cold migration vs. warm migration:

+
+
+
    +
  • +

    The shortest downtime of VMs can be achieved by using warm migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data on a single disk can be achieved by using cold migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data that is spread evenly across multiple disks can be achieved by using warm migration.

    +
  • +
+
+
+
+
+ + +
+ + diff --git a/documentation/modules/about-hook-crs-for-migration-plans-api/index.html b/documentation/modules/about-hook-crs-for-migration-plans-api/index.html new file mode 100644 index 00000000000..ce78880519f --- /dev/null +++ b/documentation/modules/about-hook-crs-for-migration-plans-api/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

API-based hooks for Forklift migration plans

+
+

You can add hooks to a migration plan from the command line by using the Forklift API.

+
+

Default hook image

+
+

The default hook image for an Forklift hook is registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2. The image is based on the Ansible Runner image with the addition of python-openshift to provide Ansible Kubernetes resources and a recent oc binary.

+
+

Hook execution

+
+

An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a ConfigMap. The hook container is run as a job on the desired cluster, using the default ServiceAccount in the konveyor-forklift namespace.

+
+

PreHooks and PostHooks

+
+

You specify hooks per VM and you can run each as a PreHook or a PostHook. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration.

+
+
+

When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook.

+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
Example PreHook:
+
+
kind: Plan
+apiVersion: forklift.konveyor.io/v1beta1
+metadata:
+  name: test
+  namespace: konveyor-forklift
+spec:
+  vms:
+    - id: vm-2861
+      hooks:
+        - hook:
+            namespace: konveyor-forklift
+            name: playbook
+          step: PreHook
+
+
+ + +
+ + diff --git a/documentation/modules/about-rego-files/index.html b/documentation/modules/about-rego-files/index.html new file mode 100644 index 00000000000..7f149a1c9cb --- /dev/null +++ b/documentation/modules/about-rego-files/index.html @@ -0,0 +1,104 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About Rego files

+
+

Validation rules are written in Rego, the Open Policy Agent (OPA) native query language. The rules are stored as .rego files in the /usr/share/opa/policies/io/konveyor/forklift/<provider> directory of the Validation pod.

+
+
+

Each validation rule is defined in a separate .rego file and tests for a specific condition. If the condition evaluates as true, the rule adds a {“category”, “label”, “assessment”} hash to the concerns. The concerns content is added to the concerns key in the inventory record of the VM. The web console displays the content of the concerns key for each VM in the provider inventory.

+
+
+

The following .rego file example checks for distributed resource scheduling enabled in the cluster of a VMware VM:

+
+
+
drs_enabled.rego example
+
+
package io.konveyor.forklift.vmware (1)
+
+has_drs_enabled {
+    input.host.cluster.drsEnabled (2)
+}
+
+concerns[flag] {
+    has_drs_enabled
+    flag := {
+        "category": "Information",
+        "label": "VM running in a DRS-enabled cluster",
+        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
+    }
+}
+
+
+
+
    +
  1. +

    Each validation rule is defined within a package. The package namespaces are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

    +
  2. +
  3. +

    Query parameters are based on the input key of the Validation service JSON.

    +
  4. +
+
+ + +
+ + diff --git a/documentation/modules/accessing-default-validation-rules/index.html b/documentation/modules/accessing-default-validation-rules/index.html new file mode 100644 index 00000000000..6ccd0c2e3c7 --- /dev/null +++ b/documentation/modules/accessing-default-validation-rules/index.html @@ -0,0 +1,108 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Checking the default validation rules

+
+

Before you create a custom rule, you must check the default rules of the Validation service to ensure that you do not create a rule that redefines an existing default value.

+
+
+

Example: If a default rule contains the line default valid_input = false and you create a custom rule that contains the line default valid_input = true, the Validation service will not start.

+
+
+
Procedure
+
    +
  1. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  2. +
  3. +

    Go to the OPA policies directory for your provider:

    +
    +
    +
    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> (1)
    +
    +
    +
    +
      +
    1. +

      Specify vmware or ovirt.

      +
    2. +
    +
    +
  4. +
  5. +

    Search for the default policies:

    +
    +
    +
    $ grep -R "default" *
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/accessing-logs-cli/index.html b/documentation/modules/accessing-logs-cli/index.html new file mode 100644 index 00000000000..00aad8ce527 --- /dev/null +++ b/documentation/modules/accessing-logs-cli/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Accessing logs and custom resource information from the command line interface

+
+

You can access logs and information about custom resources (CRs) from the command line interface by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, a completed, failed, or canceled migration plan, or a migrated virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_name> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        You must specify the VM name, not the VM ID, as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/accessing-logs-ui/index.html b/documentation/modules/accessing-logs-ui/index.html new file mode 100644 index 00000000000..957b74fdc9d --- /dev/null +++ b/documentation/modules/accessing-logs-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Downloading logs and custom resource information from the web console

+
+

You can download logs and information about custom resources (CRs) for a completed, failed, or canceled migration plan or for migrated virtual machines (VMs) by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Get logs beside a migration plan name.

    +
  4. +
  5. +

    In the Get logs window, click Get logs.

    +
    +

    The logs are collected. A Log collection complete message is displayed.

    +
    +
  6. +
  7. +

    Click Download logs to download the archive file.

    +
  8. +
  9. +

    To download logs for a migrated VM, click a migration plan name and then click Get logs beside the VM.

    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/adding-hook-crs-to-migration-plans-api/index.html b/documentation/modules/adding-hook-crs-to-migration-plans-api/index.html new file mode 100644 index 00000000000..d193f0fef1d --- /dev/null +++ b/documentation/modules/adding-hook-crs-to-migration-plans-api/index.html @@ -0,0 +1,302 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding Hook CRs to a VM migration by using the Forklift API

+
+

You can add a PreHook or a PostHook Hook CR when you migrate a virtual machine from the command line by using the Forklift API. A PreHook runs before a migration, a PostHook, after.

+
+
+ + + + + +
+
Note
+
+
+

You can retrieve additional information stored in a secret or in a configMap by using a k8s module.

+
+
+
+
+

For example, you can create a hook CR to install cloud-init on a VM and write a file before migration.

+
+
+
Procedure
+
    +
  1. +

    If needed, create a secret with an SSH private key for the VM. You can either use an existing key or generate a key pair, install the public key on the VM, and base64 encode the private key in the secret.

    +
    +
    +
    apiVersion: v1
    +data:
    +  key: VGhpcyB3YXMgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbiBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZS4KSXQgaXMgbm90IHVzZWQgYW55d2hlcmUuCi0tLS0tQkVHSU4gT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCmIzQmxibk56YUMxclpYa3RkakVBQUFBQUJHNXZibVVBQUFBRWJtOXVaUUFBQUFBQUFBQUJBQUFCbHdBQUFBZHpjMmd0Y24KTmhBQUFBQXdFQUFRQUFBWUVBMzVTTFRReDBFVjdPTWJQR0FqcEsxK2JhQURTTVFuK1NBU2pyTGZLNWM5NGpHdzhDbnA4LwovRHErZHFBR1pxQkg2ZnAxYmVJM1BZZzVWVDk0RVdWQ2RrTjgwY3dEcEo0Z1R0NHFUQ1gzZUYvY2x5VXQyUC9zaTNjcnQ0CjBQdi9wVnZXU1U2TlhHaDJIZC93V0MwcGh5Z0RQOVc5SHRQSUF0OFpnZmV2ZnUwZHpraVl6OHNVaElWU2ZsRGpaNUFqcUcKUjV2TVVUaGlrczEvZVlCeTdiMkFFSEdzYU8xN3NFbWNiYUlHUHZuUFVwWmQrdjkyYU1JdWZoYjhLZkFSbzZ3Ty9ISW1VbQovdDdHWFBJUmxBMUhSV0p1U05odTQzZS9DY3ZYd3Z6RnZrdE9kYXlEQzBMTklHMkpVaURlNWd0UUQ1WHZXc1p3MHQvbEs1CklacjFrZXZRNUJsYWNISmViV1ZNYUQvdllpdFdhSFo4OEF1Y0czaGh2bjkrOGNSTGhNVExiVlFSMWh2UVpBL1JtQXN3eE0KT3VJSmRaUmtxTThLZlF4Z28zQThRNGJhQW1VbnpvM3Zwa0FWdC9uaGtIOTRaRE5rV2U2RlRhdThONStyYTJCZkdjZVA4VApvbjFEeTBLRlpaUlpCREVVRVc0eHdTYUVOYXQ3c2RDNnhpL1d5OURaQUFBRm1NRFBXeDdBejFzZUFBQUFCM056YUMxeWMyCkVBQUFHQkFOK1VpMDBNZEJGZXpqR3p4Z0k2U3RmbTJnQTBqRUova2dFbzZ5M3l1WFBlSXhzUEFwNmZQL3c2dm5hZ0JtYWcKUituNmRXM2lOejJJT1ZVL2VCRmxRblpEZk5ITUE2U2VJRTdlS2t3bDkzaGYzSmNsTGRqLzdJdDNLN2VORDcvNlZiMWtsTwpqVnhvZGgzZjhGZ3RLWWNvQXovVnZSN1R5QUxmR1lIM3IzN3RIYzVJbU0vTEZJU0ZVbjVRNDJlUUk2aGtlYnpGRTRZcExOCmYzbUFjdTI5Z0JCeHJHanRlN0JKbkcyaUJqNzV6MUtXWGZyL2RtakNMbjRXL0Nud0VhT3NEdnh5SmxKdjdleGx6eUVaUU4KUjBWaWJrallidU4zdnduTDE4TDh4YjVMVG5Xc2d3dEN6U0J0aVZJZzN1WUxVQStWNzFyR2NOTGY1U3VTR2E5WkhyME9RWgpXbkJ5WG0xbFRHZy83MklyVm1oMmZQQUxuQnQ0WWI1L2Z2SEVTNFRFeTIxVUVkWWIwR1FQMFpnTE1NVERyaUNYV1VaS2pQCkNuME1ZS053UEVPRzJnSmxKODZONzZaQUZiZjU0WkIvZUdRelpGbnVoVTJydkRlZnEydGdYeG5Iai9FNko5UTh0Q2hXV1UKV1FReEZCRnVNY0VtaERXcmU3SFF1c1l2MXN2UTJRQUFBQU1CQUFFQUFBR0JBSlZtZklNNjdDQmpXcU9KdnFua2EvakRrUwo4TDdpSE5mekg1TnRZWVdPWmRMTlk2L0lRa1pDeFcwTWtSKzlUK0M3QUZKZzBNV2Q5ck5PeUxJZDkxNjZoOVJsNG0xdFJjCnViZ1o2dWZCZ3hGVDlXS21mSEdCNm4zelh5b2pQOEFJTnR6ODVpaUVHVXFFRWtVRVdMd0RGSmdvcFllQ3l1VmZ2ZE92MUgKRm1WWmEwNVo0b3NQNkNENXVmc2djQ1RYQTR6VnZ5ZHVCYkxqdHN5RjdYZjNUdjZUQ1QxU0swZHErQk1OOXRvb0RZaXpwagpzbDh6NzlybXp3eUFyWFlVcnFUUkpsNmpwRkNrWHJLcy9LeG96MHhhbXlMY2RORk9hWE51LzlnTkpjRERsV2hPcFRqNHk4CkpkNXBuV1Jueis1RHJLRFdhY0loUW1CMUxVd2ZLWmQwbVFxaUpzMUMxcXZVUmlKOGExaThKUTI4bHFuWTFRRk9wbk13emcKWEpla2FndThpT1ExRFJlQkhaM0NkcVJUYnY3bVJZSGxramx0dXJmZGc4M3hvM0ErZ1JSR001eUVOcW5xSkplQjhJQVB5UwptMFp0dGdqbHNqNTJ2K1B1NmExMHoxZndKK1VML2N6dTRKeEpOYlp6WTFIMnpLODJBaVI1T3JYNmx2aUEvSWFSRVcwUUFBCkFNQndVeUJpcUc5bEZCUnltL2UvU1VORVMzdHpicUZNdTdIcy84WTV5SnAxKzR6OXUxNGtJR2ttV0Y5eE5HT3hrY3V0cWwKeHVUcndMbjFUaFNQTHQrTjUwTGhVdzR4ZjBhNUxqemdPbklPU0FRbm5HY1Nxa0dTRDlMR21obGE2WmpydFBHY29lQ3JHdAo5M1Vvcmx5YkxNRzFFRFAxWmpKS1RaZzl6OUMwdDlTTGd3ei9DbFhydW9UNXNQVUdKWnUrbHlIZXpSTDRtcHl6OEZMcnlOCkdNci9leVM5bWdISjNVVkZEYjNIZ3BaK1E1SUdBRU5rZVZEcHIwMGhCZXZndGd6YWtBQUFEQkFQVXQ1RitoMnBVby94V1YKenRkcVQvMzA4dFB5MXVMMU1lWFoydEJPQmRwSDJyd0JzdWt0aTIySGtWZUZXQjJFdUlFUXppMzY3MGc1UGdxR1p4Vng4dQpobEE0Rkg4ZXN1NTNQckZqVW9EeFJhb3d3WXBFcFh5Y2pnNUE1MStwR1VQcWljWjB0YjliaWlhc3BWWXZhWW5sdGlnVG5iClN0UExMY29nemNiL0dGcVYyaXlzc3lwTlMwKzBNRTUxcEtxWGNaS2swbi8vVHpZWWs4TW8vZzRsQ3pmUEZQUlZrVVM5blIKWU1pQzRlcEk0TERmbVdnM0xLQ2N1Zk85all3aWgwYlFBQUFNRUE2WEtldDhEMHNvc0puZVh5WFZGd0dyVyszNlhBVGRQTwpMWDdjaStjYzFoOGV1eHdYQWx3aTJJNFhxSmJBVjBsVEhuVGEycXN3Uy9RQlpJUUJWSkZlVjVyS1daZTc4R2F3d1pWTFZNCldETmNwdFFyRTFaM2pGNS9TdUVzdlVxSDE0Tkc5RUFXWG1iUkNzelE0Vlk3NzQrSi9sTFkvMnlDT1diNzlLYTJ5OGxvYUoKVXczWWVtSld3blp2R3hKNldsL3BmQ2xYN3lEVXlXUktLdGl0cWNjbmpCWVkyRE1tZURwdURDYy9ZdDZDc3dLRmRkMkJ1UwpGZGt5cDlZY3VMaDlLZEFBQUFIR3BoYzI5dVFFRlVMVGd3TWxVdWJXOXVkR3hsYjI0dWFXNTBjbUVCQWdNRUJRWT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCgo=
    +kind: Secret
    +metadata:
    +  name: ssh-credentials
    +  namespace: konveyor-forklift
    +type: Opaque
    +
    +
    +
  2. +
  3. +

    Encode your playbook by conncatenating a file and piping it for base64, for example:

    +
    +
    +
    $ cat playbook.yml | base64 -w0
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can also use a here document to encode a playbook:

    +
    +
    +
    +
    $ cat << EOF | base64 -w0
    +- hosts: localhost
    +  tasks:
    +  - debug:
    +      msg: test
    +EOF
    +
    +
    +
    +
    +
  4. +
  5. +

    Create a Hook CR:

    +
    +
    +
    apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: playbook
    +  namespace: konveyor-forklift
    +spec:
    +  image: registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2
    +  playbook: LSBuYW1lOiBNYWluCiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogIC0gbmFtZTogTG9hZCBQbGFuCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHBsYW4ueW1sCiAgICAgIG5hbWU6IHBsYW4KCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHdvcmtsb2FkLnltbAogICAgICBuYW1lOiB3b3JrbG9hZAoKICAtIG5hbWU6IAogICAgZ2V0ZW50OgogICAgICBkYXRhYmFzZTogcGFzc3dkCiAgICAgIGtleTogInt7IGFuc2libGVfdXNlcl9pZCB9fSIKICAgICAgc3BsaXQ6ICc6JwoKICAtIG5hbWU6IEVuc3VyZSBTU0ggZGlyZWN0b3J5IGV4aXN0cwogICAgZmlsZToKICAgICAgcGF0aDogfi8uc3NoCiAgICAgIHN0YXRlOiBkaXJlY3RvcnkKICAgICAgbW9kZTogMDc1MAogICAgZW52aXJvbm1lbnQ6CiAgICAgIEhPTUU6ICJ7eyBhbnNpYmxlX2ZhY3RzLmdldGVudF9wYXNzd2RbYW5zaWJsZV91c2VyX2lkXVs0XSB9fSIKCiAgLSBrOHNfaW5mbzoKICAgICAgYXBpX3ZlcnNpb246IHYxCiAgICAgIGtpbmQ6IFNlY3JldAogICAgICBuYW1lOiBzc2gtY3JlZGVudGlhbHMKICAgICAgbmFtZXNwYWNlOiBrb252ZXlvci1mb3JrbGlmdAogICAgcmVnaXN0ZXI6IHNzaF9jcmVkZW50aWFscwoKICAtIG5hbWU6IENyZWF0ZSBTU0gga2V5CiAgICBjb3B5OgogICAgICBkZXN0OiB+Ly5zc2gvaWRfcnNhCiAgICAgIGNvbnRlbnQ6ICJ7eyBzc2hfY3JlZGVudGlhbHMucmVzb3VyY2VzWzBdLmRhdGEua2V5IHwgYjY0ZGVjb2RlIH19IgogICAgICBtb2RlOiAwNjAwCgogIC0gYWRkX2hvc3Q6CiAgICAgIG5hbWU6ICJ7eyB3b3JrbG9hZC52bS5pcGFkZHJlc3MgfX0iCiAgICAgIGFuc2libGVfdXNlcjogcm9vdAogICAgICBncm91cHM6IHZtcwoKLSBob3N0czogdm1zCiAgdGFza3M6CiAgLSBuYW1lOiBJbnN0YWxsIGNsb3VkLWluaXQKICAgIGRuZjoKICAgICAgbmFtZToKICAgICAgLSBjbG91ZC1pbml0CiAgICAgIHN0YXRlOiBsYXRlc3QKCiAgLSBuYW1lOiBDcmVhdGUgVGVzdCBGaWxlCiAgICBjb3B5OgogICAgICBkZXN0OiAvdGVzdC50eHQKICAgICAgY29udGVudDogIkhlbGxvIFdvcmxkIgogICAgICBtb2RlOiAwNjQ0Cg==
    +  serviceAccount: forklift-controller (1)
    +
    +
    +
    +
      +
    1. +

      Specify a serviceAccount to run the hook with in order to control access to resources on the cluster.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      To decode an attached playbook retrieve the resource with custom output and pipe it to base64. For example:

      +
      +
      +
      +
       oc get -n konveyor-forklift hook playbook -o \
      +   go-template='{{ .spec.playbook }}' | base64 -d
      +
      +
      +
      +
      +
      +

      The playbook encoded here runs the following:

      +
      +
      +
      +
      - name: Main
      +  hosts: localhost
      +  tasks:
      +  - name: Load Plan
      +    include_vars:
      +      file: plan.yml
      +      name: plan
      +
      +  - name: Load Workload
      +    include_vars:
      +      file: workload.yml
      +      name: workload
      +
      +  - name:
      +    getent:
      +      database: passwd
      +      key: "{{ ansible_user_id }}"
      +      split: ':'
      +
      +  - name: Ensure SSH directory exists
      +    file:
      +      path: ~/.ssh
      +      state: directory
      +      mode: 0750
      +    environment:
      +      HOME: "{{ ansible_facts.getent_passwd[ansible_user_id][4] }}"
      +
      +  - k8s_info:
      +      api_version: v1
      +      kind: Secret
      +      name: ssh-credentials
      +      namespace: konveyor-forklift
      +    register: ssh_credentials
      +
      +  - name: Create SSH key
      +    copy:
      +      dest: ~/.ssh/id_rsa
      +      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      +      mode: 0600
      +
      +  - add_host:
      +      name: "{{ workload.vm.ipaddress }}"
      +      ansible_user: root
      +      groups: vms
      +
      +- hosts: vms
      +  tasks:
      +  - name: Install cloud-init
      +    dnf:
      +      name:
      +      - cloud-init
      +      state: latest
      +
      +  - name: Create Test File
      +    copy:
      +      dest: /test.txt
      +      content: "Hello World"
      +      mode: 0644
      +
      +
      +
    2. +
    +
    +
  6. +
  7. +

    Create a Plan CR using the hook:

    +
    +
    +
    kind: Plan
    +apiVersion: forklift.konveyor.io/v1beta1
    +metadata:
    +  name: test
    +  namespace: konveyor-forklift
    +spec:
    +  map:
    +    network:
    +      namespace: "konveyor-forklift"
    +      name: "network"
    +    storage:
    +      namespace: "konveyor-forklift"
    +      name: "storage"
    +  provider:
    +    source:
    +      namespace: "konveyor-forklift"
    +      name: "boston"
    +    destination:
    +      namespace: "konveyor-forklift"
    +      name: host
    +  targetNamespace: "konveyor-forklift"
    +  vms:
    +    - id: vm-2861
    +      hooks:
    +        - hook:
    +            namespace: konveyor-forklift
    +            name: playbook
    +          step: PreHook (1)
    +
    +
    +
    +
      +
    1. +

      Options are PreHook, to run the hook before the migration, and PostHook, to run the hook after the migration.

      +
    2. +
    +
    +
  8. +
+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+ + +
+ + diff --git a/documentation/modules/adding-source-provider/index.html b/documentation/modules/adding-source-provider/index.html new file mode 100644 index 00000000000..1b4e5163515 --- /dev/null +++ b/documentation/modules/adding-source-provider/index.html @@ -0,0 +1,82 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/adding-virt-provider/index.html b/documentation/modules/adding-virt-provider/index.html new file mode 100644 index 00000000000..e22f09a168a --- /dev/null +++ b/documentation/modules/adding-virt-provider/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding a KubeVirt destination provider

+
+

You can add a KubeVirt destination provider to the OKD web console in addition to the default KubeVirt destination provider, which is the provider where you installed Forklift.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select KubeVirt from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Specify the provider name to display in the list of target providers.

      +
    • +
    • +

      Kubernetes API server URL: Specify the OKD cluster API endpoint.

      +
    • +
    • +

      Service account token: Specify the cluster-admin service account token.

      +
      +

      If both URL and Service account token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/canceling-migration-cli/index.html b/documentation/modules/canceling-migration-cli/index.html new file mode 100644 index 00000000000..bef0a073375 --- /dev/null +++ b/documentation/modules/canceling-migration-cli/index.html @@ -0,0 +1,132 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel an entire migration or individual virtual machines (VMs) while a migration is in progress from the command line interface (CLI).

+
+
+
Canceling an entire migration
+
    +
  • +

    Delete the Migration CR:

    +
    +
    +
    $ kubectl delete migration <migration> -n <namespace> (1)
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    +
    +
  • +
+
+
+
Canceling the migration of individual VMs
+
    +
  1. +

    Add the individual VMs to the spec.cancel block of the Migration manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration>
    +  namespace: <namespace>
    +...
    +spec:
    +  cancel:
    +  - id: vm-102 (1)
    +  - id: vm-203
    +  - name: rhel8-vm
    +EOF
    +
    +
    +
    +
      +
    1. +

      You can specify a VM by using the id key or the name key.

      +
      +

      The value of the id key is the managed object reference, for a VMware VM, or the VM UUID, for a oVirt VM.

      +
      +
    2. +
    +
    +
  2. +
  3. +

    Retrieve the Migration CR to monitor the progress of the remaining VMs:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/modules/canceling-migration-ui/index.html b/documentation/modules/canceling-migration-ui/index.html new file mode 100644 index 00000000000..6d7efd67467 --- /dev/null +++ b/documentation/modules/canceling-migration-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel the migration of some or all virtual machines (VMs) while a migration plan is in progress by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization.

    +
  2. +
  3. +

    Click the name of a running migration plan to view the migration details.

    +
  4. +
  5. +

    Select one or more VMs and click Cancel.

    +
  6. +
  7. +

    Click Yes, cancel to confirm the cancellation.

    +
    +

    In the Migration details by VM list, the status of the canceled VMs is Canceled. The unmigrated and the migrated virtual machines are not affected.

    +
    +
  8. +
+
+
+

You can restart a canceled migration by clicking Restart beside the migration plan on the Migration plans page.

+
+ + +
+ + diff --git a/documentation/modules/changing-precopy-intervals/index.html b/documentation/modules/changing-precopy-intervals/index.html new file mode 100644 index 00000000000..45c426f1057 --- /dev/null +++ b/documentation/modules/changing-precopy-intervals/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Changing precopy intervals for warm migration

+
+

You can change the snapshot interval by patching the ForkliftController custom resource (CR).

+
+
+
Procedure
+
    +
  • +

    Patch the ForkliftController CR:

    +
    +
    +
    $ kubectl patch forkliftcontroller/<forklift-controller> -n konveyor-forklift -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge (1)
    +
    +
    +
    +
      +
    1. +

      Specify the precopy interval in minutes. The default value is 60.

      +
      +

      You do not need to restart the forklift-controller pod.

      +
      +
    2. +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/collected-logs-cr-info/index.html b/documentation/modules/collected-logs-cr-info/index.html new file mode 100644 index 00000000000..3b6f414c5b5 --- /dev/null +++ b/documentation/modules/collected-logs-cr-info/index.html @@ -0,0 +1,183 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Collected logs and custom resource information

+
+

You can download logs and custom resource (CR) yaml files for the following targets by using the OKD web console or the command line interface (CLI):

+
+
+
    +
  • +

    Migration plan: Web console or CLI.

    +
  • +
  • +

    Virtual machine: Web console or CLI.

    +
  • +
  • +

    Namespace: CLI only.

    +
  • +
+
+
+

The must-gather tool collects the following logs and CR files in an archive file:

+
+
+
    +
  • +

    CRs:

    +
    +
      +
    • +

      DataVolume CR: Represents a disk mounted on a migrated VM.

      +
    • +
    • +

      VirtualMachine CR: Represents a migrated VM.

      +
    • +
    • +

      Plan CR: Defines the VMs and storage and network mapping.

      +
    • +
    • +

      Job CR: Optional: Represents a pre-migration hook, a post-migration hook, or both.

      +
    • +
    +
    +
  • +
  • +

    Logs:

    +
    +
      +
    • +

      importer pod: Disk-to-data-volume conversion log. The importer pod naming convention is importer-<migration_plan>-<vm_id><5_char_id>, for example, importer-mig-plan-ed90dfc6-9a17-4a8btnfh, where ed90dfc6-9a17-4a8 is a truncated oVirt VM ID and btnfh is the generated 5-character ID.

      +
    • +
    • +

      conversion pod: VM conversion log. The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the VM. The conversion pod naming convention is <migration_plan>-<vm_id><5_char_id>.

      +
    • +
    • +

      virt-launcher pod: VM launcher log. When a migrated VM is powered on, the virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

      +
    • +
    • +

      forklift-controller pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      forklift-must-gather-api pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      hook-job pod: The log is filtered for hook jobs. The hook-job naming convention is <migration_plan>-<vm_id><5_char_id>, for example, plan2j-vm-3696-posthook-4mx85 or plan2j-vm-3696-prehook-mwqnl.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Empty or excluded log files are not included in the must-gather archive file.

      +
      +
      +
      +
    • +
    +
    +
  • +
+
+
+
Example must-gather archive structure for a VMware migration plan
+
+
must-gather
+└── namespaces
+    ├── target-vm-ns
+    │   ├── crs
+    │   │   ├── datavolume
+    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
+    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
+    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
+    │   │   └── virtualmachine
+    │   │       ├── test-test-rhel8-2disks2nics.yaml
+    │   │       └── test-x2019.yaml
+    │   └── logs
+    │       ├── importer-mig-plan-vm-7595-tkhdz
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-7595-5qvqp
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-8325-xccfw
+    │       │   └── current.log
+    │       ├── mig-plan-vm-7595-4glzd
+    │       │   └── current.log
+    │       └── mig-plan-vm-8325-4zw49
+    │           └── current.log
+    └── openshift-mtv
+        ├── crs
+        │   └── plan
+        │       └── mig-plan-cold.yaml
+        └── logs
+            ├── forklift-controller-67656d574-w74md
+            │   └── current.log
+            └── forklift-must-gather-api-89fc7f4b6-hlwb6
+                └── current.log
+
+
+ + +
+ + diff --git a/documentation/modules/common-attributes/index.html b/documentation/modules/common-attributes/index.html new file mode 100644 index 00000000000..8eb5c01fac2 --- /dev/null +++ b/documentation/modules/common-attributes/index.html @@ -0,0 +1,66 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + diff --git a/documentation/modules/compatibility-guidelines/index.html b/documentation/modules/compatibility-guidelines/index.html new file mode 100644 index 00000000000..cdbf2e9ab8a --- /dev/null +++ b/documentation/modules/compatibility-guidelines/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Software compatibility guidelines

+
+
+
+

You must install compatible software versions.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.3.0

4.10 or later

4.10 or later

6.5 or later

4.4 SP1 or later

16.1 or later

+
+ + + + + +
+
Note
+
+
Migration from oVirt 4.3
+
+

Forklift was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3. While not supported, basic migrations from oVirt 4.3 are expected to work.

+
+
+

Generally it is advised to upgrade oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+

Therefore, it is recommended to upgrade oVirt to the supported version above before the migration to KubeVirt.

+
+
+

However, migrations from oVirt 4.3.11 were tested with Forklift 2.3, and may work in practice in many environments using Forklift 2.3. In this case, we advise upgrading oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+
+
+
+
+

OpenShift Operator Life Cycles

+
+
+

For more information about the software maintenance Life Cycle classifications for Operators shipped by Red Hat for use with OpenShift Container Platform, see OpenShift Operator Life Cycles.

+
+
+
+ + +
+ + diff --git a/documentation/modules/configuring-mtv-operator/index.html b/documentation/modules/configuring-mtv-operator/index.html new file mode 100644 index 00000000000..e981102d26e --- /dev/null +++ b/documentation/modules/configuring-mtv-operator/index.html @@ -0,0 +1,202 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring the Forklift Operator

+
+

You can configure all of the following settings of the Forklift Operator by modifying the ForkliftController CR, or in the Settings section of the Overview page, unless otherwise indicated.

+
+
+
    +
  • +

    Maximum number of virtual machines (VMs) per plan that can be migrated simultaneously.

    +
  • +
  • +

    How long must gather reports are retained before being automatically deleted.

    +
  • +
  • +

    CPU limit allocated to the main controller container.

    +
  • +
  • +

    Memory limit allocated to the main controller container.

    +
  • +
  • +

    Interval at which a new snapshot is requested before initiating a warm migration.

    +
  • +
  • +

    Frequency with which the system checks the status of snapshot creation or removal during a warm migration.

    +
  • +
  • +

    Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem (ForkliftController CR only).

    +
  • +
  • +

    Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for vSphere source providers (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for oVirt (oVirt) source providers (ForkliftController CR only).

    +
  • +
+
+
+

The procedure for configuring these settings using the user interface is presented in Configuring MTV settings. The procedure for configuring these settings by modifying the ForkliftController CR is presented following.

+
+
+
Procedure
+
    +
  • +

    Change a parameter’s value in the spec portion of the ForkliftController CR by adding the label and value as follows:

    +
  • +
+
+
+
+
spec:
+  label: value (1)
+
+
+
+
    +
  1. +

    Labels you can configure using the CLI are shown in the table that follows, along with a description of each label and its default value.

    +
  2. +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift Operator labels
LabelDescriptionDefault value

controller_max_vm_inflight

The maximum number of VMs per plan that can be migrated simultaneously.

20

must_gather_api_cleanup_max_age

The duration in hours for retaining must gather reports before they are automatically deleted.

-1 (disabled)

controller_container_limits_cpu

The CPU limit allocated to the main controller container.

500m

controller_container_limits_memory

The memory limit allocated to the main controller container.

800Mi

controller_precopy_interval

The interval in minutes at which a new snapshot is requested before initiating a warm migration.

60

controller_snapshot_status_check_rate_seconds

The frequency in seconds with which the system checks the status of snapshot creation or removal during a warm migration.

10

controller_filesystem_overhead

Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem.

+

ForkliftController CR only.

10

controller_block_overhead

Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based. It can be used when data, such as encryption headers, is written to the persistent volumes in addition to the content of the virtual disk.

+

ForkliftController CR only.

0

vsphere_osmap_configmap_name

Configuration map for vSphere source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-vsphere-osmap. In order to override or delete values, specify a configuration map that is different from forklift-vsphere-osmap.

+

ForkliftController CR only.

forklift-vsphere-osmap

ovirt_osmap_configmap_name

Configuration map for oVirt source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-ovirt-osmap. In order to override or delete values, specify a configuration map that is different from forklift-ovirt-osmap.

+

ForkliftController CR only.

forklift-ovirt-osmap

+ + +
+ + diff --git a/documentation/modules/creating-migration-plan-2-6-3/index.html b/documentation/modules/creating-migration-plan-2-6-3/index.html new file mode 100644 index 00000000000..a3d61954fde --- /dev/null +++ b/documentation/modules/creating-migration-plan-2-6-3/index.html @@ -0,0 +1,139 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map. +. Enter the Plan name. +. Make any needed changes to the editable items. +. Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings. +. Click Create migration plan.

+
+
+

+ +Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

+
+
+
    +
  1. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  2. +
  3. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  4. +
  5. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      +

      Unresolved directive in creating-migration-plan-2-6-3.adoc - include::snip_vmware-name-change.adoc[]

      +
      +
    4. +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/creating-migration-plan/index.html b/documentation/modules/creating-migration-plan/index.html new file mode 100644 index 00000000000..bbc1a942495 --- /dev/null +++ b/documentation/modules/creating-migration-plan/index.html @@ -0,0 +1,270 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a migration plan

+
+

You can create a migration plan by using the OKD web console.

+
+
+

A migration plan allows you to group virtual machines to be migrated together or with the same migration parameters, for example, a percentage of the members of a cluster or a complete application.

+
+
+

You can configure a hook to run an Ansible playbook or custom container image during a specified stage of the migration plan.

+
+
+
Prerequisites
+
    +
  • +

    If Forklift is not installed on the target cluster, you must add a target provider on the Providers page of the web console.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Create plan.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Plan name: Enter a migration plan name to display in the migration plan list.

      +
    • +
    • +

      Plan description: Optional: Brief description of the migration plan.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    • +

      Target namespace: Do one of the following:

      +
      +
        +
      • +

        Select a target namespace from the list

        +
      • +
      • +

        Create a target namespace by typing its name in the text box, and then clicking create "<the_name_you_entered>"

        +
      • +
      +
      +
    • +
    • +

      You can change the migration transfer network for this plan by clicking Select a different network, selecting a network from the list, and then clicking Select.

      +
      +

      If you defined a migration transfer network for the KubeVirt provider and if the network is in the target namespace, the network that you defined is the default network for all migration plans. Otherwise, the pod network is used.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Click Next.

    +
  8. +
  9. +

    Select options to filter the list of source VMs and click Next.

    +
  10. +
  11. +

    Select the VMs to migrate and then click Next.

    +
  12. +
  13. +

    Select an existing network mapping or create a new network mapping.

    +
  14. +
  15. +

    . Optional: Click Add to add an additional network mapping.

    +
    +

    To create a new network mapping:

    +
    +
    +
      +
    • +

      Select a target network for each source network.

      +
    • +
    • +

      Optional: Select Save current mapping as a template and enter a name for the network mapping.

      +
    • +
    +
    +
  16. +
  17. +

    Click Next.

    +
  18. +
  19. +

    Select an existing storage mapping, which you can modify, or create a new storage mapping.

    +
    +

    To create a new storage mapping:

    +
    +
    +
      +
    1. +

      If your source provider is VMware, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    +
    +
  20. +
  21. +

    Optional: Select Save current mapping as a template and enter a name for the storage mapping.

    +
  22. +
  23. +

    Click Next.

    +
  24. +
  25. +

    Select a migration type and click Next.

    +
    +
      +
    • +

      Cold migration: The source VMs are stopped while the data is copied.

      +
    • +
    • +

      Warm migration: The source VMs run while the data is copied incrementally. Later, you will run the cutover, which stops the VMs and copies the remaining VM data and metadata.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Warm migration is supported only from vSphere and oVirt.

      +
      +
      +
      +
    • +
    +
    +
  26. +
  27. +

    Click Next.

    +
  28. +
  29. +

    Optional: You can create a migration hook to run an Ansible playbook before or after migration:

    +
    +
      +
    1. +

      Click Add hook.

      +
    2. +
    3. +

      Select the Step when the hook will be run: pre-migration or post-migration.

      +
    4. +
    5. +

      Select a Hook definition:

      +
      +
        +
      • +

        Ansible playbook: Browse to the Ansible playbook or paste it into the field.

        +
      • +
      • +

        Custom container image: If you do not want to use the default hook-runner image, enter the image path: <registry_path>/<image_name>:<tag>.

        +
        + + + + + +
        +
        Note
        +
        +
        +

        The registry must be accessible to your OKD cluster.

        +
        +
        +
        +
      • +
      +
      +
    6. +
    +
    +
  30. +
  31. +

    Click Next.

    +
  32. +
  33. +

    Review your migration plan and click Finish.

    +
    +

    The migration plan is saved on the Plans page.

    +
    +
    +

    You can click the {kebab} of the migration plan and select View details to verify the migration plan details.

    +
    +
  34. +
+
+ + +
+ + diff --git a/documentation/modules/creating-network-mapping/index.html b/documentation/modules/creating-network-mapping/index.html new file mode 100644 index 00000000000..2987a66d0ad --- /dev/null +++ b/documentation/modules/creating-network-mapping/index.html @@ -0,0 +1,122 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a network mapping

+
+

You can create one or more network mappings by using the OKD web console to map source networks to KubeVirt networks.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    If you map more than one source and target network, each additional KubeVirt network requires its own network attachment definition.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationNetworkMaps for virtualization.

    +
  2. +
  3. +

    Click Create NetworkMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the network mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    Select a Source network and a Target namespace/network.

    +
  8. +
  9. +

    Optional: Click Add to create additional network mappings or to map multiple source networks to a single target network.

    +
  10. +
  11. +

    If you create an additional network mapping, select the network attachment definition as the target network.

    +
  12. +
  13. +

    Click Create.

    +
    +

    The network mapping is displayed on the NetworkMaps screen.

    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/modules/creating-storage-mapping/index.html b/documentation/modules/creating-storage-mapping/index.html new file mode 100644 index 00000000000..286e09d15b7 --- /dev/null +++ b/documentation/modules/creating-storage-mapping/index.html @@ -0,0 +1,138 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a storage mapping

+
+

You can create a storage mapping by using the OKD web console to map source disk storages to KubeVirt storage classes.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    Local and shared persistent storage that support VM migration.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationStorageMaps for virtualization.

    +
  2. +
  3. +

    Click Create StorageMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the storage mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    To create a storage mapping, click Add and map storage sources to target storage classes as follows:

    +
    +
      +
    1. +

      If your source provider is VMware vSphere, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    7. +

      If your source provider is a set of one or more OVA files, select a Source and a Target storage class for the dummy storage that applies to all virtual disks within the OVA files.

      +
    8. +
    9. +

      If your storage provider is KubeVirt. select a Source storage class and a Target storage class.

      +
    10. +
    11. +

      Optional: Click Add to create additional storage mappings, including mapping multiple storage sources to a single target storage class.

      +
    12. +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The mapping is displayed on the StorageMaps page.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/creating-validation-rule/index.html b/documentation/modules/creating-validation-rule/index.html new file mode 100644 index 00000000000..da87b169805 --- /dev/null +++ b/documentation/modules/creating-validation-rule/index.html @@ -0,0 +1,238 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a validation rule

+
+

You create a validation rule by applying a config map custom resource (CR) containing the rule to the Validation service.

+
+
+ + + + + +
+
Important
+
+
+
    +
  • +

    If you create a rule with the same name as an existing rule, the Validation service performs an OR operation with the rules.

    +
  • +
  • +

    If you create a rule that contradicts a default rule, the Validation service will not start.

    +
  • +
+
+
+
+
+
Validation rule example
+

Validation rules are based on virtual machine (VM) attributes collected by the Provider Inventory service.

+
+
+

For example, the VMware API uses this path to check whether a VMware VM has NUMA node affinity configured: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"].

+
+
+

The Provider Inventory service simplifies this configuration and returns a testable attribute with a list value:

+
+
+
+
"numaNodeAffinity": [
+    "0",
+    "1"
+],
+
+
+
+

You create a Rego query, based on this attribute, and add it to the forklift-validation-config config map:

+
+
+
+
`count(input.numaNodeAffinity) != 0`
+
+
+
+
Procedure
+
    +
  1. +

    Create a config map CR according to the following example:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: <forklift-validation-config>
    +  namespace: konveyor-forklift
    +data:
    +  vmware_multiple_disks.rego: |-
    +    package <provider_package> (1)
    +
    +    has_multiple_disks { (2)
    +      count(input.disks) > 1
    +    }
    +
    +    concerns[flag] {
    +      has_multiple_disks (3)
    +        flag := {
    +          "category": "<Information>", (4)
    +          "label": "Multiple disks detected",
    +          "assessment": "Multiple disks detected on this VM."
    +        }
    +    }
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the provider package name. Allowed values are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

      +
    2. +
    3. +

      Specify the concerns name and Rego query.

      +
    4. +
    5. +

      Specify the concerns name and flag parameter values.

      +
    6. +
    7. +

      Allowed values are Critical, Warning, and Information.

      +
    8. +
    +
    +
  2. +
  3. +

    Stop the Validation pod by scaling the forklift-controller deployment to 0:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=0 deployment/forklift-controller
    +
    +
    +
  4. +
  5. +

    Start the Validation pod by scaling the forklift-controller deployment to 1:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=1 deployment/forklift-controller
    +
    +
    +
  6. +
  7. +

    Check the Validation pod log to verify that the pod started:

    +
    +
    +
    $ kubectl logs -f <validation_pod>
    +
    +
    +
    +

    If the custom rule conflicts with a default rule, the Validation pod will not start.

    +
    +
  8. +
  9. +

    Remove the source provider:

    +
    +
    +
    $ kubectl delete provider <provider> -n konveyor-forklift
    +
    +
    +
  10. +
  11. +

    Add the source provider to apply the new rule:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <provider>
    +  namespace: konveyor-forklift
    +spec:
    +  type: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  secret:
    +    name: <secret> (3)
    +    namespace: konveyor-forklift
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ovirt, vsphere, and openstack.

      +
    2. +
    3. +

      Specify the API end point URL, for example, https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for oVirt, or https://<identity_service>/v3 for {osp}.

      +
    4. +
    5. +

      Specify the name of the provider Secret CR.

      +
    6. +
    +
    +
  12. +
+
+
+

You must update the rules version after creating a custom rule so that the Inventory service detects the changes and validates the VMs.

+
+ + +
+ + diff --git a/documentation/modules/creating-vddk-image/index.html b/documentation/modules/creating-vddk-image/index.html new file mode 100644 index 00000000000..2dd324e2daa --- /dev/null +++ b/documentation/modules/creating-vddk-image/index.html @@ -0,0 +1,201 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift can use the VMware Virtual Disk Development Kit (VDDK) SDK to accelerate transferring virtual disks from VMware vSphere.

+
+
+ + + + + +
+
Note
+
+
+

Creating a VDDK image, although optional, is highly recommended.

+
+
+
+
+

To make use of this feature, you download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry.

+
+
+

The VDDK package contains symbolic links, therefore, the procedure of creating a VDDK image must be performed on a file system that preserves symbolic links (symlinks).

+
+
+ + + + + +
+
Note
+
+
+

Storing the VDDK image in a public registry might violate the VMware license terms.

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    You are working on a file system that preserves symbolic links (symlinks).

    +
  • +
  • +

    If you are using an external registry, KubeVirt must be able to access it.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create and navigate to a temporary directory:

    +
    +
    +
    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
    +
    +
    +
  2. +
  3. +

    In a browser, navigate to the VMware VDDK version 8 download page.

    +
  4. +
  5. +

    Select version 8.0.1 and click Download.

    +
  6. +
+
+
+ + + + + +
+
Note
+
+
+

In order to migrate to KubeVirt 4.12, download VDDK version 7.0.3.2 from the VMware VDDK version 7 download page.

+
+
+
+
+
    +
  1. +

    Save the VDDK archive file in the temporary directory.

    +
  2. +
  3. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  4. +
  5. +

    Create a Dockerfile:

    +
    +
    +
    $ cat > Dockerfile <<EOF
    +FROM registry.access.redhat.com/ubi8/ubi-minimal
    +USER 1001
    +COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    +RUN mkdir -p /opt
    +ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    +EOF
    +
    +
    +
  6. +
  7. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  8. +
  9. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  10. +
  11. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/error-messages/index.html b/documentation/modules/error-messages/index.html new file mode 100644 index 00000000000..2a85079f234 --- /dev/null +++ b/documentation/modules/error-messages/index.html @@ -0,0 +1,83 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Error messages

+
+

This section describes error messages and how to resolve them.

+
+
+
warm import retry limit reached
+

The warm import retry limit reached error message is displayed during a warm migration if a VMware virtual machine (VM) has reached the maximum number (28) of changed block tracking (CBT) snapshots during the precopy stage.

+
+
+

To resolve this problem, delete some of the CBT snapshots from the VM and restart the migration plan.

+
+
+
Unable to resize disk image to required size
+

The Unable to resize disk image to required size error message is displayed when migration fails because a virtual machine on the target provider uses persistent volumes with an EXT4 file system on block storage. The problem occurs because the default overhead that is assumed by CDI does not completely include the reserved place for the root partition.

+
+
+

To resolve this problem, increase the file system overhead in CDI to more than 10%.

+
+ + +
+ + diff --git a/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..999c62adec4 --- /dev/null +++ b/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_OpenShift_0121 diff --git a/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg b/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..473e21ba4e2 --- /dev/null +++ b/documentation/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_OpenShift_0121 diff --git a/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg b/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..33a031a0909 --- /dev/null +++ b/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_0121 diff --git a/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg b/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..e73192c0102 --- /dev/null +++ b/documentation/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_0121 diff --git a/documentation/modules/images/forklift-logo-darkbg.png b/documentation/modules/images/forklift-logo-darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..06e9d1b249453946a449c8ba5d88c1014e7e3940 GIT binary patch literal 7554 zcmb`MhdW%)7x0x8gkTA)i%#^_HfnT>sEJ-y+Ylvs?@^;An+_xBgP&-1>|Gjr$Od*+#E&Y3yqe(sqxQ)9hbH`#BJkdWMh>T8=5Tf%>p z>IU(ex^1gUY^eS8Z32n%iT^68rbuBJ@g-#t^nniL3N1aof*|uatv3k?7cW#><6+qJ zzoN%)xVn&-lF$UO2#p}ZTUtY)H~ki)^9vG=T$uFNUB;6FfrNH1SSWVOT@@ZZQSDfm zuA%LUkvWm)a~fe!)CB;&3iP08GU~8FPK48=yQD9$IJU^Ydh?U>_rli zK}5L#{cMnL$%7&#h+v_I2iYIfG;Y?nJ3}QDhexq^#nr$dVftxXyFyD^yRRkAuO1lP zpd*d2^v|6*-rSbo$WO=2Wpxj+{13C`S+;y{DA(jtio?5n~9QHBvtx^=97C7nx0-hKDPIQHV**{Uw>u^ zut?bSwov@cZ-d>#T!!D3Ayb?bjRgRH0PigafjQ_&gze79E*gY^uiA z62>Z*`(TAp-0{S0(p74?R=urfI+(+?lc}U)%G3ab|Hi#VcY`|=rJS~$m>$!(UFEsn zTIfn?tU|Q*s(gJPCLbwRL{X(UPbmkbo zYdRUZtA=>lL9lB2IB=`{gc`?#AXG*FR$ZEv|Mw;dSM|YQcM1doA2w1P{hjJ}Ea4ec zYtD8%N{yde818x`9DAO-D|oC*G>@N=f?+9w`tq&6E5u_q|B3jMck7$C=Eq)TO*5Jq zxX%7lZ~ItUd11d{+%8uxD_T-i5TWR!(wVd)fMAj&tb!LS1zyX4c<7R{D;Y%Tmd4te z!eLMBtQlPVB3!BZT6Mw!GWlQU?(S~n!z7dZgL?c!tw_H0P065?SA%W)=lUEKJr%bL&Bv~@+eCl+i}+a~rsMG&$3ySLCn88GKR7`)XGSf_4iToj zUfXWi`w`(bFzT?;%dF(a(JJg#Z2WzV zsFT~??HB*v?D5w%BHn}(*2@-xc8n#1%6z43$?rvU&NpqLqGj*=r0aw$g<|) zR~`M{K3w_vF-wUxF=wKCn&3|Y_x`g;K&rZl6?kn^^A*v;SQ(B<2EC0;=v0aCw%p}( zP3QwnGlvao-fv#9YCkJ41$=^Um0S|!riw22CL-jY-Lp0qROOP(da z%5^^NlIuBa$UjF`3eNY1m74wFTzn|uwDA1oK-`1eN&25%r)^@qPHLEmi$&q zWhQYUZPVmU^4vVt8OkMN?t~z|{T9k@=gEqS4||_npuMLy$tAixnL9q76(RB1A=X@< z4AD)7>85I`M`CkXc3l<=#FqvYYV1a({&U-uIM=`EJ~fKsJQ*#IZqfDYKRPu8b=Zi> zlk(^_@}KcQ;8GUA(ePY-LM2)ZMKfIylGJ)5%(tf6=^S=6ON_E(k3*$WOJ1Pk0UUAT zg;Vc|^K;2Z3aHY(VF3m)+Tj-uKEStHnCWO<^(#Qt+We{PXC#(HO%FpZ zkjW>VlIijeIbfU~%I&9>>$hGwmAMJpDF_*i#!){qouzx02bA@I>F#DZnk0psC5_oJ zRXd6N9l(ZQ@_%JZe=ah~o_{|<3a@)O!hz!kY6#cVk{U^NAUR~KYJ*=5*E5E!C&$#3 z*#`t`sFtI3Vb^kIJU6|aV6CPF}BVHP9iu!nH|TsL@~yZrQ+ zuKU_%(G4l;fn0f&N?q-urEgtA{UapKz)LVVDGpNM=F63UXF& zcnP|T$QAO2lhOU&^SOSLsuLxL@i6_gnqtis(vxrO`Crny*~%RKIzI9Jb*8mT{_~2e zZYwu|ZqYq~XN(Ouy1D+-N|~q;y(~4IqeoWQLJApuse{*+=7!#j5XUCArY)sn9HjBI zVp_A4R$f|5Rf(r0;G~i#=l hf4Ncv*-{;YlcCgNx+du7|i{_A59EX|F#7*kV=hm z)x|t{I567e`pnXbeJr_x1eNl=Zp>R=PE~F7f+LSbbUO_ow(LX^BJM0N>1LR%+R<-m zCfqQ*mCh!USls9n{1RP1HSXWFgkT@22uvSDBA<(Sk9upFD1JJ8$s~30yIF@SQd?xZ z7iZ=cT5WdIc}T7%=XhE=D$7w%Ux_xKnVFW=9sYCl&n4rjWp4HIz;>6!Qgt&%{junb z?Gl#!8+EOG5cqH+T=T#dHX|-ZYR8_ux!pN9FjN@H30HKmb%iK)ZX-wpF zZJlJ|JXw@bkZjO;u)RySAnYk$?FV$7DCp9~4EUW}Q~KtVHyWHZ5`6zB_1c7NoO=G0 z^1Sw&ru!ou&)2Nj{B=WsJMG{VObNOdQT19*&%Df_CjdICWzyix3 z_~&cyO8r|hIL~p;o)atI{o!vQc%tY^wR?~O5zeum z_y^xIMonB9hHWg1qO#?C{QE?XFkK9*y3kATAFOp^HD%<0vax%T+8s_MJ%1zJ7DJbt z=d?bNW3QGWb9YYGU8pY0*!&~(n*{A4uh2;d-<+TV^h?LjSr*Zn*JiY+wppE7($=sw zNGz~DT3}tfS1Cr^+FCCIv>BkH1)w4E*W}2_sXeOdpiw{ znnm@L5Y&WRPftLd`m|``E6rSaMLu3=ui~psXESi<`qT`Ukl`guoP!AFlF*IcwY2;( z02rjLIsOqz7X3V`^IEZn30&N$F0H6Lt6Ha&+*>Zzq9=vTk7R7%oEKj_nh$^c_De?g zQ?u!_C%jVRJR}`_e~fR~ZxHG1L4V`g&*tIi^fxoWQ>Vy)!=ydwE+kHo|Bo?Q>Df#$ zO4%-~$S0eliY3bc6!BwOCUO29Eq>7Wa_%8#9r#1E8&p4=orV5y~3X2Q|^mQL|Z+hpT+OkKz$8$F#W+ zdE`=6$xZP^_?yMVVf&-E-Gi4Q_8U+Zf(JCR)JeJ~8>;LmO8M%7xp}x~nnB5J_jhzL z@$clX(ZHOl2KSY!gv`f=-WF~9pup)w2n){vF+U21itjQ@oboE`STmO-bOZf-qbNJ26eg&wx>#f`ge-!9J zWt6Sq`i5WM%fa_De{PX)9GCwBD@z`AQeR3#v9d(RGzacSkTG4>67fn`Lb99mh|jg85m_lPy$~rJ-xl7J zR4nqORxjnW1D}K&z}<%BBOR78*pvNNwg-1qT*4OE2d>26bxykBS%4Ut{+l}29u0iE z4Z}(+W|G{zW&^@oHEiE$le9tXkuVE<->%;?wENC_&vI0gXadkB$~dG?f#<5 z7Zy)SW0{(>EB04uJiWI|Y#maW_9SE@r7dCQJbs+%GVHPcfwPLe`aS^kJR- z;}afOh_NN9k*QCBXaB)JanAyDZ8-X}9Bn7~Z$qN99E6IkyrFY7!@3HFF8s7uL{{V+ zJ+;XQ;4E89j4{qki;8)D_6hw@V9w$D36KQc(U>6DJ?f4Hfz~ z55KSP(D&!cjTffVU@bj`rym8>`ZXg}Uuvyj<03_~!?%oa9X9sX_vTVL`d2hOVBlm} zEM5(8vdlzfFJ{GbUNH6fUf({);y3X667{0KtQS6adF89h!$GYRCgS+iB zc{U|F%Jse|>KE9qtbcNuRMeZl3e7kz(I-S?1aOOc+GHG69at`n)hyD#I0{M9Y1N%k zN-!E4l?Cok7%GWmgLm$F>S!12_F{XL9*K{UB6RiHO|{vz1hJ+XsJ55+))a&D;{3O{V!y5^c|ibao>P-MPBjBX@f`7a9YFyu@btJEG1H1QPQ0#8 zXLM`ox*D_pf+DtIxLIc51U zH2k=h^3$RIIZtI@2}^%GHhbx^xC~~&IAukeu{@ap?azwvhBl1ZZ{*xQ>%xWhy}qEp zsjuIJ!Ffm~a=xT0uQz~xZ?U-ITO&I!nIV!#H`6Zk7azOF^fM!}GN}T&eqp^(84o8S zzb_Cq@&*p6s{Og*kd!ZDeYC<{s; zQH=I1C?_S4m13>cEK6+s$I#QjyLS%M5NgkPUla-)XXt;n85wdxAD5%!?~SmT>7uR; zv(_Cs_^-$jgzk?MLQus{{h>CLGBc3iDZ{>88(tdjo*`GJi{3XzCdTMxJ>Dq|YaU!n z@nU!Q5cmQ;B{KqrDoxs;5J@mQ0Hak8Kx`EMC!RM-s*fM01 zwQ?B8R^=WAaPOBz(gfWVJQ5ilU8XU@ivc&QEa{kRpjJ5=D_kf@VSq~L#{GGtHkyDy^`7~HYZLZYQ=SZKs0?x8qua8vresi|#t}+l3 zQuVy4x|G$m#xMm_e_if&^{*v+QC;hVdy8K6_D2B+lN@CTI%zdrDy zxkvZlCkr>0K={qEL_rU*CdHa=X z#?pE@ak-;tX=-S&CtPI#nhW>j1bVxapu$~7yVevO^6zM^k|X~Sk)|s~FT)XQ(cYc= z(g7`F9uGo7>i*P+S1SM3=A*ND{Y`oA?l8aZp7A2vq97T~H&PrZUJBTd`P_wTk3!b& z&%jUryHY2+<>1rygsjm_&H8+;Qsw&_hx%r#Q zzwJG)7C|#xF3PyirE2nvo*!c2187$m3&sV&;*r=b`4vdk^8ZC)diMOEBsbSW`OV~HE%d(Wxt;z zuKixZ1+L$52pCJU7x>mHOHL`yu!EeJlDsYT$G9kb+)SI}Of9}=uBxG{pL;Mh@aCSP zptr>?$u-^VLsFYJ?7_v+1Hj^~M^EUo_h-MLEPmXQ8THN!YD1GBh}g9;=B&Fzdpe`m znt`5N1^m7>=pL7q_3z&x?_Cpj&D=P`Mffh$zjijZbox9gMmvbD$b{Yha5Q0R)h1-8 z7-xp?rF6VeN}}qj>qC}Bxu#F3MFW}pPg-$W2;aQ1nv9{dd+i%SAa$7<&*Nz|gs#I) zhY@WUo!=9nyEn-oiQ~qNY;YMFJ!nQN#7yy;*(oXve z=k%j&%+9d|Tm;WaFx-=SWD_%eNLymy^}{vpJT7{>7gS9%+#}&OVBmgB>@9xHc7E5TvXXtWCt7Z4xv|F?UG9@)vF5^<-e*rVk z-DC@`9`jK)@DC{j$04y?%ybRBe;Ow`!^Z!jZ(@hLRe+Fte3M{U3(^4&4;=93k3&|< z*4V&9*rlmY1^9|+(t(aj@H*Dh8`Wx7(u;d!TOW8YNN1#o_ujIREp$3NW3PteY4~@Z z0$Lf}?OowMxHR+w>aW8bkhX_xiZ%GS3H}6TLPvmnd)asUi{btYl~7PbFq7>EE)L*! z8T{ml(NZmG+jFWAm$Y-T$%vbKCtK^6bXQ-BM{5r#bC5SG^5L{WE(R_CPwYwoNUyiLqv`hC2U;lVQn zVvel+YwG#ALEldS%Mm|VSt`u%r+rl;ZpuBTTL$MY`HWCDy|xk9yWqW7zGrKtYT>jf zh9eJOS>6KTmE-dItm)}Vi7{GUP+v@Ehv(>;-!p^@1Bumc2`&gFa)IktWb|tjfUMnJ zPr4UgVw-qDRd4u9V%98zJQf7>&P7IBcSl&8@x5#V7*TMO*X{Bd$+jmKk@wk`?);&L zpC|@fSG9Zu{cQLczMU5*=9)Si=ZRbAOPDvi&mBuX%Xy{qK=Dc;FC{;}MSrj3OmA@p z=p5Zj%*#^y^6fR}rvDU}Vm(1PAZ({pQnu!S z&KlkkN>9@G#%B9gR36OAk=L!t{f!7VVD!y<)r&U2 zp=jR2<5-b9g9Zr{kIFK}GEtceEux2qKaYmJs@ z#OL&&if|l%CkD1h!7IT`?X&luP)-FS2)P?b(S+LPABXbQbLH9viDU@>QeQaLl^8QZ zqt8b%OTFz5x5^0=D?_T1Ua0X+8spS+_K=2gA1ezB*SDTI2uU720bNANo_i&zZq+kh zUJ~RN@4}wS7Mef5T$5=`gxPsZUOA2w3sw|1$6r6ET01|`5wI0GMvqQMv!k(xl#P^`|hb3x2HO|Cc9%#`Q`cNUa;&8!^_>` z&Kck4d|1R6nh)z81ICOUNybF*#Hi7TQ gbg{?(Q^_@H&scJLf*92(@%)qos$;BOr3p*;KPV)_)c^nh literal 0 HcmV?d00001 diff --git a/documentation/modules/images/forklift-logo-darkbg.svg b/documentation/modules/images/forklift-logo-darkbg.svg new file mode 100644 index 00000000000..8a846e6361a --- /dev/null +++ b/documentation/modules/images/forklift-logo-darkbg.svg @@ -0,0 +1,164 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/modules/images/forklift-logo-lightbg.png b/documentation/modules/images/forklift-logo-lightbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8dba83d97f88dbd1722f30a77c915edd4640fe2c GIT binary patch literal 7667 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 V*?3s0ee+>Uq@!i1Spl(){C|U8&Q|~c literal 0 HcmV?d00001 diff --git a/documentation/modules/images/forklift-logo-lightbg.svg b/documentation/modules/images/forklift-logo-lightbg.svg new file mode 100644 index 00000000000..a8038cdf923 --- /dev/null +++ b/documentation/modules/images/forklift-logo-lightbg.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/modules/images/kebab.png b/documentation/modules/images/kebab.png new file mode 100644 index 0000000000000000000000000000000000000000..81893bd4ad103557f7180529ae228e313e8319c5 GIT binary patch literal 329 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 A + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Increasing the NFC service memory of an ESXi host

+
+

If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host. Otherwise, the migration will fail because the NFC service memory is limited to 10 parallel connections.

+
+
+
Procedure
+
    +
  1. +

    Log in to the ESXi host as root.

    +
  2. +
  3. +

    Change the value of maxMemory to 1000000000 in /etc/vmware/hostd/config.xml:

    +
    +
    +
    ...
    +      <nfcsvc>
    +         <path>libnfcsvc.so</path>
    +         <enabled>true</enabled>
    +         <maxMemory>1000000000</maxMemory>
    +         <maxStreamMemory>10485760</maxStreamMemory>
    +      </nfcsvc>
    +...
    +
    +
    +
  4. +
  5. +

    Restart hostd:

    +
    +
    +
    # /etc/init.d/hostd restart
    +
    +
    +
    +

    You do not need to reboot the host.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/installing-mtv-operator/index.html b/documentation/modules/installing-mtv-operator/index.html new file mode 100644 index 00000000000..f873b4a75b0 --- /dev/null +++ b/documentation/modules/installing-mtv-operator/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/issue_templates/issue.md b/documentation/modules/issue_templates/issue.md new file mode 100644 index 00000000000..30d52ab9cba --- /dev/null +++ b/documentation/modules/issue_templates/issue.md @@ -0,0 +1,15 @@ +## Summary + +(Describe the problem. Don't worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.) + +## What is the problem? + +(Paste the text or a screenshot here. Remember to include the **task number** so that we know which module is affected.) + +## What is the solution? + +(Correct text, link, or task.) + +## Notes + +(Do we need to fix something else?) diff --git a/documentation/modules/issue_templates/issue/index.html b/documentation/modules/issue_templates/issue/index.html new file mode 100644 index 00000000000..a97dc874dab --- /dev/null +++ b/documentation/modules/issue_templates/issue/index.html @@ -0,0 +1,79 @@ + + + + + + + + Summary | Forklift Documentation + + + + + + + + + + + + + +Summary | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + +
+

Summary

+ +

(Describe the problem. Don’t worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.)

+ +

What is the problem?

+ +

(Paste the text or a screenshot here. Remember to include the task number so that we know which module is affected.)

+ +

What is the solution?

+ +

(Correct text, link, or task.)

+ +

Notes

+ +

(Do we need to fix something else?)

+ + + +
+ + diff --git a/documentation/modules/known-issues-2-7/index.html b/documentation/modules/known-issues-2-7/index.html new file mode 100644 index 00000000000..dd120499133 --- /dev/null +++ b/documentation/modules/known-issues-2-7/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Known issues

+
+

Forklift 2.7 has the following known issues:

+
+
+
Select Migration Network from the endpoint type ESXi displays multiple incorrect networks
+

When you choose Select Migration Network, from the endpoint type of ESXi, multiple incorrect networks are displayed. (MTV-1291)

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+
+
Network and Storage maps in the UI are not correct when created from the command line
+

When creating Network and Storage maps from the UI, the correct names are not shown in the UI. (MTV-1421)

+
+
+
Migration fails with module network-legacy configured in RHEL guests
+

Migration fails if the module configuration file is available in the guest and the dhcp-client package is not installed, returning a dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found error. (MTV-1615)

+
+ + +
+ + diff --git a/documentation/modules/making-open-source-more-inclusive/index.html b/documentation/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 00000000000..d7d1b9422a1 --- /dev/null +++ b/documentation/modules/making-open-source-more-inclusive/index.html @@ -0,0 +1,69 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Making open source more inclusive

+
+

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.

+
+ + +
+ + diff --git a/documentation/modules/migration-plan-options-ui/index.html b/documentation/modules/migration-plan-options-ui/index.html new file mode 100644 index 00000000000..693e30962d6 --- /dev/null +++ b/documentation/modules/migration-plan-options-ui/index.html @@ -0,0 +1,141 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migration plan options

+
+

On the Plans for virtualization page of the OKD web console, you can click the {kebab} beside a migration plan to access the following options:

+
+
+
    +
  • +

    Get logs: Retrieves the logs of a migration. When you click Get logs, a confirmation window opens. After you click Get logs in the window, wait until Get logs changes to Download logs and then click the button to download the logs.

    +
  • +
  • +

    Edit: Edit the details of a migration plan. You cannot edit a migration plan while it is running or after it has completed successfully.

    +
  • +
  • +

    Duplicate: Create a new migration plan with the same virtual machines (VMs), parameters, mappings, and hooks as an existing plan. You can use this feature for the following tasks:

    +
    +
      +
    • +

      Migrate VMs to a different namespace.

      +
    • +
    • +

      Edit an archived migration plan.

      +
    • +
    • +

      Edit a migration plan with a different status, for example, failed, canceled, running, critical, or ready.

      +
    • +
    +
    +
  • +
  • +

    Archive: Delete the logs, history, and metadata of a migration plan. The plan cannot be edited or restarted. It can only be viewed.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Archive option is irreversible. However, you can duplicate an archived plan.

    +
    +
    +
    +
  • +
  • +

    Delete: Permanently remove a migration plan. You cannot delete a running migration plan.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Delete option is irreversible.

    +
    +
    +

    Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

    +
    +
    +
    +
  • +
  • +

    View details: Display the details of a migration plan.

    +
  • +
  • +

    Restart: Restart a failed or canceled migration plan.

    +
  • +
  • +

    Cancel scheduled cutover: Cancel a scheduled cutover migration for a warm migration plan.

    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/mtv-changelog-2-7/index.html b/documentation/modules/mtv-changelog-2-7/index.html new file mode 100644 index 00000000000..cde94042635 --- /dev/null +++ b/documentation/modules/mtv-changelog-2-7/index.html @@ -0,0 +1,2330 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift changelog

+
+
+
+

The following changelog for Forklift includes a full list of packages used in the Forklift 2.7 releases.

+
+
+
+
+

Forklift 2.7 packages

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift packages
Forklift 2.7.0Forklift 2.7.2Forklift 2.7.3

abattis-cantarell-fonts-0.301-4.el9.noarch

abattis-cantarell-fonts-0.301-4.el9.noarch

Abattis-cantarell-fonts-0.301-4.el9.noarch

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glibc-2.34-100.el9_4.3.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.3.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.3.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.3.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtpms-0.9.1-3.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

linux-firmware-20240716-143.2.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240716-143.2.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.46.1-2.el9_4.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

+
+
+ + +
+ + diff --git a/documentation/modules/mtv-overview-page/index.html b/documentation/modules/mtv-overview-page/index.html new file mode 100644 index 00000000000..e49bd510186 --- /dev/null +++ b/documentation/modules/mtv-overview-page/index.html @@ -0,0 +1,214 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV Overview page

+
+
+
+

The Forklift Overview page displays system-wide information about migrations and a list of Settings you can change.

+
+
+

If you have Administrator privileges, you can access the Overview page by clicking MigrationOverview in the OKD web console.

+
+
+

The Overview page has 3 tabs:

+
+
+
    +
  • +

    Overview

    +
  • +
  • +

    YAML

    +
  • +
  • +

    Metrics

    +
  • +
+
+
+
+
+

Overview tab

+
+
+

The Overview tab lets you see:

+
+
+
    +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the Operator

    +
  • +
  • +

    Pods: The name, status, and creation time of each pod that was deployed by the Forklift Operator

    +
  • +
  • +

    Conditions: Status of the Forklift Operator:

    +
    +
      +
    • +

      Failure: Last failure. False indicates no failure since deployment.

      +
    • +
    • +

      Running: Whether the Operator is currently running and waiting for the next reconciliation.

      +
    • +
    • +

      Successful: Last successful reconciliation.

      +
    • +
    +
    +
  • +
+
+
+
+
+

YAML tab

+
+
+

The custom resource ForkliftController that defines the operation of the Forklift Operator. You can modify the custom resource from this tab.

+
+
+
+
+

Metrics tab

+
+
+

The Metrics tab lets you see:

+
+
+
    +
  • +

    Migrations: The number of migrations performed using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
  • +

    Virtual Machine Migrations: The number of VMs migrated using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Since a single migration might involve many virtual machines, the number of migrations performed using Forklift might vary significantly from the number of virtual machines that have been migrated using Forklift.

+
+
+
+
+
    +
  • +

    Chart showing the number of running, failed, and succeeded migrations performed using Forklift for each of the last 7 days

    +
  • +
  • +

    Chart showing the number of running, failed, and succeeded virtual machine migrations performed using Forklift for each of the last 7 days

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/modules/mtv-performance-addendum/index.html b/documentation/modules/mtv-performance-addendum/index.html new file mode 100644 index 00000000000..55a1818d6c4 --- /dev/null +++ b/documentation/modules/mtv-performance-addendum/index.html @@ -0,0 +1,291 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance addendum

+
+
+
+

Unresolved directive in mtv-performance-addendum.adoc - include::snip_performance.adoc[]

+
+
+
+
+

ESXi performance

+
+
+
Single ESXi performance
+

Test migration using the same ESXi host.

+
+
+

In each iteration, the total VMs are increased, to display the impact of concurrent migration on the duration.

+
+
+

The results show that migration time is linear when increasing the total VMs (50 GiB disk, Utilization 70%).

+
+
+

The optimal number of VMs per ESXi is 10.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Single ESXi tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, Private Network [1]

2.6

7.0.3

100

cold

0:21:39

cold migration, 20 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

0:41:16

cold migration, 30 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:00:59

cold migration, 40 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:23:02

cold migration, 50 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:46:24

cold migration, 80 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

2:42:49

cold migration, 100 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

3:25:15

+
+
Multi ESXi hosts and single data store
+

In each iteration, the number of ESXi hosts were increased, to show that increasing the number of ESXi hosts improves the migration time (50 GiB disk, Utilization 70%).

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Multi ESXi hosts and single data store
Test Case DescriptionMTVVDDKMax_vm inflightMigration TypeTotal Duration

cold migration, 100 VMs, Single ESXi, Private Network [2]

2.6

7.0.3

100

cold

3:25:15

cold migration, 100 VMs, 4 ESXs (25 VMs per ESX), Private Network

2.6

7.0.3

100

cold

1:22:27

cold migration, 100 VMs, 5 ESXs (20 VMs per ESX), Private Network, 1 DataStore

2.6

7.0.3

100

cold

1:04:57

+
+
+
+

Different migration network performance

+
+
+

Each iteration the Migration Network was changed, using the Provider, to find the fastest network for migration.

+
+
+

The results show that there is no degradation using management compared to non-managment networks when all interfaces and network speeds are the same.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Different migration network tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, MGMT Network

2.6

7.0.3

100

cold

0:21:30

cold migration, 10 VMs, Single ESXi, Private Network [3]

2.6

7.0.3

20

cold

0:21:20

cold migration, 10 VMs, Single ESXi, Default Network

2.6.2

7.0.3

20

cold

0:21:30

+
+
+
+
+
+1. Private Network refers to a non -Management network +
+
+2. Private Network refers to a non-Management network +
+
+3. Private Network refers to a non-Management network +
+
+ + +
+ + diff --git a/documentation/modules/mtv-performance-recommendation/index.html b/documentation/modules/mtv-performance-recommendation/index.html new file mode 100644 index 00000000000..fc3155d8989 --- /dev/null +++ b/documentation/modules/mtv-performance-recommendation/index.html @@ -0,0 +1,382 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance recommendations

+
+
+
+

The purpose of this section is to share recommendations for efficient and effective migration of virtual machines (VMs) using Forklift, based on findings observed through testing.

+
+
+

Unresolved directive in mtv-performance-recommendation.adoc - include::snip_performance.adoc[]

+
+
+
+
+

Ensure fast storage and network speeds

+
+
+

Ensure fast storage and network speeds, both for VMware and OKD (OCP) environments.

+
+
+
    +
  • +

    To perform fast migrations, VMware must have fast read access to datastores.  Networking between VMware ESXi hosts should be fast, ensure a 10 GiB network connection, and avoid network bottlenecks.

    +
    +
      +
    • +

      Extend the VMware network to the OCP Workers Interface network environment.

      +
    • +
    • +

      It is important to ensure that the VMware network offers high throughput (10 Gigabit Ethernet) and rapid networking to guarantee that the reception rates align with the read rate of the ESXi datastore.

      +
    • +
    • +

      Be aware that the migration process uses significant network bandwidth and that the migration network is utilized. If other services utilize that network, it may have an impact on those services and their migration rates.

      +
    • +
    • +

      For example, 200 to 325 MiB/s was the average network transfer rate from the vmnic for each ESXi host associated with transferring data to the OCP interface.

      +
    • +
    +
    +
  • +
+
+
+
+
+

Ensure fast datastore read speeds to ensure efficient and performant migrations.

+
+
+

Datastores read rates impact the total transfer times, so it is essential to ensure fast reads are possible from the ESXi datastore to the ESXi host.  

+
+
+

Example in numbers: 200 to 300 MiB/s was the average read rate for both vSphere and ESXi endpoints for a single ESXi server. When multiple ESXi servers are used, higher datastore read rates are possible.

+
+
+
+
+

Endpoint types 

+
+
+

Forklift 2.6 allows for the following vSphere provider options:

+
+
+
    +
  • +

    ESXi endpoint (inventory and disk transfers from ESXi), introduced in Forklift 2.6

    +
  • +
  • +

    vCenter Server endpoint; no networks for the ESXi host (inventory and disk transfers from vCenter)

    +
  • +
  • +

    vCenter endpoint and ESXi networks are available (inventory from vCenter, disk transfers from ESXi).

    +
  • +
+
+
+

When transferring many VMs that are registered to multiple ESXi hosts, using the vCenter endpoint and ESXi network is suggested.

+
+
+ + + + + +
+
Note
+
+
+

As of vSphere 7.0, ESXi hosts can label which network to use for NBD transport. This is accomplished by tagging the desired virtual network interface card (NIC) with the appropriate vSphereBackupNFC label.  When this is done, Forklift will be able to utilize the ESXi interface for network transfer to Openshift as long as the worker and ESXi host interfaces are reachable.  This is especially useful when migration users may not have access to the ESXi credentials yet would like to be able to control which ESXi interface is used for migration. 

+
+
+

For more details, see: (Forklift-1230)

+
+
+
+
+

You can use the following ESXi command, which designates interface vmk2 for NBD backup:

+
+
+
+
esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
+
+
+
+
+
+

Set ESXi hosts BIOS profile and ESXi Host Power Management for High Performance

+
+
+

Where possible, ensure that hosts used to perform migrations are set with BIOS profiles related to maximum performance.  Hosts which use Host Power Management controlled within vSphere should check that High Performance is set.

+
+
+

Testing showed that when transferring more than 10 VMs with both BIOS and host power management set accordingly, migrations had an increase of 15 MiB in the average datastore read rate.

+
+
+
+
+

Avoid additional network load on VMware networks

+
+
+

You can reduce the network load on VMware networks by selecting the migration network when using the ESXi endpoint.

+
+
+

By incorporating a virtualization provider, Forklift enables the selection of a specific network, which is accessible on the ESXi hosts, for the purpose of migrating virtual machines to OCP.  Selecting this migration network from the ESXi host in the Forklift UI will ensure that the transfer is performed using the selected network as an ESXi endpoint..

+
+
+

It is imperative to ensure that the network selected has connectivity to the OCP interface, has adequate bandwidth for migrations, and that the network interface is not saturated.

+
+
+

In environments with fast networks, such as 10GbE networks, migration network impacts can be expected to match the rate of ESXi datastore reads.

+
+
+
+
+

Control maximum concurrent disk migrations per ESXi host.

+
+
+

Set the MAX_VM_INFLIGHT MTV variable to control the maximum number of concurrent VMs transfers allowed for the ESXi host. 

+
+
+

Forklift allows for concurrency to be controlled using this variable; by default, it is set to 20.

+
+
+

When setting MAX_VM_INFLIGHT, consider the number of maximum concurrent VMs transfers are required for ESXi hosts. It is important to consider the type of migration to be transferred concurrently. Warm migrations, which are defined by migrations of a running VM that will be migrated over a scheduled time.

+
+
+

Warm migrations use snapshots to compare and migrate only the differences between previous snapshots of the disk.  The migration of the differences between snapshots happens over specific intervals before a final cut-over of the running VM to OKD occurs. 

+
+
+

In Forklift 2.6, MAX_VM_INFLIGHT reserves one transfer slot per VM, regardless of current migration activity for a specific snapshot or the number of disks that belong to a single vm. The total set by MAX_VM_INFLIGHT is used to indicate how many concurrent VM tranfers per ESXi host is allowed.

+
+
+
Examples
+
    +
  • +

    MAX_VM_INFLIGHT = 20 and 2 ESXi hosts defined in the provider mean each host can transfer 20 VMs.

    +
  • +
+
+
+
+
+

Migrations are completed faster when migrating multiple VMs concurrently

+
+
+

When multiple VMs from a specific ESXi host are to be migrated, starting concurrent migrations for multiple VMs leads to faster migration times. 

+
+
+

Testing demonstrated that migrating 10 VMs (each containing 35 GiB of data, with a total size of 50 GiB) from a single host is significantly faster than migrating the same number of VMs sequentially, one after another. 

+
+
+

It is possible to increase concurrent migration to more than 10 virtual machines from a single host, but it does not show a significant improvement. 

+
+
+
Examples
+
    +
  • +

    1 single disk VMs took 6 minutes, with migration rate of 100 MiB/s

    +
  • +
  • +

    10 single disk VMs took 22 minutes, with migration rate of 272 MiB/s

    +
  • +
  • +

    20 single disk VMs took 42 minutes, with migration rate of 284 MiB/s

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that the migration of 10 virtual machines simultaneously is three times faster than the migration of identical virtual machines in a sequential manner.

+
+
+

The migration rate was almost the same when moving 10 or 20 virtual machines simultaneously.

+
+
+
+
+
+
+

Migrations complete faster using multiple hosts.

+
+
+

Using multiple hosts with registered VMs equally distributed among the ESXi hosts used for migrations leads to faster migration times.

+
+
+

Testing showed that when transferring more than 10 single disk VMS, each containing 35 GiB of data out of a total of 50G total, using an additional host can reduce migration time.

+
+
+
Examples
+
    +
  • +

    80 single disk VMs, containing 35 GiB of data each, using a single host took 2 hours and 43 minutes, with a migration rate of 294 MiB/s.

    +
  • +
  • +

    80 single disk VMs, containing 35 GiB of data each, using 8 ESXi hosts took 41 minutes, with a migration rate of 1,173 MiB/s.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that migrating 80 VMs from 8 ESXi hosts, 10 from each host, concurrently is four times faster than running the same VMs from a single ESXi host. 

+
+
+

Migrating a larger number of VMs from more than 8 ESXi hosts concurrently could potentially show increased performance. However, it was not tested and therefore not recommended.

+
+
+
+
+
+
+

Multiple migration plans compared to a single large migration plan

+
+
+

The maximum number of disks that can be referenced by a single migration plan is 500. For more details, see (MTV-1203)

+
+
+

When attempting to migrate many VMs in a single migration plan, it can take some time for all migrations to start.  By breaking up one migration plan into several migration plans, it is possible to start them at the same time.

+
+
+

Comparing migrations of:

+
+
+
    +
  • +

    500 VMs using 8 ESXi hosts in 1 plan, max_vm_inflight=100, took 5 hours and 10 minutes.

    +
  • +
  • +

    800 VMs using 8 ESXi hosts with 8 plans, max_vm_inflight=100, took 57 minutes.

    +
  • +
+
+
+

Testing showed that by breaking one single large plan into multiple moderately sized plans, for example, 100 VMS per plan, the total migration time can be reduced.

+
+
+
+
+

Maximum values tested

+
+
+
    +
  • +

    Maximum number of ESXi hosts tested: 8

    +
  • +
  • +

    Maximum number of VMs in a single migration plan: 500

    +
  • +
  • +

    Maximum number of VMs migrated in a single test: 5000

    +
  • +
  • +

    Maximum number of migration plans performed concurrently: 40

    +
  • +
  • +

    Maximum single disk size migrated: 6 T disks, which contained 3 Tb of data

    +
  • +
  • +

    Maximum number of disks on a single VM migrated: 50

    +
  • +
  • +

    Highest observed single datastore read rate from a single ESXi server:  312 MiB/second

    +
  • +
  • +

    Highest observed multi-datastore read rate using eight ESXi servers and two datastores: 1,242 MiB/second

    +
  • +
  • +

    Highest observed virtual NIC transfer rate to an {ocp-name} worker: 327 MiB/second

    +
  • +
  • +

    Maximum migration transfer rate of a single disk: 162 MiB/second (rate observed when transferring nonconcurrent migration of 1.5 Tb utilized data)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from a single ESXi host: 294 MiB/s (concurrent migration of 30 VMs, 35/50 GiB used, from Single ESXi)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from multiple ESXi hosts: 1173MB/s (concurrent migration of 80 VMs, 35/50 GiB used, from 8 ESXi servers, 10 VMs from each ESXi)

    +
  • +
+
+
+

For additional details on performance, see Forklift performance addendum

+
+
+
+ + +
+ + diff --git a/documentation/modules/mtv-resources-and-services/index.html b/documentation/modules/mtv-resources-and-services/index.html new file mode 100644 index 00000000000..77eae4cac23 --- /dev/null +++ b/documentation/modules/mtv-resources-and-services/index.html @@ -0,0 +1,131 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift custom resources and services

+
+

Forklift is provided as an OKD Operator. It creates and manages the following custom resources (CRs) and services.

+
+
+
Forklift custom resources
+
    +
  • +

    Provider CR stores attributes that enable Forklift to connect to and interact with the source and target providers.

    +
  • +
  • +

    NetworkMapping CR maps the networks of the source and target providers.

    +
  • +
  • +

    StorageMapping CR maps the storage of the source and target providers.

    +
  • +
  • +

    Plan CR contains a list of VMs with the same migration parameters and associated network and storage mappings.

    +
  • +
  • +

    Migration CR runs a migration plan.

    +
    +

    Only one Migration CR per migration plan can run at a given time. You can create multiple Migration CRs for a single Plan CR.

    +
    +
  • +
+
+
+
Forklift services
+
    +
  • +

    The Inventory service performs the following actions:

    +
    +
      +
    • +

      Connects to the source and target providers.

      +
    • +
    • +

      Maintains a local inventory for mappings and plans.

      +
    • +
    • +

      Stores VM configurations.

      +
    • +
    • +

      Runs the Validation service if a VM configuration change is detected.

      +
    • +
    +
    +
  • +
  • +

    The Validation service checks the suitability of a VM for migration by applying rules.

    +
  • +
  • +

    The Migration Controller service orchestrates migrations.

    +
    +

    When you create a migration plan, the Migration Controller service validates the plan and adds a status label. If the plan fails validation, the plan status is Not ready and the plan cannot be used to perform a migration. If the plan passes validation, the plan status is Ready and it can be used to perform a migration. After a successful migration, the Migration Controller service changes the plan status to Completed.

    +
    +
  • +
  • +

    The Populator Controller service orchestrates disk transfers using Volume Populators.

    +
  • +
  • +

    The Kubevirt Controller and Containerized Data Import (CDI) Controller services handle most technical operations.

    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/mtv-selected-packages-2-7/index.html b/documentation/modules/mtv-selected-packages-2-7/index.html new file mode 100644 index 00000000000..8372266dd6a --- /dev/null +++ b/documentation/modules/mtv-selected-packages-2-7/index.html @@ -0,0 +1,207 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift selected packages

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Selected Forklift packages
Package summaryForklift 2.7.0Forklift 2.7.2Forklift 2.7.3

The skeleton package which defines a simple Red Hat Enterprise Linux system

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

Core kernel modules to match the core kernel

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

The Linux kernel

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

Access and modify virtual machine disk images

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

Client side utilities of the libvirt library

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

Libvirt libraries

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

QEMU driver plugin for the libvirtd daemon

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

NBD server

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

Basic filters for nbdkit

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

Basic plugins for nbdkit

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

HTTP/FTP (cURL) plugin for nbdkit

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

NBD proxy / forward plugin for nbdkit

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

Python 3 plugin for nbdkit

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

The nbdkit server

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

SSH plugin for nbdkit

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

VMware VDDK plugin for nbdkit

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

QEMU command line tool for manipulating disk images

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

QEMU common files needed by all QEMU targets

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

+

qemu-kvm core components

+

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

Convert a virtual machine to run on KVM

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

+ + +
+ + diff --git a/documentation/modules/mtv-settings/index.html b/documentation/modules/mtv-settings/index.html new file mode 100644 index 00000000000..ea0a0a666fe --- /dev/null +++ b/documentation/modules/mtv-settings/index.html @@ -0,0 +1,133 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring MTV settings

+
+

If you have Administrator privileges, you can access the Overview page and change the following settings in it:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift settings
SettingDescriptionDefault value

Max concurrent virtual machine migrations

The maximum number of VMs per plan that can be migrated simultaneously

20

Must gather cleanup after (hours)

The duration for retaining must gather reports before they are automatically deleted

Disabled

Controller main container CPU limit

The CPU limit allocated to the main controller container

500 m

Controller main container Memory limit

The memory limit allocated to the main controller container

800 Mi

Precopy internal (minutes)

The interval at which a new snapshot is requested before initiating a warm migration

60

Snapshot polling interval (seconds)

The frequency with which the system checks the status of snapshot creation or removal during a warm migration

10

+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationOverview. The Settings list is on the right-hand side of the page.

    +
  2. +
  3. +

    In the Settings list, click the Edit icon of the setting you want to change.

    +
  4. +
  5. +

    Choose a setting from the list.

    +
  6. +
  7. +

    Click Save.

    +
  8. +
+
+ + +
+ + diff --git a/documentation/modules/mtv-ui/index.html b/documentation/modules/mtv-ui/index.html new file mode 100644 index 00000000000..c233f03cda6 --- /dev/null +++ b/documentation/modules/mtv-ui/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV user interface

+
+

The Forklift user interface is integrated into the OKD web console.

+
+
+

In the left-hand panel, you can choose a page related to a component of the migration progress, for example, Providers for Migration, or, if you are an administrator, you can choose Overview, which contains information about migrations and lets you configure Forklift settings.

+
+
+
+Forklift user interface +
+
Figure 1. Forklift extension interface
+
+
+

In pages related to components, you can click on the Projects list, which is in the upper-left portion of the page, and see which projects (namespaces) you are allowed to work with.

+
+
+
    +
  • +

    If you are an administrator, you can see all projects.

    +
  • +
  • +

    If you are a non-administrator, you can see only the projects that you have permissions to work with.

    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/mtv-workflow/index.html b/documentation/modules/mtv-workflow/index.html new file mode 100644 index 00000000000..7ac620a124c --- /dev/null +++ b/documentation/modules/mtv-workflow/index.html @@ -0,0 +1,113 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

High-level migration workflow

+
+

The high-level workflow shows the migration process from the point of view of the user:

+
+
+
    +
  1. +

    You create a source provider, a target provider, a network mapping, and a storage mapping.

    +
  2. +
  3. +

    You create a Plan custom resource (CR) that includes the following resources:

    +
    +
      +
    • +

      Source provider

      +
    • +
    • +

      Target provider, if Forklift is not installed on the target cluster

      +
    • +
    • +

      Network mapping

      +
    • +
    • +

      Storage mapping

      +
    • +
    • +

      One or more virtual machines (VMs)

      +
    • +
    +
    +
  4. +
  5. +

    You run a migration plan by creating a Migration CR that references the Plan CR.

    +
    +

    If you cannot migrate all the VMs for any reason, you can create multiple Migration CRs for the same Plan CR until all VMs are migrated.

    +
    +
  6. +
  7. +

    For each VM in the Plan CR, the Migration Controller service records the VM migration progress in the Migration CR.

    +
  8. +
  9. +

    Once the data transfer for each VM in the Plan CR completes, the Migration Controller service creates a VirtualMachine CR.

    +
    +

    When all VMs have been migrated, the Migration Controller service updates the status of the Plan CR to Completed. The power state of each source VM is maintained after migration.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/network-prerequisites/index.html b/documentation/modules/network-prerequisites/index.html new file mode 100644 index 00000000000..bbdc659bbbe --- /dev/null +++ b/documentation/modules/network-prerequisites/index.html @@ -0,0 +1,196 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Network prerequisites

+
+
+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    IP addresses, VLANs, and other network configuration settings must not be changed before or during migration. The MAC addresses of the virtual machines are preserved during migration.

    +
  • +
  • +

    The network connections between the source environment, the KubeVirt cluster, and the replication repository must be reliable and uninterrupted.

    +
  • +
  • +

    If you are mapping more than one source and destination network, you must create a network attachment definition for each additional destination network.

    +
  • +
+
+
+
+
+

Ports

+
+
+

The firewalls must enable traffic over the following ports:

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Network ports required for migrating from VMware vSphere
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

VMware vCenter

+

VMware provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer authentication

+

902

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer data copy

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Network ports required for migrating from oVirt
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

oVirt Engine

+

oVirt provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer authentication

+

54322

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer data copy

+
+
+
+ + +
+ + diff --git a/documentation/modules/new-features-and-enhancements-2-7/index.html b/documentation/modules/new-features-and-enhancements-2-7/index.html new file mode 100644 index 00000000000..b9b3f63b455 --- /dev/null +++ b/documentation/modules/new-features-and-enhancements-2-7/index.html @@ -0,0 +1,85 @@ + + + + + + + + New features and enhancements | Forklift Documentation + + + + + + + + + + + + + +New features and enhancements | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

New features and enhancements

+
+
+
+

Forklift 2.7 introduces the following features and enhancements:

+
+
+
+
+

New features and enhancements 2.7.0

+
+
+
    +
  • +

    In Forklift 2.7.0, warm migration is now based on RHEL 9 inheriting features and bug fixes.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/modules/new-migrating-virtual-machines-cli/index.html b/documentation/modules/new-migrating-virtual-machines-cli/index.html new file mode 100644 index 00000000000..54fdd97cbf5 --- /dev/null +++ b/documentation/modules/new-migrating-virtual-machines-cli/index.html @@ -0,0 +1,155 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
  5. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/non-admin-permissions-for-ui/index.html b/documentation/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 00000000000..fccae335436 --- /dev/null +++ b/documentation/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,192 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Permissions needed by non-administrators to work with migration plan components

+
+

If you are an administrator, you can work with all components of migration plans (for example, providers, network mappings, and migration plans).

+
+
+

By default, non-administrators have limited ability to work with migration plans and their components. As an administrator, you can modify their roles to allow them full access to all components, or you can give them limited permissions.

+
+
+

For example, administrators can assign non-administrators one or more of the following cluster roles for migration plans:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Example migration plan roles and their privileges
RoleDescription

plans.forklift.konveyor.io-v1beta1-view

Can view migration plans but not to create, delete or modify them

plans.forklift.konveyor.io-v1beta1-edit

Can create, delete or modify (all parts of edit permissions) individual migration plans

plans.forklift.konveyor.io-v1beta1-admin

All edit privileges and the ability to delete the entire collection of migration plans

+
+

Note that pre-defined cluster roles include a resource (for example, plans), an API group (for example, forklift.konveyor.io-v1beta1) and an action (for example, view, edit).

+
+
+

As a more comprehensive example, you can grant non-administrators the following set of permissions per namespace:

+
+
+
    +
  • +

    Create and modify storage maps, network maps, and migration plans for the namespaces they have access to

    +
  • +
  • +

    Attach providers created by administrators to storage maps, network maps, and migration plans

    +
  • +
  • +

    Not be able to create providers or to change system settings

    +
  • +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Example permissions required for non-adminstrators to work with migration plan components but not create providers
ActionsAPI groupResource

get, list, watch, create, update, patch, delete

forklift.konveyor.io

plans

get, list, watch, create, update, patch, delete

forklift.konveyor.io

migrations

get, list, watch, create, update, patch, delete

forklift.konveyor.io

hooks

get, list, watch

forklift.konveyor.io

providers

get, list, watch, create, update, patch, delete

forklift.konveyor.io

networkmaps

get, list, watch, create, update, patch, delete

forklift.konveyor.io

storagemaps

get, list, watch

forklift.konveyor.io

forkliftcontrollers

create, patch, delete

Empty string

secrets

+
+ + + + + +
+
Note
+
+
+

Non-administrators need to have the create permissions that are part of edit roles for network maps and for storage maps to create migration plans, even when using a template for a network map or a storage map.

+
+
+
+ + +
+ + diff --git a/documentation/modules/obtaining-console-url/index.html b/documentation/modules/obtaining-console-url/index.html new file mode 100644 index 00000000000..d4ad17da77b --- /dev/null +++ b/documentation/modules/obtaining-console-url/index.html @@ -0,0 +1,107 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Getting the Forklift web console URL

+
+

You can get the Forklift web console URL at any time by using either the OKD web console, or the command line.

+
+
+
Prerequisites
+
    +
  • +

    KubeVirt Operator installed.

    +
  • +
  • +

    Forklift Operator installed.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  • +

    If you are using the OKD web console, follow these steps:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_web.adoc[]

+
+
+
    +
  • +

    If you are using the command line, get the Forklift web console URL with the following command:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_cli.adoc[]

+
+
+

You can now launch a browser and navigate to the Forklift web console.

+
+ + +
+ + diff --git a/documentation/modules/openstack-prerequisites/index.html b/documentation/modules/openstack-prerequisites/index.html new file mode 100644 index 00000000000..59760030cda --- /dev/null +++ b/documentation/modules/openstack-prerequisites/index.html @@ -0,0 +1,76 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+ + +
+ + diff --git a/documentation/modules/ostack-app-cred-auth/index.html b/documentation/modules/ostack-app-cred-auth/index.html new file mode 100644 index 00000000000..d82761cb275 --- /dev/null +++ b/documentation/modules/ostack-app-cred-auth/index.html @@ -0,0 +1,189 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using application credential authentication with an {osp} source provider

+
+

You can use application credential authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of application credential authentication:

+
+
+
    +
  • +

    Application credential ID

    +
  • +
  • +

    Application credential name

    +
  • +
+
+
+

For each type of application credential authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

You have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for application credential authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for application credential authentication, run the following command:

    +
    +
    +
    $ openstack application credential create --role member --role reader --secret redhat forklift
    +
    +
    +
    +

    The output, referred to here as <openstack_credential_output>, includes:

    +
    +
    +
      +
    • +

      The id and secret that you need for authentication using an application credential ID

      +
    • +
    • +

      The name and secret that you need for authentication using an application credential name

      +
    • +
    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using the application credential ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialID: <id_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using the application credential name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialName: <name_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/ostack-token-auth/index.html b/documentation/modules/ostack-token-auth/index.html new file mode 100644 index 00000000000..0c73b8c5566 --- /dev/null +++ b/documentation/modules/ostack-token-auth/index.html @@ -0,0 +1,180 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using token authentication with an {osp} source provider

+
+

You can use token authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of token authentication:

+
+
+
    +
  • +

    Token with user ID

    +
  • +
  • +

    Token with user name

    +
  • +
+
+
+

For each type of token authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

Have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for token authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for token authentication, run the following command:

    +
    +
    +
    $ openstack token issue
    +
    +
    +
    +

    The output, referred to here as <openstack_token_output>, includes the token, userID, and projectID that you need for authentication using a token with user ID.

    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using a token with user ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  projectID: <projectID_from_openstack_token_output>
      +  userID: <userID_from_openstack_token_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using a token with user name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  projectName: <OS_PROJECT_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/ova-prerequisites/index.html b/documentation/modules/ova-prerequisites/index.html new file mode 100644 index 00000000000..d474668b551 --- /dev/null +++ b/documentation/modules/ova-prerequisites/index.html @@ -0,0 +1,130 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Open Virtual Appliance (OVA) prerequisites

+
+

The following prerequisites apply to Open Virtual Appliance (OVA) file migrations:

+
+
+
    +
  • +

    All OVA files are created by VMware vSphere.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+
    +
  • +

    The OVA files are in one or more folders under an NFS shared directory in one of the following structures:

    +
    +
      +
    • +

      In one or more compressed Open Virtualization Format (OVF) packages that hold all the VM information.

      +
      +

      The filename of each compressed package must have the .ova extension. Several compressed packages can be stored in the same folder.

      +
      +
      +

      When this structure is used, Forklift scans the root folder and the first-level subfolders for compressed packages.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The folder /nfs is scanned.
      +The folder /nfs/subfolder1 is scanned.
      +But, /nfs/subfolder1/subfolder2 is not scanned.

      +
      +
    • +
    • +

      In extracted OVF packages.

      +
      +

      When this structure is used, Forklift scans the root folder, first-level subfolders, and second-level subfolders for extracted OVF packages. +However, there can be only one .ovf file in a folder. Otherwise, the migration will fail.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The OVF file /nfs/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/subfolder2/vm.ovf is scanned.
      +But, the OVF file /nfs/subfolder1/subfolder2/subfolder3/vm.ovf is not scanned.

      +
      +
    • +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/retrieving-validation-service-json/index.html b/documentation/modules/retrieving-validation-service-json/index.html new file mode 100644 index 00000000000..a7455b8334d --- /dev/null +++ b/documentation/modules/retrieving-validation-service-json/index.html @@ -0,0 +1,483 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving the Inventory service JSON

+
+

You retrieve the Inventory service JSON by sending an Inventory service query to a virtual machine (VM). The output contains an "input" key, which contains the inventory attributes that are queried by the Validation service rules.

+
+
+

You can create a validation rule based on any attribute in the "input" key, for example, input.snapshot.kind.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Trigger an HTTP GET request (for example, using Curl):

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    +
    +
    +
  8. +
  9. +

    Retrieve the UUID of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k (1)
    +
    +
    +
    +
      +
    1. +

      Allowed values for the provider are vsphere, ovirt, and openstack.

      +
    2. +
    +
    +
  10. +
  11. +

    Retrieve the VMs of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    +
    +
    +
  12. +
  13. +

    Retrieve the details of a VM:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    +
    +
    +
    +
    Example output
    +
    +
    {
    +    "input": {
    +        "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
    +        "id": "vm-431",
    +        "parent": {
    +            "kind": "Folder",
    +            "id": "group-v22"
    +        },
    +        "revision": 1,
    +        "name": "iscsi-target",
    +        "revisionValidated": 1,
    +        "isTemplate": false,
    +        "networks": [
    +            {
    +                "kind": "Network",
    +                "id": "network-31"
    +            },
    +            {
    +                "kind": "Network",
    +                "id": "network-33"
    +            }
    +        ],
    +        "disks": [
    +            {
    +                "key": 2000,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 17179869184,
    +                "shared": false,
    +                "rdm": false
    +            },
    +            {
    +                "key": 2001,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 10737418240,
    +                "shared": false,
    +                "rdm": false
    +            }
    +        ],
    +        "concerns": [],
    +        "policyVersion": 5,
    +        "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
    +        "firmware": "bios",
    +        "powerState": "poweredOn",
    +        "connectionState": "connected",
    +        "snapshot": {
    +            "kind": "VirtualMachineSnapshot",
    +            "id": "snapshot-3034"
    +        },
    +        "changeTrackingEnabled": false,
    +        "cpuAffinity": [
    +            0,
    +            2
    +        ],
    +        "cpuHotAddEnabled": true,
    +        "cpuHotRemoveEnabled": false,
    +        "memoryHotAddEnabled": false,
    +        "faultToleranceEnabled": false,
    +        "cpuCount": 2,
    +        "coresPerSocket": 1,
    +        "memoryMB": 2048,
    +        "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
    +        "balloonedMemory": 0,
    +        "ipAddress": "10.19.2.96",
    +        "storageUsed": 30436770129,
    +        "numaNodeAffinity": [
    +            "0",
    +            "1"
    +        ],
    +        "devices": [
    +            {
    +                "kind": "RealUSBController"
    +            }
    +        ],
    +        "host": {
    +            "id": "host-29",
    +            "parent": {
    +                "kind": "Cluster",
    +                "id": "domain-c26"
    +            },
    +            "revision": 1,
    +            "name": "IP address or host name of the vCenter host or oVirt Engine host",
    +            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
    +            "status": "green",
    +            "inMaintenance": false,
    +            "managementServerIp": "10.19.2.96",
    +            "thumbprint": <thumbprint>,
    +            "timezone": "UTC",
    +            "cpuSockets": 2,
    +            "cpuCores": 16,
    +            "productName": "VMware ESXi",
    +            "productVersion": "6.5.0",
    +            "networking": {
    +                "pNICs": [
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic0",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic1",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic2",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic3",
    +                        "linkSpeed": 10000
    +                    }
    +                ],
    +                "vNICs": [
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk2",
    +                        "portGroup": "VM_Migration",
    +                        "dPortGroup": "",
    +                        "ipAddress": "192.168.79.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 9000
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk0",
    +                        "portGroup": "Management Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.13",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk1",
    +                        "portGroup": "Storage Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "172.31.2.13",
    +                        "subnetMask": "255.255.0.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk3",
    +                        "portGroup": "",
    +                        "dPortGroup": "dvportgroup-48",
    +                        "ipAddress": "192.168.61.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk4",
    +                        "portGroup": "VM_DHCP_Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.231",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    }
    +                ],
    +                "portGroups": [
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM Network",
    +                        "name": "VM Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Management Network",
    +                        "name": "Management Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_10G_Network",
    +                        "name": "VM_10G_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Storage",
    +                        "name": "VM_Storage",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_DHCP_Network",
    +                        "name": "VM_DHCP_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Storage Network",
    +                        "name": "Storage Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Isolated_67",
    +                        "name": "VM_Isolated_67",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Migration",
    +                        "name": "VM_Migration",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    }
    +                ],
    +                "switches": [
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch0",
    +                        "name": "vSwitch0",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM Network",
    +                            "key-vim.host.PortGroup-Management Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic4"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch1",
    +                        "name": "vSwitch1",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_10G_Network",
    +                            "key-vim.host.PortGroup-VM_Storage",
    +                            "key-vim.host.PortGroup-VM_DHCP_Network",
    +                            "key-vim.host.PortGroup-Storage Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic2",
    +                            "key-vim.host.PhysicalNic-vmnic0"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch2",
    +                        "name": "vSwitch2",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_Isolated_67",
    +                            "key-vim.host.PortGroup-VM_Migration"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic3",
    +                            "key-vim.host.PhysicalNic-vmnic1"
    +                        ]
    +                    }
    +                ]
    +            },
    +            "networks": [
    +                {
    +                    "kind": "Network",
    +                    "id": "network-31"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-34"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-57"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-33"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "dvportgroup-47"
    +                }
    +            ],
    +            "datastores": [
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-35"
    +                },
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                }
    +            ],
    +            "vms": null,
    +            "networkAdapters": [],
    +            "cluster": {
    +                "id": "domain-c26",
    +                "parent": {
    +                    "kind": "Folder",
    +                    "id": "group-h23"
    +                },
    +                "revision": 1,
    +                "name": "mycluster",
    +                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
    +                "folder": "group-h23",
    +                "networks": [
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-31"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-34"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-57"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-33"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "dvportgroup-47"
    +                    }
    +                ],
    +                "datastores": [
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-35"
    +                    },
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-63"
    +                    }
    +                ],
    +                "hosts": [
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-44"
    +                    },
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-29"
    +                    }
    +                ],
    +                "dasEnabled": false,
    +                "dasVms": [],
    +                "drsEnabled": true,
    +                "drsBehavior": "fullyAutomated",
    +                "drsVms": [],
    +                "datacenter": null
    +            }
    +        }
    +    }
    +}
    +
    +
    +
  14. +
+
+ + +
+ + diff --git a/documentation/modules/retrieving-vmware-moref/index.html b/documentation/modules/retrieving-vmware-moref/index.html new file mode 100644 index 00000000000..79fea8a5fbb --- /dev/null +++ b/documentation/modules/retrieving-vmware-moref/index.html @@ -0,0 +1,149 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving a VMware vSphere moRef

+
+

When you migrate VMs with a VMware vSphere source provider using Forklift from the CLI, you need to know the managed object reference (moRef) of certain entities in vSphere, such as datastores, networks, and VMs.

+
+
+

You can retrieve the moRef of one or more vSphere entities from the Inventory service. You can then use each moRef as a reference for retrieving the moRef of another entity.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Retrieve the moRef of a VMware vSphere provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    +
    +
    +
  8. +
  9. +

    Retrieve the datastores of a VMware vSphere source provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    +
    +
    +
    +
    Example output
    +
    +
    [
    +  {
    +    "id": "datastore-11",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
    +    "revision": 46,
    +    "name": "v2v_general_porpuse_ISCSI_DC",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
    +  },
    +  {
    +    "id": "datastore-730",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
    +    "revision": 46,
    +    "name": "f01-h27-640-SSD_2",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
    +  },
    + ...
    +
    +
    +
  10. +
+
+
+

In this example, the moRef of the datastore v2v_general_porpuse_ISCSI_DC is datastore-11 and the moRef of the datastore f01-h27-640-SSD_2 is datastore-730.

+
+ + +
+ + diff --git a/documentation/modules/rhv-prerequisites/index.html b/documentation/modules/rhv-prerequisites/index.html new file mode 100644 index 00000000000..ef4796423c1 --- /dev/null +++ b/documentation/modules/rhv-prerequisites/index.html @@ -0,0 +1,129 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+
    +
  • +

    To create a source provider, you must have at least the UserRole and ReadOnlyAdmin roles assigned to you. These are the minimum required permissions, however, any other administrator or superuser permissions will also work.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

You must keep the UserRole and ReadOnlyAdmin roles until the virtual machines of the source provider have been migrated. Otherwise, the migration will fail.

+
+
+
+
+
    +
  • +

    To migrate virtual machines:

    +
    +
      +
    • +

      You must have one of the following:

      +
      +
        +
      • +

        oVirt admin permissions. These permissions allow you to migrate any virtual machine in the system.

        +
      • +
      • +

        DiskCreator and UserVmManager permissions on every virtual machine you want to migrate.

        +
      • +
      +
      +
    • +
    • +

      You must use a compatible version of oVirt.

      +
    • +
    • +

      You must have the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate.

      +
      +

      You can obtain the Engine CA certificate by navigating to https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA in a browser.

      +
      +
    • +
    • +

      If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

      +
    • +
    +
    +
  • +
+
+
+

Unresolved directive in rhv-prerequisites.adoc - include::snip-migrating-luns.adoc[]

+
+ + +
+ + diff --git a/documentation/modules/rn-2.0/index.html b/documentation/modules/rn-2.0/index.html new file mode 100644 index 00000000000..c8c3d5447a6 --- /dev/null +++ b/documentation/modules/rn-2.0/index.html @@ -0,0 +1,163 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.0

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Warm migration
+

Warm migration reduces downtime by copying most of the VM data during a precopy stage while the VMs are running. During the cutover stage, the VMs are stopped and the rest of the data is copied.

+
+
+
Cancel migration
+

You can cancel an entire migration plan or individual VMs while a migration is in progress. A canceled migration plan can be restarted in order to migrate the remaining VMs.

+
+
+
Migration network
+

You can select a migration network for the source and target providers for improved performance. By default, data is copied using the VMware administration network and the OKD pod network.

+
+
+
Validation service
+

The validation service checks source VMs for issues that might affect migration and flags the VMs with concerns in the migration plan.

+
+
+ + + + + +
+
Important
+
+
+

The validation service is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+
+
+
+

Known issues

+
+
+

This section describes known issues and mitigations.

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Network map displays a "Destination network not found" error
+

If the network map remains in a NotReady state and the NetworkMap manifest displays a Destination network not found error, the cause is a missing network attachment definition. You must create a network attachment definition for each additional destination network before you create the network map. (BZ#1971259)

+
+
+
Warm migration gets stuck during third precopy
+

Warm migration uses changed block tracking snapshots to copy data during the precopy stage. The snapshots are created at one-hour intervals by default. When a snapshot is created, its contents are copied to the destination cluster. However, when the third snapshot is created, the first snapshot is deleted and the block tracking is lost. (BZ#1969894)

+
+
+

You can do one of the following to mitigate this issue:

+
+
+
    +
  • +

    Start the cutover stage no more than one hour after the precopy stage begins so that only one internal snapshot is created.

    +
  • +
  • +

    Increase the snapshot interval in the vm-import-controller-config config map to 720 minutes:

    +
    +
    +
    $ kubectl patch configmap/vm-import-controller-config \
    +  -n openshift-cnv -p '{"data": \
    +  {"warmImport.intervalMinutes": "720"}}'
    +
    +
    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.1/index.html b/documentation/modules/rn-2.1/index.html new file mode 100644 index 00000000000..043b2c89f48 --- /dev/null +++ b/documentation/modules/rn-2.1/index.html @@ -0,0 +1,191 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.1

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

Technical changes

+
+
+
VDDK image added to HyperConverged custom resource
+

The VMware Virtual Disk Development Kit (VDDK) SDK image must be added to the HyperConverged custom resource. Before this release, it was referenced in the v2v-vmware config map.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Cold migration from oVirt
+

You can perform a cold migration of VMs from oVirt.

+
+
+
Migration hooks
+

You can create migration hooks to run Ansible playbooks or custom code before or after migration.

+
+
+
Filtered must-gather data collection
+

You can specify options for the must-gather tool that enable you to filter the data by namespace, migration plan, or VMs.

+
+
+
SR-IOV network support
+

You can migrate VMs with a single root I/O virtualization (SR-IOV) network interface if the KubeVirt environment has an SR-IOV network.

+
+
+
+
+

Known issues

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Disk copy stage does not progress
+

The disk copy stage of a oVirt VM does not progress and the Forklift web console does not display an error message. (BZ#1990596)

+
+
+

The cause of this problem might be one of the following conditions:

+
+
+
    +
  • +

    The storage class does not exist on the target cluster.

    +
  • +
  • +

    The VDDK image has not been added to the HyperConverged custom resource.

    +
  • +
  • +

    The VM does not have a disk.

    +
  • +
  • +

    The VM disk is locked.

    +
  • +
  • +

    The VM time zone is not set to UTC.

    +
  • +
  • +

    The VM is configured for a USB device.

    +
  • +
+
+
+

To disable USB devices, see Configuring USB Devices in the Red Hat Virtualization documentation.

+
+
+

To determine the cause:

+
+
+
    +
  1. +

    Click WorkloadsVirtualization in the OKD web console.

    +
  2. +
  3. +

    Click the Virtual Machines tab.

    +
  4. +
  5. +

    Select a virtual machine to open the Virtual Machine Overview screen.

    +
  6. +
  7. +

    Click Status to view the status of the virtual machine.

    +
  8. +
+
+
+
VM time zone must be UTC with no offset
+

The time zone of the source VMs must be UTC with no offset. You can set the time zone to GMT Standard Time after first assessing the potential impact on the workload. (BZ#1993259)

+
+
+
oVirt resource UUID causes a "Provider not found" error
+

If a oVirt resource UUID is used in a Host, NetworkMap, StorageMap, or Plan custom resource (CR), a "Provider not found" error is displayed.

+
+
+

You must use the resource name. (BZ#1994037)

+
+
+
Same oVirt resource name in different data centers causes ambiguous reference
+

If a oVirt resource name is used in a NetworkMap, StorageMap, or Plan custom resource (CR) and if the same resource name exists in another data center, the Plan CR displays a critical "Ambiguous reference" condition. You must rename the resource or use the resource UUID in the CR.

+
+
+

In the web console, the resource name appears twice in the same list without a data center reference to distinguish them. You must rename the resource. (BZ#1993089)

+
+
+
Snapshots are not deleted after warm migration
+

Snapshots are not deleted automatically after a successful warm migration of a VMware VM. You must delete the snapshots manually in VMware vSphere. (BZ#2001270)

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.2/index.html b/documentation/modules/rn-2.2/index.html new file mode 100644 index 00000000000..64a1c65a4d9 --- /dev/null +++ b/documentation/modules/rn-2.2/index.html @@ -0,0 +1,219 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.2

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the precopy time interval for warm migration
+

You can set the time interval between snapshots taken during the precopy stage of warm migration.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Creating validation rules
+

You can create custom validation rules to check the suitability of VMs for migration. Validation rules are based on the VM attributes collected by the Provider Inventory service and written in Rego, the Open Policy Agent native query language.

+
+
+
Downloading logs by using the web console
+

You can download logs for a migration plan or a migrated VM by using the Forklift web console.

+
+
+
Duplicating a migration plan by using the web console
+

You can duplicate a migration plan by using the web console, including its VMs, mappings, and hooks, in order to edit the copy and run as a new migration plan.

+
+
+
Archiving a migration plan by using the web console
+

You can archive a migration plan by using the MTV web console. Archived plans can be viewed or duplicated. They cannot be run, edited, or unarchived.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Certain Validation service issues do not block migration
+

Certain Validation service issues, which are marked as Critical and display the assessment text, The VM will not be migrated, do not block migration. (BZ#2025977)

+
+
+

The following Validation service assessments do not block migration:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Issues that do not block migration
AssessmentResult

The disk interface type is not supported by OpenShift Virtualization (only sata, virtio_scsi and virtio interface types are currently supported).

The migrated VM will have a virtio disk if the source interface is not recognized.

The NIC interface type is not supported by OpenShift Virtualization (only e1000, rtl8139 and virtio interface types are currently supported).

The migrated VM will have a virtio NIC if the source interface is not recognized.

The VM is using a vNIC profile configured for host device passthrough, which is not currently supported by OpenShift Virtualization.

The migrated VM will have an SR-IOV NIC. The destination network must be set up correctly.

One or more of the VM’s disks has an illegal or locked status condition.

The migration will proceed but the disk transfer is likely to fail.

The VM has a disk with a storage type other than image, and this is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has one or more snapshots with disks in ILLEGAL state. This is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has USB support enabled, but USB devices are not currently supported by OpenShift Virtualization.

The migrated VM will not have USB devices.

The VM is configured with a watchdog device, which is not currently supported by OpenShift Virtualization.

The migrated VM will not have a watchdog device.

The VM’s status is not up or down.

The migration will proceed but it might hang if the VM cannot be powered off.

+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Missing resource causes error message in current.log file
+

If a resource does not exist, for example, if the virt-launcher pod does not exist because the migrated VM is powered off, its log is unavailable.

+
+
+

The following error appears in the missing resource’s current.log file when it is downloaded from the web console or created with the must-gather tool: error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'. (BZ#2023260)

+
+
+
Importer pod log is unavailable after warm migration
+

Retaining the importer pod for debug purposes causes warm migration to hang during the precopy stage. (BZ#2016290)

+
+
+

As a temporary workaround, the importer pod is removed at the end of the precopy stage so that the precopy succeeds. However, this means that the importer pod log is not retained after warm migration is complete. You can only view the importer pod log by using the oc logs -f <cdi-importer_pod> command during the precopy stage.

+
+
+

This issue only affects the importer pod log and warm migration. Cold migration and the virt-v2v logs are not affected.

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Network, storage, and VM referenced by name in the Plan CR are not displayed in the web console.
+

If a Plan CR references storage, network, or VMs by name instead of by ID, the resources do not appear in the Forklift web console. The migration plan cannot be edited or duplicated. (BZ#1986020)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
If a target VM is deleted during migration, its migration status is Succeeded in the Plan CR
+

If you delete a target VirtualMachine CR during the 'Convert image to kubevirt' step of the migration, the Migration details page of the web console displays the state of the step as VirtualMachine CR not found. However, the status of the VM migration is Succeeded in the Plan CR file and in the web console. (BZ#2031529)

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.3/index.html b/documentation/modules/rn-2.3/index.html new file mode 100644 index 00000000000..6fcadf3965c --- /dev/null +++ b/documentation/modules/rn-2.3/index.html @@ -0,0 +1,156 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.3

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the VddkInitImage path is part of the procedure of adding VMware provider.
+

In the web console, you enter the VddkInitImage path when adding a VMware provider. Alternatively, from the CLI, you add the VddkInitImage path to the Provider CR for VMware migrations.

+
+
+
The StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS. The documentation includes a link to the relevant procedure.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Forklift 2.3 supports warm migration from oVirt
+

You can use warm migration to migrate VMs from both VMware and oVirt.

+
+
+
The minimal sufficient set of privileges for VMware users is established
+

VMware users do not have to have full cluster-admin privileges to perform a VM migration. The minimal sufficient set of user’s privileges is established and documented.

+
+
+
Forklift documentation is updated with instructions on using hooks
+

Forklift documentation includes instructions on adding hooks to migration plans and running hooks on VMs.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Some warm migrations from oVirt might fail
+

When you run a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run. (BZ#2063531)

+
+
+
Snapshots are not deleted after warm migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. You can delete the snapshots manually. (BZ#22053183)

+
+
+
Warm migration from oVirt fails if a snapshot operation is performed on the source VM
+

If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (BZ#2057459)

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

The problem occurs for both vSphere and oVirt migrations.

+
+
+
Forklift 2.3.4 only: When the source provider is oVirt, duplicating a migration plan fails in either the network mapping stage or the storage mapping stage.
+

Possible workaround: Delete cache in the browser or restart the browser. (BZ#2143191)

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.4/index.html b/documentation/modules/rn-2.4/index.html new file mode 100644 index 00000000000..f3255c4d156 --- /dev/null +++ b/documentation/modules/rn-2.4/index.html @@ -0,0 +1,260 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.4

+
+
+
+

Migrate virtual machines (VMs) from VMware vSphere or oVirt or {osp} to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Faster disk image migration from oVirt
+

Disk images are not converted anymore using virt-v2v when migrating from oVirt. This change speeds up migrations and also allows migration for guest operating systems that are not supported by virt-vsv. (forklift-controller#403)

+
+
+
Faster disk transfers by ovirt-imageio client (ovirt-img)
+

Disk transfers use ovirt-imageio client (ovirt-img) instead of Containerized Data Import (CDI) when migrating from RHV to the local OpenShift Container Platform cluster, accelerating the migration.

+
+
+
Faster migration using conversion pod disk transfer
+

When migrating from vSphere to the local OpenShift Container Platform cluster, the conversion pod transfers the disk data instead of Containerized Data Importer (CDI), accelerating the migration.

+
+
+
Migrated virtual machines are not scheduled on the target OCP cluster
+

The migrated virtual machines are no longer scheduled on the target OpenShift Container Platform cluster. This enables migrating VMs that cannot start due to limit constraints on the target at migration time.

+
+
+
StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS.

+
+
+
VDDK 8 can be used in the VDDK image
+

Previous versions of Forklift supported only using VDDK version 7 for the VDDK image. Forklift supports both versions 7 and 8, as follows:

+
+
+
    +
  • +

    If you are migrating to OCP 4.12 or earlier, use VDDK version 7.

    +
  • +
  • +

    If you are migrating to OCP 4.13 or later, use VDDK version 8.

    +
  • +
+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
OpenStack migration
+

Forklift now supports migrations with {osp} as a source provider. This feature is a provided as a Technology Preview and only supports cold migrations.

+
+
+
OCP console plugin
+

The Forklift Operator now integrates the Forklift web console into the OKD web console. The new UI operates as an OCP Console plugin that adds the sub-menu Migration to the navigation bar. It is implemented in version 2.4, disabling the old UI. You can enable the old UI by setting feature_ui: true in ForkliftController. (MTV-427)

+
+
+
Skip certification option
+

'Skip certificate validation' option was added to VMware and oVirt providers. If selected, the provider’s certificate will not be validated and the UI will not ask for specifying a CA certificate.

+
+
+
Only third-party certificate required
+

Only the third-party certificate needs to be specified when defining a oVirt provider that sets with the Manager CA certificate.

+
+
+
Conversion of VMs with RHEL9 guest operating system
+

Cold migrations from vSphere to a local Red Hat OpenShift cluster use virt-v2v on RHEL 9. (MTV-332)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If deleting a migration plan and then running a new migration plan with the same name, or if deleting a migrated VM and then remigrate the source VM, then the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack don’t fail, but the encryption key may be missing on the target OCP cluster.

+
+
+
Snapshots that are created during the migration in OpenStack are not deleted
+

The Migration Controller service does not delete snapshots that are created during the migration for source virtual machines in OpenStack automatically. Workaround: the snapshots can be removed manually on OpenStack.

+
+
+
oVirt snapshots are not deleted after a successful migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. Workaround: Snapshots can be removed from oVirt instead. (MTV-349)

+
+
+
Migration fails during precopy/cutover while a snapshot operation is executed on the source VM
+

Some warm migrations from oVirt might fail. When running a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run.

+
+
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (MTV-456)

+
+
+
Cannot schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it may result in a VM that cannot be scheduled. Workaround: It is recommended to use shared storage on the target OCP cluster.

+
+
+
Deleting migrated VM does not remove PVC and PV
+

When removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) are not deleted. Workaround: remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

When a migration fails, its PVCs and PVs are not deleted as expected when its migration plan is archived and deleted. Workaround: Remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-493)

+
+
+
VM with multiple disks may boot from non-bootable disk after migration
+

VM with multiple disks that was migrated might not be able to boot on the target OCP cluster. Workaround: Set the boot order appropriately to boot from the bootable disk. (MTV-433)

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OCP clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OCP cluster. It is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system may start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, their network interfaces could be disabled when they start in OpenShift Virtualization. (MTV-491)

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. The user needs to refresh the OCP Console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of MTV, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in MTV 2.4.3 and 2.5.2. It is advised to update to one of these versions of MTV or later.

+
+ +
+
Improve invalid/conflicting VM name handling
+

Improve the automatic renaming of VMs during migration to fit RFC 1123. This feature that was introduced in 2.3.4 is enhanced to cover more special cases. (MTV-212)

+
+
+
Prevent locking user accounts due to incorrect credentials
+

If a user specifies an incorrect password for oVirt providers, they are no longer locked in oVirt. An error returns when the oVirt manager is accessible and adding the provider. If the oVirt manager is inaccessible, the provider is added, but there would be no further attempt after failing, due to incorrect credentials. (MTV-324)

+
+
+
Users without cluster-admin role can create new providers
+

Previously, the cluster-admin role was required to browse and create providers. In this release, users with sufficient permissions on MTV resources (providers, plans, migrations, NetworkMaps, StorageMaps, hooks) can operate MTV without cluster-admin permissions. (MTV-334)

+
+
+
Convert i440fx to q35
+

Migration of virtual machines with i440fx chipset is now supported. The chipset is converted to q35 during the migration. (MTV-430)

+
+
+
Preserve the UUID setting in SMBIOS for a VM that is migrated from oVirt
+

The Universal Unique ID (UUID) number within the System Management BIOS (SMBIOS) no longer changes for VMs that are migrated from oVirt. This enhancement enables applications that operate within the guest operating system and rely on this setting, such as for licensing purposes, to operate on the target OCP cluster in a manner similar to that of oVirt. (MTV-597)

+
+
+
Do not expose password for oVirt in error messages
+

Previously, the password that was specified for oVirt manager appeared in error messages that were displayed in the web console and logs when failing to connect to oVirt. In this release, error messages that are generated when failing to connect to oVirt do not reveal the password for oVirt manager.

+
+
+
QEMU guest agent is now installed on migrated VMs
+

The QEMU guest agent is installed on VMs during cold migration from vSphere. (BZ#2018062)

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.5/index.html b/documentation/modules/rn-2.5/index.html new file mode 100644 index 00000000000..1499f6de735 --- /dev/null +++ b/documentation/modules/rn-2.5/index.html @@ -0,0 +1,464 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.5

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, and known issues for Forklift.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version of Forklift, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

Forklift enables migrations from vSphere source providers by not enforcing Enterprise Master Secret (EMS). This enables migrating from all vSphere versions that Forklift supports, including migrations that do not meet 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of the create and update providers now aligns with the look and feel of the OKD web console and displays up-to-date data.

+
+
+
Standalone UI
+

The old UI of Forklift 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
Support deployment on {ocp-name} 4.15
+

Forklift 2.5.6 can be deployed on {ocp-name} 4.15 clusters.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration of OVA files from VMware vSphere
+

In Forklift 2.3, you can migrate using Open Virtual Appliance (OVA) files that were created by VMware vSphere as source providers. (MTV-336)

+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+

Unresolved directive in rn-2.5.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+
Migrating VMs between OKD clusters
+

In Forklift 2.3, you can now use Red Hat KubeVirt provider as a source provider and a destination provider. You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on. (MTV-571)

+
+
+
Migration of VMs with direct LUNs from RHV
+

During the migration from oVirt (oVirt), direct Logical Units (LUNs) are detached from the source virtual machines and attached to the target virtual machines. Note that this mechanism does not work yet for Fibre Channel. (MTV-329)

+
+
+
Additional authentication methods for OpenStack
+

In addition to standard password authentication, Forklift supports the following authentication methods: Token authentication and Application credential authentication. (MTV-539)

+
+
+
Validation rules for OpenStack
+

The validation service includes default validation rules for virtual machines from OpenStack. (MTV-508)

+
+
+
VDDK is now optional for VMware vSphere providers
+

You can now create the VMware vSphere source provider without specifying a VMware Virtual Disk Development Kit (VDDK) init image. It is strongly recommended you create a VDDK init image to accelerate migrations.

+
+
+
Deployment on OKE enabled
+

In Forklift 2.5.3, deployment on {ocp-name} Kubernetes Engine (OKE) has been enabled. For more information, see About {ocp-name} Kubernetes Engine. (MTV-803)

+
+
+
Migration of VMs to destination storage classes with encrypted RBD now supported
+

In Forklift 2.5.4, migration of VMs to destination storage classes that have encrypted RADOS Block Devices (RBD) volumes is now supported.

+
+
+

To make use of this new feature, set the value of the parameter controller_block_overhead to 1Gi, following the procedure in Configuring the MTV Operator. (MTV-851)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OKD cluster. This is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Import OVA: ConnectionTestFailed message appears when adding OVA provider
+

When adding an OVA provider, the error message ConnectionTestFailed can appear, although the provider is created successfully. If the message does not disappear after a few minutes and the provider status does not move to Ready, this means that the ova server pod creation has failed. (MTV-671)

+
+
+
Left over ovirtvolumepopulator from failed migration causes plan to stay indefinitely in CopyDisks phase
+

An outdated ovirtvolumepopulator in the namespace, left over from an earlier failed migration, stops a new plan of the same VM when it transitions to CopyDisks phase. The plan remains in that phase indefinitely. (MTV-929)

+
+
+
Unclear error message when Forklift fails to build a PVC
+

The migration fails to build the Persistent Volume Claim (PVC) if the destination storage class does not have a configured storage profile. The forklift-controller raises an error message without a clear reason for failing to create a PVC. (MTV-928)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Flaw was found in jsrsasign package which is vulnerable to Observable Discrepancy
+

Versions of the package jsrsasign before 11.0.0, used in earlier releases of Forklift, are vulnerable to Observable Discrepancy in the RSA PKCS1.5 or RSA-OAEP decryption process. This discrepancy means an attacker could decrypt ciphertexts by exploiting this vulnerability. However, exploiting this vulnerability requires the attacker to have access to a large number of ciphertexts encrypted with the same key. This issue has been resolved in Forklift 2.5.5 by upgrading the package jsrasign to version 11.0.0.

+
+
+

For more information, see CVE-2024-21484.

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of Forklift, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of MTV or later.

+
+ +
+
Gin Web Framework does not properly sanitize filename parameter of Context.FileAttachment function
+

A flaw was found in the Gin-Gonic Gin Web Framework, used by Forklift. The filename parameter of the Context.FileAttachment function was not properly sanitized. This flaw in the package could allow a remote attacker to bypass security restrictions caused by improper input validation by the filename parameter of the Context.FileAttachment function. A maliciously created filename could cause the Content-Disposition header to be sent with an unexpected filename value, or otherwise modify the Content-Disposition header.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+ +
+
CVE-2023-26144: mtv-console-plugin-container: graphql: Insufficient checks in the OverlappingFieldsCanBeMergedRule.ts
+

A flaw was found in the package GraphQL from 16.3.0 and before 16.8.1. This flaw means Forklift versions before Forklift 2.5.2 are vulnerable to Denial of Service (DoS) due to insufficient checks in the OverlappingFieldsCanBeMergedRule.ts file when parsing large queries. This issue may allow an attacker to degrade system performance. (MTV-712)

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
CVE-2023-45142: Memory leak found in the otelhttp handler of open-telemetry
+

A flaw was found in otelhttp handler of OpenTelemetry-Go. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to a memory leak caused by http.user_agent and http.method having unbound cardinality, which could allow a remote, unauthenticated attacker to exhaust the server’s memory by sending many malicious requests, affecting the availability. (MTV-795)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-45142.

+
+
+
CVE-2023-39322: QUIC connections do not set an upper bound on the amount of data buffered when reading post-handshake messages
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to QUIC connections not setting an upper bound on the amount of data buffered when reading post-handshake messages, allowing a malicious QUIC connection to cause unbounded memory growth. With the fix, connections now consistently reject messages larger than 65KiB in size. (MTV-708)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39322.

+
+
+
CVE-2023-39321: Processing an incomplete post-handshake message for a QUIC connection can cause a panic
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to processing an incomplete post-handshake message for a QUIC connection, which causes a panic. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39321.

+
+
+
CVE-2023-39319: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable, as the html/template package did not properly handle occurrences of <script, <!--, and </script within JavaScript literals in <script> contexts. This flaw could cause the template parser to improperly consider script contexts to be terminated early, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39319.

+
+
+
CVE-2023-39318: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable as the html/template package did not properly handle HMTL-like "" comment tokens, nor hashbang \#! comment tokens. This flaw could cause the template parser to improperly interpret the contents of <script> contexts, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39318.

+
+
+
Logs archive file downloaded from UI includes logs related to deleted migration plan/VM
+

In earlier releases of Forklift 2.3, the log files downloaded from UI could contain logs that are related to an earlier migration plan. (MTV-783)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Extending a VM disk in RHV is not reflected in the MTV inventory
+

In earlier releases of Forklift 2.3, the size of disks that are extended in RHV was not adequately monitored. This resulted in the inability to migrate virtual machines with extended disks from a RHV provider. (MTV-830)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Filesystem overhead configurable
+

In earlier releases of Forklift 2.3, the filesystem overhead for new persistent volumes was hard-coded to 10%. The overhead was insufficient for certain filesystem types, resulting in failures during cold-migrations from oVirt and OSP to the cluster where Forklift is deployed. In other filesystem types, the hard-coded overhead was too high, resulting in excessive storage consumption.

+
+
+

In Forklift 2.5.3, the filesystem overhead can be configured, as it is no longer hard-coded. If your migration allocates persistent volumes without CDI, you can adjust the file system overhead. You adjust the file system overhead by adding the following label and value to the spec portion of the forklift-controller CR:

+
+
+
+
spec:
+  `controller_filesystem_overhead: <percentage>` (1)
+
+
+
+
    +
  1. +

    The percentage of overhead. If this label is not added, the default value of 10% is used. This setting is valid only if the storageclass is filesystem. (MTV-699)

    +
  2. +
+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In earlier releases of Forklift, the create and update provider forms could have presented stale data.

+
+
+

This issue is resolved in Forklift 2.3, the new forms of create and update provider display up-to-date properties of the provider. (MTV-603)

+
+
+
Snapshots that are created during a migration in OpenStack are not deleted
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots that were created during a migration of source virtual machines in OpenStack automatically.

+
+
+

This issue is resolved in Forklift 2.3, all the snapshots created during the migration are removed after the migration has been completed. (MTV-620)

+
+
+
oVirt snapshots are not deleted after a successful migration
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots automatically after a successful warm migration of a VM from oVirt.

+
+
+

This issue is resolved in Forklift 2.3, the snapshots generated during migration are removed after a successful migration, and the original snapshots are not removed after a successful migration. (MTV-349)

+
+
+
Warm migration fails when cutover conflicts with precopy
+

In earlier releases of Forklift, the cutover operation failed when it was triggered while precopy was being performed. The VM was locked in oVirt and therefore the ovirt-engine rejected the snapshot creation, or disk transfer, operation.

+
+
+

This issue is resolved in Forklift 2.3, the cutover operation is triggered, but it is not performed at that time because the VM is locked. Once the precopy operation completes, the cutover operation is triggered. (MTV-686)

+
+
+
Warm migration fails when VM is locked
+

In earlier releases of Forklift, triggering a warm migration while there was an ongoing operation in oVirt that locked the VM caused the migration to fail because it could not trigger the snapshot creation.

+
+
+

This issue is resolved in Forklift 2.3, warm migration does not fail when an operation that locks the VM is performed in oVirt. The migration does not fail, but starts when the VM is unlocked. (MTV-687)

+
+
+
Deleting migrated VM does not remove PVC and PV
+

In earlier releases of Forklift, when removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) were not deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs and PVs are deleted when deleting migrated VM.(MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

In earlier releases of Forklift, when a migration failed, its PVCs and PVs were not deleted as expected when its migration plan was archived and deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs are deleted when archiving and deleting migration plan.(MTV-493)

+
+
+
VM with multiple disks can boot from a non-bootable disk after migration
+

In earlier releases of Forklift, VM with multiple disks that were migrated might not have been able to boot on the target OKD cluster.

+
+
+

This issue is resolved in Forklift 2.3, VM with multiple disks that are migrated can boot on the target OKD cluster. (MTV-433)

+
+
+
Transfer network not taken into account for cold migrations from vSphere
+

In Forklift releases 2.4.0-2.5.3, cold migrations from vSphere to the local cluster on which Forklift was deployed did not take a specified transfer network into account. This issue is resolved in Forklift 2.5.4. (MTV-846)

+
+
+
Fix migration of VMs with multi-boot guest operating system from vSphere
+

In Forklift 2.5.6, the virt-v2v arguments include –root first, which mitigates an issue with multi-boot VMs where the pod fails. This is a fix for a regression that was introduced in Forklift 2.4, in which the '--root' argument was dropped. (MTV-987)

+
+
+
Errors logged in populator pods are improved
+

In earlier releases of Forklift 2.3, populator pods were always restarted on failure. This made it difficult to gather the logs from the failed pods. In Forklift 2.5.3, the number of restarts of populator pods is limited to three times. On the third and final time, the populator pod remains in the fail status and its logs can then be easily gathered by must-gather and by forklift-controller to know this step has failed. (MTV-818)

+
+
+
npm IP package vulnerability
+

A vulnerability found in the Node.js Package Manager (npm) IP Package can allow an attacker to obtain sensitive information and obtain access to normally inaccessible resources. MTV-941

+
+
+

This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-42282

+
+
+
Flaw was found in the Golang net/http/internal package
+

A flaw was found in the versions of the Golang net/http/internal package, that were used in earlier releases of Forklift. This flaw could allow a malicious user to send an HTTP request and cause the receiver to read more bytes from the network than are in the body (up to 1GiB), causing the receiver to fail reading the response, possibly leading to a Denial of Service (DoS). This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-39326.

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+

Upgrade notes

+
+
+

It is recommended to upgrade from Forklift 2.4.2 to Forklift 2.3.

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: Remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. Refresh the OKD console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.6/index.html b/documentation/modules/rn-2.6/index.html new file mode 100644 index 00000000000..91e6379930e --- /dev/null +++ b/documentation/modules/rn-2.6/index.html @@ -0,0 +1,511 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.6

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Simplified the creation of vSphere providers
+

In earlier releases of Forklift, users had to specify a fingerprint when creating a vSphere provider. This required users to retrieve the fingerprint from the server that vCenter runs on. Forklift no longer requires this fingerprint as an input, but rather computes it from the specified certificate in the case of a secure connection or automatically retrieves it from the server that runs vCenter/ESXi in the case of an insecure connection.

+
+
+
Redesigned the migration plan creation dialog
+

The user interface console has improved the process of creating a migration plan. The new migration plan dialog enables faster creation of migration plans.

+
+
+

It includes only the minimal settings that are required, while you can confirgure advanced settings separately. The new dialog also provides defaults for network and storage mappings, where applicable. The new dialog can also be invoked from the the Provider > Virtual Machines tab, after selecting the virtual machines to migrate. It also better aligns with the user experience in the OCP console.

+
+
+
virtual machine preferences have replaced {ocp-name} templates
+

The virtual machine preferences have replaced {ocp-name} templates. Forklift currently falls back to using {ocp-name} templates when a relevant preference is not available.

+
+
+

Custom mappings of guest operating system type to virtual machine preference can be configured using config maps. This is in order to use custom virtual machine preferences, or to support more guest operating system types.

+
+
+
Full support for migration from OVA
+

Migration from OVA moves from being a Technical Preview and is now a fully supported feature.

+
+
+
The VM is posted with its desired Running state
+

Forklift creates the VM with its desired Running state on the target provider, instead of creating the VM and then running it as an additional operation. (MTV-794)

+
+
+
The must-gather logs can now be loaded only by using the CLI
+

The Forklift web console can no longer download logs. With this update, you must download must-gather logs by using CLI commands. For more information, see Must Gather Operator.

+
+
+
Forklift no longer runs pvc-init pods when migrating from vSphere
+

Forklift no longer runs pvc-init pods during cold migration from a vSphere provider to the {ocp-name} cluster that Forklift is deployed on. However, in other flows where data volumes are used, they are set with the cdi.kubevirt.io/storage.bind.immediate.requested annotation, and CDI runs first-consume pods for storage classes with volume binding mode WaitForFirstConsumer.

+
+
+
+
+

New features and enhancements

+
+
+

This section provides features and enhancements introduced in Forklift 2.6.

+
+
+

New features and enhancements 2.6.3

+
+
Support for migrating LUKS-encrypted devices in migrations from vSphere
+

You can now perform cold migrations from a vSphere provider of VMs whose virtual disks are encrypted by Linux Unified Key Setup (LUKS). (MTV-831)

+
+
+
Specifying the primary disk when migrating from vSphere
+

You can now specify the primary disk when you migrate VMs from vSphere with more than one bootable disk. This avoids Forklift automatically attempting to convert the first bootable disk that it detects while it examines all the disks of a virtual machine. This feature is needed because the first bootable disk is not necessarily the disk that the VM is expected to boot from in KubeVirt. (MTV-1079)

+
+
+
Links to remote provider UIs
+

You can now remotely access the UI of a remote cluster when you create a source provider. For example, if the provider is a remote oVirt oVirt cluster, Forklift adds a link to the remote oVirt web console when you define the provider. This feature makes it easier for you to manage and debug a migration from remote clusters. (MTV-1054)

+
+
+
+

New features and enhancements 2.6.0

+
+
Migration from vSphere over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the server that runs vCenter or ESXi, depending on the specified SDK endpoint of the vSphere provider. (MTV-530)

+
+
+
Migration to or from a remote {ocp-name} over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the API server of a remote {ocp-name} cluster. (MTV-728)

+
+
+
Migration from an ESXi server without going through vCenter
+

Forklift enables the configuration of vSphere providers with the SDK of ESXi. You need to select ESXi as the Endpoint type of the vSphere provider and specify the URL of the SDK of the ESXi server. (MTV-514)

+
+
+
Migration of image-based VMs from {osp}
+

Forklift supports the migration of VMs that were created from images in {osp}. (MTV-644)

+
+
+
Migration of VMs with Fibre Channel LUNs from oVirt
+

Forklift supports migrations of VMs that are set with Fibre Channel (FC) LUNs from oVirt. As with other LUN disks, you need to ensure the {ocp-name} nodes have access to the FC LUNs. During the migrations, the FC LUNs are detached from the source VMs in oVirt and attached to the migrated VMs in {ocp-name}. (MTV-659)

+
+
+
Preserve CPU types of VMs that are migrated from oVirt
+

Forklift sets the CPU type of migrated VMs in {ocp-name} with their custom CPU type in oVirt. In addition, a new option was added to migration plans that are set with oVirt as a source provider to preserve the original CPU types of source VMs. When this option is selected, Forklift identifies the CPU type based on the cluster configuration and sets this CPU type for the migrated VMs, for which the source VMs are not set with a custom CPU. (MTV-547)

+
+
+
Validation for RHEL 6 guest operating system is now available when migrating VMs with RHEL 6 guest operating system
+

Red Hat Enterprise Linux (RHEL) 9 does not support RHEL 6 as a guest operating system. Therefore, RHEL 6 is not supported in {ocp-name} Virtualization. With this update, a validation of RHEL 6 guest operating system was added to {ocp-name} Virtualization. (MTV413)

+
+
+
Automatic retrieval of CA certificates for the provider’s URL in the console
+

The ability to retrieve CA certificates, which was available in previous versions, has been restored. The vSphere Verify certificate option is in the add-provider dialog. This option was removed in the transition to the OKD console and has now been added to the console. This functionality is also available for oVirt, {osp}, and {ocp-name} providers now. (MTV-737)

+
+
+
Validation of a specified VDDK image
+

Forklift validates the availability of a VDDK image that is specified for a vSphere provider on the target {ocp-name} name as part of the validation of a migration plan. Forklift also checks whether the libvixDiskLib.so symbolic link (symlink) exists within the image. If the validation fails, the migration plan cannot be started. (MTV-618)

+
+
+
Add a warning and partial support for TPM
+

Forklift presents a warning when attempting to migrate a VM that is set with a TPM device from oVirt or vSphere. The migrated VM in {ocp-name} would be set with a TPM device but without the content of the TPM device on the source environment. (MTV-378)

+
+
+
Plans that failed to migrate VMs can now be edited
+

With this update, you can edit plans that have failed to migrate any VMs. Some plans fail or are canceled because of incorrect network and storage mappings. You can now edit these plans until they succeed. (MTV-779)

+
+
+
Validation rules are now available for OVA
+

The validation service includes default validation rules for virtual machines from the Open Virtual Appliance (OVA). (MTV-669)

+
+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+

Resolved issues 2.6.7

+
+
Incorrect handling of quotes in ifcfg files
+

In earlier releases of Forklift, there was an issue with the incorrect handling of single and double quotes in interface configuration (ifcfg) files, which control the software interfaces for individual network devices. This issue has been resolved in Forklift 2.6.7, in order to cover additional IP configurations on Red Hat Enterprise Linux, CentOS, Rocky Linux and similar distributions. (MTV-1439)

+
+
+
Failure to preserve netplan based network configuration
+

In earlier releases of Forklift, there was an issue with the preservation of netplan-based network configurations. This issue has been resolved in Forklift 2.6.7, so that static IP configurations are preserved if netplan (netplan.io) is used by using the netplan configuration files to generate udev rules for known mac-address and ifname tuples. (MTV-1440)

+
+
+
Error messages are written into udev .rules files
+

In earlier releases of Forklift, there was an issue with the accidental leakage of error messages into udev .rules files. This issue has been resolved in Forklift 2.6.7, with a static IP persistence script added to the udev rule file. (MTV-1441)

+
+
+
+

Resolved issues 2.6.6

+
+
Runtime error: invalid memory address or nil pointer dereference
+

In earlier releases of Forklift, there was a runtime error of invalid memory address or nil pointer dereference caused by a pointer that was nil, and there was an attempt to access the value that it points to. This issue has been resolved in Forklift 2.6.6. (MTV-1353)

+
+
+
All Plan and Migration pods scheduled to same node causing the node to crash
+

In earlier releases of Forklift, the scheduler could place all migration pods on a single node. When this happened, the node ran out of the resources. This issue has been resolved in Forklift 2.6.6. (MTV-1354)

+
+
+
Empty bearer token is sufficient for authentication
+

In earlier releases of Forklift, a vulnerability was found in the Forklift Controller.  There is no verification against the authorization header, except to ensure it uses bearer authentication. Without an authorization header and a bearer token, a 401 error occurs. The presence of a token value provides a 200 response with the requested information. This issue has been resolved in Forklift 2.6.6.

+
+
+

For more details, see (CVE-2024-8509).

+
+
+
+

Resolved issues 2.6.5

+
+
VMware Linux interface name changes during migration
+

In earlier releases of Forklift, during the migration of Rocky Linux 8, CentOS 7.2 and later, and Ubuntu 22 virtual machines (VM) from VMware to OKD (OCP), the name of the network interfaces is modified, and the static IP configuration for the VM is no longer functional. This issue has been resolved for static IPs in Rocky Linux 8, Centos 7.2 and later, Ubuntu 22 in Forklift 2.6.5. (MTV-595)

+
+
+
+

Resolved issues 2.6.4

+
+
Disks and drives are offline after migrating Windows virtual machines from RHV or VMware to OCP
+

Windows (Windows 2022) VMs configured with multiple disks, which are Online before the migration, are Offline after a successful migration from oVirt or VMware to OKD, using Forklift. Only the C:\ primary disk is Online. This issue has been resolved for basic disks in Forklift 2.6.4. (MTV-1299)

+
+
+

For details of the known issue of dynamic disks being Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd, see (MTV-1344).

+
+
+
Preserve IP option for Windows does not preserve all settings
+

In earlier releases of Forklift, while migrating a Windows 2022 Server with a static IP address assigned, and selecting the Preserve static IPs option, after a successful Windows migration, while the node started and the IP address was preserved, the subnet mask, gateway, and DNS servers were not preserved. This resulted in an incomplete migration, and the customer was forced to log in locally from the console to fully configure the network. This issue has been resolved in Forklift 2.6.4. (MTV-1286)

+
+
+
qemu-guest-agent not being installed at first boot in Windows Server 2022
+

After a successful Windows 2022 server guest migration using Forklift 2.6.1, the qemu-guest-agent is not completely installed. The Windows Scheduled task is being created, however it is being set to run 4 hours in the future instead of the intended 2 minutes in the future. (MTV-1325)

+
+
+
+

Resolved issues 2.6.3

+
+
CVE-2024-24788: golang: net malformed DNS message can cause infinite loop
+

In earlier releases of Forklift, there was a flaw was discovered in the stdlib package of the Go programming language, which impacts previous versions of Forklift. This vulnerability primarily threatens web-facing applications and services that rely on Go for DNS queries. This issue has been resolved in Forklift 2.6.3.

+
+
+

For more details, see (CVE-2024-24788).

+
+
+
Migration scheduling does not take into account that virt-v2v copies disks sequentially (vSphere only)
+

In earlier releases of Forklift, there was a problem with the way Forklift interpreted the controller_max_vm_inflight setting for vSphere to schedule migrations. This issue has been resolved in Forklift 2.6.3. (MTV-1191)

+
+
+
Cold migrations fail after changing the ESXi network (vSphere only)
+

In earlier versions of Forklift, cold migrations from a vSphere provider with an ESXi SDK endpoint failed if any network was used except for the default network for disk transfers. This issue has been resolved in Forklift 2.6.3. (MTV-1180)

+
+
+
Warm migrations over an ESXi network are stuck in DiskTransfer state (vSphere only)
+

In earlier versions of Forklift, warm migrations over an ESXi network from a vSphere provider with a vCenter SDK endpoint were stuck in DiskTransfer state because Forklift was unable to locate image snapshots. This issue has been resolved in Forklift 2.6.3. (MTV-1161)

+
+
+
Leftover PVCs are in Lost state after cold migrations
+

In earlier versions of Forklift, after cold migrations, there were leftover PVCs that had a status of Lost instead of being deleted, even after the migration plan that created them was archived and deleted. Investigation showed that this was because importer pods were retained after copying, by default, rather than in only specific cases. This issue has been resolved in Forklift 2.6.3. (MTV-1095)

+
+
+
Guest operating system from vSphere might be missing (vSphere only)
+

In earlier versions of Forklift, some VMs that were imported from vSphere were not mapped to a template in OKD while other VMs, with the same guest operating system, were mapped to the corresponding template. Investigations indicated that this was because vSphere stopped reporting the operating system after not receiving updates from VMware tools for some time. This issue has been resolved in Forklift 2.6.3 by taking the value of the operating system from the output of the investigation that virt-v2v performs on the disks. (MTV-1046)

+
+
+
+

Resolved issues 2.6.2

+
+
CVE-2023-45288: Golang net/http, x/net/http2: unlimited number of CONTINUATION frames can cause a denial-of-service (DoS) attack
+

A flaw was discovered with the implementation of the HTTP/2 protocol in the Go programming language, which impacts previous versions of Forklift. There were insufficient limitations on the number of CONTINUATION frames sent within a single stream. An attacker could potentially exploit this to cause a denial-of-service (DoS) attack. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45288).

+
+
+
CVE-2024-24785: mtv-api-container: Golang html/template: errors returned from MarshalJSON methods may break template escaping
+

A flaw was found in the html/template Golang standard library package, which impacts previous versions of Forklift. If errors returned from MarshalJSON methods contain user-controlled data, they may be used to break the contextual auto-escaping behavior of the HTML/template package, allowing subsequent actions to inject unexpected content into the templates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24785).

+
+
+
CVE-2024-24784: mtv-validation-container: Golang net/mail: comments in display names are incorrectly handled
+

A flaw was found in the net/mail Golang standard library package, which impacts previous versions of Forklift. The ParseAddressList function incorrectly handles comments, text in parentheses, and display names. As this is a misalignment with conforming address parsers, it can result in different trust decisions being made by programs using different parsers. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24784).

+
+
+
CVE-2024-24783: mtv-api-container: Golang crypto/x509: Verify panics on certificates with an unknown public key algorithm
+

A flaw was found in the crypto/x509 Golang standard library package, which impacts previous versions of Forklift. Verifying a certificate chain that contains a certificate with an unknown public key algorithm causes Certificate.Verify to panic. This affects all crypto/tls clients and servers that set Config.ClientAuth to VerifyClientCertIfGiven or RequireAndVerifyClientCert. The default behavior is for TLS servers to not verify client certificates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24783).

+
+
+
CVE-2023-45290: mtv-api-container: Golang net/http memory exhaustion in Request.ParseMultipartForm
+

A flaw was found in the net/http Golang standard library package, which impacts previous versions of Forklift. When parsing a multipart form, either explicitly with Request.ParseMultipartForm or implicitly with Request.FormValue, Request.PostFormValue, or Request.FormFile, limits on the total size of the parsed form are not applied to the memory consumed while reading a single form line. This permits a maliciously crafted input containing long lines to cause the allocation of arbitrarily large amounts of memory, potentially leading to memory exhaustion. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45290).

+
+
+
ImageConversion does not run when target storage is set with WaitForFirstConsumer (WFFC)
+

In earlier releases of Forklift, migration of VMs failed because the migration was stuck in the AllocateDisks phase. As a result of being stuck, the migration did not progress, and PVCs were not bound. The root cause of the issue was that ImageConversion did not run when target storage was set for wait-for-first-consumer. The problem was resolved in Forklift 2.6.2. (MTV-1126)

+
+
+
forklift-controller panics when importing VMs with direct LUNs
+

In earlier releases of Forklift, forklift-controller panicked when a user attempted to import VMs that had direct LUNs. The problem was resolved in Forklift 2.6.2. (MTV-1134)

+
+
+
+

Resolved issues 2.6.1

+
+
VMs with multiple disks that are migrated from vSphere and OVA files are not being fully copied
+

In Forklift 2.6.0, there was a problem in copying VMs with multiple disks from VMware vSphere and from OVA files. The migrations appeared to succeed but all the disks were transferred to the same PV in the target environment while other disks were empty. In some cases, bootable disks were overridden, so the VM could not boot. In other cases, data from the other disks was missing. The problem was resolved in Forklift 2.6.1. (MTV-1067)

+
+
+
Migrating VMs from one OKD cluster to another fails due to a timeout
+

In Forklift 2.6.0, migrations from one OKD cluster to another failed when the time to transfer the disks of a VM exceeded the time to live (TTL) of the Export API in {ocp-name}, which was set to 2 hours by default. The problem was resolved in Forklift 2.6.1 by setting the default TTL of the Export API to 12 hours, which greatly reduces the possibility of an expiration of the Export API. Additionally, you can increase or decrease the TTL setting as needed. (MTV-1052)

+
+
+
Forklift forklift-controller pod crashes when receiving a disk without a datastore
+

In earlier releases of Forklift, if a VM was configured with a disk that was on a datastore that was no longer available in vSphere at the time a migration was attempted, the forklift-controller crashed, rendering Forklift unusable. In Forklift 2.6.1, Forklift presents a critical validation for VMs with such disks, informing users of the problem, and the forklift-controller no longer crashes, although it cannot transfer the disk. (MTV-1029)

+
+
+
+

Resolved issues 2.6.0

+
+
Deleting an OVA provider automatically also deletes the PV
+

In earlier releases of Forklift, the PV was not removed when the OVA provider was deleted. This has been resolved in Forklift 2.6.0, and the PV is automatically deleted when the OVA provider is deleted. (MTV-848)

+
+
+
Fix for data being lost when migrating VMware VMs with snapshots
+

In earlier releases of Forklift, when migrating a VM that has a snapshot from VMware, the VM that was created in {ocp-name} Virtualization contained the data in the snapshot but not the latest data of the VM. This has been resolved in Forklift 2.6.0. (MTV-447)

+
+
+
Canceling and deleting a failed migration plan does not clean up the populate pods and PVC
+

In earlier releases of Forklift, when you canceled and deleted a failed migration plan, and after creating a PVC and spawning the populate pods, the populate pods and PVC were not deleted. You had to delete the pods and PVC manually. This issue has been resolved in Forklift 2.6.0. (MTV-678)

+
+
+
OKD to OKD migrations require the cluster version to be 4.13 or later
+

In earlier releases of Forklift, when migrating from OKD to OKD, the version of the source provider cluster had to be OKD version 4.13 or later. This issue has been resolved in Forklift 2.6.0, with validation being shown when migrating from versions of {ocp-name} before 4.13. (MTV-734)

+
+
+
Multiple storage domains from RHV were always mapped to a single storage class
+

In earlier releases of Forklift, multiple disks from different storage domains were always mapped to a single storage class, regardless of the storage mapping that was configured. This issue has been resolved in Forklift 2.6.0. (MTV-1008)

+
+
+
Firmware detection by virt-v2v
+

In earlier releases of Forklift, a VM that was migrated from an OVA that did not include the firmware type in its OVF configuration was set with UEFI. This was incorrect for VMs that were configured with BIOS. This issue has been resolved in Forklift 2.6.0, as Forklift now consumes the firmware that is detected by virt-v2v during the conversion of the disks. (MTV-759)

+
+
+
Creating a host secret requires validation of the secret before creation of the host
+

In earlier releases of Forklift, when configuring a transfer network for vSphere hosts, the console plugin created the Host CR before creating its secret. The secret should be specified first in order to validate it before the Host CR is posted. This issue has been resolved in Forklift 2.6.0. (MTV-868)

+
+
+
When adding OVA provider a ConnectionTestFailed message appears
+

In earlier releases of Forklift, when adding an OVA provider, the error message ConnectionTestFailed instantly appeared, although the provider had been created successfully. This issue has been resolved in Forklift 2.6.0. (MTV-671)

+
+
+
RHV provider ConnectionTestSucceeded True response from the wrong URL
+

In earlier releases of Forklift, the ConnectionTestSucceeded condition was set to True even when the URL was different than the API endpoint for the RHV Manager. This issue has been resolved in Forklift 2.6.0. (MTV-740)

+
+
+
Migration does not fail when a vSphere Data Center is nested inside a folder
+

In earlier releases of Forklift, migrating a VM that is placed in a Data Center that is stored directly under the /vcenter in vSphere succeeded. However, it failed when the Data Center was stored inside a folder. This issue was resolved in Forklift 2.6.0. (MTV-796)

+
+
+
The OVA inventory watcher detects deleted files
+

The OVA inventory watcher detects files changes, including deleted files. Updates from the ova-provider-server pod are now sent every five minutes to the forklift-controller pod that updates the inventory. (MTV-733)

+
+
+
Unclear error message when Forklift fails to build or create a PVC
+

In earlier releases of Forklift, the error logs lacked clear information to identify the reason for a failure to create a PV on a destination storage class that does not have a configured storage profile. This issue was resolved in Forklift 2.6.0. (MTV-928)

+
+
+
Plans stay indefinitely in the CopyDisks phase when there is an outdated ovirtvolumepopulator
+

In earlier releases of Forklift, an earlier failed migration could have left an outdated ovirtvolumepopulator. When starting a new plan for the same VM to the same project, the CreateDataVolumes phase did not create populator PVCs when transitioning to CopyDisks, causing the CopyDisks phase to stay indefinitely. This issue was resolved in Forklift 2.6.0. (MTV-929)

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+ + + + + +
+
Warning
+
+
Warm migration and remote migration flows are impacted by multiple bugs
+
+

Warm migration and remote migration flows are impacted by multiple bugs. It is strongly recommended to fall back to cold migration until this issue is resolved. (MTV-1366)

+
+
+
+
+
Migrating older Linux distributions from VMware to OKD, the name of the network interfaces changes
+

When migrating older Linux distributions, such as CentOS 7.0 and 7.1, virtual machines (VMs) from VMware to OKD, the name of the network interfaces changes, and the static IP configuration for the VM no longer functions. This issue is caused by RHEL 7.0 and 7.1 still requiring virtio-transitional. Workaround: Manually update the guest to RHEL 7.2 or update the VM specification post-migration to use transitional. (MTV-1382)

+
+
+
Dynamic disks are offline in Windows Server 2022 after migration from vSphere to CNV with ceph-rbd
+

The dynamic disks are Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd. (MTV-1344)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during a conversion (vSphere only)
+

vSphere only: Migrations from oVirt and {osp} do not fail, but the encryption key might be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage class of type hostPath
+

When migrating a VM with multiple disks to more than one storage class of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support the same guest operating systems that are supported in cold migrations and migrations to the local OKD cluster. RHEL 8 and RHEL 9 might cause this limitation.

+
+ +
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as a guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Migration of a VM with NVME disks from vSphere fails
+

When migrating a virtual machine (VM) with NVME disks from vSphere, the migration process fails, and the Web Console shows that the Convert image to kubevirt stage is running but did not finish successfully. (MTV-963)

+
+
+
Importing image-based VMs can fail
+

Migrating an image-based VM without the virtual_size field can fail on a block mode storage class. (MTV-946)

+
+
+
Deleting a migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Migrating VMs with independent persistent disks from VMware to OCP-V fails
+

Migrating VMs with independent persistent disks from VMware to OCP-V fails. (MTV-993)

+
+
+
Guest operating system from vSphere might be missing
+

When vSphere does not receive updates about the guest operating system from the VMware tools, it considers the information about the guest operating system to be outdated and ceases to report it. When this occurs, Forklift is unaware of the guest operating system of the VM and is unable to associate it with the appropriate virtual machine preference or {ocp-name} template. (MTV-1046)

+
+
+
Failure to migrate an image-based VM from {osp} to the default project
+

The migration process fails when migrating an image-based VM from {osp} to the default project. (MTV-964)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+ + +
+ + diff --git a/documentation/modules/rn-2.7/index.html b/documentation/modules/rn-2.7/index.html new file mode 100644 index 00000000000..3589eba6c94 --- /dev/null +++ b/documentation/modules/rn-2.7/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.7

+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere versions 6, 7, and 8

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+ + +
+ + diff --git a/documentation/modules/rn-27-resolved-issues/index.html b/documentation/modules/rn-27-resolved-issues/index.html new file mode 100644 index 00000000000..f42f84cab02 --- /dev/null +++ b/documentation/modules/rn-27-resolved-issues/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Resolved issues

+
+
+
+

Forklift 2.7 has the following resolved issues:

+
+
+
+
+

Resolved issues 2.7.3

+
+
+
Migration plan does not fail when conversion pod fails
+

In earlier releases of Forklift, when running the virt-v2v guest conversion, the migration plan did not fail if the conversion pod failed, as expected. This issue has been resolved in Forklift 2.7.3. (MTV-1569)

+
+
+
Large number of VMs in the inventory can cause the inventory controller to panic
+

In earlier releases of Forklift, having a large number of virtual machines (VMs) in the inventory could cause the inventory controller to panic and return a concurrent write to websocket connection warning. This issue was caused by the concurrent write to the WebSocket connection and has been addressed by the addition of a lock, so the Go routine waits before sending the response from the server. This issue has been resolved in Forklift 2.7.3. (MTV-1220)

+
+
+
VM selection disappears when selecting multiple VMs in the Migration Plan
+

In earlier releases of Forklift, VM selection checkbox disappeared after selecting multiple VMs in the Migration Plan. This issue has been resolved in Forklift 2.7.3. (MTV-1546)

+
+
+
forklift-controller crashing during OVA plan migration
+

In earlier releases of Forklift, the forklift-controller would crash during an OVA plan migration, returning a runtime error: invalid memory address or nil pointer dereference panic.  This issue has been resolved in Forklift 2.7.3. (MTV-1577)

+
+
+
+
+

Resolved issues 2.7.2

+
+
+
VMNetworksNotMapped error occurs after creating a plan from the UI with the source provider set to KubeVirt
+

In earlier releases of Forklift, after creating a plan with an KubeVirt source provider, the Migration Plan failed with the error The plan is not ready - VMNetworksNotMapped. This issue has been resolved in Forklift 2.7.2. (MTV-1201)

+
+
+
Migration Plan for KubeVirt to KubeVirt missing the source namespace causing VMNetworkNotMapped error
+

In earlier releases of Forklift, when creating a Migration Plan for an KubeVirt to KubeVirt migration using the Plan Creation Form, the network map generated was missing the source namespace, which caused a VMNetworkNotMapped error on the plan. This issue has been resolved in Forklift 2.7.2. (MTV-1297)

+
+
+
DV, PVC, and PV are not cleaned up and removed if the migration plan is Archived and Deleted
+

In earlier releases of Forklift, the DataVolume (DV), PersistentVolumeClaim (PVC), and PersistentVolume (PV) continued to exist after the migration plan was archived and deleted. This issue has been resolved in Forklift 2.7.2. (MTV-1477)

+
+
+
Other migrations are halted from starting as the scheduler is waiting for the complete VM to get transferred
+

In earlier releases of Forklift, when warm migrating a virtual machine (VM) that has several disks, you had to wait for the complete VM to get migrated, and the scheduler was halted until all the disks finished before the migration would be started. This issue has been resolved in Forklift 2.7.2. (MTV-1537)

+
+
+
Warm migration is not functioning as expected
+

In earlier releases of Forklift, warm migration did not function as expected. When running the warm migration with VMs larger than the MaxInFlight disks, the VMs over this number did not start the migration until the cutover. This issue has been resolved in Forklift 2.7.2. (MTV-1543)

+
+
+
Migration hanging due to error: virt-v2v: error: -i libvirt: expecting a libvirt guest name
+

In earlier releases of Forklift, when attempting to migrate a VMware VM with a non-compliant Kubernetes name, the Openshift console returned a warning that the VM would be renamed. However, after starting the Migration Plan, it hangs since the migration pod is in an Error state. This issue has been resolved in Forklift 2.7.2. This issue has been resolved in Forklift 2.7.2. (MTV-1555)

+
+
+
VMs are not migrated if they have more disks than MAX_VM_INFLIGHT
+

In earlier releases of Forklift, when migrating the VM using the warm migration, if there were more disks than the MAX_VM_INFLIGHT the VM was not scheduled and the migration was not started. This issue has been resolved in Forklift 2.7.2. (MTV-1573)

+
+
+
Migration Plan returns an error even when Changed Block Tracking (CBT) is enabled
+

In earlier releases of Forklift, when running a VM in VMware, if the CBT flag was enabled while the VM was running by adding both ctkEnabled=TRUE and scsi0:0.ctkEnabled=TRUE parameters, an error message Danger alert:The plan is not ready - VMMissingChangedBlockTracking was returned, and the migration plan was prevented from working. This issue has been resolved in Forklift 2.7.2. (MTV-1576)

+
+
+
+
+

Resolved issues 2.7.0

+
+
+
Change . to - in the names of VMs that are migrated
+

In earlier releases of Forklift, if the name of the virtual machines (VMs) contained ., this was changed to - when they were migrated. This issue has been resolved in Forklift 2.7.0. (MTV-1292)

+
+
+
Status condition indicating a failed mapping resource in a plan is not added to the plan
+

In earlier releases of Forklift, a status condition indicating a failed mapping resource of a plan was not added to the plan. This issue has been resolved in Forklift 2.7.0, with a status condition indicating the failed mapping being added. (MTV-1461)

+
+
+
ifcfg files with HWaddr cause the NIC name to change
+

In earlier releases of Forklift, interface configuration (ifcfg) files with a hardware address (HWaddr) of the Ethernet interface caused the name of the network interface controller (NIC) to change. This issue has been resolved in Forklift 2.7.0. (MTV-1463)

+
+
+
Import fails with special characters in VMX file
+

In earlier releases of Forklift, imports failed when there were special characters in the parameters of the VMX file. This issue has been resolved in Forklift 2.7.0. (MTV-1472)

+
+
+
Observed invalid memory address or nil pointer dereference panic
+

In earlier releases of Forklift, an invalid memory address or nil pointer dereference panic was observed, which was caused by a refactor and could be triggered when there was a problem with the inventory pod. This issue has been resolved in Forklift 2.7.0. (MTV-1482)

+
+
+
Static IPv4 changed after warm migrating win2022/2019 VMs
+

In earlier releases of Forklift, the static Internet Protocol version 4 (IPv4) address was changed after a warm migration of Windows Server 2022 and Windows Server 2019 VMs. This issue has been resolved in Forklift 2.7.0. (MTV-1491)

+
+
+
Warm migration is missing arguments
+

In earlier releases of Forklift, virt-v2v-in-place for the warm migration was missing arguments that were available in virt-v2v for the cold migration. This issue has been resolved in Forklift 2.7.0. (MTV-1495)

+
+
+
Default gateway settings changed after migrating Windows Server 2022 VMs with preserve static IPs
+

In earlier releases of Forklift, the default gateway settings were changed after migrating Windows Server 2022 VMs with the preserve static IPs setting. This issue has been resolved in Forklift 2.7.0. (MTV-1497)

+
+
+
+ + +
+ + diff --git a/documentation/modules/running-migration-plan/index.html b/documentation/modules/running-migration-plan/index.html new file mode 100644 index 00000000000..f86e5b29844 --- /dev/null +++ b/documentation/modules/running-migration-plan/index.html @@ -0,0 +1,135 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Running a migration plan

+
+

You can run a migration plan and view its progress in the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Valid migration plan.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
    +

    The Plans list displays the source and target providers, the number of virtual machines (VMs) being migrated, the status, and the description of each plan.

    +
    +
  2. +
  3. +

    Click Start beside a migration plan to start the migration.

    +
  4. +
  5. +

    Click Start in the confirmation window that opens.

    +
    +

    The Migration details by VM screen opens, displaying the migration’s progress

    +
    +
    +

    Warm migration only:

    +
    +
    +
      +
    • +

      The precopy stage starts.

      +
    • +
    • +

      Click Cutover to complete the migration.

      +
    • +
    +
    +
  6. +
  7. +

    If the migration fails:

    +
    +
      +
    1. +

      Click Get logs to retrieve the migration logs.

      +
    2. +
    3. +

      Click Get logs in the confirmation window that opens.

      +
    4. +
    5. +

      Wait until Get logs changes to Download logs and then click the button to download the logs.

      +
    6. +
    +
    +
  8. +
  9. +

    Click a migration’s Status, whether it failed or succeeded or is still ongoing, to view the details of the migration.

    +
    +

    The Migration details by VM screen opens, displaying the start and end times of the migration, the amount of data copied, and a progress pipeline for each VM being migrated.

    +
    +
  10. +
  11. +

    Expand an individual VM to view its steps and the elapsed time and state of each step.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/selecting-migration-network-for-virt-provider/index.html b/documentation/modules/selecting-migration-network-for-virt-provider/index.html new file mode 100644 index 00000000000..885bcf1ba2d --- /dev/null +++ b/documentation/modules/selecting-migration-network-for-virt-provider/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a KubeVirt provider

+
+

You can select a default migration network for a KubeVirt provider in the OKD web console to improve performance. The default migration network is used to transfer disks to the namespaces in which it is configured.

+
+
+

If you do not select a migration network, the default migration network is the pod network, which might not be optimal for disk transfer.

+
+
+ + + + + +
+
Note
+
+
+

You can override the default migration network of the provider by selecting a different network when you create a migration plan.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    On the right side of the provider, select Select migration network from the {kebab}.

    +
  4. +
  5. +

    Select a network from the list of available networks and click Select.

    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/selecting-migration-network-for-vmware-source-provider/index.html b/documentation/modules/selecting-migration-network-for-vmware-source-provider/index.html new file mode 100644 index 00000000000..348da7ece85 --- /dev/null +++ b/documentation/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,142 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a VMware source provider

+
+

You can select a migration network in the OKD web console for a source provider to reduce risk to the source environment and to improve performance.

+
+
+

Using the default network for migration can result in poor performance because the network might not have sufficient bandwidth. This situation can have a negative effect on the source platform because the disk transfer operation might saturate the network.

+
+
+

Unresolved directive in selecting-migration-network-for-vmware-source-provider.adoc - include::snip_vmware_esxi_nfc.adoc[]

+
+
+
Prerequisites
+
    +
  • +

    The migration network must have sufficient throughput, minimum speed of 10 Gbps, for disk transfer.

    +
  • +
  • +

    The migration network must be accessible to the KubeVirt nodes through the default gateway.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The source virtual disks are copied by a pod that is connected to the pod network of the target namespace.

    +
    +
    +
    +
  • +
  • +

    The migration network should have jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click the host number in the Hosts column beside a provider to view a list of hosts.

    +
  4. +
  5. +

    Select one or more hosts and click Select migration network.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Network: Network name

      +
    • +
    • +

      ESXi host admin username: For example, root

      +
    • +
    • +

      ESXi host admin password: Password

      +
    • +
    +
    +
  8. +
  9. +

    Click Save.

    +
  10. +
  11. +

    Verify that the status of each host is Ready.

    +
    +

    If a host status is not Ready, the host might be unreachable on the migration network or the credentials might be incorrect. You can modify the host configuration and save the changes.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/selecting-migration-network/index.html b/documentation/modules/selecting-migration-network/index.html new file mode 100644 index 00000000000..bc840a983dc --- /dev/null +++ b/documentation/modules/selecting-migration-network/index.html @@ -0,0 +1,118 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a source provider

+
+

You can select a migration network for a source provider in the Forklift web console for improved performance.

+
+
+

If a source network is not optimal for migration, a Warning icon is displayed beside the host number in the Hosts column of the provider list.

+
+
+
Prerequisites
+

The migration network has the following prerequisites:

+
+
+
    +
  • +

    Minimum speed of 10 Gbps.

    +
  • +
  • +

    Accessible to the OpenShift nodes through the default gateway. The source disks are copied by a pod that is connected to the pod network of the target namespace.

    +
  • +
  • +

    Jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Click Providers.

    +
  2. +
  3. +

    Click the host number of a provider to view the host list and network details.

    +
  4. +
  5. +

    Select the host to be updated and click Select migration network.

    +
  6. +
  7. +

    Select a Network from the list of available networks.

    +
    +

    The network list displays only the networks accessible to all the selected hosts. The hosts must have

    +
    +
  8. +
  9. +

    Click Check connection to verify the credentials.

    +
  10. +
  11. +

    Click Select to select the migration network.

    +
    +

    The migration network appears in the network details of the updated hosts.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/snip-certificate-options/index.html b/documentation/modules/snip-certificate-options/index.html new file mode 100644 index 00000000000..c53e67d0b24 --- /dev/null +++ b/documentation/modules/snip-certificate-options/index.html @@ -0,0 +1,114 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  2. +
  3. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  4. +
+
+ + +
+ + diff --git a/documentation/modules/snip-migrating-luns/index.html b/documentation/modules/snip-migrating-luns/index.html new file mode 100644 index 00000000000..906ad2d15db --- /dev/null +++ b/documentation/modules/snip-migrating-luns/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_cold-warm-comparison-table/index.html b/documentation/modules/snip_cold-warm-comparison-table/index.html new file mode 100644 index 00000000000..c8c84639848 --- /dev/null +++ b/documentation/modules/snip_cold-warm-comparison-table/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Both cold migration and warm migration have advantages and disadvantages, as described in the table that follows:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Advantages and disadvantages of cold and warm migrations
Cold migrationWarm migration

Duration

Correlates to the amount of data on the disks

Correlates to the amount of data on the disks and VM utilization

Data transferred

Approximate sum of all disks

Approximate sum of all disks and VM utilization

VM downtime

High

Low

+ + +
+ + diff --git a/documentation/modules/snip_measured_boot_windows_vm/index.html b/documentation/modules/snip_measured_boot_windows_vm/index.html new file mode 100644 index 00000000000..316a51a5c4c --- /dev/null +++ b/documentation/modules/snip_measured_boot_windows_vm/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+ + +
+ + diff --git a/documentation/modules/snip_performance/index.html b/documentation/modules/snip_performance/index.html new file mode 100644 index 00000000000..b8fe4e8b75d --- /dev/null +++ b/documentation/modules/snip_performance/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+ + +
+ + diff --git a/documentation/modules/snip_permissions-info/index.html b/documentation/modules/snip_permissions-info/index.html new file mode 100644 index 00000000000..d8cd2591f2b --- /dev/null +++ b/documentation/modules/snip_permissions-info/index.html @@ -0,0 +1,85 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

If you are an administrator, you can see and work with components (providers, plans, etc.) for all projects.

+
+
+

If you are a non-administrator, you can only see and work only with the components of projects you have permissions for.

+
+
+ + + + + +
+
Tip
+
+
+

You can see which projects you have permissions for by clicking the Project list, which is in the upper-left of every page in the Migrations section except for the Overview.

+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_plan-limits/index.html b/documentation/modules/snip_plan-limits/index.html new file mode 100644 index 00000000000..049c9ee4014 --- /dev/null +++ b/documentation/modules/snip_plan-limits/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_qemu-guest-agent/index.html b/documentation/modules/snip_qemu-guest-agent/index.html new file mode 100644 index 00000000000..846f51b7f39 --- /dev/null +++ b/documentation/modules/snip_qemu-guest-agent/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

VMware only: In cold migrations, in situations in which a package manager cannot be used during the migration, Forklift does not install the qemu-guest-agent daemon on the migrated VMs. This has some impact on the functionality of the migrated VMs, but overall, they are still expected to function.

+
+
+

To enable Forklift to automatically install qemu-guest-agent on the migrated VMs, ensure that your package manager can install the daemon during the first boot of the VM after migration.

+
+
+

If that is not possible, use your preferred automated or manual procedure to install qemu-guest-agent manually.

+
+ + +
+ + diff --git a/documentation/modules/snip_secure_boot_issue/index.html b/documentation/modules/snip_secure_boot_issue/index.html new file mode 100644 index 00000000000..72863f200da --- /dev/null +++ b/documentation/modules/snip_secure_boot_issue/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+ + +
+ + diff --git a/documentation/modules/snip_vmware-name-change/index.html b/documentation/modules/snip_vmware-name-change/index.html new file mode 100644 index 00000000000..671b0a29949 --- /dev/null +++ b/documentation/modules/snip_vmware-name-change/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_vmware-permissions/index.html b/documentation/modules/snip_vmware-permissions/index.html new file mode 100644 index 00000000000..c89a856e8b3 --- /dev/null +++ b/documentation/modules/snip_vmware-permissions/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_vmware_esxi_nfc/index.html b/documentation/modules/snip_vmware_esxi_nfc/index.html new file mode 100644 index 00000000000..381d8b02cf7 --- /dev/null +++ b/documentation/modules/snip_vmware_esxi_nfc/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+

You can also control the network from which disks are transferred from a host by using the Network File Copy (NFC) service in vSphere.

+
+
+
+ + +
+ + diff --git a/documentation/modules/snippet_getting_web_console_url_cli/index.html b/documentation/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 00000000000..d31bf5e444d --- /dev/null +++ b/documentation/modules/snippet_getting_web_console_url_cli/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

+
+
+
+
$ kubectl get route virt -n konveyor-forklift \
+  -o custom-columns=:.spec.host
+
+
+
+

+ +The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

+
+
+

+ +.Example output

+
+
+
+
https://virt-konveyor-forklift.apps.cluster.openshift.com.
+
+
+ + +
+ + diff --git a/documentation/modules/snippet_getting_web_console_url_web/index.html b/documentation/modules/snippet_getting_web_console_url_web/index.html new file mode 100644 index 00000000000..461130466e4 --- /dev/null +++ b/documentation/modules/snippet_getting_web_console_url_web/index.html @@ -0,0 +1,84 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Log in to the OKD web console.

    +
  2. +
  3. +

    Click NetworkingRoutes.

    +
  4. +
  5. +

    Select the {namespace} project in the Project: list.

    +
    +

    The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

    +
    +
    +

    Click the URL to navigate to the Forklift web console.

    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/snippet_ova_tech_preview/index.html b/documentation/modules/snippet_ova_tech_preview/index.html new file mode 100644 index 00000000000..54d5718e490 --- /dev/null +++ b/documentation/modules/snippet_ova_tech_preview/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

+
+
+ + + + + +
+
Important
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/modules/source-vm-prerequisites/index.html b/documentation/modules/source-vm-prerequisites/index.html new file mode 100644 index 00000000000..422422f86a2 --- /dev/null +++ b/documentation/modules/source-vm-prerequisites/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Source virtual machine prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    ISO/CDROM disks must be unmounted.

    +
  • +
  • +

    Each NIC must contain one IPv4 and/or one IPv6 address.

    +
  • +
  • +

    The operating system of a VM must be certified and supported as a guest operating system with KubeVirt.

    +
  • +
  • +

    The name of a VM must not contain a period (.). Forklift changes any period in a VM name to a dash (-).

    +
  • +
  • +

    The name of a VM must not be the same as any other VM in the KubeVirt environment.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    Forklift automatically assigns a new name to a VM that does not comply with the rules.

    +
    +
    +

    Forklift makes the following changes when it automatically generates a new VM name:

    +
    +
    +
      +
    • +

      Excluded characters are removed.

      +
    • +
    • +

      Uppercase letters are switched to lowercase letters.

      +
    • +
    • +

      Any underscore (_) is changed to a dash (-).

      +
    • +
    +
    +
    +

    This feature allows a migration to proceed smoothly even if someone enters a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+ + +
+ + diff --git a/documentation/modules/storage-support/index.html b/documentation/modules/storage-support/index.html new file mode 100644 index 00000000000..eff55773528 --- /dev/null +++ b/documentation/modules/storage-support/index.html @@ -0,0 +1,211 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Storage support and default modes

+
+

Forklift uses the following default volume and access modes for supported storage.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Default volume and access modes
ProvisionerVolume modeAccess mode

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

+
+ + + + + +
+
Note
+
+
+

If the KubeVirt storage does not support dynamic provisioning, you must apply the following settings:

+
+
+
    +
  • +

    Filesystem volume mode

    +
    +

    Filesystem volume mode is slower than Block volume mode.

    +
    +
  • +
  • +

    ReadWriteOnce access mode

    +
    +

    ReadWriteOnce access mode does not support live virtual machine migration.

    +
    +
  • +
+
+
+

See Enabling a statically-provisioned storage class for details on editing the storage profile.

+
+
+
+
+ + + + + +
+
Note
+
+
+

If your migration uses block storage and persistent volumes created with an EXT4 file system, increase the file system overhead in CDI to be more than 10%. The default overhead that is assumed by CDI does not completely include the reserved place for the root partition. If you do not increase the file system overhead in CDI by this amount, your migration might fail.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When migrating from OpenStack or running a cold-migration from RHV to the OCP cluster that MTV is deployed on, the migration allocates persistent volumes without CDI. In these cases, you might need to adjust the file system overhead.

+
+
+

If the configured file system overhead, which has a default value of 10%, is too low, the disk transfer will fail due to lack of space. In such a case, you would want to increase the file system overhead.

+
+
+

In some cases, however, you might want to decrease the file system overhead to reduce storage consumption.

+
+
+

You can change the file system overhead by changing the value of the controller_filesystem_overhead in the spec portion of the forklift-controller CR, as described in Configuring the MTV Operator.

+
+
+
+ + +
+ + diff --git a/documentation/modules/technical-changes-2-7/index.html b/documentation/modules/technical-changes-2-7/index.html new file mode 100644 index 00000000000..664efdf01c6 --- /dev/null +++ b/documentation/modules/technical-changes-2-7/index.html @@ -0,0 +1,73 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Technical changes

+
+

Forklift 2.7 has the following technical changes:

+
+
+
Upgraded virt-v2v to RHEL9 for warm migrations
+

Forklift previously used virt-v2v from Red Hat Enterprise Linux (RHEL) 8, which does not include bug fixes and features that are available in virt-v2v in RHEL9. In Forklift 2.7.0, components are updated to RHEL 9 in order to improve the functionality of warm migration. (MTV-1152)

+
+ + +
+ + diff --git a/documentation/modules/technology-preview/index.html b/documentation/modules/technology-preview/index.html new file mode 100644 index 00000000000..b2027f26d72 --- /dev/null +++ b/documentation/modules/technology-preview/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

{FeatureName} is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/documentation/modules/uninstalling-mtv-cli/index.html b/documentation/modules/uninstalling-mtv-cli/index.html new file mode 100644 index 00000000000..00ba0011a78 --- /dev/null +++ b/documentation/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,144 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI).

+
+
+ + + + + +
+
Note
+
+
+

This action does not remove resources managed by the Forklift Operator, including custom resource definitions (CRDs) and custom resources (CRs). To remove these after uninstalling the Forklift Operator, you might need to manually delete the Forklift Operator CRDs.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Delete the forklift controller by running the following command:

    +
    +
    +
    $ oc delete ForkliftController --all -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Delete the subscription to the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  4. +
  5. +

    Delete the clusterserviceversion for the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  6. +
  7. +

    Delete the plugin console CR by running the following command:

    +
    +
    +
    $ oc delete ConsolePlugin forklift-console-plugin
    +
    +
    +
  8. +
  9. +

    Optional: Delete the custom resource definitions (CRDs) by running the following command:

    +
    +
    +
    kubectl get crd -o name | grep 'forklift.konveyor.io' | xargs kubectl delete
    +
    +
    +
  10. +
  11. +

    Optional: Perform cleanup by deleting the Forklift project by running the following command:

    +
    +
    +
    oc delete project openshift-mtv
    +
    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/uninstalling-mtv-ui/index.html b/documentation/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 00000000000..bc182ce0850 --- /dev/null +++ b/documentation/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift by using the OKD web console

+
+

You can uninstall Forklift by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Operators > Installed Operators.

    +
  2. +
  3. +

    Click Forklift Operator.

    +
    +

    The Operator Details page opens in the Details tab.

    +
    +
  4. +
  5. +

    Click the ForkliftController tab.

    +
  6. +
  7. +

    Click Actions and select Delete ForkLiftController.

    +
    +

    A confirmation window opens.

    +
    +
  8. +
  9. +

    Click Delete.

    +
    +

    The controller is removed.

    +
    +
  10. +
  11. +

    Open the Details tab.

    +
    +

    The Create ForkliftController button appears instead of the controller you deleted. There is no need to click it.

    +
    +
  12. +
  13. +

    On the upper-right side of the page, click Actions and select Uninstall Operator.

    +
    +

    A confirmation window opens, displaying any operand instances.

    +
    +
  14. +
  15. +

    To delete all instances, select the Delete all operand instances for this operator checkbox. By default, the checkbox is cleared.

    +
    + + + + + +
    +
    Important
    +
    +
    +

    If your Operator configured off-cluster resources, these will continue to run and will require manual cleanup.

    +
    +
    +
    +
  16. +
  17. +

    Click Uninstall.

    +
    +

    The Installed Operators page opens, and the Forklift Operator is removed from the list of installed Operators.

    +
    +
  18. +
  19. +

    Click Home > Overview.

    +
  20. +
  21. +

    In the Status section of the page, click Dynamic Plugins.

    +
    +

    The Dynamic Plugins popup opens, listing forklift-console-plugin as a failed plugin. If the forklift-console-plugin does not appear as a failed plugin, refresh the web console.

    +
    +
  22. +
  23. +

    Click forklift-console-plugin.

    +
    +

    The ConsolePlugin details page opens in the Details tab.

    +
    +
  24. +
  25. +

    On the upper right-hand side of the page, click Actions and select Delete ConsolePlugin from the list.

    +
    +

    A confirmation window opens.

    +
    +
  26. +
  27. +

    Click Delete.

    +
    +

    The plugin is removed from the list of Dynamic plugins on the Overview page. If the plugin still appears, restart the Overview page.

    +
    +
  28. +
+
+ + +
+ + diff --git a/documentation/modules/updating-validation-rules-version/index.html b/documentation/modules/updating-validation-rules-version/index.html new file mode 100644 index 00000000000..14c198cbc05 --- /dev/null +++ b/documentation/modules/updating-validation-rules-version/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Updating the inventory rules version

+
+

You must update the inventory rules version each time you update the rules so that the Provider Inventory service detects the changes and triggers the Validation service.

+
+
+

The rules version is recorded in a rules_version.rego file for each provider.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the current rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 5
    +   }
    +}
    +
    +
    +
  2. +
  3. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  4. +
  5. +

    Update the rules version in the /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego file.

    +
  6. +
  7. +

    Log out of the Validation pod terminal.

    +
  8. +
  9. +

    Verify the updated rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 6
    +   }
    +}
    +
    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/upgrading-mtv-ui/index.html b/documentation/modules/upgrading-mtv-ui/index.html new file mode 100644 index 00000000000..a15ecb550b5 --- /dev/null +++ b/documentation/modules/upgrading-mtv-ui/index.html @@ -0,0 +1,127 @@ + + + + + + + + Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + +Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Upgrading Forklift

+
+

You can upgrade the Forklift Operator by using the OKD web console to install the new version.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsInstalled Operators{operator-name-ui}Subscription.

    +
  2. +
  3. +

    Change the update channel to the correct release.

    +
    +

    See Changing update channel in the OKD documentation.

    +
    +
  4. +
  5. +

    Confirm that Upgrade status changes from Up to date to Upgrade available. If it does not, restart the CatalogSource pod:

    +
    +
      +
    1. +

      Note the catalog source, for example, redhat-operators.

      +
    2. +
    3. +

      From the command line, retrieve the catalog source pod:

      +
      +
      +
      $ kubectl get pod -n openshift-marketplace | grep <catalog_source>
      +
      +
      +
    4. +
    5. +

      Delete the pod:

      +
      +
      +
      $ kubectl delete pod -n openshift-marketplace <catalog_source_pod>
      +
      +
      +
      +

      Upgrade status changes from Up to date to Upgrade available.

      +
      +
      +

      If you set Update approval on the Subscriptions tab to Automatic, the upgrade starts automatically.

      +
      +
    6. +
    +
    +
  6. +
  7. +

    If you set Update approval on the Subscriptions tab to Manual, approve the upgrade.

    +
    +

    See Manually approving a pending upgrade in the OKD documentation.

    +
    +
  8. +
  9. +

    If you are upgrading from Forklift 2.2 and have defined VMware source providers, edit the VMware provider by adding a VDDK init image. Otherwise, the update will change the state of any VMware providers to Critical. For more information, see Adding a VMSphere source provider.

    +
  10. +
  11. +

    If you mapped to NFS on the OKD destination provider in Forklift 2.2, edit the AccessModes and VolumeMode parameters in the NFS storage profile. Otherwise, the upgrade will invalidate the NFS mapping. For more information, see Customizing the storage profile.

    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/using-must-gather/index.html b/documentation/modules/using-must-gather/index.html new file mode 100644 index 00000000000..087661ce0ab --- /dev/null +++ b/documentation/modules/using-must-gather/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using the must-gather tool

+
+

You can collect logs and information about Forklift custom resources (CRs) by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, migration plan, or virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Collecting logs and CR information
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_id> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        Specify the VM ID as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/virt-migration-workflow/index.html b/documentation/modules/virt-migration-workflow/index.html new file mode 100644 index 00000000000..8996eff96e6 --- /dev/null +++ b/documentation/modules/virt-migration-workflow/index.html @@ -0,0 +1,209 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Detailed migration workflow

+
+

You can use the detailed migration workflow to troubleshoot a failed migration.

+
+
+

The workflow describes the following steps:

+
+
+

Warm Migration or migration to a remote {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create the Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
  7. +

    The CDI Controller service creates an importer pod.

    +
  8. +
  9. +

    The importer pod streams the VM disk to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The Migration Controller service creates a conversion pod with the PVCs attached to it when importing from VMWare.

    +
    +

    The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the target VM.

    +
    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from oVirt or {osp} to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates for each source VM disk a PersistentVolumeClaim CR, and an OvirtVolumePopulator when the source is oVirt, or an OpenstackVolumePopulator CR when the source is {osp}.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Populator Controller service creates a temporarily persistent volume claim (PVC).

    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
    +
      +
    • +

      The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

      +
    • +
    +
    +
  6. +
  7. +

    The Populator Controller service creates a populator pod.

    +
  8. +
  9. +

    The populator pod transfers the disk data to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The temporary PVC is deleted, and the initial PVC points to the PV with the data.

    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from VMWare to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a blank persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
+
+
+

For all VM disks:

+
+
+
    +
  1. +

    The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

    +
  2. +
  3. +

    The Migration Controller service creates a conversion pod for all PVCs.

    +
  4. +
  5. +

    The conversion pod runs virt-v2v, which converts the VM to the KVM hypervisor and transfers the disks' data to their corresponding PVs.

    +
    +

    After the VM disks are transferred:

    +
    +
  6. +
  7. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  8. +
  9. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  10. +
+
+ + +
+ + diff --git a/documentation/modules/vmware-prerequisites/index.html b/documentation/modules/vmware-prerequisites/index.html new file mode 100644 index 00000000000..328b58ea566 --- /dev/null +++ b/documentation/modules/vmware-prerequisites/index.html @@ -0,0 +1,278 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

VMware prerequisites

+
+

It is strongly recommended to create a VDDK image to accelerate migrations. For more information, see Creating a VDDK image.

+
+
+

The following prerequisites apply to VMware migrations:

+
+
+
    +
  • +

    You must use a compatible version of VMware vSphere.

    +
  • +
  • +

    You must be logged in as a user with at least the minimal set of VMware privileges.

    +
  • +
  • +

    To access the virtual machine using a pre-migration hook, VMware Tools must be installed on the source virtual machine.

    +
  • +
  • +

    The VM operating system must be certified and supported for use as a guest operating system with KubeVirt and for conversion to KVM with virt-v2v.

    +
  • +
  • +

    If you are running a warm migration, you must enable changed block tracking (CBT) on the VMs and on the VM disks.

    +
  • +
  • +

    If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host.

    +
  • +
  • +

    It is strongly recommended to disable hibernation because Forklift does not support migrating hibernated VMs.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

In the event of a power outage, data might be lost for a VM with disabled hibernation. However, if hibernation is not disabled, migration will fail

+
+
+
+
+ + + + + +
+
Note
+
+
+

Neither Forklift nor OpenShift Virtualization support conversion of Btrfs for migrating VMs from VMWare.

+
+
+
+

VMware privileges

+
+

The following minimal set of VMware privileges is required to migrate virtual machines to KubeVirt with the Forklift.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. VMware privileges
PrivilegeDescription

Virtual machine.Interaction privileges:

Virtual machine.Interaction.Power Off

Allows powering off a powered-on virtual machine. This operation powers down the guest operating system.

Virtual machine.Interaction.Power On

Allows powering on a powered-off virtual machine and resuming a suspended virtual machine.

Virtual machine.Guest operating system management by VIX API

Allows managing a virtual machine by the VMware VIX API.

+

Virtual machine.Provisioning privileges:

+
+
+ + + + + +
+
Note
+
+
+

All Virtual machine.Provisioning privileges are required.

+
+
+

Virtual machine.Provisioning.Allow disk access

Allows opening a disk on a virtual machine for random read and write access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow file access

Allows operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow read-only disk access

Allows opening a disk on a virtual machine for random read access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow virtual machine download

Allows read operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow virtual machine files upload

Allows write operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Clone template

Allows cloning of a template.

Virtual machine.Provisioning.Clone virtual machine

Allows cloning of an existing virtual machine and allocation of resources.

Virtual machine.Provisioning.Create template from virtual machine

Allows creation of a new template from a virtual machine.

Virtual machine.Provisioning.Customize guest

Allows customization of a virtual machine’s guest operating system without moving the virtual machine.

Virtual machine.Provisioning.Deploy template

Allows deployment of a virtual machine from a template.

Virtual machine.Provisioning.Mark as template

Allows marking an existing powered-off virtual machine as a template.

Virtual machine.Provisioning.Mark as virtual machine

Allows marking an existing template as a virtual machine.

Virtual machine.Provisioning.Modify customization specification

Allows creation, modification, or deletion of customization specifications.

Virtual machine.Provisioning.Promote disks

Allows promote operations on a virtual machine’s disks.

Virtual machine.Provisioning.Read customization specifications

Allows reading a customization specification.

Virtual machine.Snapshot management privileges:

Virtual machine.Snapshot management.Create snapshot

Allows creation of a snapshot from the virtual machine’s current state.

Virtual machine.Snapshot management.Remove Snapshot

Allows removal of a snapshot from the snapshot history.

Datastore privileges:

Datastore.Browse datastore

Allows exploring the contents of a datastore.

Datastore.Low level file operations

Allows performing low-level file operations - read, write, delete, and rename - in a datastore.

Sessions privileges:

Sessions.Validate session

Allows verification of the validity of a session.

Cryptographic privileges:

Cryptographic.Decrypt

Allows decryption of an encrypted virtual machine.

Cryptographic.Direct access

Allows access to encrypted resources.

+ + +
+ + diff --git a/feed.xml b/feed.xml new file mode 100644 index 00000000000..3f8bbe47963 --- /dev/null +++ b/feed.xml @@ -0,0 +1 @@ +Jekyll2024-11-11T18:43:42-06:00/feed.xmlForklift DocumentationMigrating VMware virtual machines to KubeVirt \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000000..8199f3bbf27 --- /dev/null +++ b/index.html @@ -0,0 +1,89 @@ + + + + + + + + Forklift Documentation | Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift Documentation

+
+

What is Forklift?

+
+
+

Forklift is a tool in the Konveyor community for migrating virtual machines from VMware or oVirt to KubeVirt.

+
+
+
+
+

Documentation

+ +
+ + +
+ + diff --git a/jekyll-theme-cayman.gemspec b/jekyll-theme-cayman.gemspec new file mode 100644 index 00000000000..4a1c2d28f03 --- /dev/null +++ b/jekyll-theme-cayman.gemspec @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +Gem::Specification.new do |s| + s.name = 'jekyll-theme-cayman' + s.version = '0.1.1' + s.license = 'CC0-1.0' + s.authors = ['Jason Long', 'GitHub, Inc.'] + s.email = ['opensource+jekyll-theme-cayman@github.com'] + s.homepage = 'https://github.com/pages-themes/cayman' + s.summary = 'Cayman is a Jekyll theme for GitHub Pages' + + s.files = `git ls-files -z`.split("\x0").select do |f| + f.match(%r{^((_includes|_layouts|_sass|assets)/|(LICENSE|README)((\.(txt|md|markdown)|$)))}i) + end + + s.platform = Gem::Platform::RUBY + s.add_runtime_dependency 'jekyll', '> 3.5', '< 5.0' + s.add_runtime_dependency 'jekyll-seo-tag', '~> 2.0' + s.add_development_dependency 'html-proofer', '~> 3.0' + s.add_development_dependency 'rubocop', '~> 0.50' + s.add_development_dependency 'w3c_validators', '~> 1.3' +end diff --git a/modules/about-cold-warm-migration/index.html b/modules/about-cold-warm-migration/index.html new file mode 100644 index 00000000000..bd619b918d1 --- /dev/null +++ b/modules/about-cold-warm-migration/index.html @@ -0,0 +1,255 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About cold and warm migration

+
+
+
+

Forklift supports cold migration from:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

Forklift supports warm migration from VMware vSphere and from oVirt.

+
+
+
+
+

Cold migration

+
+
+

Cold migration is the default migration type. The source virtual machines are shut down while the data is copied.

+
+
+ + + + + +
+
Note
+
+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_qemu-guest-agent.adoc[]

+
+
+
+
+
+
+

Warm migration

+
+
+

Most of the data is copied during the precopy stage while the source virtual machines (VMs) are running.

+
+
+

Then the VMs are shut down and the remaining data is copied during the cutover stage.

+
+
+
Precopy stage
+

The VMs are not shut down during the precopy stage.

+
+
+

The VM disks are copied incrementally by using changed block tracking (CBT) snapshots. The snapshots are created at one-hour intervals by default. You can change the snapshot interval by updating the forklift-controller deployment.

+
+
+ + + + + +
+
Important
+
+
+

You must enable CBT for each source VM and each VM disk.

+
+
+

A VM can support up to 28 CBT snapshots. If the source VM has too many CBT snapshots and the Migration Controller service is not able to create a new snapshot, warm migration might fail. The Migration Controller service deletes each snapshot when the snapshot is no longer required.

+
+
+
+
+

The precopy stage runs until the cutover stage is started manually or is scheduled to start.

+
+
+
Cutover stage
+

The VMs are shut down during the cutover stage and the remaining data is migrated. Data stored in RAM is not migrated.

+
+
+

You can start the cutover stage manually by using the Forklift console or you can schedule a cutover time in the Migration manifest.

+
+
+
+
+

Advantages and disadvantages of cold and warm migrations

+
+
+

Overview

+
+

Unresolved directive in about-cold-warm-migration.adoc - include::snip_cold-warm-comparison-table.adoc[]

+
+
+
+

Detailed description

+
+

The table that follows offers a more detailed description of the advantages and disadvantages of each type of migration. It assumes that you have installed Red Hat Enterprise Linux (RHEL) 9 on the OKD platform on which you installed Forklift.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Detailed description of advantages and disadvantages
Cold migrationWarm migration

Fail fast

Each VM is converted to be compatible with OKD and, if the conversion is successful, the VM is transferred. If a VM cannot be converted, the migration fails immediately.

For each VM, Forklift creates a snapshot and transfers it to OKD. When you start the cutover, Forklift creates the last snapshot, transfers it, and then converts the VM.

Tools

Forklift only.

Forklift and CDI from KubeVirt.

Parallelism

Disks must be transferred sequentially.

Disks can be transferred in parallel using different pods.

+
+ + + + + +
+
Note
+
+
+

The preceding table describes the situation for VMs that are running because the main benefit of warm migration is the reduced downtime, and there is no reason to initiate warm migration for VMs that are down. However, performing warm migration for VMs that are down is not the same as cold migration, even when Forklift uses virt-v2v and RHEL 9. For VMs that are down, Forklift transfers the disks using CDI, unlike in cold migration.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When importing from VMware, there are additional factors which impact the migration speed such as limits related to ESXi, vSphere. or VDDK.

+
+
+
+
+
+

Conclusions

+
+

Based on the preceding information, we can draw the following conclusions about cold migration vs. warm migration:

+
+
+
    +
  • +

    The shortest downtime of VMs can be achieved by using warm migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data on a single disk can be achieved by using cold migration.

    +
  • +
  • +

    The shortest duration for VMs with a large amount of data that is spread evenly across multiple disks can be achieved by using warm migration.

    +
  • +
+
+
+
+
+ + +
+ + diff --git a/modules/about-hook-crs-for-migration-plans-api/index.html b/modules/about-hook-crs-for-migration-plans-api/index.html new file mode 100644 index 00000000000..1813e29d382 --- /dev/null +++ b/modules/about-hook-crs-for-migration-plans-api/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

API-based hooks for Forklift migration plans

+
+

You can add hooks to a migration plan from the command line by using the Forklift API.

+
+

Default hook image

+
+

The default hook image for an Forklift hook is registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2. The image is based on the Ansible Runner image with the addition of python-openshift to provide Ansible Kubernetes resources and a recent oc binary.

+
+

Hook execution

+
+

An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a ConfigMap. The hook container is run as a job on the desired cluster, using the default ServiceAccount in the konveyor-forklift namespace.

+
+

PreHooks and PostHooks

+
+

You specify hooks per VM and you can run each as a PreHook or a PostHook. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration.

+
+
+

When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook.

+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+
+
Example PreHook:
+
+
kind: Plan
+apiVersion: forklift.konveyor.io/v1beta1
+metadata:
+  name: test
+  namespace: konveyor-forklift
+spec:
+  vms:
+    - id: vm-2861
+      hooks:
+        - hook:
+            namespace: konveyor-forklift
+            name: playbook
+          step: PreHook
+
+
+ + +
+ + diff --git a/modules/about-rego-files/index.html b/modules/about-rego-files/index.html new file mode 100644 index 00000000000..9f6ea040837 --- /dev/null +++ b/modules/about-rego-files/index.html @@ -0,0 +1,104 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

About Rego files

+
+

Validation rules are written in Rego, the Open Policy Agent (OPA) native query language. The rules are stored as .rego files in the /usr/share/opa/policies/io/konveyor/forklift/<provider> directory of the Validation pod.

+
+
+

Each validation rule is defined in a separate .rego file and tests for a specific condition. If the condition evaluates as true, the rule adds a {“category”, “label”, “assessment”} hash to the concerns. The concerns content is added to the concerns key in the inventory record of the VM. The web console displays the content of the concerns key for each VM in the provider inventory.

+
+
+

The following .rego file example checks for distributed resource scheduling enabled in the cluster of a VMware VM:

+
+
+
drs_enabled.rego example
+
+
package io.konveyor.forklift.vmware (1)
+
+has_drs_enabled {
+    input.host.cluster.drsEnabled (2)
+}
+
+concerns[flag] {
+    has_drs_enabled
+    flag := {
+        "category": "Information",
+        "label": "VM running in a DRS-enabled cluster",
+        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
+    }
+}
+
+
+
+
    +
  1. +

    Each validation rule is defined within a package. The package namespaces are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

    +
  2. +
  3. +

    Query parameters are based on the input key of the Validation service JSON.

    +
  4. +
+
+ + +
+ + diff --git a/modules/accessing-default-validation-rules/index.html b/modules/accessing-default-validation-rules/index.html new file mode 100644 index 00000000000..56916501df3 --- /dev/null +++ b/modules/accessing-default-validation-rules/index.html @@ -0,0 +1,108 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Checking the default validation rules

+
+

Before you create a custom rule, you must check the default rules of the Validation service to ensure that you do not create a rule that redefines an existing default value.

+
+
+

Example: If a default rule contains the line default valid_input = false and you create a custom rule that contains the line default valid_input = true, the Validation service will not start.

+
+
+
Procedure
+
    +
  1. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  2. +
  3. +

    Go to the OPA policies directory for your provider:

    +
    +
    +
    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> (1)
    +
    +
    +
    +
      +
    1. +

      Specify vmware or ovirt.

      +
    2. +
    +
    +
  4. +
  5. +

    Search for the default policies:

    +
    +
    +
    $ grep -R "default" *
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/accessing-logs-cli/index.html b/modules/accessing-logs-cli/index.html new file mode 100644 index 00000000000..d85be3b34bd --- /dev/null +++ b/modules/accessing-logs-cli/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Accessing logs and custom resource information from the command line interface

+
+

You can access logs and information about custom resources (CRs) from the command line interface by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, a completed, failed, or canceled migration plan, or a migrated virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ kubectl adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_name> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        You must specify the VM name, not the VM ID, as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/accessing-logs-ui/index.html b/modules/accessing-logs-ui/index.html new file mode 100644 index 00000000000..6befe678c69 --- /dev/null +++ b/modules/accessing-logs-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Downloading logs and custom resource information from the web console

+
+

You can download logs and information about custom resources (CRs) for a completed, failed, or canceled migration plan or for migrated virtual machines (VMs) by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Get logs beside a migration plan name.

    +
  4. +
  5. +

    In the Get logs window, click Get logs.

    +
    +

    The logs are collected. A Log collection complete message is displayed.

    +
    +
  6. +
  7. +

    Click Download logs to download the archive file.

    +
  8. +
  9. +

    To download logs for a migrated VM, click a migration plan name and then click Get logs beside the VM.

    +
  10. +
+
+ + +
+ + diff --git a/modules/adding-hook-crs-to-migration-plans-api/index.html b/modules/adding-hook-crs-to-migration-plans-api/index.html new file mode 100644 index 00000000000..9ddf9331e8e --- /dev/null +++ b/modules/adding-hook-crs-to-migration-plans-api/index.html @@ -0,0 +1,302 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding Hook CRs to a VM migration by using the Forklift API

+
+

You can add a PreHook or a PostHook Hook CR when you migrate a virtual machine from the command line by using the Forklift API. A PreHook runs before a migration, a PostHook, after.

+
+
+ + + + + +
+
Note
+
+
+

You can retrieve additional information stored in a secret or in a configMap by using a k8s module.

+
+
+
+
+

For example, you can create a hook CR to install cloud-init on a VM and write a file before migration.

+
+
+
Procedure
+
    +
  1. +

    If needed, create a secret with an SSH private key for the VM. You can either use an existing key or generate a key pair, install the public key on the VM, and base64 encode the private key in the secret.

    +
    +
    +
    apiVersion: v1
    +data:
    +  key: VGhpcyB3YXMgZ2VuZXJhdGVkIHdpdGggc3NoLWtleWdlbiBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZS4KSXQgaXMgbm90IHVzZWQgYW55d2hlcmUuCi0tLS0tQkVHSU4gT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCmIzQmxibk56YUMxclpYa3RkakVBQUFBQUJHNXZibVVBQUFBRWJtOXVaUUFBQUFBQUFBQUJBQUFCbHdBQUFBZHpjMmd0Y24KTmhBQUFBQXdFQUFRQUFBWUVBMzVTTFRReDBFVjdPTWJQR0FqcEsxK2JhQURTTVFuK1NBU2pyTGZLNWM5NGpHdzhDbnA4LwovRHErZHFBR1pxQkg2ZnAxYmVJM1BZZzVWVDk0RVdWQ2RrTjgwY3dEcEo0Z1R0NHFUQ1gzZUYvY2x5VXQyUC9zaTNjcnQ0CjBQdi9wVnZXU1U2TlhHaDJIZC93V0MwcGh5Z0RQOVc5SHRQSUF0OFpnZmV2ZnUwZHpraVl6OHNVaElWU2ZsRGpaNUFqcUcKUjV2TVVUaGlrczEvZVlCeTdiMkFFSEdzYU8xN3NFbWNiYUlHUHZuUFVwWmQrdjkyYU1JdWZoYjhLZkFSbzZ3Ty9ISW1VbQovdDdHWFBJUmxBMUhSV0p1U05odTQzZS9DY3ZYd3Z6RnZrdE9kYXlEQzBMTklHMkpVaURlNWd0UUQ1WHZXc1p3MHQvbEs1CklacjFrZXZRNUJsYWNISmViV1ZNYUQvdllpdFdhSFo4OEF1Y0czaGh2bjkrOGNSTGhNVExiVlFSMWh2UVpBL1JtQXN3eE0KT3VJSmRaUmtxTThLZlF4Z28zQThRNGJhQW1VbnpvM3Zwa0FWdC9uaGtIOTRaRE5rV2U2RlRhdThONStyYTJCZkdjZVA4VApvbjFEeTBLRlpaUlpCREVVRVc0eHdTYUVOYXQ3c2RDNnhpL1d5OURaQUFBRm1NRFBXeDdBejFzZUFBQUFCM056YUMxeWMyCkVBQUFHQkFOK1VpMDBNZEJGZXpqR3p4Z0k2U3RmbTJnQTBqRUova2dFbzZ5M3l1WFBlSXhzUEFwNmZQL3c2dm5hZ0JtYWcKUituNmRXM2lOejJJT1ZVL2VCRmxRblpEZk5ITUE2U2VJRTdlS2t3bDkzaGYzSmNsTGRqLzdJdDNLN2VORDcvNlZiMWtsTwpqVnhvZGgzZjhGZ3RLWWNvQXovVnZSN1R5QUxmR1lIM3IzN3RIYzVJbU0vTEZJU0ZVbjVRNDJlUUk2aGtlYnpGRTRZcExOCmYzbUFjdTI5Z0JCeHJHanRlN0JKbkcyaUJqNzV6MUtXWGZyL2RtakNMbjRXL0Nud0VhT3NEdnh5SmxKdjdleGx6eUVaUU4KUjBWaWJrallidU4zdnduTDE4TDh4YjVMVG5Xc2d3dEN6U0J0aVZJZzN1WUxVQStWNzFyR2NOTGY1U3VTR2E5WkhyME9RWgpXbkJ5WG0xbFRHZy83MklyVm1oMmZQQUxuQnQ0WWI1L2Z2SEVTNFRFeTIxVUVkWWIwR1FQMFpnTE1NVERyaUNYV1VaS2pQCkNuME1ZS053UEVPRzJnSmxKODZONzZaQUZiZjU0WkIvZUdRelpGbnVoVTJydkRlZnEydGdYeG5Iai9FNko5UTh0Q2hXV1UKV1FReEZCRnVNY0VtaERXcmU3SFF1c1l2MXN2UTJRQUFBQU1CQUFFQUFBR0JBSlZtZklNNjdDQmpXcU9KdnFua2EvakRrUwo4TDdpSE5mekg1TnRZWVdPWmRMTlk2L0lRa1pDeFcwTWtSKzlUK0M3QUZKZzBNV2Q5ck5PeUxJZDkxNjZoOVJsNG0xdFJjCnViZ1o2dWZCZ3hGVDlXS21mSEdCNm4zelh5b2pQOEFJTnR6ODVpaUVHVXFFRWtVRVdMd0RGSmdvcFllQ3l1VmZ2ZE92MUgKRm1WWmEwNVo0b3NQNkNENXVmc2djQ1RYQTR6VnZ5ZHVCYkxqdHN5RjdYZjNUdjZUQ1QxU0swZHErQk1OOXRvb0RZaXpwagpzbDh6NzlybXp3eUFyWFlVcnFUUkpsNmpwRkNrWHJLcy9LeG96MHhhbXlMY2RORk9hWE51LzlnTkpjRERsV2hPcFRqNHk4CkpkNXBuV1Jueis1RHJLRFdhY0loUW1CMUxVd2ZLWmQwbVFxaUpzMUMxcXZVUmlKOGExaThKUTI4bHFuWTFRRk9wbk13emcKWEpla2FndThpT1ExRFJlQkhaM0NkcVJUYnY3bVJZSGxramx0dXJmZGc4M3hvM0ErZ1JSR001eUVOcW5xSkplQjhJQVB5UwptMFp0dGdqbHNqNTJ2K1B1NmExMHoxZndKK1VML2N6dTRKeEpOYlp6WTFIMnpLODJBaVI1T3JYNmx2aUEvSWFSRVcwUUFBCkFNQndVeUJpcUc5bEZCUnltL2UvU1VORVMzdHpicUZNdTdIcy84WTV5SnAxKzR6OXUxNGtJR2ttV0Y5eE5HT3hrY3V0cWwKeHVUcndMbjFUaFNQTHQrTjUwTGhVdzR4ZjBhNUxqemdPbklPU0FRbm5HY1Nxa0dTRDlMR21obGE2WmpydFBHY29lQ3JHdAo5M1Vvcmx5YkxNRzFFRFAxWmpKS1RaZzl6OUMwdDlTTGd3ei9DbFhydW9UNXNQVUdKWnUrbHlIZXpSTDRtcHl6OEZMcnlOCkdNci9leVM5bWdISjNVVkZEYjNIZ3BaK1E1SUdBRU5rZVZEcHIwMGhCZXZndGd6YWtBQUFEQkFQVXQ1RitoMnBVby94V1YKenRkcVQvMzA4dFB5MXVMMU1lWFoydEJPQmRwSDJyd0JzdWt0aTIySGtWZUZXQjJFdUlFUXppMzY3MGc1UGdxR1p4Vng4dQpobEE0Rkg4ZXN1NTNQckZqVW9EeFJhb3d3WXBFcFh5Y2pnNUE1MStwR1VQcWljWjB0YjliaWlhc3BWWXZhWW5sdGlnVG5iClN0UExMY29nemNiL0dGcVYyaXlzc3lwTlMwKzBNRTUxcEtxWGNaS2swbi8vVHpZWWs4TW8vZzRsQ3pmUEZQUlZrVVM5blIKWU1pQzRlcEk0TERmbVdnM0xLQ2N1Zk85all3aWgwYlFBQUFNRUE2WEtldDhEMHNvc0puZVh5WFZGd0dyVyszNlhBVGRQTwpMWDdjaStjYzFoOGV1eHdYQWx3aTJJNFhxSmJBVjBsVEhuVGEycXN3Uy9RQlpJUUJWSkZlVjVyS1daZTc4R2F3d1pWTFZNCldETmNwdFFyRTFaM2pGNS9TdUVzdlVxSDE0Tkc5RUFXWG1iUkNzelE0Vlk3NzQrSi9sTFkvMnlDT1diNzlLYTJ5OGxvYUoKVXczWWVtSld3blp2R3hKNldsL3BmQ2xYN3lEVXlXUktLdGl0cWNjbmpCWVkyRE1tZURwdURDYy9ZdDZDc3dLRmRkMkJ1UwpGZGt5cDlZY3VMaDlLZEFBQUFIR3BoYzI5dVFFRlVMVGd3TWxVdWJXOXVkR3hsYjI0dWFXNTBjbUVCQWdNRUJRWT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCgo=
    +kind: Secret
    +metadata:
    +  name: ssh-credentials
    +  namespace: konveyor-forklift
    +type: Opaque
    +
    +
    +
  2. +
  3. +

    Encode your playbook by conncatenating a file and piping it for base64, for example:

    +
    +
    +
    $ cat playbook.yml | base64 -w0
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can also use a here document to encode a playbook:

    +
    +
    +
    +
    $ cat << EOF | base64 -w0
    +- hosts: localhost
    +  tasks:
    +  - debug:
    +      msg: test
    +EOF
    +
    +
    +
    +
    +
  4. +
  5. +

    Create a Hook CR:

    +
    +
    +
    apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: playbook
    +  namespace: konveyor-forklift
    +spec:
    +  image: registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2
    +  playbook: LSBuYW1lOiBNYWluCiAgaG9zdHM6IGxvY2FsaG9zdAogIHRhc2tzOgogIC0gbmFtZTogTG9hZCBQbGFuCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHBsYW4ueW1sCiAgICAgIG5hbWU6IHBsYW4KCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3ZhcnM6CiAgICAgIGZpbGU6IHdvcmtsb2FkLnltbAogICAgICBuYW1lOiB3b3JrbG9hZAoKICAtIG5hbWU6IAogICAgZ2V0ZW50OgogICAgICBkYXRhYmFzZTogcGFzc3dkCiAgICAgIGtleTogInt7IGFuc2libGVfdXNlcl9pZCB9fSIKICAgICAgc3BsaXQ6ICc6JwoKICAtIG5hbWU6IEVuc3VyZSBTU0ggZGlyZWN0b3J5IGV4aXN0cwogICAgZmlsZToKICAgICAgcGF0aDogfi8uc3NoCiAgICAgIHN0YXRlOiBkaXJlY3RvcnkKICAgICAgbW9kZTogMDc1MAogICAgZW52aXJvbm1lbnQ6CiAgICAgIEhPTUU6ICJ7eyBhbnNpYmxlX2ZhY3RzLmdldGVudF9wYXNzd2RbYW5zaWJsZV91c2VyX2lkXVs0XSB9fSIKCiAgLSBrOHNfaW5mbzoKICAgICAgYXBpX3ZlcnNpb246IHYxCiAgICAgIGtpbmQ6IFNlY3JldAogICAgICBuYW1lOiBzc2gtY3JlZGVudGlhbHMKICAgICAgbmFtZXNwYWNlOiBrb252ZXlvci1mb3JrbGlmdAogICAgcmVnaXN0ZXI6IHNzaF9jcmVkZW50aWFscwoKICAtIG5hbWU6IENyZWF0ZSBTU0gga2V5CiAgICBjb3B5OgogICAgICBkZXN0OiB+Ly5zc2gvaWRfcnNhCiAgICAgIGNvbnRlbnQ6ICJ7eyBzc2hfY3JlZGVudGlhbHMucmVzb3VyY2VzWzBdLmRhdGEua2V5IHwgYjY0ZGVjb2RlIH19IgogICAgICBtb2RlOiAwNjAwCgogIC0gYWRkX2hvc3Q6CiAgICAgIG5hbWU6ICJ7eyB3b3JrbG9hZC52bS5pcGFkZHJlc3MgfX0iCiAgICAgIGFuc2libGVfdXNlcjogcm9vdAogICAgICBncm91cHM6IHZtcwoKLSBob3N0czogdm1zCiAgdGFza3M6CiAgLSBuYW1lOiBJbnN0YWxsIGNsb3VkLWluaXQKICAgIGRuZjoKICAgICAgbmFtZToKICAgICAgLSBjbG91ZC1pbml0CiAgICAgIHN0YXRlOiBsYXRlc3QKCiAgLSBuYW1lOiBDcmVhdGUgVGVzdCBGaWxlCiAgICBjb3B5OgogICAgICBkZXN0OiAvdGVzdC50eHQKICAgICAgY29udGVudDogIkhlbGxvIFdvcmxkIgogICAgICBtb2RlOiAwNjQ0Cg==
    +  serviceAccount: forklift-controller (1)
    +
    +
    +
    +
      +
    1. +

      Specify a serviceAccount to run the hook with in order to control access to resources on the cluster.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      To decode an attached playbook retrieve the resource with custom output and pipe it to base64. For example:

      +
      +
      +
      +
       oc get -n konveyor-forklift hook playbook -o \
      +   go-template='{{ .spec.playbook }}' | base64 -d
      +
      +
      +
      +
      +
      +

      The playbook encoded here runs the following:

      +
      +
      +
      +
      - name: Main
      +  hosts: localhost
      +  tasks:
      +  - name: Load Plan
      +    include_vars:
      +      file: plan.yml
      +      name: plan
      +
      +  - name: Load Workload
      +    include_vars:
      +      file: workload.yml
      +      name: workload
      +
      +  - name:
      +    getent:
      +      database: passwd
      +      key: "{{ ansible_user_id }}"
      +      split: ':'
      +
      +  - name: Ensure SSH directory exists
      +    file:
      +      path: ~/.ssh
      +      state: directory
      +      mode: 0750
      +    environment:
      +      HOME: "{{ ansible_facts.getent_passwd[ansible_user_id][4] }}"
      +
      +  - k8s_info:
      +      api_version: v1
      +      kind: Secret
      +      name: ssh-credentials
      +      namespace: konveyor-forklift
      +    register: ssh_credentials
      +
      +  - name: Create SSH key
      +    copy:
      +      dest: ~/.ssh/id_rsa
      +      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      +      mode: 0600
      +
      +  - add_host:
      +      name: "{{ workload.vm.ipaddress }}"
      +      ansible_user: root
      +      groups: vms
      +
      +- hosts: vms
      +  tasks:
      +  - name: Install cloud-init
      +    dnf:
      +      name:
      +      - cloud-init
      +      state: latest
      +
      +  - name: Create Test File
      +    copy:
      +      dest: /test.txt
      +      content: "Hello World"
      +      mode: 0644
      +
      +
      +
    2. +
    +
    +
  6. +
  7. +

    Create a Plan CR using the hook:

    +
    +
    +
    kind: Plan
    +apiVersion: forklift.konveyor.io/v1beta1
    +metadata:
    +  name: test
    +  namespace: konveyor-forklift
    +spec:
    +  map:
    +    network:
    +      namespace: "konveyor-forklift"
    +      name: "network"
    +    storage:
    +      namespace: "konveyor-forklift"
    +      name: "storage"
    +  provider:
    +    source:
    +      namespace: "konveyor-forklift"
    +      name: "boston"
    +    destination:
    +      namespace: "konveyor-forklift"
    +      name: host
    +  targetNamespace: "konveyor-forklift"
    +  vms:
    +    - id: vm-2861
    +      hooks:
    +        - hook:
    +            namespace: konveyor-forklift
    +            name: playbook
    +          step: PreHook (1)
    +
    +
    +
    +
      +
    1. +

      Options are PreHook, to run the hook before the migration, and PostHook, to run the hook after the migration.

      +
    2. +
    +
    +
  8. +
+
+
+ + + + + +
+
Important
+
+
+

In order for a PreHook to run on a VM, the VM must be started and available via SSH.

+
+
+
+ + +
+ + diff --git a/modules/adding-source-provider/index.html b/modules/adding-source-provider/index.html new file mode 100644 index 00000000000..1912c1c05fd --- /dev/null +++ b/modules/adding-source-provider/index.html @@ -0,0 +1,82 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Click Create provider to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/adding-virt-provider/index.html b/modules/adding-virt-provider/index.html new file mode 100644 index 00000000000..d5a27b3623e --- /dev/null +++ b/modules/adding-virt-provider/index.html @@ -0,0 +1,116 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding a KubeVirt destination provider

+
+

You can add a KubeVirt destination provider to the OKD web console in addition to the default KubeVirt destination provider, which is the provider where you installed Forklift.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select KubeVirt from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Specify the provider name to display in the list of target providers.

      +
    • +
    • +

      Kubernetes API server URL: Specify the OKD cluster API endpoint.

      +
    • +
    • +

      Service account token: Specify the cluster-admin service account token.

      +
      +

      If both URL and Service account token are left blank, the local OKD cluster is used.

      +
      +
    • +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+ + +
+ + diff --git a/modules/canceling-migration-cli/index.html b/modules/canceling-migration-cli/index.html new file mode 100644 index 00000000000..220b1dc6618 --- /dev/null +++ b/modules/canceling-migration-cli/index.html @@ -0,0 +1,132 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel an entire migration or individual virtual machines (VMs) while a migration is in progress from the command line interface (CLI).

+
+
+
Canceling an entire migration
+
    +
  • +

    Delete the Migration CR:

    +
    +
    +
    $ kubectl delete migration <migration> -n <namespace> (1)
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    +
    +
  • +
+
+
+
Canceling the migration of individual VMs
+
    +
  1. +

    Add the individual VMs to the spec.cancel block of the Migration manifest:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration>
    +  namespace: <namespace>
    +...
    +spec:
    +  cancel:
    +  - id: vm-102 (1)
    +  - id: vm-203
    +  - name: rhel8-vm
    +EOF
    +
    +
    +
    +
      +
    1. +

      You can specify a VM by using the id key or the name key.

      +
      +

      The value of the id key is the managed object reference, for a VMware VM, or the VM UUID, for a oVirt VM.

      +
      +
    2. +
    +
    +
  2. +
  3. +

    Retrieve the Migration CR to monitor the progress of the remaining VMs:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  4. +
+
+ + +
+ + diff --git a/modules/canceling-migration-ui/index.html b/modules/canceling-migration-ui/index.html new file mode 100644 index 00000000000..6db2be7eb14 --- /dev/null +++ b/modules/canceling-migration-ui/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Canceling a migration

+
+

You can cancel the migration of some or all virtual machines (VMs) while a migration plan is in progress by using the OKD web console.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Plans for virtualization.

    +
  2. +
  3. +

    Click the name of a running migration plan to view the migration details.

    +
  4. +
  5. +

    Select one or more VMs and click Cancel.

    +
  6. +
  7. +

    Click Yes, cancel to confirm the cancellation.

    +
    +

    In the Migration details by VM list, the status of the canceled VMs is Canceled. The unmigrated and the migrated virtual machines are not affected.

    +
    +
  8. +
+
+
+

You can restart a canceled migration by clicking Restart beside the migration plan on the Migration plans page.

+
+ + +
+ + diff --git a/modules/changing-precopy-intervals/index.html b/modules/changing-precopy-intervals/index.html new file mode 100644 index 00000000000..14dc1d83dc2 --- /dev/null +++ b/modules/changing-precopy-intervals/index.html @@ -0,0 +1,92 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Changing precopy intervals for warm migration

+
+

You can change the snapshot interval by patching the ForkliftController custom resource (CR).

+
+
+
Procedure
+
    +
  • +

    Patch the ForkliftController CR:

    +
    +
    +
    $ kubectl patch forkliftcontroller/<forklift-controller> -n konveyor-forklift -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge (1)
    +
    +
    +
    +
      +
    1. +

      Specify the precopy interval in minutes. The default value is 60.

      +
      +

      You do not need to restart the forklift-controller pod.

      +
      +
    2. +
    +
    +
  • +
+
+ + +
+ + diff --git a/modules/collected-logs-cr-info/index.html b/modules/collected-logs-cr-info/index.html new file mode 100644 index 00000000000..ee1b7dd8df2 --- /dev/null +++ b/modules/collected-logs-cr-info/index.html @@ -0,0 +1,183 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Collected logs and custom resource information

+
+

You can download logs and custom resource (CR) yaml files for the following targets by using the OKD web console or the command line interface (CLI):

+
+
+
    +
  • +

    Migration plan: Web console or CLI.

    +
  • +
  • +

    Virtual machine: Web console or CLI.

    +
  • +
  • +

    Namespace: CLI only.

    +
  • +
+
+
+

The must-gather tool collects the following logs and CR files in an archive file:

+
+
+
    +
  • +

    CRs:

    +
    +
      +
    • +

      DataVolume CR: Represents a disk mounted on a migrated VM.

      +
    • +
    • +

      VirtualMachine CR: Represents a migrated VM.

      +
    • +
    • +

      Plan CR: Defines the VMs and storage and network mapping.

      +
    • +
    • +

      Job CR: Optional: Represents a pre-migration hook, a post-migration hook, or both.

      +
    • +
    +
    +
  • +
  • +

    Logs:

    +
    +
      +
    • +

      importer pod: Disk-to-data-volume conversion log. The importer pod naming convention is importer-<migration_plan>-<vm_id><5_char_id>, for example, importer-mig-plan-ed90dfc6-9a17-4a8btnfh, where ed90dfc6-9a17-4a8 is a truncated oVirt VM ID and btnfh is the generated 5-character ID.

      +
    • +
    • +

      conversion pod: VM conversion log. The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the VM. The conversion pod naming convention is <migration_plan>-<vm_id><5_char_id>.

      +
    • +
    • +

      virt-launcher pod: VM launcher log. When a migrated VM is powered on, the virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

      +
    • +
    • +

      forklift-controller pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      forklift-must-gather-api pod: The log is filtered for the migration plan, virtual machine, or namespace specified by the must-gather command.

      +
    • +
    • +

      hook-job pod: The log is filtered for hook jobs. The hook-job naming convention is <migration_plan>-<vm_id><5_char_id>, for example, plan2j-vm-3696-posthook-4mx85 or plan2j-vm-3696-prehook-mwqnl.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Empty or excluded log files are not included in the must-gather archive file.

      +
      +
      +
      +
    • +
    +
    +
  • +
+
+
+
Example must-gather archive structure for a VMware migration plan
+
+
must-gather
+└── namespaces
+    ├── target-vm-ns
+    │   ├── crs
+    │   │   ├── datavolume
+    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
+    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
+    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
+    │   │   └── virtualmachine
+    │   │       ├── test-test-rhel8-2disks2nics.yaml
+    │   │       └── test-x2019.yaml
+    │   └── logs
+    │       ├── importer-mig-plan-vm-7595-tkhdz
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-7595-5qvqp
+    │       │   └── current.log
+    │       ├── importer-mig-plan-vm-8325-xccfw
+    │       │   └── current.log
+    │       ├── mig-plan-vm-7595-4glzd
+    │       │   └── current.log
+    │       └── mig-plan-vm-8325-4zw49
+    │           └── current.log
+    └── openshift-mtv
+        ├── crs
+        │   └── plan
+        │       └── mig-plan-cold.yaml
+        └── logs
+            ├── forklift-controller-67656d574-w74md
+            │   └── current.log
+            └── forklift-must-gather-api-89fc7f4b6-hlwb6
+                └── current.log
+
+
+ + +
+ + diff --git a/modules/common-attributes/index.html b/modules/common-attributes/index.html new file mode 100644 index 00000000000..af293092aab --- /dev/null +++ b/modules/common-attributes/index.html @@ -0,0 +1,66 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + diff --git a/modules/compatibility-guidelines/index.html b/modules/compatibility-guidelines/index.html new file mode 100644 index 00000000000..d130390978b --- /dev/null +++ b/modules/compatibility-guidelines/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Software compatibility guidelines

+
+
+
+

You must install compatible software versions.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.3.0

4.10 or later

4.10 or later

6.5 or later

4.4 SP1 or later

16.1 or later

+
+ + + + + +
+
Note
+
+
Migration from oVirt 4.3
+
+

Forklift was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3. While not supported, basic migrations from oVirt 4.3 are expected to work.

+
+
+

Generally it is advised to upgrade oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+

Therefore, it is recommended to upgrade oVirt to the supported version above before the migration to KubeVirt.

+
+
+

However, migrations from oVirt 4.3.11 were tested with Forklift 2.3, and may work in practice in many environments using Forklift 2.3. In this case, we advise upgrading oVirt Manager (RHVM) to the previously mentioned supported version before the migration to KubeVirt.

+
+
+
+
+
+
+

OpenShift Operator Life Cycles

+
+
+

For more information about the software maintenance Life Cycle classifications for Operators shipped by Red Hat for use with OpenShift Container Platform, see OpenShift Operator Life Cycles.

+
+
+
+ + +
+ + diff --git a/modules/configuring-mtv-operator/index.html b/modules/configuring-mtv-operator/index.html new file mode 100644 index 00000000000..203778e3b0b --- /dev/null +++ b/modules/configuring-mtv-operator/index.html @@ -0,0 +1,202 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring the Forklift Operator

+
+

You can configure all of the following settings of the Forklift Operator by modifying the ForkliftController CR, or in the Settings section of the Overview page, unless otherwise indicated.

+
+
+
    +
  • +

    Maximum number of virtual machines (VMs) per plan that can be migrated simultaneously.

    +
  • +
  • +

    How long must gather reports are retained before being automatically deleted.

    +
  • +
  • +

    CPU limit allocated to the main controller container.

    +
  • +
  • +

    Memory limit allocated to the main controller container.

    +
  • +
  • +

    Interval at which a new snapshot is requested before initiating a warm migration.

    +
  • +
  • +

    Frequency with which the system checks the status of snapshot creation or removal during a warm migration.

    +
  • +
  • +

    Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem (ForkliftController CR only).

    +
  • +
  • +

    Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for vSphere source providers (ForkliftController CR only).

    +
  • +
  • +

    Configuration map of operating systems to preferences for oVirt (oVirt) source providers (ForkliftController CR only).

    +
  • +
+
+
+

The procedure for configuring these settings using the user interface is presented in Configuring MTV settings. The procedure for configuring these settings by modifying the ForkliftController CR is presented following.

+
+
+
Procedure
+
    +
  • +

    Change a parameter’s value in the spec portion of the ForkliftController CR by adding the label and value as follows:

    +
  • +
+
+
+
+
spec:
+  label: value (1)
+
+
+
+
    +
  1. +

    Labels you can configure using the CLI are shown in the table that follows, along with a description of each label and its default value.

    +
  2. +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift Operator labels
LabelDescriptionDefault value

controller_max_vm_inflight

The maximum number of VMs per plan that can be migrated simultaneously.

20

must_gather_api_cleanup_max_age

The duration in hours for retaining must gather reports before they are automatically deleted.

-1 (disabled)

controller_container_limits_cpu

The CPU limit allocated to the main controller container.

500m

controller_container_limits_memory

The memory limit allocated to the main controller container.

800Mi

controller_precopy_interval

The interval in minutes at which a new snapshot is requested before initiating a warm migration.

60

controller_snapshot_status_check_rate_seconds

The frequency in seconds with which the system checks the status of snapshot creation or removal during a warm migration.

10

controller_filesystem_overhead

Percentage of space in persistent volumes allocated as file system overhead when the storageclass is filesystem.

+

ForkliftController CR only.

10

controller_block_overhead

Fixed amount of additional space allocated in persistent block volumes. This setting is applicable for any storageclass that is block-based. It can be used when data, such as encryption headers, is written to the persistent volumes in addition to the content of the virtual disk.

+

ForkliftController CR only.

0

vsphere_osmap_configmap_name

Configuration map for vSphere source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-vsphere-osmap. In order to override or delete values, specify a configuration map that is different from forklift-vsphere-osmap.

+

ForkliftController CR only.

forklift-vsphere-osmap

ovirt_osmap_configmap_name

Configuration map for oVirt source providers. This configuration map maps the operating system of the incoming VM to a KubeVirt preference name. This configuration map needs to be in the namespace where the Forklift Operator is deployed.

+

To see the list of preferences in your KubeVirt environment, open the {ocp-name} web console and click VirtualizationPreferences.

+

You can add values to the configuration map when this label has the default value, forklift-ovirt-osmap. In order to override or delete values, specify a configuration map that is different from forklift-ovirt-osmap.

+

ForkliftController CR only.

forklift-ovirt-osmap

+ + +
+ + diff --git a/modules/creating-migration-plan-2-6-3/index.html b/modules/creating-migration-plan-2-6-3/index.html new file mode 100644 index 00000000000..97716d76c26 --- /dev/null +++ b/modules/creating-migration-plan-2-6-3/index.html @@ -0,0 +1,139 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +The Create migration plan pane opens. It displays the source provider’s name and suggestions for a target provider and namespace, a network map, and a storage map. +. Enter the Plan name. +. Make any needed changes to the editable items. +. Click Add mapping to edit a suggested network mapping or a storage mapping, or to add one or more additional mappings. +. Click Create migration plan.

+
+
+

+ +Forklift validates the migration plan and the Plan details page opens, indicating whether the plan is ready for use or contains an error. The details of the plan are listed, and you can edit the items you filled in on the previous page. If you make any changes, Forklift validates the plan again.

+
+
+
    +
  1. +

    VMware source providers only (All optional):

    +
    +
      +
    • +

      Preserving static IPs of VMs: By default, virtual network interface controllers (vNICs) change during the migration process. As a result, vNICs that are configured with a static IP linked to the interface name in the guest VM lose their IP. To avoid this, click the Edit icon next to Preserve static IPs and toggle the Whether to preserve the static IPs switch in the window that opens. Then click Save.

      +
      +

      Forklift then issues a warning message about any VMs for which vNIC properties are missing. To retrieve any missing vNIC properties, run those VMs in vSphere in order for the vNIC properties to be reported to Forklift.

      +
      +
    • +
    • +

      Entering a list of decryption passphrases for disks encrypted using Linux Unified Key Setup (LUKS): To enter a list of decryption passphrases for LUKS-encrypted devices, in the Settings section, click the Edit icon next to Disk decryption passphrases, enter the passphrases, and then click Save. You do not need to enter the passphrases in a specific order - for each LUKS-encrypted device, Forklift tries each passphrase until one unlocks the device.

      +
    • +
    • +

      Specifying a root device: Applies to multi-boot VM migrations only. By default, Forklift uses the first bootable device detected as the root device.

      +
      +

      To specify a different root device, in the Settings section, click the Edit icon next to Root device and choose a device from the list of commonly-used options, or enter a device in the text box.

      +
      +
      +

      Forklift uses the following format for disk location: /dev/sd<disk_identifier><disk_partition>. For example, if the second disk is the root device and the operating system is on the disk’s second partition, the format would be: /dev/sdb2. After you enter the boot device, click Save.

      +
      +
      +

      If the conversion fails because the boot device provided is incorrect, it is possible to get the correct information by looking at the conversion pod logs.

      +
      +
    • +
    +
    +
  2. +
  3. +

    oVirt source providers only (Optional):

    +
    +
      +
    • +

      Preserving the CPU model of VMs that are migrated from oVirt: Generally, the CPU model (type) for oVirt VMs is set at the cluster level, but it can be set at the VM level, which is called a custom CPU model. +By default, Forklift sets the CPU model on the destination cluster as follows: Forklift preserves custom CPU settings for VMs that have them, but, for VMs without custom CPU settings, Forklift does not set the CPU model. Instead, the CPU model is later set by KubeVirt.

      +
      +

      To preserve the cluster-level CPU model of your oVirt VMs, in the Settings section, click the Edit icon next to Preserve CPU model. Toggle the Whether to preserve the CPU model switch, and then click Save.

      +
      +
    • +
    +
    +
  4. +
  5. +

    If the plan is valid,

    +
    +
      +
    1. +

      You can run the plan now by clicking Start migration.

      +
    2. +
    3. +

      You can run the plan later by selecting it on the Plans for virtualization page and following the procedure in Running a migration plan.

      +
      +

      Unresolved directive in creating-migration-plan-2-6-3.adoc - include::snip_vmware-name-change.adoc[]

      +
      +
    4. +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/creating-migration-plan/index.html b/modules/creating-migration-plan/index.html new file mode 100644 index 00000000000..f221b27e303 --- /dev/null +++ b/modules/creating-migration-plan/index.html @@ -0,0 +1,270 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a migration plan

+
+

You can create a migration plan by using the OKD web console.

+
+
+

A migration plan allows you to group virtual machines to be migrated together or with the same migration parameters, for example, a percentage of the members of a cluster or a complete application.

+
+
+

You can configure a hook to run an Ansible playbook or custom container image during a specified stage of the migration plan.

+
+
+
Prerequisites
+
    +
  • +

    If Forklift is not installed on the target cluster, you must add a target provider on the Providers page of the web console.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
  2. +
  3. +

    Click Create plan.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Plan name: Enter a migration plan name to display in the migration plan list.

      +
    • +
    • +

      Plan description: Optional: Brief description of the migration plan.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    • +

      Target namespace: Do one of the following:

      +
      +
        +
      • +

        Select a target namespace from the list

        +
      • +
      • +

        Create a target namespace by typing its name in the text box, and then clicking create "<the_name_you_entered>"

        +
      • +
      +
      +
    • +
    • +

      You can change the migration transfer network for this plan by clicking Select a different network, selecting a network from the list, and then clicking Select.

      +
      +

      If you defined a migration transfer network for the KubeVirt provider and if the network is in the target namespace, the network that you defined is the default network for all migration plans. Otherwise, the pod network is used.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Click Next.

    +
  8. +
  9. +

    Select options to filter the list of source VMs and click Next.

    +
  10. +
  11. +

    Select the VMs to migrate and then click Next.

    +
  12. +
  13. +

    Select an existing network mapping or create a new network mapping.

    +
  14. +
  15. +

    . Optional: Click Add to add an additional network mapping.

    +
    +

    To create a new network mapping:

    +
    +
    +
      +
    • +

      Select a target network for each source network.

      +
    • +
    • +

      Optional: Select Save current mapping as a template and enter a name for the network mapping.

      +
    • +
    +
    +
  16. +
  17. +

    Click Next.

    +
  18. +
  19. +

    Select an existing storage mapping, which you can modify, or create a new storage mapping.

    +
    +

    To create a new storage mapping:

    +
    +
    +
      +
    1. +

      If your source provider is VMware, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    +
    +
  20. +
  21. +

    Optional: Select Save current mapping as a template and enter a name for the storage mapping.

    +
  22. +
  23. +

    Click Next.

    +
  24. +
  25. +

    Select a migration type and click Next.

    +
    +
      +
    • +

      Cold migration: The source VMs are stopped while the data is copied.

      +
    • +
    • +

      Warm migration: The source VMs run while the data is copied incrementally. Later, you will run the cutover, which stops the VMs and copies the remaining VM data and metadata.

      +
      + + + + + +
      +
      Note
      +
      +
      +

      Warm migration is supported only from vSphere and oVirt.

      +
      +
      +
      +
    • +
    +
    +
  26. +
  27. +

    Click Next.

    +
  28. +
  29. +

    Optional: You can create a migration hook to run an Ansible playbook before or after migration:

    +
    +
      +
    1. +

      Click Add hook.

      +
    2. +
    3. +

      Select the Step when the hook will be run: pre-migration or post-migration.

      +
    4. +
    5. +

      Select a Hook definition:

      +
      +
        +
      • +

        Ansible playbook: Browse to the Ansible playbook or paste it into the field.

        +
      • +
      • +

        Custom container image: If you do not want to use the default hook-runner image, enter the image path: <registry_path>/<image_name>:<tag>.

        +
        + + + + + +
        +
        Note
        +
        +
        +

        The registry must be accessible to your OKD cluster.

        +
        +
        +
        +
      • +
      +
      +
    6. +
    +
    +
  30. +
  31. +

    Click Next.

    +
  32. +
  33. +

    Review your migration plan and click Finish.

    +
    +

    The migration plan is saved on the Plans page.

    +
    +
    +

    You can click the {kebab} of the migration plan and select View details to verify the migration plan details.

    +
    +
  34. +
+
+ + +
+ + diff --git a/modules/creating-network-mapping/index.html b/modules/creating-network-mapping/index.html new file mode 100644 index 00000000000..4f972597667 --- /dev/null +++ b/modules/creating-network-mapping/index.html @@ -0,0 +1,122 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a network mapping

+
+

You can create one or more network mappings by using the OKD web console to map source networks to KubeVirt networks.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    If you map more than one source and target network, each additional KubeVirt network requires its own network attachment definition.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationNetworkMaps for virtualization.

    +
  2. +
  3. +

    Click Create NetworkMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the network mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    Select a Source network and a Target namespace/network.

    +
  8. +
  9. +

    Optional: Click Add to create additional network mappings or to map multiple source networks to a single target network.

    +
  10. +
  11. +

    If you create an additional network mapping, select the network attachment definition as the target network.

    +
  12. +
  13. +

    Click Create.

    +
    +

    The network mapping is displayed on the NetworkMaps screen.

    +
    +
  14. +
+
+ + +
+ + diff --git a/modules/creating-storage-mapping/index.html b/modules/creating-storage-mapping/index.html new file mode 100644 index 00000000000..2dbc3b3e042 --- /dev/null +++ b/modules/creating-storage-mapping/index.html @@ -0,0 +1,138 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a storage mapping

+
+

You can create a storage mapping by using the OKD web console to map source disk storages to KubeVirt storage classes.

+
+
+
Prerequisites
+
    +
  • +

    Source and target providers added to the OKD web console.

    +
  • +
  • +

    Local and shared persistent storage that support VM migration.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationStorageMaps for virtualization.

    +
  2. +
  3. +

    Click Create StorageMap.

    +
  4. +
  5. +

    Specify the following fields:

    +
    +
      +
    • +

      Name: Enter a name to display in the storage mappings list.

      +
    • +
    • +

      Source provider: Select a source provider.

      +
    • +
    • +

      Target provider: Select a target provider.

      +
    • +
    +
    +
  6. +
  7. +

    To create a storage mapping, click Add and map storage sources to target storage classes as follows:

    +
    +
      +
    1. +

      If your source provider is VMware vSphere, select a Source datastore and a Target storage class.

      +
    2. +
    3. +

      If your source provider is oVirt, select a Source storage domain and a Target storage class.

      +
    4. +
    5. +

      If your source provider is {osp}, select a Source volume type and a Target storage class.

      +
    6. +
    7. +

      If your source provider is a set of one or more OVA files, select a Source and a Target storage class for the dummy storage that applies to all virtual disks within the OVA files.

      +
    8. +
    9. +

      If your storage provider is KubeVirt. select a Source storage class and a Target storage class.

      +
    10. +
    11. +

      Optional: Click Add to create additional storage mappings, including mapping multiple storage sources to a single target storage class.

      +
    12. +
    +
    +
  8. +
  9. +

    Click Create.

    +
    +

    The mapping is displayed on the StorageMaps page.

    +
    +
  10. +
+
+ + +
+ + diff --git a/modules/creating-validation-rule/index.html b/modules/creating-validation-rule/index.html new file mode 100644 index 00000000000..60ff273645e --- /dev/null +++ b/modules/creating-validation-rule/index.html @@ -0,0 +1,238 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a validation rule

+
+

You create a validation rule by applying a config map custom resource (CR) containing the rule to the Validation service.

+
+
+ + + + + +
+
Important
+
+
+
    +
  • +

    If you create a rule with the same name as an existing rule, the Validation service performs an OR operation with the rules.

    +
  • +
  • +

    If you create a rule that contradicts a default rule, the Validation service will not start.

    +
  • +
+
+
+
+
+
Validation rule example
+

Validation rules are based on virtual machine (VM) attributes collected by the Provider Inventory service.

+
+
+

For example, the VMware API uses this path to check whether a VMware VM has NUMA node affinity configured: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"].

+
+
+

The Provider Inventory service simplifies this configuration and returns a testable attribute with a list value:

+
+
+
+
"numaNodeAffinity": [
+    "0",
+    "1"
+],
+
+
+
+

You create a Rego query, based on this attribute, and add it to the forklift-validation-config config map:

+
+
+
+
`count(input.numaNodeAffinity) != 0`
+
+
+
+
Procedure
+
    +
  1. +

    Create a config map CR according to the following example:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: <forklift-validation-config>
    +  namespace: konveyor-forklift
    +data:
    +  vmware_multiple_disks.rego: |-
    +    package <provider_package> (1)
    +
    +    has_multiple_disks { (2)
    +      count(input.disks) > 1
    +    }
    +
    +    concerns[flag] {
    +      has_multiple_disks (3)
    +        flag := {
    +          "category": "<Information>", (4)
    +          "label": "Multiple disks detected",
    +          "assessment": "Multiple disks detected on this VM."
    +        }
    +    }
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the provider package name. Allowed values are io.konveyor.forklift.vmware for VMware and io.konveyor.forklift.ovirt for oVirt.

      +
    2. +
    3. +

      Specify the concerns name and Rego query.

      +
    4. +
    5. +

      Specify the concerns name and flag parameter values.

      +
    6. +
    7. +

      Allowed values are Critical, Warning, and Information.

      +
    8. +
    +
    +
  2. +
  3. +

    Stop the Validation pod by scaling the forklift-controller deployment to 0:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=0 deployment/forklift-controller
    +
    +
    +
  4. +
  5. +

    Start the Validation pod by scaling the forklift-controller deployment to 1:

    +
    +
    +
    $ kubectl scale -n konveyor-forklift --replicas=1 deployment/forklift-controller
    +
    +
    +
  6. +
  7. +

    Check the Validation pod log to verify that the pod started:

    +
    +
    +
    $ kubectl logs -f <validation_pod>
    +
    +
    +
    +

    If the custom rule conflicts with a default rule, the Validation pod will not start.

    +
    +
  8. +
  9. +

    Remove the source provider:

    +
    +
    +
    $ kubectl delete provider <provider> -n konveyor-forklift
    +
    +
    +
  10. +
  11. +

    Add the source provider to apply the new rule:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Provider
    +metadata:
    +  name: <provider>
    +  namespace: konveyor-forklift
    +spec:
    +  type: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  secret:
    +    name: <secret> (3)
    +    namespace: konveyor-forklift
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ovirt, vsphere, and openstack.

      +
    2. +
    3. +

      Specify the API end point URL, for example, https://<vCenter_host>/sdk for vSphere, https://<engine_host>/ovirt-engine/api for oVirt, or https://<identity_service>/v3 for {osp}.

      +
    4. +
    5. +

      Specify the name of the provider Secret CR.

      +
    6. +
    +
    +
  12. +
+
+
+

You must update the rules version after creating a custom rule so that the Inventory service detects the changes and validates the VMs.

+
+ + +
+ + diff --git a/modules/creating-vddk-image/index.html b/modules/creating-vddk-image/index.html new file mode 100644 index 00000000000..805a4ae9d0d --- /dev/null +++ b/modules/creating-vddk-image/index.html @@ -0,0 +1,201 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift can use the VMware Virtual Disk Development Kit (VDDK) SDK to accelerate transferring virtual disks from VMware vSphere.

+
+
+ + + + + +
+
Note
+
+
+

Creating a VDDK image, although optional, is highly recommended.

+
+
+
+
+

To make use of this feature, you download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry.

+
+
+

The VDDK package contains symbolic links, therefore, the procedure of creating a VDDK image must be performed on a file system that preserves symbolic links (symlinks).

+
+
+ + + + + +
+
Note
+
+
+

Storing the VDDK image in a public registry might violate the VMware license terms.

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    You are working on a file system that preserves symbolic links (symlinks).

    +
  • +
  • +

    If you are using an external registry, KubeVirt must be able to access it.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create and navigate to a temporary directory:

    +
    +
    +
    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
    +
    +
    +
  2. +
  3. +

    In a browser, navigate to the VMware VDDK version 8 download page.

    +
  4. +
  5. +

    Select version 8.0.1 and click Download.

    +
  6. +
+
+
+ + + + + +
+
Note
+
+
+

In order to migrate to KubeVirt 4.12, download VDDK version 7.0.3.2 from the VMware VDDK version 7 download page.

+
+
+
+
+
    +
  1. +

    Save the VDDK archive file in the temporary directory.

    +
  2. +
  3. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  4. +
  5. +

    Create a Dockerfile:

    +
    +
    +
    $ cat > Dockerfile <<EOF
    +FROM registry.access.redhat.com/ubi8/ubi-minimal
    +USER 1001
    +COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    +RUN mkdir -p /opt
    +ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    +EOF
    +
    +
    +
  6. +
  7. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  8. +
  9. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  10. +
  11. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  12. +
+
+ + +
+ + diff --git a/modules/error-messages/index.html b/modules/error-messages/index.html new file mode 100644 index 00000000000..04b064ecb67 --- /dev/null +++ b/modules/error-messages/index.html @@ -0,0 +1,83 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Error messages

+
+

This section describes error messages and how to resolve them.

+
+
+
warm import retry limit reached
+

The warm import retry limit reached error message is displayed during a warm migration if a VMware virtual machine (VM) has reached the maximum number (28) of changed block tracking (CBT) snapshots during the precopy stage.

+
+
+

To resolve this problem, delete some of the CBT snapshots from the VM and restart the migration plan.

+
+
+
Unable to resize disk image to required size
+

The Unable to resize disk image to required size error message is displayed when migration fails because a virtual machine on the target provider uses persistent volumes with an EXT4 file system on block storage. The problem occurs because the default overhead that is assumed by CDI does not completely include the reserved place for the root partition.

+
+
+

To resolve this problem, increase the file system overhead in CDI to more than 10%.

+
+ + +
+ + diff --git a/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg b/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..999c62adec4 --- /dev/null +++ b/modules/images/136_OpenShift_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_OpenShift_0121 diff --git a/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg b/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..473e21ba4e2 --- /dev/null +++ b/modules/images/136_OpenShift_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_OpenShift_0121 diff --git a/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg b/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg new file mode 100644 index 00000000000..33a031a0909 --- /dev/null +++ b/modules/images/136_Upstream_Migration_Toolkit_0121_mtv-workflow.svg @@ -0,0 +1 @@ +NetworkmappingTargetproviderVirtualmachines1UserVirtual-Machine-Import4MigrationControllerPlan2Migration3StoragemappingSourceprovider136_0121 diff --git a/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg b/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg new file mode 100644 index 00000000000..e73192c0102 --- /dev/null +++ b/modules/images/136_Upstream_Migration_Toolkit_0121_virt-workflow.svg @@ -0,0 +1 @@ +Virtual-Machine-ImportProviderAPIVirtualmachineCDIControllerKubeVirtController<VM_name>podDataVolumeSourceProviderConversionpodPersistentVolumeDynamicallyprovisionedstoragePersistentVolume Claim163438710ProviderCredentialsUserVMdisk29VirtualMachineImportControllerVirtual-Machine-InstanceVirtual-Machine57Importerpod136_0121 diff --git a/modules/images/forklift-logo-darkbg.png b/modules/images/forklift-logo-darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..06e9d1b249453946a449c8ba5d88c1014e7e3940 GIT binary patch literal 7554 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 literal 0 HcmV?d00001 diff --git a/modules/images/forklift-logo-darkbg.svg b/modules/images/forklift-logo-darkbg.svg new file mode 100644 index 00000000000..8a846e6361a --- /dev/null +++ b/modules/images/forklift-logo-darkbg.svg @@ -0,0 +1,164 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/images/forklift-logo-lightbg.png b/modules/images/forklift-logo-lightbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8dba83d97f88dbd1722f30a77c915edd4640fe2c GIT binary patch literal 7667 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 V*?3s0ee+>Uq@!i1Spl(){C|U8&Q|~c literal 0 HcmV?d00001 diff --git a/modules/images/forklift-logo-lightbg.svg b/modules/images/forklift-logo-lightbg.svg new file mode 100644 index 00000000000..a8038cdf923 --- /dev/null +++ b/modules/images/forklift-logo-lightbg.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/images/kebab.png b/modules/images/kebab.png new file mode 100644 index 0000000000000000000000000000000000000000..81893bd4ad103557f7180529ae228e313e8319c5 GIT binary patch literal 329 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 A + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Increasing the NFC service memory of an ESXi host

+
+

If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host. Otherwise, the migration will fail because the NFC service memory is limited to 10 parallel connections.

+
+
+
Procedure
+
    +
  1. +

    Log in to the ESXi host as root.

    +
  2. +
  3. +

    Change the value of maxMemory to 1000000000 in /etc/vmware/hostd/config.xml:

    +
    +
    +
    ...
    +      <nfcsvc>
    +         <path>libnfcsvc.so</path>
    +         <enabled>true</enabled>
    +         <maxMemory>1000000000</maxMemory>
    +         <maxStreamMemory>10485760</maxStreamMemory>
    +      </nfcsvc>
    +...
    +
    +
    +
  4. +
  5. +

    Restart hostd:

    +
    +
    +
    # /etc/init.d/hostd restart
    +
    +
    +
    +

    You do not need to reboot the host.

    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/installing-mtv-operator/index.html b/modules/installing-mtv-operator/index.html new file mode 100644 index 00000000000..603ab937d30 --- /dev/null +++ b/modules/installing-mtv-operator/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Prerequisites
+
    +
  • +

    OKD 4.10 or later installed.

    +
  • +
  • +

    KubeVirt Operator installed on an OpenShift migration target cluster.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin permissions.

    +
  • +
+
+ + +
+ + diff --git a/modules/issue_templates/issue.md b/modules/issue_templates/issue.md new file mode 100644 index 00000000000..30d52ab9cba --- /dev/null +++ b/modules/issue_templates/issue.md @@ -0,0 +1,15 @@ +## Summary + +(Describe the problem. Don't worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.) + +## What is the problem? + +(Paste the text or a screenshot here. Remember to include the **task number** so that we know which module is affected.) + +## What is the solution? + +(Correct text, link, or task.) + +## Notes + +(Do we need to fix something else?) diff --git a/modules/issue_templates/issue/index.html b/modules/issue_templates/issue/index.html new file mode 100644 index 00000000000..808faea9bc4 --- /dev/null +++ b/modules/issue_templates/issue/index.html @@ -0,0 +1,79 @@ + + + + + + + + Summary | Forklift Documentation + + + + + + + + + + + + + +Summary | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + +
+

Summary

+ +

(Describe the problem. Don’t worry if the problem occurs in more than one checklist. You only need to mention the checklist where you see a problem. We will fix the module.)

+ +

What is the problem?

+ +

(Paste the text or a screenshot here. Remember to include the task number so that we know which module is affected.)

+ +

What is the solution?

+ +

(Correct text, link, or task.)

+ +

Notes

+ +

(Do we need to fix something else?)

+ + + +
+ + diff --git a/modules/known-issues-2-7/index.html b/modules/known-issues-2-7/index.html new file mode 100644 index 00000000000..08437dc43c7 --- /dev/null +++ b/modules/known-issues-2-7/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Known issues

+
+

Forklift 2.7 has the following known issues:

+
+
+
Select Migration Network from the endpoint type ESXi displays multiple incorrect networks
+

When you choose Select Migration Network, from the endpoint type of ESXi, multiple incorrect networks are displayed. (MTV-1291)

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in known-issues-2-7.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+
+
Network and Storage maps in the UI are not correct when created from the command line
+

When creating Network and Storage maps from the UI, the correct names are not shown in the UI. (MTV-1421)

+
+
+
Migration fails with module network-legacy configured in RHEL guests
+

Migration fails if the module configuration file is available in the guest and the dhcp-client package is not installed, returning a dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found error. (MTV-1615)

+
+ + +
+ + diff --git a/modules/making-open-source-more-inclusive/index.html b/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 00000000000..131c7bf5bc9 --- /dev/null +++ b/modules/making-open-source-more-inclusive/index.html @@ -0,0 +1,69 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Making open source more inclusive

+
+

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.

+
+ + +
+ + diff --git a/modules/migration-plan-options-ui/index.html b/modules/migration-plan-options-ui/index.html new file mode 100644 index 00000000000..682a9c01d9c --- /dev/null +++ b/modules/migration-plan-options-ui/index.html @@ -0,0 +1,141 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migration plan options

+
+

On the Plans for virtualization page of the OKD web console, you can click the {kebab} beside a migration plan to access the following options:

+
+
+
    +
  • +

    Get logs: Retrieves the logs of a migration. When you click Get logs, a confirmation window opens. After you click Get logs in the window, wait until Get logs changes to Download logs and then click the button to download the logs.

    +
  • +
  • +

    Edit: Edit the details of a migration plan. You cannot edit a migration plan while it is running or after it has completed successfully.

    +
  • +
  • +

    Duplicate: Create a new migration plan with the same virtual machines (VMs), parameters, mappings, and hooks as an existing plan. You can use this feature for the following tasks:

    +
    +
      +
    • +

      Migrate VMs to a different namespace.

      +
    • +
    • +

      Edit an archived migration plan.

      +
    • +
    • +

      Edit a migration plan with a different status, for example, failed, canceled, running, critical, or ready.

      +
    • +
    +
    +
  • +
  • +

    Archive: Delete the logs, history, and metadata of a migration plan. The plan cannot be edited or restarted. It can only be viewed.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Archive option is irreversible. However, you can duplicate an archived plan.

    +
    +
    +
    +
  • +
  • +

    Delete: Permanently remove a migration plan. You cannot delete a running migration plan.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The Delete option is irreversible.

    +
    +
    +

    Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

    +
    +
    +
    +
  • +
  • +

    View details: Display the details of a migration plan.

    +
  • +
  • +

    Restart: Restart a failed or canceled migration plan.

    +
  • +
  • +

    Cancel scheduled cutover: Cancel a scheduled cutover migration for a warm migration plan.

    +
  • +
+
+ + +
+ + diff --git a/modules/mtv-changelog-2-7/index.html b/modules/mtv-changelog-2-7/index.html new file mode 100644 index 00000000000..2b873803fd2 --- /dev/null +++ b/modules/mtv-changelog-2-7/index.html @@ -0,0 +1,2330 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift changelog

+
+
+
+

The following changelog for Forklift includes a full list of packages used in the Forklift 2.7 releases.

+
+
+
+
+

Forklift 2.7 packages

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift packages
Forklift 2.7.0Forklift 2.7.2Forklift 2.7.3

abattis-cantarell-fonts-0.301-4.el9.noarch

abattis-cantarell-fonts-0.301-4.el9.noarch

Abattis-cantarell-fonts-0.301-4.el9.noarch

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

acl-2.3.1-4.el9.x86_64

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

alternatives-1.24-1.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

attr-2.5.1-3.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

audit-libs-3.1.2-2.el9.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

augeas-libs-1.13.0-6.el9_4.x86_64

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

bash-5.1.8-9.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

binutils-gold-2.35.2-43.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

bzip2-libs-1.0.8-8.el9.x86_64

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

ca-certificates-2024.2.69_v8.0.303-91.4.el9_4.noarch

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

capstone-4.0.2-10.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

checkpolicy-3.6-1.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

clevis-luks-18-112.el9.x86_64

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

cmake-rpm-macros-3.26.5-2.el9.noarch

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

coreutils-single-8.32-35.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cpio-2.13-16.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

cracklib-dicts-2.9.6-27.el9.x86_64

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

crypto-policies-20240202-1.git283706d.el9.noarch

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

cryptsetup-libs-2.6.0-3.el9.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

curl-minimal-7.76.1-29.el9_4.1.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-gssapi-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

cyrus-sasl-lib-2.1.27-21.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

daxctl-libs-71.1-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-1.12.20-8.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-broker-28-7.el9.x86_64

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-common-1.12.20-8.el9.noarch

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dbus-libs-1.12.20-8.el9.x86_64

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

dejavu-sans-fonts-2.37-18.el9.noarch

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-event-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-libs-1.02.197-2.el9.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

device-mapper-persistent-data-1.0.9-3.el9_4.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-client-4.4.2-19.b1.el9.x86_64

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

dhcp-common-4.4.2-19.b1.el9.noarch

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

diffutils-3.7-12.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dmidecode-3.5-3.el9.x86_64

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnf-data-4.14.0-9.el9.noarch

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dnsmasq-2.85-16.el9_4.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dosfstools-4.2-3.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dracut-057-53.git20240104.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

dwz-0.14-3.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

e2fsprogs-libs-1.46.5-5.el9.x86_64

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

edk2-ovmf-20231122-6.el9_4.3.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

efi-srpm-macros-6-2.el9_0.noarch

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-debuginfod-client-0.190-2.el9.x86_64

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-default-yama-scope-0.190-2.el9.noarch

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libelf-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

elfutils-libs-0.190-2.el9.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

expat-2.5.0-2.el9_4.1.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

file-libs-5.39-16.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

filesystem-3.16-2.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

findutils-4.8.0-6.el9.x86_64

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-filesystem-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fonts-srpm-macros-2.0.5-7.el9.1.noarch

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-2.9.9-15.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-common-3.10.2-8.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

fuse-libs-2.9.9-15.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gawk-5.1.0-6.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdbm-libs-1.19-4.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

gdisk-1.0.7-5.el9.x86_64

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-city-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

geolite2-country-20191217-6.el9.noarch

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

gettext-libs-0.21-8.el9.x86_64

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

ghc-srpm-macros-1.5.0-6.el9.noarch

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib-networking-2.68.3-3.el9.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glib2-2.68.4-14.el9_4.1.x86_64

glibc-2.34-100.el9_4.3.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.3.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-common-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.3.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-gconv-extra-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-langpack-en-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.3.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

glibc-minimal-langpack-2.34-100.el9_4.4.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gmp-6.2.0-13.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnupg2-2.3.3-4.el9.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-dane-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

gnutls-utils-3.8.3-4.el9_4.x86_64

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

go-srpm-macros-3.2.0-3.el9.noarch

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gobject-introspection-1.68.0-11.el9.x86_64

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-5a6340b3-6229229e

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpg-pubkey-fd431d51-4ae0493b

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

gpgme-1.15.1-6.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

grep-3.6-5.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

groff-base-1.22.4-10.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gsettings-desktop-schemas-40.0-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

gssproxy-0.8.4-6.el9.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

guestfs-tools-1.51.6-3.el9_4.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

gzip-1.12-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hexedit-1.6-1.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hivex-libs-1.3.21-3.el9.x86_64

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

hwdata-0.348-9.13.el9.noarch

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

inih-49-6.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

ipcalc-1.0.0-5.el9.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iproute-tc-6.2.0-6.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-libs-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iptables-nft-1.8.10-4.el9_4.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

iputils-20210202-9.el9.x86_64

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

ipxe-roms-qemu-20200823-9.git4bd064de.el9.noarch

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jansson-2.14-1.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jose-11-3.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

jq-1.6-16.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-c-0.14-11.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

json-glib-1.6.6-1.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-2.4.0-9.el9.x86_64

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-legacy-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kbd-misc-2.4.0-9.el9.noarch

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

kernel-srpm-macros-1.0-13.el9.noarch

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

keyutils-libs-1.6.3-1.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kmod-libs-28-9.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

kpartx-0.8.7-27.el9.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

krb5-libs-1.21.1-2.el9_4.x86_64

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-core-font-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

langpacks-en-3.0-16.el9.noarch

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

less-590-4.el9_4.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libacl-2.3.1-4.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libaio-0.3.111-13.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libarchive-3.5.3-4.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libassuan-2.5.5-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libatomic-11.4.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libattr-2.5.1-3.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libbasicobjects-0.1.1-53.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libblkid-2.37.4-18.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbpf-1.3.0-2.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libbrotli-1.0.9-6.el9.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-2.48-9.el9_2.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcap-ng-0.8.2-7.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcbor-0.7.0-5.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcollection-0.7.0-53.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libcom_err-1.46.5-5.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libconfig-1.7.2-9.el9.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libcurl-minimal-7.76.1-29.el9_4.1.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdb-5.3.28-53.el9.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libdnf-0.69.0-8.el9_4.1.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libeconf-0.4.1-3.el9_2.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libedit-3.1-38.20210216cvs.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libev-4.33-5.el9.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libevent-2.1.12-8.el9_4.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdisk-2.37.4-18.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libfdt-1.6.0-7.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libffi-3.4.2-8.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libfido2-1.13.0-2.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcc-11.4.1-3.el9.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgcrypt-1.10.0-10.el9_2.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgomp-11.4.1-3.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libgpg-error-1.42-5.el9.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-appliance-1.50.1-8.el9_4.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-winsupport-9.3-1.el9_3.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libguestfs-xfs-1.50.1-8.el9_4.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libibverbs-48.0-1.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libicu-67.1-9.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libidn2-2.3.0-7.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libini_config-1.3.1-53.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libjose-11-3.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libkcapi-hmaccalc-1.4.0-2.el9.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libksba-1.5.1-6.el9_1.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libluksmeta-9-12.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmaxminddb-1.5.2-3.el9.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmnl-1.0.4-16.el9_4.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmodulemd-2.13.0-2.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libmount-2.37.4-18.el9.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnbd-1.18.1-4.el9_4.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnetfilter_conntrack-1.0.9-1.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfnetlink-1.0.1-21.el9.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnfsidmap-2.5.4-26.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnftnl-1.2.6-4.el9_4.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnghttp2-1.43.0-5.el9_4.3.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libnl3-3.9.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libosinfo-1.10.0-1.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpath_utils-0.2.1-53.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpeas-1.30.0-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpipeline-1.5.3-4.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpkgconf-1.7.3-10.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpmem-1.12.1-1.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libpng-1.6.37-12.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libproxy-webkitgtk4-0.4.15-35.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpsl-0.21.1-5.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

libpwquality-1.4.4-8.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

librdmacm-48.0-1.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

libref_array-0.1.5-53.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

librepo-1.14.5-2.el9.x86_64

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

libreport-filesystem-2.15.2-6.el9.noarch

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

librhsm-0.0.3-7.el9_3.1.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libseccomp-2.5.2-2.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libselinux-utils-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsemanage-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsepol-3.6-1.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libsigsegv-2.13-4.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libslirp-4.4.0-7.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsmartcols-2.37.4-18.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsolv-0.7.24-2.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libsoup-2.72.0-8.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libss-1.46.5-5.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-0.10.4-13.el9.x86_64

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libssh-config-0.10.4-13.el9.noarch

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libstdc++-11.4.1-3.el9.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtasn1-4.16.0-8.el9_1.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtirpc-1.3.3-8.el9_4.x86_64

libtpms-0.9.1-3.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libtpms-0.9.1-4.20211126git1ff6fe1f43.el9_2.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

libunistring-0.9.10-15.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

liburing-2.5-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libusbx-1.0.26-1.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libutempter-1.2.1-6.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libuuid-2.37.4-18.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libverto-libev-0.3.2-3.el9.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-common-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-config-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-network-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-secret-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-storage-core-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-log-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxcrypt-compat-4.4.18-3.el9.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxml2-2.9.13-6.el9_4.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libxslt-1.1.34-9.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libyaml-0.2.5-7.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

libzstd-1.5.1-2.el9.x86_64

linux-firmware-20240716-143.2.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240716-143.2.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

linux-firmware-whence-20240905-143.3.el9_4.noarch

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lsscsi-0.32-6.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-libs-5.4.4-4.el9.x86_64

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

lua-srpm-macros-1-6.el9.noarch

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

luksmeta-9-12.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lvm2-libs-2.03.23-2.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lz4-libs-1.9.3-5.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzo-2.10-7.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

lzop-1.04-8.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

man-db-2.9.3-7.el9.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

mdadm-4.2-14.el9_4.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

microdnf-3.9.1-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-binutils-generic-2.41-3.el9.x86_64

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw-filesystem-base-148-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-crt-11.0.1-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-filesystem-148-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mingw32-srvany-1.1-3.el9.noarch

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mpfr-4.1.0-7.el9.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

mtools-4.0.26-4.el9_0.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-6.2-10.20210508.el9.x86_64

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-base-6.2-10.20210508.el9.noarch

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ncurses-libs-6.2-10.20210508.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

ndctl-libs-71.1-8.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nettle-3.9.1-1.el9.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

nfs-utils-2.5.4-26.el9_4.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

npth-1.6-8.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numactl-libs-2.0.16-3.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

numad-0.5-37.20150602git.el9.x86_64

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

ocaml-srpm-macros-6-6.el9.noarch

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

oniguruma-6.9.6-1.el9.5.x86_64

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openblas-srpm-macros-2-11.el9.noarch

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openldap-2.6.6-3.el9.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssh-clients-8.7p1-38.el9_4.4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-3.0.7-28.el9_4.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-fips-provider-3.0.7-2.el9.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

openssl-libs-3.0.7-28.el9_4.x86_64

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-20231215-1.el9.noarch

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

osinfo-db-tools-1.10.0-1.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

p11-kit-trust-0.25.3-2.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

pam-1.5.1-19.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

parted-3.5-2.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-0^20231204.gb86afe3-1.el9.x86_64

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

passt-selinux-0^20231204.gb86afe3-1.el9.noarch

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre-8.44-3.el9.3.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-10.40-5.el9.x86_64

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

pcre2-syntax-10.40-5.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-AutoLoader-5.74-481.el9.noarch

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-B-1.80-481.el9.x86_64

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-base-2.27-481.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Carp-1.50-460.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-Class-Struct-0.66-481.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-constant-1.33-461.el9.noarch

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Data-Dumper-2.174-462.el9.x86_64

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-1.19-4.el9.noarch

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Digest-MD5-2.58-4.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Encode-3.08-462.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Errno-1.30-481.el9.x86_64

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Exporter-5.74-461.el9.noarch

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-Fcntl-1.13-481.el9.x86_64

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Basename-2.85-481.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-Path-2.18-4.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-stat-1.09-481.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-File-Temp-0.231.100-4.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-FileHandle-2.03-481.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Long-2.52-4.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-Getopt-Std-1.12-481.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-HTTP-Tiny-0.076-462.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-if-0.60.800-481.el9.noarch

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-interpreter-5.32.1-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-1.43-481.el9.x86_64

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-IP-0.41-5.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IO-Socket-SSL-2.073-1.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-IPC-Open3-1.21-481.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libnet-3.13-4.el9.noarch

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-libs-5.32.1-481.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-MIME-Base64-3.16-4.el9.x86_64

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-Mozilla-CA-20200520-6.el9.noarch

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-mro-1.23-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-NDBM_File-1.15-481.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-Net-SSLeay-1.92-2.el9.x86_64

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overload-1.31-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-overloading-0.02-481.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-parent-0.238-460.el9.noarch

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-PathTools-3.78-461.el9.x86_64

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Escapes-1.07-460.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Perldoc-3.28.01-461.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Simple-3.42-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-Pod-Usage-2.01-4.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-podlators-4.14-460.el9.noarch

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-POSIX-1.94-481.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-Scalar-List-Utils-1.56-461.el9.x86_64

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-SelectSaver-1.02-481.el9.noarch

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-Socket-2.031-4.el9.x86_64

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-srpm-macros-1-41.el9.noarch

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-Storable-3.21-460.el9.x86_64

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-subs-1.03-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Symbol-1.08-481.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-ANSIColor-5.01-461.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Term-Cap-1.17-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-ParseWords-3.30-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-Time-Local-1.300-7.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-URI-5.09-3.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

perl-vars-1.05-481.el9.noarch

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pigz-2.5-4.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pixman-0.40.0-6.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

pkgconf-1.7.3-10.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-3.6-2.1.el9.x86_64

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

policycoreutils-python-utils-3.6-2.1.el9.noarch

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-libs-0.117-11.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

polkit-pkla-compat-0.1-21.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

popt-1.18-8.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

procps-ng-3.3.17-14.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

protobuf-c-1.3.3-13.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

psmisc-23.4-3.el9.x86_64

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

publicsuffix-list-dafsa-20210518-3.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

pyproject-srpm-macros-1.12.0-1.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-srpm-macros-3.9-53.el9.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python-unversioned-command-3.9.18-3.el9_4.5.noarch

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-3.9.18-3.el9_4.5.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-audit-3.1.2-2.el9.x86_64

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-distro-1.5.0-7.el9.noarch

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libs-3.9.18-3.el9_4.5.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libselinux-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-libsemanage-3.6-1.el9.x86_64

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-pip-wheel-21.2.3-8.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-policycoreutils-3.6-2.1.el9.noarch

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-pyyaml-5.4.1-6.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setools-4.4.4-1.el9.x86_64

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

python3-setuptools-wheel-53.0.0-12.el9_4.1.noarch

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

qt5-srpm-macros-5.15.9-1.el9.noarch

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-4.06-6.el9.x86_64

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

quota-nls-4.06-6.el9.noarch

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

readline-8.1-4.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-release-9.4-0.5.el9.x86_64

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

redhat-rpm-config-207-1.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rootfiles-8.1-31.el9.noarch

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpcbind-1.2.6-7.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-libs-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rpm-plugin-selinux-4.16.1.3-29.el9.x86_64

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

rust-srpm-macros-17-4.el9.noarch

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

scrub-2.6.1-4.el9.x86_64

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

seavgabios-bin-1.16.3-2.el9.noarch

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

sed-4.8-9.el9.x86_64

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

selinux-policy-targeted-38.1.35-2.el9_4.2.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

setup-2.13.7-10.el9.noarch

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

shadow-utils-4.9-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

snappy-1.1.8-8.el9.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

sqlite-libs-3.34.1-7.el9_3.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

squashfs-tools-4.4-10.git1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

supermin-5.3.3-1.el9.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-libs-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

swtpm-tools-0.8.0-2.el9_4.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-6.04-0.20.el9.x86_64

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-extlinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

syslinux-nonlinux-6.04-0.20.el9.noarch

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-container-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-libs-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-pam-252-32.el9_4.7.x86_64

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-rpm-macros-252-32.el9_4.7.noarch

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

systemd-udev-252-32.el9_4.7.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tar-1.34-6.el9_4.1.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tools-5.2-3.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tpm2-tss-3.2.2-2.el9.x86_64

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

tzdata-2024a-1.el9.noarch

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unbound-libs-1.16.2-3.el9_3.5.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

unzip-6.0-56.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

userspace-rcu-0.12.1-6.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

util-linux-core-2.37.4-18.el9.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

vim-minimal-8.2.2637-20.el9_1.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

virtio-win-1.9.40-0.el9_4.noarch

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.42.5-1.el9.x86_64

webkit2gtk3-jsc-2.46.1-2.el9_4.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

which-2.21-29.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xfsprogs-6.3.0-1.el9.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

xz-libs-5.2.5-8.el9_0.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

yajl-2.1.0-22.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zip-3.0-35.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zlib-1.2.11-40.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

zstd-1.5.1-2.el9.x86_64

+
+
+ + +
+ + diff --git a/modules/mtv-overview-page/index.html b/modules/mtv-overview-page/index.html new file mode 100644 index 00000000000..4c137cb883b --- /dev/null +++ b/modules/mtv-overview-page/index.html @@ -0,0 +1,214 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV Overview page

+
+
+
+

The Forklift Overview page displays system-wide information about migrations and a list of Settings you can change.

+
+
+

If you have Administrator privileges, you can access the Overview page by clicking MigrationOverview in the OKD web console.

+
+
+

The Overview page has 3 tabs:

+
+
+
    +
  • +

    Overview

    +
  • +
  • +

    YAML

    +
  • +
  • +

    Metrics

    +
  • +
+
+
+
+
+

Overview tab

+
+
+

The Overview tab lets you see:

+
+
+
    +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the Operator

    +
  • +
  • +

    Pods: The name, status, and creation time of each pod that was deployed by the Forklift Operator

    +
  • +
  • +

    Conditions: Status of the Forklift Operator:

    +
    +
      +
    • +

      Failure: Last failure. False indicates no failure since deployment.

      +
    • +
    • +

      Running: Whether the Operator is currently running and waiting for the next reconciliation.

      +
    • +
    • +

      Successful: Last successful reconciliation.

      +
    • +
    +
    +
  • +
+
+
+
+
+

YAML tab

+
+
+

The custom resource ForkliftController that defines the operation of the Forklift Operator. You can modify the custom resource from this tab.

+
+
+
+
+

Metrics tab

+
+
+

The Metrics tab lets you see:

+
+
+
    +
  • +

    Migrations: The number of migrations performed using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
  • +

    Virtual Machine Migrations: The number of VMs migrated using Forklift:

    +
    +
      +
    • +

      Total

      +
    • +
    • +

      Running

      +
    • +
    • +

      Failed

      +
    • +
    • +

      Succeeded

      +
    • +
    • +

      Canceled

      +
    • +
    +
    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Since a single migration might involve many virtual machines, the number of migrations performed using Forklift might vary significantly from the number of virtual machines that have been migrated using Forklift.

+
+
+
+
+
    +
  • +

    Chart showing the number of running, failed, and succeeded migrations performed using Forklift for each of the last 7 days

    +
  • +
  • +

    Chart showing the number of running, failed, and succeeded virtual machine migrations performed using Forklift for each of the last 7 days

    +
  • +
+
+
+
+ + +
+ + diff --git a/modules/mtv-performance-addendum/index.html b/modules/mtv-performance-addendum/index.html new file mode 100644 index 00000000000..81e59d6fd54 --- /dev/null +++ b/modules/mtv-performance-addendum/index.html @@ -0,0 +1,291 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance addendum

+
+
+
+

Unresolved directive in mtv-performance-addendum.adoc - include::snip_performance.adoc[]

+
+
+
+
+

ESXi performance

+
+
+
Single ESXi performance
+

Test migration using the same ESXi host.

+
+
+

In each iteration, the total VMs are increased, to display the impact of concurrent migration on the duration.

+
+
+

The results show that migration time is linear when increasing the total VMs (50 GiB disk, Utilization 70%).

+
+
+

The optimal number of VMs per ESXi is 10.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Single ESXi tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, Private Network [1]

2.6

7.0.3

100

cold

0:21:39

cold migration, 20 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

0:41:16

cold migration, 30 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:00:59

cold migration, 40 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:23:02

cold migration, 50 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

1:46:24

cold migration, 80 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

2:42:49

cold migration, 100 VMs, Single ESXi, Private Network

2.6

7.0.3

100

cold

3:25:15

+
+
Multi ESXi hosts and single data store
+

In each iteration, the number of ESXi hosts were increased, to show that increasing the number of ESXi hosts improves the migration time (50 GiB disk, Utilization 70%).

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Multi ESXi hosts and single data store
Test Case DescriptionMTVVDDKMax_vm inflightMigration TypeTotal Duration

cold migration, 100 VMs, Single ESXi, Private Network [2]

2.6

7.0.3

100

cold

3:25:15

cold migration, 100 VMs, 4 ESXs (25 VMs per ESX), Private Network

2.6

7.0.3

100

cold

1:22:27

cold migration, 100 VMs, 5 ESXs (20 VMs per ESX), Private Network, 1 DataStore

2.6

7.0.3

100

cold

1:04:57

+
+
+
+

Different migration network performance

+
+
+

Each iteration the Migration Network was changed, using the Provider, to find the fastest network for migration.

+
+
+

The results show that there is no degradation using management compared to non-managment networks when all interfaces and network speeds are the same.

+
+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Different migration network tests
Test Case DescriptionMTVVDDKmax_vm inflightMigration TypeTotal Duration

cold migration, 10 VMs, Single ESXi, MGMT Network

2.6

7.0.3

100

cold

0:21:30

cold migration, 10 VMs, Single ESXi, Private Network [3]

2.6

7.0.3

20

cold

0:21:20

cold migration, 10 VMs, Single ESXi, Default Network

2.6.2

7.0.3

20

cold

0:21:30

+
+
+
+
+
+1. Private Network refers to a non -Management network +
+
+2. Private Network refers to a non-Management network +
+
+3. Private Network refers to a non-Management network +
+
+ + +
+ + diff --git a/modules/mtv-performance-recommendation/index.html b/modules/mtv-performance-recommendation/index.html new file mode 100644 index 00000000000..2bbfa746ae8 --- /dev/null +++ b/modules/mtv-performance-recommendation/index.html @@ -0,0 +1,382 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift performance recommendations

+
+
+
+

The purpose of this section is to share recommendations for efficient and effective migration of virtual machines (VMs) using Forklift, based on findings observed through testing.

+
+
+

Unresolved directive in mtv-performance-recommendation.adoc - include::snip_performance.adoc[]

+
+
+
+
+

Ensure fast storage and network speeds

+
+
+

Ensure fast storage and network speeds, both for VMware and OKD (OCP) environments.

+
+
+
    +
  • +

    To perform fast migrations, VMware must have fast read access to datastores.  Networking between VMware ESXi hosts should be fast, ensure a 10 GiB network connection, and avoid network bottlenecks.

    +
    +
      +
    • +

      Extend the VMware network to the OCP Workers Interface network environment.

      +
    • +
    • +

      It is important to ensure that the VMware network offers high throughput (10 Gigabit Ethernet) and rapid networking to guarantee that the reception rates align with the read rate of the ESXi datastore.

      +
    • +
    • +

      Be aware that the migration process uses significant network bandwidth and that the migration network is utilized. If other services utilize that network, it may have an impact on those services and their migration rates.

      +
    • +
    • +

      For example, 200 to 325 MiB/s was the average network transfer rate from the vmnic for each ESXi host associated with transferring data to the OCP interface.

      +
    • +
    +
    +
  • +
+
+
+
+
+

Ensure fast datastore read speeds to ensure efficient and performant migrations.

+
+
+

Datastores read rates impact the total transfer times, so it is essential to ensure fast reads are possible from the ESXi datastore to the ESXi host.  

+
+
+

Example in numbers: 200 to 300 MiB/s was the average read rate for both vSphere and ESXi endpoints for a single ESXi server. When multiple ESXi servers are used, higher datastore read rates are possible.

+
+
+
+
+

Endpoint types 

+
+
+

Forklift 2.6 allows for the following vSphere provider options:

+
+
+
    +
  • +

    ESXi endpoint (inventory and disk transfers from ESXi), introduced in Forklift 2.6

    +
  • +
  • +

    vCenter Server endpoint; no networks for the ESXi host (inventory and disk transfers from vCenter)

    +
  • +
  • +

    vCenter endpoint and ESXi networks are available (inventory from vCenter, disk transfers from ESXi).

    +
  • +
+
+
+

When transferring many VMs that are registered to multiple ESXi hosts, using the vCenter endpoint and ESXi network is suggested.

+
+
+ + + + + +
+
Note
+
+
+

As of vSphere 7.0, ESXi hosts can label which network to use for NBD transport. This is accomplished by tagging the desired virtual network interface card (NIC) with the appropriate vSphereBackupNFC label.  When this is done, Forklift will be able to utilize the ESXi interface for network transfer to Openshift as long as the worker and ESXi host interfaces are reachable.  This is especially useful when migration users may not have access to the ESXi credentials yet would like to be able to control which ESXi interface is used for migration. 

+
+
+

For more details, see: (Forklift-1230)

+
+
+
+
+

You can use the following ESXi command, which designates interface vmk2 for NBD backup:

+
+
+
+
esxcli network ip interface tag add -t vSphereBackupNFC -i vmk2
+
+
+
+
+
+

Set ESXi hosts BIOS profile and ESXi Host Power Management for High Performance

+
+
+

Where possible, ensure that hosts used to perform migrations are set with BIOS profiles related to maximum performance.  Hosts which use Host Power Management controlled within vSphere should check that High Performance is set.

+
+
+

Testing showed that when transferring more than 10 VMs with both BIOS and host power management set accordingly, migrations had an increase of 15 MiB in the average datastore read rate.

+
+
+
+
+

Avoid additional network load on VMware networks

+
+
+

You can reduce the network load on VMware networks by selecting the migration network when using the ESXi endpoint.

+
+
+

By incorporating a virtualization provider, Forklift enables the selection of a specific network, which is accessible on the ESXi hosts, for the purpose of migrating virtual machines to OCP.  Selecting this migration network from the ESXi host in the Forklift UI will ensure that the transfer is performed using the selected network as an ESXi endpoint..

+
+
+

It is imperative to ensure that the network selected has connectivity to the OCP interface, has adequate bandwidth for migrations, and that the network interface is not saturated.

+
+
+

In environments with fast networks, such as 10GbE networks, migration network impacts can be expected to match the rate of ESXi datastore reads.

+
+
+
+
+

Control maximum concurrent disk migrations per ESXi host.

+
+
+

Set the MAX_VM_INFLIGHT MTV variable to control the maximum number of concurrent VMs transfers allowed for the ESXi host. 

+
+
+

Forklift allows for concurrency to be controlled using this variable; by default, it is set to 20.

+
+
+

When setting MAX_VM_INFLIGHT, consider the number of maximum concurrent VMs transfers are required for ESXi hosts. It is important to consider the type of migration to be transferred concurrently. Warm migrations, which are defined by migrations of a running VM that will be migrated over a scheduled time.

+
+
+

Warm migrations use snapshots to compare and migrate only the differences between previous snapshots of the disk.  The migration of the differences between snapshots happens over specific intervals before a final cut-over of the running VM to OKD occurs. 

+
+
+

In Forklift 2.6, MAX_VM_INFLIGHT reserves one transfer slot per VM, regardless of current migration activity for a specific snapshot or the number of disks that belong to a single vm. The total set by MAX_VM_INFLIGHT is used to indicate how many concurrent VM tranfers per ESXi host is allowed.

+
+
+
Examples
+
    +
  • +

    MAX_VM_INFLIGHT = 20 and 2 ESXi hosts defined in the provider mean each host can transfer 20 VMs.

    +
  • +
+
+
+
+
+

Migrations are completed faster when migrating multiple VMs concurrently

+
+
+

When multiple VMs from a specific ESXi host are to be migrated, starting concurrent migrations for multiple VMs leads to faster migration times. 

+
+
+

Testing demonstrated that migrating 10 VMs (each containing 35 GiB of data, with a total size of 50 GiB) from a single host is significantly faster than migrating the same number of VMs sequentially, one after another. 

+
+
+

It is possible to increase concurrent migration to more than 10 virtual machines from a single host, but it does not show a significant improvement. 

+
+
+
Examples
+
    +
  • +

    1 single disk VMs took 6 minutes, with migration rate of 100 MiB/s

    +
  • +
  • +

    10 single disk VMs took 22 minutes, with migration rate of 272 MiB/s

    +
  • +
  • +

    20 single disk VMs took 42 minutes, with migration rate of 284 MiB/s

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that the migration of 10 virtual machines simultaneously is three times faster than the migration of identical virtual machines in a sequential manner.

+
+
+

The migration rate was almost the same when moving 10 or 20 virtual machines simultaneously.

+
+
+
+
+
+
+

Migrations complete faster using multiple hosts.

+
+
+

Using multiple hosts with registered VMs equally distributed among the ESXi hosts used for migrations leads to faster migration times.

+
+
+

Testing showed that when transferring more than 10 single disk VMS, each containing 35 GiB of data out of a total of 50G total, using an additional host can reduce migration time.

+
+
+
Examples
+
    +
  • +

    80 single disk VMs, containing 35 GiB of data each, using a single host took 2 hours and 43 minutes, with a migration rate of 294 MiB/s.

    +
  • +
  • +

    80 single disk VMs, containing 35 GiB of data each, using 8 ESXi hosts took 41 minutes, with a migration rate of 1,173 MiB/s.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

From the aforementioned examples, it is evident that migrating 80 VMs from 8 ESXi hosts, 10 from each host, concurrently is four times faster than running the same VMs from a single ESXi host. 

+
+
+

Migrating a larger number of VMs from more than 8 ESXi hosts concurrently could potentially show increased performance. However, it was not tested and therefore not recommended.

+
+
+
+
+
+
+

Multiple migration plans compared to a single large migration plan

+
+
+

The maximum number of disks that can be referenced by a single migration plan is 500. For more details, see (MTV-1203)

+
+
+

When attempting to migrate many VMs in a single migration plan, it can take some time for all migrations to start.  By breaking up one migration plan into several migration plans, it is possible to start them at the same time.

+
+
+

Comparing migrations of:

+
+
+
    +
  • +

    500 VMs using 8 ESXi hosts in 1 plan, max_vm_inflight=100, took 5 hours and 10 minutes.

    +
  • +
  • +

    800 VMs using 8 ESXi hosts with 8 plans, max_vm_inflight=100, took 57 minutes.

    +
  • +
+
+
+

Testing showed that by breaking one single large plan into multiple moderately sized plans, for example, 100 VMS per plan, the total migration time can be reduced.

+
+
+
+
+

Maximum values tested

+
+
+
    +
  • +

    Maximum number of ESXi hosts tested: 8

    +
  • +
  • +

    Maximum number of VMs in a single migration plan: 500

    +
  • +
  • +

    Maximum number of VMs migrated in a single test: 5000

    +
  • +
  • +

    Maximum number of migration plans performed concurrently: 40

    +
  • +
  • +

    Maximum single disk size migrated: 6 T disks, which contained 3 Tb of data

    +
  • +
  • +

    Maximum number of disks on a single VM migrated: 50

    +
  • +
  • +

    Highest observed single datastore read rate from a single ESXi server:  312 MiB/second

    +
  • +
  • +

    Highest observed multi-datastore read rate using eight ESXi servers and two datastores: 1,242 MiB/second

    +
  • +
  • +

    Highest observed virtual NIC transfer rate to an {ocp-name} worker: 327 MiB/second

    +
  • +
  • +

    Maximum migration transfer rate of a single disk: 162 MiB/second (rate observed when transferring nonconcurrent migration of 1.5 Tb utilized data)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from a single ESXi host: 294 MiB/s (concurrent migration of 30 VMs, 35/50 GiB used, from Single ESXi)

    +
  • +
  • +

    Maximum cold migration transfer rate of the multiple VMs (single disk) from multiple ESXi hosts: 1173MB/s (concurrent migration of 80 VMs, 35/50 GiB used, from 8 ESXi servers, 10 VMs from each ESXi)

    +
  • +
+
+
+

For additional details on performance, see Forklift performance addendum

+
+
+
+ + +
+ + diff --git a/modules/mtv-resources-and-services/index.html b/modules/mtv-resources-and-services/index.html new file mode 100644 index 00000000000..9923e0e09b7 --- /dev/null +++ b/modules/mtv-resources-and-services/index.html @@ -0,0 +1,131 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift custom resources and services

+
+

Forklift is provided as an OKD Operator. It creates and manages the following custom resources (CRs) and services.

+
+
+
Forklift custom resources
+
    +
  • +

    Provider CR stores attributes that enable Forklift to connect to and interact with the source and target providers.

    +
  • +
  • +

    NetworkMapping CR maps the networks of the source and target providers.

    +
  • +
  • +

    StorageMapping CR maps the storage of the source and target providers.

    +
  • +
  • +

    Plan CR contains a list of VMs with the same migration parameters and associated network and storage mappings.

    +
  • +
  • +

    Migration CR runs a migration plan.

    +
    +

    Only one Migration CR per migration plan can run at a given time. You can create multiple Migration CRs for a single Plan CR.

    +
    +
  • +
+
+
+
Forklift services
+
    +
  • +

    The Inventory service performs the following actions:

    +
    +
      +
    • +

      Connects to the source and target providers.

      +
    • +
    • +

      Maintains a local inventory for mappings and plans.

      +
    • +
    • +

      Stores VM configurations.

      +
    • +
    • +

      Runs the Validation service if a VM configuration change is detected.

      +
    • +
    +
    +
  • +
  • +

    The Validation service checks the suitability of a VM for migration by applying rules.

    +
  • +
  • +

    The Migration Controller service orchestrates migrations.

    +
    +

    When you create a migration plan, the Migration Controller service validates the plan and adds a status label. If the plan fails validation, the plan status is Not ready and the plan cannot be used to perform a migration. If the plan passes validation, the plan status is Ready and it can be used to perform a migration. After a successful migration, the Migration Controller service changes the plan status to Completed.

    +
    +
  • +
  • +

    The Populator Controller service orchestrates disk transfers using Volume Populators.

    +
  • +
  • +

    The Kubevirt Controller and Containerized Data Import (CDI) Controller services handle most technical operations.

    +
  • +
+
+ + +
+ + diff --git a/modules/mtv-selected-packages-2-7/index.html b/modules/mtv-selected-packages-2-7/index.html new file mode 100644 index 00000000000..dc78b1d7dad --- /dev/null +++ b/modules/mtv-selected-packages-2-7/index.html @@ -0,0 +1,207 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift selected packages

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Selected Forklift packages
Package summaryForklift 2.7.0Forklift 2.7.2Forklift 2.7.3

The skeleton package which defines a simple Red Hat Enterprise Linux system

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

basesystem-11-13.el9.noarch

Core kernel modules to match the core kernel

kernel-modules-core-5.14.0-427.35.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.37.1.el9_4.x86_64

kernel-modules-core-5.14.0-427.40.1.el9_4.x86_64

The Linux kernel

kernel-core-5.14.0-427.35.1.el9_4.x86_64

kernel-core-5.14.0-427.37.1.el9_4.x86_64

kernel-core-5.14.0-427.40.1.el9_4.x86_64

Access and modify virtual machine disk images

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

libguestfs-1.50.1-8.el9_4.x86_64

Client side utilities of the libvirt library

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

libvirt-client-10.0.0-6.7.el9_4.x86_64

Libvirt libraries

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

libvirt-libs-10.0.0-6.7.el9_4.x86_64

QEMU driver plugin for the libvirtd daemon

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

libvirt-daemon-driver-qemu-10.0.0-6.7.el9_4.x86_64

NBD server

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

nbdkit-1.36.2-1.el9.x86_64

Basic filters for nbdkit

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

nbdkit-basic-filters-1.36.2-1.el9.x86_64

Basic plugins for nbdkit

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

nbdkit-basic-plugins-1.36.2-1.el9.x86_64

HTTP/FTP (cURL) plugin for nbdkit

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

nbdkit-curl-plugin-1.36.2-1.el9.x86_64

NBD proxy / forward plugin for nbdkit

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

nbdkit-nbd-plugin-1.36.2-1.el9.x86_64

Python 3 plugin for nbdkit

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

nbdkit-python-plugin-1.36.2-1.el9.x86_64

The nbdkit server

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

nbdkit-server-1.36.2-1.el9.x86_64

SSH plugin for nbdkit

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

nbdkit-ssh-plugin-1.36.2-1.el9.x86_64

VMware VDDK plugin for nbdkit

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

nbdkit-vddk-plugin-1.36.2-1.el9.x86_64

QEMU command line tool for manipulating disk images

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

qemu-img-8.2.0-11.el9_4.6.x86_64

QEMU common files needed by all QEMU targets

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

qemu-kvm-common-8.2.0-11.el9_4.6.x86_64

+

qemu-kvm core components

+

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

qemu-kvm-core-8.2.0-11.el9_4.6.x86_64

Convert a virtual machine to run on KVM

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

virt-v2v-2.4.0-4.el9_4.x86_64

+ + +
+ + diff --git a/modules/mtv-settings/index.html b/modules/mtv-settings/index.html new file mode 100644 index 00000000000..e1325a044a8 --- /dev/null +++ b/modules/mtv-settings/index.html @@ -0,0 +1,133 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Configuring MTV settings

+
+

If you have Administrator privileges, you can access the Overview page and change the following settings in it:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Forklift settings
SettingDescriptionDefault value

Max concurrent virtual machine migrations

The maximum number of VMs per plan that can be migrated simultaneously

20

Must gather cleanup after (hours)

The duration for retaining must gather reports before they are automatically deleted

Disabled

Controller main container CPU limit

The CPU limit allocated to the main controller container

500 m

Controller main container Memory limit

The memory limit allocated to the main controller container

800 Mi

Precopy internal (minutes)

The interval at which a new snapshot is requested before initiating a warm migration

60

Snapshot polling interval (seconds)

The frequency with which the system checks the status of snapshot creation or removal during a warm migration

10

+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationOverview. The Settings list is on the right-hand side of the page.

    +
  2. +
  3. +

    In the Settings list, click the Edit icon of the setting you want to change.

    +
  4. +
  5. +

    Choose a setting from the list.

    +
  6. +
  7. +

    Click Save.

    +
  8. +
+
+ + +
+ + diff --git a/modules/mtv-ui/index.html b/modules/mtv-ui/index.html new file mode 100644 index 00000000000..38ecc342ef4 --- /dev/null +++ b/modules/mtv-ui/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

The MTV user interface

+
+

The Forklift user interface is integrated into the OKD web console.

+
+
+

In the left-hand panel, you can choose a page related to a component of the migration progress, for example, Providers for Migration, or, if you are an administrator, you can choose Overview, which contains information about migrations and lets you configure Forklift settings.

+
+
+
+Forklift user interface +
+
Figure 1. Forklift extension interface
+
+
+

In pages related to components, you can click on the Projects list, which is in the upper-left portion of the page, and see which projects (namespaces) you are allowed to work with.

+
+
+
    +
  • +

    If you are an administrator, you can see all projects.

    +
  • +
  • +

    If you are a non-administrator, you can see only the projects that you have permissions to work with.

    +
  • +
+
+ + +
+ + diff --git a/modules/mtv-workflow/index.html b/modules/mtv-workflow/index.html new file mode 100644 index 00000000000..04dc36088ce --- /dev/null +++ b/modules/mtv-workflow/index.html @@ -0,0 +1,113 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

High-level migration workflow

+
+

The high-level workflow shows the migration process from the point of view of the user:

+
+
+
    +
  1. +

    You create a source provider, a target provider, a network mapping, and a storage mapping.

    +
  2. +
  3. +

    You create a Plan custom resource (CR) that includes the following resources:

    +
    +
      +
    • +

      Source provider

      +
    • +
    • +

      Target provider, if Forklift is not installed on the target cluster

      +
    • +
    • +

      Network mapping

      +
    • +
    • +

      Storage mapping

      +
    • +
    • +

      One or more virtual machines (VMs)

      +
    • +
    +
    +
  4. +
  5. +

    You run a migration plan by creating a Migration CR that references the Plan CR.

    +
    +

    If you cannot migrate all the VMs for any reason, you can create multiple Migration CRs for the same Plan CR until all VMs are migrated.

    +
    +
  6. +
  7. +

    For each VM in the Plan CR, the Migration Controller service records the VM migration progress in the Migration CR.

    +
  8. +
  9. +

    Once the data transfer for each VM in the Plan CR completes, the Migration Controller service creates a VirtualMachine CR.

    +
    +

    When all VMs have been migrated, the Migration Controller service updates the status of the Plan CR to Completed. The power state of each source VM is maintained after migration.

    +
    +
  10. +
+
+ + +
+ + diff --git a/modules/network-prerequisites/index.html b/modules/network-prerequisites/index.html new file mode 100644 index 00000000000..a92a4f97f08 --- /dev/null +++ b/modules/network-prerequisites/index.html @@ -0,0 +1,196 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Network prerequisites

+
+
+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    IP addresses, VLANs, and other network configuration settings must not be changed before or during migration. The MAC addresses of the virtual machines are preserved during migration.

    +
  • +
  • +

    The network connections between the source environment, the KubeVirt cluster, and the replication repository must be reliable and uninterrupted.

    +
  • +
  • +

    If you are mapping more than one source and destination network, you must create a network attachment definition for each additional destination network.

    +
  • +
+
+
+
+
+

Ports

+
+
+

The firewalls must enable traffic over the following ports:

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Network ports required for migrating from VMware vSphere
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

VMware vCenter

+

VMware provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer authentication

+

902

TCP

OpenShift nodes

VMware ESXi hosts

+

Disk transfer data copy

+
+ + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Network ports required for migrating from oVirt
PortProtocolSourceDestinationPurpose

443

TCP

OpenShift nodes

oVirt Engine

+

oVirt provider inventory

+
+
+

Disk transfer authentication

+

443

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer authentication

+

54322

TCP

OpenShift nodes

oVirt hosts

+

Disk transfer data copy

+
+
+
+ + +
+ + diff --git a/modules/new-features-and-enhancements-2-7/index.html b/modules/new-features-and-enhancements-2-7/index.html new file mode 100644 index 00000000000..546a3dea8a7 --- /dev/null +++ b/modules/new-features-and-enhancements-2-7/index.html @@ -0,0 +1,85 @@ + + + + + + + + New features and enhancements | Forklift Documentation + + + + + + + + + + + + + +New features and enhancements | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

New features and enhancements

+
+
+
+

Forklift 2.7 introduces the following features and enhancements:

+
+
+
+
+

New features and enhancements 2.7.0

+
+
+
    +
  • +

    In Forklift 2.7.0, warm migration is now based on RHEL 9 inheriting features and bug fixes.

    +
  • +
+
+
+
+ + +
+ + diff --git a/modules/new-migrating-virtual-machines-cli/index.html b/modules/new-migrating-virtual-machines-cli/index.html new file mode 100644 index 00000000000..c31cd1990f4 --- /dev/null +++ b/modules/new-migrating-virtual-machines-cli/index.html @@ -0,0 +1,155 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Procedure
+
    +
  1. +

    Create a Secret manifest for the source provider credentials:

    +
  2. +
+
+
+
    +
  1. +

    Create a Provider manifest for the source provider:

    +
  2. +
  3. +

    Optional: Create a Hook manifest to run custom code on a VM during the phase specified in the Plan CR:

    +
    +
    +
    $  cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Hook
    +metadata:
    +  name: <hook>
    +  namespace: <namespace>
    +spec:
    +  image: quay.io/konveyor/hook-runner
    +  playbook: |
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +

    where:

    +
    +
    +

    playbook refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the image must be hook-runner.

    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    You can use the default hook-runner image or specify a custom image. If you specify a custom image, you do not have to specify a playbook.

    +
    +
    +
    +
  4. +
  5. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <name_of_migration_cr>
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <name_of_plan_cr>
    +    namespace: <namespace>
    +  cutover: <optional_cutover_time>
    +EOF
    +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    If you specify a cutover time, use the ISO 8601 format with the UTC time offset, for example, 2024-04-04T01:23:45.678+09:00.

    +
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/non-admin-permissions-for-ui/index.html b/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 00000000000..fb8ec2bfef7 --- /dev/null +++ b/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,192 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Permissions needed by non-administrators to work with migration plan components

+
+

If you are an administrator, you can work with all components of migration plans (for example, providers, network mappings, and migration plans).

+
+
+

By default, non-administrators have limited ability to work with migration plans and their components. As an administrator, you can modify their roles to allow them full access to all components, or you can give them limited permissions.

+
+
+

For example, administrators can assign non-administrators one or more of the following cluster roles for migration plans:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + +
Table 1. Example migration plan roles and their privileges
RoleDescription

plans.forklift.konveyor.io-v1beta1-view

Can view migration plans but not to create, delete or modify them

plans.forklift.konveyor.io-v1beta1-edit

Can create, delete or modify (all parts of edit permissions) individual migration plans

plans.forklift.konveyor.io-v1beta1-admin

All edit privileges and the ability to delete the entire collection of migration plans

+
+

Note that pre-defined cluster roles include a resource (for example, plans), an API group (for example, forklift.konveyor.io-v1beta1) and an action (for example, view, edit).

+
+
+

As a more comprehensive example, you can grant non-administrators the following set of permissions per namespace:

+
+
+
    +
  • +

    Create and modify storage maps, network maps, and migration plans for the namespaces they have access to

    +
  • +
  • +

    Attach providers created by administrators to storage maps, network maps, and migration plans

    +
  • +
  • +

    Not be able to create providers or to change system settings

    +
  • +
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Example permissions required for non-adminstrators to work with migration plan components but not create providers
ActionsAPI groupResource

get, list, watch, create, update, patch, delete

forklift.konveyor.io

plans

get, list, watch, create, update, patch, delete

forklift.konveyor.io

migrations

get, list, watch, create, update, patch, delete

forklift.konveyor.io

hooks

get, list, watch

forklift.konveyor.io

providers

get, list, watch, create, update, patch, delete

forklift.konveyor.io

networkmaps

get, list, watch, create, update, patch, delete

forklift.konveyor.io

storagemaps

get, list, watch

forklift.konveyor.io

forkliftcontrollers

create, patch, delete

Empty string

secrets

+
+ + + + + +
+
Note
+
+
+

Non-administrators need to have the create permissions that are part of edit roles for network maps and for storage maps to create migration plans, even when using a template for a network map or a storage map.

+
+
+
+ + +
+ + diff --git a/modules/obtaining-console-url/index.html b/modules/obtaining-console-url/index.html new file mode 100644 index 00000000000..b0341a12ed2 --- /dev/null +++ b/modules/obtaining-console-url/index.html @@ -0,0 +1,107 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Getting the Forklift web console URL

+
+

You can get the Forklift web console URL at any time by using either the OKD web console, or the command line.

+
+
+
Prerequisites
+
    +
  • +

    KubeVirt Operator installed.

    +
  • +
  • +

    Forklift Operator installed.

    +
  • +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  • +

    If you are using the OKD web console, follow these steps:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_web.adoc[]

+
+
+
    +
  • +

    If you are using the command line, get the Forklift web console URL with the following command:

    +
  • +
+
+
+

Unresolved directive in obtaining-console-url.adoc - include::snippet_getting_web_console_url_cli.adoc[]

+
+
+

You can now launch a browser and navigate to the Forklift web console.

+
+ + +
+ + diff --git a/modules/openstack-prerequisites/index.html b/modules/openstack-prerequisites/index.html new file mode 100644 index 00000000000..d3d1736b42f --- /dev/null +++ b/modules/openstack-prerequisites/index.html @@ -0,0 +1,76 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+ + +
+ + diff --git a/modules/ostack-app-cred-auth/index.html b/modules/ostack-app-cred-auth/index.html new file mode 100644 index 00000000000..2feaed4635e --- /dev/null +++ b/modules/ostack-app-cred-auth/index.html @@ -0,0 +1,189 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using application credential authentication with an {osp} source provider

+
+

You can use application credential authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of application credential authentication:

+
+
+
    +
  • +

    Application credential ID

    +
  • +
  • +

    Application credential name

    +
  • +
+
+
+

For each type of application credential authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

You have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for application credential authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for application credential authentication, run the following command:

    +
    +
    +
    $ openstack application credential create --role member --role reader --secret redhat forklift
    +
    +
    +
    +

    The output, referred to here as <openstack_credential_output>, includes:

    +
    +
    +
      +
    • +

      The id and secret that you need for authentication using an application credential ID

      +
    • +
    • +

      The name and secret that you need for authentication using an application credential name

      +
    • +
    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using the application credential ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialID: <id_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using the application credential name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-appname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: applicationcredential
      +  applicationCredentialName: <name_from_openstack_credential_output>
      +  applicationCredentialSecret: <secret_from_openstack_credential_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/modules/ostack-token-auth/index.html b/modules/ostack-token-auth/index.html new file mode 100644 index 00000000000..9ac71bd99d8 --- /dev/null +++ b/modules/ostack-token-auth/index.html @@ -0,0 +1,180 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using token authentication with an {osp} source provider

+
+

You can use token authentication, instead of username and password authentication, when you create an {osp} source provider.

+
+
+

Forklift supports both of the following types of token authentication:

+
+
+
    +
  • +

    Token with user ID

    +
  • +
  • +

    Token with user name

    +
  • +
+
+
+

For each type of token authentication, you need to use data from OpenStack to create a Secret manifest.

+
+
+
Prerequisites
+

Have an {osp} account.

+
+
+
Procedure
+
    +
  1. +

    In the dashboard of the {osp} web console, click Project > API Access.

    +
  2. +
  3. +

    Expand Download OpenStack RC file and click OpenStack RC file.

    +
    +

    The file that is downloaded, referred to here as <openstack_rc_file>, includes the following fields used for token authentication:

    +
    +
    +
    +
    OS_AUTH_URL
    +OS_PROJECT_ID
    +OS_PROJECT_NAME
    +OS_DOMAIN_NAME
    +OS_USERNAME
    +
    +
    +
  4. +
  5. +

    To get the data needed for token authentication, run the following command:

    +
    +
    +
    $ openstack token issue
    +
    +
    +
    +

    The output, referred to here as <openstack_token_output>, includes the token, userID, and projectID that you need for authentication using a token with user ID.

    +
    +
  6. +
  7. +

    Create a Secret manifest similar to the following:

    +
    +
      +
    • +

      For authentication using a token with user ID:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenid
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  projectID: <projectID_from_openstack_token_output>
      +  userID: <userID_from_openstack_token_output>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    • +

      For authentication using a token with user name:

      +
      +
      +
      cat << EOF | oc apply -f -
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: openstack-secret-tokenname
      +  namespace: openshift-mtv
      +  labels:
      +    createdForProviderType: openstack
      +type: Opaque
      +stringData:
      +  authType: token
      +  token: <token_from_openstack_token_output>
      +  domainName: <OS_DOMAIN_NAME_from_openstack_rc_file>
      +  projectName: <OS_PROJECT_NAME_from_openstack_rc_file>
      +  username: <OS_USERNAME_from_openstack_rc_file>
      +  url: <OS_AUTH_URL_from_openstack_rc_file>
      +EOF
      +
      +
      +
    • +
    +
    +
  8. +
  9. +

    Continue migrating your virtual machine according to the procedure in Migrating virtual machines, starting with step 2, "Create a Provider manifest for the source provider."

    +
  10. +
+
+ + +
+ + diff --git a/modules/ova-prerequisites/index.html b/modules/ova-prerequisites/index.html new file mode 100644 index 00000000000..9f9084a095f --- /dev/null +++ b/modules/ova-prerequisites/index.html @@ -0,0 +1,130 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Open Virtual Appliance (OVA) prerequisites

+
+

The following prerequisites apply to Open Virtual Appliance (OVA) file migrations:

+
+
+
    +
  • +

    All OVA files are created by VMware vSphere.

    +
  • +
+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+
    +
  • +

    The OVA files are in one or more folders under an NFS shared directory in one of the following structures:

    +
    +
      +
    • +

      In one or more compressed Open Virtualization Format (OVF) packages that hold all the VM information.

      +
      +

      The filename of each compressed package must have the .ova extension. Several compressed packages can be stored in the same folder.

      +
      +
      +

      When this structure is used, Forklift scans the root folder and the first-level subfolders for compressed packages.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The folder /nfs is scanned.
      +The folder /nfs/subfolder1 is scanned.
      +But, /nfs/subfolder1/subfolder2 is not scanned.

      +
      +
    • +
    • +

      In extracted OVF packages.

      +
      +

      When this structure is used, Forklift scans the root folder, first-level subfolders, and second-level subfolders for extracted OVF packages. +However, there can be only one .ovf file in a folder. Otherwise, the migration will fail.

      +
      +
      +

      For example, if the NFS share is, /nfs, then:
      +The OVF file /nfs/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/vm.ovf is scanned.
      +The OVF file /nfs/subfolder1/subfolder2/vm.ovf is scanned.
      +But, the OVF file /nfs/subfolder1/subfolder2/subfolder3/vm.ovf is not scanned.

      +
      +
    • +
    +
    +
  • +
+
+ + +
+ + diff --git a/modules/retrieving-validation-service-json/index.html b/modules/retrieving-validation-service-json/index.html new file mode 100644 index 00000000000..383cfb40546 --- /dev/null +++ b/modules/retrieving-validation-service-json/index.html @@ -0,0 +1,483 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving the Inventory service JSON

+
+

You retrieve the Inventory service JSON by sending an Inventory service query to a virtual machine (VM). The output contains an "input" key, which contains the inventory attributes that are queried by the Validation service rules.

+
+
+

You can create a validation rule based on any attribute in the "input" key, for example, input.snapshot.kind.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Trigger an HTTP GET request (for example, using Curl):

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers -k
    +
    +
    +
  8. +
  9. +

    Retrieve the UUID of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider> -k (1)
    +
    +
    +
    +
      +
    1. +

      Allowed values for the provider are vsphere, ovirt, and openstack.

      +
    2. +
    +
    +
  10. +
  11. +

    Retrieve the VMs of a provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/vms -k
    +
    +
    +
  12. +
  13. +

    Retrieve the details of a VM:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm> -k
    +
    +
    +
    +
    Example output
    +
    +
    {
    +    "input": {
    +        "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
    +        "id": "vm-431",
    +        "parent": {
    +            "kind": "Folder",
    +            "id": "group-v22"
    +        },
    +        "revision": 1,
    +        "name": "iscsi-target",
    +        "revisionValidated": 1,
    +        "isTemplate": false,
    +        "networks": [
    +            {
    +                "kind": "Network",
    +                "id": "network-31"
    +            },
    +            {
    +                "kind": "Network",
    +                "id": "network-33"
    +            }
    +        ],
    +        "disks": [
    +            {
    +                "key": 2000,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 17179869184,
    +                "shared": false,
    +                "rdm": false
    +            },
    +            {
    +                "key": 2001,
    +                "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
    +                "datastore": {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                },
    +                "capacity": 10737418240,
    +                "shared": false,
    +                "rdm": false
    +            }
    +        ],
    +        "concerns": [],
    +        "policyVersion": 5,
    +        "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
    +        "firmware": "bios",
    +        "powerState": "poweredOn",
    +        "connectionState": "connected",
    +        "snapshot": {
    +            "kind": "VirtualMachineSnapshot",
    +            "id": "snapshot-3034"
    +        },
    +        "changeTrackingEnabled": false,
    +        "cpuAffinity": [
    +            0,
    +            2
    +        ],
    +        "cpuHotAddEnabled": true,
    +        "cpuHotRemoveEnabled": false,
    +        "memoryHotAddEnabled": false,
    +        "faultToleranceEnabled": false,
    +        "cpuCount": 2,
    +        "coresPerSocket": 1,
    +        "memoryMB": 2048,
    +        "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
    +        "balloonedMemory": 0,
    +        "ipAddress": "10.19.2.96",
    +        "storageUsed": 30436770129,
    +        "numaNodeAffinity": [
    +            "0",
    +            "1"
    +        ],
    +        "devices": [
    +            {
    +                "kind": "RealUSBController"
    +            }
    +        ],
    +        "host": {
    +            "id": "host-29",
    +            "parent": {
    +                "kind": "Cluster",
    +                "id": "domain-c26"
    +            },
    +            "revision": 1,
    +            "name": "IP address or host name of the vCenter host or oVirt Engine host",
    +            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
    +            "status": "green",
    +            "inMaintenance": false,
    +            "managementServerIp": "10.19.2.96",
    +            "thumbprint": <thumbprint>,
    +            "timezone": "UTC",
    +            "cpuSockets": 2,
    +            "cpuCores": 16,
    +            "productName": "VMware ESXi",
    +            "productVersion": "6.5.0",
    +            "networking": {
    +                "pNICs": [
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic0",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic1",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic2",
    +                        "linkSpeed": 10000
    +                    },
    +                    {
    +                        "key": "key-vim.host.PhysicalNic-vmnic3",
    +                        "linkSpeed": 10000
    +                    }
    +                ],
    +                "vNICs": [
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk2",
    +                        "portGroup": "VM_Migration",
    +                        "dPortGroup": "",
    +                        "ipAddress": "192.168.79.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 9000
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk0",
    +                        "portGroup": "Management Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.13",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk1",
    +                        "portGroup": "Storage Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "172.31.2.13",
    +                        "subnetMask": "255.255.0.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk3",
    +                        "portGroup": "",
    +                        "dPortGroup": "dvportgroup-48",
    +                        "ipAddress": "192.168.61.13",
    +                        "subnetMask": "255.255.255.0",
    +                        "mtu": 1500
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualNic-vmk4",
    +                        "portGroup": "VM_DHCP_Network",
    +                        "dPortGroup": "",
    +                        "ipAddress": "10.19.2.231",
    +                        "subnetMask": "255.255.255.128",
    +                        "mtu": 1500
    +                    }
    +                ],
    +                "portGroups": [
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM Network",
    +                        "name": "VM Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Management Network",
    +                        "name": "Management Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_10G_Network",
    +                        "name": "VM_10G_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Storage",
    +                        "name": "VM_Storage",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_DHCP_Network",
    +                        "name": "VM_DHCP_Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-Storage Network",
    +                        "name": "Storage Network",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Isolated_67",
    +                        "name": "VM_Isolated_67",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    },
    +                    {
    +                        "key": "key-vim.host.PortGroup-VM_Migration",
    +                        "name": "VM_Migration",
    +                        "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
    +                    }
    +                ],
    +                "switches": [
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch0",
    +                        "name": "vSwitch0",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM Network",
    +                            "key-vim.host.PortGroup-Management Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic4"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch1",
    +                        "name": "vSwitch1",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_10G_Network",
    +                            "key-vim.host.PortGroup-VM_Storage",
    +                            "key-vim.host.PortGroup-VM_DHCP_Network",
    +                            "key-vim.host.PortGroup-Storage Network"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic2",
    +                            "key-vim.host.PhysicalNic-vmnic0"
    +                        ]
    +                    },
    +                    {
    +                        "key": "key-vim.host.VirtualSwitch-vSwitch2",
    +                        "name": "vSwitch2",
    +                        "portGroups": [
    +                            "key-vim.host.PortGroup-VM_Isolated_67",
    +                            "key-vim.host.PortGroup-VM_Migration"
    +                        ],
    +                        "pNICs": [
    +                            "key-vim.host.PhysicalNic-vmnic3",
    +                            "key-vim.host.PhysicalNic-vmnic1"
    +                        ]
    +                    }
    +                ]
    +            },
    +            "networks": [
    +                {
    +                    "kind": "Network",
    +                    "id": "network-31"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-34"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-57"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "network-33"
    +                },
    +                {
    +                    "kind": "Network",
    +                    "id": "dvportgroup-47"
    +                }
    +            ],
    +            "datastores": [
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-35"
    +                },
    +                {
    +                    "kind": "Datastore",
    +                    "id": "datastore-63"
    +                }
    +            ],
    +            "vms": null,
    +            "networkAdapters": [],
    +            "cluster": {
    +                "id": "domain-c26",
    +                "parent": {
    +                    "kind": "Folder",
    +                    "id": "group-h23"
    +                },
    +                "revision": 1,
    +                "name": "mycluster",
    +                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
    +                "folder": "group-h23",
    +                "networks": [
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-31"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-34"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-57"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "network-33"
    +                    },
    +                    {
    +                        "kind": "Network",
    +                        "id": "dvportgroup-47"
    +                    }
    +                ],
    +                "datastores": [
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-35"
    +                    },
    +                    {
    +                        "kind": "Datastore",
    +                        "id": "datastore-63"
    +                    }
    +                ],
    +                "hosts": [
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-44"
    +                    },
    +                    {
    +                        "kind": "Host",
    +                        "id": "host-29"
    +                    }
    +                ],
    +                "dasEnabled": false,
    +                "dasVms": [],
    +                "drsEnabled": true,
    +                "drsBehavior": "fullyAutomated",
    +                "drsVms": [],
    +                "datacenter": null
    +            }
    +        }
    +    }
    +}
    +
    +
    +
  14. +
+
+ + +
+ + diff --git a/modules/retrieving-vmware-moref/index.html b/modules/retrieving-vmware-moref/index.html new file mode 100644 index 00000000000..c09e1e37969 --- /dev/null +++ b/modules/retrieving-vmware-moref/index.html @@ -0,0 +1,149 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Retrieving a VMware vSphere moRef

+
+

When you migrate VMs with a VMware vSphere source provider using Forklift from the CLI, you need to know the managed object reference (moRef) of certain entities in vSphere, such as datastores, networks, and VMs.

+
+
+

You can retrieve the moRef of one or more vSphere entities from the Inventory service. You can then use each moRef as a reference for retrieving the moRef of another entity.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the routes for the project:

    +
    +
    +
    oc get route -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Retrieve the Inventory service route:

    +
    +
    +
    $ kubectl get route <inventory_service> -n konveyor-forklift
    +
    +
    +
  4. +
  5. +

    Retrieve the access token:

    +
    +
    +
    $ TOKEN=$(oc whoami -t)
    +
    +
    +
  6. +
  7. +

    Retrieve the moRef of a VMware vSphere provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere -k
    +
    +
    +
  8. +
  9. +

    Retrieve the datastores of a VMware vSphere source provider:

    +
    +
    +
    $ curl -H "Authorization: Bearer $TOKEN"  https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k
    +
    +
    +
    +
    Example output
    +
    +
    [
    +  {
    +    "id": "datastore-11",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC",
    +    "revision": 46,
    +    "name": "v2v_general_porpuse_ISCSI_DC",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11"
    +  },
    +  {
    +    "id": "datastore-730",
    +    "parent": {
    +      "kind": "Folder",
    +      "id": "group-s5"
    +    },
    +    "path": "/Datacenter/datastore/f01-h27-640-SSD_2",
    +    "revision": 46,
    +    "name": "f01-h27-640-SSD_2",
    +    "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730"
    +  },
    + ...
    +
    +
    +
  10. +
+
+
+

In this example, the moRef of the datastore v2v_general_porpuse_ISCSI_DC is datastore-11 and the moRef of the datastore f01-h27-640-SSD_2 is datastore-730.

+
+ + +
+ + diff --git a/modules/rhv-prerequisites/index.html b/modules/rhv-prerequisites/index.html new file mode 100644 index 00000000000..2eedb8a52b2 --- /dev/null +++ b/modules/rhv-prerequisites/index.html @@ -0,0 +1,129 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+
    +
  • +

    To create a source provider, you must have at least the UserRole and ReadOnlyAdmin roles assigned to you. These are the minimum required permissions, however, any other administrator or superuser permissions will also work.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

You must keep the UserRole and ReadOnlyAdmin roles until the virtual machines of the source provider have been migrated. Otherwise, the migration will fail.

+
+
+
+
+
    +
  • +

    To migrate virtual machines:

    +
    +
      +
    • +

      You must have one of the following:

      +
      +
        +
      • +

        oVirt admin permissions. These permissions allow you to migrate any virtual machine in the system.

        +
      • +
      • +

        DiskCreator and UserVmManager permissions on every virtual machine you want to migrate.

        +
      • +
      +
      +
    • +
    • +

      You must use a compatible version of oVirt.

      +
    • +
    • +

      You must have the Engine CA certificate, unless it was replaced by a third-party certificate, in which case, specify the Engine Apache CA certificate.

      +
      +

      You can obtain the Engine CA certificate by navigating to https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA in a browser.

      +
      +
    • +
    • +

      If you are migrating a virtual machine with a direct LUN disk, ensure that the nodes in the KubeVirt destination cluster that the VM is expected to run on can access the backend storage.

      +
    • +
    +
    +
  • +
+
+
+

Unresolved directive in rhv-prerequisites.adoc - include::snip-migrating-luns.adoc[]

+
+ + +
+ + diff --git a/modules/rn-2.0/index.html b/modules/rn-2.0/index.html new file mode 100644 index 00000000000..29fcfa8cf03 --- /dev/null +++ b/modules/rn-2.0/index.html @@ -0,0 +1,163 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.0

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Warm migration
+

Warm migration reduces downtime by copying most of the VM data during a precopy stage while the VMs are running. During the cutover stage, the VMs are stopped and the rest of the data is copied.

+
+
+
Cancel migration
+

You can cancel an entire migration plan or individual VMs while a migration is in progress. A canceled migration plan can be restarted in order to migrate the remaining VMs.

+
+
+
Migration network
+

You can select a migration network for the source and target providers for improved performance. By default, data is copied using the VMware administration network and the OKD pod network.

+
+
+
Validation service
+

The validation service checks source VMs for issues that might affect migration and flags the VMs with concerns in the migration plan.

+
+
+ + + + + +
+
Important
+
+
+

The validation service is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+
+
+
+

Known issues

+
+
+

This section describes known issues and mitigations.

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Network map displays a "Destination network not found" error
+

If the network map remains in a NotReady state and the NetworkMap manifest displays a Destination network not found error, the cause is a missing network attachment definition. You must create a network attachment definition for each additional destination network before you create the network map. (BZ#1971259)

+
+
+
Warm migration gets stuck during third precopy
+

Warm migration uses changed block tracking snapshots to copy data during the precopy stage. The snapshots are created at one-hour intervals by default. When a snapshot is created, its contents are copied to the destination cluster. However, when the third snapshot is created, the first snapshot is deleted and the block tracking is lost. (BZ#1969894)

+
+
+

You can do one of the following to mitigate this issue:

+
+
+
    +
  • +

    Start the cutover stage no more than one hour after the precopy stage begins so that only one internal snapshot is created.

    +
  • +
  • +

    Increase the snapshot interval in the vm-import-controller-config config map to 720 minutes:

    +
    +
    +
    $ kubectl patch configmap/vm-import-controller-config \
    +  -n openshift-cnv -p '{"data": \
    +  {"warmImport.intervalMinutes": "720"}}'
    +
    +
    +
  • +
+
+
+
+ + +
+ + diff --git a/modules/rn-2.1/index.html b/modules/rn-2.1/index.html new file mode 100644 index 00000000000..7f3576bd69a --- /dev/null +++ b/modules/rn-2.1/index.html @@ -0,0 +1,191 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.1

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe new features and enhancements, known issues, and technical changes.

+
+
+
+
+

Technical changes

+
+
+
VDDK image added to HyperConverged custom resource
+

The VMware Virtual Disk Development Kit (VDDK) SDK image must be added to the HyperConverged custom resource. Before this release, it was referenced in the v2v-vmware config map.

+
+
+
+
+

New features and enhancements

+
+
+

This release adds the following features and improvements.

+
+
+
Cold migration from oVirt
+

You can perform a cold migration of VMs from oVirt.

+
+
+
Migration hooks
+

You can create migration hooks to run Ansible playbooks or custom code before or after migration.

+
+
+
Filtered must-gather data collection
+

You can specify options for the must-gather tool that enable you to filter the data by namespace, migration plan, or VMs.

+
+
+
SR-IOV network support
+

You can migrate VMs with a single root I/O virtualization (SR-IOV) network interface if the KubeVirt environment has an SR-IOV network.

+
+
+
+
+

Known issues

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Disk copy stage does not progress
+

The disk copy stage of a oVirt VM does not progress and the Forklift web console does not display an error message. (BZ#1990596)

+
+
+

The cause of this problem might be one of the following conditions:

+
+
+
    +
  • +

    The storage class does not exist on the target cluster.

    +
  • +
  • +

    The VDDK image has not been added to the HyperConverged custom resource.

    +
  • +
  • +

    The VM does not have a disk.

    +
  • +
  • +

    The VM disk is locked.

    +
  • +
  • +

    The VM time zone is not set to UTC.

    +
  • +
  • +

    The VM is configured for a USB device.

    +
  • +
+
+
+

To disable USB devices, see Configuring USB Devices in the Red Hat Virtualization documentation.

+
+
+

To determine the cause:

+
+
+
    +
  1. +

    Click WorkloadsVirtualization in the OKD web console.

    +
  2. +
  3. +

    Click the Virtual Machines tab.

    +
  4. +
  5. +

    Select a virtual machine to open the Virtual Machine Overview screen.

    +
  6. +
  7. +

    Click Status to view the status of the virtual machine.

    +
  8. +
+
+
+
VM time zone must be UTC with no offset
+

The time zone of the source VMs must be UTC with no offset. You can set the time zone to GMT Standard Time after first assessing the potential impact on the workload. (BZ#1993259)

+
+
+
oVirt resource UUID causes a "Provider not found" error
+

If a oVirt resource UUID is used in a Host, NetworkMap, StorageMap, or Plan custom resource (CR), a "Provider not found" error is displayed.

+
+
+

You must use the resource name. (BZ#1994037)

+
+
+
Same oVirt resource name in different data centers causes ambiguous reference
+

If a oVirt resource name is used in a NetworkMap, StorageMap, or Plan custom resource (CR) and if the same resource name exists in another data center, the Plan CR displays a critical "Ambiguous reference" condition. You must rename the resource or use the resource UUID in the CR.

+
+
+

In the web console, the resource name appears twice in the same list without a data center reference to distinguish them. You must rename the resource. (BZ#1993089)

+
+
+
Snapshots are not deleted after warm migration
+

Snapshots are not deleted automatically after a successful warm migration of a VMware VM. You must delete the snapshots manually in VMware vSphere. (BZ#2001270)

+
+
+
+ + +
+ + diff --git a/modules/rn-2.2/index.html b/modules/rn-2.2/index.html new file mode 100644 index 00000000000..87d93197939 --- /dev/null +++ b/modules/rn-2.2/index.html @@ -0,0 +1,219 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.2

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the precopy time interval for warm migration
+

You can set the time interval between snapshots taken during the precopy stage of warm migration.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Creating validation rules
+

You can create custom validation rules to check the suitability of VMs for migration. Validation rules are based on the VM attributes collected by the Provider Inventory service and written in Rego, the Open Policy Agent native query language.

+
+
+
Downloading logs by using the web console
+

You can download logs for a migration plan or a migrated VM by using the Forklift web console.

+
+
+
Duplicating a migration plan by using the web console
+

You can duplicate a migration plan by using the web console, including its VMs, mappings, and hooks, in order to edit the copy and run as a new migration plan.

+
+
+
Archiving a migration plan by using the web console
+

You can archive a migration plan by using the MTV web console. Archived plans can be viewed or duplicated. They cannot be run, edited, or unarchived.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Certain Validation service issues do not block migration
+

Certain Validation service issues, which are marked as Critical and display the assessment text, The VM will not be migrated, do not block migration. (BZ#2025977)

+
+
+

The following Validation service assessments do not block migration:

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Issues that do not block migration
AssessmentResult

The disk interface type is not supported by OpenShift Virtualization (only sata, virtio_scsi and virtio interface types are currently supported).

The migrated VM will have a virtio disk if the source interface is not recognized.

The NIC interface type is not supported by OpenShift Virtualization (only e1000, rtl8139 and virtio interface types are currently supported).

The migrated VM will have a virtio NIC if the source interface is not recognized.

The VM is using a vNIC profile configured for host device passthrough, which is not currently supported by OpenShift Virtualization.

The migrated VM will have an SR-IOV NIC. The destination network must be set up correctly.

One or more of the VM’s disks has an illegal or locked status condition.

The migration will proceed but the disk transfer is likely to fail.

The VM has a disk with a storage type other than image, and this is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has one or more snapshots with disks in ILLEGAL state. This is not currently supported by OpenShift Virtualization.

The migration will proceed but the disk transfer is likely to fail.

The VM has USB support enabled, but USB devices are not currently supported by OpenShift Virtualization.

The migrated VM will not have USB devices.

The VM is configured with a watchdog device, which is not currently supported by OpenShift Virtualization.

The migrated VM will not have a watchdog device.

The VM’s status is not up or down.

The migration will proceed but it might hang if the VM cannot be powered off.

+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Missing resource causes error message in current.log file
+

If a resource does not exist, for example, if the virt-launcher pod does not exist because the migrated VM is powered off, its log is unavailable.

+
+
+

The following error appears in the missing resource’s current.log file when it is downloaded from the web console or created with the must-gather tool: error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'. (BZ#2023260)

+
+
+
Importer pod log is unavailable after warm migration
+

Retaining the importer pod for debug purposes causes warm migration to hang during the precopy stage. (BZ#2016290)

+
+
+

As a temporary workaround, the importer pod is removed at the end of the precopy stage so that the precopy succeeds. However, this means that the importer pod log is not retained after warm migration is complete. You can only view the importer pod log by using the oc logs -f <cdi-importer_pod> command during the precopy stage.

+
+
+

This issue only affects the importer pod log and warm migration. Cold migration and the virt-v2v logs are not affected.

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Network, storage, and VM referenced by name in the Plan CR are not displayed in the web console.
+

If a Plan CR references storage, network, or VMs by name instead of by ID, the resources do not appear in the Forklift web console. The migration plan cannot be edited or duplicated. (BZ#1986020)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
If a target VM is deleted during migration, its migration status is Succeeded in the Plan CR
+

If you delete a target VirtualMachine CR during the 'Convert image to kubevirt' step of the migration, the Migration details page of the web console displays the state of the step as VirtualMachine CR not found. However, the status of the VM migration is Succeeded in the Plan CR file and in the web console. (BZ#2031529)

+
+
+
+ + +
+ + diff --git a/modules/rn-2.3/index.html b/modules/rn-2.3/index.html new file mode 100644 index 00000000000..56e528bf60a --- /dev/null +++ b/modules/rn-2.3/index.html @@ -0,0 +1,156 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.3

+
+
+
+

You can migrate virtual machines (VMs) from VMware vSphere or oVirt to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Setting the VddkInitImage path is part of the procedure of adding VMware provider.
+

In the web console, you enter the VddkInitImage path when adding a VMware provider. Alternatively, from the CLI, you add the VddkInitImage path to the Provider CR for VMware migrations.

+
+
+
The StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS. The documentation includes a link to the relevant procedure.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Forklift 2.3 supports warm migration from oVirt
+

You can use warm migration to migrate VMs from both VMware and oVirt.

+
+
+
The minimal sufficient set of privileges for VMware users is established
+

VMware users do not have to have full cluster-admin privileges to perform a VM migration. The minimal sufficient set of user’s privileges is established and documented.

+
+
+
Forklift documentation is updated with instructions on using hooks
+

Forklift documentation includes instructions on adding hooks to migration plans and running hooks on VMs.

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Some warm migrations from oVirt might fail
+

When you run a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run. (BZ#2063531)

+
+
+
Snapshots are not deleted after warm migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. You can delete the snapshots manually. (BZ#22053183)

+
+
+
Warm migration from oVirt fails if a snapshot operation is performed on the source VM
+

If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (BZ#2057459)

+
+
+
QEMU guest agent is not installed on migrated VMs
+

The QEMU guest agent is not installed on migrated VMs. Workaround: Install the QEMU guest agent with a post-migration hook. (BZ#2018062)

+
+
+
Deleting migration plan does not remove temporary resources.
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. (BZ#2018974) You must archive a migration plan before deleting it in order to clean up the temporary resources.

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Migration plan details page of the web console does not describe the reason for the failure. (BZ#2008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If you delete a migration plan and then run a new migration plan with the same name or if you delete a migrated VM and then remigrate the source VM, the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

The problem occurs for both vSphere and oVirt migrations.

+
+
+
Forklift 2.3.4 only: When the source provider is oVirt, duplicating a migration plan fails in either the network mapping stage or the storage mapping stage.
+

Possible workaround: Delete cache in the browser or restart the browser. (BZ#2143191)

+
+
+
+ + +
+ + diff --git a/modules/rn-2.4/index.html b/modules/rn-2.4/index.html new file mode 100644 index 00000000000..9d59585ff00 --- /dev/null +++ b/modules/rn-2.4/index.html @@ -0,0 +1,260 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.4

+
+
+
+

Migrate virtual machines (VMs) from VMware vSphere or oVirt or {osp} to KubeVirt with Forklift.

+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Faster disk image migration from oVirt
+

Disk images are not converted anymore using virt-v2v when migrating from oVirt. This change speeds up migrations and also allows migration for guest operating systems that are not supported by virt-vsv. (forklift-controller#403)

+
+
+
Faster disk transfers by ovirt-imageio client (ovirt-img)
+

Disk transfers use ovirt-imageio client (ovirt-img) instead of Containerized Data Import (CDI) when migrating from RHV to the local OpenShift Container Platform cluster, accelerating the migration.

+
+
+
Faster migration using conversion pod disk transfer
+

When migrating from vSphere to the local OpenShift Container Platform cluster, the conversion pod transfers the disk data instead of Containerized Data Importer (CDI), accelerating the migration.

+
+
+
Migrated virtual machines are not scheduled on the target OCP cluster
+

The migrated virtual machines are no longer scheduled on the target OpenShift Container Platform cluster. This enables migrating VMs that cannot start due to limit constraints on the target at migration time.

+
+
+
StorageProfile resource needs to be updated for a non-provisioner storage class
+

You must update the StorageProfile resource with accessModes and volumeMode for non-provisioner storage classes such as NFS.

+
+
+
VDDK 8 can be used in the VDDK image
+

Previous versions of Forklift supported only using VDDK version 7 for the VDDK image. Forklift supports both versions 7 and 8, as follows:

+
+
+
    +
  • +

    If you are migrating to OCP 4.12 or earlier, use VDDK version 7.

    +
  • +
  • +

    If you are migrating to OCP 4.13 or later, use VDDK version 8.

    +
  • +
+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
OpenStack migration
+

Forklift now supports migrations with {osp} as a source provider. This feature is a provided as a Technology Preview and only supports cold migrations.

+
+
+
OCP console plugin
+

The Forklift Operator now integrates the Forklift web console into the OKD web console. The new UI operates as an OCP Console plugin that adds the sub-menu Migration to the navigation bar. It is implemented in version 2.4, disabling the old UI. You can enable the old UI by setting feature_ui: true in ForkliftController. (MTV-427)

+
+
+
Skip certification option
+

'Skip certificate validation' option was added to VMware and oVirt providers. If selected, the provider’s certificate will not be validated and the UI will not ask for specifying a CA certificate.

+
+
+
Only third-party certificate required
+

Only the third-party certificate needs to be specified when defining a oVirt provider that sets with the Manager CA certificate.

+
+
+
Conversion of VMs with RHEL9 guest operating system
+

Cold migrations from vSphere to a local Red Hat OpenShift cluster use virt-v2v on RHEL 9. (MTV-332)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Log archive file includes logs of a deleted migration plan or VM
+

If deleting a migration plan and then running a new migration plan with the same name, or if deleting a migrated VM and then remigrate the source VM, then the log archive file created by the Forklift web console might include the logs of the deleted migration plan or VM. (BZ#2023764)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack don’t fail, but the encryption key may be missing on the target OCP cluster.

+
+
+
Snapshots that are created during the migration in OpenStack are not deleted
+

The Migration Controller service does not delete snapshots that are created during the migration for source virtual machines in OpenStack automatically. Workaround: the snapshots can be removed manually on OpenStack.

+
+
+
oVirt snapshots are not deleted after a successful migration
+

The Migration Controller service does not delete snapshots automatically after a successful warm migration of a oVirt VM. Workaround: Snapshots can be removed from oVirt instead. (MTV-349)

+
+
+
Migration fails during precopy/cutover while a snapshot operation is executed on the source VM
+

Some warm migrations from oVirt might fail. When running a migration plan for warm migration of multiple VMs from oVirt, the migrations of some VMs might fail during the cutover stage. In that case, restart the migration plan and set the cutover time for the VM migrations that failed in the first run.

+
+
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If the user performs a snapshot operation on the source VM at the time when a migration snapshot is scheduled, the migration fails instead of waiting for the user’s snapshot operation to finish. (MTV-456)

+
+
+
Cannot schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it may result in a VM that cannot be scheduled. Workaround: It is recommended to use shared storage on the target OCP cluster.

+
+
+
Deleting migrated VM does not remove PVC and PV
+

When removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) are not deleted. Workaround: remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

When a migration fails, its PVCs and PVs are not deleted as expected when its migration plan is archived and deleted. Workaround: Remove the CDI importer pods and then remove the remaining PVCs and PVs. (MTV-493)

+
+
+
VM with multiple disks may boot from non-bootable disk after migration
+

VM with multiple disks that was migrated might not be able to boot on the target OCP cluster. Workaround: Set the boot order appropriately to boot from the bootable disk. (MTV-433)

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OCP clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OCP cluster. It is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system may start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, their network interfaces could be disabled when they start in OpenShift Virtualization. (MTV-491)

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. The user needs to refresh the OCP Console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of MTV, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in MTV 2.4.3 and 2.5.2. It is advised to update to one of these versions of MTV or later.

+
+ +
+
Improve invalid/conflicting VM name handling
+

Improve the automatic renaming of VMs during migration to fit RFC 1123. This feature that was introduced in 2.3.4 is enhanced to cover more special cases. (MTV-212)

+
+
+
Prevent locking user accounts due to incorrect credentials
+

If a user specifies an incorrect password for oVirt providers, they are no longer locked in oVirt. An error returns when the oVirt manager is accessible and adding the provider. If the oVirt manager is inaccessible, the provider is added, but there would be no further attempt after failing, due to incorrect credentials. (MTV-324)

+
+
+
Users without cluster-admin role can create new providers
+

Previously, the cluster-admin role was required to browse and create providers. In this release, users with sufficient permissions on MTV resources (providers, plans, migrations, NetworkMaps, StorageMaps, hooks) can operate MTV without cluster-admin permissions. (MTV-334)

+
+
+
Convert i440fx to q35
+

Migration of virtual machines with i440fx chipset is now supported. The chipset is converted to q35 during the migration. (MTV-430)

+
+
+
Preserve the UUID setting in SMBIOS for a VM that is migrated from oVirt
+

The Universal Unique ID (UUID) number within the System Management BIOS (SMBIOS) no longer changes for VMs that are migrated from oVirt. This enhancement enables applications that operate within the guest operating system and rely on this setting, such as for licensing purposes, to operate on the target OCP cluster in a manner similar to that of oVirt. (MTV-597)

+
+
+
Do not expose password for oVirt in error messages
+

Previously, the password that was specified for oVirt manager appeared in error messages that were displayed in the web console and logs when failing to connect to oVirt. In this release, error messages that are generated when failing to connect to oVirt do not reveal the password for oVirt manager.

+
+
+
QEMU guest agent is now installed on migrated VMs
+

The QEMU guest agent is installed on VMs during cold migration from vSphere. (BZ#2018062)

+
+
+
+ + +
+ + diff --git a/modules/rn-2.5/index.html b/modules/rn-2.5/index.html new file mode 100644 index 00000000000..61ec3bbc6df --- /dev/null +++ b/modules/rn-2.5/index.html @@ -0,0 +1,464 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.5

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, and known issues for Forklift.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version of Forklift, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

Forklift enables migrations from vSphere source providers by not enforcing Enterprise Master Secret (EMS). This enables migrating from all vSphere versions that Forklift supports, including migrations that do not meet 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of the create and update providers now aligns with the look and feel of the OKD web console and displays up-to-date data.

+
+
+
Standalone UI
+

The old UI of Forklift 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
Support deployment on {ocp-name} 4.15
+

Forklift 2.5.6 can be deployed on {ocp-name} 4.15 clusters.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration of OVA files from VMware vSphere
+

In Forklift 2.3, you can migrate using Open Virtual Appliance (OVA) files that were created by VMware vSphere as source providers. (MTV-336)

+
+
+ + + + + +
+
Note
+
+
+

Migration of OVA files that were not created by VMware vSphere but are compatible with vSphere might succeed. However, migration of such files is not supported by Forklift. Forklift supports only OVA files created by VMware vSphere.

+
+
+
+
+

Unresolved directive in rn-2.5.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+
Migrating VMs between OKD clusters
+

In Forklift 2.3, you can now use Red Hat KubeVirt provider as a source provider and a destination provider. You can migrate VMs from the cluster that Forklift is deployed on to another cluster, or from a remote cluster to the cluster that Forklift is deployed on. (MTV-571)

+
+
+
Migration of VMs with direct LUNs from RHV
+

During the migration from oVirt (oVirt), direct Logical Units (LUNs) are detached from the source virtual machines and attached to the target virtual machines. Note that this mechanism does not work yet for Fibre Channel. (MTV-329)

+
+
+
Additional authentication methods for OpenStack
+

In addition to standard password authentication, Forklift supports the following authentication methods: Token authentication and Application credential authentication. (MTV-539)

+
+
+
Validation rules for OpenStack
+

The validation service includes default validation rules for virtual machines from OpenStack. (MTV-508)

+
+
+
VDDK is now optional for VMware vSphere providers
+

You can now create the VMware vSphere source provider without specifying a VMware Virtual Disk Development Kit (VDDK) init image. It is strongly recommended you create a VDDK init image to accelerate migrations.

+
+
+
Deployment on OKE enabled
+

In Forklift 2.5.3, deployment on {ocp-name} Kubernetes Engine (OKE) has been enabled. For more information, see About {ocp-name} Kubernetes Engine. (MTV-803)

+
+
+
Migration of VMs to destination storage classes with encrypted RBD now supported
+

In Forklift 2.5.4, migration of VMs to destination storage classes that have encrypted RADOS Block Devices (RBD) volumes is now supported.

+
+
+

To make use of this new feature, set the value of the parameter controller_block_overhead to 1Gi, following the procedure in Configuring the MTV Operator. (MTV-851)

+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+
Deleting migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during conversion
+

vSphere only: Migrations from oVirt and OpenStack do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage classes of type hostPath
+

When migrating a VM with multiple disks to more than one storage classes of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support all types of guest operating systems that are supported in cold migrations to the local OKD cluster. This is a consequence of using RHEL 8 in the former case and RHEL 9 in the latter case.
+See Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 for the list of supported guest operating systems.

+
+
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Import OVA: ConnectionTestFailed message appears when adding OVA provider
+

When adding an OVA provider, the error message ConnectionTestFailed can appear, although the provider is created successfully. If the message does not disappear after a few minutes and the provider status does not move to Ready, this means that the ova server pod creation has failed. (MTV-671)

+
+
+
Left over ovirtvolumepopulator from failed migration causes plan to stay indefinitely in CopyDisks phase
+

An outdated ovirtvolumepopulator in the namespace, left over from an earlier failed migration, stops a new plan of the same VM when it transitions to CopyDisks phase. The plan remains in that phase indefinitely. (MTV-929)

+
+
+
Unclear error message when Forklift fails to build a PVC
+

The migration fails to build the Persistent Volume Claim (PVC) if the destination storage class does not have a configured storage profile. The forklift-controller raises an error message without a clear reason for failing to create a PVC. (MTV-928)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+
Flaw was found in jsrsasign package which is vulnerable to Observable Discrepancy
+

Versions of the package jsrsasign before 11.0.0, used in earlier releases of Forklift, are vulnerable to Observable Discrepancy in the RSA PKCS1.5 or RSA-OAEP decryption process. This discrepancy means an attacker could decrypt ciphertexts by exploiting this vulnerability. However, exploiting this vulnerability requires the attacker to have access to a large number of ciphertexts encrypted with the same key. This issue has been resolved in Forklift 2.5.5 by upgrading the package jsrasign to version 11.0.0.

+
+
+

For more information, see CVE-2024-21484.

+
+
+
Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack)
+

A flaw was found in handling multiplexed streams in the HTTP/2 protocol. In previous releases of Forklift, the HTTP/2 protocol allowed a denial of service (server resource consumption) because request cancellation could reset multiple streams quickly. The server had to set up and tear down the streams while not hitting any server-side limit for the maximum number of active streams per connection, which resulted in a denial of service due to server resource consumption.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of MTV or later.

+
+ +
+
Gin Web Framework does not properly sanitize filename parameter of Context.FileAttachment function
+

A flaw was found in the Gin-Gonic Gin Web Framework, used by Forklift. The filename parameter of the Context.FileAttachment function was not properly sanitized. This flaw in the package could allow a remote attacker to bypass security restrictions caused by improper input validation by the filename parameter of the Context.FileAttachment function. A maliciously created filename could cause the Content-Disposition header to be sent with an unexpected filename value, or otherwise modify the Content-Disposition header.

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+ +
+
CVE-2023-26144: mtv-console-plugin-container: graphql: Insufficient checks in the OverlappingFieldsCanBeMergedRule.ts
+

A flaw was found in the package GraphQL from 16.3.0 and before 16.8.1. This flaw means Forklift versions before Forklift 2.5.2 are vulnerable to Denial of Service (DoS) due to insufficient checks in the OverlappingFieldsCanBeMergedRule.ts file when parsing large queries. This issue may allow an attacker to degrade system performance. (MTV-712)

+
+
+

This issue has been resolved in Forklift 2.5.2. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
CVE-2023-45142: Memory leak found in the otelhttp handler of open-telemetry
+

A flaw was found in otelhttp handler of OpenTelemetry-Go. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to a memory leak caused by http.user_agent and http.method having unbound cardinality, which could allow a remote, unauthenticated attacker to exhaust the server’s memory by sending many malicious requests, affecting the availability. (MTV-795)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-45142.

+
+
+
CVE-2023-39322: QUIC connections do not set an upper bound on the amount of data buffered when reading post-handshake messages
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to QUIC connections not setting an upper bound on the amount of data buffered when reading post-handshake messages, allowing a malicious QUIC connection to cause unbounded memory growth. With the fix, connections now consistently reject messages larger than 65KiB in size. (MTV-708)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39322.

+
+
+
CVE-2023-39321: Processing an incomplete post-handshake message for a QUIC connection can cause a panic
+

A flaw was found in Golang. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable to processing an incomplete post-handshake message for a QUIC connection, which causes a panic. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39321.

+
+
+
CVE-2023-39319: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable, as the html/template package did not properly handle occurrences of <script, <!--, and </script within JavaScript literals in <script> contexts. This flaw could cause the template parser to improperly consider script contexts to be terminated early, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39319.

+
+
+
CVE-2023-39318: Flaw in html/template package
+

A flaw was found in the Golang html/template package used in Forklift. This flaw means Forklift versions before Forklift 2.5.3 are vulnerable as the html/template package did not properly handle HMTL-like "" comment tokens, nor hashbang \#! comment tokens. This flaw could cause the template parser to improperly interpret the contents of <script> contexts, causing actions to be improperly escaped, which could be leveraged to perform an XSS attack. (MTV-693)

+
+
+

This issue has been resolved in Forklift 2.5.3. It is advised to update to this version of Forklift or later.

+
+
+

For more information, see CVE-2023-39318.

+
+
+
Logs archive file downloaded from UI includes logs related to deleted migration plan/VM
+

In earlier releases of Forklift 2.3, the log files downloaded from UI could contain logs that are related to an earlier migration plan. (MTV-783)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Extending a VM disk in RHV is not reflected in the MTV inventory
+

In earlier releases of Forklift 2.3, the size of disks that are extended in RHV was not adequately monitored. This resulted in the inability to migrate virtual machines with extended disks from a RHV provider. (MTV-830)

+
+
+

This issue has been resolved in Forklift 2.5.3.

+
+
+
Filesystem overhead configurable
+

In earlier releases of Forklift 2.3, the filesystem overhead for new persistent volumes was hard-coded to 10%. The overhead was insufficient for certain filesystem types, resulting in failures during cold-migrations from oVirt and OSP to the cluster where Forklift is deployed. In other filesystem types, the hard-coded overhead was too high, resulting in excessive storage consumption.

+
+
+

In Forklift 2.5.3, the filesystem overhead can be configured, as it is no longer hard-coded. If your migration allocates persistent volumes without CDI, you can adjust the file system overhead. You adjust the file system overhead by adding the following label and value to the spec portion of the forklift-controller CR:

+
+
+
+
spec:
+  `controller_filesystem_overhead: <percentage>` (1)
+
+
+
+
    +
  1. +

    The percentage of overhead. If this label is not added, the default value of 10% is used. This setting is valid only if the storageclass is filesystem. (MTV-699)

    +
  2. +
+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In earlier releases of Forklift, the create and update provider forms could have presented stale data.

+
+
+

This issue is resolved in Forklift 2.3, the new forms of create and update provider display up-to-date properties of the provider. (MTV-603)

+
+
+
Snapshots that are created during a migration in OpenStack are not deleted
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots that were created during a migration of source virtual machines in OpenStack automatically.

+
+
+

This issue is resolved in Forklift 2.3, all the snapshots created during the migration are removed after the migration has been completed. (MTV-620)

+
+
+
oVirt snapshots are not deleted after a successful migration
+

In earlier releases of Forklift, the Migration Controller service did not delete snapshots automatically after a successful warm migration of a VM from oVirt.

+
+
+

This issue is resolved in Forklift 2.3, the snapshots generated during migration are removed after a successful migration, and the original snapshots are not removed after a successful migration. (MTV-349)

+
+
+
Warm migration fails when cutover conflicts with precopy
+

In earlier releases of Forklift, the cutover operation failed when it was triggered while precopy was being performed. The VM was locked in oVirt and therefore the ovirt-engine rejected the snapshot creation, or disk transfer, operation.

+
+
+

This issue is resolved in Forklift 2.3, the cutover operation is triggered, but it is not performed at that time because the VM is locked. Once the precopy operation completes, the cutover operation is triggered. (MTV-686)

+
+
+
Warm migration fails when VM is locked
+

In earlier releases of Forklift, triggering a warm migration while there was an ongoing operation in oVirt that locked the VM caused the migration to fail because it could not trigger the snapshot creation.

+
+
+

This issue is resolved in Forklift 2.3, warm migration does not fail when an operation that locks the VM is performed in oVirt. The migration does not fail, but starts when the VM is unlocked. (MTV-687)

+
+
+
Deleting migrated VM does not remove PVC and PV
+

In earlier releases of Forklift, when removing a VM that was migrated, its persistent volume claims (PVCs) and physical volumes (PV) were not deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs and PVs are deleted when deleting migrated VM.(MTV-492)

+
+
+
PVC deletion hangs after archiving and deleting migration plan
+

In earlier releases of Forklift, when a migration failed, its PVCs and PVs were not deleted as expected when its migration plan was archived and deleted.

+
+
+

This issue is resolved in Forklift 2.3, PVCs are deleted when archiving and deleting migration plan.(MTV-493)

+
+
+
VM with multiple disks can boot from a non-bootable disk after migration
+

In earlier releases of Forklift, VM with multiple disks that were migrated might not have been able to boot on the target OKD cluster.

+
+
+

This issue is resolved in Forklift 2.3, VM with multiple disks that are migrated can boot on the target OKD cluster. (MTV-433)

+
+
+
Transfer network not taken into account for cold migrations from vSphere
+

In Forklift releases 2.4.0-2.5.3, cold migrations from vSphere to the local cluster on which Forklift was deployed did not take a specified transfer network into account. This issue is resolved in Forklift 2.5.4. (MTV-846)

+
+
+
Fix migration of VMs with multi-boot guest operating system from vSphere
+

In Forklift 2.5.6, the virt-v2v arguments include –root first, which mitigates an issue with multi-boot VMs where the pod fails. This is a fix for a regression that was introduced in Forklift 2.4, in which the '--root' argument was dropped. (MTV-987)

+
+
+
Errors logged in populator pods are improved
+

In earlier releases of Forklift 2.3, populator pods were always restarted on failure. This made it difficult to gather the logs from the failed pods. In Forklift 2.5.3, the number of restarts of populator pods is limited to three times. On the third and final time, the populator pod remains in the fail status and its logs can then be easily gathered by must-gather and by forklift-controller to know this step has failed. (MTV-818)

+
+
+
npm IP package vulnerability
+

A vulnerability found in the Node.js Package Manager (npm) IP Package can allow an attacker to obtain sensitive information and obtain access to normally inaccessible resources. MTV-941

+
+
+

This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-42282

+
+
+
Flaw was found in the Golang net/http/internal package
+

A flaw was found in the versions of the Golang net/http/internal package, that were used in earlier releases of Forklift. This flaw could allow a malicious user to send an HTTP request and cause the receiver to read more bytes from the network than are in the body (up to 1GiB), causing the receiver to fail reading the response, possibly leading to a Denial of Service (DoS). This issue has been resolved in Forklift 2.5.6.

+
+
+

For more information, see CVE-2023-39326.

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+

Upgrade notes

+
+
+

It is recommended to upgrade from Forklift 2.4.2 to Forklift 2.3.

+
+
+
Upgrade from 2.4.0 fails
+

When upgrading from MTV 2.4.0 to a later version, the operation fails with an error that says the field 'spec.selector' of deployment forklift-controller is immutable. Workaround: Remove the custom resource forklift-controller of type ForkliftController from the installed namespace, and recreate it. Refresh the OKD console once the forklift-console-plugin pod runs to load the upgraded Forklift web console. (MTV-518)

+
+
+
+ + +
+ + diff --git a/modules/rn-2.6/index.html b/modules/rn-2.6/index.html new file mode 100644 index 00000000000..843d269a73d --- /dev/null +++ b/modules/rn-2.6/index.html @@ -0,0 +1,511 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.6

+
+
+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Simplified the creation of vSphere providers
+

In earlier releases of Forklift, users had to specify a fingerprint when creating a vSphere provider. This required users to retrieve the fingerprint from the server that vCenter runs on. Forklift no longer requires this fingerprint as an input, but rather computes it from the specified certificate in the case of a secure connection or automatically retrieves it from the server that runs vCenter/ESXi in the case of an insecure connection.

+
+
+
Redesigned the migration plan creation dialog
+

The user interface console has improved the process of creating a migration plan. The new migration plan dialog enables faster creation of migration plans.

+
+
+

It includes only the minimal settings that are required, while you can confirgure advanced settings separately. The new dialog also provides defaults for network and storage mappings, where applicable. The new dialog can also be invoked from the the Provider > Virtual Machines tab, after selecting the virtual machines to migrate. It also better aligns with the user experience in the OCP console.

+
+
+
virtual machine preferences have replaced {ocp-name} templates
+

The virtual machine preferences have replaced {ocp-name} templates. Forklift currently falls back to using {ocp-name} templates when a relevant preference is not available.

+
+
+

Custom mappings of guest operating system type to virtual machine preference can be configured using config maps. This is in order to use custom virtual machine preferences, or to support more guest operating system types.

+
+
+
Full support for migration from OVA
+

Migration from OVA moves from being a Technical Preview and is now a fully supported feature.

+
+
+
The VM is posted with its desired Running state
+

Forklift creates the VM with its desired Running state on the target provider, instead of creating the VM and then running it as an additional operation. (MTV-794)

+
+
+
The must-gather logs can now be loaded only by using the CLI
+

The Forklift web console can no longer download logs. With this update, you must download must-gather logs by using CLI commands. For more information, see Must Gather Operator.

+
+
+
Forklift no longer runs pvc-init pods when migrating from vSphere
+

Forklift no longer runs pvc-init pods during cold migration from a vSphere provider to the {ocp-name} cluster that Forklift is deployed on. However, in other flows where data volumes are used, they are set with the cdi.kubevirt.io/storage.bind.immediate.requested annotation, and CDI runs first-consume pods for storage classes with volume binding mode WaitForFirstConsumer.

+
+
+
+
+

New features and enhancements

+
+
+

This section provides features and enhancements introduced in Forklift 2.6.

+
+
+

New features and enhancements 2.6.3

+
+
Support for migrating LUKS-encrypted devices in migrations from vSphere
+

You can now perform cold migrations from a vSphere provider of VMs whose virtual disks are encrypted by Linux Unified Key Setup (LUKS). (MTV-831)

+
+
+
Specifying the primary disk when migrating from vSphere
+

You can now specify the primary disk when you migrate VMs from vSphere with more than one bootable disk. This avoids Forklift automatically attempting to convert the first bootable disk that it detects while it examines all the disks of a virtual machine. This feature is needed because the first bootable disk is not necessarily the disk that the VM is expected to boot from in KubeVirt. (MTV-1079)

+
+
+
Links to remote provider UIs
+

You can now remotely access the UI of a remote cluster when you create a source provider. For example, if the provider is a remote oVirt oVirt cluster, Forklift adds a link to the remote oVirt web console when you define the provider. This feature makes it easier for you to manage and debug a migration from remote clusters. (MTV-1054)

+
+
+
+

New features and enhancements 2.6.0

+
+
Migration from vSphere over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the server that runs vCenter or ESXi, depending on the specified SDK endpoint of the vSphere provider. (MTV-530)

+
+
+
Migration to or from a remote {ocp-name} over a secure connection
+

You can now specify a CA certificate that can be used to authenticate the API server of a remote {ocp-name} cluster. (MTV-728)

+
+
+
Migration from an ESXi server without going through vCenter
+

Forklift enables the configuration of vSphere providers with the SDK of ESXi. You need to select ESXi as the Endpoint type of the vSphere provider and specify the URL of the SDK of the ESXi server. (MTV-514)

+
+
+
Migration of image-based VMs from {osp}
+

Forklift supports the migration of VMs that were created from images in {osp}. (MTV-644)

+
+
+
Migration of VMs with Fibre Channel LUNs from oVirt
+

Forklift supports migrations of VMs that are set with Fibre Channel (FC) LUNs from oVirt. As with other LUN disks, you need to ensure the {ocp-name} nodes have access to the FC LUNs. During the migrations, the FC LUNs are detached from the source VMs in oVirt and attached to the migrated VMs in {ocp-name}. (MTV-659)

+
+
+
Preserve CPU types of VMs that are migrated from oVirt
+

Forklift sets the CPU type of migrated VMs in {ocp-name} with their custom CPU type in oVirt. In addition, a new option was added to migration plans that are set with oVirt as a source provider to preserve the original CPU types of source VMs. When this option is selected, Forklift identifies the CPU type based on the cluster configuration and sets this CPU type for the migrated VMs, for which the source VMs are not set with a custom CPU. (MTV-547)

+
+
+
Validation for RHEL 6 guest operating system is now available when migrating VMs with RHEL 6 guest operating system
+

Red Hat Enterprise Linux (RHEL) 9 does not support RHEL 6 as a guest operating system. Therefore, RHEL 6 is not supported in {ocp-name} Virtualization. With this update, a validation of RHEL 6 guest operating system was added to {ocp-name} Virtualization. (MTV413)

+
+
+
Automatic retrieval of CA certificates for the provider’s URL in the console
+

The ability to retrieve CA certificates, which was available in previous versions, has been restored. The vSphere Verify certificate option is in the add-provider dialog. This option was removed in the transition to the OKD console and has now been added to the console. This functionality is also available for oVirt, {osp}, and {ocp-name} providers now. (MTV-737)

+
+
+
Validation of a specified VDDK image
+

Forklift validates the availability of a VDDK image that is specified for a vSphere provider on the target {ocp-name} name as part of the validation of a migration plan. Forklift also checks whether the libvixDiskLib.so symbolic link (symlink) exists within the image. If the validation fails, the migration plan cannot be started. (MTV-618)

+
+
+
Add a warning and partial support for TPM
+

Forklift presents a warning when attempting to migrate a VM that is set with a TPM device from oVirt or vSphere. The migrated VM in {ocp-name} would be set with a TPM device but without the content of the TPM device on the source environment. (MTV-378)

+
+
+
Plans that failed to migrate VMs can now be edited
+

With this update, you can edit plans that have failed to migrate any VMs. Some plans fail or are canceled because of incorrect network and storage mappings. You can now edit these plans until they succeed. (MTV-779)

+
+
+
Validation rules are now available for OVA
+

The validation service includes default validation rules for virtual machines from the Open Virtual Appliance (OVA). (MTV-669)

+
+
+
+
+
+

Resolved issues

+
+
+

This release has the following resolved issues:

+
+
+

Resolved issues 2.6.7

+
+
Incorrect handling of quotes in ifcfg files
+

In earlier releases of Forklift, there was an issue with the incorrect handling of single and double quotes in interface configuration (ifcfg) files, which control the software interfaces for individual network devices. This issue has been resolved in Forklift 2.6.7, in order to cover additional IP configurations on Red Hat Enterprise Linux, CentOS, Rocky Linux and similar distributions. (MTV-1439)

+
+
+
Failure to preserve netplan based network configuration
+

In earlier releases of Forklift, there was an issue with the preservation of netplan-based network configurations. This issue has been resolved in Forklift 2.6.7, so that static IP configurations are preserved if netplan (netplan.io) is used by using the netplan configuration files to generate udev rules for known mac-address and ifname tuples. (MTV-1440)

+
+
+
Error messages are written into udev .rules files
+

In earlier releases of Forklift, there was an issue with the accidental leakage of error messages into udev .rules files. This issue has been resolved in Forklift 2.6.7, with a static IP persistence script added to the udev rule file. (MTV-1441)

+
+
+
+

Resolved issues 2.6.6

+
+
Runtime error: invalid memory address or nil pointer dereference
+

In earlier releases of Forklift, there was a runtime error of invalid memory address or nil pointer dereference caused by a pointer that was nil, and there was an attempt to access the value that it points to. This issue has been resolved in Forklift 2.6.6. (MTV-1353)

+
+
+
All Plan and Migration pods scheduled to same node causing the node to crash
+

In earlier releases of Forklift, the scheduler could place all migration pods on a single node. When this happened, the node ran out of the resources. This issue has been resolved in Forklift 2.6.6. (MTV-1354)

+
+
+
Empty bearer token is sufficient for authentication
+

In earlier releases of Forklift, a vulnerability was found in the Forklift Controller.  There is no verification against the authorization header, except to ensure it uses bearer authentication. Without an authorization header and a bearer token, a 401 error occurs. The presence of a token value provides a 200 response with the requested information. This issue has been resolved in Forklift 2.6.6.

+
+
+

For more details, see (CVE-2024-8509).

+
+
+
+

Resolved issues 2.6.5

+
+
VMware Linux interface name changes during migration
+

In earlier releases of Forklift, during the migration of Rocky Linux 8, CentOS 7.2 and later, and Ubuntu 22 virtual machines (VM) from VMware to OKD (OCP), the name of the network interfaces is modified, and the static IP configuration for the VM is no longer functional. This issue has been resolved for static IPs in Rocky Linux 8, Centos 7.2 and later, Ubuntu 22 in Forklift 2.6.5. (MTV-595)

+
+
+
+

Resolved issues 2.6.4

+
+
Disks and drives are offline after migrating Windows virtual machines from RHV or VMware to OCP
+

Windows (Windows 2022) VMs configured with multiple disks, which are Online before the migration, are Offline after a successful migration from oVirt or VMware to OKD, using Forklift. Only the C:\ primary disk is Online. This issue has been resolved for basic disks in Forklift 2.6.4. (MTV-1299)

+
+
+

For details of the known issue of dynamic disks being Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd, see (MTV-1344).

+
+
+
Preserve IP option for Windows does not preserve all settings
+

In earlier releases of Forklift, while migrating a Windows 2022 Server with a static IP address assigned, and selecting the Preserve static IPs option, after a successful Windows migration, while the node started and the IP address was preserved, the subnet mask, gateway, and DNS servers were not preserved. This resulted in an incomplete migration, and the customer was forced to log in locally from the console to fully configure the network. This issue has been resolved in Forklift 2.6.4. (MTV-1286)

+
+
+
qemu-guest-agent not being installed at first boot in Windows Server 2022
+

After a successful Windows 2022 server guest migration using Forklift 2.6.1, the qemu-guest-agent is not completely installed. The Windows Scheduled task is being created, however it is being set to run 4 hours in the future instead of the intended 2 minutes in the future. (MTV-1325)

+
+
+
+

Resolved issues 2.6.3

+
+
CVE-2024-24788: golang: net malformed DNS message can cause infinite loop
+

In earlier releases of Forklift, there was a flaw was discovered in the stdlib package of the Go programming language, which impacts previous versions of Forklift. This vulnerability primarily threatens web-facing applications and services that rely on Go for DNS queries. This issue has been resolved in Forklift 2.6.3.

+
+
+

For more details, see (CVE-2024-24788).

+
+
+
Migration scheduling does not take into account that virt-v2v copies disks sequentially (vSphere only)
+

In earlier releases of Forklift, there was a problem with the way Forklift interpreted the controller_max_vm_inflight setting for vSphere to schedule migrations. This issue has been resolved in Forklift 2.6.3. (MTV-1191)

+
+
+
Cold migrations fail after changing the ESXi network (vSphere only)
+

In earlier versions of Forklift, cold migrations from a vSphere provider with an ESXi SDK endpoint failed if any network was used except for the default network for disk transfers. This issue has been resolved in Forklift 2.6.3. (MTV-1180)

+
+
+
Warm migrations over an ESXi network are stuck in DiskTransfer state (vSphere only)
+

In earlier versions of Forklift, warm migrations over an ESXi network from a vSphere provider with a vCenter SDK endpoint were stuck in DiskTransfer state because Forklift was unable to locate image snapshots. This issue has been resolved in Forklift 2.6.3. (MTV-1161)

+
+
+
Leftover PVCs are in Lost state after cold migrations
+

In earlier versions of Forklift, after cold migrations, there were leftover PVCs that had a status of Lost instead of being deleted, even after the migration plan that created them was archived and deleted. Investigation showed that this was because importer pods were retained after copying, by default, rather than in only specific cases. This issue has been resolved in Forklift 2.6.3. (MTV-1095)

+
+
+
Guest operating system from vSphere might be missing (vSphere only)
+

In earlier versions of Forklift, some VMs that were imported from vSphere were not mapped to a template in OKD while other VMs, with the same guest operating system, were mapped to the corresponding template. Investigations indicated that this was because vSphere stopped reporting the operating system after not receiving updates from VMware tools for some time. This issue has been resolved in Forklift 2.6.3 by taking the value of the operating system from the output of the investigation that virt-v2v performs on the disks. (MTV-1046)

+
+
+
+

Resolved issues 2.6.2

+
+
CVE-2023-45288: Golang net/http, x/net/http2: unlimited number of CONTINUATION frames can cause a denial-of-service (DoS) attack
+

A flaw was discovered with the implementation of the HTTP/2 protocol in the Go programming language, which impacts previous versions of Forklift. There were insufficient limitations on the number of CONTINUATION frames sent within a single stream. An attacker could potentially exploit this to cause a denial-of-service (DoS) attack. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45288).

+
+
+
CVE-2024-24785: mtv-api-container: Golang html/template: errors returned from MarshalJSON methods may break template escaping
+

A flaw was found in the html/template Golang standard library package, which impacts previous versions of Forklift. If errors returned from MarshalJSON methods contain user-controlled data, they may be used to break the contextual auto-escaping behavior of the HTML/template package, allowing subsequent actions to inject unexpected content into the templates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24785).

+
+
+
CVE-2024-24784: mtv-validation-container: Golang net/mail: comments in display names are incorrectly handled
+

A flaw was found in the net/mail Golang standard library package, which impacts previous versions of Forklift. The ParseAddressList function incorrectly handles comments, text in parentheses, and display names. As this is a misalignment with conforming address parsers, it can result in different trust decisions being made by programs using different parsers. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24784).

+
+
+
CVE-2024-24783: mtv-api-container: Golang crypto/x509: Verify panics on certificates with an unknown public key algorithm
+

A flaw was found in the crypto/x509 Golang standard library package, which impacts previous versions of Forklift. Verifying a certificate chain that contains a certificate with an unknown public key algorithm causes Certificate.Verify to panic. This affects all crypto/tls clients and servers that set Config.ClientAuth to VerifyClientCertIfGiven or RequireAndVerifyClientCert. The default behavior is for TLS servers to not verify client certificates. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2024-24783).

+
+
+
CVE-2023-45290: mtv-api-container: Golang net/http memory exhaustion in Request.ParseMultipartForm
+

A flaw was found in the net/http Golang standard library package, which impacts previous versions of Forklift. When parsing a multipart form, either explicitly with Request.ParseMultipartForm or implicitly with Request.FormValue, Request.PostFormValue, or Request.FormFile, limits on the total size of the parsed form are not applied to the memory consumed while reading a single form line. This permits a maliciously crafted input containing long lines to cause the allocation of arbitrarily large amounts of memory, potentially leading to memory exhaustion. This flaw has been resolved in Forklift 2.6.2.

+
+
+

For more details, see (CVE-2023-45290).

+
+
+
ImageConversion does not run when target storage is set with WaitForFirstConsumer (WFFC)
+

In earlier releases of Forklift, migration of VMs failed because the migration was stuck in the AllocateDisks phase. As a result of being stuck, the migration did not progress, and PVCs were not bound. The root cause of the issue was that ImageConversion did not run when target storage was set for wait-for-first-consumer. The problem was resolved in Forklift 2.6.2. (MTV-1126)

+
+
+
forklift-controller panics when importing VMs with direct LUNs
+

In earlier releases of Forklift, forklift-controller panicked when a user attempted to import VMs that had direct LUNs. The problem was resolved in Forklift 2.6.2. (MTV-1134)

+
+
+
+

Resolved issues 2.6.1

+
+
VMs with multiple disks that are migrated from vSphere and OVA files are not being fully copied
+

In Forklift 2.6.0, there was a problem in copying VMs with multiple disks from VMware vSphere and from OVA files. The migrations appeared to succeed but all the disks were transferred to the same PV in the target environment while other disks were empty. In some cases, bootable disks were overridden, so the VM could not boot. In other cases, data from the other disks was missing. The problem was resolved in Forklift 2.6.1. (MTV-1067)

+
+
+
Migrating VMs from one OKD cluster to another fails due to a timeout
+

In Forklift 2.6.0, migrations from one OKD cluster to another failed when the time to transfer the disks of a VM exceeded the time to live (TTL) of the Export API in {ocp-name}, which was set to 2 hours by default. The problem was resolved in Forklift 2.6.1 by setting the default TTL of the Export API to 12 hours, which greatly reduces the possibility of an expiration of the Export API. Additionally, you can increase or decrease the TTL setting as needed. (MTV-1052)

+
+
+
Forklift forklift-controller pod crashes when receiving a disk without a datastore
+

In earlier releases of Forklift, if a VM was configured with a disk that was on a datastore that was no longer available in vSphere at the time a migration was attempted, the forklift-controller crashed, rendering Forklift unusable. In Forklift 2.6.1, Forklift presents a critical validation for VMs with such disks, informing users of the problem, and the forklift-controller no longer crashes, although it cannot transfer the disk. (MTV-1029)

+
+
+
+

Resolved issues 2.6.0

+
+
Deleting an OVA provider automatically also deletes the PV
+

In earlier releases of Forklift, the PV was not removed when the OVA provider was deleted. This has been resolved in Forklift 2.6.0, and the PV is automatically deleted when the OVA provider is deleted. (MTV-848)

+
+
+
Fix for data being lost when migrating VMware VMs with snapshots
+

In earlier releases of Forklift, when migrating a VM that has a snapshot from VMware, the VM that was created in {ocp-name} Virtualization contained the data in the snapshot but not the latest data of the VM. This has been resolved in Forklift 2.6.0. (MTV-447)

+
+
+
Canceling and deleting a failed migration plan does not clean up the populate pods and PVC
+

In earlier releases of Forklift, when you canceled and deleted a failed migration plan, and after creating a PVC and spawning the populate pods, the populate pods and PVC were not deleted. You had to delete the pods and PVC manually. This issue has been resolved in Forklift 2.6.0. (MTV-678)

+
+
+
OKD to OKD migrations require the cluster version to be 4.13 or later
+

In earlier releases of Forklift, when migrating from OKD to OKD, the version of the source provider cluster had to be OKD version 4.13 or later. This issue has been resolved in Forklift 2.6.0, with validation being shown when migrating from versions of {ocp-name} before 4.13. (MTV-734)

+
+
+
Multiple storage domains from RHV were always mapped to a single storage class
+

In earlier releases of Forklift, multiple disks from different storage domains were always mapped to a single storage class, regardless of the storage mapping that was configured. This issue has been resolved in Forklift 2.6.0. (MTV-1008)

+
+
+
Firmware detection by virt-v2v
+

In earlier releases of Forklift, a VM that was migrated from an OVA that did not include the firmware type in its OVF configuration was set with UEFI. This was incorrect for VMs that were configured with BIOS. This issue has been resolved in Forklift 2.6.0, as Forklift now consumes the firmware that is detected by virt-v2v during the conversion of the disks. (MTV-759)

+
+
+
Creating a host secret requires validation of the secret before creation of the host
+

In earlier releases of Forklift, when configuring a transfer network for vSphere hosts, the console plugin created the Host CR before creating its secret. The secret should be specified first in order to validate it before the Host CR is posted. This issue has been resolved in Forklift 2.6.0. (MTV-868)

+
+
+
When adding OVA provider a ConnectionTestFailed message appears
+

In earlier releases of Forklift, when adding an OVA provider, the error message ConnectionTestFailed instantly appeared, although the provider had been created successfully. This issue has been resolved in Forklift 2.6.0. (MTV-671)

+
+
+
RHV provider ConnectionTestSucceeded True response from the wrong URL
+

In earlier releases of Forklift, the ConnectionTestSucceeded condition was set to True even when the URL was different than the API endpoint for the RHV Manager. This issue has been resolved in Forklift 2.6.0. (MTV-740)

+
+
+
Migration does not fail when a vSphere Data Center is nested inside a folder
+

In earlier releases of Forklift, migrating a VM that is placed in a Data Center that is stored directly under the /vcenter in vSphere succeeded. However, it failed when the Data Center was stored inside a folder. This issue was resolved in Forklift 2.6.0. (MTV-796)

+
+
+
The OVA inventory watcher detects deleted files
+

The OVA inventory watcher detects files changes, including deleted files. Updates from the ova-provider-server pod are now sent every five minutes to the forklift-controller pod that updates the inventory. (MTV-733)

+
+
+
Unclear error message when Forklift fails to build or create a PVC
+

In earlier releases of Forklift, the error logs lacked clear information to identify the reason for a failure to create a PV on a destination storage class that does not have a configured storage profile. This issue was resolved in Forklift 2.6.0. (MTV-928)

+
+
+
Plans stay indefinitely in the CopyDisks phase when there is an outdated ovirtvolumepopulator
+

In earlier releases of Forklift, an earlier failed migration could have left an outdated ovirtvolumepopulator. When starting a new plan for the same VM to the same project, the CreateDataVolumes phase did not create populator PVCs when transitioning to CopyDisks, causing the CopyDisks phase to stay indefinitely. This issue was resolved in Forklift 2.6.0. (MTV-929)

+
+
+

For a complete list of all resolved issues in this release, see the list of Resolved Issues in Jira.

+
+
+
+
+
+

Known issues

+
+
+

This release has the following known issues:

+
+
+ + + + + +
+
Warning
+
+
Warm migration and remote migration flows are impacted by multiple bugs
+
+

Warm migration and remote migration flows are impacted by multiple bugs. It is strongly recommended to fall back to cold migration until this issue is resolved. (MTV-1366)

+
+
+
+
+
Migrating older Linux distributions from VMware to OKD, the name of the network interfaces changes
+

When migrating older Linux distributions, such as CentOS 7.0 and 7.1, virtual machines (VMs) from VMware to OKD, the name of the network interfaces changes, and the static IP configuration for the VM no longer functions. This issue is caused by RHEL 7.0 and 7.1 still requiring virtio-transitional. Workaround: Manually update the guest to RHEL 7.2 or update the VM specification post-migration to use transitional. (MTV-1382)

+
+
+
Dynamic disks are offline in Windows Server 2022 after migration from vSphere to CNV with ceph-rbd
+

The dynamic disks are Offline in Windows Server 2022 after cold and warm migrations from vSphere to container-native virtualization (CNV) with Ceph RADOS Block Devices (RBD), using the storage class ocs-storagecluster-ceph-rbd. (MTV-1344)

+
+
+
Unclear error status message for VM with no operating system
+

The error status message for a VM with no operating system on the Plans page of the web console does not describe the reason for the failure. (BZ#22008846)

+
+
+
Migration of virtual machines with encrypted partitions fails during a conversion (vSphere only)
+

vSphere only: Migrations from oVirt and {osp} do not fail, but the encryption key might be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while performing a snapshot operation on the source VM
+

Warm migration from oVirt fails if a snapshot operation is triggered and running on the source VM at the same time as the migration is scheduled. The migration does not wait for the snapshot operation to finish. (MTV-456)

+
+
+
Unable to schedule migrated VM with multiple disks to more than one storage class of type hostPath
+

When migrating a VM with multiple disks to more than one storage class of type hostPath, it might happen that a VM cannot be scheduled. Workaround: Use shared storage on the target OKD cluster.

+
+
+
Non-supported guest operating systems in warm migrations
+

Warm migrations and migrations to remote OKD clusters from vSphere do not support the same guest operating systems that are supported in cold migrations and migrations to the local OKD cluster. RHEL 8 and RHEL 9 might cause this limitation.

+
+ +
+
VMs from vSphere with RHEL 9 guest operating system can start with network interfaces that are down
+

When migrating VMs that are installed with RHEL 9 as a guest operating system from vSphere, the network interfaces of the VMs could be disabled when they start in {ocp-name} Virtualization. (MTV-491)

+
+
+
Migration of a VM with NVME disks from vSphere fails
+

When migrating a virtual machine (VM) with NVME disks from vSphere, the migration process fails, and the Web Console shows that the Convert image to kubevirt stage is running but did not finish successfully. (MTV-963)

+
+
+
Importing image-based VMs can fail
+

Migrating an image-based VM without the virtual_size field can fail on a block mode storage class. (MTV-946)

+
+
+
Deleting a migration plan does not remove temporary resources
+

Deleting a migration plan does not remove temporary resources such as importer pods, conversion pods, config maps, secrets, failed VMs, and data volumes. You must archive a migration plan before deleting it to clean up the temporary resources. (BZ#2018974)

+
+
+
Migrating VMs with independent persistent disks from VMware to OCP-V fails
+

Migrating VMs with independent persistent disks from VMware to OCP-V fails. (MTV-993)

+
+
+
Guest operating system from vSphere might be missing
+

When vSphere does not receive updates about the guest operating system from the VMware tools, it considers the information about the guest operating system to be outdated and ceases to report it. When this occurs, Forklift is unaware of the guest operating system of the VM and is unable to associate it with the appropriate virtual machine preference or {ocp-name} template. (MTV-1046)

+
+
+
Failure to migrate an image-based VM from {osp} to the default project
+

The migration process fails when migrating an image-based VM from {osp} to the default project. (MTV-964)

+
+
+

For a complete list of all known issues in this release, see the list of Known Issues in Jira.

+
+
+
+ + +
+ + diff --git a/modules/rn-2.7/index.html b/modules/rn-2.7/index.html new file mode 100644 index 00000000000..b3354dc95e4 --- /dev/null +++ b/modules/rn-2.7/index.html @@ -0,0 +1,91 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Forklift 2.7

+
+

You can use Forklift to migrate virtual machines from the following source providers to KubeVirt destination providers:

+
+
+
    +
  • +

    VMware vSphere versions 6, 7, and 8

    +
  • +
  • +

    oVirt (oVirt)

    +
  • +
  • +

    {osp}

    +
  • +
  • +

    Open Virtual Appliances (OVAs) that were created by VMware vSphere

    +
  • +
  • +

    Remote KubeVirt clusters

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, known issues, and resolved issues.

+
+ + +
+ + diff --git a/modules/rn-27-resolved-issues/index.html b/modules/rn-27-resolved-issues/index.html new file mode 100644 index 00000000000..00c1ce92b6d --- /dev/null +++ b/modules/rn-27-resolved-issues/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Resolved issues

+
+
+
+

Forklift 2.7 has the following resolved issues:

+
+
+
+
+

Resolved issues 2.7.3

+
+
+
Migration plan does not fail when conversion pod fails
+

In earlier releases of Forklift, when running the virt-v2v guest conversion, the migration plan did not fail if the conversion pod failed, as expected. This issue has been resolved in Forklift 2.7.3. (MTV-1569)

+
+
+
Large number of VMs in the inventory can cause the inventory controller to panic
+

In earlier releases of Forklift, having a large number of virtual machines (VMs) in the inventory could cause the inventory controller to panic and return a concurrent write to websocket connection warning. This issue was caused by the concurrent write to the WebSocket connection and has been addressed by the addition of a lock, so the Go routine waits before sending the response from the server. This issue has been resolved in Forklift 2.7.3. (MTV-1220)

+
+
+
VM selection disappears when selecting multiple VMs in the Migration Plan
+

In earlier releases of Forklift, VM selection checkbox disappeared after selecting multiple VMs in the Migration Plan. This issue has been resolved in Forklift 2.7.3. (MTV-1546)

+
+
+
forklift-controller crashing during OVA plan migration
+

In earlier releases of Forklift, the forklift-controller would crash during an OVA plan migration, returning a runtime error: invalid memory address or nil pointer dereference panic.  This issue has been resolved in Forklift 2.7.3. (MTV-1577)

+
+
+
+
+

Resolved issues 2.7.2

+
+
+
VMNetworksNotMapped error occurs after creating a plan from the UI with the source provider set to KubeVirt
+

In earlier releases of Forklift, after creating a plan with an KubeVirt source provider, the Migration Plan failed with the error The plan is not ready - VMNetworksNotMapped. This issue has been resolved in Forklift 2.7.2. (MTV-1201)

+
+
+
Migration Plan for KubeVirt to KubeVirt missing the source namespace causing VMNetworkNotMapped error
+

In earlier releases of Forklift, when creating a Migration Plan for an KubeVirt to KubeVirt migration using the Plan Creation Form, the network map generated was missing the source namespace, which caused a VMNetworkNotMapped error on the plan. This issue has been resolved in Forklift 2.7.2. (MTV-1297)

+
+
+
DV, PVC, and PV are not cleaned up and removed if the migration plan is Archived and Deleted
+

In earlier releases of Forklift, the DataVolume (DV), PersistentVolumeClaim (PVC), and PersistentVolume (PV) continued to exist after the migration plan was archived and deleted. This issue has been resolved in Forklift 2.7.2. (MTV-1477)

+
+
+
Other migrations are halted from starting as the scheduler is waiting for the complete VM to get transferred
+

In earlier releases of Forklift, when warm migrating a virtual machine (VM) that has several disks, you had to wait for the complete VM to get migrated, and the scheduler was halted until all the disks finished before the migration would be started. This issue has been resolved in Forklift 2.7.2. (MTV-1537)

+
+
+
Warm migration is not functioning as expected
+

In earlier releases of Forklift, warm migration did not function as expected. When running the warm migration with VMs larger than the MaxInFlight disks, the VMs over this number did not start the migration until the cutover. This issue has been resolved in Forklift 2.7.2. (MTV-1543)

+
+
+
Migration hanging due to error: virt-v2v: error: -i libvirt: expecting a libvirt guest name
+

In earlier releases of Forklift, when attempting to migrate a VMware VM with a non-compliant Kubernetes name, the Openshift console returned a warning that the VM would be renamed. However, after starting the Migration Plan, it hangs since the migration pod is in an Error state. This issue has been resolved in Forklift 2.7.2. This issue has been resolved in Forklift 2.7.2. (MTV-1555)

+
+
+
VMs are not migrated if they have more disks than MAX_VM_INFLIGHT
+

In earlier releases of Forklift, when migrating the VM using the warm migration, if there were more disks than the MAX_VM_INFLIGHT the VM was not scheduled and the migration was not started. This issue has been resolved in Forklift 2.7.2. (MTV-1573)

+
+
+
Migration Plan returns an error even when Changed Block Tracking (CBT) is enabled
+

In earlier releases of Forklift, when running a VM in VMware, if the CBT flag was enabled while the VM was running by adding both ctkEnabled=TRUE and scsi0:0.ctkEnabled=TRUE parameters, an error message Danger alert:The plan is not ready - VMMissingChangedBlockTracking was returned, and the migration plan was prevented from working. This issue has been resolved in Forklift 2.7.2. (MTV-1576)

+
+
+
+
+

Resolved issues 2.7.0

+
+
+
Change . to - in the names of VMs that are migrated
+

In earlier releases of Forklift, if the name of the virtual machines (VMs) contained ., this was changed to - when they were migrated. This issue has been resolved in Forklift 2.7.0. (MTV-1292)

+
+
+
Status condition indicating a failed mapping resource in a plan is not added to the plan
+

In earlier releases of Forklift, a status condition indicating a failed mapping resource of a plan was not added to the plan. This issue has been resolved in Forklift 2.7.0, with a status condition indicating the failed mapping being added. (MTV-1461)

+
+
+
ifcfg files with HWaddr cause the NIC name to change
+

In earlier releases of Forklift, interface configuration (ifcfg) files with a hardware address (HWaddr) of the Ethernet interface caused the name of the network interface controller (NIC) to change. This issue has been resolved in Forklift 2.7.0. (MTV-1463)

+
+
+
Import fails with special characters in VMX file
+

In earlier releases of Forklift, imports failed when there were special characters in the parameters of the VMX file. This issue has been resolved in Forklift 2.7.0. (MTV-1472)

+
+
+
Observed invalid memory address or nil pointer dereference panic
+

In earlier releases of Forklift, an invalid memory address or nil pointer dereference panic was observed, which was caused by a refactor and could be triggered when there was a problem with the inventory pod. This issue has been resolved in Forklift 2.7.0. (MTV-1482)

+
+
+
Static IPv4 changed after warm migrating win2022/2019 VMs
+

In earlier releases of Forklift, the static Internet Protocol version 4 (IPv4) address was changed after a warm migration of Windows Server 2022 and Windows Server 2019 VMs. This issue has been resolved in Forklift 2.7.0. (MTV-1491)

+
+
+
Warm migration is missing arguments
+

In earlier releases of Forklift, virt-v2v-in-place for the warm migration was missing arguments that were available in virt-v2v for the cold migration. This issue has been resolved in Forklift 2.7.0. (MTV-1495)

+
+
+
Default gateway settings changed after migrating Windows Server 2022 VMs with preserve static IPs
+

In earlier releases of Forklift, the default gateway settings were changed after migrating Windows Server 2022 VMs with the preserve static IPs setting. This issue has been resolved in Forklift 2.7.0. (MTV-1497)

+
+
+
+ + +
+ + diff --git a/modules/running-migration-plan/index.html b/modules/running-migration-plan/index.html new file mode 100644 index 00000000000..4584abb17cc --- /dev/null +++ b/modules/running-migration-plan/index.html @@ -0,0 +1,135 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Running a migration plan

+
+

You can run a migration plan and view its progress in the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    Valid migration plan.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationPlans for virtualization.

    +
    +

    The Plans list displays the source and target providers, the number of virtual machines (VMs) being migrated, the status, and the description of each plan.

    +
    +
  2. +
  3. +

    Click Start beside a migration plan to start the migration.

    +
  4. +
  5. +

    Click Start in the confirmation window that opens.

    +
    +

    The Migration details by VM screen opens, displaying the migration’s progress

    +
    +
    +

    Warm migration only:

    +
    +
    +
      +
    • +

      The precopy stage starts.

      +
    • +
    • +

      Click Cutover to complete the migration.

      +
    • +
    +
    +
  6. +
  7. +

    If the migration fails:

    +
    +
      +
    1. +

      Click Get logs to retrieve the migration logs.

      +
    2. +
    3. +

      Click Get logs in the confirmation window that opens.

      +
    4. +
    5. +

      Wait until Get logs changes to Download logs and then click the button to download the logs.

      +
    6. +
    +
    +
  8. +
  9. +

    Click a migration’s Status, whether it failed or succeeded or is still ongoing, to view the details of the migration.

    +
    +

    The Migration details by VM screen opens, displaying the start and end times of the migration, the amount of data copied, and a progress pipeline for each VM being migrated.

    +
    +
  10. +
  11. +

    Expand an individual VM to view its steps and the elapsed time and state of each step.

    +
  12. +
+
+ + +
+ + diff --git a/modules/selecting-migration-network-for-virt-provider/index.html b/modules/selecting-migration-network-for-virt-provider/index.html new file mode 100644 index 00000000000..6e42684b5ac --- /dev/null +++ b/modules/selecting-migration-network-for-virt-provider/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a KubeVirt provider

+
+

You can select a default migration network for a KubeVirt provider in the OKD web console to improve performance. The default migration network is used to transfer disks to the namespaces in which it is configured.

+
+
+

If you do not select a migration network, the default migration network is the pod network, which might not be optimal for disk transfer.

+
+
+ + + + + +
+
Note
+
+
+

You can override the default migration network of the provider by selecting a different network when you create a migration plan.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    On the right side of the provider, select Select migration network from the {kebab}.

    +
  4. +
  5. +

    Select a network from the list of available networks and click Select.

    +
  6. +
+
+ + +
+ + diff --git a/modules/selecting-migration-network-for-vmware-source-provider/index.html b/modules/selecting-migration-network-for-vmware-source-provider/index.html new file mode 100644 index 00000000000..ea8d6a2ef21 --- /dev/null +++ b/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,142 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a VMware source provider

+
+

You can select a migration network in the OKD web console for a source provider to reduce risk to the source environment and to improve performance.

+
+
+

Using the default network for migration can result in poor performance because the network might not have sufficient bandwidth. This situation can have a negative effect on the source platform because the disk transfer operation might saturate the network.

+
+
+

Unresolved directive in selecting-migration-network-for-vmware-source-provider.adoc - include::snip_vmware_esxi_nfc.adoc[]

+
+
+
Prerequisites
+
    +
  • +

    The migration network must have sufficient throughput, minimum speed of 10 Gbps, for disk transfer.

    +
  • +
  • +

    The migration network must be accessible to the KubeVirt nodes through the default gateway.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    The source virtual disks are copied by a pod that is connected to the pod network of the target namespace.

    +
    +
    +
    +
  • +
  • +

    The migration network should have jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click the host number in the Hosts column beside a provider to view a list of hosts.

    +
  4. +
  5. +

    Select one or more hosts and click Select migration network.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Network: Network name

      +
    • +
    • +

      ESXi host admin username: For example, root

      +
    • +
    • +

      ESXi host admin password: Password

      +
    • +
    +
    +
  8. +
  9. +

    Click Save.

    +
  10. +
  11. +

    Verify that the status of each host is Ready.

    +
    +

    If a host status is not Ready, the host might be unreachable on the migration network or the credentials might be incorrect. You can modify the host configuration and save the changes.

    +
    +
  12. +
+
+ + +
+ + diff --git a/modules/selecting-migration-network/index.html b/modules/selecting-migration-network/index.html new file mode 100644 index 00000000000..6e76ea32056 --- /dev/null +++ b/modules/selecting-migration-network/index.html @@ -0,0 +1,118 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Selecting a migration network for a source provider

+
+

You can select a migration network for a source provider in the Forklift web console for improved performance.

+
+
+

If a source network is not optimal for migration, a Warning icon is displayed beside the host number in the Hosts column of the provider list.

+
+
+
Prerequisites
+

The migration network has the following prerequisites:

+
+
+
    +
  • +

    Minimum speed of 10 Gbps.

    +
  • +
  • +

    Accessible to the OpenShift nodes through the default gateway. The source disks are copied by a pod that is connected to the pod network of the target namespace.

    +
  • +
  • +

    Jumbo frames enabled.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Click Providers.

    +
  2. +
  3. +

    Click the host number of a provider to view the host list and network details.

    +
  4. +
  5. +

    Select the host to be updated and click Select migration network.

    +
  6. +
  7. +

    Select a Network from the list of available networks.

    +
    +

    The network list displays only the networks accessible to all the selected hosts. The hosts must have

    +
    +
  8. +
  9. +

    Click Check connection to verify the credentials.

    +
  10. +
  11. +

    Click Select to select the migration network.

    +
    +

    The migration network appears in the network details of the updated hosts.

    +
    +
  12. +
+
+ + +
+ + diff --git a/modules/snip-certificate-options/index.html b/modules/snip-certificate-options/index.html new file mode 100644 index 00000000000..8fef0833e46 --- /dev/null +++ b/modules/snip-certificate-options/index.html @@ -0,0 +1,114 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Use a custom CA certificate: Migrate after validating a custom CA certificate.

      +
    • +
    • +

      Use the system CA certificate: Migrate after validating the system CA certificate.

      +
    • +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
      +
        +
      1. +

        To use a custom CA certificate, leave the Skip certificate validation switch toggled to left, and either drag the CA certificate to the text box or browse for it and click Select.

        +
      2. +
      3. +

        To use the system CA certificate, leave the Skip certificate validation switch toggled to the left, and leave the CA certificate text box empty.

        +
      4. +
      5. +

        To skip certificate validation, toggle the Skip certificate validation switch to the right.

        +
      6. +
      +
      +
    • +
    +
    +
  2. +
  3. +

    Optional: Ask Forklift to fetch a custom CA certificate from the provider’s API endpoint URL.

    +
    +
      +
    1. +

      Click Fetch certificate from URL. The Verify certificate window opens.

      +
    2. +
    3. +

      If the details are correct, select the I trust the authenticity of this certificate checkbox, and then, click Confirm. If not, click Cancel, and then, enter the correct certificate information manually.

      +
      +

      Once confirmed, the CA certificate will be used to validate subsequent communication with the API endpoint.

      +
      +
    4. +
    +
    +
  4. +
+
+ + +
+ + diff --git a/modules/snip-migrating-luns/index.html b/modules/snip-migrating-luns/index.html new file mode 100644 index 00000000000..744a8f37172 --- /dev/null +++ b/modules/snip-migrating-luns/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+
    +
  • +

    Unlike disk images that are copied from a source provider to a target provider, LUNs are detached, but not removed, from virtual machines in the source provider and then attached to the virtual machines (VMs) that are created in the target provider.

    +
  • +
  • +

    LUNs are not removed from the source provider during the migration in case fallback to the source provider is required. However, before re-attaching the LUNs to VMs in the source provider, ensure that the LUNs are not used by VMs on the target environment at the same time, which might lead to data corruption.

    +
  • +
+
+
+
+ + +
+ + diff --git a/modules/snip_cold-warm-comparison-table/index.html b/modules/snip_cold-warm-comparison-table/index.html new file mode 100644 index 00000000000..812435ed30a --- /dev/null +++ b/modules/snip_cold-warm-comparison-table/index.html @@ -0,0 +1,100 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Both cold migration and warm migration have advantages and disadvantages, as described in the table that follows:

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Advantages and disadvantages of cold and warm migrations
Cold migrationWarm migration

Duration

Correlates to the amount of data on the disks

Correlates to the amount of data on the disks and VM utilization

Data transferred

Approximate sum of all disks

Approximate sum of all disks and VM utilization

VM downtime

High

Low

+ + +
+ + diff --git a/modules/snip_measured_boot_windows_vm/index.html b/modules/snip_measured_boot_windows_vm/index.html new file mode 100644 index 00000000000..092714a8fd9 --- /dev/null +++ b/modules/snip_measured_boot_windows_vm/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Windows VMs which are using Measured Boot cannot be migrated
+

Microsoft Windows virtual machines (VMs), which are using the Measured Boot feature, cannot be migrated because Measured Boot is a mechanism to prevent any kind of device changes, by checking each start-up component, including the firmware, all the way to the boot driver.

+
+
+

The alternative to migration is to re-create the Windows VM directly on KubeVirt.

+
+ + +
+ + diff --git a/modules/snip_performance/index.html b/modules/snip_performance/index.html new file mode 100644 index 00000000000..475dd208cab --- /dev/null +++ b/modules/snip_performance/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

The data provided here was collected from testing in Red Hat Labs and is provided for reference only. 

+
+
+

Overall, these numbers should be considered to show the best-case scenarios.

+
+
+

The observed performance of migration can differ from these results and depends on several factors.

+
+ + +
+ + diff --git a/modules/snip_permissions-info/index.html b/modules/snip_permissions-info/index.html new file mode 100644 index 00000000000..049761d64c0 --- /dev/null +++ b/modules/snip_permissions-info/index.html @@ -0,0 +1,85 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

If you are an administrator, you can see and work with components (providers, plans, etc.) for all projects.

+
+
+

If you are a non-administrator, you can only see and work only with the components of projects you have permissions for.

+
+
+ + + + + +
+
Tip
+
+
+

You can see which projects you have permissions for by clicking the Project list, which is in the upper-left of every page in the Migrations section except for the Overview.

+
+
+
+ + +
+ + diff --git a/modules/snip_plan-limits/index.html b/modules/snip_plan-limits/index.html new file mode 100644 index 00000000000..67c8de7072f --- /dev/null +++ b/modules/snip_plan-limits/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

A plan cannot contain more than 500 VMs or 500 disks.

+
+
+
+ + +
+ + diff --git a/modules/snip_qemu-guest-agent/index.html b/modules/snip_qemu-guest-agent/index.html new file mode 100644 index 00000000000..0737e81d5a4 --- /dev/null +++ b/modules/snip_qemu-guest-agent/index.html @@ -0,0 +1,74 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

VMware only: In cold migrations, in situations in which a package manager cannot be used during the migration, Forklift does not install the qemu-guest-agent daemon on the migrated VMs. This has some impact on the functionality of the migrated VMs, but overall, they are still expected to function.

+
+
+

To enable Forklift to automatically install qemu-guest-agent on the migrated VMs, ensure that your package manager can install the daemon during the first boot of the VM after migration.

+
+
+

If that is not possible, use your preferred automated or manual procedure to install qemu-guest-agent manually.

+
+ + +
+ + diff --git a/modules/snip_secure_boot_issue/index.html b/modules/snip_secure_boot_issue/index.html new file mode 100644 index 00000000000..9e0a6680e63 --- /dev/null +++ b/modules/snip_secure_boot_issue/index.html @@ -0,0 +1,72 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
VMs with Secure Boot enabled might not be migrated automatically
+

Virtual machines (VMs) with Secure Boot enabled currently might not be migrated automatically. This is because Secure Boot, a security standard developed by members of the PC industry to ensure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM), would prevent the VMs from booting on the destination provider. 

+
+
+

Workaround: The current workaround is to disable Secure Boot on the destination. For more details, see Disabling Secure Boot. (MTV-1548)

+
+ + +
+ + diff --git a/modules/snip_vmware-name-change/index.html b/modules/snip_vmware-name-change/index.html new file mode 100644 index 00000000000..540878e2a24 --- /dev/null +++ b/modules/snip_vmware-name-change/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

When you migrate a VMware 7 VM to an OKD 4.13+ platform that uses CentOS 7.9, the name of the network interfaces changes and the static IP configuration for the VM no longer works.

+
+
+
+ + +
+ + diff --git a/modules/snip_vmware-permissions/index.html b/modules/snip_vmware-permissions/index.html new file mode 100644 index 00000000000..06369f443ae --- /dev/null +++ b/modules/snip_vmware-permissions/index.html @@ -0,0 +1,86 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
forklift-controller consistently failing to reconcile a plan, and returning an HTTP 500 error
+
+

There is an issue with the forklift-controller consistently failing to reconcile a Migration Plan, and subsequently returning an HTTP 500 error. This issue is caused when you specify the user permissions only on the virtual machine (VM).

+
+
+

In Forklift, you need to add permissions at the datacenter level, which includes storage, networks, switches, and so on, which are used by the VM. You must then propagate the permissions to the child elements.

+
+
+

If you do not want to add this level of permissions, you must manually add the permissions to each object on the VM host required.

+
+
+
+ + +
+ + diff --git a/modules/snip_vmware_esxi_nfc/index.html b/modules/snip_vmware_esxi_nfc/index.html new file mode 100644 index 00000000000..6748a0baa87 --- /dev/null +++ b/modules/snip_vmware_esxi_nfc/index.html @@ -0,0 +1,79 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Note
+
+
+

You can also control the network from which disks are transferred from a host by using the Network File Copy (NFC) service in vSphere.

+
+
+
+ + +
+ + diff --git a/modules/snippet_getting_web_console_url_cli/index.html b/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 00000000000..516fd6d9d4f --- /dev/null +++ b/modules/snippet_getting_web_console_url_cli/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

+
+
+
+
$ kubectl get route virt -n konveyor-forklift \
+  -o custom-columns=:.spec.host
+
+
+
+

+ +The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

+
+
+

+ +.Example output

+
+
+
+
https://virt-konveyor-forklift.apps.cluster.openshift.com.
+
+
+ + +
+ + diff --git a/modules/snippet_getting_web_console_url_web/index.html b/modules/snippet_getting_web_console_url_web/index.html new file mode 100644 index 00000000000..ac2e683ec01 --- /dev/null +++ b/modules/snippet_getting_web_console_url_web/index.html @@ -0,0 +1,84 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
    +
  1. +

    Log in to the OKD web console.

    +
  2. +
  3. +

    Click NetworkingRoutes.

    +
  4. +
  5. +

    Select the {namespace} project in the Project: list.

    +
    +

    The URL for the forklift-ui service that opens the login page for the Forklift web console is displayed.

    +
    +
    +

    Click the URL to navigate to the Forklift web console.

    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/snippet_ova_tech_preview/index.html b/modules/snippet_ova_tech_preview/index.html new file mode 100644 index 00000000000..1131299dc56 --- /dev/null +++ b/modules/snippet_ova_tech_preview/index.html @@ -0,0 +1,87 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

+
+
+ + + + + +
+
Important
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/modules/source-vm-prerequisites/index.html b/modules/source-vm-prerequisites/index.html new file mode 100644 index 00000000000..99ddefb4ff3 --- /dev/null +++ b/modules/source-vm-prerequisites/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Source virtual machine prerequisites

+
+

The following prerequisites apply to all migrations:

+
+
+
    +
  • +

    ISO/CDROM disks must be unmounted.

    +
  • +
  • +

    Each NIC must contain one IPv4 and/or one IPv6 address.

    +
  • +
  • +

    The operating system of a VM must be certified and supported as a guest operating system with KubeVirt.

    +
  • +
  • +

    The name of a VM must not contain a period (.). Forklift changes any period in a VM name to a dash (-).

    +
  • +
  • +

    The name of a VM must not be the same as any other VM in the KubeVirt environment.

    +
    + + + + + +
    +
    Note
    +
    +
    +

    Forklift automatically assigns a new name to a VM that does not comply with the rules.

    +
    +
    +

    Forklift makes the following changes when it automatically generates a new VM name:

    +
    +
    +
      +
    • +

      Excluded characters are removed.

      +
    • +
    • +

      Uppercase letters are switched to lowercase letters.

      +
    • +
    • +

      Any underscore (_) is changed to a dash (-).

      +
    • +
    +
    +
    +

    This feature allows a migration to proceed smoothly even if someone enters a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_secure_boot_issue.adoc[]

+
+
+

Unresolved directive in source-vm-prerequisites.adoc - include::snip_measured_boot_windows_vm.adoc[]

+
+ + +
+ + diff --git a/modules/storage-support/index.html b/modules/storage-support/index.html new file mode 100644 index 00000000000..bc80ea1a379 --- /dev/null +++ b/modules/storage-support/index.html @@ -0,0 +1,211 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Storage support and default modes

+
+

Forklift uses the following default volume and access modes for supported storage.

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Default volume and access modes
ProvisionerVolume modeAccess mode

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

+
+ + + + + +
+
Note
+
+
+

If the KubeVirt storage does not support dynamic provisioning, you must apply the following settings:

+
+
+
    +
  • +

    Filesystem volume mode

    +
    +

    Filesystem volume mode is slower than Block volume mode.

    +
    +
  • +
  • +

    ReadWriteOnce access mode

    +
    +

    ReadWriteOnce access mode does not support live virtual machine migration.

    +
    +
  • +
+
+
+

See Enabling a statically-provisioned storage class for details on editing the storage profile.

+
+
+
+
+ + + + + +
+
Note
+
+
+

If your migration uses block storage and persistent volumes created with an EXT4 file system, increase the file system overhead in CDI to be more than 10%. The default overhead that is assumed by CDI does not completely include the reserved place for the root partition. If you do not increase the file system overhead in CDI by this amount, your migration might fail.

+
+
+
+
+ + + + + +
+
Note
+
+
+

When migrating from OpenStack or running a cold-migration from RHV to the OCP cluster that MTV is deployed on, the migration allocates persistent volumes without CDI. In these cases, you might need to adjust the file system overhead.

+
+
+

If the configured file system overhead, which has a default value of 10%, is too low, the disk transfer will fail due to lack of space. In such a case, you would want to increase the file system overhead.

+
+
+

In some cases, however, you might want to decrease the file system overhead to reduce storage consumption.

+
+
+

You can change the file system overhead by changing the value of the controller_filesystem_overhead in the spec portion of the forklift-controller CR, as described in Configuring the MTV Operator.

+
+
+
+ + +
+ + diff --git a/modules/technical-changes-2-7/index.html b/modules/technical-changes-2-7/index.html new file mode 100644 index 00000000000..a6ec6e67263 --- /dev/null +++ b/modules/technical-changes-2-7/index.html @@ -0,0 +1,73 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Technical changes

+
+

Forklift 2.7 has the following technical changes:

+
+
+
Upgraded virt-v2v to RHEL9 for warm migrations
+

Forklift previously used virt-v2v from Red Hat Enterprise Linux (RHEL) 8, which does not include bug fixes and features that are available in virt-v2v in RHEL9. In Forklift 2.7.0, components are updated to RHEL 9 in order to improve the functionality of warm migration. (MTV-1152)

+
+ + +
+ + diff --git a/modules/technology-preview/index.html b/modules/technology-preview/index.html new file mode 100644 index 00000000000..b28a788d27e --- /dev/null +++ b/modules/technology-preview/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
Important
+
+
+

{FeatureName} is a Technology Preview feature only. Technology Preview features +are not supported with Red Hat production service level agreements (SLAs) and +might not be functionally complete. Red Hat does not recommend using them +in production. These features provide early access to upcoming product +features, enabling customers to test functionality and provide feedback during +the development process.

+
+
+

For more information about the support scope of Red Hat Technology Preview +features, see https://access.redhat.com/support/offerings/techpreview/.

+
+
+
+ + +
+ + diff --git a/modules/uninstalling-mtv-cli/index.html b/modules/uninstalling-mtv-cli/index.html new file mode 100644 index 00000000000..50403e1afdd --- /dev/null +++ b/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,144 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI).

+
+
+ + + + + +
+
Note
+
+
+

This action does not remove resources managed by the Forklift Operator, including custom resource definitions (CRDs) and custom resources (CRs). To remove these after uninstalling the Forklift Operator, you might need to manually delete the Forklift Operator CRDs.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Delete the forklift controller by running the following command:

    +
    +
    +
    $ oc delete ForkliftController --all -n openshift-mtv
    +
    +
    +
  2. +
  3. +

    Delete the subscription to the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get subscription -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  4. +
  5. +

    Delete the clusterserviceversion for the Forklift Operator by running the following command:

    +
    +
    +
    $ oc get clusterserviceversion -o name|grep 'mtv-operator'| xargs oc delete
    +
    +
    +
  6. +
  7. +

    Delete the plugin console CR by running the following command:

    +
    +
    +
    $ oc delete ConsolePlugin forklift-console-plugin
    +
    +
    +
  8. +
  9. +

    Optional: Delete the custom resource definitions (CRDs) by running the following command:

    +
    +
    +
    kubectl get crd -o name | grep 'forklift.konveyor.io' | xargs kubectl delete
    +
    +
    +
  10. +
  11. +

    Optional: Perform cleanup by deleting the Forklift project by running the following command:

    +
    +
    +
    oc delete project openshift-mtv
    +
    +
    +
  12. +
+
+ + +
+ + diff --git a/modules/uninstalling-mtv-ui/index.html b/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 00000000000..a2f344f18eb --- /dev/null +++ b/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,168 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Uninstalling Forklift by using the OKD web console

+
+

You can uninstall Forklift by using the OKD web console.

+
+
+
Prerequisites
+
    +
  • +

    You must be logged in as a user with cluster-admin privileges.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click Operators > Installed Operators.

    +
  2. +
  3. +

    Click Forklift Operator.

    +
    +

    The Operator Details page opens in the Details tab.

    +
    +
  4. +
  5. +

    Click the ForkliftController tab.

    +
  6. +
  7. +

    Click Actions and select Delete ForkLiftController.

    +
    +

    A confirmation window opens.

    +
    +
  8. +
  9. +

    Click Delete.

    +
    +

    The controller is removed.

    +
    +
  10. +
  11. +

    Open the Details tab.

    +
    +

    The Create ForkliftController button appears instead of the controller you deleted. There is no need to click it.

    +
    +
  12. +
  13. +

    On the upper-right side of the page, click Actions and select Uninstall Operator.

    +
    +

    A confirmation window opens, displaying any operand instances.

    +
    +
  14. +
  15. +

    To delete all instances, select the Delete all operand instances for this operator checkbox. By default, the checkbox is cleared.

    +
    + + + + + +
    +
    Important
    +
    +
    +

    If your Operator configured off-cluster resources, these will continue to run and will require manual cleanup.

    +
    +
    +
    +
  16. +
  17. +

    Click Uninstall.

    +
    +

    The Installed Operators page opens, and the Forklift Operator is removed from the list of installed Operators.

    +
    +
  18. +
  19. +

    Click Home > Overview.

    +
  20. +
  21. +

    In the Status section of the page, click Dynamic Plugins.

    +
    +

    The Dynamic Plugins popup opens, listing forklift-console-plugin as a failed plugin. If the forklift-console-plugin does not appear as a failed plugin, refresh the web console.

    +
    +
  22. +
  23. +

    Click forklift-console-plugin.

    +
    +

    The ConsolePlugin details page opens in the Details tab.

    +
    +
  24. +
  25. +

    On the upper right-hand side of the page, click Actions and select Delete ConsolePlugin from the list.

    +
    +

    A confirmation window opens.

    +
    +
  26. +
  27. +

    Click Delete.

    +
    +

    The plugin is removed from the list of Dynamic plugins on the Overview page. If the plugin still appears, restart the Overview page.

    +
    +
  28. +
+
+ + +
+ + diff --git a/modules/updating-validation-rules-version/index.html b/modules/updating-validation-rules-version/index.html new file mode 100644 index 00000000000..75e3eba65f4 --- /dev/null +++ b/modules/updating-validation-rules-version/index.html @@ -0,0 +1,127 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Updating the inventory rules version

+
+

You must update the inventory rules version each time you update the rules so that the Provider Inventory service detects the changes and triggers the Validation service.

+
+
+

The rules version is recorded in a rules_version.rego file for each provider.

+
+
+
Procedure
+
    +
  1. +

    Retrieve the current rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 5
    +   }
    +}
    +
    +
    +
  2. +
  3. +

    Connect to the terminal of the Validation pod:

    +
    +
    +
    $ kubectl rsh <validation_pod>
    +
    +
    +
  4. +
  5. +

    Update the rules version in the /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego file.

    +
  6. +
  7. +

    Log out of the Validation pod terminal.

    +
  8. +
  9. +

    Verify the updated rules version:

    +
    +
    +
    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version (1)
    +
    +
    +
    +
    Example output
    +
    +
    {
    +   "result": {
    +       "rules_version": 6
    +   }
    +}
    +
    +
    +
  10. +
+
+ + +
+ + diff --git a/modules/upgrading-mtv-ui/index.html b/modules/upgrading-mtv-ui/index.html new file mode 100644 index 00000000000..d134a2552ee --- /dev/null +++ b/modules/upgrading-mtv-ui/index.html @@ -0,0 +1,127 @@ + + + + + + + + Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + +Upgrading Forklift | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Upgrading Forklift

+
+

You can upgrade the Forklift Operator by using the OKD web console to install the new version.

+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click OperatorsInstalled Operators{operator-name-ui}Subscription.

    +
  2. +
  3. +

    Change the update channel to the correct release.

    +
    +

    See Changing update channel in the OKD documentation.

    +
    +
  4. +
  5. +

    Confirm that Upgrade status changes from Up to date to Upgrade available. If it does not, restart the CatalogSource pod:

    +
    +
      +
    1. +

      Note the catalog source, for example, redhat-operators.

      +
    2. +
    3. +

      From the command line, retrieve the catalog source pod:

      +
      +
      +
      $ kubectl get pod -n openshift-marketplace | grep <catalog_source>
      +
      +
      +
    4. +
    5. +

      Delete the pod:

      +
      +
      +
      $ kubectl delete pod -n openshift-marketplace <catalog_source_pod>
      +
      +
      +
      +

      Upgrade status changes from Up to date to Upgrade available.

      +
      +
      +

      If you set Update approval on the Subscriptions tab to Automatic, the upgrade starts automatically.

      +
      +
    6. +
    +
    +
  6. +
  7. +

    If you set Update approval on the Subscriptions tab to Manual, approve the upgrade.

    +
    +

    See Manually approving a pending upgrade in the OKD documentation.

    +
    +
  8. +
  9. +

    If you are upgrading from Forklift 2.2 and have defined VMware source providers, edit the VMware provider by adding a VDDK init image. Otherwise, the update will change the state of any VMware providers to Critical. For more information, see Adding a VMSphere source provider.

    +
  10. +
  11. +

    If you mapped to NFS on the OKD destination provider in Forklift 2.2, edit the AccessModes and VolumeMode parameters in the NFS storage profile. Otherwise, the upgrade will invalidate the NFS mapping. For more information, see Customizing the storage profile.

    +
  12. +
+
+ + +
+ + diff --git a/modules/using-must-gather/index.html b/modules/using-must-gather/index.html new file mode 100644 index 00000000000..4186218891d --- /dev/null +++ b/modules/using-must-gather/index.html @@ -0,0 +1,157 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Using the must-gather tool

+
+

You can collect logs and information about Forklift custom resources (CRs) by using the must-gather tool. You must attach a must-gather data file to all customer cases.

+
+
+

You can gather data for a specific namespace, migration plan, or virtual machine (VM) by using the filtering options.

+
+
+ + + + + +
+
Note
+
+
+

If you specify a non-existent resource in the filtered must-gather command, no archive file is created.

+
+
+
+
+
Prerequisites
+
    +
  • +

    You must be logged in to the KubeVirt cluster as a user with the cluster-admin role.

    +
  • +
  • +

    You must have the OKD CLI (oc) installed.

    +
  • +
+
+
+
Collecting logs and CR information
+
    +
  1. +

    Navigate to the directory where you want to store the must-gather data.

    +
  2. +
  3. +

    Run the oc adm must-gather command:

    +
    +
    +
    $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest
    +
    +
    +
    +

    The data is saved as /must-gather/must-gather.tar.gz. You can upload this file to a support case on the Red Hat Customer Portal.

    +
    +
  4. +
  5. +

    Optional: Run the oc adm must-gather command with the following options to gather filtered data:

    +
    +
      +
    • +

      Namespace:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- NS=<namespace> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Migration plan:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- PLAN=<migration_plan> /usr/bin/targeted
      +
      +
      +
    • +
    • +

      Virtual machine:

      +
      +
      +
      $ oc adm must-gather --image=quay.io/konveyor/forklift-must-gather:latest \
      +  -- VM=<vm_id> NS=<namespace> /usr/bin/targeted (1)
      +
      +
      +
      +
        +
      1. +

        Specify the VM ID as it appears in the Plan CR.

        +
      2. +
      +
      +
    • +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/virt-migration-workflow/index.html b/modules/virt-migration-workflow/index.html new file mode 100644 index 00000000000..acd77fe2835 --- /dev/null +++ b/modules/virt-migration-workflow/index.html @@ -0,0 +1,209 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Detailed migration workflow

+
+

You can use the detailed migration workflow to troubleshoot a failed migration.

+
+
+

The workflow describes the following steps:

+
+
+

Warm Migration or migration to a remote {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create the Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
  7. +

    The CDI Controller service creates an importer pod.

    +
  8. +
  9. +

    The importer pod streams the VM disk to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The Migration Controller service creates a conversion pod with the PVCs attached to it when importing from VMWare.

    +
    +

    The conversion pod runs virt-v2v, which installs and configures device drivers on the PVCs of the target VM.

    +
    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from oVirt or {osp} to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates for each source VM disk a PersistentVolumeClaim CR, and an OvirtVolumePopulator when the source is oVirt, or an OpenstackVolumePopulator CR when the source is {osp}.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Populator Controller service creates a temporarily persistent volume claim (PVC).

    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
    +
      +
    • +

      The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

      +
    • +
    +
    +
  6. +
  7. +

    The Populator Controller service creates a populator pod.

    +
  8. +
  9. +

    The populator pod transfers the disk data to the PV.

    +
    +

    After the VM disks are transferred:

    +
    +
  10. +
  11. +

    The temporary PVC is deleted, and the initial PVC points to the PV with the data.

    +
  12. +
  13. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  14. +
  15. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  16. +
+
+
+

Cold migration from VMWare to the local {ocp-name} cluster:

+
+
+
    +
  1. +

    When you create a Migration custom resource (CR) to run a migration plan, the Migration Controller service creates a DataVolume CR for each source VM disk.

    +
    +

    For each VM disk:

    +
    +
  2. +
  3. +

    The Containerized Data Importer (CDI) Controller service creates a blank persistent volume claim (PVC) based on the parameters specified in the DataVolume CR.



    +
  4. +
  5. +

    If the StorageClass has a dynamic provisioner, the persistent volume (PV) is dynamically provisioned by the StorageClass provisioner.

    +
  6. +
+
+
+

For all VM disks:

+
+
+
    +
  1. +

    The Migration Controller service creates a dummy pod to bind all PVCs. The name of the pod contains pvcinit.

    +
  2. +
  3. +

    The Migration Controller service creates a conversion pod for all PVCs.

    +
  4. +
  5. +

    The conversion pod runs virt-v2v, which converts the VM to the KVM hypervisor and transfers the disks' data to their corresponding PVs.

    +
    +

    After the VM disks are transferred:

    +
    +
  6. +
  7. +

    The Migration Controller service creates a VirtualMachine CR for each source virtual machine (VM), connected to the PVCs.

    +
  8. +
  9. +

    If the VM ran on the source environment, the Migration Controller powers on the VM, the KubeVirt Controller service creates a virt-launcher pod and a VirtualMachineInstance CR.

    +
    +

    The virt-launcher pod runs QEMU-KVM with the PVCs attached as VM disks.

    +
    +
  10. +
+
+ + +
+ + diff --git a/modules/vmware-prerequisites/index.html b/modules/vmware-prerequisites/index.html new file mode 100644 index 00000000000..aac46167a4d --- /dev/null +++ b/modules/vmware-prerequisites/index.html @@ -0,0 +1,278 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

VMware prerequisites

+
+

It is strongly recommended to create a VDDK image to accelerate migrations. For more information, see Creating a VDDK image.

+
+
+

The following prerequisites apply to VMware migrations:

+
+
+
    +
  • +

    You must use a compatible version of VMware vSphere.

    +
  • +
  • +

    You must be logged in as a user with at least the minimal set of VMware privileges.

    +
  • +
  • +

    To access the virtual machine using a pre-migration hook, VMware Tools must be installed on the source virtual machine.

    +
  • +
  • +

    The VM operating system must be certified and supported for use as a guest operating system with KubeVirt and for conversion to KVM with virt-v2v.

    +
  • +
  • +

    If you are running a warm migration, you must enable changed block tracking (CBT) on the VMs and on the VM disks.

    +
  • +
  • +

    If you are migrating more than 10 VMs from an ESXi host in the same migration plan, you must increase the NFC service memory of the host.

    +
  • +
  • +

    It is strongly recommended to disable hibernation because Forklift does not support migrating hibernated VMs.

    +
  • +
+
+
+ + + + + +
+
Important
+
+
+

In the event of a power outage, data might be lost for a VM with disabled hibernation. However, if hibernation is not disabled, migration will fail

+
+
+
+
+ + + + + +
+
Note
+
+
+

Neither Forklift nor OpenShift Virtualization support conversion of Btrfs for migrating VMs from VMWare.

+
+
+
+

VMware privileges

+
+

The following minimal set of VMware privileges is required to migrate virtual machines to KubeVirt with the Forklift.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. VMware privileges
PrivilegeDescription

Virtual machine.Interaction privileges:

Virtual machine.Interaction.Power Off

Allows powering off a powered-on virtual machine. This operation powers down the guest operating system.

Virtual machine.Interaction.Power On

Allows powering on a powered-off virtual machine and resuming a suspended virtual machine.

Virtual machine.Guest operating system management by VIX API

Allows managing a virtual machine by the VMware VIX API.

+

Virtual machine.Provisioning privileges:

+
+
+ + + + + +
+
Note
+
+
+

All Virtual machine.Provisioning privileges are required.

+
+
+

Virtual machine.Provisioning.Allow disk access

Allows opening a disk on a virtual machine for random read and write access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow file access

Allows operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow read-only disk access

Allows opening a disk on a virtual machine for random read access. Used mostly for remote disk mounting.

Virtual machine.Provisioning.Allow virtual machine download

Allows read operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Allow virtual machine files upload

Allows write operations on files associated with a virtual machine, including VMX, disks, logs, and NVRAM.

Virtual machine.Provisioning.Clone template

Allows cloning of a template.

Virtual machine.Provisioning.Clone virtual machine

Allows cloning of an existing virtual machine and allocation of resources.

Virtual machine.Provisioning.Create template from virtual machine

Allows creation of a new template from a virtual machine.

Virtual machine.Provisioning.Customize guest

Allows customization of a virtual machine’s guest operating system without moving the virtual machine.

Virtual machine.Provisioning.Deploy template

Allows deployment of a virtual machine from a template.

Virtual machine.Provisioning.Mark as template

Allows marking an existing powered-off virtual machine as a template.

Virtual machine.Provisioning.Mark as virtual machine

Allows marking an existing template as a virtual machine.

Virtual machine.Provisioning.Modify customization specification

Allows creation, modification, or deletion of customization specifications.

Virtual machine.Provisioning.Promote disks

Allows promote operations on a virtual machine’s disks.

Virtual machine.Provisioning.Read customization specifications

Allows reading a customization specification.

Virtual machine.Snapshot management privileges:

Virtual machine.Snapshot management.Create snapshot

Allows creation of a snapshot from the virtual machine’s current state.

Virtual machine.Snapshot management.Remove Snapshot

Allows removal of a snapshot from the snapshot history.

Datastore privileges:

Datastore.Browse datastore

Allows exploring the contents of a datastore.

Datastore.Low level file operations

Allows performing low-level file operations - read, write, delete, and rename - in a datastore.

Sessions privileges:

Sessions.Validate session

Allows verification of the validity of a session.

Cryptographic privileges:

Cryptographic.Decrypt

Allows decryption of an encrypted virtual machine.

Cryptographic.Direct access

Allows access to encrypted resources.

+ + +
+ + diff --git a/redirects.json b/redirects.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000000..e087884e682 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: /sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000000..099c3c9d467 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,1080 @@ + + + +/modules/about-cold-warm-migration/ + + +/documentation/doc-Release_notes/modules/about-cold-warm-migration/ + + +/documentation/modules/about-cold-warm-migration/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/ + + +/documentation/modules/about-hook-crs-for-migration-plans-api/ + + +/documentation/doc-Release_notes/modules/about-hook-crs-for-migration-plans-api/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-hook-crs-for-migration-plans-api/ + + +/modules/about-hook-crs-for-migration-plans-api/ + + +/modules/about-rego-files/ + + +/documentation/modules/about-rego-files/ + + +/documentation/doc-Release_notes/modules/about-rego-files/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-rego-files/ + + +/modules/accessing-default-validation-rules/ + + +/documentation/doc-Release_notes/modules/accessing-default-validation-rules/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/ + + +/documentation/modules/accessing-default-validation-rules/ + + +/documentation/doc-Release_notes/modules/accessing-logs-cli/ + + +/modules/accessing-logs-cli/ + + +/documentation/modules/accessing-logs-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/ + + +/documentation/modules/accessing-logs-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/ + + +/documentation/doc-Release_notes/modules/accessing-logs-ui/ + + +/modules/accessing-logs-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hook-crs-to-migration-plans-api/ + + +/modules/adding-hook-crs-to-migration-plans-api/ + + +/documentation/modules/adding-hook-crs-to-migration-plans-api/ + + +/documentation/doc-Release_notes/modules/adding-hook-crs-to-migration-plans-api/ + + +/modules/adding-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/ + + +/documentation/doc-Release_notes/modules/adding-source-provider/ + + +/documentation/modules/adding-source-provider/ + + +/documentation/doc-Release_notes/modules/adding-virt-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/ + + +/documentation/modules/adding-virt-provider/ + + +/modules/adding-virt-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-cli/ + + +/modules/canceling-migration-cli/ + + +/documentation/doc-Release_notes/modules/canceling-migration-cli/ + + +/documentation/modules/canceling-migration-cli/ + + +/documentation/modules/canceling-migration-ui/ + + +/modules/canceling-migration-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/ + + +/documentation/doc-Release_notes/modules/canceling-migration-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/ + + +/documentation/doc-Release_notes/modules/changing-precopy-intervals/ + + +/modules/changing-precopy-intervals/ + + +/documentation/modules/changing-precopy-intervals/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/collected-logs-cr-info/ + + +/modules/collected-logs-cr-info/ + + +/documentation/doc-Release_notes/modules/collected-logs-cr-info/ + + +/documentation/modules/collected-logs-cr-info/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/ + + +/modules/common-attributes/ + + +/documentation/doc-Release_notes/modules/common-attributes/ + + +/documentation/modules/common-attributes/ + + +/modules/compatibility-guidelines/ + + +/documentation/modules/compatibility-guidelines/ + + +/documentation/doc-Release_notes/modules/compatibility-guidelines/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/configuring-mtv-operator/ + + +/documentation/doc-Release_notes/modules/configuring-mtv-operator/ + + +/documentation/modules/configuring-mtv-operator/ + + +/modules/configuring-mtv-operator/ + + +/documentation/doc-Release_notes/modules/creating-migration-plan-2-6-3/ + + +/modules/creating-migration-plan-2-6-3/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan-2-6-3/ + + +/documentation/modules/creating-migration-plan-2-6-3/ + + +/modules/creating-migration-plan/ + + +/documentation/doc-Release_notes/modules/creating-migration-plan/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/ + + +/documentation/modules/creating-migration-plan/ + + +/modules/creating-network-mapping/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/ + + +/documentation/modules/creating-network-mapping/ + + +/documentation/doc-Release_notes/modules/creating-network-mapping/ + + +/documentation/doc-Release_notes/modules/creating-storage-mapping/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-storage-mapping/ + + +/modules/creating-storage-mapping/ + + +/documentation/modules/creating-storage-mapping/ + + +/documentation/modules/creating-validation-rule/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/ + + +/modules/creating-validation-rule/ + + +/documentation/doc-Release_notes/modules/creating-validation-rule/ + + +/modules/creating-vddk-image/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/ + + +/documentation/doc-Release_notes/modules/creating-vddk-image/ + + +/documentation/modules/creating-vddk-image/ + + +/documentation/modules/error-messages/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/ + + +/modules/error-messages/ + + +/documentation/doc-Release_notes/modules/error-messages/ + + +/documentation/doc-Release_notes/modules/increasing-nfc-memory-vmware-host/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/increasing-nfc-memory-vmware-host/ + + +/documentation/modules/increasing-nfc-memory-vmware-host/ + + +/modules/increasing-nfc-memory-vmware-host/ + + +/ + + +/modules/installing-mtv-operator/ + + +/documentation/modules/installing-mtv-operator/ + + +/documentation/doc-Release_notes/modules/installing-mtv-operator/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/ + + +/documentation/doc-Release_notes/modules/known-issues-2-7/ + + +/modules/known-issues-2-7/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/known-issues-2-7/ + + +/documentation/modules/known-issues-2-7/ + + +/modules/making-open-source-more-inclusive/ + + +/documentation/modules/making-open-source-more-inclusive/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/ + + +/documentation/doc-Release_notes/modules/making-open-source-more-inclusive/ + + +/documentation/doc-Release_notes/master/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/master/ + + +/documentation/modules/migration-plan-options-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/ + + +/documentation/doc-Release_notes/modules/migration-plan-options-ui/ + + +/modules/migration-plan-options-ui/ + + +/documentation/modules/mtv-changelog-2-7/ + + +/documentation/doc-Release_notes/modules/mtv-changelog-2-7/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-changelog-2-7/ + + +/modules/mtv-changelog-2-7/ + + +/documentation/doc-Release_notes/modules/mtv-overview-page/ + + +/modules/mtv-overview-page/ + + +/documentation/modules/mtv-overview-page/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/ + + +/documentation/modules/mtv-performance-addendum/ + + +/documentation/doc-Release_notes/modules/mtv-performance-addendum/ + + +/modules/mtv-performance-addendum/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-addendum/ + + +/modules/mtv-performance-recommendation/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-performance-recommendation/ + + +/documentation/doc-Release_notes/modules/mtv-performance-recommendation/ + + +/documentation/modules/mtv-performance-recommendation/ + + +/documentation/doc-Release_notes/modules/mtv-resources-and-services/ + + +/modules/mtv-resources-and-services/ + + +/documentation/modules/mtv-resources-and-services/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/ + + +/modules/mtv-selected-packages-2-7/ + + +/documentation/modules/mtv-selected-packages-2-7/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-selected-packages-2-7/ + + +/documentation/doc-Release_notes/modules/mtv-selected-packages-2-7/ + + +/documentation/modules/mtv-settings/ + + +/documentation/doc-Release_notes/modules/mtv-settings/ + + +/modules/mtv-settings/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/ + + +/documentation/doc-Release_notes/modules/mtv-ui/ + + +/documentation/modules/mtv-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-ui/ + + +/modules/mtv-ui/ + + +/modules/mtv-workflow/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/ + + +/documentation/modules/mtv-workflow/ + + +/documentation/doc-Release_notes/modules/mtv-workflow/ + + +/modules/network-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/ + + +/documentation/doc-Release_notes/modules/network-prerequisites/ + + +/documentation/modules/network-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-features-and-enhancements-2-7/ + + +/modules/new-features-and-enhancements-2-7/ + + +/documentation/doc-Release_notes/modules/new-features-and-enhancements-2-7/ + + +/documentation/modules/new-features-and-enhancements-2-7/ + + +/documentation/modules/new-migrating-virtual-machines-cli/ + + +/modules/new-migrating-virtual-machines-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/new-migrating-virtual-machines-cli/ + + +/documentation/doc-Release_notes/modules/new-migrating-virtual-machines-cli/ + + +/documentation/modules/non-admin-permissions-for-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/ + + +/modules/non-admin-permissions-for-ui/ + + +/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/ + + +/documentation/doc-Release_notes/modules/obtaining-console-url/ + + +/modules/obtaining-console-url/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/ + + +/documentation/modules/obtaining-console-url/ + + +/modules/openstack-prerequisites/ + + +/documentation/modules/openstack-prerequisites/ + + +/documentation/doc-Release_notes/modules/openstack-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/ + + +/documentation/doc-Release_notes/modules/ostack-app-cred-auth/ + + +/documentation/modules/ostack-app-cred-auth/ + + +/modules/ostack-app-cred-auth/ + + +/documentation/doc-Release_notes/modules/ostack-token-auth/ + + +/documentation/modules/ostack-token-auth/ + + +/modules/ostack-token-auth/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/ + + +/documentation/modules/ova-prerequisites/ + + +/modules/ova-prerequisites/ + + +/documentation/doc-Release_notes/modules/ova-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/ + + +/documentation/modules/retrieving-validation-service-json/ + + +/modules/retrieving-validation-service-json/ + + +/documentation/doc-Release_notes/modules/retrieving-validation-service-json/ + + +/documentation/modules/retrieving-vmware-moref/ + + +/documentation/doc-Release_notes/modules/retrieving-vmware-moref/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-vmware-moref/ + + +/modules/retrieving-vmware-moref/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/ + + +/documentation/modules/rhv-prerequisites/ + + +/modules/rhv-prerequisites/ + + +/documentation/doc-Release_notes/modules/rhv-prerequisites/ + + +/documentation/modules/rn-2.0/ + + +/modules/rn-2.0/ + + +/documentation/doc-Release_notes/modules/rn-2.0/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/ + + +/documentation/modules/rn-2.1/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/ + + +/modules/rn-2.1/ + + +/documentation/doc-Release_notes/modules/rn-2.1/ + + +/documentation/modules/rn-2.2/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/ + + +/modules/rn-2.2/ + + +/documentation/doc-Release_notes/modules/rn-2.2/ + + +/documentation/modules/rn-2.3/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/ + + +/modules/rn-2.3/ + + +/documentation/doc-Release_notes/modules/rn-2.3/ + + +/documentation/modules/rn-2.4/ + + +/documentation/doc-Release_notes/modules/rn-2.4/ + + +/modules/rn-2.4/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/ + + +/documentation/modules/rn-2.5/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/ + + +/documentation/doc-Release_notes/modules/rn-2.5/ + + +/modules/rn-2.5/ + + +/documentation/doc-Release_notes/modules/rn-2.6/ + + +/documentation/modules/rn-2.6/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.6/ + + +/modules/rn-2.6/ + + +/documentation/modules/rn-2.7/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.7/ + + +/modules/rn-2.7/ + + +/documentation/doc-Release_notes/modules/rn-2.7/ + + +/documentation/modules/rn-27-resolved-issues/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-27-resolved-issues/ + + +/documentation/doc-Release_notes/modules/rn-27-resolved-issues/ + + +/modules/rn-27-resolved-issues/ + + +/documentation/modules/running-migration-plan/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/ + + +/modules/running-migration-plan/ + + +/documentation/doc-Release_notes/modules/running-migration-plan/ + + +/documentation/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/ + + +/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/modules/selecting-migration-network-for-vmware-source-provider/ + + +/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/modules/selecting-migration-network/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/ + + +/modules/selecting-migration-network/ + + +/documentation/doc-Release_notes/modules/selecting-migration-network/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-certificate-options/ + + +/documentation/modules/snip-certificate-options/ + + +/modules/snip-certificate-options/ + + +/documentation/doc-Release_notes/modules/snip-certificate-options/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/ + + +/documentation/modules/snip-migrating-luns/ + + +/modules/snip-migrating-luns/ + + +/documentation/doc-Release_notes/modules/snip-migrating-luns/ + + +/documentation/modules/snip_cold-warm-comparison-table/ + + +/modules/snip_cold-warm-comparison-table/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_cold-warm-comparison-table/ + + +/documentation/doc-Release_notes/modules/snip_cold-warm-comparison-table/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_measured_boot_windows_vm/ + + +/documentation/modules/snip_measured_boot_windows_vm/ + + +/modules/snip_measured_boot_windows_vm/ + + +/documentation/doc-Release_notes/modules/snip_measured_boot_windows_vm/ + + +/documentation/modules/snip_performance/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_performance/ + + +/modules/snip_performance/ + + +/documentation/doc-Release_notes/modules/snip_performance/ + + +/documentation/modules/snip_permissions-info/ + + +/modules/snip_permissions-info/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/ + + +/documentation/doc-Release_notes/modules/snip_permissions-info/ + + +/documentation/modules/snip_plan-limits/ + + +/modules/snip_plan-limits/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_plan-limits/ + + +/documentation/doc-Release_notes/modules/snip_plan-limits/ + + +/documentation/modules/snip_qemu-guest-agent/ + + +/modules/snip_qemu-guest-agent/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_qemu-guest-agent/ + + +/documentation/doc-Release_notes/modules/snip_qemu-guest-agent/ + + +/documentation/modules/snip_secure_boot_issue/ + + +/documentation/doc-Release_notes/modules/snip_secure_boot_issue/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_secure_boot_issue/ + + +/modules/snip_secure_boot_issue/ + + +/documentation/doc-Release_notes/modules/snip_vmware-name-change/ + + +/documentation/modules/snip_vmware-name-change/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-name-change/ + + +/modules/snip_vmware-name-change/ + + +/documentation/doc-Release_notes/modules/snip_vmware-permissions/ + + +/documentation/modules/snip_vmware-permissions/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware-permissions/ + + +/modules/snip_vmware-permissions/ + + +/documentation/doc-Release_notes/modules/snip_vmware_esxi_nfc/ + + +/documentation/modules/snip_vmware_esxi_nfc/ + + +/modules/snip_vmware_esxi_nfc/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_vmware_esxi_nfc/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/ + + +/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_cli/ + + +/documentation/modules/snippet_getting_web_console_url_cli/ + + +/modules/snippet_getting_web_console_url_cli/ + + +/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/ + + +/documentation/modules/snippet_getting_web_console_url_web/ + + +/modules/snippet_getting_web_console_url_web/ + + +/documentation/doc-Release_notes/modules/snippet_ova_tech_preview/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/ + + +/documentation/modules/snippet_ova_tech_preview/ + + +/modules/snippet_ova_tech_preview/ + + +/documentation/doc-Release_notes/modules/source-vm-prerequisites/ + + +/documentation/modules/source-vm-prerequisites/ + + +/modules/source-vm-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/ + + +/documentation/doc-Release_notes/modules/storage-support/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/ + + +/documentation/modules/storage-support/ + + +/modules/storage-support/ + + +/documentation/doc-Release_notes/modules/technical-changes-2-7/ + + +/documentation/modules/technical-changes-2-7/ + + +/modules/technical-changes-2-7/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technical-changes-2-7/ + + +/documentation/doc-Release_notes/modules/technology-preview/ + + +/documentation/modules/technology-preview/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/ + + +/modules/technology-preview/ + + +/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/ + + +/documentation/modules/uninstalling-mtv-cli/ + + +/modules/uninstalling-mtv-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/ + + +/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/ + + +/documentation/modules/uninstalling-mtv-ui/ + + +/modules/uninstalling-mtv-ui/ + + +/documentation/doc-Release_notes/modules/updating-validation-rules-version/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/ + + +/documentation/modules/updating-validation-rules-version/ + + +/modules/updating-validation-rules-version/ + + +/documentation/doc-Release_notes/modules/upgrading-mtv-ui/ + + +/documentation/modules/upgrading-mtv-ui/ + + +/modules/upgrading-mtv-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/upgrading-mtv-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/using-must-gather/ + + +/documentation/doc-Release_notes/modules/using-must-gather/ + + +/documentation/modules/using-must-gather/ + + +/modules/using-must-gather/ + + +/documentation/doc-Release_notes/modules/virt-migration-workflow/ + + +/documentation/modules/virt-migration-workflow/ + + +/modules/virt-migration-workflow/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/virt-migration-workflow/ + + +/documentation/doc-Release_notes/modules/vmware-prerequisites/ + + +/documentation/modules/vmware-prerequisites/ + + +/modules/vmware-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/issue_templates/issue/ + + +/documentation/doc-Release_notes/modules/issue_templates/issue/ + + +/documentation/modules/issue_templates/issue/ + + +/modules/issue_templates/issue/ + +