Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit 9f03527

Browse files
committed
refactor(CNV-43601): organize project into packages
Organize project code into packages. This improves readability, maintainability and testability. Signed-off-by: Ben Oukhanov <boukhanov@redhat.com>
1 parent 8bd16be commit 9f03527

File tree

13 files changed

+488
-417
lines changed

13 files changed

+488
-417
lines changed

Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ FROM golang:1.22 as builder
33
WORKDIR /app
44
COPY go.mod go.sum ./
55
COPY vendor/ ./vendor
6-
COPY main.go .
7-
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o kubevirt-disk-uploader .
6+
COPY cmd/ ./cmd
7+
COPY pkg/ ./pkg
8+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o kubevirt-disk-uploader ./cmd
89

910
FROM quay.io/fedora/fedora-minimal:39
1011

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ KubeVirt Disk Uploader -> Download VM Disk -> Build New Container Disk -> Push T
2121
Deploy `kubevirt-disk-uploader` within the same namespace as the Virtual Machine (VM):
2222

2323
```
24-
kubectl apply -f kubevirt-disk-uploader.yaml -n $VM_NAMESPACE
24+
kubectl apply -f kubevirt-disk-uploader.yaml -n $POD_NAMESPACE
2525
```
2626

27-
**Note**: If both `VM_NAMESPACE` and `--vmnamespace` argument are set, `VM_NAMESPACE` will be used.
27+
**Note**: If both `POD_NAMESPACE` and `--vmnamespace` argument are set, `POD_NAMESPACE` will be used.
2828

2929
## KubeVirt Documentation
3030

cmd/main.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"os"
6+
7+
"github.com/codingben/kubevirt-disk-uploader/pkg/certificate"
8+
"github.com/codingben/kubevirt-disk-uploader/pkg/disk"
9+
"github.com/codingben/kubevirt-disk-uploader/pkg/image"
10+
"github.com/codingben/kubevirt-disk-uploader/pkg/secrets"
11+
"github.com/codingben/kubevirt-disk-uploader/pkg/vmexport"
12+
13+
cobra "github.com/spf13/cobra"
14+
kubecli "kubevirt.io/client-go/kubecli"
15+
)
16+
17+
const (
18+
diskPath string = "./tmp/disk.qcow2"
19+
certificatePath string = "./tmp/tls.crt"
20+
kvExportTokenHeader string = "x-kubevirt-export-token"
21+
)
22+
23+
func run(client kubecli.KubevirtClient, vmNamespace, vmName, volumeName, imageDestination string, pushTimeout int) error {
24+
log.Printf("Creating a new Secret '%s/%s' object...", vmNamespace, vmName)
25+
26+
if err := secrets.CreateVirtualMachineExportSecret(client, vmNamespace, vmName); err != nil {
27+
return err
28+
}
29+
30+
log.Printf("Creating a new VirtualMachineExport '%s/%s' object...", vmNamespace, vmName)
31+
32+
if err := vmexport.CreateVirtualMachineExport(client, vmNamespace, vmName); err != nil {
33+
return err
34+
}
35+
36+
log.Println("Waiting for VirtualMachineExport status to be ready...")
37+
38+
if err := vmexport.WaitUntilVirtualMachineExportReady(client, vmNamespace, vmName); err != nil {
39+
return err
40+
}
41+
42+
log.Println("Getting raw disk URL from the VirtualMachineExport object status...")
43+
44+
rawDiskUrl, err := vmexport.GetRawDiskUrlFromVolumes(client, vmNamespace, vmName, volumeName)
45+
if err != nil {
46+
return err
47+
}
48+
49+
log.Println("Creating TLS certificate file from the VirtualMachineExport object status...")
50+
51+
certificateData, err := certificate.GetCertificateFromVirtualMachineExport(client, vmNamespace, vmName)
52+
if err != nil {
53+
return err
54+
}
55+
56+
if err := certificate.CreateCertificateFile(certificatePath, certificateData); err != nil {
57+
return err
58+
}
59+
60+
log.Println("Getting export token from the Secret object...")
61+
62+
kvExportToken, err := secrets.GetTokenFromVirtualMachineExportSecret(client, vmNamespace, vmName)
63+
if err != nil {
64+
return err
65+
}
66+
67+
log.Println("Downloading disk image from the VirtualMachineExport server...")
68+
69+
if err := disk.DownloadDiskImageFromURL(rawDiskUrl, kvExportTokenHeader, kvExportToken, certificatePath, diskPath); err != nil {
70+
return err
71+
}
72+
73+
log.Println("Building a new container image...")
74+
75+
containerImage, err := image.Build(diskPath)
76+
if err != nil {
77+
return err
78+
}
79+
80+
log.Println("Pushing new container image to the container registry...")
81+
82+
if err := image.Push(containerImage, imageDestination, pushTimeout); err != nil {
83+
return err
84+
}
85+
86+
log.Println("Successfully uploaded to the container registry.")
87+
return nil
88+
}
89+
90+
func main() {
91+
var vmNamespace string
92+
var vmName string
93+
var volumeName string
94+
var imageDestination string
95+
var pushTimeout int
96+
97+
var command = &cobra.Command{
98+
Use: "kubevirt-disk-uploader",
99+
Short: "Extracts disk and uploads it to a container registry",
100+
Run: func(cmd *cobra.Command, args []string) {
101+
client, err := kubecli.GetKubevirtClient()
102+
if err != nil {
103+
log.Panicln(err)
104+
}
105+
106+
namespace := os.Getenv("POD_NAMESPACE")
107+
if namespace != "" {
108+
vmNamespace = namespace
109+
}
110+
111+
if err := run(client, namespace, vmName, volumeName, imageDestination, pushTimeout); err != nil {
112+
log.Panicln(err)
113+
}
114+
},
115+
}
116+
117+
command.Flags().StringVar(&vmNamespace, "vmnamespace", "", "namespace of the virtual machine")
118+
command.Flags().StringVar(&vmName, "vmname", "", "name of the virtual machine")
119+
command.Flags().StringVar(&volumeName, "volumename", "", "volume name of the virtual machine")
120+
command.Flags().StringVar(&imageDestination, "imagedestination", "", "destination of the image in container registry")
121+
command.Flags().IntVar(&pushTimeout, "pushtimeout", 60, "containerdisk push timeout in minutes")
122+
command.MarkFlagRequired("vmname")
123+
command.MarkFlagRequired("volumename")
124+
command.MarkFlagRequired("imagedestination")
125+
126+
if err := command.Execute(); err != nil {
127+
log.Println(err)
128+
os.Exit(1)
129+
}
130+
}

