From 6b0ae813150b7c0776201cb637bdaa19b082b62b Mon Sep 17 00:00:00 2001 From: apinnick Date: Thu, 26 Oct 2023 19:32:52 -0500 Subject: [PATCH] [ci skip] Automated deployment to GitHub Pages on 1698366772 --- CNAME | 1 + CODE_OF_CONDUCT.md | 128 + CONTRIBUTING.md | 33 + Gemfile | 31 + Gemfile.lock | 318 + 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 | 5466 +++++++++++++++++ .../about-cold-warm-migration/index.html | 159 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + .../modules/adding-hooks/index.html | 106 + .../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 | 125 + .../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 | 177 + .../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 + .../index.html | 69 + .../migrating-virtual-machines-cli/index.html | 549 ++ .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-overview-page/index.html | 142 + .../mtv-resources-and-services/index.html | 131 + .../modules/mtv-settings/index.html | 133 + .../modules/mtv-ui/index.html | 91 + .../modules/mtv-workflow/index.html | 113 + .../modules/network-prerequisites/index.html | 196 + .../non-admin-permissions-for-ui/index.html | 187 + .../modules/obtaining-console-url/index.html | 107 + .../obtaining-vmware-fingerprint/index.html | 99 + .../openstack-prerequisites/index.html | 90 + .../osh-adding-source-provider/index.html | 137 + .../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/rhv-prerequisites/index.html | 88 + .../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 | 325 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 139 + .../selecting-migration-network/index.html | 118 + .../modules/snip-migrating-luns/index.html | 89 + .../modules/snip_permissions-info/index.html | 85 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 121 + .../modules/storage-support/index.html | 188 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 106 + .../modules/uninstalling-mtv-ui/index.html | 103 + .../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 | 248 + documentation/doc-Release_notes/docinfo.xml | 15 + .../doc-Release_notes/master/index.html | 1018 +++ .../about-cold-warm-migration/index.html | 159 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + .../modules/adding-hooks/index.html | 106 + .../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 | 125 + .../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 | 177 + .../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 + .../index.html | 69 + .../migrating-virtual-machines-cli/index.html | 549 ++ .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-overview-page/index.html | 142 + .../mtv-resources-and-services/index.html | 131 + .../modules/mtv-settings/index.html | 133 + .../modules/mtv-ui/index.html | 91 + .../modules/mtv-workflow/index.html | 113 + .../modules/network-prerequisites/index.html | 196 + .../non-admin-permissions-for-ui/index.html | 187 + .../modules/obtaining-console-url/index.html | 107 + .../obtaining-vmware-fingerprint/index.html | 99 + .../openstack-prerequisites/index.html | 90 + .../osh-adding-source-provider/index.html | 137 + .../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/rhv-prerequisites/index.html | 88 + .../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 | 325 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 139 + .../selecting-migration-network/index.html | 118 + .../modules/snip-migrating-luns/index.html | 89 + .../modules/snip_permissions-info/index.html | 85 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 121 + .../modules/storage-support/index.html | 188 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 106 + .../modules/uninstalling-mtv-ui/index.html | 103 + .../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 | 248 + .../about-cold-warm-migration/index.html | 159 + .../modules/about-rego-files/index.html | 104 + .../index.html | 108 + .../modules/accessing-logs-cli/index.html | 157 + .../modules/accessing-logs-ui/index.html | 92 + documentation/modules/adding-hooks/index.html | 106 + .../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 | 125 + .../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 | 177 + .../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 + .../index.html | 69 + .../migrating-virtual-machines-cli/index.html | 549 ++ .../migration-plan-options-ui/index.html | 141 + .../modules/mtv-overview-page/index.html | 142 + .../mtv-resources-and-services/index.html | 131 + 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 + .../non-admin-permissions-for-ui/index.html | 187 + .../modules/obtaining-console-url/index.html | 107 + .../obtaining-vmware-fingerprint/index.html | 99 + .../openstack-prerequisites/index.html | 90 + .../osh-adding-source-provider/index.html | 137 + .../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/rhv-prerequisites/index.html | 88 + 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 | 325 + .../modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 139 + .../selecting-migration-network/index.html | 118 + .../modules/snip-migrating-luns/index.html | 89 + .../modules/snip_permissions-info/index.html | 85 + .../index.html | 87 + .../index.html | 84 + .../snippet_ova_tech_preview/index.html | 87 + .../source-vm-prerequisites/index.html | 121 + .../modules/storage-support/index.html | 188 + .../modules/technology-preview/index.html | 88 + .../modules/uninstalling-mtv-cli/index.html | 106 + .../modules/uninstalling-mtv-ui/index.html | 103 + .../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 | 248 + feed.xml | 1 + index.html | 89 + jekyll-theme-cayman.gemspec | 22 + modules/about-cold-warm-migration/index.html | 159 + modules/about-rego-files/index.html | 104 + .../index.html | 108 + modules/accessing-logs-cli/index.html | 157 + modules/accessing-logs-ui/index.html | 92 + modules/adding-hooks/index.html | 106 + 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 | 125 + 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 | 177 + 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 + .../index.html | 69 + .../migrating-virtual-machines-cli/index.html | 549 ++ modules/migration-plan-options-ui/index.html | 141 + modules/mtv-overview-page/index.html | 142 + modules/mtv-resources-and-services/index.html | 131 + modules/mtv-settings/index.html | 133 + modules/mtv-ui/index.html | 91 + modules/mtv-workflow/index.html | 113 + modules/network-prerequisites/index.html | 196 + .../non-admin-permissions-for-ui/index.html | 187 + modules/obtaining-console-url/index.html | 107 + .../obtaining-vmware-fingerprint/index.html | 99 + modules/openstack-prerequisites/index.html | 90 + modules/osh-adding-source-provider/index.html | 137 + 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/rhv-prerequisites/index.html | 88 + 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 | 325 + modules/running-migration-plan/index.html | 135 + .../index.html | 100 + .../index.html | 139 + .../selecting-migration-network/index.html | 118 + modules/snip-migrating-luns/index.html | 89 + modules/snip_permissions-info/index.html | 85 + .../index.html | 87 + .../index.html | 84 + modules/snippet_ova_tech_preview/index.html | 87 + modules/source-vm-prerequisites/index.html | 121 + modules/storage-support/index.html | 188 + modules/technology-preview/index.html | 88 + modules/uninstalling-mtv-cli/index.html | 106 + modules/uninstalling-mtv-ui/index.html | 103 + .../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 | 248 + redirects.json | 1 + robots.txt | 1 + sitemap.xml | 816 +++ 354 files changed, 51053 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-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-hooks/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/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/making-open-source-more-inclusive/index.html create mode 100644 documentation/doc-Migration_Toolkit_for_Virtualization/modules/migrating-virtual-machines-cli/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-overview-page/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-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/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/obtaining-vmware-fingerprint/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/osh-adding-source-provider/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/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/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-migrating-luns/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/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/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-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-hooks/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/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/making-open-source-more-inclusive/index.html create mode 100644 documentation/doc-Release_notes/modules/migrating-virtual-machines-cli/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-overview-page/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-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/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/obtaining-vmware-fingerprint/index.html create mode 100644 documentation/doc-Release_notes/modules/openstack-prerequisites/index.html create mode 100644 documentation/doc-Release_notes/modules/osh-adding-source-provider/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/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/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-migrating-luns/index.html create mode 100644 documentation/doc-Release_notes/modules/snip_permissions-info/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/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-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-hooks/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/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/making-open-source-more-inclusive/index.html create mode 100644 documentation/modules/migrating-virtual-machines-cli/index.html create mode 100644 documentation/modules/migration-plan-options-ui/index.html create mode 100644 documentation/modules/mtv-overview-page/index.html create mode 100644 documentation/modules/mtv-resources-and-services/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/non-admin-permissions-for-ui/index.html create mode 100644 documentation/modules/obtaining-console-url/index.html create mode 100644 documentation/modules/obtaining-vmware-fingerprint/index.html create mode 100644 documentation/modules/openstack-prerequisites/index.html create mode 100644 documentation/modules/osh-adding-source-provider/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/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/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-migrating-luns/index.html create mode 100644 documentation/modules/snip_permissions-info/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/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-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-hooks/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/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/making-open-source-more-inclusive/index.html create mode 100644 modules/migrating-virtual-machines-cli/index.html create mode 100644 modules/migration-plan-options-ui/index.html create mode 100644 modules/mtv-overview-page/index.html create mode 100644 modules/mtv-resources-and-services/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/non-admin-permissions-for-ui/index.html create mode 100644 modules/obtaining-console-url/index.html create mode 100644 modules/obtaining-vmware-fingerprint/index.html create mode 100644 modules/openstack-prerequisites/index.html create mode 100644 modules/osh-adding-source-provider/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/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/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-migrating-luns/index.html create mode 100644 modules/snip_permissions-info/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/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 000000000000..4993baf651d2 --- /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 000000000000..ddee46731823 --- /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 000000000000..7f375065b01a --- /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 000000000000..c7b0183bfd4a --- /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 000000000000..38e39b49e70e --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,318 @@ +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.1.1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + asciidoctor (2.0.20) + ast (2.4.2) + base64 (0.1.1) + bigdecimal (3.1.4) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.10) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + drb (2.1.1) + ruby2_keywords + 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.9.1) + faraday (2.7.11) + base64 + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) + ffi (1.16.3) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.4.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + 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.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.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.1) + concurrent-ruby (~> 1.0) + jekyll (3.9.3) + addressable (~> 2.4) + colorator (~> 1.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) + jekyll-asciidoc (3.0.0) + asciidoctor (>= 1.5.0) + jekyll (>= 3.0.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 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.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.6.3) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.20.0) + mutex_m (0.1.2) + nokogiri (1.15.4-x86_64-linux) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + parallel (1.23.0) + parser (3.2.2.4) + ast (~> 2.4.1) + racc + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.7.1) + rainbow (3.1.1) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + regexp_parser (2.8.2) + rexml (3.2.6) + rouge (3.26.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.30.0) + parser (>= 3.2.1.0) + ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) + 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) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + w3c_validators (1.3.7) + json (>= 1.8) + nokogiri (~> 1.6) + rexml (~> 3.2) + 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 000000000000..d64569567334 --- /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 000000000000..266420bdba9e --- /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 000000000000..bd2894d6a271 --- /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 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 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 000000000000..8a846e6361aa --- /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 000000000000..a8038cdf9239 --- /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 000000000000..2d6d6c6b5150 --- /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 000000000000..2f4f8fd4d31c --- /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 000000000000..bb612757d2b9 --- /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 000000000000..5e00530db482 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/master/index.html @@ -0,0 +1,5466 @@ + + + + + + + + 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

    +
  • +
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

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

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/.

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

Migration using OpenStack source providers only supports VMs that use only Cinder volumes.

+
+
+
+ +
+

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.

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

Migration using OpenStack source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+

Cold migration

+
+

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

+
+
+
+

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 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.

+
+
+
+
+
+
+

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.

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

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.

+
+
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+
+
+

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 2. 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 3. 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 VM operating system must be certified and supported for use as a guest operating system with KubeVirt.

    +
  • +
  • +

    VM names must contain only lowercase letters (a-z), numbers (0-9), or hyphens (-), up to a maximum of 253 characters. The first and last characters must be alphanumeric. The name must not contain uppercase letters, spaces, periods (.), or special characters.

    +
  • +
  • +

    VM names must not duplicate the name of a 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 entered a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+
+
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

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

    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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+
+
+

OpenStack prerequisites

+
+

The following prerequisites apply to OpenStack migrations:

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

Migration using OpenStack source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+

Additional authentication methods for migrations with OpenStack source providers

+
+

Forklift versions 2.5 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.

    +
  • +
  • +

    You must install VMware Tools on all source virtual machines (VMs).

    +
  • +
  • +

    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.

    +
  • +
  • +

    You must obtain the SHA-1 fingerprint of the vCenter 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.

    +
  • +
  • +

    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 4. 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.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.

+
+

Creating a VDDK image

+
+

Forklift uses the VMware Virtual Disk Development Kit (VDDK) SDK to transfer virtual disks from VMware vSphere.

+
+
+

You must download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry. You need the VDDK init image path in order to add a VMware source provider.

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

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

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    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.

    +
    + + + + + +
    + + +
    +

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

    +
    +
    +
    +
  6. +
  7. +

    Save the VDDK archive file in the temporary directory.

    +
  8. +
  9. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  10. +
  11. +

    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
    +
    +
    +
  12. +
  13. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  14. +
  15. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  16. +
  17. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  18. +
+
+
+
+

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    + + + + + +
    1Specify the IP address or FQDN of the vCenter host.
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+
+
+

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 5. Compatible software versions
ForkliftOKDKubeVirtVMware vSphereoVirtOpenStack

2.5.1

4.12 or later

4.12 or later

6.5 or later

4.4 SP1 or later

16.1 or later

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

MTV 2.5 was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3.

+
+
+

As oVirt 4.3 lacks the improvements that were introduced in oVirt 4.4 for Forklift, and new features were not tested with oVirt 4.3, migrations from oVirt 4.3 may not function at the same level as migrations from oVirt 4.4, with some functionality may be missing.

+
+
+

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.

+
+
+
+
+
+
+
+

Installing 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.

+
+
+

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. +
+
+
+
+
+
+

Migrating virtual machines by using the OKD web console

+
+
+

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

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

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 displays the following information:

+
+
+
    +
  • +

    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

      +
    • +
    +
    +
  • +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the 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.

      +
    • +
    +
    +
  • +
+
+
+
+

Configuring MTV settings

+
+

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

+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 6. 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 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 add a VMware vSphere source provider by using the OKD web console.

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

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
+
    +
  • +

    VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
+
+
+
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:

    +
    +
      +
    • +

      Provider resource name: Name of the source provider.

      +
    • +
    • +

      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.

      +
    • +
    • +

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

      +
    • +
    • +

      Password: vCenter user password.

      +
    • +
    • +

      SHA-1 fingerprint: The provider currently requires the SHA-1 fingerprint of the vCenter Server’s TLS certificate in all circumstances. vSphere calls this the server’s thumbprint.

      +
    • +
    +
    +
  8. +
  9. +

    Choose one of the following options for validating CA certificates:

    +
    +
      +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
    • +
    • +

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

      +
      +
        +
      1. +

        To skip certificate validation, select the Skip certificate validation check box.

        +
      2. +
      3. +

        To validate the system CA certificates, leave the Skip certificate validation check box cleared.

        +
      4. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Click Create to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  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:

    +
    +
      +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
    • +
    • +

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

      +
      +
        +
      1. +

        To skip certificate validation, select the Skip certificate validation check box.

        +
      2. +
      3. +

        To validate a custom CA certificate, leave the Skip certificate validation check box cleared and either drag the CA certificate to the text box or browse for it and click Select.

        +
      4. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Click Create to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  12. +
+
+
+
+
Adding an OpenStack source provider
+
+

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

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

Migration using OpenStack source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
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:

    +
    +
      +
    • +

      Skip certificate validation : Migrate without validating a CA certificate.

      +
    • +
    • +

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

      +
      +
        +
      1. +

        To skip certificate validation, select the Skip certificate validation check box.

        +
      2. +
      3. +

        To validate a custom CA certificate, leave the Skip certificate validation check box cleared and either drag the CA certificate to the text box or browse for it and click Select.

        +
      4. +
      +
      +
    • +
    +
    +
  10. +
  11. +

    Click Create to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  12. +
+
+
+
+
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.

+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

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

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/.

+
+
+
+
+
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 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.

