Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/frankyang0529/vm-import-controller
https://github.com/frankyang0529/vm-import-controller
Last synced: about 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/frankyang0529/vm-import-controller
- Owner: FrankYang0529
- Fork: true (harvester/vm-import-controller)
- Created: 2023-10-16T07:16:35.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-07-22T09:09:10.000Z (4 months ago)
- Last Synced: 2024-07-22T10:58:34.735Z (4 months ago)
- Language: Go
- Size: 15.4 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# vm-import-controller
vm-import-controller is an addon to help migrate VM workloads from other source clusters to an existing Harvester cluster.
Currently the following source providers will be supported:
* vmware
* openstack## API
The vm-import-controller introduces two CRD's### Sources
sources allows users to define valid source clusters.For example:
```yaml
apiVersion: migration.harvesterhci.io/v1beta1
kind: VmwareSource
metadata:
name: vcsim
namespace: default
spec:
endpoint: "https://vscim/sdk"
dc: "DCO"
credentials:
name: vsphere-credentials
namespace: default
```The secret contains the credentials for the vcenter endpoint:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: vsphere-credentials
namespace: default
stringData:
"username": "user"
"password": "password"
```As part of the reconcile process, the controller will login to the vcenter and verify the `dc` specified in the source spec is valid.
Once this check is passed, the source is marked ready, and can be used for vm migrations
```shell
$ kubectl get vmwaresource.migration
NAME STATUS
vcsim clusterReady
```For openstack based source clusters a sample definition is as follows:
```yaml
apiVersion: migration.harvesterhci.io/v1beta1
kind: OpenstackSource
metadata:
name: devstack
namespace: default
spec:
endpoint: "https://devstack/identity"
region: "RegionOne"
credentials:
name: devstack-credentials
namespace: default
```The secret contains the credentials for the vcenter endpoint:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: devstack-credentials
namespace: default
stringData:
"username": "user"
"password": "password"
"project_name": "admin"
"domain_name": "default"
"ca_cert": "pem-encoded-ca-cert"
```Openstack source reconcile process, attempts to list VM's in the project, and marks the source as ready
```shell
$ kubectl get openstacksource.migration
NAME STATUS
devstack clusterReady
```### VirtualMachimeImport
The VirtualMachineImport crd provides a way for users to define the source VM and mapping to the actual source cluster to perform the VM export-import from.A sample VirtualMachineImport looks as follows:
```yaml
apiVersion: migration.harvesterhci.io/v1beta1
kind: VirtualMachineImport
metadata:
name: alpine-export-test
namespace: default
spec:
virtualMachineName: "alpine-export-test"
networkMapping:
- sourceNetwork: "dvSwitch 1"
destinationNetwork: "default/vlan1"
- sourceNetwork: "dvSwitch 2"
destinationNetwork: "default/vlan2"
sourceCluster:
name: vcsim
namespace: default
kind: VmwareSource
apiVersion: migration.harvesterhci.io/v1beta1
```This will trigger the controller to export the VM named "alpine-export-test" on the vmware source vcsim to be exported, processed and recreated into the harvester cluster
This can take a while based on the size of the virtual machine, but users should see `VirtualMachineImages` created for each disk in the defined virtual machine.
The list of items in `networkMapping` will define how the source network interfaces are mapped into the Harvester Networks.
If a match is not found, then each unmatched network inteface is attached to the default `managementNetwork`
Once the virtual machine has been imported successfully the object will reflect the status
```shell
$ kubectl get virtualmachineimport.migration
NAME STATUS
alpine-export-test virtualMachineRunning
openstack-cirros-test virtualMachineRunning```
Similarly, users can define a VirtualMachineImport for Openstack source as well:
```yaml
apiVersion: migration.harvesterhci.io/v1beta1
kind: VirtualMachineImport
metadata:
name: openstack-demo
namespace: default
spec:
virtualMachineName: "openstack-demo" #Name or UUID for instance
networkMapping:
- sourceNetwork: "shared"
destinationNetwork: "default/vlan1"
- sourceNetwork: "public"
destinationNetwork: "default/vlan2"
sourceCluster:
name: devstack
namespace: default
kind: OpenstackSource
apiVersion: migration.harvesterhci.io/v1beta1
```*NOTE:* Openstack allows users to have multiple instances with the same name. In such a scenario the users are advised to use the Instance ID. The reconcile logic tries to perform a lookup from name to ID when a name is used.
## Testing
Currently basic integration tests are available under `tests/integration`However a lot of these tests need access to a working Harvester, Openstack and Vmware cluster.
The integration tests can be setup by using the following environment variables to point the tests to a working environment to perform the actual vm migration tests
```shell
export GOVC_PASSWORD="vsphere-password"
export GOVC_USERNAME="vsphere-username"
export GOVC_URL="https://vcenter/sdk"
export GOVC_DATACENTER="vsphere-datacenter"
#The controller exposes the converted disks via a http endpoint and leverages the download capability of longhorn backing images
# the SVC address needs to be the address of node where integration tests are running and should be reachable from harvester cluster
export SVC_ADDRESS="address for node"
export VM_NAME="vmware-export-test-vm-name"
export USE_EXISTING_CLUSTER=true
export OS_AUTH_URL="openstack/identity" #Keystone endpoint
export OS_PROJECT_NAME="openstack-project-name"
export OS_USER_DOMAIN_NAME="openstack-user-domain"
export OS_USERNAME="openstack-username"
export OS_PASSWORD="openstack-password"
export OS_VM_NAME="openstack-export-test-vm-name"
export OS_REGION_NAME="openstack-region"
export KUBECONFIG="kubeconfig-for-harvester-cluster"
```