Documentation
¶
Overview ¶
The Plan CR represents a planned migration of VMs. The plan defines the source and destination providers; the resource mapping and a list of VMs to be migrated. The plan controller watches Migration CRs. Each Migration CR represents a separate and ordered execution of the plan. During plan execution, all validations are suspended. The plan Status.Migration contains a snapshot of the specification (except secrets) which is used during the execution.
Each plan execution:
1. Update the Status.Migration snapshot. 2. Ensure the plan CR namespace exists on the destination. 3. Ensure the CNV Secret exists and configured correctly on the destination. 4. Ensure the CNV ResourceMapping CR exists and configured correctly on the destination. 5. Create a CNV Import CR for each incomplete VM. 6. Requeue the reconcile until all of the VMs have either succeeded or failed. 7. A VM has completed successfully when it reaches the `Complete` phase without an error.
Each plan execution is idempotent. Subsequent migrations will only affect incomplete or failed VM migrations.
Index ¶
- Constants
- Variables
- func Add(mgr manager.Manager) error
- func GetOvaPvListNfs(dClient client.Client, planID string) (pvs *core.PersistentVolumeList, found bool, err error)
- func GetOvaPvcListNfs(dClient client.Client, planID string, planNamespace string) (pvcs *core.PersistentVolumeClaimList, found bool, err error)
- func RequestForMigration(ctx context.Context, a client.Object) (list []reconcile.Request)
- type DsMapPredicate
- func (r DsMapPredicate) Create(e event.TypedCreateEvent[*api.StorageMap]) bool
- func (r DsMapPredicate) Delete(e event.TypedDeleteEvent[*api.StorageMap]) bool
- func (r DsMapPredicate) Generic(e event.TypedGenericEvent[*api.StorageMap]) bool
- func (r DsMapPredicate) Update(e event.TypedUpdateEvent[*api.StorageMap]) bool
- type ExtendedDataVolume
- type HookPredicate
- type HookRunner
- type KubeVirt
- func (r *KubeVirt) CreatePvForNfs() (pvName string, err error)
- func (r *KubeVirt) CreatePvcForNfs(pvcNamePrefix, pvName, vmID string) (pvcName string, err error)
- func (r *KubeVirt) DataVolumes(vm *plan.VMStatus) (dataVolumes []cdi.DataVolume, err error)
- func (r *KubeVirt) DeleteConfigMap(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteDataVolumes(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteGuestConversionPod(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteHookJobs(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteImporterPods(pvc *core.PersistentVolumeClaim) (err error)
- func (r *KubeVirt) DeleteJobs(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteObject(object client.Object, vm *plan.VMStatus, message, objType string, ...) (err error)
- func (r *KubeVirt) DeletePVCConsumerPod(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeletePopulatedPVCs(vm *plan.VMStatus) error
- func (r *KubeVirt) DeletePopulatorPods(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteSecret(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) DeleteVM(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) EnsureDataVolumes(vm *plan.VMStatus, dataVolumes []cdi.DataVolume) (err error)
- func (r *KubeVirt) EnsureExtraV2vConfConfigMap() error
- func (r *KubeVirt) EnsureGuestConversionPod(vm *plan.VMStatus, vmCr *VirtualMachine, pvcs []*core.PersistentVolumeClaim) (err error)
- func (r *KubeVirt) EnsureNamespace() error
- func (r *KubeVirt) EnsureOVAVirtV2VPVCStatus(vmID string) (ready bool, err error)
- func (r *KubeVirt) EnsurePersistentVolume(vmRef ref.Ref, persistentVolumes []core.PersistentVolume) (err error)
- func (r *KubeVirt) EnsurePersistentVolumeClaim(vmRef ref.Ref, persistentVolumeClaims []core.PersistentVolumeClaim) (err error)
- func (r *KubeVirt) EnsurePopulatorVolumes(vm *plan.VMStatus, pvcs []*core.PersistentVolumeClaim) (err error)
- func (r *KubeVirt) EnsureVM(vm *plan.VMStatus) error
- func (r *KubeVirt) GetGuestConversionPod(vm *plan.VMStatus) (pod *core.Pod, err error)
- func (r *KubeVirt) GetImporterPod(pvc core.PersistentVolumeClaim) (pod *core.Pod, found bool, err error)
- func (r *KubeVirt) GetPods(vm *plan.VMStatus) (pods *core.PodList, err error)
- func (r *KubeVirt) GetPodsWithLabels(podLabels map[string]string) (pods *core.PodList, err error)
- func (r *KubeVirt) IsCopyOffload(pvcs []*core.PersistentVolumeClaim) bool
- func (r *KubeVirt) ListVMs() ([]VirtualMachine, error)
- func (r *KubeVirt) PopulatorVolumes(vmRef ref.Ref) (pvcs []*core.PersistentVolumeClaim, err error)
- func (r *KubeVirt) SetPopulatorPodOwnership(vm *plan.VMStatus) (err error)
- func (r *KubeVirt) UpdateVmByConvertedConfig(vm *plan.VMStatus, pod *core.Pod, step *plan.Step) error
- func (r *KubeVirt) VirtualMachineMap() (mp VirtualMachineMap, err error)
- type Migration
- type MigrationPredicate
- func (r MigrationPredicate) Create(e event.TypedCreateEvent[*api.Migration]) bool
- func (r MigrationPredicate) Delete(e event.TypedDeleteEvent[*api.Migration]) bool
- func (r MigrationPredicate) Generic(e event.TypedGenericEvent[*api.Migration]) bool
- func (r MigrationPredicate) Update(e event.TypedUpdateEvent[*api.Migration]) bool
- type NetMapPredicate
- func (r NetMapPredicate) Create(e event.TypedCreateEvent[*api.NetworkMap]) bool
- func (r NetMapPredicate) Delete(e event.TypedDeleteEvent[*api.NetworkMap]) bool
- func (r NetMapPredicate) Generic(e event.TypedGenericEvent[*api.NetworkMap]) bool
- func (r NetMapPredicate) Update(e event.TypedUpdateEvent[*api.NetworkMap]) bool
- type OpenPort
- type PlanPredicate
- type ProviderPredicate
- func (r *ProviderPredicate) Create(e event.TypedCreateEvent[*api.Provider]) bool
- func (r *ProviderPredicate) Delete(e event.TypedDeleteEvent[*api.Provider]) bool
- func (r *ProviderPredicate) Generic(e event.TypedGenericEvent[*api.Provider]) bool
- func (r *ProviderPredicate) Update(e event.TypedUpdateEvent[*api.Provider]) bool
- type Reconciler
- func (r *Reconciler) IsValidNetworkNameTemplate(networkNameTemplate string) error
- func (r *Reconciler) IsValidTargetName(targetName string) error
- func (r *Reconciler) IsValidTemplate(templateStr string, testData interface{}) (string, error)
- func (r *Reconciler) IsValidVolumeNameTemplate(volumeNameTemplate string) error
- func (r Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (result reconcile.Result, err error)
- type VirtualMachine
- type VirtualMachineMap
Constants ¶
const ( // Name. Name = "plan" // Annotation for populator Labels set AnnPopulatorLabels = "populatorLabels" )
const ( // Legacy transfer network annotation (value=network-attachment-definition name) // FIXME: this should be phased out and replaced with the // k8s.v1.cni.cncf.io/networks annotation. AnnLegacyTransferNetwork = "v1.multus-cni.io/default-network" // Transfer network annotation (value=network-attachment-definition name) AnnTransferNetwork = "k8s.v1.cni.cncf.io/networks" // Annotation to specify the default route for the transfer network. // To be set on the transfer network NAD by the end user. AnnForkliftNetworkRoute = "forklift.konveyor.io/route" // Contains validations for a Kubevirt VM. Needs to be removed when // creating a VM from a template. AnnKubevirtValidations = "vm.kubevirt.io/validations" // PVC annotation containing the name of the importer pod. AnnImporterPodName = "cdi.kubevirt.io/storage.import.importPodName" // Openshift display name annotation (value=vmName) AnnDisplayName = "openshift.io/display-name" // Original VM name on source (value=vmOriginalID) AnnOriginalID = "original-ID" // DV deletion on completion AnnDeleteAfterCompletion = "cdi.kubevirt.io/storage.deleteAfterCompletion" // Max Length for vm name NameMaxLength = 63 VddkVolumeName = "vddk-vol-mount" DynamicScriptsVolumeName = "scripts-volume-mount" DynamicScriptsMountPath = "/mnt/dynamic_scripts" )
Annotations
const ( OvaPVCLabel = "nfs-pvc" OvaPVLabel = "nfs-pv" )
Labels
const ( ExtraV2vConf = "extra-v2v-conf" VddkConf = "vddk-conf" VddkAioBufSizeDefault = "16" VddkAioBufCountDefault = "4" )
Vddk v2v conf
const ( NoReQ = time.Duration(0) PollReQ = time.Second * 3 )
Requeue
const ( TransferCompleted = "Transfer completed." PopulatorPodPrefix = "populate-" DvStatusCheckRetriesAnnotation = "dvStatusCheckRetries" // TODO: ImageConversion and DiskTransferV2v step names remain here // until remaining cold/warm migration flow details can be // moved into base migrators. ImageConversion = "ImageConversion" DiskTransferV2v = "DiskTransferV2v" )
const ( WarmMigrationNotReady = "WarmMigrationNotReady" MigrationTypeNotValid = "MigrationTypeNotValid" NamespaceNotValid = "NamespaceNotValid" TransferNetNotValid = "TransferNetworkNotValid" NetRefNotValid = "NetworkMapRefNotValid" NetMapNotReady = "NetworkMapNotReady" NetMapPreservingIPsOnPodNetwork = "NetMapPreservingIPsOnPodNetwork" DsMapNotReady = "StorageMapNotReady" DsRefNotValid = "StorageRefNotValid" VMRefNotValid = "VMRefNotValid" VMNotFound = "VMNotFound" VMAlreadyExists = "VMAlreadyExists" VMNetworksNotMapped = "VMNetworksNotMapped" VMStorageNotMapped = "VMStorageNotMapped" VMStorageNotSupported = "VMStorageNotSupported" VMMultiplePodNetworkMappings = "VMMultiplePodNetworkMappings" VMMissingGuestIPs = "VMMissingGuestIPs" VMIpNotMatchingUdnSubnet = "VMIpNotMatchingUdnSubnet" VMMissingChangedBlockTracking = "VMMissingChangedBlockTracking" VMHasSnapshots = "VMHasSnapshots" HostNotReady = "HostNotReady" DuplicateVM = "DuplicateVM" NameNotValid = "TargetNameNotValid" HookNotValid = "HookNotValid" HookNotReady = "HookNotReady" HookStepNotValid = "HookStepNotValid" Executing = "Executing" Succeeded = "Succeeded" Failed = "Failed" Canceled = "Canceled" Deleted = "Deleted" Paused = "Paused" Archived = "Archived" UnsupportedDisks = "UnsupportedDisks" InvalidDiskSizes = "InvalidDiskSizes" MacConflicts = "MacConflicts" MissingPvcForOnlyConversion = "MissingPvcForOnlyConversion" LuksAndClevisIncompatibility = "LuksAndClevisIncompatibility" UnsupportedUdn = "UnsupportedUserDefinedNetwork" VDDKInvalid = "VDDKInvalid" ValidatingVDDK = "ValidatingVDDK" VDDKInitImageNotReady = "VDDKInitImageNotReady" UnsupportedOvaSource = "UnsupportedOvaSource" VMPowerStateUnsupported = "VMPowerStateUnsupported" VMMigrationTypeUnsupported = "VMMigrationTypeUnsupported" )
Types
const ( Required = libcnd.Required Advisory = libcnd.Advisory Critical = libcnd.Critical Error = libcnd.Error Warn = libcnd.Warn )
Categories
const ( Pod = "pod" Multus = "multus" Ignored = "ignored" )
Network types
const ( Started = "Started" NotSet = "NotSet" NotFound = "NotFound" NotUnique = "NotUnique" NotSupported = "NotSupported" Ambiguous = "Ambiguous" NotValid = "NotValid" Modified = "Modified" UserRequested = "UserRequested" InMaintenanceMode = "InMaintenanceMode" MissingGuestInfo = "MissingGuestInformation" MissingChangedBlockTracking = "MissingChangedBlockTracking" )
Reasons
const ( True = libcnd.True False = libcnd.False )
Statuses
const (
)Variables ¶
var Settings = &settings.Settings
Application settings.
Functions ¶
func GetOvaPvListNfs ¶
func GetOvaPvcListNfs ¶
Types ¶
type DsMapPredicate ¶
type DsMapPredicate struct { predicate.TypedFuncs[*api.StorageMap] }
func (DsMapPredicate) Create ¶
func (r DsMapPredicate) Create(e event.TypedCreateEvent[*api.StorageMap]) bool
func (DsMapPredicate) Delete ¶
func (r DsMapPredicate) Delete(e event.TypedDeleteEvent[*api.StorageMap]) bool
func (DsMapPredicate) Generic ¶
func (r DsMapPredicate) Generic(e event.TypedGenericEvent[*api.StorageMap]) bool
func (DsMapPredicate) Update ¶
func (r DsMapPredicate) Update(e event.TypedUpdateEvent[*api.StorageMap]) bool
type ExtendedDataVolume ¶
type ExtendedDataVolume struct { *cdi.DataVolume PVC *core.PersistentVolumeClaim }
Represents a CDI DataVolume, its associated PVC, and added behavior.
func (*ExtendedDataVolume) Conditions ¶
func (r *ExtendedDataVolume) Conditions() (cnd *libcnd.Conditions)
Get conditions.
func (*ExtendedDataVolume) PercentComplete ¶
func (r *ExtendedDataVolume) PercentComplete() (pct float64)
Convert the Status.Progress into a percentage (float).
type HookPredicate ¶
type HookPredicate struct { predicate.TypedFuncs[*api.Hook] }
func (HookPredicate) Create ¶
func (r HookPredicate) Create(e event.TypedCreateEvent[*api.Hook]) bool
func (HookPredicate) Delete ¶
func (r HookPredicate) Delete(e event.TypedDeleteEvent[*api.Hook]) bool
func (HookPredicate) Generic ¶
func (r HookPredicate) Generic(e event.TypedGenericEvent[*api.Hook]) bool
func (HookPredicate) Update ¶
func (r HookPredicate) Update(e event.TypedUpdateEvent[*api.Hook]) bool
type HookRunner ¶
type HookRunner struct { *plancontext.Context // contains filtered or unexported fields }
Hook runner.
type KubeVirt ¶
type KubeVirt struct { *plancontext.Context // Builder Builder adapter.Builder }
Represents kubevirt.
func (*KubeVirt) CreatePvForNfs ¶
func (*KubeVirt) CreatePvcForNfs ¶
func (*KubeVirt) DataVolumes ¶
func (*KubeVirt) DeleteConfigMap ¶
Delete the ConfigMap that was created for this VM.
func (*KubeVirt) DeleteDataVolumes ¶
Delete the DataVolumes associated with the VM.
func (*KubeVirt) DeleteGuestConversionPod ¶
Delete the guest conversion pod on the destination cluster.
func (*KubeVirt) DeleteHookJobs ¶
Delete any hook jobs that belong to a VM migration.
func (*KubeVirt) DeleteImporterPods ¶
func (r *KubeVirt) DeleteImporterPods(pvc *core.PersistentVolumeClaim) (err error)
Delete the importer pods for a PersistentVolumeClaim.
func (*KubeVirt) DeleteObject ¶
func (r *KubeVirt) DeleteObject(object client.Object, vm *plan.VMStatus, message, objType string, options ...client.DeleteOption) (err error)
Deletes an object from destination cluster associated with the VM.
func (*KubeVirt) DeletePVCConsumerPod ¶
Delete the PVC consumer pod on the destination cluster.
func (*KubeVirt) DeletePopulatedPVCs ¶
Deletes PVCs that were populated using a volume populator, including prime PVCs
func (*KubeVirt) DeletePopulatorPods ¶
Delete any populator pods that belong to a VM's migration.
func (*KubeVirt) DeleteSecret ¶
Delete the Secret that was created for this VM.
func (*KubeVirt) EnsureDataVolumes ¶
Ensure the DataVolumes exist on the destination.
func (*KubeVirt) EnsureExtraV2vConfConfigMap ¶
Ensure the config map that contains extra configuration for virt-v2v exists on the destination.
func (*KubeVirt) EnsureGuestConversionPod ¶
func (r *KubeVirt) EnsureGuestConversionPod(vm *plan.VMStatus, vmCr *VirtualMachine, pvcs []*core.PersistentVolumeClaim) (err error)
Ensure the guest conversion (virt-v2v) pod exists on the destination.
func (*KubeVirt) EnsureNamespace ¶
Ensure the namespace exists on the destination.
func (*KubeVirt) EnsureOVAVirtV2VPVCStatus ¶
func (*KubeVirt) EnsurePersistentVolume ¶
func (r *KubeVirt) EnsurePersistentVolume(vmRef ref.Ref, persistentVolumes []core.PersistentVolume) (err error)
Ensure the PV exist on the destination.
func (*KubeVirt) EnsurePersistentVolumeClaim ¶
func (r *KubeVirt) EnsurePersistentVolumeClaim(vmRef ref.Ref, persistentVolumeClaims []core.PersistentVolumeClaim) (err error)
Ensure the PV exist on the destination.
func (*KubeVirt) EnsurePopulatorVolumes ¶
func (*KubeVirt) GetGuestConversionPod ¶
Get the guest conversion pod for the VM.
func (*KubeVirt) GetImporterPod ¶
func (r *KubeVirt) GetImporterPod(pvc core.PersistentVolumeClaim) (pod *core.Pod, found bool, err error)
Get the importer pod for a PersistentVolumeClaim.
func (*KubeVirt) GetPodsWithLabels ¶
Gets pods associated with the VM.
func (*KubeVirt) IsCopyOffload ¶
func (r *KubeVirt) IsCopyOffload(pvcs []*core.PersistentVolumeClaim) bool
IsCopyOffload is determined by PVC having the copy-offload label, which is set by the builder earlier in #PopulatorVolumes TODO rgolan - for now the check will be done if any PVC match in the migration - this is obviously coarse and should be per a disk's storage class, for example a disk from NFS or local doesn't support that (specifically referring to vmkfstools xcopy for RDM)
func (*KubeVirt) ListVMs ¶
func (r *KubeVirt) ListVMs() ([]VirtualMachine, error)
List VirtualMachine CRs. Each VirtualMachine represents an imported kubevirt VM with associated DataVolumes.
func (*KubeVirt) PopulatorVolumes ¶
func (*KubeVirt) SetPopulatorPodOwnership ¶
Set the Populator Pod Ownership.
func (*KubeVirt) UpdateVmByConvertedConfig ¶
func (*KubeVirt) VirtualMachineMap ¶
func (r *KubeVirt) VirtualMachineMap() (mp VirtualMachineMap, err error)
Build a VirtualMachineMap.
type Migration ¶
type Migration struct { *plancontext.Context // contains filtered or unexported fields }
Migration.
func (*Migration) Archive ¶
func (r *Migration) Archive()
Archive the plan. Best effort to remove any retained migration resources.
func (*Migration) Cancel ¶
Cancel the migration. Delete resources associated with VMs that have been marked canceled.
func (*Migration) NextPhase ¶
NextPhase transitions the VM to the next migration phase. If this was the last phase in the current pipeline step, the pipeline step is marked complete.
func (*Migration) SetPopulatorDataSourceLabels ¶
func (r *Migration) SetPopulatorDataSourceLabels()
type MigrationPredicate ¶
type MigrationPredicate struct { predicate.TypedFuncs[*api.Migration] }
func (MigrationPredicate) Create ¶
func (r MigrationPredicate) Create(e event.TypedCreateEvent[*api.Migration]) bool
func (MigrationPredicate) Delete ¶
func (r MigrationPredicate) Delete(e event.TypedDeleteEvent[*api.Migration]) bool
func (MigrationPredicate) Generic ¶
func (r MigrationPredicate) Generic(e event.TypedGenericEvent[*api.Migration]) bool
func (MigrationPredicate) Update ¶
func (r MigrationPredicate) Update(e event.TypedUpdateEvent[*api.Migration]) bool
type NetMapPredicate ¶
type NetMapPredicate struct { predicate.TypedFuncs[*api.NetworkMap] }
func (NetMapPredicate) Create ¶
func (r NetMapPredicate) Create(e event.TypedCreateEvent[*api.NetworkMap]) bool
func (NetMapPredicate) Delete ¶
func (r NetMapPredicate) Delete(e event.TypedDeleteEvent[*api.NetworkMap]) bool
func (NetMapPredicate) Generic ¶
func (r NetMapPredicate) Generic(e event.TypedGenericEvent[*api.NetworkMap]) bool
func (NetMapPredicate) Update ¶
func (r NetMapPredicate) Update(e event.TypedUpdateEvent[*api.NetworkMap]) bool
type OpenPort ¶
type OpenPort struct { // valid values are tcp, udp, sctp, icmp Protocol string `yaml:"protocol"` Port int `yaml:"port,omitempty"` }
For the User Defined Networks we need to open some port so we can communicate with our metrics server inside the User Defined Network Namespace. Docs: https://docs.redhat.com/en/documentation/openshift_container_platform/4.19/html/multiple_networks/primary-networks#opening-default-network-ports-udn_about-user-defined-networks
type PlanPredicate ¶
type PlanPredicate struct { predicate.TypedFuncs[*api.Plan] }
func (PlanPredicate) Create ¶
func (r PlanPredicate) Create(e event.TypedCreateEvent[*api.Plan]) bool
func (PlanPredicate) Delete ¶
func (r PlanPredicate) Delete(e event.TypedDeleteEvent[*api.Plan]) bool
func (PlanPredicate) Update ¶
func (r PlanPredicate) Update(e event.TypedUpdateEvent[*api.Plan]) bool
type ProviderPredicate ¶
type ProviderPredicate struct { handler.WatchManager predicate.TypedFuncs[*api.Provider] // contains filtered or unexported fields }
Provider watch predicate. Also ensures an inventory watch is created and associated with the channel source.
func (*ProviderPredicate) Create ¶
func (r *ProviderPredicate) Create(e event.TypedCreateEvent[*api.Provider]) bool
Provider created event.
func (*ProviderPredicate) Delete ¶
func (r *ProviderPredicate) Delete(e event.TypedDeleteEvent[*api.Provider]) bool
Provider deleted event.
func (*ProviderPredicate) Generic ¶
func (r *ProviderPredicate) Generic(e event.TypedGenericEvent[*api.Provider]) bool
Generic provider watch event.
func (*ProviderPredicate) Update ¶
func (r *ProviderPredicate) Update(e event.TypedUpdateEvent[*api.Provider]) bool
Provider updated event.
type Reconciler ¶
type Reconciler struct {
base.Reconciler
}
Reconciles a Plan object.
func (*Reconciler) IsValidNetworkNameTemplate ¶
func (r *Reconciler) IsValidNetworkNameTemplate(networkNameTemplate string) error
func (*Reconciler) IsValidTargetName ¶
func (r *Reconciler) IsValidTargetName(targetName string) error
func (*Reconciler) IsValidTemplate ¶
func (r *Reconciler) IsValidTemplate(templateStr string, testData interface{}) (string, error)
func (*Reconciler) IsValidVolumeNameTemplate ¶
func (r *Reconciler) IsValidVolumeNameTemplate(volumeNameTemplate string) error
type VirtualMachine ¶
type VirtualMachine struct { *cnv.VirtualMachine DataVolumes []ExtendedDataVolume }
Represents Kubevirt VirtualMachine with associated DataVolumes.
func (*VirtualMachine) Conditions ¶
func (r *VirtualMachine) Conditions() (cnd *libcnd.Conditions)
Get conditions.
func (*VirtualMachine) Owner ¶
func (r *VirtualMachine) Owner(dv *cdi.DataVolume) bool
Determine if `this` VirtualMachine is the owner of the CDI DataVolume.
type VirtualMachineMap ¶
type VirtualMachineMap map[string]VirtualMachine
Map of VirtualMachines keyed by vmID.