+
+
+
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. +

    Click Create to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+
+
+
+

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. +

    Click Create to add and save the provider.

    +
    +

    The provider appears in the list of providers.

    +
    +
  10. +
+
+
+
+
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 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. +
+
+
+
+

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 OpenStack, 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. +
+
+
+
+

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 OpenStack, 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.

      +
      + + + + + +
      + + +
      +

      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>.

        +
        + + + + + +
        + + +
        +

        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 Options menu kebab of the migration plan and select View details to verify the migration plan details.

    +
    +
  34. +
+
+
+
+

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.

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

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 7. 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 8. 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.konveyer.io

plans

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

forklift.konveyer.io

migrations

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

forklift.konveyer.io

hooks

get, list, watch

forklift.konveyer.io

providers

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

forklift.konveyer.io

networkmaps

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

forklift.konveyer.io

storagemaps

get, list, watch

forklift.konveyer.io

forkliftcontrollers

+
+ + + + + +
+ + +
+

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.

+
+
+
+
+
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs).

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

You must specify a name for cluster-scoped CRs.

+
+
+

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

+
+
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

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

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/.

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

Migration using OpenStack source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Prerequisites
+
    +
  • +

    VMware only: You must have a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
  • +

    oVirt (oVirt) only: 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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+
+
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: <provider_type> (2)
    +    createdForResourceType: providers
    +type: Opaque
    +stringData: (3)
    +  user: <user> (4)
    +  password: <password> (5)
    +  insecureSkipVerify: <true/false> (6)
    +  domainName: <domain_name> (7)
    +  projectName: <project_name> (8)
    +  regionName: <region name> (9)
    +  cacert: | (10)
    +    <ca_certificate>
    +  url: <api_end_point> (11)
    +  thumbprint: <vcenter_fingerprint> (12)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The ownerReferences section is optional.
    2Specify the type of source provider. Allowed values are ovirt, vsphere, openstack, and ova. This label is needed to verify the credentials are correct when the remote system is accessible and, for oVirt, to retrieve the Engine CA certificate when a third-party certificate is specified.
    3The stringData section for OVA is different and is described in a note that follows the description of the Secret manifest.
    4Specify the vCenter user, the oVirt Engine user, or the OpenStack user.
    5Specify the user password.
    6Specify <true> to skip certificate verification, which 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. Specifying <false> verifies the certificate.
    7OpenStack only: Specify the domain name.
    8OpenStack only: Specify the project name.
    9OpenStack only: Specify the name of the OpenStack region.
    10oVirt and OpenStack only: For oVirt, enter 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. For OpenStack, enter the CA certificate for connecting to the source environment. The certificate is not used when insecureSkipVerify is set to <true>.
    11Specify 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.
    12VMware only: Specify the vCenter SHA-1 fingerprint.
    +
    +
    + + + + + +
    + + +
    +

    The stringData section for an OVA Secret manifest is as follows:

    +
    +
    +
    +
    stringData:
    +  url: <nfs_server:/nfs_path>
    +
    +
    +
    +

    where:
    +nfs_server: An IP or hostname of the server where the share was created.
    +nfs_path : The path on the server where the OVA files are stored.

    +
    +
    +
    +
  2. +
  3. +

    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: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  settings:
    +    vddkInitImage: <registry_route_or_server_path>/vddk:<tag> (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +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.
    3VMware only: Specify the VDDK image that you created.
    4Specify the name of provider Secret CR.
    +
    +
  4. +
  5. +

    VMware only: 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 Provider CR.
    2Specify the managed object reference (MOR) of the VMware host.
    3Specify the IP address of the VMware migration network.
    +
    +
  6. +
  7. +

    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> (3)
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (4)
    +        namespace: <network_attachment_definition_namespace> (5)
    +        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.
    3Specify the VMware network MOR, the oVirt network UUID, or the OpenStack network UUID.
    4Specify a network attachment definition for each additional KubeVirt network.
    5Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.
    +
    +
  8. +
  9. +

    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)
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode>
    +      source:
    +        id: <source_datastore>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1Allowed values are ReadWriteOnce and ReadWriteMany.
    2Specify the VMware data storage MOR, the oVirt storage domain UUID, or the OpenStack volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.
    +
    +
  10. +
  11. +

    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 (1)
    +  playbook: | (2)
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    + + + + + + + + + +
    1You 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.
    2Optional: Base64-encoded Ansible playbook. If you specify a playbook, the image must be hook-runner.
    +
    +
  12. +
  13. +

    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: true (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>
    +  targetNamespace: <target_namespace>
    +  vms: (8)
    +    - id: <source_vm> (9)
    +    - name: <source_vm>
    +      namespace: <namespace> (10)
    +      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 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.
    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.
    8For all source providers except for KubeVirt, you can use either the id or the name parameter to specify the source VMs.
    +KubeVirt source provider only: You can use only the name parameter, not the id. parameter to specify the source VMs.
    9Specify the VMware VM MOR, oVirt VM UUID or the OpenStack VM UUID.
    10KubeVirt source provider only.
    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.
    +
    +
  14. +
  15. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration> (1)
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <plan> (2)
    +    namespace: <namespace>
    +  cutover: <cutover_time> (3)
    +EOF
    +
    +
    +
    + + + + + + + + + + + + + +
    1Specify the name of the Migration CR.
    2Specify the name of the Plan CR that you are running. The Migration CR creates a VirtualMachine CR for each VM that is migrated.
    3Optional: Specify a cutover time according to the ISO 8601 format with the UTC time offset, for example, 2021-04-04T01:23:45.678+09:00.
    +
    +
    +

    You can associate multiple Migration CRs with a single Plan CR. If a migration does not complete, you can create a new Migration CR, without changing the Plan CR, to migrate the remaining VMs.

    +
    +
  16. +
  17. +

    Retrieve the Migration CR to monitor the progress of the migration:

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

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    + + + + + +
    1Specify the IP address or FQDN of the vCenter host.
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+
+
+

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. +
+
+
+
+

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. +
+
+
+
+

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. +
+
+
+
+
+
+
+

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 Addding 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 to delete the konveyor-forklift project and custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Click HomeProjects.

    +
  2. +
  3. +

    Locate the konveyor-forklift project.

    +
  4. +
  5. +

    On the right side of the project, select Delete Project from the Options menu kebab.

    +
  6. +
  7. +

    In the Delete Project pane, enter the project name and click Delete.

    +
  8. +
  9. +

    Click AdministrationCustomResourceDefinitions.

    +
  10. +
  11. +

    Enter forklift in the Search field to locate the CRDs in the forklift.konveyor.io group.

    +
  12. +
  13. +

    On the right side of each CRD, select Delete CustomResourceDefinition from the Options menu kebab.

    +
  14. +
+
+
+
+

Uninstalling Forklift from the command line interface

+
+

You can uninstall Forklift from the command line interface (CLI) by deleting the konveyor-forklift project and the forklift.konveyor.io custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Delete the project:

    +
    +
    +
    $ kubectl delete project konveyor-forklift
    +
    +
    +
  2. +
  3. +

    Delete the CRDs:

    +
    +
    +
    $ kubectl get crd -o name | grep 'forklift' | xargs kubectl delete
    +
    +
    +
  4. +
  5. +

    Delete the OAuthClient:

    +
    +
    +
    $ kubectl delete oauthclient/forklift-ui
    +
    +
    +
  6. +
+
+
+
+
+
+

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 be 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. +
+
+
+
+
+
+ + +
+ + 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 000000000000..69fe83a9069a --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/index.html @@ -0,0 +1,159 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
+
+

Cold migration

+
+
+

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

+
+
+
+
+

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 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.

+
+
+
+ + +
+ + 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 000000000000..6da4f62aa41c --- /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 000000000000..068e99d96757 --- /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 000000000000..a978aee411e5 --- /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 000000000000..b59fa6022e0c --- /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-hooks/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hooks/index.html new file mode 100644 index 000000000000..2b789c76c222 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hooks/index.html @@ -0,0 +1,106 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding hooks

+
+

Hooks are custom code that you can run at certain stages of the migration. You can define a hook by using an Ansible playbook or a custom hook container.

+
+
+

You can create a hook before a migration plan or while creating a migration plan.

+
+
+
Prerequisites
+
    +
  • +

    You must create an Ansible playbook or a custom hook container.

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

    In the web console, click Hooks.

    +
  2. +
  3. +

    Click Create hook.

    +
  4. +
  5. +

    Specify the hook Name.

    +
  6. +
  7. +

    Select Ansible playbook or Custom container image as the Hook definition.

    +
  8. +
  9. +

    If you select Custom container image, specify the image location, for example, quay.io/github_project/container_name:container_id.

    +
  10. +
  11. +

    Select a migration step and click Add.

    +
    +

    The new migration hook appears in the Hooks list.

    +
    +
  12. +
+
+ + +
+ + 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 000000000000..3b186b2ac904 --- /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 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 000000000000..5c309299fa1e --- /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 000000000000..391ae67142d7 --- /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.

      +
    2. +
    +
    +
    +

    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. +
+
+ + +
+ + 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 000000000000..9011060d6a39 --- /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 000000000000..01bcb3627517 --- /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.

      +
    2. +
    +
    +
    +

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

    +
    +
  • +
+
+ + +
+ + 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 000000000000..b6bdc4b4a82f --- /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 000000000000..3777ffe1087b --- /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 000000000000..f2d4440dbd58 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/index.html @@ -0,0 +1,125 @@ + + + + + + + + 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.5.1

4.12 or later

4.12 or later

6.5 or later

4.4 SP1 or later

16.1 or later

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

MTV 2.5 was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3.

+
+
+

As oVirt 4.3 lacks the improvements that were introduced in oVirt 4.4 for Forklift, and new features were not tested with oVirt 4.3, migrations from oVirt 4.3 may not function at the same level as migrations from oVirt 4.4, with some functionality may be missing.

+
+
+

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.

+
+
+
+ + +
+ + 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 000000000000..f7cfa0903ff5 --- /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 000000000000..e914d349a7db --- /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 000000000000..70e282b56e12 --- /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 000000000000..e7cdf3aa46c1 --- /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 000000000000..ad133eaef3bb --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/index.html @@ -0,0 +1,177 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift uses the VMware Virtual Disk Development Kit (VDDK) SDK to transfer virtual disks from VMware vSphere.

+
+
+

You must download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry. You need the VDDK init image path in order to add a VMware source provider.

+
+
+ + + + + +
+
Note
+
+
+

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

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    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.

    +
    + + + + + +
    +
    Note
    +
    +
    +

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

    +
    +
    +
    +
  6. +
  7. +

    Save the VDDK archive file in the temporary directory.

    +
  8. +
  9. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  10. +
  11. +

    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
    +
    +
    +
  12. +
  13. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  14. +
  15. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  16. +
  17. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  18. +
+
+ + +
+ + 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 000000000000..28a8b1f22907 --- /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 be 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 000000000000..999c62adec4c --- /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 000000000000..473e21ba4e2a --- /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 000000000000..33a031a09092 --- /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 000000000000..e73192c01025 --- /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 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 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 000000000000..8a846e6361aa --- /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 000000000000..a8038cdf9239 --- /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 000000000000..9c1dc6d02b9c --- /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 000000000000..30d52ab9cbae --- /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 000000000000..7c14fc04caff --- /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/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 000000000000..ef044a75eb6f --- /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/migrating-virtual-machines-cli/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migrating-virtual-machines-cli/index.html new file mode 100644 index 000000000000..25c65068b7f5 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migrating-virtual-machines-cli/index.html @@ -0,0 +1,549 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs).

+
+
+ + + + + +
+
Important
+
+
+

You must specify a name for cluster-scoped CRs.

+
+
+

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

+
+
+
+
+

Unresolved directive in migrating-virtual-machines-cli.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Prerequisites
+
    +
  • +

    VMware only: You must have a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
  • +

    oVirt (oVirt) only: 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 migrating-virtual-machines-cli.adoc - include::snip-migrating-luns.adoc[]

