Skip to content

Commit 3ed488e

Browse files
committed
migrate proxmox sdk to proxmox-go
1 parent 6f83f03 commit 3ed488e

File tree

10 files changed

+156
-169
lines changed

10 files changed

+156
-169
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ clusterctl init --infrastructure=proxmox:v0.2.2 --config https://raw.githubuserc
2727
export CONTROLPLANE_HOST=X.X.X.X # for control-plane node
2828
export GATEWAY_ADDRESS=X.X.X.X # for control-plane node
2929
export NAMESERVER_ADDRESS=X.X.X.X # for contro-lplane node
30-
export PROXMOX_URL=X.X.X.X:8006
31-
export PROXMOX_PASSWORD=password
32-
export PROXMOX_USER=user@pam
30+
export PROXMOX_URL=https://X.X.X.X:8006/api2/json
31+
# export PROXMOX_PASSWORD=password # (optional)
32+
# export PROXMOX_USER=user@pam # (optional)
33+
export PROXMOX_TOKENID='root@pam!api-token-id'
34+
export PROXMOX_SECRET=aaaaaaaa-bbbb-cccc-dddd-ee12345678
3335
export NODE_URL=node.ssh.url:22
3436
export NODE_USER=node-ssh-user
3537
export NODE_PASSWORD=node-ssh-password

cloud/scope/clients.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,11 @@ func newComputeService(ctx context.Context, serverRef infrav1.ServerRef, crClien
4444
return nil, err
4545
}
4646

47-
proxmoxUser, ok := secret.Data["PROXMOX_USER"]
48-
if !ok {
49-
return nil, errors.Errorf("failed to fetch PROXMOX_USER from Secret : %v", key)
50-
}
51-
proxmoxPassword, ok := secret.Data["PROXMOX_PASSWORD"]
52-
if !ok {
53-
return nil, errors.Errorf("failed to fetch PROXMOX_PASSWORD from Secret : %v", key)
54-
}
5547
authConfig := proxmox.AuthConfig{
56-
Username: string(proxmoxUser),
57-
Password: string(proxmoxPassword),
48+
Username: string(secret.Data["PROXMOX_USER"]),
49+
Password: string(secret.Data["PROXMOX_PASSWORD"]),
50+
TokenID: string(secret.Data["PROXMOX_TOKENID"]),
51+
Secret: string(secret.Data["PROXMOX_SECRET"]),
5852
}
5953

6054
return proxmox.NewService(serverRef.Endpoint, authConfig, true)

cloud/services/compute/instance/cloudinit.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package instance
22

