From 4d83885f2293e4bbbc0478d55edcfabaaf023f9c Mon Sep 17 00:00:00 2001 From: Melvin Hillsman Date: Wed, 20 May 2026 16:04:27 -0500 Subject: [PATCH] fix: add Roles() method to MultiVMWorkload interface The orchestrator previously hardcoded roles as ["server", "client"] which would silently break multi-VM workloads using different role names. Changes: - Add Roles() []string method to MultiVMWorkload interface - Implement Roles() in NetworkWorkload returning ["server", "client"] - Update orchestrator to call multiVM.Roles() instead of hardcoding - Add unit test to verify Roles() returns expected values Fixes #4 Signed-off-by: Melvin Hillsman --- cmd/virtwork/main.go | 2 +- internal/workloads/network.go | 5 +++++ internal/workloads/network_test.go | 5 +++++ internal/workloads/tps.go | 5 +++++ internal/workloads/workload.go | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cmd/virtwork/main.go b/cmd/virtwork/main.go index 420883b..3259bf1 100644 --- a/cmd/virtwork/main.go +++ b/cmd/virtwork/main.go @@ -319,7 +319,7 @@ func runE(cmd *cobra.Command, args []string) error { ) } - roles := []string{"server", "client"} + roles := multiVM.Roles() perRole := vmCount / len(roles) for _, role := range roles { userdata, err := multiVM.UserdataForRole(role, cfg.Namespace) diff --git a/internal/workloads/network.go b/internal/workloads/network.go index daf3fb7..aeac50f 100644 --- a/internal/workloads/network.go +++ b/internal/workloads/network.go @@ -70,6 +70,11 @@ func (w *NetworkWorkload) VMCount() int { return count * 2 } +// Roles returns the supported VM roles for this multi-VM workload. +func (w *NetworkWorkload) Roles() []string { + return []string{"server", "client"} +} + // RequiresService returns true — the client needs a ClusterIP Service to reach // the server by DNS. func (w *NetworkWorkload) RequiresService() bool { diff --git a/internal/workloads/network_test.go b/internal/workloads/network_test.go index 59181e2..d668faa 100644 --- a/internal/workloads/network_test.go +++ b/internal/workloads/network_test.go @@ -35,6 +35,11 @@ var _ = Describe("NetworkWorkload", func() { Expect(w.RequiresService()).To(BeTrue()) }) + It("should return server and client roles", func() { + roles := w.Roles() + Expect(roles).To(Equal([]string{"server", "client"})) + }) + It("should produce server userdata with iperf3 -s", func() { result, err := w.UserdataForRole("server", "virtwork") Expect(err).NotTo(HaveOccurred()) diff --git a/internal/workloads/tps.go b/internal/workloads/tps.go index 24562b7..4485916 100644 --- a/internal/workloads/tps.go +++ b/internal/workloads/tps.go @@ -86,6 +86,11 @@ func (w *TPSWorkload) VMCount() int { return count * 2 } +// Roles returns the supported VM roles for this multi-VM workload. +func (w *TPSWorkload) Roles() []string { + return []string{"server", "client"} +} + // RequiresService returns true — the client needs a ClusterIP Service to reach // the server by DNS. func (w *TPSWorkload) RequiresService() bool { diff --git a/internal/workloads/workload.go b/internal/workloads/workload.go index 78a0674..e9b1764 100644 --- a/internal/workloads/workload.go +++ b/internal/workloads/workload.go @@ -56,6 +56,7 @@ type Workload interface { // interface to call UserdataForRole() for each VM role. type MultiVMWorkload interface { Workload + Roles() []string UserdataForRole(role string, namespace string) (string, error) }