+
+
+
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: <provider_type> (2)
    +    createdForResourceType: providers
    +type: Opaque
    +stringData: (3)
    +  user: <user> (4)
    +  password: <password> (5)
    +  insecureSkipVerify: <true/false> (6)
    +  domainName: <domain_name> (7)
    +  projectName: <project_name> (8)
    +  regionName: <region name> (9)
    +  cacert: | (10)
    +    <ca_certificate>
    +  url: <api_end_point> (11)
    +  thumbprint: <vcenter_fingerprint> (12)
    +EOF
    +
    +
    +
    +
      +
    1. +

      The ownerReferences section is optional.

      +
    2. +
    3. +

      Specify the type of source provider. Allowed values are ovirt, vsphere, openstack, and ova. This label is needed to verify the credentials are correct when the remote system is accessible and, for oVirt, to retrieve the Engine CA certificate when a third-party certificate is specified.

      +
    4. +
    5. +

      The stringData section for OVA is different and is described in a note that follows the description of the Secret manifest.

      +
    6. +
    7. +

      Specify the vCenter user, the oVirt Engine user, or the {osp} user.

      +
    8. +
    9. +

      Specify the user password.

      +
    10. +
    11. +

      Specify <true> to skip certificate verification, which 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. Specifying <false> verifies the certificate.

      +
    12. +
    13. +

      {osp} only: Specify the domain name.

      +
    14. +
    15. +

      {osp} only: Specify the project name.

      +
    16. +
    17. +

      {osp} only: Specify the name of the {osp} region.

      +
    18. +
    19. +

      oVirt and {osp} only: For oVirt, enter 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. For {osp}, enter the CA certificate for connecting to the source environment. The certificate is not used when insecureSkipVerify is set to <true>.

      +
    20. +
    21. +

      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}.

      +
    22. +
    23. +

      VMware only: Specify the vCenter SHA-1 fingerprint.

      +
    24. +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    The stringData section for an OVA Secret manifest is as follows:

    +
    +
    +
    +
    stringData:
    +  url: <nfs_server:/nfs_path>
    +
    +
    +
    +

    where:
    +nfs_server: An IP or hostname of the server where the share was created.
    +nfs_path : The path on the server where the OVA files are stored.

    +
    +
    +
    +
  2. +
  3. +

    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: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  settings:
    +    vddkInitImage: <registry_route_or_server_path>/vddk:<tag> (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +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. +

      VMware only: Specify the VDDK image that you created.

      +
    6. +
    7. +

      Specify the name of provider Secret CR.

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

    VMware only: 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
    +
    +
    +
    +
      +
    1. +

      Specify the name of the VMware Provider CR.

      +
    2. +
    3. +

      Specify the managed object reference (MOR) of the VMware host.

      +
    4. +
    5. +

      Specify the IP address of the VMware migration network.

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

    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> (3)
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (4)
    +        namespace: <network_attachment_definition_namespace> (5)
    +        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
    +
    +
    +
    +
      +
    1. +

      Allowed values are pod and multus.

      +
    2. +
    3. +

      You can use either the id or the name parameter to specify the source network.

      +
    4. +
    5. +

      Specify the VMware network MOR, the oVirt network UUID, or the {osp} network UUID.

      +
    6. +
    7. +

      Specify a network attachment definition for each additional KubeVirt network.

      +
    8. +
    9. +

      Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.

      +
    10. +
    +
    +
  8. +
  9. +

    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)
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode>
    +      source:
    +        id: <source_datastore>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ReadWriteOnce and ReadWriteMany.

      +
    2. +
    3. +

      Specify the VMware data storage MOR, the oVirt storage domain UUID, or the {osp} volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.

      +
    4. +
    +
    +
  10. +
  11. +

    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 (1)
    +  playbook: | (2)
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +
      +
    1. +

      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.

      +
    2. +
    3. +

      Optional: Base64-encoded Ansible playbook. If you specify a playbook, the image must be hook-runner.

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

    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: true (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>
    +  targetNamespace: <target_namespace>
    +  vms: (8)
    +    - id: <source_vm> (9)
    +    - name: <source_vm>
    +      namespace: <namespace> (10)
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Plan CR.

      +
    2. +
    3. +

      Specify 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.

      +
    4. +
    5. +

      Specify only one network map and one storage map per plan.

      +
    6. +
    7. +

      Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.

      +
    8. +
    9. +

      Specify the name of the NetworkMap CR.

      +
    10. +
    11. +

      Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.

      +
    12. +
    13. +

      Specify the name of the StorageMap CR.

      +
    14. +
    15. +

      For all source providers except for KubeVirt, you can use either the id or the name parameter to specify the source VMs.
      +KubeVirt source provider only: You can use only the name parameter, not the id. parameter to specify the source VMs.

      +
    16. +
    17. +

      Specify the VMware VM MOR, oVirt VM UUID or the {osp} VM UUID.

      +
    18. +
    19. +

      KubeVirt source provider only.

      +
    20. +
    21. +

      Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.

      +
    22. +
    23. +

      Specify the name of the Hook CR.

      +
    24. +
    25. +

      Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.

      +
    26. +
    +
    +
  14. +
  15. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration> (1)
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <plan> (2)
    +    namespace: <namespace>
    +  cutover: <cutover_time> (3)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    3. +

      Specify the name of the Plan CR that you are running. The Migration CR creates a VirtualMachine CR for each VM that is migrated.

      +
    4. +
    5. +

      Optional: Specify a cutover time according to the ISO 8601 format with the UTC time offset, for example, 2021-04-04T01:23:45.678+09:00.

      +
    6. +
    +
    +
    +

    You can associate multiple Migration CRs with a single Plan CR. If a migration does not complete, you can create a new Migration CR, without changing the Plan CR, to migrate the remaining VMs.

    +
    +
  16. +
  17. +

    Retrieve the Migration CR to monitor the progress of the migration:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  18. +
+
+ + +
+ + 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 000000000000..23c30bbf19bd --- /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-overview-page/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html new file mode 100644 index 000000000000..328462f37f8f --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/index.html @@ -0,0 +1,142 @@ + + + + + + + + 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 displays the following information:

+
+
+
    +
  • +

    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

      +
    • +
    +
    +
  • +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the 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.

      +
    • +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..7dfdcd9213e0 --- /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-settings/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/index.html new file mode 100644 index 000000000000..500d199122b2 --- /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 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 000000000000..040fc1c2a7b0 --- /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 000000000000..deae0079dd8c --- /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 000000000000..0a637b485535 --- /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/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 000000000000..c3b77cc7d721 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,187 @@ + + + + + + + + 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.konveyer.io

plans

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

forklift.konveyer.io

migrations

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

forklift.konveyer.io

hooks

get, list, watch

forklift.konveyer.io

providers

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

forklift.konveyer.io

networkmaps

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

forklift.konveyer.io

storagemaps

get, list, watch

forklift.konveyer.io

forkliftcontrollers

+
+ + + + + +
+
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 000000000000..93832da27426 --- /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/obtaining-vmware-fingerprint/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-vmware-fingerprint/index.html new file mode 100644 index 000000000000..e7dbdd4ec2dd --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-vmware-fingerprint/index.html @@ -0,0 +1,99 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    +
      +
    1. +

      Specify the IP address or FQDN of the vCenter host.

      +
    2. +
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..a566ebd02727 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/index.html @@ -0,0 +1,90 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/modules/osh-adding-source-provider/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/osh-adding-source-provider/index.html new file mode 100644 index 000000000000..a34681bd4970 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/osh-adding-source-provider/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding an {osp} source provider

+
+

You can add an {osp} source provider by using the OKD web console.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select Red Hat OpenStack Platform from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Name to display in the list of providers

      +
    • +
    • +

      {osp} Identity server URL: {osp} Identity (Keystone) endpoint, for example, http://controller:5000/v3

      +
    • +
    • +

      {osp} username: For example, admin

      +
    • +
    • +

      {osp} password:

      +
    • +
    • +

      Domain:

      +
    • +
    • +

      Project:

      +
    • +
    • +

      Region:

      +
    • +
    +
    +
  8. +
  9. +

    To allow a migration without validating the provider’s CA certificate, select the Skip certificate validation check box. By default, the checkbox is cleared, meaning that the certificate will be validated.

    +
  10. +
  11. +

    If you did not select Skip certificate validation, the CA certificate field is visible. Drag the CA certificate used to connect to the source environment to the text box or browse for it and click Select. If you did select the check box, the CA certificate text box is not visible.

    +
  12. +
  13. +

    Click Create to add and save the provider.

    +
    +

    The source provider appears in the list of providers.

    +
    +
  14. +
+
+ + +
+ + 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 000000000000..1d3e8a9f4a9b --- /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 000000000000..4ccbc63bdb0f --- /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 000000000000..c90073d9620c --- /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 000000000000..71f8c66cfcaa --- /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/rhv-prerequisites/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html new file mode 100644 index 000000000000..790c18c92193 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+ +
+
+

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 000000000000..07019e0217ba --- /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 000000000000..8905c5d55bba --- /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 000000000000..12805d65e3fb --- /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 000000000000..2dfff571dcdb --- /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 000000000000..2e3e74da8c17 --- /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 000000000000..4d26b6ce8ffa --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/index.html @@ -0,0 +1,325 @@ + + + + + + + + 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.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

EMS enforcement is disabled for migrations with VMware vSphere source providers to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of 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 MTV 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration using OVA files created by 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 as well as a destination provider. You can migrate VMs from the cluster that MTV 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 RHV, direct 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, the following authentication methods are supported: 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
+

The VMware vSphere source provider can now be created without specifying a VDDK init image. It is strongly recommended to create a VDDK init image to accelerate migrations.

+
+
+
+
+

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 running a new migration plan with the same name, or if deleting a migrated VM and remigrating 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 do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while a snapshot operation is performed on the source VM
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If a 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)

+
+
+
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 may 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 may instantly 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)

+
+
+

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:

+
+
+
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.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. 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 MTV 2.5.2. It is advised to update to this version of MTV 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 MTV 2.5 versions before MTV 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 MTV 2.5.2. It is advised to update to this version of MTV or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In previous 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 previous 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 previous 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 previous 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 previous 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 the snapshot creation could not be triggered.

+
+
+

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 previous 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 previous 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 may boot from non-bootable disk after migration
+

In previous 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 are able to boot on the target OKD cluster. (MTV-433)

+
+
+

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/running-migration-plan/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/running-migration-plan/index.html new file mode 100644 index 000000000000..05ea751dd3d5 --- /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 000000000000..bf718c2fcbcc --- /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 000000000000..230e5e7fb695 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,139 @@ + + + + + + + + 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.

+
+
+
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 must 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 000000000000..67e7324e8a45 --- /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-migrating-luns/index.html b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html new file mode 100644 index 000000000000..fabcfe1ccdf2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/index.html @@ -0,0 +1,89 @@ + + + + + + + + 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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+ + +
+ + 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 000000000000..a26c63d8c88b --- /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/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 000000000000..aab1e029fe28 --- /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 000000000000..b96b38eb9bf7 --- /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 000000000000..ce09b0ad1ad4 --- /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 000000000000..e509bb85d1ae --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/index.html @@ -0,0 +1,121 @@ + + + + + + + + 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 VM operating system must be certified and supported for use as a guest operating system with KubeVirt.

    +
  • +
  • +

    VM names must contain only lowercase letters (a-z), numbers (0-9), or hyphens (-), up to a maximum of 253 characters. The first and last characters must be alphanumeric. The name must not contain uppercase letters, spaces, periods (.), or special characters.

    +
  • +
  • +

    VM names must not duplicate the name of a 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 entered a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..0c38b7799fb2 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/index.html @@ -0,0 +1,188 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
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.

+
+
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ + +
+ + 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 000000000000..397ac28bd899 --- /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 000000000000..bed9ea9e1f61 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,106 @@ + + + + + + + + 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) by deleting the {namespace} project and the forklift.konveyor.io custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Delete the project:

    +
    +
    +
    $ kubectl delete project konveyor-forklift
    +
    +
    +
  2. +
  3. +

    Delete the CRDs:

    +
    +
    +
    $ kubectl get crd -o name | grep 'forklift' | xargs kubectl delete
    +
    +
    +
  4. +
  5. +

    Delete the OAuthClient:

    +
    +
    +
    $ kubectl delete oauthclient/forklift-ui
    +
    +
    +
  6. +
+
+ + +
+ + 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 000000000000..623d78374b47 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,103 @@ + + + + + + + + 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 to delete the {namespace} project and custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Click HomeProjects.

    +
  2. +
  3. +

    Locate the konveyor-forklift project.

    +
  4. +
  5. +

    On the right side of the project, select Delete Project from the {kebab}.

    +
  6. +
  7. +

    In the Delete Project pane, enter the project name and click Delete.

    +
  8. +
  9. +

    Click AdministrationCustomResourceDefinitions.

    +
  10. +
  11. +

    Enter forklift in the Search field to locate the CRDs in the forklift.konveyor.io group.

    +
  12. +
  13. +

    On the right side of each CRD, select Delete CustomResourceDefinition from the {kebab}.

    +
  14. +
+
+ + +
+ + 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 000000000000..0e127cbaed78 --- /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 000000000000..888073f208d8 --- /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 Addding 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 000000000000..83cdfeb130b3 --- /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 000000000000..e8b462492b8a --- /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 000000000000..12dbb6eaa016 --- /dev/null +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/modules/vmware-prerequisites/index.html @@ -0,0 +1,248 @@ + + + + + + + + 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.

    +
  • +
  • +

    You must install VMware Tools on all source virtual machines (VMs).

    +
  • +
  • +

    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.

    +
  • +
  • +

    You must obtain the SHA-1 fingerprint of the vCenter 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.

    +
  • +
  • +

    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.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.

+ + +
+ + diff --git a/documentation/doc-Release_notes/docinfo.xml b/documentation/doc-Release_notes/docinfo.xml new file mode 100644 index 000000000000..b35cd5a2260b --- /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 000000000000..581038eb3f19 --- /dev/null +++ b/documentation/doc-Release_notes/master/index.html @@ -0,0 +1,1018 @@ + + + + + + + + Release notes | Forklift Documentation + + + + + + + + + + + + + +Release notes | Forklift Documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+

Release notes

+ +
+

Forklift 2.5

+
+
+

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

    +
  • +
+
+
+

The release notes describe technical changes, new features and enhancements, and known issues.

+
+
+

Technical changes

+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

EMS enforcement is disabled for migrations with VMware vSphere source providers to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of 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 MTV 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
+

New features and enhancements

+
+

This release has the following features and improvements:

+
+
+
Migration using OVA files created by 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)

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

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.

+
+
+
+
+

Migration using one or more Open Virtual Appliance (OVA) files as a source provider is a Technology Preview.

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

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/.

+
+
+
+
+
Migrating VMs between OKD clusters
+

In Forklift 2.3, you can now use Red Hat KubeVirt provider as a source provider as well as a destination provider. You can migrate VMs from the cluster that MTV 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 RHV, direct 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, the following authentication methods are supported: 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
+

The VMware vSphere source provider can now be created without specifying a VDDK init image. It is strongly recommended to create a VDDK init image to accelerate migrations.

+
+
+
+

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 running a new migration plan with the same name, or if deleting a migrated VM and remigrating 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 do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while a snapshot operation is performed on the source VM
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If a 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)

+
+
+
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 may 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 OpenShift Virtualization. (MTV-491)

+
+
+
Import OVA: ConnectionTestFailed message appears when adding OVA provider
+

When adding an OVA provider, the error message ConnectionTestFailed may instantly 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)

+
+
+

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:

+
+
+
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.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. 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 MTV 2.5.2. It is advised to update to this version of MTV 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 MTV 2.5 versions before MTV 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 MTV 2.5.2. It is advised to update to this version of MTV or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In previous 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 previous 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 previous 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 previous 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 previous 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 the snapshot creation could not be triggered.

+
+
+

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 previous 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 previous 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 may boot from non-bootable disk after migration
+

In previous 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 are able to boot on the target OKD cluster. (MTV-433)

+
+
+

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)

+
+
+
+
+
+

Forklift 2.4

+
+
+

Migrate virtual machines (VMs) from VMware vSphere or oVirt or OpenStack 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 OpenStack 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)

+
+
+
+
+
+

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)

+
+
+
+
+
+

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)

+
+
+
+
+
+

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)

+
+
+
+
+
+

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.

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

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/about-cold-warm-migration/index.html b/documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html new file mode 100644 index 000000000000..6c738c0965c9 --- /dev/null +++ b/documentation/doc-Release_notes/modules/about-cold-warm-migration/index.html @@ -0,0 +1,159 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
+
+

Cold migration

+
+
+

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

+
+
+
+
+

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 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.

+
+
+
+ + +
+ + 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 000000000000..a5f9a80994b7 --- /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 000000000000..445fbb7ecc78 --- /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 000000000000..95d9fb5e9e21 --- /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 000000000000..87ddff727f98 --- /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-hooks/index.html b/documentation/doc-Release_notes/modules/adding-hooks/index.html new file mode 100644 index 000000000000..0f042586e81a --- /dev/null +++ b/documentation/doc-Release_notes/modules/adding-hooks/index.html @@ -0,0 +1,106 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding hooks

+
+

Hooks are custom code that you can run at certain stages of the migration. You can define a hook by using an Ansible playbook or a custom hook container.

+
+
+

You can create a hook before a migration plan or while creating a migration plan.

+
+
+
Prerequisites
+
    +
  • +

    You must create an Ansible playbook or a custom hook container.

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

    In the web console, click Hooks.

    +
  2. +
  3. +

    Click Create hook.

    +
  4. +
  5. +

    Specify the hook Name.

    +
  6. +
  7. +

    Select Ansible playbook or Custom container image as the Hook definition.

    +
  8. +
  9. +

    If you select Custom container image, specify the image location, for example, quay.io/github_project/container_name:container_id.

    +
  10. +
  11. +

    Select a migration step and click Add.

    +
    +

    The new migration hook appears in the Hooks list.

    +
    +
  12. +
+
+ + +
+ + 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 000000000000..af121b897672 --- /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 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 000000000000..9110dcb10b12 --- /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 000000000000..21458fcc5f71 --- /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.

      +
    2. +
    +
    +
    +

    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. +
+
+ + +
+ + 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 000000000000..8d558c5006b4 --- /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 000000000000..7167f62c424d --- /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.

      +
    2. +
    +
    +
    +

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

    +
    +
  • +
+
+ + +
+ + 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 000000000000..c6a1f51919f8 --- /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 000000000000..b43bd189f9e0 --- /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 000000000000..679240c8d091 --- /dev/null +++ b/documentation/doc-Release_notes/modules/compatibility-guidelines/index.html @@ -0,0 +1,125 @@ + + + + + + + + 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.5.1

4.12 or later

4.12 or later

6.5 or later

4.4 SP1 or later

16.1 or later

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

MTV 2.5 was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3.

+
+
+

As oVirt 4.3 lacks the improvements that were introduced in oVirt 4.4 for Forklift, and new features were not tested with oVirt 4.3, migrations from oVirt 4.3 may not function at the same level as migrations from oVirt 4.4, with some functionality may be missing.