examples/kubevirt-disk-uploader-tekton.yaml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ rules:
125125
- apiGroups: [""]
126126
resources: ["secrets"]
127127
verbs: ["get", "create"]
128+
- apiGroups: [""]
129+
resources: ["pods"]
130+
verbs: ["get"]
128131
---
129132
apiVersion: rbac.authorization.k8s.io/v1
130133
kind: RoleBinding
@@ -153,7 +156,7 @@ metadata:
153156
name: kubevirt-disk-uploader-task
154157
spec:
155158
params:
156-
- name: VM_NAME
159+
- name: POD_NAME
157160
description: The name of the virtual machine
158161
type: string
159162
- name: VOLUME_NAME
@@ -179,14 +182,18 @@ spec:
179182
secretKeyRef:
180183
name: kubevirt-disk-uploader-credentials-tekton
181184
key: secretKey
182-
- name: VM_NAMESPACE
185+
- name: POD_NAMESPACE
183186
valueFrom:
184187
fieldRef:
185188
fieldPath: metadata.namespace
189+
- name: POD_NAME
190+
valueFrom:
191+
fieldRef:
192+
fieldPath: metadata.name
186193
command: ["/usr/local/bin/kubevirt-disk-uploader"]
187194
args:
188195
- "--vmname"
189-
- $(params.VM_NAME)
196+
- $(params.POD_NAME)
190197
- "--volumename"
191198
- $(params.VOLUME_NAME)
192199
- "--imagedestination"
@@ -205,7 +212,7 @@ metadata:
205212
name: kubevirt-disk-uploader-pipeline
206213
spec:
207214
params:
208-
- name: VM_NAME
215+
- name: POD_NAME
209216
description: "Name of the virtual machine"
210217
type: string
211218
- name: VOLUME_NAME
@@ -227,8 +234,8 @@ spec:
227234
runAfter:
228235
- deploy-example-vm
229236
params:
230-
- name: VM_NAME
231-
value: "$(params.VM_NAME)"
237+
- name: POD_NAME
238+
value: "$(params.POD_NAME)"
232239
- name: VOLUME_NAME
233240
value: "$(params.VOLUME_NAME)"
234241
- name: IMAGE_DESTINATION
@@ -249,7 +256,7 @@ spec:
249256
pipelineRef:
250257
name: kubevirt-disk-uploader-pipeline
251258
params:
252-
- name: VM_NAME
259+
- name: POD_NAME
253260
value: example-vm-tekton
254261
- name: VOLUME_NAME
255262
value: example-dv-tekton

kubevirt-disk-uploader.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ spec:
5252
secretKeyRef:
5353
name: kubevirt-disk-uploader-credentials
5454
key: secretKey
55-
- name: VM_NAMESPACE
55+
- name: POD_NAMESPACE
5656
valueFrom:
5757
fieldRef:
5858
fieldPath: metadata.namespace
59-
- name: VM_NAME
59+
- name: POD_NAME
6060
valueFrom:
6161
fieldRef:
6262
fieldPath: metadata.name

0 commit comments

Comments
 (0)