From 03727d46695176da80c04cfc8df92aebde6720d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Szyma=C5=84ski?= Date: Wed, 23 Jul 2025 11:17:51 +0000 Subject: [PATCH 1/2] feat(docker-machine-driver): add option for full cloning the template machine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kacper Szymański --- README.md | 1 + cmd/docker-machine-driver-pve/driver/config.go | 11 +++++++++++ cmd/docker-machine-driver-pve/driver/pve.go | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 88ed5dc..91a3dbb 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ You can use [sample Ubuntu Server template](deploy/templates/ubuntu-server) for | `--pve-token-secret` | `PVE_TOKEN_SECRET` | N/A (required) | Proxmox VE API Token secret. | | `--pve-resource-pool` | `PVE_RESOURCE_POOL` | N/A (required) | Proxmox VE Resource Pool name. | | `--pve-template` | `PVE_TEMPLATE` | N/A (required) | ID of the Proxmox VE template. | +| `--pve-full-clone` | `PVE_FULL_CLONE` | `false` | Forces full copy of all disks, even if underlying storage supports linked clones. | | `--pve-iso-device` | `PVE_ISO_DEVICE` | N/A (required) | Bus/Device of the CD/DVD Drive to mount cloud-init ISO to (e.g. `scsi1`). | | `--pve-network-interface` | `PVE_NETWORK_INTERFACE` | N/A (required) | Bus/Device of the network interface to read machine's IP address from (e.g. `net0`). | | `--pve-ssh-user` | `PVE_SSH_USER` | `service` | Username for the SSH user that will be created via cloud-init. | diff --git a/cmd/docker-machine-driver-pve/driver/config.go b/cmd/docker-machine-driver-pve/driver/config.go index 5af6f93..6f36299 100644 --- a/cmd/docker-machine-driver-pve/driver/config.go +++ b/cmd/docker-machine-driver-pve/driver/config.go @@ -26,6 +26,7 @@ const ( flagProcessorCores = "pve-processor-cores" flagMemory = "pve-memory" flagMemoryBalloon = "pve-memory-balloon" + flagFullClone = "pve-full-clone" ) // Default values for flags. @@ -72,6 +73,9 @@ type config struct { // If set, minimum amount of memory in MiB to configure for the machine. // If set to 0, disables memory ballooning. MemoryBalloon *int + + // Forces full copy of all disks, even if underlying storage supports linked clones. + FullClone bool } // GetCreateFlags implements drivers.Driver. @@ -147,6 +151,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { EnvVar: flagEnvVarFromFlagName(flagMemoryBalloon), Usage: "If set, minimum amount of memory in MiB to configure for the machine. If set to 0, disables memory ballooning.", }, + mcnflag.BoolFlag{ + Name: flagFullClone, + EnvVar: flagEnvVarFromFlagName(flagFullClone), + Usage: "Forces full copy of all disks, even if underlying storage supports linked clones.", + }, } } @@ -247,6 +256,8 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { return fmt.Errorf("flag '--%s' must be <= than flag '--%s'", flagMemoryBalloon, flagMemory) } + d.FullClone = opts.Bool(flagFullClone) + return nil } diff --git a/cmd/docker-machine-driver-pve/driver/pve.go b/cmd/docker-machine-driver-pve/driver/pve.go index c44a1b0..890fc0e 100644 --- a/cmd/docker-machine-driver-pve/driver/pve.go +++ b/cmd/docker-machine-driver-pve/driver/pve.go @@ -30,7 +30,7 @@ func (d *Driver) createPVEVirtualMachine(ctx context.Context) (int, error) { vmid, task, err := template.Clone(ctx, &proxmox.VirtualMachineCloneOptions{ Name: d.MachineName, Pool: d.ResourcePoolName, - Full: 0, + Full: map[bool]uint8{false: 0, true: 1}[d.FullClone], }) if err != nil { return vmid, fmt.Errorf("failed to clone template ID='%d': %w", d.TemplateID, err) From a3a0ce734b9847ca0e7dfad53c86dee5aaa012b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Szyma=C5=84ski?= Date: Wed, 23 Jul 2025 11:21:46 +0000 Subject: [PATCH 2/2] feat(rancher-ui-extension): add "Force full cloning" option to advanced section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kacper Szymański --- pkg/pve-node-driver/l10n/en-us.yaml | 3 +++ pkg/pve-node-driver/machine-config/pve.vue | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pkg/pve-node-driver/l10n/en-us.yaml b/pkg/pve-node-driver/l10n/en-us.yaml index bbb5fd8..2b0b15e 100644 --- a/pkg/pve-node-driver/l10n/en-us.yaml +++ b/pkg/pve-node-driver/l10n/en-us.yaml @@ -42,6 +42,9 @@ cluster: network: label: Network interface tooltip: Bus/Device of the network interface to read machine‘s IP address from (e.g. `net0`) + cloning: + label: Force full clone + tooltip: Forces full copy of all disks, even if underlying storage supports linked clones hardware: header: Hardware processorSockets: diff --git a/pkg/pve-node-driver/machine-config/pve.vue b/pkg/pve-node-driver/machine-config/pve.vue index 76c9c13..a815f47 100644 --- a/pkg/pve-node-driver/machine-config/pve.vue +++ b/pkg/pve-node-driver/machine-config/pve.vue @@ -3,12 +3,14 @@ import { SECRET } from '@shell/config/types'; import { LabeledInput } from '@components/Form/LabeledInput'; import LabeledSelect from '@shell/components/form/LabeledSelect'; import UnitInput from '@shell/components/form/UnitInput'; +import Checkbox from '@components/Form/Checkbox/Checkbox'; export default { components: { LabeledInput, LabeledSelect, UnitInput, + Checkbox, }, props: { uuid: { @@ -57,6 +59,7 @@ export default { processorCores: this.value.processorCores ? parseInt(this.value.processorCores) : "", memory: this.value.memory ? parseInt(this.value.memory) : "", memoryBalloon: this.value.memoryBalloon ? parseInt(this.value.memoryBalloon) : "", + fullClone: this.value.fullClone ?? false, }, } }, @@ -240,6 +243,7 @@ export default { this.value.processorCores = this.currentValue.processorCores.toString(); this.value.memory = this.currentValue.memory.toString(); this.value.memoryBalloon = this.currentValue.memoryBalloon.toString(); + this.value.fullClone = this.currentValue.fullClone; this.$emit('validationChanged', true); }, @@ -636,7 +640,7 @@ export default {

-
+
+ +

+ +

+
+
+ + +
+