diff --git a/deploy/00crds.yaml b/deploy/00crds.yaml index 836fd7b..ab5b7c1 100644 --- a/deploy/00crds.yaml +++ b/deploy/00crds.yaml @@ -680,6 +680,156 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.17.1 + name: esxisshcreds.vjailbreak.k8s.pf9.io +spec: + group: vjailbreak.k8s.pf9.io + names: + kind: ESXiSSHCreds + listKind: ESXiSSHCredsList + plural: esxisshcreds + singular: esxisshcreds + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.validationStatus + name: Status + type: string + - jsonPath: .status.successfulHosts + name: Successful + type: integer + - jsonPath: .status.failedHosts + name: Failed + type: integer + - jsonPath: .status.totalHosts + name: Total + type: integer + name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + ESXiSSHCreds is the Schema for the esxisshcreds API that defines SSH credentials + for connecting to ESXi hosts. It validates SSH connectivity to ESXi hosts either + discovered from vCenter via VMwareCreds or explicitly specified in the hosts list. + The controller validates connections in parallel with throttling to avoid overwhelming + the network, and reports per-host validation results in the status. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: ESXiSSHCredsSpec defines the desired state of ESXiSSHCreds + properties: + forceReconcileToken: + description: |- + ForceReconcileToken is an opaque token that can be updated to force a reconciliation. + Updating this field will increment metadata.generation and trigger the controller. + type: string + secretRef: + description: |- + SecretRef is the reference to the Kubernetes secret holding the SSH private key + The secret should contain a key named "privateKey" with the SSH private key in PEM format + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + username: + default: root + description: 'Username is the SSH username to use for connecting to + ESXi hosts (default: "root")' + type: string + required: + - secretRef + type: object + status: + description: ESXiSSHCredsStatus defines the observed state of ESXiSSHCreds + properties: + failedHosts: + description: FailedHosts is the number of ESXi hosts that failed validation + type: integer + lastValidationTime: + description: LastValidationTime is the timestamp of the last validation + run + format: date-time + type: string + successfulHosts: + description: SuccessfulHosts is the number of ESXi hosts that passed + validation + type: integer + totalHosts: + description: TotalHosts is the total number of ESXi hosts to validate + type: integer + validationMessage: + description: ValidationMessage is the message associated with the + overall validation + type: string + validationStatus: + description: |- + ValidationStatus is the overall status of the ESXi SSH validation + Possible values: Pending, Validating, Succeeded, PartiallySucceeded, Failed + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.17.1 @@ -697,6 +847,12 @@ spec: - jsonPath: .status.migrationStatus name: Status type: string + - jsonPath: .spec.migrationTemplate + name: Migration Template + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -732,6 +888,11 @@ spec: description: AdvancedOptions is a list of advanced options for the migration properties: + acknowledgeNetworkConflictRisk: + description: AcknowledgeNetworkConflictRisk indicates that the + user acknowledges the risk of network conflicts when doing live + migration + type: boolean granularNetworks: description: GranularNetworks is a list of networks to be migrated items: @@ -760,6 +921,10 @@ spec: description: PeriodicSyncInterval is the interval at which the migration plan should be synced type: string + removeVMwareTools: + description: RemoveVMwareTools instructs the migration helper + to remove VMware Tools post migration + type: boolean type: object assignedIPsPerVM: additionalProperties: @@ -799,6 +964,7 @@ spec: enum: - hot - cold + - mock type: string vmCutoverEnd: format: date-time @@ -813,6 +979,34 @@ spec: description: MigrationTemplate is the template to be used for the migration type: string + networkOverridesPerVM: + additionalProperties: + items: + description: NICOverride defines per-NIC overrides for IP and + MAC preservation during migration + properties: + interfaceIndex: + description: InterfaceIndex is the zero-based index of the + NIC + type: integer + preserveIP: + description: |- + PreserveIP indicates whether to preserve the source VM's IP address for this NIC. + When nil the migration default (preserve) is used. + type: boolean + preserveMAC: + description: |- + PreserveMAC indicates whether to preserve the source VM's MAC address for this NIC. + When nil the migration default (preserve) is used. + type: boolean + required: + - interfaceIndex + type: object + type: array + description: |- + NetworkOverridesPerVM is a map of VM names to per-NIC network overrides + Only NICs with non-default settings (i.e., preserve=false) need to be listed + type: object postMigrationAction: description: PostMigrationAction defines the post migration action for the virtual machine @@ -889,6 +1083,9 @@ spec: - jsonPath: .status.agentName name: Agent Name type: string + - jsonPath: .spec.migrationPlan + name: MigrationPlan + type: string - jsonPath: .metadata.creationTimestamp name: Age type: date @@ -945,6 +1142,11 @@ spec: enum: - hot - cold + - mock + type: string + networkOverrides: + description: NetworkOverrides is the JSON-serialized per-NIC overrides + for IP and MAC preservation type: string podRef: description: PodRef is the name of the pod @@ -1046,6 +1248,11 @@ spec: Set to false for VMs with RDM (Raw Device Mapping) disks that share storage, as RDM disk migration state prevents automatic retry. type: boolean + syncWarningMessage: + description: |- + SyncWarningMessage contains the warning message when periodic sync is in a warning state. + If non-empty, indicates the sync failed but will auto-retry on next interval. + type: string totalDisks: description: TotalDisks is the total number of disks to be migrated type: integer @@ -1292,6 +1499,12 @@ spec: - jsonPath: .status.openstackValidationStatus name: Status type: string + - jsonPath: .spec.secretRef.name + name: Secret Name + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -1389,8 +1602,12 @@ spec: type: string osDomainName: type: string + osIdentityApiVersion: + type: string osInsecure: type: boolean + osInterface: + type: string osPassword: type: string osRegionName: @@ -1481,6 +1698,10 @@ spec: openstack: description: Openstack is the OpenStack configuration for the openstackcreds properties: + backendVolumeTypeMap: + additionalProperties: + type: string + type: object networks: items: type: string @@ -1935,6 +2156,11 @@ spec: description: AdvancedOptions is a list of advanced options for the migration properties: + acknowledgeNetworkConflictRisk: + description: AcknowledgeNetworkConflictRisk indicates that the + user acknowledges the risk of network conflicts when doing live + migration + type: boolean granularNetworks: description: GranularNetworks is a list of networks to be migrated items: @@ -1963,6 +2189,10 @@ spec: description: PeriodicSyncInterval is the interval at which the migration plan should be synced type: string + removeVMwareTools: + description: RemoveVMwareTools instructs the migration helper + to remove VMware Tools post migration + type: boolean type: object bmConfigRef: description: BMConfigRef is the reference to the BMC credentials @@ -2088,6 +2318,7 @@ spec: enum: - hot - cold + - mock type: string vmCutoverEnd: format: date-time @@ -2528,6 +2759,12 @@ spec: - jsonPath: .status.vmwareValidationStatus name: Status type: string + - jsonPath: .spec.secretRef.name + name: Secret Name + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -2682,9 +2919,33 @@ spec: name: description: Name of the host type: string + state: + description: State is the connection state of the host + type: string + vmCount: + description: VMCount is the number of VMs on the host + type: integer type: object status: description: VMwareHostStatus defines the observed state of VMwareHost + properties: + esxiVersion: + description: ESXiVersion is the ESXi version retrieved via SSH if + connection succeeded + type: string + sshLastChecked: + description: SSHLastChecked is the timestamp of the last SSH validation + attempt + format: date-time + type: string + sshMessage: + description: SSHMessage contains details about the SSH validation + result or error + type: string + sshStatus: + description: SSHStatus is the SSH validation status for this host + (Succeeded, Failed, Pending) + type: string type: object type: object served: true @@ -2707,7 +2968,17 @@ spec: singular: vmwaremachine scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.powerState + name: PowerState + type: string + - jsonPath: .spec.migrated + name: Migrated + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: |- @@ -3208,6 +3479,7 @@ rules: - bmconfigs - clustermigrations - esximigrations + - esxisshcreds - migrationplans - migrations - migrationtemplates @@ -3238,6 +3510,7 @@ rules: - bmconfigs/finalizers - clustermigrations/finalizers - esximigrations/finalizers + - esxisshcreds/finalizers - migrationplans/finalizers - migrationtemplates/finalizers - networkmappings/finalizers @@ -3258,6 +3531,7 @@ rules: - bmconfigs/status - clustermigrations/status - esximigrations/status + - esxisshcreds/status - migrationplans/status - migrations/status - migrationtemplates/status @@ -3270,6 +3544,7 @@ rules: - storagemappings/status - vjailbreaknodes/status - vmwarecreds/status + - vmwarehosts/status - vmwaremachines/status verbs: - get diff --git a/deploy/04ui.yaml b/deploy/04ui.yaml index c63194c..f0a62cb 100644 --- a/deploy/04ui.yaml +++ b/deploy/04ui.yaml @@ -20,6 +20,15 @@ spec: imagePullPolicy: IfNotPresent ports: - containerPort: 80 + volumeMounts: + - name: pf9-logs + mountPath: /var/log/pf9 + readOnly: true + volumes: + - name: pf9-logs + hostPath: + path: /var/log/pf9 + type: DirectoryOrCreate --- apiVersion: v1 diff --git a/deploy/05controller-deployment.yaml b/deploy/05controller-deployment.yaml new file mode 100644 index 0000000..2d3a9fb --- /dev/null +++ b/deploy/05controller-deployment.yaml @@ -0,0 +1,98 @@ + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: migration + control-plane: controller-manager + name: migration-controller-manager + namespace: migration-system +spec: + replicas: 1 + selector: + matchLabels: + control-plane: controller-manager + strategy: + type: Recreate + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists + containers: + - args: + - --leader-elect=false + - --health-probe-bind-address=:8081 + command: + - /manager + env: + - name: MAX_CONCURRENT_RECONCILES + value: "5" + envFrom: + - configMapRef: + name: pf9-env + image: quay.io/platform9/vjailbreak-controller:v0.4.1 + imagePullPolicy: IfNotPresent + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - sleep 5 + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + requests: + cpu: 200m + memory: 256Mi + volumeMounts: + - mountPath: /etc/pf9/k3s + name: master-token + - mountPath: /home/ubuntu + name: vddk + - mountPath: /etc/hosts + name: hosts-file + readOnly: true + dnsPolicy: ClusterFirstWithHostNet + hostNetwork: true + securityContext: + runAsGroup: 0 + runAsUser: 0 + serviceAccountName: migration-controller-manager + terminationGracePeriodSeconds: 30 + volumes: + - hostPath: + path: /var/lib/rancher/k3s/server + type: Directory + name: master-token + - hostPath: + path: /home/ubuntu + type: Directory + name: vddk + - hostPath: + path: /etc/hosts + type: File + name: hosts-file +--- \ No newline at end of file diff --git a/deploy/06vpwned-deployment.yaml b/deploy/06vpwned-deployment.yaml new file mode 100644 index 0000000..215ad15 --- /dev/null +++ b/deploy/06vpwned-deployment.yaml @@ -0,0 +1,60 @@ + +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: vpwned-sdk + name: migration-vpwned-sdk + namespace: migration-system +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: vpwned-sdk + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + app: vpwned-sdk + spec: + containers: + - envFrom: + - configMapRef: + name: pf9-env + image: quay.io/platform9/vjailbreak-vpwned:v0.4.1 + imagePullPolicy: IfNotPresent + name: vpwned + ports: + - containerPort: 3001 + protocol: TCP + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/hosts + name: hosts-file + readOnly: true + - mountPath: /home/ubuntu + name: vddk-storage + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccountName: migration-controller-manager + terminationGracePeriodSeconds: 30 + volumes: + - hostPath: + path: /etc/hosts + type: File + name: hosts-file + - hostPath: + path: /home/ubuntu + type: DirectoryOrCreate + name: vddk-storage +--- \ No newline at end of file diff --git a/deploy/07ui-deployment.yaml b/deploy/07ui-deployment.yaml new file mode 100644 index 0000000..78e3da5 --- /dev/null +++ b/deploy/07ui-deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vjailbreak-ui + namespace: migration-system +spec: + replicas: 1 + selector: + matchLabels: + app: vjailbreak-ui + template: + metadata: + labels: + app: vjailbreak-ui + spec: + serviceAccountName: migration-controller-manager + containers: + - name: vjailbreak-ui-container + image: quay.io/platform9/vjailbreak-ui:v0.4.1 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 + volumeMounts: + - name: nginx-shadow-htpasswd + mountPath: /etc/nginx/shadow + - name: pf9-logs + mountPath: /var/log/pf9 + readOnly: true + volumes: + - name: nginx-shadow-htpasswd + hostPath: + path: /etc/htpasswd + type: FileOrCreate + - name: pf9-logs + hostPath: + path: /var/log/pf9 + type: DirectoryOrCreate +--- \ No newline at end of file diff --git a/deploy/installer.yaml b/deploy/installer.yaml index 94c7f7e..bc7630e 100644 --- a/deploy/installer.yaml +++ b/deploy/installer.yaml @@ -680,6 +680,156 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.17.1 + name: esxisshcreds.vjailbreak.k8s.pf9.io +spec: + group: vjailbreak.k8s.pf9.io + names: + kind: ESXiSSHCreds + listKind: ESXiSSHCredsList + plural: esxisshcreds + singular: esxisshcreds + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.validationStatus + name: Status + type: string + - jsonPath: .status.successfulHosts + name: Successful + type: integer + - jsonPath: .status.failedHosts + name: Failed + type: integer + - jsonPath: .status.totalHosts + name: Total + type: integer + name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + ESXiSSHCreds is the Schema for the esxisshcreds API that defines SSH credentials + for connecting to ESXi hosts. It validates SSH connectivity to ESXi hosts either + discovered from vCenter via VMwareCreds or explicitly specified in the hosts list. + The controller validates connections in parallel with throttling to avoid overwhelming + the network, and reports per-host validation results in the status. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: ESXiSSHCredsSpec defines the desired state of ESXiSSHCreds + properties: + forceReconcileToken: + description: |- + ForceReconcileToken is an opaque token that can be updated to force a reconciliation. + Updating this field will increment metadata.generation and trigger the controller. + type: string + secretRef: + description: |- + SecretRef is the reference to the Kubernetes secret holding the SSH private key + The secret should contain a key named "privateKey" with the SSH private key in PEM format + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + username: + default: root + description: 'Username is the SSH username to use for connecting to + ESXi hosts (default: "root")' + type: string + required: + - secretRef + type: object + status: + description: ESXiSSHCredsStatus defines the observed state of ESXiSSHCreds + properties: + failedHosts: + description: FailedHosts is the number of ESXi hosts that failed validation + type: integer + lastValidationTime: + description: LastValidationTime is the timestamp of the last validation + run + format: date-time + type: string + successfulHosts: + description: SuccessfulHosts is the number of ESXi hosts that passed + validation + type: integer + totalHosts: + description: TotalHosts is the total number of ESXi hosts to validate + type: integer + validationMessage: + description: ValidationMessage is the message associated with the + overall validation + type: string + validationStatus: + description: |- + ValidationStatus is the overall status of the ESXi SSH validation + Possible values: Pending, Validating, Succeeded, PartiallySucceeded, Failed + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.17.1 @@ -697,6 +847,12 @@ spec: - jsonPath: .status.migrationStatus name: Status type: string + - jsonPath: .spec.migrationTemplate + name: Migration Template + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -732,6 +888,11 @@ spec: description: AdvancedOptions is a list of advanced options for the migration properties: + acknowledgeNetworkConflictRisk: + description: AcknowledgeNetworkConflictRisk indicates that the + user acknowledges the risk of network conflicts when doing live + migration + type: boolean granularNetworks: description: GranularNetworks is a list of networks to be migrated items: @@ -760,6 +921,10 @@ spec: description: PeriodicSyncInterval is the interval at which the migration plan should be synced type: string + removeVMwareTools: + description: RemoveVMwareTools instructs the migration helper + to remove VMware Tools post migration + type: boolean type: object assignedIPsPerVM: additionalProperties: @@ -799,6 +964,7 @@ spec: enum: - hot - cold + - mock type: string vmCutoverEnd: format: date-time @@ -813,6 +979,34 @@ spec: description: MigrationTemplate is the template to be used for the migration type: string + networkOverridesPerVM: + additionalProperties: + items: + description: NICOverride defines per-NIC overrides for IP and + MAC preservation during migration + properties: + interfaceIndex: + description: InterfaceIndex is the zero-based index of the + NIC + type: integer + preserveIP: + description: |- + PreserveIP indicates whether to preserve the source VM's IP address for this NIC. + When nil the migration default (preserve) is used. + type: boolean + preserveMAC: + description: |- + PreserveMAC indicates whether to preserve the source VM's MAC address for this NIC. + When nil the migration default (preserve) is used. + type: boolean + required: + - interfaceIndex + type: object + type: array + description: |- + NetworkOverridesPerVM is a map of VM names to per-NIC network overrides + Only NICs with non-default settings (i.e., preserve=false) need to be listed + type: object postMigrationAction: description: PostMigrationAction defines the post migration action for the virtual machine @@ -889,6 +1083,9 @@ spec: - jsonPath: .status.agentName name: Agent Name type: string + - jsonPath: .spec.migrationPlan + name: MigrationPlan + type: string - jsonPath: .metadata.creationTimestamp name: Age type: date @@ -945,6 +1142,11 @@ spec: enum: - hot - cold + - mock + type: string + networkOverrides: + description: NetworkOverrides is the JSON-serialized per-NIC overrides + for IP and MAC preservation type: string podRef: description: PodRef is the name of the pod @@ -1046,6 +1248,11 @@ spec: Set to false for VMs with RDM (Raw Device Mapping) disks that share storage, as RDM disk migration state prevents automatic retry. type: boolean + syncWarningMessage: + description: |- + SyncWarningMessage contains the warning message when periodic sync is in a warning state. + If non-empty, indicates the sync failed but will auto-retry on next interval. + type: string totalDisks: description: TotalDisks is the total number of disks to be migrated type: integer @@ -1292,6 +1499,12 @@ spec: - jsonPath: .status.openstackValidationStatus name: Status type: string + - jsonPath: .spec.secretRef.name + name: Secret Name + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -1389,8 +1602,12 @@ spec: type: string osDomainName: type: string + osIdentityApiVersion: + type: string osInsecure: type: boolean + osInterface: + type: string osPassword: type: string osRegionName: @@ -1481,6 +1698,10 @@ spec: openstack: description: Openstack is the OpenStack configuration for the openstackcreds properties: + backendVolumeTypeMap: + additionalProperties: + type: string + type: object networks: items: type: string @@ -1935,6 +2156,11 @@ spec: description: AdvancedOptions is a list of advanced options for the migration properties: + acknowledgeNetworkConflictRisk: + description: AcknowledgeNetworkConflictRisk indicates that the + user acknowledges the risk of network conflicts when doing live + migration + type: boolean granularNetworks: description: GranularNetworks is a list of networks to be migrated items: @@ -1963,6 +2189,10 @@ spec: description: PeriodicSyncInterval is the interval at which the migration plan should be synced type: string + removeVMwareTools: + description: RemoveVMwareTools instructs the migration helper + to remove VMware Tools post migration + type: boolean type: object bmConfigRef: description: BMConfigRef is the reference to the BMC credentials @@ -2088,6 +2318,7 @@ spec: enum: - hot - cold + - mock type: string vmCutoverEnd: format: date-time @@ -2528,6 +2759,12 @@ spec: - jsonPath: .status.vmwareValidationStatus name: Status type: string + - jsonPath: .spec.secretRef.name + name: Secret Name + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -2682,9 +2919,33 @@ spec: name: description: Name of the host type: string + state: + description: State is the connection state of the host + type: string + vmCount: + description: VMCount is the number of VMs on the host + type: integer type: object status: description: VMwareHostStatus defines the observed state of VMwareHost + properties: + esxiVersion: + description: ESXiVersion is the ESXi version retrieved via SSH if + connection succeeded + type: string + sshLastChecked: + description: SSHLastChecked is the timestamp of the last SSH validation + attempt + format: date-time + type: string + sshMessage: + description: SSHMessage contains details about the SSH validation + result or error + type: string + sshStatus: + description: SSHStatus is the SSH validation status for this host + (Succeeded, Failed, Pending) + type: string type: object type: object served: true @@ -2707,7 +2968,17 @@ spec: singular: vmwaremachine scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.powerState + name: PowerState + type: string + - jsonPath: .spec.migrated + name: Migrated + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: |- @@ -3208,6 +3479,7 @@ rules: - bmconfigs - clustermigrations - esximigrations + - esxisshcreds - migrationplans - migrations - migrationtemplates @@ -3238,6 +3510,7 @@ rules: - bmconfigs/finalizers - clustermigrations/finalizers - esximigrations/finalizers + - esxisshcreds/finalizers - migrationplans/finalizers - migrationtemplates/finalizers - networkmappings/finalizers @@ -3258,6 +3531,7 @@ rules: - bmconfigs/status - clustermigrations/status - esximigrations/status + - esxisshcreds/status - migrationplans/status - migrations/status - migrationtemplates/status @@ -3270,6 +3544,7 @@ rules: - storagemappings/status - vjailbreaknodes/status - vmwarecreds/status + - vmwarehosts/status - vmwaremachines/status verbs: - get @@ -4153,7 +4428,7 @@ spec: envFrom: - configMapRef: name: pf9-env - image: quay.io/platform9/vjailbreak-controller:v0.3.8 + image: quay.io/platform9/vjailbreak-controller:v0.4.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -4236,7 +4511,7 @@ spec: - envFrom: - configMapRef: name: pf9-env - image: quay.io/platform9/vjailbreak-vpwned:v0.3.8 + image: quay.io/platform9/vjailbreak-vpwned:v0.4.1 imagePullPolicy: IfNotPresent name: vpwned ports: @@ -4294,3 +4569,43 @@ spec: number: 80 path: /dev-api/sdk/(.*) pathType: ImplementationSpecific + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vjailbreak-ui + namespace: migration-system +spec: + replicas: 1 + selector: + matchLabels: + app: vjailbreak-ui + template: + metadata: + labels: + app: vjailbreak-ui + spec: + serviceAccountName: migration-controller-manager + containers: + - name: vjailbreak-ui-container + image: quay.io/platform9/vjailbreak-ui:v0.4.1 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 + volumeMounts: + - name: nginx-shadow-htpasswd + mountPath: /etc/nginx/shadow + - name: pf9-logs + mountPath: /var/log/pf9 + readOnly: true + volumes: + - name: nginx-shadow-htpasswd + hostPath: + path: /etc/htpasswd + type: FileOrCreate + - name: pf9-logs + hostPath: + path: /var/log/pf9 + type: DirectoryOrCreate +--- \ No newline at end of file diff --git a/image_builder/configs/vjailbreak-settings.yaml b/image_builder/configs/vjailbreak-settings.yaml index cde90dd..a0b962b 100644 --- a/image_builder/configs/vjailbreak-settings.yaml +++ b/image_builder/configs/vjailbreak-settings.yaml @@ -22,7 +22,7 @@ data: DEPLOYMENT_NAME: vJailbreak PERIODIC_SYNC_MAX_RETRIES: "3" # max number of retries for CBT sync PERIODIC_SYNC_RETRY_CAP: "3h" # max retry interval for CBT sync - AUTO_FSTAB_UPDATE: "false" # automatically update fstab + AUTO_FSTAB_UPDATE: "true" # automatically update fstab AUTO_PXE_BOOT_ON_CONVERSION: "false" # automatically set machine to PXE boot during cluster conversion V2V_HELPER_POD_CPU_REQUEST: "1000m" V2V_HELPER_POD_MEMORY_REQUEST: "2Gi" diff --git a/releases/v0.4.1.md b/releases/v0.4.1.md new file mode 100644 index 0000000..4228927 --- /dev/null +++ b/releases/v0.4.1.md @@ -0,0 +1,114 @@ +# v0.4.1 + +- **Tag:** `v0.4.1` +- **Published:** 2026-03-03T08:32:13Z +- **Source release:** https://github.com/platform9/vjailbreak/releases/tag/v0.4.1 + +## Release Notes + +## What's Changed +* upgarde core components by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1458 +* Network Persistence For Windows by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1408 +* increase QPS for kubernetes client in proxy pod by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1460 +* Fixed - v2v build failure by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1471 +* Added s3 URL artifact to build outputs (release) by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1464 +* Push image on S3 only for release, nightly and manual triggers by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1474 +* Added option to migrate a vm without powering off the source vm by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1472 +* Fixed the variable issue in v2v helper by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1476 +* Added downloadable s3 url for qcow2 images by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1475 +* #1451 :: Remove data copy method and cutover options from adavance options when user selects storage accelerated copy by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1473 +* Install latest golang and libnbd-devel in Dockerfile by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1485 +* chore: upgrade grafana by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1483 +* user experience enhancements (download logs) by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1486 +* add pre-commit hooks for lint and YAML generator by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1494 +* Use GitHub repository variables for S3 bucket names and region in CI workflow by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1488 +* Added manual pre-release workflow for CRD and installer generation by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1489 +* add backoff for migration pod checking logs by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1396 +* #1454 :: Deselecting the advanced option does not reset the UI to its original state by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1477 +* Replace pre-baked Ubuntu base image with Ubuntu Minimal and automate K3s/Helm installation by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1496 +* firstboot scheduling windows by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1500 +* Run upgrade process as a job by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1467 +* Removed extra logging by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1490 +* pin golang lint version by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1517 +* fix: continue network discovery even for orphaned networks by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1457 +* #1515 :: UI Bug: “Start Conversion” Button Not Enabled in Rolling Cluster Conversion Form by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1516 +* #1398 :: Reorganize Main Menu into Two-Level Structure by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1512 +* replace grafana yamls by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1521 +* add more printcolumns by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1522 +* Apply PostMigrationAction for all migrations in a batch by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1492 +* Support duplicate VM names by using vCenter MOID as a unique identifier by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1523 +* fix nginx grafana by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1526 +* Keep icons consistent in all the pages by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1530 +* #1450 :: UI is not allowing to delete auto discovered storage mapping by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1470 +* Revert #1523: Remove duplicate vm name changes by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1535 +* Add ssh validate CR for key validation by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1505 +* Removed extra logs showing repeated 0% by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1536 +* Add necessary tools for easier debug ability by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1538 +* Cluster Conversion: fix the capacity check for esxi hosts by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1504 +* #1506 :: Create New Page for ESXi SSH Key Management by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1539 +* fix - Firstboot script for nic recovery is not running and errors on specific windows versions by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1534 +* add esxi details by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1525 +* Resolve UI synchronization lag during Admin Cutover by refining MigrationPlan predicates by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1542 +* Introduce warning error states during periodic sync so that customer can take necessary steps by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1497 +* Feature/option not to preserve ip and mac by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1511 +* Fixed retry mechanism by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1544 +* backend volume type validations by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1498 +* fix: scope VM validation to non-terminal states and harden post-migration actions by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1549 +* Create esxi ssh cr while configuring esxi ssh key. by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1558 +* bake virtio 0.1.185 for windows server 2012 by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1425 +* script to remove log files regarding vmwaretools,vmware etc by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1547 +* Added advanced option to run vmware removal script with just a check in the migration form by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1550 +* user firstboot fix by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1569 +* #1545 : UI - Redirect to the first sub item upon clicking the Item in the sidebar by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1570 +* fix: adding a timestamp measure to ensure the latest version is fetched for vddk version by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1562 +* skip deletion of vmwaremachine that was migrated and renamed by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1566 +* fix generate-mount-persistence invocation for multi-disk by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1564 +* Remove irrelevent filters on ESXi SSH Credentials page by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1567 +* #1510 :: UI Request option to NOT preserve the IP address and MAC address to allow migration to a different subnet by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1557 +* #1443 : Add Storage accelerated copy related information in migration details for storage mapping (currently showing NA) by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1571 +* UI: Fix rdm configure tab in migration form by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1576 +* #1574: Update Tour Popup Messaging for Separate VMware and PCD Pages by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1579 +* fix: on empty IP create only port group else route the standard way by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1573 +* fix: Migration phase skips CopyingChangedBlocks/ConvertingDisk after admin cutover by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1585 +* guestfish run fix, fix grub bootloader by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1586 +* Net persist patch by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1589 +* Remove 2 errors on UI for rdm form and add a warning dialog box if wrong selected by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1590 +* Injected Disk-Online script into the codebase and enhanced tool removal script for win2012 by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1578 +* fix: custom IP is not applied for no preserve IP and no preserve MAC by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1597 +* #1583 : Cannot remove assign IP post a new IP is applied by @AbhijeetThakur in https://github.com/platform9/vjailbreak/pull/1592 +* Include resourceVersion when updating ESXi SSH credentials by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1605 +* fix: adding dhcp search for no ip by @sanya-pf9 in https://github.com/platform9/vjailbreak/pull/1481 +* Revert fix generate-mount-persistence invocation for multi-disk by @OmkarDeshpande7 in https://github.com/platform9/vjailbreak/pull/1606 +* Continue after failure Firstboot Schduling for windows firstboot by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1604 +* Interface Name preservation by @meghansh-pf9 in https://github.com/platform9/vjailbreak/pull/1609 +* Disable github hook on pre-release commit by @sarika-pf9 in https://github.com/platform9/vjailbreak/pull/1613 +* chore: Pre-release CRD generation for v0.4.1 by @github-actions[bot] in https://github.com/platform9/vjailbreak/pull/1614 +* Use Cloud image instead of minimal ubuntu by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1618 +* Update nginx ingress and prometheus alert manager images ( release ) by @spai-p9 in https://github.com/platform9/vjailbreak/pull/1619 + + +**Full Changelog**: https://github.com/platform9/vjailbreak/compare/v0.4.0...v0.4.1 + + + +### Upgrade Guide: v0.4.0 → v0.4.1 +Users upgrading from v0.4.0 to v0.4.1 needs to follow the steps below: + +- #### Step 1: Update v0.4.0 Container Images + + In your existing v0.4.0 setup, update the deployment images to pull the latest v0.4.0 containers and set imagePullPolicy to Always with the below command given. + ``` + kubectl patch deployment migration-controller-manager -n migration-system --type='json' \ + -p='[{"op":"replace","path":"/spec/template/spec/containers/0/imagePullPolicy","value":"Always"}]' && \ + kubectl patch deployment migration-vpwned-sdk -n migration-system --type='json' \ + -p='[{"op":"replace","path":"/spec/template/spec/containers/0/imagePullPolicy","value":"Always"}]' && \ + kubectl patch deployment vjailbreak-ui -n migration-system --type='json' \ + -p='[{"op":"replace","path":"/spec/template/spec/containers/0/imagePullPolicy","value":"Always"}]' + ``` + +- #### Step 2: Restart Deployments + + Restart the deployments to ensure the updated images are pulled and running: + ``` + kubectl rollout restart deployment -n migration-system +- #### Step 3: Follow Upgrade Steps from the [public documentation](https://platform9.github.io/vjailbreak/guides/how-to/upgrade_vjailbreak/)