+
+
+

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.

+
+
+
+ + +
+ + 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 000000000000..5ff5a761c718 --- /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 000000000000..204f2489cb23 --- /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 000000000000..8309653b7322 --- /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 000000000000..317a6d738123 --- /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 000000000000..d655d9e02879 --- /dev/null +++ b/documentation/doc-Release_notes/modules/creating-vddk-image/index.html @@ -0,0 +1,177 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift uses the VMware Virtual Disk Development Kit (VDDK) SDK to transfer virtual disks from VMware vSphere.

+
+
+

You must download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry. You need the VDDK init image path in order to add a VMware source provider.

+
+
+ + + + + +
+
Note
+
+
+

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

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    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.

    +
    + + + + + +
    +
    Note
    +
    +
    +

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

    +
    +
    +
    +
  6. +
  7. +

    Save the VDDK archive file in the temporary directory.

    +
  8. +
  9. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  10. +
  11. +

    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
    +
    +
    +
  12. +
  13. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  14. +
  15. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  16. +
  17. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  18. +
+
+ + +
+ + 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 000000000000..a1e98f40c94d --- /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 be 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 000000000000..999c62adec4c --- /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 000000000000..473e21ba4e2a --- /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 000000000000..33a031a09092 --- /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 000000000000..e73192c01025 --- /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 000000000000..8a846e6361aa --- /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 000000000000..a8038cdf9239 --- /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 000000000000..db207e10b0e7 --- /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 000000000000..30d52ab9cbae --- /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 000000000000..30fda1824891 --- /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/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 000000000000..64db79e6f0eb --- /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/migrating-virtual-machines-cli/index.html b/documentation/doc-Release_notes/modules/migrating-virtual-machines-cli/index.html new file mode 100644 index 000000000000..8f98401697cc --- /dev/null +++ b/documentation/doc-Release_notes/modules/migrating-virtual-machines-cli/index.html @@ -0,0 +1,549 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs).

+
+
+ + + + + +
+
Important
+
+
+

You must specify a name for cluster-scoped CRs.

+
+
+

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

+
+
+
+
+

Unresolved directive in migrating-virtual-machines-cli.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Prerequisites
+
    +
  • +

    VMware only: You must have a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
  • +

    oVirt (oVirt) only: 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 migrating-virtual-machines-cli.adoc - include::snip-migrating-luns.adoc[]

+
+
+
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: <provider_type> (2)
    +    createdForResourceType: providers
    +type: Opaque
    +stringData: (3)
    +  user: <user> (4)
    +  password: <password> (5)
    +  insecureSkipVerify: <true/false> (6)
    +  domainName: <domain_name> (7)
    +  projectName: <project_name> (8)
    +  regionName: <region name> (9)
    +  cacert: | (10)
    +    <ca_certificate>
    +  url: <api_end_point> (11)
    +  thumbprint: <vcenter_fingerprint> (12)
    +EOF
    +
    +
    +
    +
      +
    1. +

      The ownerReferences section is optional.

      +
    2. +
    3. +

      Specify the type of source provider. Allowed values are ovirt, vsphere, openstack, and ova. This label is needed to verify the credentials are correct when the remote system is accessible and, for oVirt, to retrieve the Engine CA certificate when a third-party certificate is specified.

      +
    4. +
    5. +

      The stringData section for OVA is different and is described in a note that follows the description of the Secret manifest.

      +
    6. +
    7. +

      Specify the vCenter user, the oVirt Engine user, or the {osp} user.

      +
    8. +
    9. +

      Specify the user password.

      +
    10. +
    11. +

      Specify <true> to skip certificate verification, which 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. Specifying <false> verifies the certificate.

      +
    12. +
    13. +

      {osp} only: Specify the domain name.

      +
    14. +
    15. +

      {osp} only: Specify the project name.

      +
    16. +
    17. +

      {osp} only: Specify the name of the {osp} region.

      +
    18. +
    19. +

      oVirt and {osp} only: For oVirt, enter 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. For {osp}, enter the CA certificate for connecting to the source environment. The certificate is not used when insecureSkipVerify is set to <true>.

      +
    20. +
    21. +

      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}.

      +
    22. +
    23. +

      VMware only: Specify the vCenter SHA-1 fingerprint.

      +
    24. +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    The stringData section for an OVA Secret manifest is as follows:

    +
    +
    +
    +
    stringData:
    +  url: <nfs_server:/nfs_path>
    +
    +
    +
    +

    where:
    +nfs_server: An IP or hostname of the server where the share was created.
    +nfs_path : The path on the server where the OVA files are stored.

    +
    +
    +
    +
  2. +
  3. +

    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: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  settings:
    +    vddkInitImage: <registry_route_or_server_path>/vddk:<tag> (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +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. +

      VMware only: Specify the VDDK image that you created.

      +
    6. +
    7. +

      Specify the name of provider Secret CR.

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

    VMware only: 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
    +
    +
    +
    +
      +
    1. +

      Specify the name of the VMware Provider CR.

      +
    2. +
    3. +

      Specify the managed object reference (MOR) of the VMware host.

      +
    4. +
    5. +

      Specify the IP address of the VMware migration network.

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

    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> (3)
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (4)
    +        namespace: <network_attachment_definition_namespace> (5)
    +        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
    +
    +
    +
    +
      +
    1. +

      Allowed values are pod and multus.

      +
    2. +
    3. +

      You can use either the id or the name parameter to specify the source network.

      +
    4. +
    5. +

      Specify the VMware network MOR, the oVirt network UUID, or the {osp} network UUID.

      +
    6. +
    7. +

      Specify a network attachment definition for each additional KubeVirt network.

      +
    8. +
    9. +

      Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.

      +
    10. +
    +
    +
  8. +
  9. +

    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)
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode>
    +      source:
    +        id: <source_datastore>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ReadWriteOnce and ReadWriteMany.

      +
    2. +
    3. +

      Specify the VMware data storage MOR, the oVirt storage domain UUID, or the {osp} volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.

      +
    4. +
    +
    +
  10. +
  11. +

    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 (1)
    +  playbook: | (2)
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +
      +
    1. +

      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.

      +
    2. +
    3. +

      Optional: Base64-encoded Ansible playbook. If you specify a playbook, the image must be hook-runner.

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

    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: true (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>
    +  targetNamespace: <target_namespace>
    +  vms: (8)
    +    - id: <source_vm> (9)
    +    - name: <source_vm>
    +      namespace: <namespace> (10)
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Plan CR.

      +
    2. +
    3. +

      Specify 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.

      +
    4. +
    5. +

      Specify only one network map and one storage map per plan.

      +
    6. +
    7. +

      Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.

      +
    8. +
    9. +

      Specify the name of the NetworkMap CR.

      +
    10. +
    11. +

      Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.

      +
    12. +
    13. +

      Specify the name of the StorageMap CR.

      +
    14. +
    15. +

      For all source providers except for KubeVirt, you can use either the id or the name parameter to specify the source VMs.
      +KubeVirt source provider only: You can use only the name parameter, not the id. parameter to specify the source VMs.

      +
    16. +
    17. +

      Specify the VMware VM MOR, oVirt VM UUID or the {osp} VM UUID.

      +
    18. +
    19. +

      KubeVirt source provider only.

      +
    20. +
    21. +

      Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.

      +
    22. +
    23. +

      Specify the name of the Hook CR.

      +
    24. +
    25. +

      Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.

      +
    26. +
    +
    +
  14. +
  15. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration> (1)
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <plan> (2)
    +    namespace: <namespace>
    +  cutover: <cutover_time> (3)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    3. +

      Specify the name of the Plan CR that you are running. The Migration CR creates a VirtualMachine CR for each VM that is migrated.

      +
    4. +
    5. +

      Optional: Specify a cutover time according to the ISO 8601 format with the UTC time offset, for example, 2021-04-04T01:23:45.678+09:00.

      +
    6. +
    +
    +
    +

    You can associate multiple Migration CRs with a single Plan CR. If a migration does not complete, you can create a new Migration CR, without changing the Plan CR, to migrate the remaining VMs.

    +
    +
  16. +
  17. +

    Retrieve the Migration CR to monitor the progress of the migration:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  18. +
+
+ + +
+ + 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 000000000000..735783665c9d --- /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-overview-page/index.html b/documentation/doc-Release_notes/modules/mtv-overview-page/index.html new file mode 100644 index 000000000000..1059fc7a7a60 --- /dev/null +++ b/documentation/doc-Release_notes/modules/mtv-overview-page/index.html @@ -0,0 +1,142 @@ + + + + + + + + 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 displays the following information:

+
+
+
    +
  • +

    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

      +
    • +
    +
    +
  • +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the 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.

      +
    • +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..4203a7d49f23 --- /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-settings/index.html b/documentation/doc-Release_notes/modules/mtv-settings/index.html new file mode 100644 index 000000000000..40e513798c04 --- /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 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 000000000000..52a71c7ef03a --- /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 000000000000..196ddd56c764 --- /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 000000000000..76fae8df3858 --- /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/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 000000000000..c116269ab823 --- /dev/null +++ b/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,187 @@ + + + + + + + + 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.konveyer.io

plans

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

forklift.konveyer.io

migrations

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

forklift.konveyer.io

hooks

get, list, watch

forklift.konveyer.io

providers

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

forklift.konveyer.io

networkmaps

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

forklift.konveyer.io

storagemaps

get, list, watch

forklift.konveyer.io

forkliftcontrollers

+
+ + + + + +
+
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 000000000000..e9d267705b07 --- /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/obtaining-vmware-fingerprint/index.html b/documentation/doc-Release_notes/modules/obtaining-vmware-fingerprint/index.html new file mode 100644 index 000000000000..fbe2aeed7842 --- /dev/null +++ b/documentation/doc-Release_notes/modules/obtaining-vmware-fingerprint/index.html @@ -0,0 +1,99 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    +
      +
    1. +

      Specify the IP address or FQDN of the vCenter host.

      +
    2. +
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..ab9450c9055c --- /dev/null +++ b/documentation/doc-Release_notes/modules/openstack-prerequisites/index.html @@ -0,0 +1,90 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+ + +
+ + diff --git a/documentation/doc-Release_notes/modules/osh-adding-source-provider/index.html b/documentation/doc-Release_notes/modules/osh-adding-source-provider/index.html new file mode 100644 index 000000000000..ea9baccc90bd --- /dev/null +++ b/documentation/doc-Release_notes/modules/osh-adding-source-provider/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding an {osp} source provider

+
+

You can add an {osp} source provider by using the OKD web console.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select Red Hat OpenStack Platform from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Name to display in the list of providers

      +
    • +
    • +

      {osp} Identity server URL: {osp} Identity (Keystone) endpoint, for example, http://controller:5000/v3

      +
    • +
    • +

      {osp} username: For example, admin

      +
    • +
    • +

      {osp} password:

      +
    • +
    • +

      Domain:

      +
    • +
    • +

      Project:

      +
    • +
    • +

      Region:

      +
    • +
    +
    +
  8. +
  9. +

    To allow a migration without validating the provider’s CA certificate, select the Skip certificate validation check box. By default, the checkbox is cleared, meaning that the certificate will be validated.

    +
  10. +
  11. +

    If you did not select Skip certificate validation, the CA certificate field is visible. Drag the CA certificate used to connect to the source environment to the text box or browse for it and click Select. If you did select the check box, the CA certificate text box is not visible.

    +
  12. +
  13. +

    Click Create to add and save the provider.

    +
    +

    The source provider appears in the list of providers.

    +
    +
  14. +
+
+ + +
+ + 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 000000000000..3fc5a4d35f76 --- /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 000000000000..f70c7d143eca --- /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 000000000000..a044bd94f3a1 --- /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 000000000000..ea8ff4ce01d4 --- /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/rhv-prerequisites/index.html b/documentation/doc-Release_notes/modules/rhv-prerequisites/index.html new file mode 100644 index 000000000000..6321a092e98c --- /dev/null +++ b/documentation/doc-Release_notes/modules/rhv-prerequisites/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+ +
+
+

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 000000000000..5b399e1c6890 --- /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 000000000000..7ac87a559abf --- /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 000000000000..efa3f7654449 --- /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 000000000000..6d53f8b162db --- /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 000000000000..52451f97d5e0 --- /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 000000000000..ea8aa6789425 --- /dev/null +++ b/documentation/doc-Release_notes/modules/rn-2.5/index.html @@ -0,0 +1,325 @@ + + + + + + + + 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.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

EMS enforcement is disabled for migrations with VMware vSphere source providers to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of 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 MTV 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration using OVA files created by 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 as well as a destination provider. You can migrate VMs from the cluster that MTV 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 RHV, direct 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, the following authentication methods are supported: 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
+

The VMware vSphere source provider can now be created without specifying a VDDK init image. It is strongly recommended to create a VDDK init image to accelerate migrations.

+
+
+
+
+

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 running a new migration plan with the same name, or if deleting a migrated VM and remigrating 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 do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while a snapshot operation is performed on the source VM
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If a 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)

+
+
+
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 may 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 may instantly 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)

+
+
+

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:

+
+
+
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.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. 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 MTV 2.5.2. It is advised to update to this version of MTV 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 MTV 2.5 versions before MTV 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 MTV 2.5.2. It is advised to update to this version of MTV or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In previous 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 previous 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 previous 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 previous 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 previous 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 the snapshot creation could not be triggered.

+
+
+

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 previous 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 previous 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 may boot from non-bootable disk after migration
+

In previous 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 are able to boot on the target OKD cluster. (MTV-433)

+
+
+

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/running-migration-plan/index.html b/documentation/doc-Release_notes/modules/running-migration-plan/index.html new file mode 100644 index 000000000000..9540a6e93ec1 --- /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 000000000000..59e55bc37eab --- /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 000000000000..f46c3481979f --- /dev/null +++ b/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,139 @@ + + + + + + + + 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.

+
+
+
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 must 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 000000000000..1308bba0fbaf --- /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-migrating-luns/index.html b/documentation/doc-Release_notes/modules/snip-migrating-luns/index.html new file mode 100644 index 000000000000..5484819caba2 --- /dev/null +++ b/documentation/doc-Release_notes/modules/snip-migrating-luns/index.html @@ -0,0 +1,89 @@ + + + + + + + + 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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+ + +
+ + 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 000000000000..e4bc06a73d8c --- /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/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 000000000000..3ab14ebf0134 --- /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 000000000000..e0bc66c53e43 --- /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 000000000000..c1c9fabda626 --- /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 000000000000..773169dc3b43 --- /dev/null +++ b/documentation/doc-Release_notes/modules/source-vm-prerequisites/index.html @@ -0,0 +1,121 @@ + + + + + + + + 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 VM operating system must be certified and supported for use as a guest operating system with KubeVirt.

    +
  • +
  • +

    VM names must contain only lowercase letters (a-z), numbers (0-9), or hyphens (-), up to a maximum of 253 characters. The first and last characters must be alphanumeric. The name must not contain uppercase letters, spaces, periods (.), or special characters.

    +
  • +
  • +

    VM names must not duplicate the name of a 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 entered a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..c6566be70f7e --- /dev/null +++ b/documentation/doc-Release_notes/modules/storage-support/index.html @@ -0,0 +1,188 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
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.

