diff --git a/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd.go b/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd.go index 6d8a2bc16..0f4e3b082 100644 --- a/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd.go +++ b/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd.go @@ -150,6 +150,12 @@ func Cmd() *cobra.Command { nil, networkAttachmentFlagHelp, ) + flags.BoolVar( + &runner.args.windows, + "windows", + false, + windowsFlagHelp, + ) result.MarkFlagsMutuallyExclusive("catalog-item", "template") result.MarkFlagsOneRequired("catalog-item", "template") @@ -173,6 +179,7 @@ type runnerContext struct { runStrategy string userData string networkAttachments []string + windows bool } logger *slog.Logger console *terminal.Console @@ -723,6 +730,9 @@ func (c *runnerContext) buildSpec(templateID string, if c.args.userData != "" { spec.UserData = new(c.args.userData) } + if c.args.windows { + spec.IsWindows = new(true) + } if err := c.applyNetworkingFlags(&spec); err != nil { return nil, err } @@ -869,6 +879,9 @@ func (c *runnerContext) buildSpecFromCatalogItem(catalogItemID string) (*publicv if c.args.userData != "" { spec.UserData = new(c.args.userData) } + if c.args.windows { + spec.IsWindows = new(true) + } if err := c.applyNetworkingFlags(&spec); err != nil { return nil, err } @@ -1022,3 +1035,7 @@ comma-separated specification in the format {{ bt }}subnet=ID[,security-groups=ID,ID...]{{ bt }}. Can be specified multiple times to attach multiple NICs. ` + +const windowsFlagHelp = ` +_[BOOLEAN]_ - Create a Windows VM. Defaults to {{ bt }}false{{ bt }} (Linux VM). +` diff --git a/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd_test.go b/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd_test.go index 3aacfb06f..4fe5a5bd4 100644 --- a/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd_test.go +++ b/internal/cmd/cli/create/computeinstance/create_compute_instance_cmd_test.go @@ -71,6 +71,25 @@ var _ = Describe("buildSpec", func() { }.Build() Expect(proto.Equal(spec, want)).To(BeTrue(), "spec should equal expected spec") }) + + It("should set IsWindows when windows flag is true", func() { + c := &runnerContext{} + c.args.windows = true + spec, err := c.buildSpec("tmpl", nil) + Expect(err).NotTo(HaveOccurred()) + + Expect(spec.IsWindows).NotTo(BeNil()) + Expect(*spec.IsWindows).To(BeTrue()) + }) + + It("should leave IsWindows nil when windows flag is false", func() { + c := &runnerContext{} + c.args.windows = false + spec, err := c.buildSpec("tmpl", nil) + Expect(err).NotTo(HaveOccurred()) + + Expect(spec.IsWindows).To(BeNil()) + }) }) var _ = Describe("buildSpecFromCatalogItem", func() { @@ -107,6 +126,25 @@ var _ = Describe("buildSpecFromCatalogItem", func() { _, err := c.buildSpecFromCatalogItem("cat-003") Expect(err).To(HaveOccurred()) }) + + It("should set IsWindows when windows flag is true", func() { + c := &runnerContext{} + c.args.windows = true + spec, err := c.buildSpecFromCatalogItem("cat-004") + Expect(err).NotTo(HaveOccurred()) + + Expect(spec.IsWindows).NotTo(BeNil()) + Expect(*spec.IsWindows).To(BeTrue()) + }) + + It("should leave IsWindows nil when windows flag is false", func() { + c := &runnerContext{} + c.args.windows = false + spec, err := c.buildSpecFromCatalogItem("cat-005") + Expect(err).NotTo(HaveOccurred()) + + Expect(spec.IsWindows).To(BeNil()) + }) }) var _ = Describe("Create computeinstance flag registration", func() { @@ -144,6 +182,15 @@ var _ = Describe("Create computeinstance flag registration", func() { Expect(flag).NotTo(BeNil()) Expect(flag.Shorthand).To(Equal("t")) }) + + It("should register --windows flag with default value false", func() { + cmd := Cmd() + cmd.SetOut(GinkgoWriter) + cmd.SetErr(GinkgoWriter) + flag := cmd.Flags().Lookup("windows") + Expect(flag).NotTo(BeNil()) + Expect(flag.DefValue).To(Equal("false")) + }) }) var _ = Describe("Create computeinstance flag validation", func() { diff --git a/internal/rendering/tables/osac.private.v1.ComputeInstance.yaml b/internal/rendering/tables/osac.private.v1.ComputeInstance.yaml index 107462e45..14b37ec53 100644 --- a/internal/rendering/tables/osac.private.v1.ComputeInstance.yaml +++ b/internal/rendering/tables/osac.private.v1.ComputeInstance.yaml @@ -24,6 +24,9 @@ columns: type: osac.private.v1.ComputeInstanceTemplate lookup: true +- header: OS + value: "has(this.spec.is_windows) && this.spec.is_windows ? 'windows' : 'linux'" + - header: STATE value: this.status.state type: osac.private.v1.ComputeInstanceState diff --git a/internal/rendering/tables/osac.public.v1.ComputeInstance.yaml b/internal/rendering/tables/osac.public.v1.ComputeInstance.yaml index 8bbfc67ab..2344509b6 100644 --- a/internal/rendering/tables/osac.public.v1.ComputeInstance.yaml +++ b/internal/rendering/tables/osac.public.v1.ComputeInstance.yaml @@ -26,6 +26,9 @@ columns: type: osac.public.v1.ComputeInstanceTemplate lookup: true +- header: OS + value: "has(this.spec.is_windows) && this.spec.is_windows ? 'windows' : 'linux'" + - header: STATE value: this.status.state type: osac.public.v1.ComputeInstanceState