#!/bin/bash
vm_clone() {
NAMESPACE=$1
VM_NAME=$2
VM_CLONE_NAME=$3
cat <<EOF | kubectl create -f -
kind: VirtualMachineClone
apiVersion: clone.kubevirt.io/v1alpha1
metadata:
name: clone-$VM_NAME
namespace: $NAMESPACE
spec:
source:
apiGroup: kubevirt.io
kind: VirtualMachine
name: $VM_NAME
target:
apiGroup: kubevirt.io
kind: VirtualMachine
name: $VM_CLONE_NAME
labelFilters:
- "*"
- "!ovn.kubernetes.io/*"
annotationFilters:
- "*"
- "!ovn.kubernetes.io/*"
template:
labelFilters:
- "*"
- "!ovn.kubernetes.io/*"
annotationFilters:
- "*"
- "!ovn.kubernetes.io/*"
EOF
if [ $? -eq 0 ]; then
echo "Create vmclone resource Succeeded"
else
echo "Create vmclone resource failed"
exit 1
fi
echo "Waiting for vm clone completion"
while true; do
phase=$(kubectl -n $NAMESPACE get vmclone clone-$VM_NAME -o jsonpath='{.status.phase}')
if [ "$phase" == "Succeeded" ]; then
break
elif [ "$phase" == "Failed" ]; then
echo "VirtualMachineClone resource phase is Failed"
exit 1
fi
sleep 5
done
echo "vm clone completion"
dvList=$(kubectl -n $NAMESPACE get vm $VM_CLONE_NAME -o jsonpath='{.spec.template.spec.volumes}' | jq . | grep restore- | grep name | awk '{print $2}')
for dv in $dvList; do
kubectl -n $NAMESPACE label --overwrite dv $(echo $dv | sed 's/"//g') vm.cpaas.io/used-by=$VM_CLONE_NAME
if [ $? -ne 0 ]; then
echo "update DV label failed"
exit 1
fi
done
pvcList=$(kubectl -n $NAMESPACE get vm $VM_CLONE_NAME -o jsonpath='{.spec.template.spec.volumes}' | jq . | grep restore- | grep claimName | awk '{print $2}')
for pvc in $pvcList; do
kubectl -n $NAMESPACE label --overwrite pvc $(echo $pvc | sed 's/"//g') vm.cpaas.io/used-by=$VM_CLONE_NAME
if [ $? -ne 0 ]; then
echo "update PVC label failed"
exit 1
fi
done
}
if [ $# -ne 3 ]; then
echo "error: parameters error"
echo "Usage: ./vm-clone.sh NAMESPACE VM_NAME VM_CLONE_NAME"
exit 1
fi
# exec vm clone
vm_clone "$1" "$2" "$3"