mirror of
https://github.com/kubevirt/containerized-data-importer.git
synced 2025-06-03 06:30:22 +00:00
99 lines
3.2 KiB
Go
99 lines
3.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
k8sv1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
|
|
uploadcdiv1 "kubevirt.io/containerized-data-importer/pkg/apis/uploadcontroller/v1alpha1"
|
|
cdiClientset "kubevirt.io/containerized-data-importer/pkg/client/clientset/versioned"
|
|
)
|
|
|
|
const (
|
|
uploadTargetAnnotation = "cdi.kubevirt.io/storage.upload.target"
|
|
uploadStatusAnnotation = "cdi.kubevirt.io/storage.upload.pod.phase"
|
|
|
|
tmpDir = "/tmp/cdi-upload-test"
|
|
imageFile = "tinyCore.iso"
|
|
imageDownloadPath = tmpDir + "/" + imageFile
|
|
)
|
|
|
|
// UploadPodName returns the name of the upload server pod associated with a PVC
|
|
func UploadPodName(pvc *k8sv1.PersistentVolumeClaim) string {
|
|
return "cdi-upload-" + pvc.Name
|
|
}
|
|
|
|
// UploadPVCDefinition creates a PVC with the upload target annotation
|
|
func UploadPVCDefinition() *k8sv1.PersistentVolumeClaim {
|
|
annotations := map[string]string{uploadTargetAnnotation: ""}
|
|
return NewPVCDefinition("upload-test", "1G", annotations, nil)
|
|
}
|
|
|
|
// WaitPVCUploadPodStatusRunning waits for the upload server pod status annotation to be Running
|
|
func WaitPVCUploadPodStatusRunning(clientSet *kubernetes.Clientset, pvc *k8sv1.PersistentVolumeClaim) (bool, error) {
|
|
return WaitForPVCAnnotationWithValue(clientSet, pvc.Namespace, pvc, uploadStatusAnnotation, string(k8sv1.PodRunning))
|
|
}
|
|
|
|
// RequestUploadToken sends an upload token request to the server
|
|
func RequestUploadToken(clientSet *cdiClientset.Clientset, pvc *k8sv1.PersistentVolumeClaim) (string, error) {
|
|
request := &uploadcdiv1.UploadTokenRequest{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-token",
|
|
Namespace: pvc.Namespace,
|
|
},
|
|
Spec: uploadcdiv1.UploadTokenRequestSpec{
|
|
PvcName: pvc.Name,
|
|
},
|
|
}
|
|
|
|
response, err := clientSet.UploadV1alpha1().UploadTokenRequests(pvc.Namespace).Create(request)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return response.Status.Token, nil
|
|
}
|
|
|
|
// DownloadImageToNode downloads an image file to node01 in the cluster
|
|
func DownloadImageToNode(clientSet *kubernetes.Clientset, cliCommandPath string) error {
|
|
RunGoCLICommand(cliCommandPath, "ssh", "node01", "rm -rf "+tmpDir)
|
|
_, err := RunGoCLICommand(cliCommandPath, "ssh", "node01", "mkdir "+tmpDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fileServerService, err := GetServiceInNamespace(clientSet, FileHostNs, FileHostName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
downloadURL := fmt.Sprintf("http://%s/%s", fileServerService.Spec.ClusterIP, imageFile)
|
|
_, err = RunGoCLICommand(cliCommandPath, "ssh", "node01", fmt.Sprintf("curl -o %s %s", imageDownloadPath, downloadURL))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// UploadImageFromNode uploads the image to the upload proxy
|
|
func UploadImageFromNode(clientSet *kubernetes.Clientset, cliCommandPath, token string) error {
|
|
uploadProxyService, err := GetServiceInNamespace(clientSet, "kube-system", "cdi-uploadproxy")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
authHeader := "Authorization: Bearer " + token
|
|
curlCommand := fmt.Sprintf("curl -v --insecure -H \"%s\" --data-binary @%s https://%s/v1alpha1/upload",
|
|
authHeader, imageDownloadPath, uploadProxyService.Spec.ClusterIP)
|
|
|
|
_, err = RunGoCLICommand(cliCommandPath, "ssh", "node01", curlCommand)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|