+
+
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ + +
+ + 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 000000000000..8967c753727d --- /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 000000000000..75ac62a68663 --- /dev/null +++ b/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,106 @@ + + + + + + + + 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) by deleting the {namespace} project and the forklift.konveyor.io custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Delete the project:

    +
    +
    +
    $ kubectl delete project konveyor-forklift
    +
    +
    +
  2. +
  3. +

    Delete the CRDs:

    +
    +
    +
    $ kubectl get crd -o name | grep 'forklift' | xargs kubectl delete
    +
    +
    +
  4. +
  5. +

    Delete the OAuthClient:

    +
    +
    +
    $ kubectl delete oauthclient/forklift-ui
    +
    +
    +
  6. +
+
+ + +
+ + 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 000000000000..0a0ff3668336 --- /dev/null +++ b/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,103 @@ + + + + + + + + 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 to delete the {namespace} project and custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Click HomeProjects.

    +
  2. +
  3. +

    Locate the konveyor-forklift project.

    +
  4. +
  5. +

    On the right side of the project, select Delete Project from the {kebab}.

    +
  6. +
  7. +

    In the Delete Project pane, enter the project name and click Delete.

    +
  8. +
  9. +

    Click AdministrationCustomResourceDefinitions.

    +
  10. +
  11. +

    Enter forklift in the Search field to locate the CRDs in the forklift.konveyor.io group.

    +
  12. +
  13. +

    On the right side of each CRD, select Delete CustomResourceDefinition from the {kebab}.

    +
  14. +
+
+ + +
+ + 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 000000000000..30ba35965bae --- /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 000000000000..1c17ea489454 --- /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 Addding 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 000000000000..779094da59be --- /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 000000000000..b9f253bd740a --- /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 000000000000..2e0583f9b6b3 --- /dev/null +++ b/documentation/doc-Release_notes/modules/vmware-prerequisites/index.html @@ -0,0 +1,248 @@ + + + + + + + + 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.

    +
  • +
  • +

    You must install VMware Tools on all source virtual machines (VMs).

    +
  • +
  • +

    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.

    +
  • +
  • +

    You must obtain the SHA-1 fingerprint of the vCenter 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.

    +
  • +
  • +

    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.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.

+ + +
+ + 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 000000000000..13ca8f5fa875 --- /dev/null +++ b/documentation/modules/about-cold-warm-migration/index.html @@ -0,0 +1,159 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
+
+

Cold migration

+
+
+

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

+
+
+
+
+

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 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.

+
+
+
+ + +
+ + diff --git a/documentation/modules/about-rego-files/index.html b/documentation/modules/about-rego-files/index.html new file mode 100644 index 000000000000..33af6ef9c7a6 --- /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 000000000000..9fb8d728bb01 --- /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 000000000000..ffc1771ee9c3 --- /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 000000000000..27a886f3a5ce --- /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-hooks/index.html b/documentation/modules/adding-hooks/index.html new file mode 100644 index 000000000000..82b174e48d8a --- /dev/null +++ b/documentation/modules/adding-hooks/index.html @@ -0,0 +1,106 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding hooks

+
+

Hooks are custom code that you can run at certain stages of the migration. You can define a hook by using an Ansible playbook or a custom hook container.

+
+
+

You can create a hook before a migration plan or while creating a migration plan.

+
+
+
Prerequisites
+
    +
  • +

    You must create an Ansible playbook or a custom hook container.

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

    In the web console, click Hooks.

    +
  2. +
  3. +

    Click Create hook.

    +
  4. +
  5. +

    Specify the hook Name.

    +
  6. +
  7. +

    Select Ansible playbook or Custom container image as the Hook definition.

    +
  8. +
  9. +

    If you select Custom container image, specify the image location, for example, quay.io/github_project/container_name:container_id.

    +
  10. +
  11. +

    Select a migration step and click Add.

    +
    +

    The new migration hook appears in the Hooks list.

    +
    +
  12. +
+
+ + +
+ + diff --git a/documentation/modules/adding-source-provider/index.html b/documentation/modules/adding-source-provider/index.html new file mode 100644 index 000000000000..6150b881298b --- /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 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 000000000000..f53400ba1ef5 --- /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 000000000000..76f4b76e59d6 --- /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.

      +
    2. +
    +
    +
    +

    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. +
+
+ + +
+ + diff --git a/documentation/modules/canceling-migration-ui/index.html b/documentation/modules/canceling-migration-ui/index.html new file mode 100644 index 000000000000..87935f567bcb --- /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 000000000000..763c782437c3 --- /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.

      +
    2. +
    +
    +
    +

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

    +
    +
  • +
+
+ + +
+ + 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 000000000000..c83d3f8a72de --- /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 000000000000..ed2f3cbaefdf --- /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 000000000000..0f5da47e3e4e --- /dev/null +++ b/documentation/modules/compatibility-guidelines/index.html @@ -0,0 +1,125 @@ + + + + + + + + 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.5.1

4.12 or later

4.12 or later

6.5 or later

4.4 SP1 or later

16.1 or later

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

MTV 2.5 was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3.

+
+
+

As oVirt 4.3 lacks the improvements that were introduced in oVirt 4.4 for Forklift, and new features were not tested with oVirt 4.3, migrations from oVirt 4.3 may not function at the same level as migrations from oVirt 4.4, with some functionality may be missing.

+
+
+

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.

+
+
+
+ + +
+ + diff --git a/documentation/modules/creating-migration-plan/index.html b/documentation/modules/creating-migration-plan/index.html new file mode 100644 index 000000000000..bfb7c9156822 --- /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 000000000000..eb6440e19071 --- /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 000000000000..118fe0e6bde4 --- /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 000000000000..a6d08aff69d2 --- /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 000000000000..bc925f5aae59 --- /dev/null +++ b/documentation/modules/creating-vddk-image/index.html @@ -0,0 +1,177 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift uses the VMware Virtual Disk Development Kit (VDDK) SDK to transfer virtual disks from VMware vSphere.

+
+
+

You must download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry. You need the VDDK init image path in order to add a VMware source provider.

+
+
+ + + + + +
+
Note
+
+
+

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

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    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.

    +
    + + + + + +
    +
    Note
    +
    +
    +

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

    +
    +
    +
    +
  6. +
  7. +

    Save the VDDK archive file in the temporary directory.

    +
  8. +
  9. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  10. +
  11. +

    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
    +
    +
    +
  12. +
  13. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  14. +
  15. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  16. +
  17. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  18. +
+
+ + +
+ + diff --git a/documentation/modules/error-messages/index.html b/documentation/modules/error-messages/index.html new file mode 100644 index 000000000000..e73ad1f9d050 --- /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 be 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 000000000000..999c62adec4c --- /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 000000000000..473e21ba4e2a --- /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 000000000000..33a031a09092 --- /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 000000000000..e73192c01025 --- /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 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 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 000000000000..8a846e6361aa --- /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 000000000000..a8038cdf9239 --- /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 000000000000..dae30fcaace3 --- /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 000000000000..30d52ab9cbae --- /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 000000000000..565e96d418a3 --- /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/making-open-source-more-inclusive/index.html b/documentation/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 000000000000..43f9b3322322 --- /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/migrating-virtual-machines-cli/index.html b/documentation/modules/migrating-virtual-machines-cli/index.html new file mode 100644 index 000000000000..a41e19c707c5 --- /dev/null +++ b/documentation/modules/migrating-virtual-machines-cli/index.html @@ -0,0 +1,549 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs).

+
+
+ + + + + +
+
Important
+
+
+

You must specify a name for cluster-scoped CRs.

+
+
+

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

+
+
+
+
+

Unresolved directive in migrating-virtual-machines-cli.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Prerequisites
+
    +
  • +

    VMware only: You must have a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
  • +

    oVirt (oVirt) only: 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 migrating-virtual-machines-cli.adoc - include::snip-migrating-luns.adoc[]

+
+
+
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: <provider_type> (2)
    +    createdForResourceType: providers
    +type: Opaque
    +stringData: (3)
    +  user: <user> (4)
    +  password: <password> (5)
    +  insecureSkipVerify: <true/false> (6)
    +  domainName: <domain_name> (7)
    +  projectName: <project_name> (8)
    +  regionName: <region name> (9)
    +  cacert: | (10)
    +    <ca_certificate>
    +  url: <api_end_point> (11)
    +  thumbprint: <vcenter_fingerprint> (12)
    +EOF
    +
    +
    +
    +
      +
    1. +

      The ownerReferences section is optional.

      +
    2. +
    3. +

      Specify the type of source provider. Allowed values are ovirt, vsphere, openstack, and ova. This label is needed to verify the credentials are correct when the remote system is accessible and, for oVirt, to retrieve the Engine CA certificate when a third-party certificate is specified.

      +
    4. +
    5. +

      The stringData section for OVA is different and is described in a note that follows the description of the Secret manifest.

      +
    6. +
    7. +

      Specify the vCenter user, the oVirt Engine user, or the {osp} user.

      +
    8. +
    9. +

      Specify the user password.

      +
    10. +
    11. +

      Specify <true> to skip certificate verification, which 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. Specifying <false> verifies the certificate.

      +
    12. +
    13. +

      {osp} only: Specify the domain name.

      +
    14. +
    15. +

      {osp} only: Specify the project name.

      +
    16. +
    17. +

      {osp} only: Specify the name of the {osp} region.

      +
    18. +
    19. +

      oVirt and {osp} only: For oVirt, enter 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. For {osp}, enter the CA certificate for connecting to the source environment. The certificate is not used when insecureSkipVerify is set to <true>.

      +
    20. +
    21. +

      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}.

      +
    22. +
    23. +

      VMware only: Specify the vCenter SHA-1 fingerprint.

      +
    24. +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    The stringData section for an OVA Secret manifest is as follows:

    +
    +
    +
    +
    stringData:
    +  url: <nfs_server:/nfs_path>
    +
    +
    +
    +

    where:
    +nfs_server: An IP or hostname of the server where the share was created.
    +nfs_path : The path on the server where the OVA files are stored.

    +
    +
    +
    +
  2. +
  3. +

    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: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  settings:
    +    vddkInitImage: <registry_route_or_server_path>/vddk:<tag> (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +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. +

      VMware only: Specify the VDDK image that you created.

      +
    6. +
    7. +

      Specify the name of provider Secret CR.

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

    VMware only: 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
    +
    +
    +
    +
      +
    1. +

      Specify the name of the VMware Provider CR.

      +
    2. +
    3. +

      Specify the managed object reference (MOR) of the VMware host.

      +
    4. +
    5. +

      Specify the IP address of the VMware migration network.

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

    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> (3)
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (4)
    +        namespace: <network_attachment_definition_namespace> (5)
    +        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
    +
    +
    +
    +
      +
    1. +

      Allowed values are pod and multus.

      +
    2. +
    3. +

      You can use either the id or the name parameter to specify the source network.

      +
    4. +
    5. +

      Specify the VMware network MOR, the oVirt network UUID, or the {osp} network UUID.

      +
    6. +
    7. +

      Specify a network attachment definition for each additional KubeVirt network.

      +
    8. +
    9. +

      Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.

      +
    10. +
    +
    +
  8. +
  9. +

    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)
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode>
    +      source:
    +        id: <source_datastore>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ReadWriteOnce and ReadWriteMany.

      +
    2. +
    3. +

      Specify the VMware data storage MOR, the oVirt storage domain UUID, or the {osp} volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.

      +
    4. +
    +
    +
  10. +
  11. +

    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 (1)
    +  playbook: | (2)
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +
      +
    1. +

      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.

      +
    2. +
    3. +

      Optional: Base64-encoded Ansible playbook. If you specify a playbook, the image must be hook-runner.

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

    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: true (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>
    +  targetNamespace: <target_namespace>
    +  vms: (8)
    +    - id: <source_vm> (9)
    +    - name: <source_vm>
    +      namespace: <namespace> (10)
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Plan CR.

      +
    2. +
    3. +

      Specify 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.

      +
    4. +
    5. +

      Specify only one network map and one storage map per plan.

      +
    6. +
    7. +

      Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.

      +
    8. +
    9. +

      Specify the name of the NetworkMap CR.

      +
    10. +
    11. +

      Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.

      +
    12. +
    13. +

      Specify the name of the StorageMap CR.

      +
    14. +
    15. +

      For all source providers except for KubeVirt, you can use either the id or the name parameter to specify the source VMs.
      +KubeVirt source provider only: You can use only the name parameter, not the id. parameter to specify the source VMs.

      +
    16. +
    17. +

      Specify the VMware VM MOR, oVirt VM UUID or the {osp} VM UUID.

      +
    18. +
    19. +

      KubeVirt source provider only.

      +
    20. +
    21. +

      Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.

      +
    22. +
    23. +

      Specify the name of the Hook CR.

      +
    24. +
    25. +

      Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.

      +
    26. +
    +
    +
  14. +
  15. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration> (1)
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <plan> (2)
    +    namespace: <namespace>
    +  cutover: <cutover_time> (3)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    3. +

      Specify the name of the Plan CR that you are running. The Migration CR creates a VirtualMachine CR for each VM that is migrated.

      +
    4. +
    5. +

      Optional: Specify a cutover time according to the ISO 8601 format with the UTC time offset, for example, 2021-04-04T01:23:45.678+09:00.

      +
    6. +
    +
    +
    +

    You can associate multiple Migration CRs with a single Plan CR. If a migration does not complete, you can create a new Migration CR, without changing the Plan CR, to migrate the remaining VMs.

    +
    +
  16. +
  17. +

    Retrieve the Migration CR to monitor the progress of the migration:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  18. +
+
+ + +
+ + 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 000000000000..197ba907bb73 --- /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-overview-page/index.html b/documentation/modules/mtv-overview-page/index.html new file mode 100644 index 000000000000..9006d6cb28b5 --- /dev/null +++ b/documentation/modules/mtv-overview-page/index.html @@ -0,0 +1,142 @@ + + + + + + + + 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 displays the following information:

+
+
+
    +
  • +

    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

      +
    • +
    +
    +
  • +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the 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.

      +
    • +
    +
    +
  • +
+
+ + +
+ + 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 000000000000..e89604301d2f --- /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-settings/index.html b/documentation/modules/mtv-settings/index.html new file mode 100644 index 000000000000..5066a12b0304 --- /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 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 000000000000..20943cc971cf --- /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 000000000000..a93054ac19a8 --- /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 000000000000..fde2d4ea35b6 --- /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/non-admin-permissions-for-ui/index.html b/documentation/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 000000000000..93420a41d62e --- /dev/null +++ b/documentation/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,187 @@ + + + + + + + + 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.konveyer.io

plans

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

forklift.konveyer.io

migrations

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

forklift.konveyer.io

hooks

get, list, watch

forklift.konveyer.io

providers

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

forklift.konveyer.io

networkmaps

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

forklift.konveyer.io

storagemaps

get, list, watch

forklift.konveyer.io

forkliftcontrollers

+
+ + + + + +
+
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 000000000000..76671d26adaf --- /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/obtaining-vmware-fingerprint/index.html b/documentation/modules/obtaining-vmware-fingerprint/index.html new file mode 100644 index 000000000000..0579661d668f --- /dev/null +++ b/documentation/modules/obtaining-vmware-fingerprint/index.html @@ -0,0 +1,99 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    +
      +
    1. +

      Specify the IP address or FQDN of the vCenter host.

      +
    2. +
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/openstack-prerequisites/index.html b/documentation/modules/openstack-prerequisites/index.html new file mode 100644 index 000000000000..ae179c4fd34e --- /dev/null +++ b/documentation/modules/openstack-prerequisites/index.html @@ -0,0 +1,90 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+ + +
+ + diff --git a/documentation/modules/osh-adding-source-provider/index.html b/documentation/modules/osh-adding-source-provider/index.html new file mode 100644 index 000000000000..09f1718e4a48 --- /dev/null +++ b/documentation/modules/osh-adding-source-provider/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding an {osp} source provider

+
+

You can add an {osp} source provider by using the OKD web console.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select Red Hat OpenStack Platform from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Name to display in the list of providers

      +
    • +
    • +

      {osp} Identity server URL: {osp} Identity (Keystone) endpoint, for example, http://controller:5000/v3

      +
    • +
    • +

      {osp} username: For example, admin

      +
    • +
    • +

      {osp} password:

      +
    • +
    • +

      Domain:

      +
    • +
    • +

      Project:

      +
    • +
    • +

      Region:

      +
    • +
    +
    +
  8. +
  9. +

    To allow a migration without validating the provider’s CA certificate, select the Skip certificate validation check box. By default, the checkbox is cleared, meaning that the certificate will be validated.

    +
  10. +
  11. +

    If you did not select Skip certificate validation, the CA certificate field is visible. Drag the CA certificate used to connect to the source environment to the text box or browse for it and click Select. If you did select the check box, the CA certificate text box is not visible.

    +
  12. +
  13. +

    Click Create to add and save the provider.

    +
    +

    The source provider appears in the list of providers.

    +
    +
  14. +
+
+ + +
+ + 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 000000000000..acd15fef5179 --- /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 000000000000..d9f1779f91b8 --- /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 000000000000..978c942fd7a4 --- /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 000000000000..f7b3888eeabc --- /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/rhv-prerequisites/index.html b/documentation/modules/rhv-prerequisites/index.html new file mode 100644 index 000000000000..cc744e3d35c0 --- /dev/null +++ b/documentation/modules/rhv-prerequisites/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+ +
+
+

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 000000000000..5b5bd48aabc5 --- /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 000000000000..c6b746161a33 --- /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 000000000000..0aeb87c181d4 --- /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 000000000000..5e43082b90b9 --- /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 000000000000..99ca78072ab0 --- /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 000000000000..66e9ac35e626 --- /dev/null +++ b/documentation/modules/rn-2.5/index.html @@ -0,0 +1,325 @@ + + + + + + + + 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.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

EMS enforcement is disabled for migrations with VMware vSphere source providers to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of 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 MTV 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration using OVA files created by 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 as well as a destination provider. You can migrate VMs from the cluster that MTV 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 RHV, direct 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, the following authentication methods are supported: 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
+

The VMware vSphere source provider can now be created without specifying a VDDK init image. It is strongly recommended to create a VDDK init image to accelerate migrations.

+
+
+
+
+

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 running a new migration plan with the same name, or if deleting a migrated VM and remigrating 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 do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while a snapshot operation is performed on the source VM
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If a 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)