33
import (
4+
"context"
45
"fmt"
56

67
"github.com/pkg/errors"
@@ -24,28 +25,21 @@ func (s *Service) reconcileCloudInit(bootstrap string) error {
2425
}
2526

2627
// delete CloudConfig
27-
func (s *Service) deleteCloudConfig() error {
28+
func (s *Service) deleteCloudConfig(ctx context.Context) error {
2829
storageName := s.scope.GetStorage().Name
2930
path := userSnippetPath(s.scope.Name())
3031
volumeID := fmt.Sprintf("%s:%s", storageName, path)
3132

32-
node, err := s.client.Node(s.scope.NodeName())
33+
node, err := s.client.Node(ctx, s.scope.NodeName())
3334
if err != nil {
3435
return err
3536
}
36-
storage, err := node.Storage(storageName)
37+
storage, err := s.client.Storage(ctx, storageName)
3738
if err != nil {
3839
return err
3940
}
40-
content, err := storage.GetContent(volumeID)
41-
if IsNotFound(err) { // return nil if it's already deleted
42-
return nil
43-
}
44-
if err != nil {
45-
return err
46-
}
47-
48-
return content.DeleteVolume()
41+
storage.Node = node.Node
42+
return storage.DeleteVolume(ctx, volumeID)
4943
}
5044

5145
func (s *Service) reconcileCloudInitUser(bootstrap string) error {

cloud/services/compute/instance/image.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import (
77
"strings"
88

99
"github.com/pkg/errors"
10-
"github.com/sp-yduck/proxmox-go/api"
10+
"github.com/sp-yduck/proxmox-go/proxmox"
1111
"sigs.k8s.io/controller-runtime/pkg/log"
1212

1313
infrav1 "github.com/sp-yduck/cluster-api-provider-proxmox/api/v1beta1"
1414
"github.com/sp-yduck/cluster-api-provider-proxmox/cloud/scope"
1515
)
1616

1717
// reconcileBootDevice
18-
func (s *Service) reconcileBootDevice(ctx context.Context, vm *api.VirtualMachine) error {
18+
func (s *Service) reconcileBootDevice(ctx context.Context, vm *proxmox.VirtualMachine) error {
1919
vmid := s.scope.GetVMID()
2020
storage := s.scope.GetStorage()
2121
image := s.scope.GetImage()
@@ -24,12 +24,12 @@ func (s *Service) reconcileBootDevice(ctx context.Context, vm *api.VirtualMachin
2424
log.Info(fmt.Sprintf("%v", hardware))
2525

2626
// os image
27-
if err := SetCloudImage(ctx, *vmid, storage, image, s.remote); err != nil {
27+
if err := setCloudImage(ctx, *vmid, storage, image, s.remote); err != nil {
2828
return err
2929
}
3030

3131
// volume
32-
if err := vm.ResizeVolume("scsi0", hardware.Disk); err != nil {
32+
if err := vm.ResizeVolume(ctx, "scsi0", hardware.Disk); err != nil {
3333
return err
3434
}
3535

@@ -38,7 +38,7 @@ func (s *Service) reconcileBootDevice(ctx context.Context, vm *api.VirtualMachin
3838

3939
// setCloudImage downloads OS image into Proxmox node
4040
// and then sets it to specified storage
41-
func SetCloudImage(ctx context.Context, vmid int, storage infrav1.Storage, image infrav1.Image, ssh scope.SSHClient) error {
41+
func setCloudImage(ctx context.Context, vmid int, storage infrav1.Storage, image infrav1.Image, ssh scope.SSHClient) error {
4242
log := log.FromContext(ctx)
4343
log.Info("setting cloud image")
4444

cloud/services/compute/instance/qemu.go

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,24 @@ import (
88

99
"github.com/pkg/errors"
1010
"github.com/sp-yduck/proxmox-go/api"
11+
"github.com/sp-yduck/proxmox-go/proxmox"
1112
"github.com/sp-yduck/proxmox-go/rest"
1213
"sigs.k8s.io/controller-runtime/pkg/log"
1314

1415
infrav1 "github.com/sp-yduck/cluster-api-provider-proxmox/api/v1beta1"
1516
)
1617

17-
func (s *Service) reconcileQEMU(ctx context.Context) (*api.VirtualMachine, error) {
18+
func (s *Service) reconcileQEMU(ctx context.Context) (*proxmox.VirtualMachine, error) {
1819
log := log.FromContext(ctx)
1920
log.Info("Reconciling QEMU")
2021

2122
nodeName := s.scope.NodeName()
2223
vmid := s.scope.GetVMID()
23-
api, err := s.getQEMU(nodeName, vmid)
24+
api, err := s.getQEMU(ctx, vmid)
2425
if err == nil { // if api is found, return it
2526
return api, nil
2627
}
27-
if !IsNotFound(err) {
28+
if !rest.IsNotFound(err) {
2829
log.Error(err, fmt.Sprintf("failed to get api: node=%s,vmid=%d", nodeName, *vmid))
2930
return nil, err
3031
}
@@ -33,79 +34,67 @@ func (s *Service) reconcileQEMU(ctx context.Context) (*api.VirtualMachine, error
3334
return s.createQEMU(ctx, nodeName, vmid)
3435
}
3536

36-
func (s *Service) getQEMU(nodeName string, vmid *int) (*api.VirtualMachine, error) {
37-
if vmid != nil && nodeName != "" {
38-
node, err := s.GetNode(nodeName)
39-
if err != nil {
40-
return nil, err
41-
}
42-
return node.VirtualMachine(*vmid)
37+
func (s *Service) getQEMU(ctx context.Context, vmid *int) (*proxmox.VirtualMachine, error) {
38+
if vmid != nil {
39+
return s.client.VirtualMachine(ctx, *vmid)
4340
}
44-
return nil, rest.ErrNotFound
41+
return nil, rest.NotFoundErr
4542
}
4643

47-
func (s *Service) createQEMU(ctx context.Context, nodeName string, vmid *int) (*api.VirtualMachine, error) {
44+
func (s *Service) createQEMU(ctx context.Context, nodeName string, vmid *int) (*proxmox.VirtualMachine, error) {
4845
log := log.FromContext(ctx)
4946

50-
var node *api.Node
51-
var err error
52-
53-
// get node
54-
if nodeName != "" {
55-
node, err = s.GetNode(nodeName)
56-
if err != nil {
57-
log.Error(err, fmt.Sprintf("failed to get node %s", nodeName))
58-
return nil, err
59-
}
60-
} else {
47+
// get nodej
48+
if nodeName == "" {
6149
// temp solution
62-
node, err = s.GetRandomNode()
50+
node, err := s.getRandomNode()
6351
if err != nil {
6452
log.Error(err, "failed to get random node")
6553
return nil, err
6654
}
67-
s.scope.SetNodeName(node.Node)
55+
nodeName = node.Node
56+
s.scope.SetNodeName(nodeName)
6857
}
6958

7059
// (for multiple node proxmox cluster support)
7160
// to do : set ssh client for specific node
7261

7362
// if vmid is empty, generate new vmid
7463
if vmid == nil {
75-
nextid, err := s.GetNextID()
64+
nextid, err := s.getNextID()
7665
if err != nil {
7766
log.Error(err, "failed to get available vmid")
7867
return nil, err
7968
}
8069
vmid = &nextid
8170
}
8271

83-
// create api
8472
vmoption := generateVMOptions(s.scope.Name(), s.scope.GetStorage().Name, s.scope.GetNetwork(), s.scope.GetHardware())
85-
api, err := node.CreateVirtualMachine(*vmid, vmoption)
73+
// to do : do not use RESTClient()
74+
_, err := s.client.RESTClient().CreateVirtualMachine(ctx, nodeName, *vmid, vmoption)
8675
if err != nil {
87-
log.Error(err, "failed to create virtual machine")
76+
log.Error(err, fmt.Sprintf("failed to get node %s", nodeName))
8877
return nil, err
8978
}
9079
s.scope.SetVMID(*vmid)
91-
return api, nil
80+
return s.client.VirtualMachine(ctx, *vmid)
9281
}
9382

94-
func (s *Service) GetNextID() (int, error) {
83+
func (s *Service) getNextID() (int, error) {
9584
return s.client.RESTClient().GetNextID(context.TODO())
9685
}
9786

98-
func (s *Service) GetNodes() ([]*api.Node, error) {
87+
func (s *Service) getNodes() ([]*api.Node, error) {
9988
return s.client.Nodes(context.TODO())
10089
}
10190

102-
func (s *Service) GetNode(name string) (*api.Node, error) {
103-
return s.client.Node(name)
91+
func (s *Service) getNode(ctx context.Context, name string) (*api.Node, error) {
92+
return s.client.Node(ctx, name)
10493
}
10594

10695
// GetRandomNode returns a node chosen randomly
107-
func (s *Service) GetRandomNode() (*api.Node, error) {
108-
nodes, err := s.GetNodes()
96+
func (s *Service) getRandomNode() (*api.Node, error) {
97+
nodes, err := s.getNodes()
10998
if err != nil {
11099
return nil, err
111100
}

0 commit comments

Comments
 (0)