From 4794f2a5b6526255e87346ce7f565e409db722a1 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Wed, 12 Feb 2025 18:00:13 +0400 Subject: [PATCH] orchard create vm: introduce --random-serial command-line argument (#248) --- internal/command/create/vm.go | 24 ++++++++++++++---------- internal/command/get/vm.go | 17 ++++++++++------- internal/worker/vmmanager/vm.go | 7 +++++++ pkg/resource/v1/v1.go | 4 ++++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/internal/command/create/vm.go b/internal/command/create/vm.go index 7292b96..4327987 100644 --- a/internal/command/create/vm.go +++ b/internal/command/create/vm.go @@ -23,6 +23,7 @@ var username string var password string var resources map[string]string var labels map[string]string +var randomSerial bool var restartPolicy string var startupScript string var hostDirsRaw []string @@ -50,6 +51,8 @@ func newCreateVMCommand() *cobra.Command { "resources to request for this VM") command.PersistentFlags().StringToStringVar(&labels, "labels", map[string]string{}, "labels required by this VM") + command.PersistentFlags().BoolVar(&randomSerial, "random-serial", false, + "generate a new random serial number if this is a macOS VM (no-op for Linux VMs)") command.PersistentFlags().StringVar(&restartPolicy, "restart-policy", string(v1.RestartPolicyNever), fmt.Sprintf("restart policy for this VM: specify %q to never restart or %q "+ "to only restart when the VM fails", v1.RestartPolicyNever, v1.RestartPolicyOnFailure)) @@ -91,16 +94,17 @@ func runCreateVM(cmd *cobra.Command, args []string) error { Meta: v1.Meta{ Name: name, }, - Image: image, - CPU: cpu, - Memory: memory, - NetSoftnet: netSoftnet, - NetBridged: netBridged, - Headless: headless, - Username: username, - Password: password, - Labels: labels, - HostDirs: hostDirs, + Image: image, + CPU: cpu, + Memory: memory, + NetSoftnet: netSoftnet, + NetBridged: netBridged, + Headless: headless, + Username: username, + Password: password, + RandomSerial: randomSerial, + Labels: labels, + HostDirs: hostDirs, } // Convert resources diff --git a/internal/command/get/vm.go b/internal/command/get/vm.go index 712e94a..c2c61d6 100644 --- a/internal/command/get/vm.go +++ b/internal/command/get/vm.go @@ -95,15 +95,18 @@ func runGetVM(cmd *cobra.Command, args []string) error { table.AddRow("Restarted", restartedAtInfo) table.AddRow("Restart count", vm.RestartCount) - var resourcesInfo string - if len(vm.Resources) != 0 { - resourceDescriptions := lo.MapToSlice(vm.Resources, func(key string, value uint64) string { - return fmt.Sprintf("%s: %d", key, value) - }) - resourcesInfo = strings.Join(resourceDescriptions, "\n") - } + resourcesInfo := strings.Join(lo.MapToSlice(vm.Resources, func(key string, value uint64) string { + return fmt.Sprintf("%s: %d", key, value) + }), "\n") table.AddRow("Resources", nonEmptyOrNone(resourcesInfo)) + labelsInfo := strings.Join(lo.MapToSlice(vm.Labels, func(key string, value string) string { + return fmt.Sprintf("%s: %s", key, value) + }), "\n") + table.AddRow("Labels", nonEmptyOrNone(labelsInfo)) + + table.AddRow("Random serial", vm.RandomSerial) + var hostDirsInfo string if len(vm.HostDirs) != 0 { hostDirsDescriptions := lo.Map(vm.HostDirs, func(hostDir v1.HostDir, index int) string { diff --git a/internal/worker/vmmanager/vm.go b/internal/worker/vmmanager/vm.go index b589ad2..2fd4f62 100644 --- a/internal/worker/vmmanager/vm.go +++ b/internal/worker/vmmanager/vm.go @@ -222,6 +222,13 @@ func (vm *VM) cloneAndConfigure(ctx context.Context) error { } } + if vm.Resource.RandomSerial { + _, _, err = tart.Tart(ctx, vm.logger, "set", "--random-serial", vm.id()) + if err != nil { + return err + } + } + return nil } diff --git a/pkg/resource/v1/v1.go b/pkg/resource/v1/v1.go index fc31d6b..7422c3d 100644 --- a/pkg/resource/v1/v1.go +++ b/pkg/resource/v1/v1.go @@ -55,6 +55,10 @@ type VM struct { RestartedAt time.Time `json:"restarted_at,omitempty"` RestartCount uint64 `json:"restart_count,omitempty"` + // RandomSerial controls whether the worker will run the + // "tart set --random-serial" when instantiating this VM. + RandomSerial bool `json:"randomSerial,omitempty"` + // UID is a useful field for avoiding data races within a single Name. // // It is populated by the Controller when receiving a POST request.