+
+
+
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 may 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 may instantly 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)

+
+
+

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:

+
+
+
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.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. 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 MTV 2.5.2. It is advised to update to this version of MTV 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 MTV 2.5 versions before MTV 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 MTV 2.5.2. It is advised to update to this version of MTV or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In previous 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 previous 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 previous 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 previous 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 previous 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 the snapshot creation could not be triggered.

+
+
+

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 previous 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 previous 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 may boot from non-bootable disk after migration
+

In previous 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 are able to boot on the target OKD cluster. (MTV-433)

+
+
+

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/running-migration-plan/index.html b/documentation/modules/running-migration-plan/index.html new file mode 100644 index 000000000000..197c6a5f1970 --- /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 000000000000..1d01edb576c0 --- /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 000000000000..93fec87558c7 --- /dev/null +++ b/documentation/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,139 @@ + + + + + + + + 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.

+
+
+
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 must 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 000000000000..3f7a49373313 --- /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-migrating-luns/index.html b/documentation/modules/snip-migrating-luns/index.html new file mode 100644 index 000000000000..3fb2dcb77241 --- /dev/null +++ b/documentation/modules/snip-migrating-luns/index.html @@ -0,0 +1,89 @@ + + + + + + + + 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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+ + +
+ + diff --git a/documentation/modules/snip_permissions-info/index.html b/documentation/modules/snip_permissions-info/index.html new file mode 100644 index 000000000000..c091ae5b5907 --- /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/snippet_getting_web_console_url_cli/index.html b/documentation/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 000000000000..01249e10656a --- /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 000000000000..d96b3c2948ae --- /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 000000000000..6af8836b8b84 --- /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 000000000000..ef3194d6fc75 --- /dev/null +++ b/documentation/modules/source-vm-prerequisites/index.html @@ -0,0 +1,121 @@ + + + + + + + + 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 VM operating system must be certified and supported for use as a guest operating system with KubeVirt.

    +
  • +
  • +

    VM names must contain only lowercase letters (a-z), numbers (0-9), or hyphens (-), up to a maximum of 253 characters. The first and last characters must be alphanumeric. The name must not contain uppercase letters, spaces, periods (.), or special characters.

    +
  • +
  • +

    VM names must not duplicate the name of a 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 entered a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+ + +
+ + diff --git a/documentation/modules/storage-support/index.html b/documentation/modules/storage-support/index.html new file mode 100644 index 000000000000..f1601995887a --- /dev/null +++ b/documentation/modules/storage-support/index.html @@ -0,0 +1,188 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
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.

+
+
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ + +
+ + diff --git a/documentation/modules/technology-preview/index.html b/documentation/modules/technology-preview/index.html new file mode 100644 index 000000000000..09df00491f14 --- /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 000000000000..664d083d241c --- /dev/null +++ b/documentation/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,106 @@ + + + + + + + + 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) by deleting the {namespace} project and the forklift.konveyor.io custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Delete the project:

    +
    +
    +
    $ kubectl delete project konveyor-forklift
    +
    +
    +
  2. +
  3. +

    Delete the CRDs:

    +
    +
    +
    $ kubectl get crd -o name | grep 'forklift' | xargs kubectl delete
    +
    +
    +
  4. +
  5. +

    Delete the OAuthClient:

    +
    +
    +
    $ kubectl delete oauthclient/forklift-ui
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/documentation/modules/uninstalling-mtv-ui/index.html b/documentation/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 000000000000..704575bbe4f4 --- /dev/null +++ b/documentation/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,103 @@ + + + + + + + + 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 to delete the {namespace} project and custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Click HomeProjects.

    +
  2. +
  3. +

    Locate the konveyor-forklift project.

    +
  4. +
  5. +

    On the right side of the project, select Delete Project from the {kebab}.

    +
  6. +
  7. +

    In the Delete Project pane, enter the project name and click Delete.

    +
  8. +
  9. +

    Click AdministrationCustomResourceDefinitions.

    +
  10. +
  11. +

    Enter forklift in the Search field to locate the CRDs in the forklift.konveyor.io group.

    +
  12. +
  13. +

    On the right side of each CRD, select Delete CustomResourceDefinition from the {kebab}.

    +
  14. +
+
+ + +
+ + 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 000000000000..40a4c37c7a14 --- /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 000000000000..39da122ac6ca --- /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 Addding 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 000000000000..4c5d22c81526 --- /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 000000000000..4f5a2735eb5c --- /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 000000000000..d532b4b0ce9d --- /dev/null +++ b/documentation/modules/vmware-prerequisites/index.html @@ -0,0 +1,248 @@ + + + + + + + + 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.

    +
  • +
  • +

    You must install VMware Tools on all source virtual machines (VMs).

    +
  • +
  • +

    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.

    +
  • +
  • +

    You must obtain the SHA-1 fingerprint of the vCenter 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.

    +
  • +
  • +

    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.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.

+ + +
+ + diff --git a/feed.xml b/feed.xml new file mode 100644 index 000000000000..f81abf46e7ba --- /dev/null +++ b/feed.xml @@ -0,0 +1 @@ +Jekyll2023-10-26T19:32:47-05: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 000000000000..efa3a10fee0a --- /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 000000000000..4a1c2d28f035 --- /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 000000000000..acf2a36fca30 --- /dev/null +++ b/modules/about-cold-warm-migration/index.html @@ -0,0 +1,159 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
+
+

Cold migration

+
+
+

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

+
+
+
+
+

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 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.

+
+
+
+ + +
+ + diff --git a/modules/about-rego-files/index.html b/modules/about-rego-files/index.html new file mode 100644 index 000000000000..db68395d733a --- /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 000000000000..881c5865e0b3 --- /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 000000000000..75ecc9940217 --- /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 000000000000..71780df08566 --- /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-hooks/index.html b/modules/adding-hooks/index.html new file mode 100644 index 000000000000..8862e0a1a6fa --- /dev/null +++ b/modules/adding-hooks/index.html @@ -0,0 +1,106 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding hooks

+
+

Hooks are custom code that you can run at certain stages of the migration. You can define a hook by using an Ansible playbook or a custom hook container.

+
+
+

You can create a hook before a migration plan or while creating a migration plan.

+
+
+
Prerequisites
+
    +
  • +

    You must create an Ansible playbook or a custom hook container.

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

    In the web console, click Hooks.

    +
  2. +
  3. +

    Click Create hook.

    +
  4. +
  5. +

    Specify the hook Name.

    +
  6. +
  7. +

    Select Ansible playbook or Custom container image as the Hook definition.

    +
  8. +
  9. +

    If you select Custom container image, specify the image location, for example, quay.io/github_project/container_name:container_id.

    +
  10. +
  11. +

    Select a migration step and click Add.

    +
    +

    The new migration hook appears in the Hooks list.

    +
    +
  12. +
+
+ + +
+ + diff --git a/modules/adding-source-provider/index.html b/modules/adding-source-provider/index.html new file mode 100644 index 000000000000..de807ddb2787 --- /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 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 000000000000..d39a3b838020 --- /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 000000000000..b1f997622f85 --- /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.

      +
    2. +
    +
    +
    +

    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. +
+
+ + +
+ + diff --git a/modules/canceling-migration-ui/index.html b/modules/canceling-migration-ui/index.html new file mode 100644 index 000000000000..cdc88f5d9a6c --- /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 000000000000..11ebe6a39177 --- /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.

      +
    2. +
    +
    +
    +

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

    +
    +
  • +
+
+ + +
+ + diff --git a/modules/collected-logs-cr-info/index.html b/modules/collected-logs-cr-info/index.html new file mode 100644 index 000000000000..327e1ff8b3c0 --- /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 000000000000..c9997ab5f939 --- /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 000000000000..ce5fab9db0bb --- /dev/null +++ b/modules/compatibility-guidelines/index.html @@ -0,0 +1,125 @@ + + + + + + + + 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.5.1

4.12 or later

4.12 or later

6.5 or later

4.4 SP1 or later

16.1 or later

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

MTV 2.5 was tested only with oVirt (RHV) 4.4 SP1. +Migration from oVirt (oVirt) 4.3 has not been tested with Forklift 2.3.

+
+
+

As oVirt 4.3 lacks the improvements that were introduced in oVirt 4.4 for Forklift, and new features were not tested with oVirt 4.3, migrations from oVirt 4.3 may not function at the same level as migrations from oVirt 4.4, with some functionality may be missing.

+
+
+

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.

+
+
+
+ + +
+ + diff --git a/modules/creating-migration-plan/index.html b/modules/creating-migration-plan/index.html new file mode 100644 index 000000000000..486e0cd44e68 --- /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 000000000000..efb2845225cc --- /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 000000000000..5eca469fbc01 --- /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 000000000000..747924474f00 --- /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 000000000000..1c2a6c5bb553 --- /dev/null +++ b/modules/creating-vddk-image/index.html @@ -0,0 +1,177 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Creating a VDDK image

+
+

Forklift uses the VMware Virtual Disk Development Kit (VDDK) SDK to transfer virtual disks from VMware vSphere.

+
+
+

You must download the VMware Virtual Disk Development Kit (VDDK), build a VDDK image, and push the VDDK image to your image registry. You need the VDDK init image path in order to add a VMware source provider.

+
+
+ + + + + +
+
Note
+
+
+

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

+
+
+
+
+
Prerequisites
+
    +
  • +

    OKD image registry.

    +
  • +
  • +

    podman installed.

    +
  • +
  • +

    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.

    +
    + + + + + +
    +
    Note
    +
    +
    +

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

    +
    +
    +
    +
  6. +
  7. +

    Save the VDDK archive file in the temporary directory.

    +
  8. +
  9. +

    Extract the VDDK archive:

    +
    +
    +
    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
    +
    +
    +
  10. +
  11. +

    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
    +
    +
    +
  12. +
  13. +

    Build the VDDK image:

    +
    +
    +
    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  14. +
  15. +

    Push the VDDK image to the registry:

    +
    +
    +
    $ podman push <registry_route_or_server_path>/vddk:<tag>
    +
    +
    +
  16. +
  17. +

    Ensure that the image is accessible to your KubeVirt environment.

    +
  18. +
+
+ + +
+ + diff --git a/modules/error-messages/index.html b/modules/error-messages/index.html new file mode 100644 index 000000000000..43c7ea842021 --- /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 be 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 000000000000..999c62adec4c --- /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 000000000000..473e21ba4e2a --- /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 000000000000..33a031a09092 --- /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 000000000000..e73192c01025 --- /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 000000000000..8a846e6361aa --- /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 000000000000..a8038cdf9239 --- /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 000000000000..ed2ccffb0c5d --- /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 000000000000..30d52ab9cbae --- /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 000000000000..5fdefc7653df --- /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/making-open-source-more-inclusive/index.html b/modules/making-open-source-more-inclusive/index.html new file mode 100644 index 000000000000..a570ff54fee2 --- /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/migrating-virtual-machines-cli/index.html b/modules/migrating-virtual-machines-cli/index.html new file mode 100644 index 000000000000..d011e69c1b15 --- /dev/null +++ b/modules/migrating-virtual-machines-cli/index.html @@ -0,0 +1,549 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Migrating virtual machines

+
+

You migrate virtual machines (VMs) from the command line (CLI) by creating Forklift custom resources (CRs).

+
+
+ + + + + +
+
Important
+
+
+

You must specify a name for cluster-scoped CRs.

+
+
+

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

+
+
+
+
+

Unresolved directive in migrating-virtual-machines-cli.adoc - include::snippet_ova_tech_preview.adoc[]

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Prerequisites
+
    +
  • +

    VMware only: You must have a VMware Virtual Disk Development Kit (VDDK) image in a secure registry that is accessible to all clusters.

    +
  • +
  • +

    oVirt (oVirt) only: 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 migrating-virtual-machines-cli.adoc - include::snip-migrating-luns.adoc[]

+
+
+
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: <provider_type> (2)
    +    createdForResourceType: providers
    +type: Opaque
    +stringData: (3)
    +  user: <user> (4)
    +  password: <password> (5)
    +  insecureSkipVerify: <true/false> (6)
    +  domainName: <domain_name> (7)
    +  projectName: <project_name> (8)
    +  regionName: <region name> (9)
    +  cacert: | (10)
    +    <ca_certificate>
    +  url: <api_end_point> (11)
    +  thumbprint: <vcenter_fingerprint> (12)
    +EOF
    +
    +
    +
    +
      +
    1. +

      The ownerReferences section is optional.

      +
    2. +
    3. +

      Specify the type of source provider. Allowed values are ovirt, vsphere, openstack, and ova. This label is needed to verify the credentials are correct when the remote system is accessible and, for oVirt, to retrieve the Engine CA certificate when a third-party certificate is specified.

      +
    4. +
    5. +

      The stringData section for OVA is different and is described in a note that follows the description of the Secret manifest.

      +
    6. +
    7. +

      Specify the vCenter user, the oVirt Engine user, or the {osp} user.

      +
    8. +
    9. +

      Specify the user password.

      +
    10. +
    11. +

      Specify <true> to skip certificate verification, which 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. Specifying <false> verifies the certificate.

      +
    12. +
    13. +

      {osp} only: Specify the domain name.

      +
    14. +
    15. +

      {osp} only: Specify the project name.

      +
    16. +
    17. +

      {osp} only: Specify the name of the {osp} region.

      +
    18. +
    19. +

      oVirt and {osp} only: For oVirt, enter 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. For {osp}, enter the CA certificate for connecting to the source environment. The certificate is not used when insecureSkipVerify is set to <true>.

      +
    20. +
    21. +

      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}.

      +
    22. +
    23. +

      VMware only: Specify the vCenter SHA-1 fingerprint.

      +
    24. +
    +
    +
    + + + + + +
    +
    Note
    +
    +
    +

    The stringData section for an OVA Secret manifest is as follows:

    +
    +
    +
    +
    stringData:
    +  url: <nfs_server:/nfs_path>
    +
    +
    +
    +

    where:
    +nfs_server: An IP or hostname of the server where the share was created.
    +nfs_path : The path on the server where the OVA files are stored.

    +
    +
    +
    +
  2. +
  3. +

    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: <provider_type> (1)
    +  url: <api_end_point> (2)
    +  settings:
    +    vddkInitImage: <registry_route_or_server_path>/vddk:<tag> (3)
    +  secret:
    +    name: <secret> (4)
    +    namespace: <namespace>
    +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. +

      VMware only: Specify the VDDK image that you created.

      +
    6. +
    7. +

      Specify the name of provider Secret CR.

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

    VMware only: 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
    +
    +
    +
    +
      +
    1. +

      Specify the name of the VMware Provider CR.

      +
    2. +
    3. +

      Specify the managed object reference (MOR) of the VMware host.

      +
    4. +
    5. +

      Specify the IP address of the VMware migration network.

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

    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> (3)
    +        name: <source_network_name>
    +    - destination:
    +        name: <network_attachment_definition> (4)
    +        namespace: <network_attachment_definition_namespace> (5)
    +        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
    +
    +
    +
    +
      +
    1. +

      Allowed values are pod and multus.

      +
    2. +
    3. +

      You can use either the id or the name parameter to specify the source network.

      +
    4. +
    5. +

      Specify the VMware network MOR, the oVirt network UUID, or the {osp} network UUID.

      +
    6. +
    7. +

      Specify a network attachment definition for each additional KubeVirt network.

      +
    8. +
    9. +

      Required only when type is multus. Specify the namespace of the KubeVirt network attachment definition.

      +
    10. +
    +
    +
  8. +
  9. +

    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)
    +    - destination:
    +        storageClass: <storage_class>
    +        accessMode: <access_mode>
    +      source:
    +        id: <source_datastore>
    +  provider:
    +    source:
    +      name: <source_provider>
    +      namespace: <namespace>
    +    destination:
    +      name: <destination_provider>
    +      namespace: <namespace>
    +EOF
    +
    +
    +
    +
      +
    1. +

      Allowed values are ReadWriteOnce and ReadWriteMany.

      +
    2. +
    3. +

      Specify the VMware data storage MOR, the oVirt storage domain UUID, or the {osp} volume_type UUID. For example, f2737930-b567-451a-9ceb-2887f6207009.

      +
    4. +
    +
    +
  10. +
  11. +

    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 (1)
    +  playbook: | (2)
    +    LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
    +    YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
    +    IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
    +    cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
    +    bG9hZAoK
    +EOF
    +
    +
    +
    +
      +
    1. +

      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.

      +
    2. +
    3. +

      Optional: Base64-encoded Ansible playbook. If you specify a playbook, the image must be hook-runner.

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

    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: true (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>
    +  targetNamespace: <target_namespace>
    +  vms: (8)
    +    - id: <source_vm> (9)
    +    - name: <source_vm>
    +      namespace: <namespace> (10)
    +      hooks: (11)
    +        - hook:
    +            namespace: <namespace>
    +            name: <hook> (12)
    +          step: <step> (13)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Plan CR.

      +
    2. +
    3. +

      Specify 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.

      +
    4. +
    5. +

      Specify only one network map and one storage map per plan.

      +
    6. +
    7. +

      Specify a network mapping even if the VMs to be migrated are not assigned to a network. The mapping can be empty in this case.

      +
    8. +
    9. +

      Specify the name of the NetworkMap CR.

      +
    10. +
    11. +

      Specify a storage mapping even if the VMs to be migrated are not assigned with disk images. The mapping can be empty in this case.

      +
    12. +
    13. +

      Specify the name of the StorageMap CR.

      +
    14. +
    15. +

      For all source providers except for KubeVirt, you can use either the id or the name parameter to specify the source VMs.
      +KubeVirt source provider only: You can use only the name parameter, not the id. parameter to specify the source VMs.

      +
    16. +
    17. +

      Specify the VMware VM MOR, oVirt VM UUID or the {osp} VM UUID.

      +
    18. +
    19. +

      KubeVirt source provider only.

      +
    20. +
    21. +

      Optional: You can specify up to two hooks for a VM. Each hook must run during a separate migration step.

      +
    22. +
    23. +

      Specify the name of the Hook CR.

      +
    24. +
    25. +

      Allowed values are PreHook, before the migration plan starts, or PostHook, after the migration is complete.

      +
    26. +
    +
    +
  14. +
  15. +

    Create a Migration manifest to run the Plan CR:

    +
    +
    +
    $ cat << EOF | kubectl apply -f -
    +apiVersion: forklift.konveyor.io/v1beta1
    +kind: Migration
    +metadata:
    +  name: <migration> (1)
    +  namespace: <namespace>
    +spec:
    +  plan:
    +    name: <plan> (2)
    +    namespace: <namespace>
    +  cutover: <cutover_time> (3)
    +EOF
    +
    +
    +
    +
      +
    1. +

      Specify the name of the Migration CR.

      +
    2. +
    3. +

      Specify the name of the Plan CR that you are running. The Migration CR creates a VirtualMachine CR for each VM that is migrated.

      +
    4. +
    5. +

      Optional: Specify a cutover time according to the ISO 8601 format with the UTC time offset, for example, 2021-04-04T01:23:45.678+09:00.

      +
    6. +
    +
    +
    +

    You can associate multiple Migration CRs with a single Plan CR. If a migration does not complete, you can create a new Migration CR, without changing the Plan CR, to migrate the remaining VMs.

    +
    +
  16. +
  17. +

    Retrieve the Migration CR to monitor the progress of the migration:

    +
    +
    +
    $ kubectl get migration/<migration> -n <namespace> -o yaml
    +
    +
    +
  18. +
+
+ + +
+ + diff --git a/modules/migration-plan-options-ui/index.html b/modules/migration-plan-options-ui/index.html new file mode 100644 index 000000000000..06fc43d336f9 --- /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-overview-page/index.html b/modules/mtv-overview-page/index.html new file mode 100644 index 000000000000..3208732a79b5 --- /dev/null +++ b/modules/mtv-overview-page/index.html @@ -0,0 +1,142 @@ + + + + + + + + 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 displays the following information:

+
+
+
    +
  • +

    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

      +
    • +
    +
    +
  • +
  • +

    Operator: The namespace on which the Forklift Operator is deployed and the status of the 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.

      +
    • +
    +
    +
  • +
+
+ + +
+ + diff --git a/modules/mtv-resources-and-services/index.html b/modules/mtv-resources-and-services/index.html new file mode 100644 index 000000000000..c5340500247d --- /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-settings/index.html b/modules/mtv-settings/index.html new file mode 100644 index 000000000000..463a110d4043 --- /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 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 000000000000..7802b1927903 --- /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 000000000000..41414d71edf2 --- /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 000000000000..567fc6094bd6 --- /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/non-admin-permissions-for-ui/index.html b/modules/non-admin-permissions-for-ui/index.html new file mode 100644 index 000000000000..5b631a36a855 --- /dev/null +++ b/modules/non-admin-permissions-for-ui/index.html @@ -0,0 +1,187 @@ + + + + + + + + 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.konveyer.io

plans

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

forklift.konveyer.io

migrations

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

forklift.konveyer.io

hooks

get, list, watch

forklift.konveyer.io

providers

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

forklift.konveyer.io

networkmaps

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

forklift.konveyer.io

storagemaps

get, list, watch

forklift.konveyer.io

forkliftcontrollers

+
+ + + + + +
+
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 000000000000..1719b956ad80 --- /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/obtaining-vmware-fingerprint/index.html b/modules/obtaining-vmware-fingerprint/index.html new file mode 100644 index 000000000000..26f7e66834c0 --- /dev/null +++ b/modules/obtaining-vmware-fingerprint/index.html @@ -0,0 +1,99 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Obtaining the SHA-1 fingerprint of a vCenter host

+
+

You must obtain the SHA-1 fingerprint of a vCenter host in order to create a Secret CR.

+
+
+
Procedure
+
    +
  • +

    Run the following command:

    +
    +
    +
    $ openssl s_client \
    +    -connect <vcenter_host>:443 \ (1)
    +    < /dev/null 2>/dev/null \
    +    | openssl x509 -fingerprint -noout -in /dev/stdin \
    +    | cut -d '=' -f 2
    +
    +
    +
    +
      +
    1. +

      Specify the IP address or FQDN of the vCenter host.

      +
    2. +
    +
    +
    +
    Example output
    +
    +
    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67
    +
    +
    +
  • +
+
+ + +
+ + diff --git a/modules/openstack-prerequisites/index.html b/modules/openstack-prerequisites/index.html new file mode 100644 index 000000000000..fcb4f3b16b44 --- /dev/null +++ b/modules/openstack-prerequisites/index.html @@ -0,0 +1,90 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

OpenStack prerequisites

+
+

The following prerequisites apply to {osp} migrations:

+
+
+ +
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+ + +
+ + diff --git a/modules/osh-adding-source-provider/index.html b/modules/osh-adding-source-provider/index.html new file mode 100644 index 000000000000..56d1b59e1ba1 --- /dev/null +++ b/modules/osh-adding-source-provider/index.html @@ -0,0 +1,137 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

Adding an {osp} source provider

+
+

You can add an {osp} source provider by using the OKD web console.

+
+
+ + + + + +
+
Note
+
+
+

Migration using {osp} source providers only supports VMs that use only Cinder volumes.

+
+
+
+
+
Procedure
+
    +
  1. +

    In the OKD web console, click MigrationProviders for virtualization.

    +
  2. +
  3. +

    Click Create Provider.

    +
  4. +
  5. +

    Select Red Hat OpenStack Platform from the Provider type list.

    +
  6. +
  7. +

    Specify the following fields:

    +
    +
      +
    • +

      Provider name: Name to display in the list of providers

      +
    • +
    • +

      {osp} Identity server URL: {osp} Identity (Keystone) endpoint, for example, http://controller:5000/v3

      +
    • +
    • +

      {osp} username: For example, admin

      +
    • +
    • +

      {osp} password:

      +
    • +
    • +

      Domain:

      +
    • +
    • +

      Project:

      +
    • +
    • +

      Region:

      +
    • +
    +
    +
  8. +
  9. +

    To allow a migration without validating the provider’s CA certificate, select the Skip certificate validation check box. By default, the checkbox is cleared, meaning that the certificate will be validated.

    +
  10. +
  11. +

    If you did not select Skip certificate validation, the CA certificate field is visible. Drag the CA certificate used to connect to the source environment to the text box or browse for it and click Select. If you did select the check box, the CA certificate text box is not visible.

    +
  12. +
  13. +

    Click Create to add and save the provider.

    +
    +

    The source provider appears in the list of providers.

    +
    +
  14. +
+
+ + +
+ + diff --git a/modules/ostack-app-cred-auth/index.html b/modules/ostack-app-cred-auth/index.html new file mode 100644 index 000000000000..9ec47c3b9394 --- /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 000000000000..aabd2d4c92cc --- /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 000000000000..45ee72b4f923 --- /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 000000000000..0d4913079a18 --- /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/rhv-prerequisites/index.html b/modules/rhv-prerequisites/index.html new file mode 100644 index 000000000000..7d392cbc94f4 --- /dev/null +++ b/modules/rhv-prerequisites/index.html @@ -0,0 +1,88 @@ + + + + + + + + Forklift Documentation + + + + + + + + + + + + + +Forklift Documentation | Migrating VMware virtual machines to KubeVirt + + + + + + + + + + + + + + + + + + + + + + + + +
+

oVirt prerequisites

+
+

The following prerequisites apply to oVirt migrations:

+
+
+ +
+
+

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 000000000000..cadf723f0bfb --- /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 000000000000..2b7906db17da --- /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 000000000000..ae5a55e6c79a --- /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 000000000000..8901d4710ef0 --- /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 000000000000..2e69c7a6214f --- /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 000000000000..bcda713a1105 --- /dev/null +++ b/modules/rn-2.5/index.html @@ -0,0 +1,325 @@ + + + + + + + + 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.

+
+
+
+
+

Technical changes

+
+
+

This release has the following technical changes:

+
+
+
Migration from OpenStack moves to being a fully supported feature
+

In this version, migration using OpenStack source providers graduated from a Technology Preview feature to a fully supported feature.

+
+
+
Disabling FIPS
+

EMS enforcement is disabled for migrations with VMware vSphere source providers to enable migrations from versions of vSphere that are supported by Forklift but do not comply with the 2023 FIPS requirements.

+
+
+
Integration of the create and update provider user interface
+

The user interface of 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 MTV 2.3 cannot be enabled by setting feature_ui: true in ForkliftController anymore.

+
+
+
+
+

New features and enhancements

+
+
+

This release has the following features and improvements:

+
+
+
Migration using OVA files created by 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 as well as a destination provider. You can migrate VMs from the cluster that MTV 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 RHV, direct 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, the following authentication methods are supported: 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
+

The VMware vSphere source provider can now be created without specifying a VDDK init image. It is strongly recommended to create a VDDK init image to accelerate migrations.

+
+
+
+
+

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 running a new migration plan with the same name, or if deleting a migrated VM and remigrating 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 do not fail, but the encryption key may be missing on the target OKD cluster.

+
+
+
Migration fails during precopy/cutover while a snapshot operation is performed on the source VM
+

Warm migration from oVirt fails if a snapshot operation is performed on the source VM. If a 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)

+
+
+
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 may 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 may instantly 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)

+
+
+

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:

+
+
+
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.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. 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 MTV 2.5.2. It is advised to update to this version of MTV 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 MTV 2.5 versions before MTV 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 MTV 2.5.2. It is advised to update to this version of MTV or later.

+
+
+

For more information, see CVE-2023-26144.

+
+
+
Ensure up-to-date data is displayed in the create and update provider forms
+

In previous 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 previous 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 previous 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 previous 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 previous 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 the snapshot creation could not be triggered.

+
+
+

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 previous 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 previous 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 may boot from non-bootable disk after migration
+

In previous 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 are able to boot on the target OKD cluster. (MTV-433)

+
+
+

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/running-migration-plan/index.html b/modules/running-migration-plan/index.html new file mode 100644 index 000000000000..8ef10cf32ab1 --- /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 000000000000..f590c1a9033f --- /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 000000000000..3090c1ab070e --- /dev/null +++ b/modules/selecting-migration-network-for-vmware-source-provider/index.html @@ -0,0 +1,139 @@ + + + + + + + + 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.

+
+
+
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 must 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 000000000000..d6a84b454faa --- /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-migrating-luns/index.html b/modules/snip-migrating-luns/index.html new file mode 100644 index 000000000000..0e15f0cb1e00 --- /dev/null +++ b/modules/snip-migrating-luns/index.html @@ -0,0 +1,89 @@ + + + + + + + + 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.

    +
  • +
  • +

    Migration of Fibre Channel LUNs is not supported.

    +
  • +
+
+
+
+ + +
+ + diff --git a/modules/snip_permissions-info/index.html b/modules/snip_permissions-info/index.html new file mode 100644 index 000000000000..122b3a2e51ee --- /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/snippet_getting_web_console_url_cli/index.html b/modules/snippet_getting_web_console_url_cli/index.html new file mode 100644 index 000000000000..052609296688 --- /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 000000000000..71a333fe33e4 --- /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 000000000000..b8f774849e3f --- /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 000000000000..8177c918cb34 --- /dev/null +++ b/modules/source-vm-prerequisites/index.html @@ -0,0 +1,121 @@ + + + + + + + + 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 VM operating system must be certified and supported for use as a guest operating system with KubeVirt.

    +
  • +
  • +

    VM names must contain only lowercase letters (a-z), numbers (0-9), or hyphens (-), up to a maximum of 253 characters. The first and last characters must be alphanumeric. The name must not contain uppercase letters, spaces, periods (.), or special characters.

    +
  • +
  • +

    VM names must not duplicate the name of a 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 entered a VM name that does not follow the rules.

    +
    +
    +
    +
  • +
+
+ + +
+ + diff --git a/modules/storage-support/index.html b/modules/storage-support/index.html new file mode 100644 index 000000000000..ef12838a3567 --- /dev/null +++ b/modules/storage-support/index.html @@ -0,0 +1,188 @@ + + + + + + + + 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.

+
+
+ + + + + +
+
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.

+
+
+
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+ + +
+ + diff --git a/modules/technology-preview/index.html b/modules/technology-preview/index.html new file mode 100644 index 000000000000..65a2faeefada --- /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 000000000000..6aadb9374656 --- /dev/null +++ b/modules/uninstalling-mtv-cli/index.html @@ -0,0 +1,106 @@ + + + + + + + + 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) by deleting the {namespace} project and the forklift.konveyor.io custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Delete the project:

    +
    +
    +
    $ kubectl delete project konveyor-forklift
    +
    +
    +
  2. +
  3. +

    Delete the CRDs:

    +
    +
    +
    $ kubectl get crd -o name | grep 'forklift' | xargs kubectl delete
    +
    +
    +
  4. +
  5. +

    Delete the OAuthClient:

    +
    +
    +
    $ kubectl delete oauthclient/forklift-ui
    +
    +
    +
  6. +
+
+ + +
+ + diff --git a/modules/uninstalling-mtv-ui/index.html b/modules/uninstalling-mtv-ui/index.html new file mode 100644 index 000000000000..8d819415517e --- /dev/null +++ b/modules/uninstalling-mtv-ui/index.html @@ -0,0 +1,103 @@ + + + + + + + + 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 to delete the {namespace} project and custom resource definitions (CRDs).

+
+
+
Prerequisites
+
    +
  • +

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

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

    Click HomeProjects.

    +
  2. +
  3. +

    Locate the konveyor-forklift project.

    +
  4. +
  5. +

    On the right side of the project, select Delete Project from the {kebab}.

    +
  6. +
  7. +

    In the Delete Project pane, enter the project name and click Delete.

    +
  8. +
  9. +

    Click AdministrationCustomResourceDefinitions.

    +
  10. +
  11. +

    Enter forklift in the Search field to locate the CRDs in the forklift.konveyor.io group.

    +
  12. +
  13. +

    On the right side of each CRD, select Delete CustomResourceDefinition from the {kebab}.

    +
  14. +
+
+ + +
+ + diff --git a/modules/updating-validation-rules-version/index.html b/modules/updating-validation-rules-version/index.html new file mode 100644 index 000000000000..cc2b39572327 --- /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 000000000000..8dd565dcc7fb --- /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 Addding 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 000000000000..ddec1d8e5692 --- /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 000000000000..c5a84fcc8a6a --- /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 000000000000..72d7d392c79f --- /dev/null +++ b/modules/vmware-prerequisites/index.html @@ -0,0 +1,248 @@ + + + + + + + + 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.

    +
  • +
  • +

    You must install VMware Tools on all source virtual machines (VMs).

    +
  • +
  • +

    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.

    +
  • +
  • +

    You must obtain the SHA-1 fingerprint of the vCenter 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.

    +
  • +
  • +

    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.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.

+ + +
+ + diff --git a/redirects.json b/redirects.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /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 000000000000..e087884e6825 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: /sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000000..65963896b789 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,816 @@ + + + +/documentation/modules/about-cold-warm-migration/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/about-cold-warm-migration/ + + +/documentation/doc-Release_notes/modules/about-cold-warm-migration/ + + +/modules/about-cold-warm-migration/ + + +/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/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-default-validation-rules/ + + +/modules/accessing-default-validation-rules/ + + +/documentation/modules/accessing-default-validation-rules/ + + +/documentation/doc-Release_notes/modules/accessing-default-validation-rules/ + + +/modules/accessing-logs-cli/ + + +/documentation/doc-Release_notes/modules/accessing-logs-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-cli/ + + +/documentation/modules/accessing-logs-cli/ + + +/modules/accessing-logs-ui/ + + +/documentation/modules/accessing-logs-ui/ + + +/documentation/doc-Release_notes/modules/accessing-logs-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/accessing-logs-ui/ + + +/documentation/doc-Release_notes/modules/adding-hooks/ + + +/documentation/modules/adding-hooks/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-hooks/ + + +/modules/adding-hooks/ + + +/documentation/doc-Release_notes/modules/adding-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-source-provider/ + + +/documentation/modules/adding-source-provider/ + + +/modules/adding-source-provider/ + + +/documentation/doc-Release_notes/modules/adding-virt-provider/ + + +/documentation/modules/adding-virt-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/adding-virt-provider/ + + +/modules/adding-virt-provider/ + + +/documentation/modules/canceling-migration-cli/ + + +/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-ui/ + + +/modules/canceling-migration-ui/ + + +/documentation/doc-Release_notes/modules/canceling-migration-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/canceling-migration-ui/ + + +/documentation/doc-Release_notes/modules/changing-precopy-intervals/ + + +/documentation/modules/changing-precopy-intervals/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/changing-precopy-intervals/ + + +/modules/changing-precopy-intervals/ + + +/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/collected-logs-cr-info/ + + +/modules/common-attributes/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/common-attributes/ + + +/documentation/modules/common-attributes/ + + +/documentation/doc-Release_notes/modules/common-attributes/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/compatibility-guidelines/ + + +/modules/compatibility-guidelines/ + + +/documentation/doc-Release_notes/modules/compatibility-guidelines/ + + +/documentation/modules/compatibility-guidelines/ + + +/modules/creating-migration-plan/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-migration-plan/ + + +/documentation/modules/creating-migration-plan/ + + +/documentation/doc-Release_notes/modules/creating-migration-plan/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-network-mapping/ + + +/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/ + + +/modules/creating-validation-rule/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-validation-rule/ + + +/documentation/doc-Release_notes/modules/creating-validation-rule/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/creating-vddk-image/ + + +/modules/creating-vddk-image/ + + +/documentation/modules/creating-vddk-image/ + + +/documentation/doc-Release_notes/modules/creating-vddk-image/ + + +/modules/error-messages/ + + +/documentation/modules/error-messages/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/error-messages/ + + +/documentation/doc-Release_notes/modules/error-messages/ + + +/documentation/modules/increasing-nfc-memory-vmware-host/ + + +/documentation/doc-Release_notes/modules/increasing-nfc-memory-vmware-host/ + + +/modules/increasing-nfc-memory-vmware-host/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/increasing-nfc-memory-vmware-host/ + + +/ + + +/documentation/modules/installing-mtv-operator/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/installing-mtv-operator/ + + +/modules/installing-mtv-operator/ + + +/documentation/doc-Release_notes/modules/installing-mtv-operator/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/making-open-source-more-inclusive/ + + +/modules/making-open-source-more-inclusive/ + + +/documentation/doc-Release_notes/modules/making-open-source-more-inclusive/ + + +/documentation/modules/making-open-source-more-inclusive/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/master/ + + +/documentation/doc-Release_notes/master/ + + +/modules/migrating-virtual-machines-cli/ + + +/documentation/modules/migrating-virtual-machines-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migrating-virtual-machines-cli/ + + +/documentation/doc-Release_notes/modules/migrating-virtual-machines-cli/ + + +/documentation/doc-Release_notes/modules/migration-plan-options-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/migration-plan-options-ui/ + + +/modules/migration-plan-options-ui/ + + +/documentation/modules/migration-plan-options-ui/ + + +/modules/mtv-overview-page/ + + +/documentation/modules/mtv-overview-page/ + + +/documentation/doc-Release_notes/modules/mtv-overview-page/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-overview-page/ + + +/documentation/doc-Release_notes/modules/mtv-resources-and-services/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-resources-and-services/ + + +/documentation/modules/mtv-resources-and-services/ + + +/modules/mtv-resources-and-services/ + + +/documentation/modules/mtv-settings/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-settings/ + + +/modules/mtv-settings/ + + +/documentation/doc-Release_notes/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/ + + +/documentation/doc-Release_notes/modules/mtv-workflow/ + + +/documentation/modules/mtv-workflow/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/mtv-workflow/ + + +/modules/mtv-workflow/ + + +/documentation/doc-Release_notes/modules/network-prerequisites/ + + +/modules/network-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/network-prerequisites/ + + +/documentation/modules/network-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/non-admin-permissions-for-ui/ + + +/documentation/modules/non-admin-permissions-for-ui/ + + +/documentation/doc-Release_notes/modules/non-admin-permissions-for-ui/ + + +/modules/non-admin-permissions-for-ui/ + + +/documentation/modules/obtaining-console-url/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-console-url/ + + +/modules/obtaining-console-url/ + + +/documentation/doc-Release_notes/modules/obtaining-console-url/ + + +/modules/obtaining-vmware-fingerprint/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/obtaining-vmware-fingerprint/ + + +/documentation/doc-Release_notes/modules/obtaining-vmware-fingerprint/ + + +/documentation/modules/obtaining-vmware-fingerprint/ + + +/modules/openstack-prerequisites/ + + +/documentation/doc-Release_notes/modules/openstack-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/openstack-prerequisites/ + + +/documentation/modules/openstack-prerequisites/ + + +/documentation/modules/osh-adding-source-provider/ + + +/modules/osh-adding-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/osh-adding-source-provider/ + + +/documentation/doc-Release_notes/modules/osh-adding-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-app-cred-auth/ + + +/modules/ostack-app-cred-auth/ + + +/documentation/modules/ostack-app-cred-auth/ + + +/documentation/doc-Release_notes/modules/ostack-app-cred-auth/ + + +/documentation/modules/ostack-token-auth/ + + +/modules/ostack-token-auth/ + + +/documentation/doc-Release_notes/modules/ostack-token-auth/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ostack-token-auth/ + + +/documentation/modules/ova-prerequisites/ + + +/modules/ova-prerequisites/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/ova-prerequisites/ + + +/documentation/doc-Release_notes/modules/ova-prerequisites/ + + +/documentation/modules/retrieving-validation-service-json/ + + +/modules/retrieving-validation-service-json/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/retrieving-validation-service-json/ + + +/documentation/doc-Release_notes/modules/retrieving-validation-service-json/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rhv-prerequisites/ + + +/modules/rhv-prerequisites/ + + +/documentation/doc-Release_notes/modules/rhv-prerequisites/ + + +/documentation/modules/rhv-prerequisites/ + + +/documentation/modules/rn-2.0/ + + +/modules/rn-2.0/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.0/ + + +/documentation/doc-Release_notes/modules/rn-2.0/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.1/ + + +/modules/rn-2.1/ + + +/documentation/modules/rn-2.1/ + + +/documentation/doc-Release_notes/modules/rn-2.1/ + + +/documentation/doc-Release_notes/modules/rn-2.2/ + + +/documentation/modules/rn-2.2/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.2/ + + +/modules/rn-2.2/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.3/ + + +/documentation/modules/rn-2.3/ + + +/modules/rn-2.3/ + + +/documentation/doc-Release_notes/modules/rn-2.3/ + + +/documentation/doc-Release_notes/modules/rn-2.4/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.4/ + + +/documentation/modules/rn-2.4/ + + +/modules/rn-2.4/ + + +/documentation/doc-Release_notes/modules/rn-2.5/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/rn-2.5/ + + +/documentation/modules/rn-2.5/ + + +/modules/rn-2.5/ + + +/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/doc-Release_notes/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/modules/selecting-migration-network-for-virt-provider/ + + +/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-virt-provider/ + + +/documentation/doc-Release_notes/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network-for-vmware-source-provider/ + + +/modules/selecting-migration-network-for-vmware-source-provider/ + + +/documentation/doc-Release_notes/modules/selecting-migration-network/ + + +/documentation/modules/selecting-migration-network/ + + +/modules/selecting-migration-network/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/selecting-migration-network/ + + +/documentation/doc-Release_notes/modules/snip-migrating-luns/ + + +/documentation/modules/snip-migrating-luns/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip-migrating-luns/ + + +/modules/snip-migrating-luns/ + + +/documentation/modules/snip_permissions-info/ + + +/documentation/doc-Release_notes/modules/snip_permissions-info/ + + +/modules/snip_permissions-info/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snip_permissions-info/ + + +/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-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_cli/ + + +/documentation/modules/snippet_getting_web_console_url_web/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_getting_web_console_url_web/ + + +/modules/snippet_getting_web_console_url_web/ + + +/documentation/doc-Release_notes/modules/snippet_getting_web_console_url_web/ + + +/documentation/doc-Release_notes/modules/snippet_ova_tech_preview/ + + +/documentation/modules/snippet_ova_tech_preview/ + + +/modules/snippet_ova_tech_preview/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/snippet_ova_tech_preview/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/source-vm-prerequisites/ + + +/documentation/modules/source-vm-prerequisites/ + + +/modules/source-vm-prerequisites/ + + +/documentation/doc-Release_notes/modules/source-vm-prerequisites/ + + +/documentation/modules/storage-support/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/storage-support/ + + +/modules/storage-support/ + + +/documentation/doc-Release_notes/modules/storage-support/ + + +/documentation/modules/technology-preview/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/technology-preview/ + + +/modules/technology-preview/ + + +/documentation/doc-Release_notes/modules/technology-preview/ + + +/documentation/modules/uninstalling-mtv-cli/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-cli/ + + +/modules/uninstalling-mtv-cli/ + + +/documentation/doc-Release_notes/modules/uninstalling-mtv-cli/ + + +/documentation/modules/uninstalling-mtv-ui/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/uninstalling-mtv-ui/ + + +/modules/uninstalling-mtv-ui/ + + +/documentation/doc-Release_notes/modules/uninstalling-mtv-ui/ + + +/documentation/modules/updating-validation-rules-version/ + + +/modules/updating-validation-rules-version/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/modules/updating-validation-rules-version/ + + +/documentation/doc-Release_notes/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-Release_notes/modules/using-must-gather/ + + +/documentation/modules/using-must-gather/ + + +/modules/using-must-gather/ + + +/documentation/doc-Migration_Toolkit_for_Virtualization/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/modules/vmware-prerequisites/ + + +/modules/vmware-prerequisites/ + + +/documentation/doc-Release_notes/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/ + +