From 20288dbe5d2a886f0451971b71b6b90b92fde4fe Mon Sep 17 00:00:00 2001 From: Julian Sommer <115516918+juliansommer@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:53:49 +1000 Subject: [PATCH] refactor: dead-code cleanup and helper deduplication (#486) --- cmd/spinifex/cmd/admin.go | 14 ++-- cmd/spinifex/cmd/cluster.go | 41 +++------- cmd/spinifex/cmd/service.go | 5 -- spinifex/admin/admin.go | 3 +- spinifex/admin/admin_test.go | 8 +- spinifex/daemon/daemon_handlers_volume.go | 4 +- spinifex/daemon/daemon_system_dispatch.go | 15 +--- .../daemon/daemon_system_dispatch_test.go | 19 ----- spinifex/daemon/daemon_test.go | 4 +- spinifex/daemon/eks_worker_launch.go | 2 +- spinifex/daemon/jetstream.go | 28 ++----- spinifex/daemon/local_state.go | 10 --- spinifex/daemon/local_state_test.go | 20 +++-- spinifex/gateway/account.go | 7 -- spinifex/gateway/ec2.go | 16 ++-- .../CancelCapacityReservation.go | 2 +- .../CreateCapacityReservation.go | 2 +- .../DescribeCapacityReservations.go | 2 +- .../gateway/ec2/capacityreservation/fanout.go | 2 +- .../ec2/instance/DescribeInstanceAttribute.go | 2 +- .../ec2/instance/DescribeInstanceStatus.go | 2 +- .../ec2/instance/DescribeInstanceTypes.go | 2 +- .../gateway/ec2/instance/DescribeInstances.go | 2 +- .../instance/IamInstanceProfileAssociation.go | 6 +- .../instance/ModifyInstanceMetadataOptions.go | 2 +- spinifex/gateway/ec2/instance/RunInstances.go | 2 +- .../instance/RunInstancesIntoReservation.go | 2 +- spinifex/gateway/ec2/instance/placement.go | 4 +- spinifex/gateway/gateway.go | 39 +++------ spinifex/gateway/gateway_test.go | 15 ++-- spinifex/gateway/iam.go | 3 +- spinifex/gateway/spinifex.go | 4 +- spinifex/gateway/spx/promote_image.go | 2 +- spinifex/gateway/spx/spx.go | 4 +- spinifex/gateway/sts.go | 21 +---- spinifex/gateway/sts/GetSessionToken.go | 6 +- spinifex/gateway/sts_request_test.go | 2 +- spinifex/handlers/acm/service_nats.go | 14 ++-- spinifex/handlers/ec2/account/service_nats.go | 12 +-- spinifex/handlers/ec2/eigw/service_nats.go | 6 +- spinifex/handlers/ec2/eip/service_nats.go | 12 +-- spinifex/handlers/ec2/igw/service_nats.go | 10 +-- spinifex/handlers/ec2/image/service_nats.go | 16 ++-- .../handlers/ec2/instance/service_mock.go | 79 ------------------- .../handlers/ec2/instance/service_nats.go | 16 ++-- spinifex/handlers/ec2/key/service_mock.go | 54 ------------- spinifex/handlers/ec2/key/service_nats.go | 8 +- spinifex/handlers/ec2/natgw/service_nats.go | 6 +- .../ec2/placementgroup/service_nats.go | 18 ++--- .../handlers/ec2/routetable/service_nats.go | 18 ++--- .../handlers/ec2/snapshot/service_nats.go | 8 +- .../handlers/ec2/spotinstance/service_nats.go | 6 +- spinifex/handlers/ec2/tags/service_nats.go | 6 +- spinifex/handlers/ec2/volume/service_impl.go | 4 +- spinifex/handlers/ec2/volume/service_nats.go | 12 +-- spinifex/handlers/ec2/vpc/service_nats.go | 42 +++++----- spinifex/handlers/ecr/meta_nats.go | 44 +++++------ spinifex/handlers/ecs/eni.go | 8 +- spinifex/handlers/ecs/service_nats.go | 52 ++++++------ spinifex/handlers/eks/service_nats.go | 74 ++++++++--------- spinifex/handlers/eks/token_review.go | 2 +- spinifex/handlers/elbv2/service_nats.go | 70 ++++++++-------- spinifex/handlers/imds/nats_clients.go | 8 +- spinifex/network/subscribers/respond.go | 2 +- .../services/awsgw/eks_token_verify_test.go | 7 +- spinifex/types/ebs.go | 11 --- spinifex/utils/nats.go | 36 +++------ spinifex/utils/nats_test.go | 39 ++++----- spinifex/utils/nats_trace_test.go | 8 +- spinifex/vm/volumes.go | 33 +++----- spinifex/vm/volumes_test.go | 8 +- 71 files changed, 397 insertions(+), 676 deletions(-) delete mode 100644 spinifex/gateway/account.go delete mode 100644 spinifex/handlers/ec2/instance/service_mock.go delete mode 100644 spinifex/handlers/ec2/key/service_mock.go diff --git a/cmd/spinifex/cmd/admin.go b/cmd/spinifex/cmd/admin.go index 4009ebb55..63681fcb8 100644 --- a/cmd/spinifex/cmd/admin.go +++ b/cmd/spinifex/cmd/admin.go @@ -1543,7 +1543,7 @@ func runAdminInit(cmd *cobra.Command, args []string) { os.Exit(1) } - finalizeNodeSetup(spxRoot, certPath, bootstrapResult.AdminAccessKey, bootstrapResult.AdminSecretKey, region, bindIP, advertiseIP) + finalizeNodeSetup(spxRoot, certPath, bootstrapResult.AdminAccessKey, bootstrapResult.AdminSecretKey, region, bindIP) // Write node.conf so spx admin banner works on source installs (not just ISO). nodeHostname, _ := os.Hostname() @@ -1800,7 +1800,7 @@ func runAdminInitMultiNode(cmd *cobra.Command, accessKey, secretKey, accountID, os.Exit(1) } - finalizeNodeSetup(spxRoot, certPath, bootstrapResult.AdminAccessKey, bootstrapResult.AdminSecretKey, region, bindIP, advertiseIP) + finalizeNodeSetup(spxRoot, certPath, bootstrapResult.AdminAccessKey, bootstrapResult.AdminSecretKey, region, bindIP) // Keep formation server running briefly so joining nodes can fetch complete status fmt.Println("\nā³ Waiting for joining nodes to fetch cluster data...") @@ -2257,7 +2257,7 @@ func runAdminJoin(cmd *cobra.Command, args []string) { os.Exit(1) } - finalizeNodeSetup(dataDir, caCertPath, creds.AdminAccessKey, creds.AdminSecretKey, creds.Region, bindIP, advertiseIP) + finalizeNodeSetup(dataDir, caCertPath, creds.AdminAccessKey, creds.AdminSecretKey, creds.Region, bindIP) // Print cluster summary fmt.Println("\nšŸŽ‰ Node successfully joined cluster!") @@ -2567,12 +2567,10 @@ func generateAndWriteConfigs(dirs configDirs, spinifexTomlPath string, settings } // finalizeNodeSetup configures AWS credentials, creates service directories, -// and sets ownership when running as root. advertiseIP is the off-host dial -// target for this node; it is threaded through SetupAWSCredentials's wanIP -// param for a future --operator-endpoint flag (see SetupAWSCredentials doc). -func finalizeNodeSetup(dataDir, certPath, adminAccessKey, adminSecretKey, region, bindIP, advertiseIP string) { +// and sets ownership when running as root. +func finalizeNodeSetup(dataDir, certPath, adminAccessKey, adminSecretKey, region, bindIP string) { fmt.Println("\nšŸ”§ Configuring AWS credentials...") - if err := admin.SetupAWSCredentials(adminAccessKey, adminSecretKey, region, certPath, bindIP, advertiseIP); err != nil { + if err := admin.SetupAWSCredentials(adminAccessKey, adminSecretKey, region, certPath, bindIP); err != nil { fmt.Fprintf(os.Stderr, "Warning: Could not update AWS credentials: %v\n", err) } else { fmt.Println("āœ… AWS credentials configured") diff --git a/cmd/spinifex/cmd/cluster.go b/cmd/spinifex/cmd/cluster.go index 53c60cffa..7e3825f94 100644 --- a/cmd/spinifex/cmd/cluster.go +++ b/cmd/spinifex/cmd/cluster.go @@ -123,7 +123,7 @@ func runClusterShutdown(cmd *cobra.Command, args []string) { phaseStart := time.Now() fmt.Printf("[%s] Sending to %d node(s)...\n", strings.ToUpper(phase), nodeCount) - acks, err := collectShutdownACKs(nc, topic, reqData, nodeCount, timeout) + acks, err := collectShutdownACKs(nc, topic, reqData, nodeCount, "", timeout) if err != nil { fmt.Fprintf(os.Stderr, "[%s] Error: %v\n", strings.ToUpper(phase), err) if !force { @@ -216,36 +216,14 @@ func runNodeDrainLocal(cmd *cobra.Command, args []string) { // from the local node, ignoring ACKs from any other node. Returns an error if // the local node does not respond within timeout. func collectLocalShutdownACK(nc *nats.Conn, topic string, reqData []byte, node string, timeout time.Duration) (daemon.ShutdownACK, error) { - inbox := nats.NewInbox() - sub, err := nc.SubscribeSync(inbox) + acks, err := collectShutdownACKs(nc, topic, reqData, 1, node, timeout) if err != nil { - return daemon.ShutdownACK{}, fmt.Errorf("failed to subscribe to inbox: %w", err) + return daemon.ShutdownACK{}, err } - defer sub.Unsubscribe() - - if err := nc.PublishRequest(topic, inbox, reqData); err != nil { - return daemon.ShutdownACK{}, fmt.Errorf("failed to publish request: %w", err) - } - nc.Flush() - - deadline := time.Now().Add(timeout) - for { - remaining := time.Until(deadline) - if remaining <= 0 { - return daemon.ShutdownACK{}, fmt.Errorf("timeout waiting for local node %q ACK", node) - } - msg, err := sub.NextMsg(remaining) - if err != nil { - return daemon.ShutdownACK{}, fmt.Errorf("timeout waiting for local node %q ACK", node) - } - var ack daemon.ShutdownACK - if err := json.Unmarshal(msg.Data, &ack); err != nil { - continue - } - if ack.Node == node { - return ack, nil - } + if len(acks) == 0 { + return daemon.ShutdownACK{}, fmt.Errorf("timeout waiting for local node %q ACK", node) } + return acks[0], nil } // runClusterDrainDHCP asks every vpcd to DHCPRELEASE all external-pool leases @@ -322,7 +300,9 @@ func drainDHCPLeases(nc *nats.Conn, timeout time.Duration) (released, responders } // collectShutdownACKs publishes a shutdown request and collects ACKs from nodes. -func collectShutdownACKs(nc *nats.Conn, topic string, reqData []byte, nodeCount int, timeout time.Duration) ([]daemon.ShutdownACK, error) { +// When nodeFilter is non-empty, only ACKs from that node count toward nodeCount +// and all others are ignored (used by the single-node local-drain path). +func collectShutdownACKs(nc *nats.Conn, topic string, reqData []byte, nodeCount int, nodeFilter string, timeout time.Duration) ([]daemon.ShutdownACK, error) { inbox := nats.NewInbox() sub, err := nc.SubscribeSync(inbox) if err != nil { @@ -350,6 +330,9 @@ func collectShutdownACKs(nc *nats.Conn, topic string, reqData []byte, nodeCount if err := json.Unmarshal(msg.Data, &ack); err != nil { continue } + if nodeFilter != "" && ack.Node != nodeFilter { + continue + } acks = append(acks, ack) } return acks, nil diff --git a/cmd/spinifex/cmd/service.go b/cmd/spinifex/cmd/service.go index e79a981af..4806bac93 100644 --- a/cmd/spinifex/cmd/service.go +++ b/cmd/spinifex/cmd/service.go @@ -970,11 +970,6 @@ func init() { viper.BindEnv("encryption-key-file", "SPINIFEX_PREDASTORE_ENCRYPTION_KEY_FILE") viper.BindPFlag("encryption-key-file", predastoreCmd.PersistentFlags().Lookup("encryption-key-file")) - // Predastore Backend - predastoreCmd.PersistentFlags().String("backend", "distributed", "Predastore (S3) backend") - viper.BindEnv("backend", "SPINIFEX_PREDASTORE_BACKEND") - viper.BindPFlag("backend", predastoreCmd.PersistentFlags().Lookup("backend")) - // Predastore Node ID. Default -1 is dev mode (launch every configured // QUIC node in-process). Production deployments set this to the node's // real ID (>= 1) via SPINIFEX_PREDASTORE_NODE_ID or --node-id. diff --git a/spinifex/admin/admin.go b/spinifex/admin/admin.go index 7aa5422ff..31dbedfb3 100644 --- a/spinifex/admin/admin.go +++ b/spinifex/admin/admin.go @@ -754,8 +754,7 @@ func GenerateSignedCert(certPath, keyPath, caCertPath, caKeyPath string, extraIP // SetupAWSCredentials updates ~/.aws/credentials and ~/.aws/config. // When running under sudo, writes to SUDO_USER's home instead of root's. -func SetupAWSCredentials(accessKey, secretKey, region, certPath, bindIP, wanIP string) error { - _ = wanIP +func SetupAWSCredentials(accessKey, secretKey, region, certPath, bindIP string) error { homeDir, err := os.UserHomeDir() if err != nil { return err diff --git a/spinifex/admin/admin_test.go b/spinifex/admin/admin_test.go index 7462549f7..6a793f8bf 100644 --- a/spinifex/admin/admin_test.go +++ b/spinifex/admin/admin_test.go @@ -222,7 +222,7 @@ func TestSetupAWSCredentials_CreatesFiles(t *testing.T) { dir := t.TempDir() t.Setenv("HOME", dir) - err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/path/to/ca.pem", "", "") + err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/path/to/ca.pem", "") require.NoError(t, err) credData, _ := os.ReadFile(filepath.Join(dir, ".aws", "credentials")) @@ -245,7 +245,7 @@ func TestSetupAWSCredentials_PreservesExistingProfiles(t *testing.T) { "aws_access_key_id": "EXISTING_KEY", })) - err := SetupAWSCredentials("NEWAKEY", "NEWSECRET", "us-west-2", "/ca.pem", "", "") + err := SetupAWSCredentials("NEWAKEY", "NEWSECRET", "us-west-2", "/ca.pem", "") require.NoError(t, err) data, _ := os.ReadFile(filepath.Join(awsDir, "credentials")) @@ -258,7 +258,7 @@ func TestSetupAWSCredentials_UsesBindIP(t *testing.T) { dir := t.TempDir() t.Setenv("HOME", dir) - err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/ca.pem", "10.11.12.1", "") + err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/ca.pem", "10.11.12.1") require.NoError(t, err) configData, _ := os.ReadFile(filepath.Join(dir, ".aws", "config")) @@ -270,7 +270,7 @@ func TestSetupAWSCredentials_FallsBackToLocalhostForWildcard(t *testing.T) { dir := t.TempDir() t.Setenv("HOME", dir) - err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/ca.pem", "0.0.0.0", "") + err := SetupAWSCredentials("AKIATEST123", "secret123", "us-east-1", "/ca.pem", "0.0.0.0") require.NoError(t, err) configData, _ := os.ReadFile(filepath.Join(dir, ".aws", "config")) diff --git a/spinifex/daemon/daemon_handlers_volume.go b/spinifex/daemon/daemon_handlers_volume.go index 25ecdd33d..e803d0a05 100644 --- a/spinifex/daemon/daemon_handlers_volume.go +++ b/spinifex/daemon/daemon_handlers_volume.go @@ -75,7 +75,7 @@ func (d *Daemon) handleAttachVolume(ctx context.Context, msg *nats.Msg, command return } - res, err := d.vmMgr.AttachVolume(ctx, instance.ID, volumeID, command.AttachVolumeData.Device) + device, err := d.vmMgr.AttachVolume(ctx, instance.ID, volumeID, command.AttachVolumeData.Device) if err != nil { respondWithError(msg, attachDetachErrorCode(err)) return @@ -88,7 +88,7 @@ func (d *Daemon) handleAttachVolume(ctx context.Context, msg *nats.Msg, command // A guest-form name here breaks the immediate post-attach wait loop. // This diverges intentionally from BlockDeviceMappings, which retain // the guest path under mulga-599. - d.respondWithVolumeAttachment(msg, volumeID, command.ID, res.DeviceName, "attached") + d.respondWithVolumeAttachment(msg, volumeID, command.ID, device, "attached") } // handleDetachVolume dispatches the QMP/state-machine pipeline to diff --git a/spinifex/daemon/daemon_system_dispatch.go b/spinifex/daemon/daemon_system_dispatch.go index 0ddfa6625..0dd43b534 100644 --- a/spinifex/daemon/daemon_system_dispatch.go +++ b/spinifex/daemon/daemon_system_dispatch.go @@ -202,8 +202,8 @@ func (d *Daemon) handleSystemTerminateInstance(msg *nats.Msg) { func (d *Daemon) serveSystemTerminateInstance(msg *nats.Msg) { // Subject suffix is the instance ID; payload is unused but reserved for // future flags. Tolerate empty payloads. - parts := splitSubjectTail(msg.Subject, "system.TerminateInstance.") - if parts == "" { + parts, ok := strings.CutPrefix(msg.Subject, "system.TerminateInstance.") + if !ok || parts == "" { slog.Error("system.TerminateInstance: subject missing instance ID", "subject", msg.Subject) respondWithSystemTerminateError(msg, awserrors.ErrorInvalidInstanceIDNotFound) return @@ -288,14 +288,3 @@ func respondWithSystemTerminateError(msg *nats.Msg, errMsg string) { slog.Error("system.TerminateInstance: respond (error) failed", "err", err) } } - -// splitSubjectTail returns the portion of subject after prefix, or empty -// string if subject does not start with prefix. Helper kept local to avoid -// touching utils for a one-liner. -func splitSubjectTail(subject, prefix string) string { - tail, ok := strings.CutPrefix(subject, prefix) - if !ok { - return "" - } - return tail -} diff --git a/spinifex/daemon/daemon_system_dispatch_test.go b/spinifex/daemon/daemon_system_dispatch_test.go index a06e15326..c0b2e3cf8 100644 --- a/spinifex/daemon/daemon_system_dispatch_test.go +++ b/spinifex/daemon/daemon_system_dispatch_test.go @@ -12,25 +12,6 @@ import ( "github.com/stretchr/testify/require" ) -func TestSplitSubjectTail(t *testing.T) { - cases := []struct { - name string - subject string - prefix string - want string - }{ - {"happy", "system.TerminateInstance.i-abc", "system.TerminateInstance.", "i-abc"}, - {"empty tail equals prefix length", "system.TerminateInstance.", "system.TerminateInstance.", ""}, - {"prefix mismatch", "other.subject", "system.TerminateInstance.", ""}, - {"shorter than prefix", "sys", "system.TerminateInstance.", ""}, - } - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - assert.Equal(t, tc.want, splitSubjectTail(tc.subject, tc.prefix)) - }) - } -} - func TestRespondWithSystemLaunchOutput(t *testing.T) { nc, err := nats.Connect(sharedNATSURL) require.NoError(t, err) diff --git a/spinifex/daemon/daemon_test.go b/spinifex/daemon/daemon_test.go index 32b1cd96a..89fd232ba 100644 --- a/spinifex/daemon/daemon_test.go +++ b/spinifex/daemon/daemon_test.go @@ -745,7 +745,7 @@ func TestDaemon_BootAllocation(t *testing.T) { // Pre-populate the local state file with test state. Post-1a, LoadState // reads from the local file (KV is best-effort cache only). - err = WriteLocalState(daemon.localStatePath(), vms) + err = writeLocalState(daemon.localStatePath(), vms) require.NoError(t, err) // Manually trigger the LoadState and allocation logic normally found in Start() @@ -2797,7 +2797,7 @@ func TestDaemon_WriteState_NilJSManager(t *testing.T) { func TestDaemon_LoadState_NilJSManager(t *testing.T) { tmpDir := t.TempDir() - require.NoError(t, WriteLocalState(LocalStatePath(tmpDir), map[string]*vm.VM{ + require.NoError(t, writeLocalState(LocalStatePath(tmpDir), map[string]*vm.VM{ "i-seed": {ID: "i-seed"}, })) diff --git a/spinifex/daemon/eks_worker_launch.go b/spinifex/daemon/eks_worker_launch.go index 04c34d1d4..27730d9d3 100644 --- a/spinifex/daemon/eks_worker_launch.go +++ b/spinifex/daemon/eks_worker_launch.go @@ -50,7 +50,7 @@ func (d *Daemon) RunWorkerInstanceOnNode(ctx context.Context, nodeID string, inp return nil, errors.New("eks worker: NATS connection not initialized") } subject := fmt.Sprintf("ec2.RunInstances.%s.%s", aws.StringValue(input.InstanceType), nodeID) - return utils.NATSRequestCtx[ec2.Reservation](ctx, d.natsConn, subject, input, 5*time.Minute, accountID) + return utils.NATSRequest[ec2.Reservation](ctx, d.natsConn, subject, input, 5*time.Minute, accountID) } // TerminateWorkerInstances terminates nodegroup workers by routing a terminate diff --git a/spinifex/daemon/jetstream.go b/spinifex/daemon/jetstream.go index a184847c9..340136bc8 100644 --- a/spinifex/daemon/jetstream.go +++ b/spinifex/daemon/jetstream.go @@ -450,34 +450,16 @@ func (m *JetStreamManager) WriteState(nodeID string, vms map[string]*vm.VM) erro return nil } -// WriteStateBestEffort attempts to push instance state to KV with a deadline. -// On timeout or error, it logs a warning and returns — never blocks the caller -// past `timeout` and never returns an error. Used when the local state file is -// the source of truth and KV is a best-effort cache. vms must be a snapshot -// owned by the caller (e.g. from vm.Manager.SnapshotMap). +// WriteStateBytesBestEffort attempts to push pre-marshalled instance state to KV +// with a deadline. On timeout or error, it logs a warning and returns — never +// blocks the caller past `timeout` and never returns an error. Used when the +// local state file is the source of truth and KV is a best-effort cache; hot +// paths marshal under a short-lived lock and commit lock-free. // // Note: kv.Put has no context API. On timeout, the in-flight Put goroutine // continues and completes (or fails) on its own. This leaks at most one // goroutine per write; under sustained partition the leak is bounded by // WriteState call cadence (per-state-transition, not a tight loop). -func (m *JetStreamManager) WriteStateBestEffort(nodeID string, vms map[string]*vm.VM, timeout time.Duration) { - if m.kv == nil { - slog.Debug("KV bucket not initialized, skipping cluster sync", "node", nodeID) - return - } - - jsonData, err := marshalInstanceState(vms) - if err != nil { - slog.Warn("KV sync skipped: marshal failed", "node", nodeID, "err", err) - return - } - - m.WriteStateBytesBestEffort(nodeID, jsonData, timeout) -} - -// WriteStateBytesBestEffort behaves like WriteStateBestEffort but accepts -// pre-marshalled JSON. Used by hot paths that marshal under a short-lived lock -// and commit lock-free. func (m *JetStreamManager) WriteStateBytesBestEffort(nodeID string, jsonData []byte, timeout time.Duration) { if m.kv == nil { slog.Debug("KV bucket not initialized, skipping cluster sync", "node", nodeID) diff --git a/spinifex/daemon/local_state.go b/spinifex/daemon/local_state.go index 88f2ad079..89ed09097 100644 --- a/spinifex/daemon/local_state.go +++ b/spinifex/daemon/local_state.go @@ -55,16 +55,6 @@ func MarshalLocalState(vms map[string]*vm.VM) ([]byte, error) { return data, nil } -// WriteLocalState atomically writes instance state via marshal → tmp → fsync → -// rename. vms must be a caller-owned snapshot; this function does not lock. -func WriteLocalState(path string, vms map[string]*vm.VM) error { - data, err := MarshalLocalState(vms) - if err != nil { - return err - } - return WriteLocalStateBytes(path, data) -} - // WriteLocalStateBytes atomically writes pre-marshalled state JSON to path. func WriteLocalStateBytes(path string, data []byte) error { dir := filepath.Dir(path) diff --git a/spinifex/daemon/local_state_test.go b/spinifex/daemon/local_state_test.go index 74ed56d2e..a94f5be4f 100644 --- a/spinifex/daemon/local_state_test.go +++ b/spinifex/daemon/local_state_test.go @@ -11,6 +11,16 @@ import ( "github.com/stretchr/testify/require" ) +// writeLocalState marshals vms and atomically writes them to path. Test-only +// convenience over MarshalLocalState + WriteLocalStateBytes. +func writeLocalState(path string, vms map[string]*vm.VM) error { + data, err := MarshalLocalState(vms) + if err != nil { + return err + } + return WriteLocalStateBytes(path, data) +} + func TestLocalStatePath_UsesDataDir(t *testing.T) { got := LocalStatePath("/data") assert.Equal(t, "/data/state/instance-state.json", got) @@ -29,7 +39,7 @@ func TestWriteLocalState_RoundTrip(t *testing.T) { "i-bbb": {ID: "i-bbb", InstanceType: "m5.large"}, } - require.NoError(t, WriteLocalState(path, vms)) + require.NoError(t, writeLocalState(path, vms)) loaded, err := ReadLocalState(path) require.NoError(t, err) @@ -42,7 +52,7 @@ func TestWriteLocalState_RoundTrip(t *testing.T) { func TestWriteLocalState_MkdirParent(t *testing.T) { path := filepath.Join(t.TempDir(), "deep", "nested", "state", "instance-state.json") - require.NoError(t, WriteLocalState(path, map[string]*vm.VM{})) + require.NoError(t, writeLocalState(path, map[string]*vm.VM{})) _, err := os.Stat(path) require.NoError(t, err) } @@ -50,7 +60,7 @@ func TestWriteLocalState_MkdirParent(t *testing.T) { func TestWriteLocalState_NoTmpLeftBehind(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "instance-state.json") - require.NoError(t, WriteLocalState(path, map[string]*vm.VM{})) + require.NoError(t, writeLocalState(path, map[string]*vm.VM{})) entries, err := os.ReadDir(dir) require.NoError(t, err) @@ -62,11 +72,11 @@ func TestWriteLocalState_NoTmpLeftBehind(t *testing.T) { func TestWriteLocalState_AtomicReplace(t *testing.T) { path := filepath.Join(t.TempDir(), "instance-state.json") - require.NoError(t, WriteLocalState(path, map[string]*vm.VM{ + require.NoError(t, writeLocalState(path, map[string]*vm.VM{ "i-1": {ID: "i-1"}, })) - require.NoError(t, WriteLocalState(path, map[string]*vm.VM{ + require.NoError(t, writeLocalState(path, map[string]*vm.VM{ "i-2": {ID: "i-2"}, })) diff --git a/spinifex/gateway/account.go b/spinifex/gateway/account.go deleted file mode 100644 index fa18572e9..000000000 --- a/spinifex/gateway/account.go +++ /dev/null @@ -1,7 +0,0 @@ -package gateway - -import "net/http" - -func (gw *GatewayConfig) Account_Request(w http.ResponseWriter, r *http.Request) error { - return nil -} diff --git a/spinifex/gateway/ec2.go b/spinifex/gateway/ec2.go index f49a96f8d..5e1088fd4 100644 --- a/spinifex/gateway/ec2.go +++ b/spinifex/gateway/ec2.go @@ -97,7 +97,7 @@ func ec2HandlerWithReq[In any](handler func(ctx context.Context, input *In, gw * var ec2Actions = map[string]EC2Handler{ "DescribeInstances": ec2Handler(func(ctx context.Context, input *ec2.DescribeInstancesInput, gw *GatewayConfig, accountID string) (any, error) { - out, err := gateway_ec2_instance.DescribeInstances(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + out, err := gateway_ec2_instance.DescribeInstances(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) if err != nil { return out, err } @@ -129,16 +129,16 @@ var ec2Actions = map[string]EC2Handler{ return gateway_ec2_instance.AssociateIamInstanceProfile(ctx, input, gw.NATSConn, gw.IAMService, accountID, passRoleCheck) }), "DisassociateIamInstanceProfile": ec2Handler(func(ctx context.Context, input *ec2.DisassociateIamInstanceProfileInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_instance.DisassociateIamInstanceProfile(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + return gateway_ec2_instance.DisassociateIamInstanceProfile(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) }), "ReplaceIamInstanceProfileAssociation": ec2HandlerWithReq(func(ctx context.Context, input *ec2.ReplaceIamInstanceProfileAssociationInput, gw *GatewayConfig, accountID string, r *http.Request) (any, error) { passRoleCheck := func(roleARN string) error { return gw.checkPolicyResource(r, "iam", "PassRole", roleARN) } - return gateway_ec2_instance.ReplaceIamInstanceProfileAssociation(ctx, input, gw.NATSConn, gw.IAMService, gw.DiscoverActiveNodesCtx(ctx), accountID, passRoleCheck) + return gateway_ec2_instance.ReplaceIamInstanceProfileAssociation(ctx, input, gw.NATSConn, gw.IAMService, gw.DiscoverActiveNodes(ctx), accountID, passRoleCheck) }), "DescribeIamInstanceProfileAssociations": ec2Handler(func(ctx context.Context, input *ec2.DescribeIamInstanceProfileAssociationsInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_instance.DescribeIamInstanceProfileAssociations(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + return gateway_ec2_instance.DescribeIamInstanceProfileAssociations(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) }), "StartInstances": ec2Handler(func(ctx context.Context, input *ec2.StartInstancesInput, gw *GatewayConfig, accountID string) (any, error) { return gateway_ec2_instance.StartInstances(ctx, input, gw.NATSConn, accountID) @@ -156,7 +156,7 @@ var ec2Actions = map[string]EC2Handler{ return gateway_ec2_instance.DescribeInstanceTypes(ctx, input, gw.NATSConn, gw.ExpectedNodes, accountID) }), "DescribeInstanceStatus": ec2Handler(func(ctx context.Context, input *ec2.DescribeInstanceStatusInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_instance.DescribeInstanceStatus(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID, gw.AZ) + return gateway_ec2_instance.DescribeInstanceStatus(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID, gw.AZ) }), "GetConsoleOutput": ec2Handler(func(ctx context.Context, input *ec2.GetConsoleOutputInput, gw *GatewayConfig, accountID string) (any, error) { return gateway_ec2_instance.GetConsoleOutput(ctx, input, gw.NATSConn, accountID) @@ -183,7 +183,7 @@ var ec2Actions = map[string]EC2Handler{ return out, nil }), "DescribeInstanceAttribute": ec2Handler(func(ctx context.Context, input *ec2.DescribeInstanceAttributeInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_instance.DescribeInstanceAttribute(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + return gateway_ec2_instance.DescribeInstanceAttribute(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) }), "ModifyInstanceMetadataOptions": ec2Handler(func(ctx context.Context, input *ec2.ModifyInstanceMetadataOptionsInput, gw *GatewayConfig, accountID string) (any, error) { return gateway_ec2_instance.ModifyInstanceMetadataOptions(ctx, input, gw.NATSConn, accountID) @@ -213,7 +213,7 @@ var ec2Actions = map[string]EC2Handler{ return gateway_ec2_image.DescribeImages(ctx, input, gw.NATSConn, accountID) }), "CreateImage": ec2Handler(func(ctx context.Context, input *ec2.CreateImageInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_image.CreateImage(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + return gateway_ec2_image.CreateImage(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) }), "DeregisterImage": ec2Handler(func(ctx context.Context, input *ec2.DeregisterImageInput, gw *GatewayConfig, accountID string) (any, error) { return gateway_ec2_image.DeregisterImage(ctx, input, gw.NATSConn, accountID) @@ -255,7 +255,7 @@ var ec2Actions = map[string]EC2Handler{ return gateway_ec2_volume.CreateVolume(ctx, input, gw.NATSConn, accountID) }), "DeleteVolume": ec2Handler(func(ctx context.Context, input *ec2.DeleteVolumeInput, gw *GatewayConfig, accountID string) (any, error) { - return gateway_ec2_volume.DeleteVolume(ctx, input, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx), accountID) + return gateway_ec2_volume.DeleteVolume(ctx, input, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID) }), "AttachVolume": ec2Handler(func(ctx context.Context, input *ec2.AttachVolumeInput, gw *GatewayConfig, accountID string) (any, error) { return gateway_ec2_volume.AttachVolume(ctx, input, gw.NATSConn, accountID) diff --git a/spinifex/gateway/ec2/capacityreservation/CancelCapacityReservation.go b/spinifex/gateway/ec2/capacityreservation/CancelCapacityReservation.go index e1cdb04d0..644c2372a 100644 --- a/spinifex/gateway/ec2/capacityreservation/CancelCapacityReservation.go +++ b/spinifex/gateway/ec2/capacityreservation/CancelCapacityReservation.go @@ -40,7 +40,7 @@ func CancelCapacityReservation(ctx context.Context, input *ec2.CancelCapacityRes return output, fmt.Errorf("failed to marshal input: %w", err) } - frames, _, err := utils.GatherCtx(ctx, natsConn, "ec2.CancelCapacityReservation", payload, + frames, _, err := utils.Gather(ctx, natsConn, "ec2.CancelCapacityReservation", payload, utils.GatherOpts{Timeout: censusTimeout, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return output, err diff --git a/spinifex/gateway/ec2/capacityreservation/CreateCapacityReservation.go b/spinifex/gateway/ec2/capacityreservation/CreateCapacityReservation.go index e40ddb7b0..40ad70ad7 100644 --- a/spinifex/gateway/ec2/capacityreservation/CreateCapacityReservation.go +++ b/spinifex/gateway/ec2/capacityreservation/CreateCapacityReservation.go @@ -88,7 +88,7 @@ func CreateCapacityReservation(ctx context.Context, input *ec2.CreateCapacityRes } subject := fmt.Sprintf("ec2.CreateCapacityReservation.%s", node) - reservation, err := utils.NATSRequestCtx[ec2.CapacityReservation](ctx, natsConn, subject, input, createReservationTimeout, accountID) + reservation, err := utils.NATSRequest[ec2.CapacityReservation](ctx, natsConn, subject, input, createReservationTimeout, accountID) if err != nil { return output, err } diff --git a/spinifex/gateway/ec2/capacityreservation/DescribeCapacityReservations.go b/spinifex/gateway/ec2/capacityreservation/DescribeCapacityReservations.go index 14b34e3db..ef6ec38e7 100644 --- a/spinifex/gateway/ec2/capacityreservation/DescribeCapacityReservations.go +++ b/spinifex/gateway/ec2/capacityreservation/DescribeCapacityReservations.go @@ -47,7 +47,7 @@ func DescribeCapacityReservations(ctx context.Context, input *ec2.DescribeCapaci return output, fmt.Errorf("failed to marshal input: %w", err) } - frames, _, err := utils.GatherCtx(ctx, natsConn, "ec2.DescribeCapacityReservations", payload, + frames, _, err := utils.Gather(ctx, natsConn, "ec2.DescribeCapacityReservations", payload, utils.GatherOpts{Timeout: censusTimeout, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return output, err diff --git a/spinifex/gateway/ec2/capacityreservation/fanout.go b/spinifex/gateway/ec2/capacityreservation/fanout.go index 2ac55ae18..a41b15a72 100644 --- a/spinifex/gateway/ec2/capacityreservation/fanout.go +++ b/spinifex/gateway/ec2/capacityreservation/fanout.go @@ -32,7 +32,7 @@ func collectCensus(ctx context.Context, natsConn *nats.Conn, expectedNodes int, expectedNodes = 1 } - frames, _, err := utils.GatherCtx(ctx, natsConn, "spinifex.node.status", []byte("{}"), + frames, _, err := utils.Gather(ctx, natsConn, "spinifex.node.status", []byte("{}"), utils.GatherOpts{Timeout: censusTimeout, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err diff --git a/spinifex/gateway/ec2/instance/DescribeInstanceAttribute.go b/spinifex/gateway/ec2/instance/DescribeInstanceAttribute.go index 6b22cc78f..ab7999af6 100644 --- a/spinifex/gateway/ec2/instance/DescribeInstanceAttribute.go +++ b/spinifex/gateway/ec2/instance/DescribeInstanceAttribute.go @@ -53,7 +53,7 @@ func DescribeInstanceAttribute(ctx context.Context, input *ec2.DescribeInstanceA return nil, fmt.Errorf("failed to marshal input: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, natsConn, "ec2.DescribeInstanceAttribute", jsonData, + frames, sum, err := utils.Gather(ctx, natsConn, "ec2.DescribeInstanceAttribute", jsonData, utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes, StopOnFirst: true, AccountID: accountID}) if err != nil { return nil, err diff --git a/spinifex/gateway/ec2/instance/DescribeInstanceStatus.go b/spinifex/gateway/ec2/instance/DescribeInstanceStatus.go index 4ef7a3f76..5702d6141 100644 --- a/spinifex/gateway/ec2/instance/DescribeInstanceStatus.go +++ b/spinifex/gateway/ec2/instance/DescribeInstanceStatus.go @@ -35,7 +35,7 @@ func DescribeInstanceStatus(ctx context.Context, input *ec2.DescribeInstanceStat return nil, fmt.Errorf("failed to marshal input: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, natsConn, "ec2.DescribeInstanceStatus", jsonData, + frames, sum, err := utils.Gather(ctx, natsConn, "ec2.DescribeInstanceStatus", jsonData, utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err diff --git a/spinifex/gateway/ec2/instance/DescribeInstanceTypes.go b/spinifex/gateway/ec2/instance/DescribeInstanceTypes.go index 010d30286..cebb0e7dc 100644 --- a/spinifex/gateway/ec2/instance/DescribeInstanceTypes.go +++ b/spinifex/gateway/ec2/instance/DescribeInstanceTypes.go @@ -20,7 +20,7 @@ func DescribeInstanceTypes(ctx context.Context, input *ec2.DescribeInstanceTypes return nil, fmt.Errorf("failed to marshal input: %w", err) } - frames, _, err := utils.GatherCtx(ctx, natsConn, "ec2.DescribeInstanceTypes", jsonData, + frames, _, err := utils.Gather(ctx, natsConn, "ec2.DescribeInstanceTypes", jsonData, utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err diff --git a/spinifex/gateway/ec2/instance/DescribeInstances.go b/spinifex/gateway/ec2/instance/DescribeInstances.go index ef233110d..571343d17 100644 --- a/spinifex/gateway/ec2/instance/DescribeInstances.go +++ b/spinifex/gateway/ec2/instance/DescribeInstances.go @@ -56,7 +56,7 @@ func gatherInstances(ctx context.Context, input *ec2.DescribeInstancesInput, nat return nil, false, "", fmt.Errorf("failed to marshal input: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, natsConn, "ec2.DescribeInstances", jsonData, + frames, sum, err := utils.Gather(ctx, natsConn, "ec2.DescribeInstances", jsonData, utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, false, "", err diff --git a/spinifex/gateway/ec2/instance/IamInstanceProfileAssociation.go b/spinifex/gateway/ec2/instance/IamInstanceProfileAssociation.go index 4714f414a..b09a86263 100644 --- a/spinifex/gateway/ec2/instance/IamInstanceProfileAssociation.go +++ b/spinifex/gateway/ec2/instance/IamInstanceProfileAssociation.go @@ -75,7 +75,7 @@ func AssociateIamInstanceProfile(ctx context.Context, input *ec2.AssociateIamIns } subject := fmt.Sprintf("ec2.cmd.%s", *input.InstanceId) - assoc, err := utils.NATSRequestCtx[ec2.IamInstanceProfileAssociation](ctx, natsConn, subject, command, fanOutTimeout, accountID) + assoc, err := utils.NATSRequest[ec2.IamInstanceProfileAssociation](ctx, natsConn, subject, command, fanOutTimeout, accountID) if err != nil { if errors.Is(err, nats.ErrNoResponders) { return nil, errors.New(awserrors.ErrorInvalidInstanceIDNotFound) @@ -187,7 +187,7 @@ func broadcastForAssociation(ctx context.Context, natsConn *nats.Conn, subject s return nil, fmt.Errorf("failed to marshal request: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, natsConn, subject, jsonData, + frames, sum, err := utils.Gather(ctx, natsConn, subject, jsonData, utils.GatherOpts{Timeout: fanOutTimeout, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err @@ -219,7 +219,7 @@ func broadcastDescribeAssociations(ctx context.Context, natsConn *nats.Conn, inp return nil, fmt.Errorf("failed to marshal request: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, natsConn, "ec2.IamProfileAssociation.describe", jsonData, + frames, sum, err := utils.Gather(ctx, natsConn, "ec2.IamProfileAssociation.describe", jsonData, utils.GatherOpts{Timeout: fanOutTimeout, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err diff --git a/spinifex/gateway/ec2/instance/ModifyInstanceMetadataOptions.go b/spinifex/gateway/ec2/instance/ModifyInstanceMetadataOptions.go index ff0742740..512f9790b 100644 --- a/spinifex/gateway/ec2/instance/ModifyInstanceMetadataOptions.go +++ b/spinifex/gateway/ec2/instance/ModifyInstanceMetadataOptions.go @@ -22,5 +22,5 @@ func ModifyInstanceMetadataOptions(ctx context.Context, input *ec2.ModifyInstanc if !strings.HasPrefix(*input.InstanceId, "i-") { return nil, errors.New(awserrors.ErrorInvalidInstanceIDMalformed) } - return utils.NATSRequestCtx[ec2.ModifyInstanceMetadataOptionsOutput](ctx, natsConn, "ec2.ModifyInstanceMetadataOptions", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyInstanceMetadataOptionsOutput](ctx, natsConn, "ec2.ModifyInstanceMetadataOptions", input, 30*time.Second, accountID) } diff --git a/spinifex/gateway/ec2/instance/RunInstances.go b/spinifex/gateway/ec2/instance/RunInstances.go index d2a47e8be..2de3ee494 100644 --- a/spinifex/gateway/ec2/instance/RunInstances.go +++ b/spinifex/gateway/ec2/instance/RunInstances.go @@ -257,7 +257,7 @@ func lookupPlacementGroupStrategy(ctx context.Context, natsConn *nats.Conn, acco // isKnownInstanceType checks whether any daemon recognizes the given instance type. func isKnownInstanceType(ctx context.Context, natsConn *nats.Conn, instanceType string) bool { - result, err := utils.NATSRequestCtx[ec2.DescribeInstanceTypesOutput](ctx, natsConn, "ec2.DescribeInstanceTypes", &ec2.DescribeInstanceTypesInput{}, 3*time.Second, utils.GlobalAccountID) + result, err := utils.NATSRequest[ec2.DescribeInstanceTypesOutput](ctx, natsConn, "ec2.DescribeInstanceTypes", &ec2.DescribeInstanceTypesInput{}, 3*time.Second, utils.GlobalAccountID) if err != nil || result == nil { return false } diff --git a/spinifex/gateway/ec2/instance/RunInstancesIntoReservation.go b/spinifex/gateway/ec2/instance/RunInstancesIntoReservation.go index 05c5a001a..0ff93714c 100644 --- a/spinifex/gateway/ec2/instance/RunInstancesIntoReservation.go +++ b/spinifex/gateway/ec2/instance/RunInstancesIntoReservation.go @@ -18,7 +18,7 @@ import ( // error (type mismatch, full) rides back as the daemon's awserror code. func runIntoReservation(ctx context.Context, input *ec2.RunInstancesInput, natsConn *nats.Conn, accountID, crID string) (*ec2.Reservation, error) { subject := "ec2.RunInstances.cr." + crID - reservation, err := utils.NATSRequestCtx[ec2.Reservation](ctx, natsConn, subject, input, 5*time.Minute, accountID) + reservation, err := utils.NATSRequest[ec2.Reservation](ctx, natsConn, subject, input, 5*time.Minute, accountID) if err != nil { if errors.Is(err, nats.ErrNoResponders) { return nil, errors.New(awserrors.ErrorInvalidCapacityReservationIdNotFound) diff --git a/spinifex/gateway/ec2/instance/placement.go b/spinifex/gateway/ec2/instance/placement.go index da9049ba4..1f5245a12 100644 --- a/spinifex/gateway/ec2/instance/placement.go +++ b/spinifex/gateway/ec2/instance/placement.go @@ -64,7 +64,7 @@ func distributeInstances(ctx context.Context, input *ec2.RunInstancesInput, nats // Early-exits once expectedNodes reply; on a degraded cluster it waits the full timeout // rather than placing on a partial view. func queryNodeCapacity(ctx context.Context, natsConn *nats.Conn, instanceType string, expectedNodes int, accountID string) ([]nodeAllocation, error) { - frames, _, err := utils.GatherCtx(ctx, natsConn, "spinifex.node.status", []byte("{}"), + frames, _, err := utils.Gather(ctx, natsConn, "spinifex.node.status", []byte("{}"), utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes, AccountID: accountID}) if err != nil { return nil, err @@ -174,7 +174,7 @@ func launchOnNodes(ctx context.Context, allocations []nodeAllocation, input *ec2 nodeInput.MaxCount = aws.Int64(int64(a.Assigned)) topic := fmt.Sprintf("ec2.RunInstances.%s.%s", instanceType, a.NodeID) - reservation, err := utils.NATSRequestCtx[ec2.Reservation](ctx, natsConn, topic, &nodeInput, 5*time.Minute, accountID) + reservation, err := utils.NATSRequest[ec2.Reservation](ctx, natsConn, topic, &nodeInput, 5*time.Minute, accountID) if err != nil { results[idx] = nodeLaunchResult{NodeID: a.NodeID, Err: fmt.Errorf("launch on %s: %w", a.NodeID, err)} return diff --git a/spinifex/gateway/gateway.go b/spinifex/gateway/gateway.go index 5b11f2092..02fe41fe0 100644 --- a/spinifex/gateway/gateway.go +++ b/spinifex/gateway/gateway.go @@ -14,6 +14,7 @@ import ( "time" "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" "github.com/google/uuid" "github.com/mulgadc/predastore/auth" "github.com/mulgadc/predastore/pkg/iampolicy" @@ -115,7 +116,6 @@ var supportedServices = map[string]bool{ "ec2": true, "iam": true, "sts": true, - "account": true, "elasticloadbalancing": true, "eks": true, "ecs": true, @@ -323,8 +323,8 @@ func (gw *GatewayConfig) Request(w http.ResponseWriter, r *http.Request) { } // Fail fast when NATS is down; every NATS-bound handler would otherwise hang - // until per-call timeout. Account is a local stub exempt from NATS. - if svc != "account" && (gw.NATSConn == nil || !gw.NATSConn.IsConnected()) { + // until per-call timeout. + if gw.NATSConn == nil || !gw.NATSConn.IsConnected() { gw.writeClusterUnavailable(w, r, svc) return } @@ -332,8 +332,6 @@ func (gw *GatewayConfig) Request(w http.ResponseWriter, r *http.Request) { switch svc { case "ec2": err = gw.EC2_Request(w, r) - case "account": - err = gw.Account_Request(w, r) case "iam": err = gw.IAM_Request(w, r) case "sts": @@ -625,22 +623,17 @@ func GenerateIAMErrorResponse(code, message, requestID string) (output []byte) { return output } -// DiscoverActiveNodes discovers the number of active spinifex daemon nodes in the cluster -// by publishing a discovery request and counting unique responses. +// DiscoverActiveNodes discovers the number of active spinifex daemon nodes in the +// cluster by publishing a discovery request and counting unique responses. It +// carries the request context so the discovery fan-out joins the caller's trace. // Returns the number of active nodes (minimum 1 if fallback is needed). -func (gw *GatewayConfig) DiscoverActiveNodes() int { - return gw.DiscoverActiveNodesCtx(context.Background()) -} - -// DiscoverActiveNodesCtx is DiscoverActiveNodes carrying the request context so -// the discovery fan-out joins the caller's trace. -func (gw *GatewayConfig) DiscoverActiveNodesCtx(ctx context.Context) int { +func (gw *GatewayConfig) DiscoverActiveNodes(ctx context.Context) int { if gw.NATSConn == nil { slog.WarnContext(ctx, "DiscoverActiveNodes: NATS connection not available, using ExpectedNodes fallback", "fallback", gw.ExpectedNodes) return gw.ExpectedNodes } - frames, _, err := utils.GatherCtx(ctx, gw.NATSConn, "spinifex.nodes.discover", []byte("{}"), + frames, _, err := utils.Gather(ctx, gw.NATSConn, "spinifex.nodes.discover", []byte("{}"), utils.GatherOpts{Timeout: 500 * time.Millisecond}) if err != nil { slog.ErrorContext(ctx, "DiscoverActiveNodes: fan-out failed, using ExpectedNodes fallback", "err", err, "fallback", gw.ExpectedNodes) @@ -667,18 +660,6 @@ func (gw *GatewayConfig) DiscoverActiveNodesCtx(ctx context.Context) int { return activeNodes } -// statusWriter wraps http.ResponseWriter to capture the written status code. -type statusWriter struct { - http.ResponseWriter - - status int -} - -func (w *statusWriter) WriteHeader(code int) { - w.status = code - w.ResponseWriter.WriteHeader(code) -} - // traceActionEnricher renames the server span to the resolved SigV4 // service.Action and tags account/region once auth populated the context. func traceActionEnricher(next http.Handler) http.Handler { @@ -709,8 +690,8 @@ func traceActionEnricher(next http.Handler) http.Handler { func slogRequestLogger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() - ww := &statusWriter{ResponseWriter: w, status: 200} + ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) next.ServeHTTP(ww, r) - slog.InfoContext(r.Context(), "request", "method", r.Method, "path", r.URL.Path, "status", ww.status, "duration", time.Since(start)) + slog.InfoContext(r.Context(), "request", "method", r.Method, "path", r.URL.Path, "status", ww.Status(), "duration", time.Since(start)) }) } diff --git a/spinifex/gateway/gateway_test.go b/spinifex/gateway/gateway_test.go index f12b8a2a5..edc0a0879 100644 --- a/spinifex/gateway/gateway_test.go +++ b/spinifex/gateway/gateway_test.go @@ -285,7 +285,7 @@ func TestDiscoverActiveNodes_NilNATS(t *testing.T) { NATSConn: nil, } - result := gw.DiscoverActiveNodes() + result := gw.DiscoverActiveNodes(context.Background()) assert.Equal(t, 3, result) } @@ -297,7 +297,7 @@ func TestDiscoverActiveNodes_NoResponders(t *testing.T) { NATSConn: nc, } - result := gw.DiscoverActiveNodes() + result := gw.DiscoverActiveNodes(context.Background()) assert.Equal(t, 5, result) } @@ -320,7 +320,7 @@ func TestDiscoverActiveNodes_WithResponders(t *testing.T) { NATSConn: nc, } - result := gw.DiscoverActiveNodes() + result := gw.DiscoverActiveNodes(context.Background()) assert.Equal(t, 2, result) } @@ -338,7 +338,7 @@ func TestDiscoverActiveNodes_InvalidJSON(t *testing.T) { NATSConn: nc, } - result := gw.DiscoverActiveNodes() + result := gw.DiscoverActiveNodes(context.Background()) assert.Equal(t, 4, result) } @@ -360,7 +360,7 @@ func TestDiscoverActiveNodes_DuplicateNodes(t *testing.T) { NATSConn: nc, } - result := gw.DiscoverActiveNodes() + result := gw.DiscoverActiveNodes(context.Background()) assert.Equal(t, 1, result) } @@ -488,11 +488,6 @@ func TestGetService(t *testing.T) { ctxVal: "iam", wantSvc: "iam", }, - { - name: "account service", - ctxVal: "account", - wantSvc: "account", - }, { name: "tagging service", ctxVal: "tagging", diff --git a/spinifex/gateway/iam.go b/spinifex/gateway/iam.go index 3f6f7156a..273ae045f 100644 --- a/spinifex/gateway/iam.go +++ b/spinifex/gateway/iam.go @@ -167,7 +167,8 @@ var iamActions = map[string]IAMHandler{ }), "DeleteInstanceProfile": iamHandler(func(accountID string, input *iam.DeleteInstanceProfileInput, gw *GatewayConfig) (any, error) { countLive := func(profileARN string) (int, error) { - return gateway_ec2_instance.CountInstanceProfileAssociations(context.Background(), gw.NATSConn, gw.DiscoverActiveNodes(), accountID, profileARN) + ctx := context.Background() + return gateway_ec2_instance.CountInstanceProfileAssociations(ctx, gw.NATSConn, gw.DiscoverActiveNodes(ctx), accountID, profileARN) } return gateway_iam.DeleteInstanceProfile(accountID, input, gw.IAMService, countLive) }), diff --git a/spinifex/gateway/spinifex.go b/spinifex/gateway/spinifex.go index df6eccb61..f386c551c 100644 --- a/spinifex/gateway/spinifex.go +++ b/spinifex/gateway/spinifex.go @@ -59,12 +59,12 @@ func (gw *GatewayConfig) Spinifex_Request(w http.ResponseWriter, r *http.Request if gw.NATSConn == nil { return errors.New(awserrors.ErrorServerInternal) } - output, err = gateway_spx.GetNodes(ctx, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx)) + output, err = gateway_spx.GetNodes(ctx, gw.NATSConn, gw.DiscoverActiveNodes(ctx)) case "GetVMs": if gw.NATSConn == nil { return errors.New(awserrors.ErrorServerInternal) } - output, err = gateway_spx.GetVMs(ctx, gw.NATSConn, gw.DiscoverActiveNodesCtx(ctx)) + output, err = gateway_spx.GetVMs(ctx, gw.NATSConn, gw.DiscoverActiveNodes(ctx)) case "GetStorageStatus": if gw.NATSConn == nil { return errors.New(awserrors.ErrorServerInternal) diff --git a/spinifex/gateway/spx/promote_image.go b/spinifex/gateway/spx/promote_image.go index b991060d3..78e611d8e 100644 --- a/spinifex/gateway/spx/promote_image.go +++ b/spinifex/gateway/spx/promote_image.go @@ -12,5 +12,5 @@ import ( // PromoteImage publishes a promotion request to the spinifex.image.promote NATS // topic and waits for the daemon to call admin.PromoteSystemImage and reply. func PromoteImage(ctx context.Context, nc *nats.Conn, imageID, accountID string) (*admin.PromoteImageResult, error) { - return utils.NATSRequestCtx[admin.PromoteImageResult](ctx, nc, "spinifex.image.promote", admin.PromoteImageOpts{ImageID: imageID}, 30*time.Second, accountID) + return utils.NATSRequest[admin.PromoteImageResult](ctx, nc, "spinifex.image.promote", admin.PromoteImageOpts{ImageID: imageID}, 30*time.Second, accountID) } diff --git a/spinifex/gateway/spx/spx.go b/spinifex/gateway/spx/spx.go index e6e42934f..0b83526e6 100644 --- a/spinifex/gateway/spx/spx.go +++ b/spinifex/gateway/spx/spx.go @@ -46,7 +46,7 @@ type GetNodesOutput struct { // GetNodes queries all daemon nodes via NATS fan-out and returns their status. func GetNodes(ctx context.Context, nc *nats.Conn, expectedNodes int) (*GetNodesOutput, error) { - frames, _, err := utils.GatherCtx(ctx, nc, "spinifex.node.status", []byte("{}"), + frames, _, err := utils.Gather(ctx, nc, "spinifex.node.status", []byte("{}"), utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes}) if err != nil { return nil, err @@ -85,7 +85,7 @@ type GetVMsOutput struct { // GetVMs queries all daemon nodes via NATS fan-out and returns their VMs. func GetVMs(ctx context.Context, nc *nats.Conn, expectedNodes int) (*GetVMsOutput, error) { - frames, _, err := utils.GatherCtx(ctx, nc, "spinifex.node.vms", []byte("{}"), + frames, _, err := utils.Gather(ctx, nc, "spinifex.node.vms", []byte("{}"), utils.GatherOpts{Timeout: 3 * time.Second, ExpectedNodes: expectedNodes}) if err != nil { return nil, err diff --git a/spinifex/gateway/sts.go b/spinifex/gateway/sts.go index 7c258dd0e..b878615a1 100644 --- a/spinifex/gateway/sts.go +++ b/spinifex/gateway/sts.go @@ -70,19 +70,6 @@ var stsActions = map[string]STSHandler{ }), } -// stsSkipPolicyCheck lists actions not gated by IAM policy on the caller. -// AssumeRole is gated by the role's trust policy in the handler. -// GetCallerIdentity is always allowed per AWS (SDK init flows must not break). -// AssumeRoleWithWebIdentity is anonymous; trust-policy-gated in the handler. -// GetSessionToken is allowed for any authenticated caller; assumed-role and -// session (ASIA) callers are rejected inside the handler. -var stsSkipPolicyCheck = map[string]bool{ - "AssumeRole": true, - "AssumeRoleWithWebIdentity": true, - "GetCallerIdentity": true, - "GetSessionToken": true, -} - // anonymousSTSActions lists STS actions that carry no SigV4; authenticated by // a web-identity JWT instead. anonymousSTSInterceptor routes these before auth. var anonymousSTSActions = map[string]bool{ @@ -111,11 +98,9 @@ func (gw *GatewayConfig) STS_Request(w http.ResponseWriter, r *http.Request) err return errors.New(awserrors.ErrorInternalError) } - if !stsSkipPolicyCheck[action] { - if err := gw.checkPolicy(r, "sts", action); err != nil { - return err - } - } + // STS actions are not gated by caller IAM policy: each action enforces its + // own rule in the handler (role trust policy, web-identity JWT, or the + // always-allowed GetCallerIdentity), so no checkPolicy pass runs here. // Anonymous actions carry no SigV4 envelope; handler ignores the zero caller. var caller stsCaller diff --git a/spinifex/gateway/sts/GetSessionToken.go b/spinifex/gateway/sts/GetSessionToken.go index 695045513..6770aa9e9 100644 --- a/spinifex/gateway/sts/GetSessionToken.go +++ b/spinifex/gateway/sts/GetSessionToken.go @@ -5,9 +5,9 @@ import ( handlers_sts "github.com/mulgadc/spinifex/spinifex/handlers/sts" ) -// GetSessionToken delegates to the STSService; not gated by checkPolicy -// (see stsSkipPolicyCheck). callerUserName and callerAccessKeyID come from -// the SigV4 context. +// GetSessionToken delegates to the STSService; not gated by caller IAM policy +// (STS_Request runs no checkPolicy pass). callerUserName and callerAccessKeyID +// come from the SigV4 context. func GetSessionToken(callerAccountID, callerUserName, callerPrincipalType, callerAccessKeyID string, input *sts.GetSessionTokenInput, svc handlers_sts.STSService) (*sts.GetSessionTokenOutput, error) { return svc.GetSessionToken(callerAccountID, callerUserName, callerPrincipalType, callerAccessKeyID, input) } diff --git a/spinifex/gateway/sts_request_test.go b/spinifex/gateway/sts_request_test.go index 0452f5323..01bf88993 100644 --- a/spinifex/gateway/sts_request_test.go +++ b/spinifex/gateway/sts_request_test.go @@ -253,7 +253,7 @@ func TestSTSRequest_GetSessionToken_Success(t *testing.T) { assert.Contains(t, xmlStr, "GetSessionTokenResult") assert.Contains(t, xmlStr, "ASIAEXAMPLE123") - // Verify forwarded identity fields and that checkPolicy did not block (GetSessionToken is in stsSkipPolicyCheck). + // Verify forwarded identity fields and that checkPolicy did not block (STS_Request runs no checkPolicy pass). assert.Equal(t, utils.GlobalAccountID, got.accountID) assert.Equal(t, "alice", got.userName) assert.Equal(t, principalTypeUser, got.principalType) diff --git a/spinifex/handlers/acm/service_nats.go b/spinifex/handlers/acm/service_nats.go index 3a247d2aa..fb237a4b0 100644 --- a/spinifex/handlers/acm/service_nats.go +++ b/spinifex/handlers/acm/service_nats.go @@ -24,29 +24,29 @@ func NewNATSACMService(conn *nats.Conn) ACMService { } func (s *NATSACMService) ImportCertificate(ctx context.Context, input *acm.ImportCertificateInput, accountID string) (*acm.ImportCertificateOutput, error) { - return utils.NATSRequestCtx[acm.ImportCertificateOutput](ctx, s.natsConn, "acm.ImportCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.ImportCertificateOutput](ctx, s.natsConn, "acm.ImportCertificate", input, defaultTimeout, accountID) } func (s *NATSACMService) DescribeCertificate(ctx context.Context, input *acm.DescribeCertificateInput, accountID string) (*acm.DescribeCertificateOutput, error) { - return utils.NATSRequestCtx[acm.DescribeCertificateOutput](ctx, s.natsConn, "acm.DescribeCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.DescribeCertificateOutput](ctx, s.natsConn, "acm.DescribeCertificate", input, defaultTimeout, accountID) } func (s *NATSACMService) ListCertificates(ctx context.Context, input *acm.ListCertificatesInput, accountID string) (*acm.ListCertificatesOutput, error) { - return utils.NATSRequestCtx[acm.ListCertificatesOutput](ctx, s.natsConn, "acm.ListCertificates", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.ListCertificatesOutput](ctx, s.natsConn, "acm.ListCertificates", input, defaultTimeout, accountID) } func (s *NATSACMService) DeleteCertificate(ctx context.Context, input *acm.DeleteCertificateInput, accountID string) (*acm.DeleteCertificateOutput, error) { - return utils.NATSRequestCtx[acm.DeleteCertificateOutput](ctx, s.natsConn, "acm.DeleteCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.DeleteCertificateOutput](ctx, s.natsConn, "acm.DeleteCertificate", input, defaultTimeout, accountID) } func (s *NATSACMService) ListTagsForCertificate(ctx context.Context, input *acm.ListTagsForCertificateInput, accountID string) (*acm.ListTagsForCertificateOutput, error) { - return utils.NATSRequestCtx[acm.ListTagsForCertificateOutput](ctx, s.natsConn, "acm.ListTagsForCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.ListTagsForCertificateOutput](ctx, s.natsConn, "acm.ListTagsForCertificate", input, defaultTimeout, accountID) } func (s *NATSACMService) AddTagsToCertificate(ctx context.Context, input *acm.AddTagsToCertificateInput, accountID string) (*acm.AddTagsToCertificateOutput, error) { - return utils.NATSRequestCtx[acm.AddTagsToCertificateOutput](ctx, s.natsConn, "acm.AddTagsToCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.AddTagsToCertificateOutput](ctx, s.natsConn, "acm.AddTagsToCertificate", input, defaultTimeout, accountID) } func (s *NATSACMService) RemoveTagsFromCertificate(ctx context.Context, input *acm.RemoveTagsFromCertificateInput, accountID string) (*acm.RemoveTagsFromCertificateOutput, error) { - return utils.NATSRequestCtx[acm.RemoveTagsFromCertificateOutput](ctx, s.natsConn, "acm.RemoveTagsFromCertificate", input, defaultTimeout, accountID) + return utils.NATSRequest[acm.RemoveTagsFromCertificateOutput](ctx, s.natsConn, "acm.RemoveTagsFromCertificate", input, defaultTimeout, accountID) } diff --git a/spinifex/handlers/ec2/account/service_nats.go b/spinifex/handlers/ec2/account/service_nats.go index 87fc1944c..e784e24a2 100644 --- a/spinifex/handlers/ec2/account/service_nats.go +++ b/spinifex/handlers/ec2/account/service_nats.go @@ -22,25 +22,25 @@ func NewNATSAccountSettingsService(natsConn *nats.Conn) AccountSettingsService { } func (s *NATSAccountSettingsService) EnableEbsEncryptionByDefault(ctx context.Context, input *ec2.EnableEbsEncryptionByDefaultInput, accountID string) (*ec2.EnableEbsEncryptionByDefaultOutput, error) { - return utils.NATSRequestCtx[ec2.EnableEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.EnableEbsEncryptionByDefault", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.EnableEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.EnableEbsEncryptionByDefault", input, 30*time.Second, accountID) } func (s *NATSAccountSettingsService) DisableEbsEncryptionByDefault(ctx context.Context, input *ec2.DisableEbsEncryptionByDefaultInput, accountID string) (*ec2.DisableEbsEncryptionByDefaultOutput, error) { - return utils.NATSRequestCtx[ec2.DisableEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.DisableEbsEncryptionByDefault", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DisableEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.DisableEbsEncryptionByDefault", input, 30*time.Second, accountID) } func (s *NATSAccountSettingsService) GetEbsEncryptionByDefault(ctx context.Context, input *ec2.GetEbsEncryptionByDefaultInput, accountID string) (*ec2.GetEbsEncryptionByDefaultOutput, error) { - return utils.NATSRequestCtx[ec2.GetEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.GetEbsEncryptionByDefault", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.GetEbsEncryptionByDefaultOutput](ctx, s.natsConn, "ec2.GetEbsEncryptionByDefault", input, 30*time.Second, accountID) } func (s *NATSAccountSettingsService) GetSerialConsoleAccessStatus(ctx context.Context, input *ec2.GetSerialConsoleAccessStatusInput, accountID string) (*ec2.GetSerialConsoleAccessStatusOutput, error) { - return utils.NATSRequestCtx[ec2.GetSerialConsoleAccessStatusOutput](ctx, s.natsConn, "ec2.GetSerialConsoleAccessStatus", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.GetSerialConsoleAccessStatusOutput](ctx, s.natsConn, "ec2.GetSerialConsoleAccessStatus", input, 30*time.Second, accountID) } func (s *NATSAccountSettingsService) EnableSerialConsoleAccess(ctx context.Context, input *ec2.EnableSerialConsoleAccessInput, accountID string) (*ec2.EnableSerialConsoleAccessOutput, error) { - return utils.NATSRequestCtx[ec2.EnableSerialConsoleAccessOutput](ctx, s.natsConn, "ec2.EnableSerialConsoleAccess", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.EnableSerialConsoleAccessOutput](ctx, s.natsConn, "ec2.EnableSerialConsoleAccess", input, 30*time.Second, accountID) } func (s *NATSAccountSettingsService) DisableSerialConsoleAccess(ctx context.Context, input *ec2.DisableSerialConsoleAccessInput, accountID string) (*ec2.DisableSerialConsoleAccessOutput, error) { - return utils.NATSRequestCtx[ec2.DisableSerialConsoleAccessOutput](ctx, s.natsConn, "ec2.DisableSerialConsoleAccess", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DisableSerialConsoleAccessOutput](ctx, s.natsConn, "ec2.DisableSerialConsoleAccess", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/eigw/service_nats.go b/spinifex/handlers/ec2/eigw/service_nats.go index 7db08d557..e00c7c440 100644 --- a/spinifex/handlers/ec2/eigw/service_nats.go +++ b/spinifex/handlers/ec2/eigw/service_nats.go @@ -23,13 +23,13 @@ func NewNATSEgressOnlyIGWService(conn *nats.Conn) EgressOnlyIGWService { } func (s *NATSEgressOnlyIGWService) CreateEgressOnlyInternetGateway(ctx context.Context, input *ec2.CreateEgressOnlyInternetGatewayInput, accountID string) (*ec2.CreateEgressOnlyInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.CreateEgressOnlyInternetGatewayOutput](ctx, s.natsConn, "ec2.CreateEgressOnlyInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateEgressOnlyInternetGatewayOutput](ctx, s.natsConn, "ec2.CreateEgressOnlyInternetGateway", input, 30*time.Second, accountID) } func (s *NATSEgressOnlyIGWService) DeleteEgressOnlyInternetGateway(ctx context.Context, input *ec2.DeleteEgressOnlyInternetGatewayInput, accountID string) (*ec2.DeleteEgressOnlyInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteEgressOnlyInternetGatewayOutput](ctx, s.natsConn, "ec2.DeleteEgressOnlyInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteEgressOnlyInternetGatewayOutput](ctx, s.natsConn, "ec2.DeleteEgressOnlyInternetGateway", input, 30*time.Second, accountID) } func (s *NATSEgressOnlyIGWService) DescribeEgressOnlyInternetGateways(ctx context.Context, input *ec2.DescribeEgressOnlyInternetGatewaysInput, accountID string) (*ec2.DescribeEgressOnlyInternetGatewaysOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeEgressOnlyInternetGatewaysOutput](ctx, s.natsConn, "ec2.DescribeEgressOnlyInternetGateways", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeEgressOnlyInternetGatewaysOutput](ctx, s.natsConn, "ec2.DescribeEgressOnlyInternetGateways", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/eip/service_nats.go b/spinifex/handlers/ec2/eip/service_nats.go index 4729d86f2..0e58182a3 100644 --- a/spinifex/handlers/ec2/eip/service_nats.go +++ b/spinifex/handlers/ec2/eip/service_nats.go @@ -23,25 +23,25 @@ func NewNATSEIPService(conn *nats.Conn) EIPService { } func (s *NATSEIPService) AllocateAddress(ctx context.Context, input *ec2.AllocateAddressInput, accountID string) (*ec2.AllocateAddressOutput, error) { - return utils.NATSRequestCtx[ec2.AllocateAddressOutput](ctx, s.natsConn, "ec2.AllocateAddress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AllocateAddressOutput](ctx, s.natsConn, "ec2.AllocateAddress", input, 30*time.Second, accountID) } func (s *NATSEIPService) ReleaseAddress(ctx context.Context, input *ec2.ReleaseAddressInput, accountID string) (*ec2.ReleaseAddressOutput, error) { - return utils.NATSRequestCtx[ec2.ReleaseAddressOutput](ctx, s.natsConn, "ec2.ReleaseAddress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ReleaseAddressOutput](ctx, s.natsConn, "ec2.ReleaseAddress", input, 30*time.Second, accountID) } func (s *NATSEIPService) AssociateAddress(ctx context.Context, input *ec2.AssociateAddressInput, accountID string) (*ec2.AssociateAddressOutput, error) { - return utils.NATSRequestCtx[ec2.AssociateAddressOutput](ctx, s.natsConn, "ec2.AssociateAddress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AssociateAddressOutput](ctx, s.natsConn, "ec2.AssociateAddress", input, 30*time.Second, accountID) } func (s *NATSEIPService) DisassociateAddress(ctx context.Context, input *ec2.DisassociateAddressInput, accountID string) (*ec2.DisassociateAddressOutput, error) { - return utils.NATSRequestCtx[ec2.DisassociateAddressOutput](ctx, s.natsConn, "ec2.DisassociateAddress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DisassociateAddressOutput](ctx, s.natsConn, "ec2.DisassociateAddress", input, 30*time.Second, accountID) } func (s *NATSEIPService) DescribeAddresses(ctx context.Context, input *ec2.DescribeAddressesInput, accountID string) (*ec2.DescribeAddressesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeAddressesOutput](ctx, s.natsConn, "ec2.DescribeAddresses", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeAddressesOutput](ctx, s.natsConn, "ec2.DescribeAddresses", input, 30*time.Second, accountID) } func (s *NATSEIPService) DescribeAddressesAttribute(ctx context.Context, input *ec2.DescribeAddressesAttributeInput, accountID string) (*ec2.DescribeAddressesAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeAddressesAttributeOutput](ctx, s.natsConn, "ec2.DescribeAddressesAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeAddressesAttributeOutput](ctx, s.natsConn, "ec2.DescribeAddressesAttribute", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/igw/service_nats.go b/spinifex/handlers/ec2/igw/service_nats.go index de53c7430..ed6938b4e 100644 --- a/spinifex/handlers/ec2/igw/service_nats.go +++ b/spinifex/handlers/ec2/igw/service_nats.go @@ -23,21 +23,21 @@ func NewNATSIGWService(conn *nats.Conn) IGWService { } func (s *NATSIGWService) CreateInternetGateway(ctx context.Context, input *ec2.CreateInternetGatewayInput, accountID string) (*ec2.CreateInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.CreateInternetGatewayOutput](ctx, s.natsConn, "ec2.CreateInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateInternetGatewayOutput](ctx, s.natsConn, "ec2.CreateInternetGateway", input, 30*time.Second, accountID) } func (s *NATSIGWService) DeleteInternetGateway(ctx context.Context, input *ec2.DeleteInternetGatewayInput, accountID string) (*ec2.DeleteInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteInternetGatewayOutput](ctx, s.natsConn, "ec2.DeleteInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteInternetGatewayOutput](ctx, s.natsConn, "ec2.DeleteInternetGateway", input, 30*time.Second, accountID) } func (s *NATSIGWService) DescribeInternetGateways(ctx context.Context, input *ec2.DescribeInternetGatewaysInput, accountID string) (*ec2.DescribeInternetGatewaysOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeInternetGatewaysOutput](ctx, s.natsConn, "ec2.DescribeInternetGateways", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeInternetGatewaysOutput](ctx, s.natsConn, "ec2.DescribeInternetGateways", input, 30*time.Second, accountID) } func (s *NATSIGWService) AttachInternetGateway(ctx context.Context, input *ec2.AttachInternetGatewayInput, accountID string) (*ec2.AttachInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.AttachInternetGatewayOutput](ctx, s.natsConn, "ec2.AttachInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AttachInternetGatewayOutput](ctx, s.natsConn, "ec2.AttachInternetGateway", input, 30*time.Second, accountID) } func (s *NATSIGWService) DetachInternetGateway(ctx context.Context, input *ec2.DetachInternetGatewayInput, accountID string) (*ec2.DetachInternetGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.DetachInternetGatewayOutput](ctx, s.natsConn, "ec2.DetachInternetGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DetachInternetGatewayOutput](ctx, s.natsConn, "ec2.DetachInternetGateway", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/image/service_nats.go b/spinifex/handlers/ec2/image/service_nats.go index 515dd61b7..90abaacbc 100644 --- a/spinifex/handlers/ec2/image/service_nats.go +++ b/spinifex/handlers/ec2/image/service_nats.go @@ -29,7 +29,7 @@ func NewNATSImageService(conn *nats.Conn, expectedNodes int) ImageService { } func (s *NATSImageService) DescribeImages(ctx context.Context, input *ec2.DescribeImagesInput, accountID string) (*ec2.DescribeImagesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeImagesOutput](ctx, s.natsConn, "ec2.DescribeImages", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeImagesOutput](ctx, s.natsConn, "ec2.DescribeImages", input, 30*time.Second, accountID) } func (s *NATSImageService) CreateImage(ctx context.Context, input *ec2.CreateImageInput, accountID string) (*ec2.CreateImageOutput, error) { @@ -38,7 +38,7 @@ func (s *NATSImageService) CreateImage(ctx context.Context, input *ec2.CreateIma return nil, fmt.Errorf("failed to marshal input: %w", err) } - frames, sum, err := utils.GatherCtx(ctx, s.natsConn, "ec2.CreateImage", jsonData, + frames, sum, err := utils.Gather(ctx, s.natsConn, "ec2.CreateImage", jsonData, utils.GatherOpts{Timeout: 120 * time.Second, ExpectedNodes: s.expectedNodes, StopOnFirst: true, AccountID: accountID}) if err != nil { return nil, err @@ -67,25 +67,25 @@ func (s *NATSImageService) CreateImage(ctx context.Context, input *ec2.CreateIma } func (s *NATSImageService) CopyImage(ctx context.Context, input *ec2.CopyImageInput, accountID string) (*ec2.CopyImageOutput, error) { - return utils.NATSRequestCtx[ec2.CopyImageOutput](ctx, s.natsConn, "ec2.CopyImage", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CopyImageOutput](ctx, s.natsConn, "ec2.CopyImage", input, 30*time.Second, accountID) } func (s *NATSImageService) DescribeImageAttribute(ctx context.Context, input *ec2.DescribeImageAttributeInput, accountID string) (*ec2.DescribeImageAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeImageAttributeOutput](ctx, s.natsConn, "ec2.DescribeImageAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeImageAttributeOutput](ctx, s.natsConn, "ec2.DescribeImageAttribute", input, 30*time.Second, accountID) } func (s *NATSImageService) RegisterImage(ctx context.Context, input *ec2.RegisterImageInput, accountID string) (*ec2.RegisterImageOutput, error) { - return utils.NATSRequestCtx[ec2.RegisterImageOutput](ctx, s.natsConn, "ec2.RegisterImage", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.RegisterImageOutput](ctx, s.natsConn, "ec2.RegisterImage", input, 30*time.Second, accountID) } func (s *NATSImageService) DeregisterImage(ctx context.Context, input *ec2.DeregisterImageInput, accountID string) (*ec2.DeregisterImageOutput, error) { - return utils.NATSRequestCtx[ec2.DeregisterImageOutput](ctx, s.natsConn, "ec2.DeregisterImage", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeregisterImageOutput](ctx, s.natsConn, "ec2.DeregisterImage", input, 30*time.Second, accountID) } func (s *NATSImageService) ModifyImageAttribute(ctx context.Context, input *ec2.ModifyImageAttributeInput, accountID string) (*ec2.ModifyImageAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyImageAttributeOutput](ctx, s.natsConn, "ec2.ModifyImageAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyImageAttributeOutput](ctx, s.natsConn, "ec2.ModifyImageAttribute", input, 30*time.Second, accountID) } func (s *NATSImageService) ResetImageAttribute(ctx context.Context, input *ec2.ResetImageAttributeInput, accountID string) (*ec2.ResetImageAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ResetImageAttributeOutput](ctx, s.natsConn, "ec2.ResetImageAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ResetImageAttributeOutput](ctx, s.natsConn, "ec2.ResetImageAttribute", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/instance/service_mock.go b/spinifex/handlers/ec2/instance/service_mock.go deleted file mode 100644 index 62af4bc59..000000000 --- a/spinifex/handlers/ec2/instance/service_mock.go +++ /dev/null @@ -1,79 +0,0 @@ -package handlers_ec2_instance - -import ( - "context" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" -) - -// MockInstanceService provides mock responses for testing -type MockInstanceService struct{} - -var _ InstanceService = (*MockInstanceService)(nil) - -// NewMockInstanceService creates a new mock instance service -func NewMockInstanceService() InstanceService { - return &MockInstanceService{} -} - -func (s *MockInstanceService) RunInstances(_ context.Context, input *ec2.RunInstancesInput, accountID string) (*ec2.Reservation, error) { - instance := &ec2.Instance{ - InstanceId: aws.String("i-0123456789abcdef0"), - State: &ec2.InstanceState{ - Code: aws.Int64(16), - Name: aws.String("running"), - }, - ImageId: input.ImageId, - InstanceType: input.InstanceType, - KeyName: input.KeyName, - SubnetId: input.SubnetId, - } - - reservation := &ec2.Reservation{ - Instances: []*ec2.Instance{instance}, - OwnerId: aws.String(accountID), - } - - return reservation, nil -} - -func (s *MockInstanceService) DescribeInstances(_ context.Context, _ *ec2.DescribeInstancesInput, _ string) (*ec2.DescribeInstancesOutput, error) { - return &ec2.DescribeInstancesOutput{}, nil -} - -func (s *MockInstanceService) DescribeInstanceTypes(_ context.Context, _ *ec2.DescribeInstanceTypesInput, _ string) (*ec2.DescribeInstanceTypesOutput, error) { - return &ec2.DescribeInstanceTypesOutput{}, nil -} - -func (s *MockInstanceService) DescribeInstanceStatus(_ context.Context, _ *ec2.DescribeInstanceStatusInput, _ string) (*ec2.DescribeInstanceStatusOutput, error) { - return &ec2.DescribeInstanceStatusOutput{}, nil -} - -func (s *MockInstanceService) DescribeInstanceAttribute(_ context.Context, input *ec2.DescribeInstanceAttributeInput, _ string) (*ec2.DescribeInstanceAttributeOutput, error) { - return &ec2.DescribeInstanceAttributeOutput{InstanceId: input.InstanceId}, nil -} - -func (s *MockInstanceService) DescribeStoppedInstances(_ context.Context, _ *ec2.DescribeInstancesInput, _ string) (*ec2.DescribeInstancesOutput, error) { - return &ec2.DescribeInstancesOutput{}, nil -} - -func (s *MockInstanceService) DescribeTerminatedInstances(_ context.Context, _ *ec2.DescribeInstancesInput, _ string) (*ec2.DescribeInstancesOutput, error) { - return &ec2.DescribeInstancesOutput{}, nil -} - -func (s *MockInstanceService) ModifyInstanceAttribute(_ context.Context, _ *ec2.ModifyInstanceAttributeInput, _ string) (*ec2.ModifyInstanceAttributeOutput, error) { - return &ec2.ModifyInstanceAttributeOutput{}, nil -} - -func (s *MockInstanceService) ModifyInstanceMetadataOptions(_ context.Context, input *ec2.ModifyInstanceMetadataOptionsInput, _ string) (*ec2.ModifyInstanceMetadataOptionsOutput, error) { - return &ec2.ModifyInstanceMetadataOptionsOutput{InstanceId: input.InstanceId}, nil -} - -func (s *MockInstanceService) StartStoppedInstance(_ context.Context, input *StartStoppedInstanceInput, _ string) (*StartStoppedInstanceOutput, error) { - return &StartStoppedInstanceOutput{Status: "running", InstanceID: input.InstanceID}, nil -} - -func (s *MockInstanceService) TerminateStoppedInstance(_ context.Context, input *TerminateStoppedInstanceInput, _ string) (*TerminateStoppedInstanceOutput, error) { - return &TerminateStoppedInstanceOutput{Status: "terminated", InstanceID: input.InstanceID}, nil -} diff --git a/spinifex/handlers/ec2/instance/service_nats.go b/spinifex/handlers/ec2/instance/service_nats.go index 235c167ab..1835902a4 100644 --- a/spinifex/handlers/ec2/instance/service_nats.go +++ b/spinifex/handlers/ec2/instance/service_nats.go @@ -30,7 +30,7 @@ func (s *NATSInstanceService) RunInstances(ctx context.Context, input *ec2.RunIn return nil, fmt.Errorf("instance type is required") } topic := fmt.Sprintf("ec2.RunInstances.%s", aws.StringValue(input.InstanceType)) - return utils.NATSRequestCtx[ec2.Reservation](ctx, s.natsConn, topic, input, 5*time.Minute, accountID) + return utils.NATSRequest[ec2.Reservation](ctx, s.natsConn, topic, input, 5*time.Minute, accountID) } // DescribeInstances is a fan-out operation; use the gateway's scatter-gather @@ -52,29 +52,29 @@ func (s *NATSInstanceService) DescribeInstanceStatus(_ context.Context, _ *ec2.D } func (s *NATSInstanceService) DescribeInstanceAttribute(ctx context.Context, input *ec2.DescribeInstanceAttributeInput, accountID string) (*ec2.DescribeInstanceAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeInstanceAttributeOutput](ctx, s.natsConn, "ec2.DescribeInstanceAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeInstanceAttributeOutput](ctx, s.natsConn, "ec2.DescribeInstanceAttribute", input, 30*time.Second, accountID) } func (s *NATSInstanceService) DescribeStoppedInstances(ctx context.Context, input *ec2.DescribeInstancesInput, accountID string) (*ec2.DescribeInstancesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeInstancesOutput](ctx, s.natsConn, "ec2.DescribeStoppedInstances", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeInstancesOutput](ctx, s.natsConn, "ec2.DescribeStoppedInstances", input, 30*time.Second, accountID) } func (s *NATSInstanceService) DescribeTerminatedInstances(ctx context.Context, input *ec2.DescribeInstancesInput, accountID string) (*ec2.DescribeInstancesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeInstancesOutput](ctx, s.natsConn, "ec2.DescribeTerminatedInstances", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeInstancesOutput](ctx, s.natsConn, "ec2.DescribeTerminatedInstances", input, 30*time.Second, accountID) } func (s *NATSInstanceService) ModifyInstanceAttribute(ctx context.Context, input *ec2.ModifyInstanceAttributeInput, accountID string) (*ec2.ModifyInstanceAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyInstanceAttributeOutput](ctx, s.natsConn, "ec2.ModifyInstanceAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyInstanceAttributeOutput](ctx, s.natsConn, "ec2.ModifyInstanceAttribute", input, 30*time.Second, accountID) } func (s *NATSInstanceService) ModifyInstanceMetadataOptions(ctx context.Context, input *ec2.ModifyInstanceMetadataOptionsInput, accountID string) (*ec2.ModifyInstanceMetadataOptionsOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyInstanceMetadataOptionsOutput](ctx, s.natsConn, "ec2.ModifyInstanceMetadataOptions", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyInstanceMetadataOptionsOutput](ctx, s.natsConn, "ec2.ModifyInstanceMetadataOptions", input, 30*time.Second, accountID) } func (s *NATSInstanceService) StartStoppedInstance(ctx context.Context, input *StartStoppedInstanceInput, accountID string) (*StartStoppedInstanceOutput, error) { - return utils.NATSRequestCtx[StartStoppedInstanceOutput](ctx, s.natsConn, "ec2.StartStoppedInstance", input, 30*time.Second, accountID) + return utils.NATSRequest[StartStoppedInstanceOutput](ctx, s.natsConn, "ec2.StartStoppedInstance", input, 30*time.Second, accountID) } func (s *NATSInstanceService) TerminateStoppedInstance(ctx context.Context, input *TerminateStoppedInstanceInput, accountID string) (*TerminateStoppedInstanceOutput, error) { - return utils.NATSRequestCtx[TerminateStoppedInstanceOutput](ctx, s.natsConn, "ec2.TerminateStoppedInstance", input, 30*time.Second, accountID) + return utils.NATSRequest[TerminateStoppedInstanceOutput](ctx, s.natsConn, "ec2.TerminateStoppedInstance", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/key/service_mock.go b/spinifex/handlers/ec2/key/service_mock.go deleted file mode 100644 index 3f38ec5a3..000000000 --- a/spinifex/handlers/ec2/key/service_mock.go +++ /dev/null @@ -1,54 +0,0 @@ -package handlers_ec2_key - -import ( - "context" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" -) - -var _ KeyService = (*MockKeyService)(nil) - -// MockKeyService provides mock responses for testing -type MockKeyService struct{} - -// NewMockKeyService creates a new mock key service -func NewMockKeyService() KeyService { - return &MockKeyService{} -} - -func (s *MockKeyService) CreateKeyPair(ctx context.Context, input *ec2.CreateKeyPairInput, accountID string) (*ec2.CreateKeyPairOutput, error) { - return &ec2.CreateKeyPairOutput{ - KeyFingerprint: aws.String("1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"), - KeyMaterial: aws.String("-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA...\n-----END RSA PRIVATE KEY-----"), - KeyName: input.KeyName, - KeyPairId: aws.String("key-0123456789abcdef0"), - }, nil -} - -func (s *MockKeyService) DeleteKeyPair(ctx context.Context, input *ec2.DeleteKeyPairInput, accountID string) (*ec2.DeleteKeyPairOutput, error) { - return &ec2.DeleteKeyPairOutput{ - Return: aws.Bool(true), - KeyPairId: input.KeyPairId, - }, nil -} - -func (s *MockKeyService) DescribeKeyPairs(ctx context.Context, input *ec2.DescribeKeyPairsInput, accountID string) (*ec2.DescribeKeyPairsOutput, error) { - return &ec2.DescribeKeyPairsOutput{ - KeyPairs: []*ec2.KeyPairInfo{ - { - KeyPairId: aws.String("key-0123456789abcdef0"), - KeyFingerprint: aws.String("1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"), - KeyName: aws.String("test-key"), - KeyType: aws.String("rsa"), - }, - }, - }, nil -} - -func (s *MockKeyService) ImportKeyPair(ctx context.Context, input *ec2.ImportKeyPairInput, accountID string) (*ec2.ImportKeyPairOutput, error) { - return &ec2.ImportKeyPairOutput{ - KeyFingerprint: aws.String("1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"), - KeyName: input.KeyName, - KeyPairId: aws.String("key-0987654321fedcba0"), - }, nil -} diff --git a/spinifex/handlers/ec2/key/service_nats.go b/spinifex/handlers/ec2/key/service_nats.go index 59c3960b3..cee32dc44 100644 --- a/spinifex/handlers/ec2/key/service_nats.go +++ b/spinifex/handlers/ec2/key/service_nats.go @@ -22,17 +22,17 @@ func NewNATSKeyService(conn *nats.Conn) KeyService { } func (s *NATSKeyService) CreateKeyPair(ctx context.Context, input *ec2.CreateKeyPairInput, accountID string) (*ec2.CreateKeyPairOutput, error) { - return utils.NATSRequestCtx[ec2.CreateKeyPairOutput](ctx, s.natsConn, "ec2.CreateKeyPair", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateKeyPairOutput](ctx, s.natsConn, "ec2.CreateKeyPair", input, 30*time.Second, accountID) } func (s *NATSKeyService) DeleteKeyPair(ctx context.Context, input *ec2.DeleteKeyPairInput, accountID string) (*ec2.DeleteKeyPairOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteKeyPairOutput](ctx, s.natsConn, "ec2.DeleteKeyPair", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteKeyPairOutput](ctx, s.natsConn, "ec2.DeleteKeyPair", input, 30*time.Second, accountID) } func (s *NATSKeyService) DescribeKeyPairs(ctx context.Context, input *ec2.DescribeKeyPairsInput, accountID string) (*ec2.DescribeKeyPairsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeKeyPairsOutput](ctx, s.natsConn, "ec2.DescribeKeyPairs", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeKeyPairsOutput](ctx, s.natsConn, "ec2.DescribeKeyPairs", input, 30*time.Second, accountID) } func (s *NATSKeyService) ImportKeyPair(ctx context.Context, input *ec2.ImportKeyPairInput, accountID string) (*ec2.ImportKeyPairOutput, error) { - return utils.NATSRequestCtx[ec2.ImportKeyPairOutput](ctx, s.natsConn, "ec2.ImportKeyPair", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ImportKeyPairOutput](ctx, s.natsConn, "ec2.ImportKeyPair", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/natgw/service_nats.go b/spinifex/handlers/ec2/natgw/service_nats.go index eb9d8e531..f85a75486 100644 --- a/spinifex/handlers/ec2/natgw/service_nats.go +++ b/spinifex/handlers/ec2/natgw/service_nats.go @@ -22,13 +22,13 @@ func NewNATSNatGatewayService(conn *nats.Conn) NatGatewayService { } func (s *NATSNatGatewayService) CreateNatGateway(ctx context.Context, input *ec2.CreateNatGatewayInput, accountID string) (*ec2.CreateNatGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.CreateNatGatewayOutput](ctx, s.natsConn, "ec2.CreateNatGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateNatGatewayOutput](ctx, s.natsConn, "ec2.CreateNatGateway", input, 30*time.Second, accountID) } func (s *NATSNatGatewayService) DeleteNatGateway(ctx context.Context, input *ec2.DeleteNatGatewayInput, accountID string) (*ec2.DeleteNatGatewayOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteNatGatewayOutput](ctx, s.natsConn, "ec2.DeleteNatGateway", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteNatGatewayOutput](ctx, s.natsConn, "ec2.DeleteNatGateway", input, 30*time.Second, accountID) } func (s *NATSNatGatewayService) DescribeNatGateways(ctx context.Context, input *ec2.DescribeNatGatewaysInput, accountID string) (*ec2.DescribeNatGatewaysOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeNatGatewaysOutput](ctx, s.natsConn, "ec2.DescribeNatGateways", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeNatGatewaysOutput](ctx, s.natsConn, "ec2.DescribeNatGateways", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/placementgroup/service_nats.go b/spinifex/handlers/ec2/placementgroup/service_nats.go index bee0c737e..b50656da4 100644 --- a/spinifex/handlers/ec2/placementgroup/service_nats.go +++ b/spinifex/handlers/ec2/placementgroup/service_nats.go @@ -22,37 +22,37 @@ func NewNATSPlacementGroupService(conn *nats.Conn) PlacementGroupService { } func (s *NATSPlacementGroupService) CreatePlacementGroup(ctx context.Context, input *ec2.CreatePlacementGroupInput, accountID string) (*ec2.CreatePlacementGroupOutput, error) { - return utils.NATSRequestCtx[ec2.CreatePlacementGroupOutput](ctx, s.natsConn, "ec2.CreatePlacementGroup", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreatePlacementGroupOutput](ctx, s.natsConn, "ec2.CreatePlacementGroup", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) DeletePlacementGroup(ctx context.Context, input *ec2.DeletePlacementGroupInput, accountID string) (*ec2.DeletePlacementGroupOutput, error) { - return utils.NATSRequestCtx[ec2.DeletePlacementGroupOutput](ctx, s.natsConn, "ec2.DeletePlacementGroup", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeletePlacementGroupOutput](ctx, s.natsConn, "ec2.DeletePlacementGroup", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) DescribePlacementGroups(ctx context.Context, input *ec2.DescribePlacementGroupsInput, accountID string) (*ec2.DescribePlacementGroupsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribePlacementGroupsOutput](ctx, s.natsConn, "ec2.DescribePlacementGroups", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribePlacementGroupsOutput](ctx, s.natsConn, "ec2.DescribePlacementGroups", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) ReserveSpreadNodes(ctx context.Context, input *ReserveSpreadNodesInput, accountID string) (*ReserveSpreadNodesOutput, error) { - return utils.NATSRequestCtx[ReserveSpreadNodesOutput](ctx, s.natsConn, "ec2.ReserveSpreadNodes", input, 30*time.Second, accountID) + return utils.NATSRequest[ReserveSpreadNodesOutput](ctx, s.natsConn, "ec2.ReserveSpreadNodes", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) FinalizeSpreadInstances(ctx context.Context, input *FinalizeSpreadInstancesInput, accountID string) (*FinalizeSpreadInstancesOutput, error) { - return utils.NATSRequestCtx[FinalizeSpreadInstancesOutput](ctx, s.natsConn, "ec2.FinalizeSpreadInstances", input, 30*time.Second, accountID) + return utils.NATSRequest[FinalizeSpreadInstancesOutput](ctx, s.natsConn, "ec2.FinalizeSpreadInstances", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) ReleaseSpreadNodes(ctx context.Context, input *ReleaseSpreadNodesInput, accountID string) (*ReleaseSpreadNodesOutput, error) { - return utils.NATSRequestCtx[ReleaseSpreadNodesOutput](ctx, s.natsConn, "ec2.ReleaseSpreadNodes", input, 30*time.Second, accountID) + return utils.NATSRequest[ReleaseSpreadNodesOutput](ctx, s.natsConn, "ec2.ReleaseSpreadNodes", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) RemoveInstance(ctx context.Context, input *RemoveInstanceInput, accountID string) (*RemoveInstanceOutput, error) { - return utils.NATSRequestCtx[RemoveInstanceOutput](ctx, s.natsConn, "ec2.RemoveInstanceFromPlacementGroup", input, 30*time.Second, accountID) + return utils.NATSRequest[RemoveInstanceOutput](ctx, s.natsConn, "ec2.RemoveInstanceFromPlacementGroup", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) ReserveClusterNode(ctx context.Context, input *ReserveClusterNodeInput, accountID string) (*ReserveClusterNodeOutput, error) { - return utils.NATSRequestCtx[ReserveClusterNodeOutput](ctx, s.natsConn, "ec2.ReserveClusterNode", input, 30*time.Second, accountID) + return utils.NATSRequest[ReserveClusterNodeOutput](ctx, s.natsConn, "ec2.ReserveClusterNode", input, 30*time.Second, accountID) } func (s *NATSPlacementGroupService) FinalizeClusterInstances(ctx context.Context, input *FinalizeClusterInstancesInput, accountID string) (*FinalizeClusterInstancesOutput, error) { - return utils.NATSRequestCtx[FinalizeClusterInstancesOutput](ctx, s.natsConn, "ec2.FinalizeClusterInstances", input, 30*time.Second, accountID) + return utils.NATSRequest[FinalizeClusterInstancesOutput](ctx, s.natsConn, "ec2.FinalizeClusterInstances", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/routetable/service_nats.go b/spinifex/handlers/ec2/routetable/service_nats.go index eded7e3be..81d08f8f6 100644 --- a/spinifex/handlers/ec2/routetable/service_nats.go +++ b/spinifex/handlers/ec2/routetable/service_nats.go @@ -23,37 +23,37 @@ func NewNATSRouteTableService(conn *nats.Conn) RouteTableService { } func (s *NATSRouteTableService) CreateRouteTable(ctx context.Context, input *ec2.CreateRouteTableInput, accountID string) (*ec2.CreateRouteTableOutput, error) { - return utils.NATSRequestCtx[ec2.CreateRouteTableOutput](ctx, s.natsConn, "ec2.CreateRouteTable", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateRouteTableOutput](ctx, s.natsConn, "ec2.CreateRouteTable", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) DeleteRouteTable(ctx context.Context, input *ec2.DeleteRouteTableInput, accountID string) (*ec2.DeleteRouteTableOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteRouteTableOutput](ctx, s.natsConn, "ec2.DeleteRouteTable", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteRouteTableOutput](ctx, s.natsConn, "ec2.DeleteRouteTable", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) DescribeRouteTables(ctx context.Context, input *ec2.DescribeRouteTablesInput, accountID string) (*ec2.DescribeRouteTablesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeRouteTablesOutput](ctx, s.natsConn, "ec2.DescribeRouteTables", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeRouteTablesOutput](ctx, s.natsConn, "ec2.DescribeRouteTables", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) CreateRoute(ctx context.Context, input *ec2.CreateRouteInput, accountID string) (*ec2.CreateRouteOutput, error) { - return utils.NATSRequestCtx[ec2.CreateRouteOutput](ctx, s.natsConn, "ec2.CreateRoute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateRouteOutput](ctx, s.natsConn, "ec2.CreateRoute", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) DeleteRoute(ctx context.Context, input *ec2.DeleteRouteInput, accountID string) (*ec2.DeleteRouteOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteRouteOutput](ctx, s.natsConn, "ec2.DeleteRoute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteRouteOutput](ctx, s.natsConn, "ec2.DeleteRoute", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) ReplaceRoute(ctx context.Context, input *ec2.ReplaceRouteInput, accountID string) (*ec2.ReplaceRouteOutput, error) { - return utils.NATSRequestCtx[ec2.ReplaceRouteOutput](ctx, s.natsConn, "ec2.ReplaceRoute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ReplaceRouteOutput](ctx, s.natsConn, "ec2.ReplaceRoute", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) AssociateRouteTable(ctx context.Context, input *ec2.AssociateRouteTableInput, accountID string) (*ec2.AssociateRouteTableOutput, error) { - return utils.NATSRequestCtx[ec2.AssociateRouteTableOutput](ctx, s.natsConn, "ec2.AssociateRouteTable", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AssociateRouteTableOutput](ctx, s.natsConn, "ec2.AssociateRouteTable", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) DisassociateRouteTable(ctx context.Context, input *ec2.DisassociateRouteTableInput, accountID string) (*ec2.DisassociateRouteTableOutput, error) { - return utils.NATSRequestCtx[ec2.DisassociateRouteTableOutput](ctx, s.natsConn, "ec2.DisassociateRouteTable", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DisassociateRouteTableOutput](ctx, s.natsConn, "ec2.DisassociateRouteTable", input, 30*time.Second, accountID) } func (s *NATSRouteTableService) ReplaceRouteTableAssociation(ctx context.Context, input *ec2.ReplaceRouteTableAssociationInput, accountID string) (*ec2.ReplaceRouteTableAssociationOutput, error) { - return utils.NATSRequestCtx[ec2.ReplaceRouteTableAssociationOutput](ctx, s.natsConn, "ec2.ReplaceRouteTableAssociation", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ReplaceRouteTableAssociationOutput](ctx, s.natsConn, "ec2.ReplaceRouteTableAssociation", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/snapshot/service_nats.go b/spinifex/handlers/ec2/snapshot/service_nats.go index 704977ed9..59966a188 100644 --- a/spinifex/handlers/ec2/snapshot/service_nats.go +++ b/spinifex/handlers/ec2/snapshot/service_nats.go @@ -22,17 +22,17 @@ func NewNATSSnapshotService(conn *nats.Conn) SnapshotService { } func (s *NATSSnapshotService) CreateSnapshot(ctx context.Context, input *ec2.CreateSnapshotInput, accountID string) (*ec2.Snapshot, error) { - return utils.NATSRequestCtx[ec2.Snapshot](ctx, s.natsConn, "ec2.CreateSnapshot", input, 120*time.Second, accountID) + return utils.NATSRequest[ec2.Snapshot](ctx, s.natsConn, "ec2.CreateSnapshot", input, 120*time.Second, accountID) } func (s *NATSSnapshotService) DescribeSnapshots(ctx context.Context, input *ec2.DescribeSnapshotsInput, accountID string) (*ec2.DescribeSnapshotsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeSnapshotsOutput](ctx, s.natsConn, "ec2.DescribeSnapshots", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeSnapshotsOutput](ctx, s.natsConn, "ec2.DescribeSnapshots", input, 30*time.Second, accountID) } func (s *NATSSnapshotService) DeleteSnapshot(ctx context.Context, input *ec2.DeleteSnapshotInput, accountID string) (*ec2.DeleteSnapshotOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteSnapshotOutput](ctx, s.natsConn, "ec2.DeleteSnapshot", input, 60*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteSnapshotOutput](ctx, s.natsConn, "ec2.DeleteSnapshot", input, 60*time.Second, accountID) } func (s *NATSSnapshotService) CopySnapshot(ctx context.Context, input *ec2.CopySnapshotInput, accountID string) (*ec2.CopySnapshotOutput, error) { - return utils.NATSRequestCtx[ec2.CopySnapshotOutput](ctx, s.natsConn, "ec2.CopySnapshot", input, 120*time.Second, accountID) + return utils.NATSRequest[ec2.CopySnapshotOutput](ctx, s.natsConn, "ec2.CopySnapshot", input, 120*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/spotinstance/service_nats.go b/spinifex/handlers/ec2/spotinstance/service_nats.go index 38aa3f939..9eaa54356 100644 --- a/spinifex/handlers/ec2/spotinstance/service_nats.go +++ b/spinifex/handlers/ec2/spotinstance/service_nats.go @@ -23,13 +23,13 @@ func NewNATSSpotInstanceService(conn *nats.Conn) *NATSSpotInstanceService { } func (s *NATSSpotInstanceService) PutSpotInstanceRequests(ctx context.Context, input *PutSpotRequestsInput, accountID string) (*PutSpotRequestsOutput, error) { - return utils.NATSRequestCtx[PutSpotRequestsOutput](ctx, s.natsConn, "ec2.PutSpotInstanceRequests", input, 30*time.Second, accountID) + return utils.NATSRequest[PutSpotRequestsOutput](ctx, s.natsConn, "ec2.PutSpotInstanceRequests", input, 30*time.Second, accountID) } func (s *NATSSpotInstanceService) DescribeSpotInstanceRequests(ctx context.Context, input *ec2.DescribeSpotInstanceRequestsInput, accountID string) (*ec2.DescribeSpotInstanceRequestsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeSpotInstanceRequestsOutput](ctx, s.natsConn, "ec2.DescribeSpotInstanceRequests", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeSpotInstanceRequestsOutput](ctx, s.natsConn, "ec2.DescribeSpotInstanceRequests", input, 30*time.Second, accountID) } func (s *NATSSpotInstanceService) CancelSpotInstanceRequests(ctx context.Context, input *ec2.CancelSpotInstanceRequestsInput, accountID string) (*ec2.CancelSpotInstanceRequestsOutput, error) { - return utils.NATSRequestCtx[ec2.CancelSpotInstanceRequestsOutput](ctx, s.natsConn, "ec2.CancelSpotInstanceRequests", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CancelSpotInstanceRequestsOutput](ctx, s.natsConn, "ec2.CancelSpotInstanceRequests", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/tags/service_nats.go b/spinifex/handlers/ec2/tags/service_nats.go index 5657c0f6b..7fcd764be 100644 --- a/spinifex/handlers/ec2/tags/service_nats.go +++ b/spinifex/handlers/ec2/tags/service_nats.go @@ -22,13 +22,13 @@ func NewNATSTagsService(conn *nats.Conn) TagsService { } func (s *NATSTagsService) CreateTags(ctx context.Context, input *ec2.CreateTagsInput, accountID string) (*ec2.CreateTagsOutput, error) { - return utils.NATSRequestCtx[ec2.CreateTagsOutput](ctx, s.natsConn, "ec2.CreateTags", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateTagsOutput](ctx, s.natsConn, "ec2.CreateTags", input, 30*time.Second, accountID) } func (s *NATSTagsService) DescribeTags(ctx context.Context, input *ec2.DescribeTagsInput, accountID string) (*ec2.DescribeTagsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeTagsOutput](ctx, s.natsConn, "ec2.DescribeTags", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeTagsOutput](ctx, s.natsConn, "ec2.DescribeTags", input, 30*time.Second, accountID) } func (s *NATSTagsService) DeleteTags(ctx context.Context, input *ec2.DeleteTagsInput, accountID string) (*ec2.DeleteTagsOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteTagsOutput](ctx, s.natsConn, "ec2.DeleteTags", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteTagsOutput](ctx, s.natsConn, "ec2.DeleteTags", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/volume/service_impl.go b/spinifex/handlers/ec2/volume/service_impl.go index 45764ac40..d1b9a0295 100644 --- a/spinifex/handlers/ec2/volume/service_impl.go +++ b/spinifex/handlers/ec2/volume/service_impl.go @@ -1216,7 +1216,7 @@ func (s *VolumeServiceImpl) putVolumeConfigViaDetached(ctx context.Context, volu return fmt.Errorf("marshal VolumeConfig: %w", err) } req := types.EBSConfigUpdateRequest{Volume: volumeID, VolumeConfig: cfgData} - resp, err := utils.NATSRequestCtx[types.EBSConfigUpdateResponse](ctx, s.natsConn, "ebs.config", req, 30*time.Second, "") + resp, err := utils.NATSRequest[types.EBSConfigUpdateResponse](ctx, s.natsConn, "ebs.config", req, 30*time.Second, "") if err != nil { return fmt.Errorf("ebs.config request for %s: %w", volumeID, err) } @@ -1446,7 +1446,7 @@ func (s *VolumeServiceImpl) DeleteVolume(ctx context.Context, input *ec2.DeleteV // Notify viperblockd to stop nbdkit/WAL syncer (best-effort) if s.natsConn != nil { deleteReq := types.EBSDeleteRequest{Volume: volumeID} - deleteResp, err := utils.NATSRequestCtx[types.EBSDeleteResponse](ctx, s.natsConn, "ebs.delete", deleteReq, 5*time.Second, accountID) + deleteResp, err := utils.NATSRequest[types.EBSDeleteResponse](ctx, s.natsConn, "ebs.delete", deleteReq, 5*time.Second, accountID) if err != nil { slog.WarnContext(ctx, "ebs.delete notification failed (volume may not be mounted)", "volumeId", volumeID, "err", err) } else if deleteResp.Error != "" { diff --git a/spinifex/handlers/ec2/volume/service_nats.go b/spinifex/handlers/ec2/volume/service_nats.go index 716814efa..47c6db656 100644 --- a/spinifex/handlers/ec2/volume/service_nats.go +++ b/spinifex/handlers/ec2/volume/service_nats.go @@ -22,25 +22,25 @@ func NewNATSVolumeService(conn *nats.Conn) VolumeService { } func (s *NATSVolumeService) CreateVolume(ctx context.Context, input *ec2.CreateVolumeInput, accountID string) (*ec2.Volume, error) { - return utils.NATSRequestCtx[ec2.Volume](ctx, s.natsConn, "ec2.CreateVolume", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.Volume](ctx, s.natsConn, "ec2.CreateVolume", input, 30*time.Second, accountID) } func (s *NATSVolumeService) DescribeVolumes(ctx context.Context, input *ec2.DescribeVolumesInput, accountID string) (*ec2.DescribeVolumesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeVolumesOutput](ctx, s.natsConn, "ec2.DescribeVolumes", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeVolumesOutput](ctx, s.natsConn, "ec2.DescribeVolumes", input, 30*time.Second, accountID) } func (s *NATSVolumeService) ModifyVolume(ctx context.Context, input *ec2.ModifyVolumeInput, accountID string) (*ec2.ModifyVolumeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyVolumeOutput](ctx, s.natsConn, "ec2.ModifyVolume", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyVolumeOutput](ctx, s.natsConn, "ec2.ModifyVolume", input, 30*time.Second, accountID) } func (s *NATSVolumeService) DescribeVolumeStatus(ctx context.Context, input *ec2.DescribeVolumeStatusInput, accountID string) (*ec2.DescribeVolumeStatusOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeVolumeStatusOutput](ctx, s.natsConn, "ec2.DescribeVolumeStatus", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeVolumeStatusOutput](ctx, s.natsConn, "ec2.DescribeVolumeStatus", input, 30*time.Second, accountID) } func (s *NATSVolumeService) DescribeVolumesModifications(ctx context.Context, input *ec2.DescribeVolumesModificationsInput, accountID string) (*ec2.DescribeVolumesModificationsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeVolumesModificationsOutput](ctx, s.natsConn, "ec2.DescribeVolumesModifications", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeVolumesModificationsOutput](ctx, s.natsConn, "ec2.DescribeVolumesModifications", input, 30*time.Second, accountID) } func (s *NATSVolumeService) DeleteVolume(ctx context.Context, input *ec2.DeleteVolumeInput, accountID string) (*ec2.DeleteVolumeOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteVolumeOutput](ctx, s.natsConn, "ec2.DeleteVolume", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteVolumeOutput](ctx, s.natsConn, "ec2.DeleteVolume", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ec2/vpc/service_nats.go b/spinifex/handlers/ec2/vpc/service_nats.go index 194a53c3c..b3e65a58d 100644 --- a/spinifex/handlers/ec2/vpc/service_nats.go +++ b/spinifex/handlers/ec2/vpc/service_nats.go @@ -22,85 +22,85 @@ func NewNATSVPCService(conn *nats.Conn) VPCService { } func (s *NATSVPCService) CreateVpc(ctx context.Context, input *ec2.CreateVpcInput, accountID string) (*ec2.CreateVpcOutput, error) { - return utils.NATSRequestCtx[ec2.CreateVpcOutput](ctx, s.natsConn, "ec2.CreateVpc", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateVpcOutput](ctx, s.natsConn, "ec2.CreateVpc", input, 30*time.Second, accountID) } func (s *NATSVPCService) DeleteVpc(ctx context.Context, input *ec2.DeleteVpcInput, accountID string) (*ec2.DeleteVpcOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteVpcOutput](ctx, s.natsConn, "ec2.DeleteVpc", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteVpcOutput](ctx, s.natsConn, "ec2.DeleteVpc", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeVpcs(ctx context.Context, input *ec2.DescribeVpcsInput, accountID string) (*ec2.DescribeVpcsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeVpcsOutput](ctx, s.natsConn, "ec2.DescribeVpcs", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeVpcsOutput](ctx, s.natsConn, "ec2.DescribeVpcs", input, 30*time.Second, accountID) } func (s *NATSVPCService) CreateSubnet(ctx context.Context, input *ec2.CreateSubnetInput, accountID string) (*ec2.CreateSubnetOutput, error) { - return utils.NATSRequestCtx[ec2.CreateSubnetOutput](ctx, s.natsConn, "ec2.CreateSubnet", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateSubnetOutput](ctx, s.natsConn, "ec2.CreateSubnet", input, 30*time.Second, accountID) } func (s *NATSVPCService) DeleteSubnet(ctx context.Context, input *ec2.DeleteSubnetInput, accountID string) (*ec2.DeleteSubnetOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteSubnetOutput](ctx, s.natsConn, "ec2.DeleteSubnet", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteSubnetOutput](ctx, s.natsConn, "ec2.DeleteSubnet", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeSubnets(ctx context.Context, input *ec2.DescribeSubnetsInput, accountID string) (*ec2.DescribeSubnetsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeSubnetsOutput](ctx, s.natsConn, "ec2.DescribeSubnets", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeSubnetsOutput](ctx, s.natsConn, "ec2.DescribeSubnets", input, 30*time.Second, accountID) } func (s *NATSVPCService) ModifySubnetAttribute(ctx context.Context, input *ec2.ModifySubnetAttributeInput, accountID string) (*ec2.ModifySubnetAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifySubnetAttributeOutput](ctx, s.natsConn, "ec2.ModifySubnetAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifySubnetAttributeOutput](ctx, s.natsConn, "ec2.ModifySubnetAttribute", input, 30*time.Second, accountID) } func (s *NATSVPCService) ModifyVpcAttribute(ctx context.Context, input *ec2.ModifyVpcAttributeInput, accountID string) (*ec2.ModifyVpcAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyVpcAttributeOutput](ctx, s.natsConn, "ec2.ModifyVpcAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyVpcAttributeOutput](ctx, s.natsConn, "ec2.ModifyVpcAttribute", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeVpcAttribute(ctx context.Context, input *ec2.DescribeVpcAttributeInput, accountID string) (*ec2.DescribeVpcAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeVpcAttributeOutput](ctx, s.natsConn, "ec2.DescribeVpcAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeVpcAttributeOutput](ctx, s.natsConn, "ec2.DescribeVpcAttribute", input, 30*time.Second, accountID) } func (s *NATSVPCService) CreateNetworkInterface(ctx context.Context, input *ec2.CreateNetworkInterfaceInput, accountID string) (*ec2.CreateNetworkInterfaceOutput, error) { - return utils.NATSRequestCtx[ec2.CreateNetworkInterfaceOutput](ctx, s.natsConn, "ec2.CreateNetworkInterface", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateNetworkInterfaceOutput](ctx, s.natsConn, "ec2.CreateNetworkInterface", input, 30*time.Second, accountID) } func (s *NATSVPCService) DeleteNetworkInterface(ctx context.Context, input *ec2.DeleteNetworkInterfaceInput, accountID string) (*ec2.DeleteNetworkInterfaceOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteNetworkInterfaceOutput](ctx, s.natsConn, "ec2.DeleteNetworkInterface", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteNetworkInterfaceOutput](ctx, s.natsConn, "ec2.DeleteNetworkInterface", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeNetworkInterfaces(ctx context.Context, input *ec2.DescribeNetworkInterfacesInput, accountID string) (*ec2.DescribeNetworkInterfacesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeNetworkInterfacesOutput](ctx, s.natsConn, "ec2.DescribeNetworkInterfaces", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeNetworkInterfacesOutput](ctx, s.natsConn, "ec2.DescribeNetworkInterfaces", input, 30*time.Second, accountID) } func (s *NATSVPCService) ModifyNetworkInterfaceAttribute(ctx context.Context, input *ec2.ModifyNetworkInterfaceAttributeInput, accountID string) (*ec2.ModifyNetworkInterfaceAttributeOutput, error) { - return utils.NATSRequestCtx[ec2.ModifyNetworkInterfaceAttributeOutput](ctx, s.natsConn, "ec2.ModifyNetworkInterfaceAttribute", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.ModifyNetworkInterfaceAttributeOutput](ctx, s.natsConn, "ec2.ModifyNetworkInterfaceAttribute", input, 30*time.Second, accountID) } func (s *NATSVPCService) CreateSecurityGroup(ctx context.Context, input *ec2.CreateSecurityGroupInput, accountID string) (*ec2.CreateSecurityGroupOutput, error) { - return utils.NATSRequestCtx[ec2.CreateSecurityGroupOutput](ctx, s.natsConn, "ec2.CreateSecurityGroup", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.CreateSecurityGroupOutput](ctx, s.natsConn, "ec2.CreateSecurityGroup", input, 30*time.Second, accountID) } func (s *NATSVPCService) DeleteSecurityGroup(ctx context.Context, input *ec2.DeleteSecurityGroupInput, accountID string) (*ec2.DeleteSecurityGroupOutput, error) { - return utils.NATSRequestCtx[ec2.DeleteSecurityGroupOutput](ctx, s.natsConn, "ec2.DeleteSecurityGroup", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DeleteSecurityGroupOutput](ctx, s.natsConn, "ec2.DeleteSecurityGroup", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeSecurityGroups(ctx context.Context, input *ec2.DescribeSecurityGroupsInput, accountID string) (*ec2.DescribeSecurityGroupsOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeSecurityGroupsOutput](ctx, s.natsConn, "ec2.DescribeSecurityGroups", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeSecurityGroupsOutput](ctx, s.natsConn, "ec2.DescribeSecurityGroups", input, 30*time.Second, accountID) } func (s *NATSVPCService) DescribeSecurityGroupRules(ctx context.Context, input *ec2.DescribeSecurityGroupRulesInput, accountID string) (*ec2.DescribeSecurityGroupRulesOutput, error) { - return utils.NATSRequestCtx[ec2.DescribeSecurityGroupRulesOutput](ctx, s.natsConn, "ec2.DescribeSecurityGroupRules", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.DescribeSecurityGroupRulesOutput](ctx, s.natsConn, "ec2.DescribeSecurityGroupRules", input, 30*time.Second, accountID) } func (s *NATSVPCService) AuthorizeSecurityGroupIngress(ctx context.Context, input *ec2.AuthorizeSecurityGroupIngressInput, accountID string) (*ec2.AuthorizeSecurityGroupIngressOutput, error) { - return utils.NATSRequestCtx[ec2.AuthorizeSecurityGroupIngressOutput](ctx, s.natsConn, "ec2.AuthorizeSecurityGroupIngress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AuthorizeSecurityGroupIngressOutput](ctx, s.natsConn, "ec2.AuthorizeSecurityGroupIngress", input, 30*time.Second, accountID) } func (s *NATSVPCService) AuthorizeSecurityGroupEgress(ctx context.Context, input *ec2.AuthorizeSecurityGroupEgressInput, accountID string) (*ec2.AuthorizeSecurityGroupEgressOutput, error) { - return utils.NATSRequestCtx[ec2.AuthorizeSecurityGroupEgressOutput](ctx, s.natsConn, "ec2.AuthorizeSecurityGroupEgress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.AuthorizeSecurityGroupEgressOutput](ctx, s.natsConn, "ec2.AuthorizeSecurityGroupEgress", input, 30*time.Second, accountID) } func (s *NATSVPCService) RevokeSecurityGroupIngress(ctx context.Context, input *ec2.RevokeSecurityGroupIngressInput, accountID string) (*ec2.RevokeSecurityGroupIngressOutput, error) { - return utils.NATSRequestCtx[ec2.RevokeSecurityGroupIngressOutput](ctx, s.natsConn, "ec2.RevokeSecurityGroupIngress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.RevokeSecurityGroupIngressOutput](ctx, s.natsConn, "ec2.RevokeSecurityGroupIngress", input, 30*time.Second, accountID) } func (s *NATSVPCService) RevokeSecurityGroupEgress(ctx context.Context, input *ec2.RevokeSecurityGroupEgressInput, accountID string) (*ec2.RevokeSecurityGroupEgressOutput, error) { - return utils.NATSRequestCtx[ec2.RevokeSecurityGroupEgressOutput](ctx, s.natsConn, "ec2.RevokeSecurityGroupEgress", input, 30*time.Second, accountID) + return utils.NATSRequest[ec2.RevokeSecurityGroupEgressOutput](ctx, s.natsConn, "ec2.RevokeSecurityGroupEgress", input, 30*time.Second, accountID) } diff --git a/spinifex/handlers/ecr/meta_nats.go b/spinifex/handlers/ecr/meta_nats.go index 4ca9fd2f2..ea0940925 100644 --- a/spinifex/handlers/ecr/meta_nats.go +++ b/spinifex/handlers/ecr/meta_nats.go @@ -26,12 +26,12 @@ func NewNATSMetaStore(conn *nats.Conn) *NATSMetaStore { } func (s *NATSMetaStore) PutRepo(ctx context.Context, accountID string, meta RepoMeta) error { - _, err := utils.NATSRequestCtx[RepoCreateResponse](ctx, s.conn, SubjectRepoCreate, &RepoCreateRequest{Meta: meta}, metaRequestTimeout, accountID) + _, err := utils.NATSRequest[RepoCreateResponse](ctx, s.conn, SubjectRepoCreate, &RepoCreateRequest{Meta: meta}, metaRequestTimeout, accountID) return err } func (s *NATSMetaStore) GetRepo(ctx context.Context, accountID, repo string) (RepoMeta, error) { - resp, err := utils.NATSRequestCtx[RepoDescribeResponse](ctx, s.conn, SubjectRepoDescribe, &RepoDescribeRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[RepoDescribeResponse](ctx, s.conn, SubjectRepoDescribe, &RepoDescribeRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return RepoMeta{}, err } @@ -42,7 +42,7 @@ func (s *NATSMetaStore) GetRepo(ctx context.Context, accountID, repo string) (Re } func (s *NATSMetaStore) ListRepos(ctx context.Context, accountID string) ([]string, error) { - resp, err := utils.NATSRequestCtx[RepoListResponse](ctx, s.conn, SubjectRepoList, &RepoListRequest{}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[RepoListResponse](ctx, s.conn, SubjectRepoList, &RepoListRequest{}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -50,7 +50,7 @@ func (s *NATSMetaStore) ListRepos(ctx context.Context, accountID string) ([]stri } func (s *NATSMetaStore) DeleteRepo(ctx context.Context, accountID, repo string) error { - resp, err := utils.NATSRequestCtx[RepoDeleteResponse](ctx, s.conn, SubjectRepoDelete, &RepoDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[RepoDeleteResponse](ctx, s.conn, SubjectRepoDelete, &RepoDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return err } @@ -61,7 +61,7 @@ func (s *NATSMetaStore) DeleteRepo(ctx context.Context, accountID, repo string) } func (s *NATSMetaStore) ListManifests(ctx context.Context, accountID, repo string) ([]string, error) { - resp, err := utils.NATSRequestCtx[ManifestListResponse](ctx, s.conn, SubjectManifestList, &ManifestListRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[ManifestListResponse](ctx, s.conn, SubjectManifestList, &ManifestListRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -69,12 +69,12 @@ func (s *NATSMetaStore) ListManifests(ctx context.Context, accountID, repo strin } func (s *NATSMetaStore) PutRepoPolicy(ctx context.Context, accountID, repo string, policyText []byte) error { - _, err := utils.NATSRequestCtx[PolicyPutResponse](ctx, s.conn, SubjectPolicyPut, &PolicyPutRequest{Repo: repo, PolicyText: policyText}, metaRequestTimeout, accountID) + _, err := utils.NATSRequest[PolicyPutResponse](ctx, s.conn, SubjectPolicyPut, &PolicyPutRequest{Repo: repo, PolicyText: policyText}, metaRequestTimeout, accountID) return err } func (s *NATSMetaStore) GetRepoPolicy(ctx context.Context, accountID, repo string) ([]byte, error) { - resp, err := utils.NATSRequestCtx[PolicyGetResponse](ctx, s.conn, SubjectPolicyGet, &PolicyGetRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[PolicyGetResponse](ctx, s.conn, SubjectPolicyGet, &PolicyGetRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -85,7 +85,7 @@ func (s *NATSMetaStore) GetRepoPolicy(ctx context.Context, accountID, repo strin } func (s *NATSMetaStore) DeleteRepoPolicy(ctx context.Context, accountID, repo string) ([]byte, error) { - resp, err := utils.NATSRequestCtx[PolicyDeleteResponse](ctx, s.conn, SubjectPolicyDelete, &PolicyDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[PolicyDeleteResponse](ctx, s.conn, SubjectPolicyDelete, &PolicyDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -96,12 +96,12 @@ func (s *NATSMetaStore) DeleteRepoPolicy(ctx context.Context, accountID, repo st } func (s *NATSMetaStore) PutLifecyclePolicy(ctx context.Context, accountID, repo string, policyText []byte) error { - _, err := utils.NATSRequestCtx[LifecyclePutResponse](ctx, s.conn, SubjectLifecyclePut, &LifecyclePutRequest{Repo: repo, PolicyText: policyText}, metaRequestTimeout, accountID) + _, err := utils.NATSRequest[LifecyclePutResponse](ctx, s.conn, SubjectLifecyclePut, &LifecyclePutRequest{Repo: repo, PolicyText: policyText}, metaRequestTimeout, accountID) return err } func (s *NATSMetaStore) GetLifecyclePolicy(ctx context.Context, accountID, repo string) ([]byte, error) { - resp, err := utils.NATSRequestCtx[LifecycleGetResponse](ctx, s.conn, SubjectLifecycleGet, &LifecycleGetRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[LifecycleGetResponse](ctx, s.conn, SubjectLifecycleGet, &LifecycleGetRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func (s *NATSMetaStore) GetLifecyclePolicy(ctx context.Context, accountID, repo } func (s *NATSMetaStore) DeleteLifecyclePolicy(ctx context.Context, accountID, repo string) ([]byte, error) { - resp, err := utils.NATSRequestCtx[LifecycleDeleteResponse](ctx, s.conn, SubjectLifecycleDelete, &LifecycleDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[LifecycleDeleteResponse](ctx, s.conn, SubjectLifecycleDelete, &LifecycleDeleteRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -123,12 +123,12 @@ func (s *NATSMetaStore) DeleteLifecyclePolicy(ctx context.Context, accountID, re } func (s *NATSMetaStore) PutTag(ctx context.Context, accountID, repo, tag, digest string) error { - _, err := utils.NATSRequestCtx[TagPutResponse](ctx, s.conn, SubjectTagPut, &TagPutRequest{Repo: repo, Tag: tag, Digest: digest}, metaRequestTimeout, accountID) + _, err := utils.NATSRequest[TagPutResponse](ctx, s.conn, SubjectTagPut, &TagPutRequest{Repo: repo, Tag: tag, Digest: digest}, metaRequestTimeout, accountID) return err } func (s *NATSMetaStore) GetTag(ctx context.Context, accountID, repo, tag string) (string, error) { - resp, err := utils.NATSRequestCtx[TagGetResponse](ctx, s.conn, SubjectTagGet, &TagGetRequest{Repo: repo, Tag: tag}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[TagGetResponse](ctx, s.conn, SubjectTagGet, &TagGetRequest{Repo: repo, Tag: tag}, metaRequestTimeout, accountID) if err != nil { return "", err } @@ -139,7 +139,7 @@ func (s *NATSMetaStore) GetTag(ctx context.Context, accountID, repo, tag string) } func (s *NATSMetaStore) DeleteTag(ctx context.Context, accountID, repo, tag string) error { - resp, err := utils.NATSRequestCtx[TagDeleteResponse](ctx, s.conn, SubjectTagDelete, &TagDeleteRequest{Repo: repo, Tag: tag}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[TagDeleteResponse](ctx, s.conn, SubjectTagDelete, &TagDeleteRequest{Repo: repo, Tag: tag}, metaRequestTimeout, accountID) if err != nil { return err } @@ -150,7 +150,7 @@ func (s *NATSMetaStore) DeleteTag(ctx context.Context, accountID, repo, tag stri } func (s *NATSMetaStore) ListTags(ctx context.Context, accountID, repo string) ([]string, error) { - resp, err := utils.NATSRequestCtx[TagListResponse](ctx, s.conn, SubjectTagList, &TagListRequest{Repo: repo}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[TagListResponse](ctx, s.conn, SubjectTagList, &TagListRequest{Repo: repo}, metaRequestTimeout, accountID) if err != nil { return nil, err } @@ -158,12 +158,12 @@ func (s *NATSMetaStore) ListTags(ctx context.Context, accountID, repo string) ([ } func (s *NATSMetaStore) PutManifestMeta(ctx context.Context, accountID, repo string, meta ManifestMeta) error { - _, err := utils.NATSRequestCtx[ManifestPutResponse](ctx, s.conn, SubjectManifestPut, &ManifestPutRequest{Repo: repo, Meta: meta}, metaRequestTimeout, accountID) + _, err := utils.NATSRequest[ManifestPutResponse](ctx, s.conn, SubjectManifestPut, &ManifestPutRequest{Repo: repo, Meta: meta}, metaRequestTimeout, accountID) return err } func (s *NATSMetaStore) GetManifestMeta(ctx context.Context, accountID, repo, digest string) (ManifestMeta, error) { - resp, err := utils.NATSRequestCtx[ManifestDescribeResponse](ctx, s.conn, SubjectManifestDescribe, &ManifestDescribeRequest{Repo: repo, Digest: digest}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[ManifestDescribeResponse](ctx, s.conn, SubjectManifestDescribe, &ManifestDescribeRequest{Repo: repo, Digest: digest}, metaRequestTimeout, accountID) if err != nil { return ManifestMeta{}, err } @@ -174,7 +174,7 @@ func (s *NATSMetaStore) GetManifestMeta(ctx context.Context, accountID, repo, di } func (s *NATSMetaStore) DeleteManifestMeta(ctx context.Context, accountID, repo, digest string) error { - resp, err := utils.NATSRequestCtx[ManifestDeleteResponse](ctx, s.conn, SubjectManifestDelete, &ManifestDeleteRequest{Repo: repo, Digest: digest}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[ManifestDeleteResponse](ctx, s.conn, SubjectManifestDelete, &ManifestDeleteRequest{Repo: repo, Digest: digest}, metaRequestTimeout, accountID) if err != nil { return err } @@ -185,7 +185,7 @@ func (s *NATSMetaStore) DeleteManifestMeta(ctx context.Context, accountID, repo, } func (s *NATSMetaStore) PutUpload(ctx context.Context, accountID, uploadID string, state UploadState) (uint64, error) { - resp, err := utils.NATSRequestCtx[UploadCreateResponse](ctx, s.conn, SubjectUploadCreate, &UploadCreateRequest{UploadID: uploadID, State: state}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[UploadCreateResponse](ctx, s.conn, SubjectUploadCreate, &UploadCreateRequest{UploadID: uploadID, State: state}, metaRequestTimeout, accountID) if err != nil { return 0, err } @@ -193,7 +193,7 @@ func (s *NATSMetaStore) PutUpload(ctx context.Context, accountID, uploadID strin } func (s *NATSMetaStore) GetUpload(ctx context.Context, accountID, uploadID string) (UploadState, uint64, error) { - resp, err := utils.NATSRequestCtx[UploadGetResponse](ctx, s.conn, SubjectUploadGet, &UploadGetRequest{UploadID: uploadID}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[UploadGetResponse](ctx, s.conn, SubjectUploadGet, &UploadGetRequest{UploadID: uploadID}, metaRequestTimeout, accountID) if err != nil { return UploadState{}, 0, err } @@ -204,7 +204,7 @@ func (s *NATSMetaStore) GetUpload(ctx context.Context, accountID, uploadID strin } func (s *NATSMetaStore) UpdateUpload(ctx context.Context, accountID, uploadID string, state UploadState, rev uint64) (uint64, error) { - resp, err := utils.NATSRequestCtx[UploadUpdateResponse](ctx, s.conn, SubjectUploadUpdate, &UploadUpdateRequest{UploadID: uploadID, State: state, Revision: rev}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[UploadUpdateResponse](ctx, s.conn, SubjectUploadUpdate, &UploadUpdateRequest{UploadID: uploadID, State: state, Revision: rev}, metaRequestTimeout, accountID) if err != nil { return 0, err } @@ -218,7 +218,7 @@ func (s *NATSMetaStore) UpdateUpload(ctx context.Context, accountID, uploadID st } func (s *NATSMetaStore) DeleteUpload(ctx context.Context, accountID, uploadID string) error { - resp, err := utils.NATSRequestCtx[UploadDeleteResponse](ctx, s.conn, SubjectUploadDelete, &UploadDeleteRequest{UploadID: uploadID}, metaRequestTimeout, accountID) + resp, err := utils.NATSRequest[UploadDeleteResponse](ctx, s.conn, SubjectUploadDelete, &UploadDeleteRequest{UploadID: uploadID}, metaRequestTimeout, accountID) if err != nil { return err } diff --git a/spinifex/handlers/ecs/eni.go b/spinifex/handlers/ecs/eni.go index d2bbccc6d..f4fa8b352 100644 --- a/spinifex/handlers/ecs/eni.go +++ b/spinifex/handlers/ecs/eni.go @@ -61,7 +61,7 @@ func (c *natsENIController) Allocate(ctx context.Context, accountID, subnetID st Groups: securityGroups, Description: aws.String("ecs-awsvpc-task"), } - out, err := utils.NATSRequestCtx[ec2.CreateNetworkInterfaceOutput](ctx, c.nc, "ec2.CreateNetworkInterface", in, c.timeout, accountID) + out, err := utils.NATSRequest[ec2.CreateNetworkInterfaceOutput](ctx, c.nc, "ec2.CreateNetworkInterface", in, c.timeout, accountID) if err != nil { return eniAllocation{}, fmt.Errorf("create task ENI: %w", err) } @@ -87,7 +87,7 @@ func (c *natsENIController) Attach(ctx context.Context, accountID, instanceID, e DeviceIndex: taskENIDeviceIndex, }, } - out, err := utils.NATSRequestCtx[ec2.AttachNetworkInterfaceOutput](ctx, c.nc, eniCmdSubject(instanceID), cmd, c.timeout, accountID) + out, err := utils.NATSRequest[ec2.AttachNetworkInterfaceOutput](ctx, c.nc, eniCmdSubject(instanceID), cmd, c.timeout, accountID) if err != nil { return "", fmt.Errorf("attach task ENI %s -> %s: %w", eniID, instanceID, err) } @@ -109,14 +109,14 @@ func (c *natsENIController) Release(ctx context.Context, accountID string, rec * Force: true, }, } - _, err := utils.NATSRequestCtx[ec2.DetachNetworkInterfaceOutput](ctx, c.nc, eniCmdSubject(rec.ContainerInstanceID), cmd, c.timeout, accountID) + _, err := utils.NATSRequest[ec2.DetachNetworkInterfaceOutput](ctx, c.nc, eniCmdSubject(rec.ContainerInstanceID), cmd, c.timeout, accountID) if err != nil && !isENINotFound(err) { return fmt.Errorf("detach task ENI %s: %w", rec.ENIID, err) } } del := &ec2.DeleteNetworkInterfaceInput{NetworkInterfaceId: aws.String(rec.ENIID)} - _, err := utils.NATSRequestCtx[ec2.DeleteNetworkInterfaceOutput](ctx, c.nc, "ec2.DeleteNetworkInterface", del, c.timeout, accountID) + _, err := utils.NATSRequest[ec2.DeleteNetworkInterfaceOutput](ctx, c.nc, "ec2.DeleteNetworkInterface", del, c.timeout, accountID) if err != nil && !isENINotFound(err) { return fmt.Errorf("delete task ENI %s: %w", rec.ENIID, err) } diff --git a/spinifex/handlers/ecs/service_nats.go b/spinifex/handlers/ecs/service_nats.go index 8f33e25a8..0e0efecc5 100644 --- a/spinifex/handlers/ecs/service_nats.go +++ b/spinifex/handlers/ecs/service_nats.go @@ -27,115 +27,115 @@ func NewNATSECSService(conn *nats.Conn) ECSService { // --- Cluster --- func (s *NATSECSService) CreateCluster(ctx context.Context, input *ecs.CreateClusterInput, accountID string) (*ecs.CreateClusterOutput, error) { - return utils.NATSRequestCtx[ecs.CreateClusterOutput](ctx, s.natsConn, "ecs.CreateCluster", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.CreateClusterOutput](ctx, s.natsConn, "ecs.CreateCluster", input, defaultTimeout, accountID) } func (s *NATSECSService) DeleteCluster(ctx context.Context, input *ecs.DeleteClusterInput, accountID string) (*ecs.DeleteClusterOutput, error) { - return utils.NATSRequestCtx[ecs.DeleteClusterOutput](ctx, s.natsConn, "ecs.DeleteCluster", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DeleteClusterOutput](ctx, s.natsConn, "ecs.DeleteCluster", input, defaultTimeout, accountID) } func (s *NATSECSService) DescribeClusters(ctx context.Context, input *ecs.DescribeClustersInput, accountID string) (*ecs.DescribeClustersOutput, error) { - return utils.NATSRequestCtx[ecs.DescribeClustersOutput](ctx, s.natsConn, "ecs.DescribeClusters", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DescribeClustersOutput](ctx, s.natsConn, "ecs.DescribeClusters", input, defaultTimeout, accountID) } func (s *NATSECSService) ListClusters(ctx context.Context, input *ecs.ListClustersInput, accountID string) (*ecs.ListClustersOutput, error) { - return utils.NATSRequestCtx[ecs.ListClustersOutput](ctx, s.natsConn, "ecs.ListClusters", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.ListClustersOutput](ctx, s.natsConn, "ecs.ListClusters", input, defaultTimeout, accountID) } // --- Task definition --- func (s *NATSECSService) RegisterTaskDefinition(ctx context.Context, input *ecs.RegisterTaskDefinitionInput, accountID string) (*ecs.RegisterTaskDefinitionOutput, error) { - return utils.NATSRequestCtx[ecs.RegisterTaskDefinitionOutput](ctx, s.natsConn, "ecs.RegisterTaskDefinition", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.RegisterTaskDefinitionOutput](ctx, s.natsConn, "ecs.RegisterTaskDefinition", input, defaultTimeout, accountID) } func (s *NATSECSService) DeregisterTaskDefinition(ctx context.Context, input *ecs.DeregisterTaskDefinitionInput, accountID string) (*ecs.DeregisterTaskDefinitionOutput, error) { - return utils.NATSRequestCtx[ecs.DeregisterTaskDefinitionOutput](ctx, s.natsConn, "ecs.DeregisterTaskDefinition", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DeregisterTaskDefinitionOutput](ctx, s.natsConn, "ecs.DeregisterTaskDefinition", input, defaultTimeout, accountID) } func (s *NATSECSService) DescribeTaskDefinition(ctx context.Context, input *ecs.DescribeTaskDefinitionInput, accountID string) (*ecs.DescribeTaskDefinitionOutput, error) { - return utils.NATSRequestCtx[ecs.DescribeTaskDefinitionOutput](ctx, s.natsConn, "ecs.DescribeTaskDefinition", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DescribeTaskDefinitionOutput](ctx, s.natsConn, "ecs.DescribeTaskDefinition", input, defaultTimeout, accountID) } func (s *NATSECSService) ListTaskDefinitions(ctx context.Context, input *ecs.ListTaskDefinitionsInput, accountID string) (*ecs.ListTaskDefinitionsOutput, error) { - return utils.NATSRequestCtx[ecs.ListTaskDefinitionsOutput](ctx, s.natsConn, "ecs.ListTaskDefinitions", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.ListTaskDefinitionsOutput](ctx, s.natsConn, "ecs.ListTaskDefinitions", input, defaultTimeout, accountID) } // --- Container instance --- func (s *NATSECSService) RegisterContainerInstance(ctx context.Context, input *ecs.RegisterContainerInstanceInput, accountID string) (*ecs.RegisterContainerInstanceOutput, error) { - return utils.NATSRequestCtx[ecs.RegisterContainerInstanceOutput](ctx, s.natsConn, "ecs.RegisterContainerInstance", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.RegisterContainerInstanceOutput](ctx, s.natsConn, "ecs.RegisterContainerInstance", input, defaultTimeout, accountID) } func (s *NATSECSService) DeregisterContainerInstance(ctx context.Context, input *ecs.DeregisterContainerInstanceInput, accountID string) (*ecs.DeregisterContainerInstanceOutput, error) { - return utils.NATSRequestCtx[ecs.DeregisterContainerInstanceOutput](ctx, s.natsConn, "ecs.DeregisterContainerInstance", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DeregisterContainerInstanceOutput](ctx, s.natsConn, "ecs.DeregisterContainerInstance", input, defaultTimeout, accountID) } func (s *NATSECSService) UpdateContainerInstancesState(ctx context.Context, input *ecs.UpdateContainerInstancesStateInput, accountID string) (*ecs.UpdateContainerInstancesStateOutput, error) { - return utils.NATSRequestCtx[ecs.UpdateContainerInstancesStateOutput](ctx, s.natsConn, "ecs.UpdateContainerInstancesState", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.UpdateContainerInstancesStateOutput](ctx, s.natsConn, "ecs.UpdateContainerInstancesState", input, defaultTimeout, accountID) } func (s *NATSECSService) DescribeContainerInstances(ctx context.Context, input *ecs.DescribeContainerInstancesInput, accountID string) (*ecs.DescribeContainerInstancesOutput, error) { - return utils.NATSRequestCtx[ecs.DescribeContainerInstancesOutput](ctx, s.natsConn, "ecs.DescribeContainerInstances", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DescribeContainerInstancesOutput](ctx, s.natsConn, "ecs.DescribeContainerInstances", input, defaultTimeout, accountID) } func (s *NATSECSService) ListContainerInstances(ctx context.Context, input *ecs.ListContainerInstancesInput, accountID string) (*ecs.ListContainerInstancesOutput, error) { - return utils.NATSRequestCtx[ecs.ListContainerInstancesOutput](ctx, s.natsConn, "ecs.ListContainerInstances", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.ListContainerInstancesOutput](ctx, s.natsConn, "ecs.ListContainerInstances", input, defaultTimeout, accountID) } // --- Task --- func (s *NATSECSService) RunTask(ctx context.Context, input *ecs.RunTaskInput, accountID string) (*ecs.RunTaskOutput, error) { - return utils.NATSRequestCtx[ecs.RunTaskOutput](ctx, s.natsConn, "ecs.RunTask", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.RunTaskOutput](ctx, s.natsConn, "ecs.RunTask", input, defaultTimeout, accountID) } func (s *NATSECSService) StartTask(ctx context.Context, input *ecs.StartTaskInput, accountID string) (*ecs.StartTaskOutput, error) { - return utils.NATSRequestCtx[ecs.StartTaskOutput](ctx, s.natsConn, "ecs.StartTask", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.StartTaskOutput](ctx, s.natsConn, "ecs.StartTask", input, defaultTimeout, accountID) } func (s *NATSECSService) StopTask(ctx context.Context, input *ecs.StopTaskInput, accountID string) (*ecs.StopTaskOutput, error) { - return utils.NATSRequestCtx[ecs.StopTaskOutput](ctx, s.natsConn, "ecs.StopTask", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.StopTaskOutput](ctx, s.natsConn, "ecs.StopTask", input, defaultTimeout, accountID) } func (s *NATSECSService) DescribeTasks(ctx context.Context, input *ecs.DescribeTasksInput, accountID string) (*ecs.DescribeTasksOutput, error) { - return utils.NATSRequestCtx[ecs.DescribeTasksOutput](ctx, s.natsConn, "ecs.DescribeTasks", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DescribeTasksOutput](ctx, s.natsConn, "ecs.DescribeTasks", input, defaultTimeout, accountID) } func (s *NATSECSService) ListTasks(ctx context.Context, input *ecs.ListTasksInput, accountID string) (*ecs.ListTasksOutput, error) { - return utils.NATSRequestCtx[ecs.ListTasksOutput](ctx, s.natsConn, "ecs.ListTasks", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.ListTasksOutput](ctx, s.natsConn, "ecs.ListTasks", input, defaultTimeout, accountID) } func (s *NATSECSService) SubmitTaskStateChange(ctx context.Context, input *ecs.SubmitTaskStateChangeInput, accountID string) (*ecs.SubmitTaskStateChangeOutput, error) { - return utils.NATSRequestCtx[ecs.SubmitTaskStateChangeOutput](ctx, s.natsConn, "ecs.SubmitTaskStateChange", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.SubmitTaskStateChangeOutput](ctx, s.natsConn, "ecs.SubmitTaskStateChange", input, defaultTimeout, accountID) } // --- Service --- func (s *NATSECSService) CreateService(ctx context.Context, input *ecs.CreateServiceInput, accountID string) (*ecs.CreateServiceOutput, error) { - return utils.NATSRequestCtx[ecs.CreateServiceOutput](ctx, s.natsConn, "ecs.CreateService", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.CreateServiceOutput](ctx, s.natsConn, "ecs.CreateService", input, defaultTimeout, accountID) } func (s *NATSECSService) UpdateService(ctx context.Context, input *ecs.UpdateServiceInput, accountID string) (*ecs.UpdateServiceOutput, error) { - return utils.NATSRequestCtx[ecs.UpdateServiceOutput](ctx, s.natsConn, "ecs.UpdateService", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.UpdateServiceOutput](ctx, s.natsConn, "ecs.UpdateService", input, defaultTimeout, accountID) } func (s *NATSECSService) DeleteService(ctx context.Context, input *ecs.DeleteServiceInput, accountID string) (*ecs.DeleteServiceOutput, error) { - return utils.NATSRequestCtx[ecs.DeleteServiceOutput](ctx, s.natsConn, "ecs.DeleteService", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DeleteServiceOutput](ctx, s.natsConn, "ecs.DeleteService", input, defaultTimeout, accountID) } func (s *NATSECSService) DescribeServices(ctx context.Context, input *ecs.DescribeServicesInput, accountID string) (*ecs.DescribeServicesOutput, error) { - return utils.NATSRequestCtx[ecs.DescribeServicesOutput](ctx, s.natsConn, "ecs.DescribeServices", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.DescribeServicesOutput](ctx, s.natsConn, "ecs.DescribeServices", input, defaultTimeout, accountID) } func (s *NATSECSService) ListServices(ctx context.Context, input *ecs.ListServicesInput, accountID string) (*ecs.ListServicesOutput, error) { - return utils.NATSRequestCtx[ecs.ListServicesOutput](ctx, s.natsConn, "ecs.ListServices", input, defaultTimeout, accountID) + return utils.NATSRequest[ecs.ListServicesOutput](ctx, s.natsConn, "ecs.ListServices", input, defaultTimeout, accountID) } func (s *NATSECSService) PollAssignments(ctx context.Context, input *PollAssignmentsInput, accountID string) (*PollAssignmentsOutput, error) { - return utils.NATSRequestCtx[PollAssignmentsOutput](ctx, s.natsConn, "ecs.PollAssignments", input, defaultTimeout, accountID) + return utils.NATSRequest[PollAssignmentsOutput](ctx, s.natsConn, "ecs.PollAssignments", input, defaultTimeout, accountID) } // --- Capacity --- func (s *NATSECSService) ProvisionCapacity(ctx context.Context, input *ProvisionCapacityInput, accountID string) (*ProvisionCapacityOutput, error) { - return utils.NATSRequestCtx[ProvisionCapacityOutput](ctx, s.natsConn, "ecs.ProvisionCapacity", input, defaultTimeout, accountID) + return utils.NATSRequest[ProvisionCapacityOutput](ctx, s.natsConn, "ecs.ProvisionCapacity", input, defaultTimeout, accountID) } diff --git a/spinifex/handlers/eks/service_nats.go b/spinifex/handlers/eks/service_nats.go index c5eee693f..d54d92f86 100644 --- a/spinifex/handlers/eks/service_nats.go +++ b/spinifex/handlers/eks/service_nats.go @@ -27,160 +27,160 @@ func NewNATSEKSService(conn *nats.Conn) EKSService { // --- Cluster --- func (s *NATSEKSService) CreateCluster(ctx context.Context, input *eks.CreateClusterInput, accountID, callerPrincipalARN string) (*eks.CreateClusterOutput, error) { - return utils.NATSRequestCtx[eks.CreateClusterOutput](ctx, s.natsConn, "eks.CreateCluster", input, defaultTimeout, accountID, + return utils.NATSRequest[eks.CreateClusterOutput](ctx, s.natsConn, "eks.CreateCluster", input, defaultTimeout, accountID, utils.NATSHeader{Key: utils.PrincipalARNHeader, Value: callerPrincipalARN}) } func (s *NATSEKSService) DescribeCluster(ctx context.Context, input *eks.DescribeClusterInput, accountID string) (*eks.DescribeClusterOutput, error) { - return utils.NATSRequestCtx[eks.DescribeClusterOutput](ctx, s.natsConn, "eks.DescribeCluster", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeClusterOutput](ctx, s.natsConn, "eks.DescribeCluster", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListClusters(ctx context.Context, input *eks.ListClustersInput, accountID string) (*eks.ListClustersOutput, error) { - return utils.NATSRequestCtx[eks.ListClustersOutput](ctx, s.natsConn, "eks.ListClusters", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListClustersOutput](ctx, s.natsConn, "eks.ListClusters", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateClusterConfig(ctx context.Context, input *eks.UpdateClusterConfigInput, accountID string) (*eks.UpdateClusterConfigOutput, error) { - return utils.NATSRequestCtx[eks.UpdateClusterConfigOutput](ctx, s.natsConn, "eks.UpdateClusterConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateClusterConfigOutput](ctx, s.natsConn, "eks.UpdateClusterConfig", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateClusterVersion(ctx context.Context, input *eks.UpdateClusterVersionInput, accountID string) (*eks.UpdateClusterVersionOutput, error) { - return utils.NATSRequestCtx[eks.UpdateClusterVersionOutput](ctx, s.natsConn, "eks.UpdateClusterVersion", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateClusterVersionOutput](ctx, s.natsConn, "eks.UpdateClusterVersion", input, defaultTimeout, accountID) } func (s *NATSEKSService) DeleteCluster(ctx context.Context, input *eks.DeleteClusterInput, accountID string) (*eks.DeleteClusterOutput, error) { - return utils.NATSRequestCtx[eks.DeleteClusterOutput](ctx, s.natsConn, "eks.DeleteCluster", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DeleteClusterOutput](ctx, s.natsConn, "eks.DeleteCluster", input, defaultTimeout, accountID) } // --- Nodegroup --- func (s *NATSEKSService) CreateNodegroup(ctx context.Context, input *eks.CreateNodegroupInput, accountID string) (*eks.CreateNodegroupOutput, error) { - return utils.NATSRequestCtx[eks.CreateNodegroupOutput](ctx, s.natsConn, "eks.CreateNodegroup", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.CreateNodegroupOutput](ctx, s.natsConn, "eks.CreateNodegroup", input, defaultTimeout, accountID) } func (s *NATSEKSService) DescribeNodegroup(ctx context.Context, input *eks.DescribeNodegroupInput, accountID string) (*eks.DescribeNodegroupOutput, error) { - return utils.NATSRequestCtx[eks.DescribeNodegroupOutput](ctx, s.natsConn, "eks.DescribeNodegroup", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeNodegroupOutput](ctx, s.natsConn, "eks.DescribeNodegroup", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListNodegroups(ctx context.Context, input *eks.ListNodegroupsInput, accountID string) (*eks.ListNodegroupsOutput, error) { - return utils.NATSRequestCtx[eks.ListNodegroupsOutput](ctx, s.natsConn, "eks.ListNodegroups", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListNodegroupsOutput](ctx, s.natsConn, "eks.ListNodegroups", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateNodegroupConfig(ctx context.Context, input *eks.UpdateNodegroupConfigInput, accountID string) (*eks.UpdateNodegroupConfigOutput, error) { - return utils.NATSRequestCtx[eks.UpdateNodegroupConfigOutput](ctx, s.natsConn, "eks.UpdateNodegroupConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateNodegroupConfigOutput](ctx, s.natsConn, "eks.UpdateNodegroupConfig", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateNodegroupVersion(ctx context.Context, input *eks.UpdateNodegroupVersionInput, accountID string) (*eks.UpdateNodegroupVersionOutput, error) { - return utils.NATSRequestCtx[eks.UpdateNodegroupVersionOutput](ctx, s.natsConn, "eks.UpdateNodegroupVersion", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateNodegroupVersionOutput](ctx, s.natsConn, "eks.UpdateNodegroupVersion", input, defaultTimeout, accountID) } func (s *NATSEKSService) DeleteNodegroup(ctx context.Context, input *eks.DeleteNodegroupInput, accountID string) (*eks.DeleteNodegroupOutput, error) { - return utils.NATSRequestCtx[eks.DeleteNodegroupOutput](ctx, s.natsConn, "eks.DeleteNodegroup", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DeleteNodegroupOutput](ctx, s.natsConn, "eks.DeleteNodegroup", input, defaultTimeout, accountID) } // --- AccessEntry + AccessPolicy --- func (s *NATSEKSService) CreateAccessEntry(ctx context.Context, input *eks.CreateAccessEntryInput, accountID string) (*eks.CreateAccessEntryOutput, error) { - return utils.NATSRequestCtx[eks.CreateAccessEntryOutput](ctx, s.natsConn, "eks.CreateAccessEntry", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.CreateAccessEntryOutput](ctx, s.natsConn, "eks.CreateAccessEntry", input, defaultTimeout, accountID) } func (s *NATSEKSService) DescribeAccessEntry(ctx context.Context, input *eks.DescribeAccessEntryInput, accountID string) (*eks.DescribeAccessEntryOutput, error) { - return utils.NATSRequestCtx[eks.DescribeAccessEntryOutput](ctx, s.natsConn, "eks.DescribeAccessEntry", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeAccessEntryOutput](ctx, s.natsConn, "eks.DescribeAccessEntry", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListAccessEntries(ctx context.Context, input *eks.ListAccessEntriesInput, accountID string) (*eks.ListAccessEntriesOutput, error) { - return utils.NATSRequestCtx[eks.ListAccessEntriesOutput](ctx, s.natsConn, "eks.ListAccessEntries", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListAccessEntriesOutput](ctx, s.natsConn, "eks.ListAccessEntries", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateAccessEntry(ctx context.Context, input *eks.UpdateAccessEntryInput, accountID string) (*eks.UpdateAccessEntryOutput, error) { - return utils.NATSRequestCtx[eks.UpdateAccessEntryOutput](ctx, s.natsConn, "eks.UpdateAccessEntry", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateAccessEntryOutput](ctx, s.natsConn, "eks.UpdateAccessEntry", input, defaultTimeout, accountID) } func (s *NATSEKSService) DeleteAccessEntry(ctx context.Context, input *eks.DeleteAccessEntryInput, accountID string) (*eks.DeleteAccessEntryOutput, error) { - return utils.NATSRequestCtx[eks.DeleteAccessEntryOutput](ctx, s.natsConn, "eks.DeleteAccessEntry", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DeleteAccessEntryOutput](ctx, s.natsConn, "eks.DeleteAccessEntry", input, defaultTimeout, accountID) } func (s *NATSEKSService) AssociateAccessPolicy(ctx context.Context, input *eks.AssociateAccessPolicyInput, accountID string) (*eks.AssociateAccessPolicyOutput, error) { - return utils.NATSRequestCtx[eks.AssociateAccessPolicyOutput](ctx, s.natsConn, "eks.AssociateAccessPolicy", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.AssociateAccessPolicyOutput](ctx, s.natsConn, "eks.AssociateAccessPolicy", input, defaultTimeout, accountID) } func (s *NATSEKSService) DisassociateAccessPolicy(ctx context.Context, input *eks.DisassociateAccessPolicyInput, accountID string) (*eks.DisassociateAccessPolicyOutput, error) { - return utils.NATSRequestCtx[eks.DisassociateAccessPolicyOutput](ctx, s.natsConn, "eks.DisassociateAccessPolicy", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DisassociateAccessPolicyOutput](ctx, s.natsConn, "eks.DisassociateAccessPolicy", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListAssociatedAccessPolicies(ctx context.Context, input *eks.ListAssociatedAccessPoliciesInput, accountID string) (*eks.ListAssociatedAccessPoliciesOutput, error) { - return utils.NATSRequestCtx[eks.ListAssociatedAccessPoliciesOutput](ctx, s.natsConn, "eks.ListAssociatedAccessPolicies", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListAssociatedAccessPoliciesOutput](ctx, s.natsConn, "eks.ListAssociatedAccessPolicies", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListAccessPolicies(ctx context.Context, input *eks.ListAccessPoliciesInput, accountID string) (*eks.ListAccessPoliciesOutput, error) { - return utils.NATSRequestCtx[eks.ListAccessPoliciesOutput](ctx, s.natsConn, "eks.ListAccessPolicies", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListAccessPoliciesOutput](ctx, s.natsConn, "eks.ListAccessPolicies", input, defaultTimeout, accountID) } // --- Addons --- func (s *NATSEKSService) ListAddons(ctx context.Context, input *eks.ListAddonsInput, accountID string) (*eks.ListAddonsOutput, error) { - return utils.NATSRequestCtx[eks.ListAddonsOutput](ctx, s.natsConn, "eks.ListAddons", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListAddonsOutput](ctx, s.natsConn, "eks.ListAddons", input, defaultTimeout, accountID) } func (s *NATSEKSService) DescribeAddonVersions(ctx context.Context, input *eks.DescribeAddonVersionsInput, accountID string) (*eks.DescribeAddonVersionsOutput, error) { - return utils.NATSRequestCtx[eks.DescribeAddonVersionsOutput](ctx, s.natsConn, "eks.DescribeAddonVersions", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeAddonVersionsOutput](ctx, s.natsConn, "eks.DescribeAddonVersions", input, defaultTimeout, accountID) } func (s *NATSEKSService) CreateAddon(ctx context.Context, input *eks.CreateAddonInput, accountID string) (*eks.CreateAddonOutput, error) { - return utils.NATSRequestCtx[eks.CreateAddonOutput](ctx, s.natsConn, "eks.CreateAddon", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.CreateAddonOutput](ctx, s.natsConn, "eks.CreateAddon", input, defaultTimeout, accountID) } func (s *NATSEKSService) DeleteAddon(ctx context.Context, input *eks.DeleteAddonInput, accountID string) (*eks.DeleteAddonOutput, error) { - return utils.NATSRequestCtx[eks.DeleteAddonOutput](ctx, s.natsConn, "eks.DeleteAddon", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DeleteAddonOutput](ctx, s.natsConn, "eks.DeleteAddon", input, defaultTimeout, accountID) } func (s *NATSEKSService) DescribeAddon(ctx context.Context, input *eks.DescribeAddonInput, accountID string) (*eks.DescribeAddonOutput, error) { - return utils.NATSRequestCtx[eks.DescribeAddonOutput](ctx, s.natsConn, "eks.DescribeAddon", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeAddonOutput](ctx, s.natsConn, "eks.DescribeAddon", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListStagedAddonManifests(ctx context.Context, input *ListStagedAddonManifestsInput, accountID string) (*ListStagedAddonManifestsOutput, error) { - return utils.NATSRequestCtx[ListStagedAddonManifestsOutput](ctx, s.natsConn, "eks.ListStagedAddonManifests", input, defaultTimeout, accountID) + return utils.NATSRequest[ListStagedAddonManifestsOutput](ctx, s.natsConn, "eks.ListStagedAddonManifests", input, defaultTimeout, accountID) } func (s *NATSEKSService) UpdateAddon(ctx context.Context, input *eks.UpdateAddonInput, accountID string) (*eks.UpdateAddonOutput, error) { - return utils.NATSRequestCtx[eks.UpdateAddonOutput](ctx, s.natsConn, "eks.UpdateAddon", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UpdateAddonOutput](ctx, s.natsConn, "eks.UpdateAddon", input, defaultTimeout, accountID) } func (s *NATSEKSService) GetRecoveryDirective(ctx context.Context, input *GetRecoveryDirectiveInput, accountID string) (*GetRecoveryDirectiveOutput, error) { - return utils.NATSRequestCtx[GetRecoveryDirectiveOutput](ctx, s.natsConn, "eks.GetRecoveryDirective", input, defaultTimeout, accountID) + return utils.NATSRequest[GetRecoveryDirectiveOutput](ctx, s.natsConn, "eks.GetRecoveryDirective", input, defaultTimeout, accountID) } func (s *NATSEKSService) SetRecoveryDirective(ctx context.Context, input *SetRecoveryDirectiveInput, accountID string) (*SetRecoveryDirectiveOutput, error) { - return utils.NATSRequestCtx[SetRecoveryDirectiveOutput](ctx, s.natsConn, "eks.SetRecoveryDirective", input, defaultTimeout, accountID) + return utils.NATSRequest[SetRecoveryDirectiveOutput](ctx, s.natsConn, "eks.SetRecoveryDirective", input, defaultTimeout, accountID) } // --- OIDC identity-provider configs --- func (s *NATSEKSService) AssociateIdentityProviderConfig(ctx context.Context, input *eks.AssociateIdentityProviderConfigInput, accountID string) (*eks.AssociateIdentityProviderConfigOutput, error) { - return utils.NATSRequestCtx[eks.AssociateIdentityProviderConfigOutput](ctx, s.natsConn, "eks.AssociateIdentityProviderConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.AssociateIdentityProviderConfigOutput](ctx, s.natsConn, "eks.AssociateIdentityProviderConfig", input, defaultTimeout, accountID) } func (s *NATSEKSService) DescribeIdentityProviderConfig(ctx context.Context, input *eks.DescribeIdentityProviderConfigInput, accountID string) (*eks.DescribeIdentityProviderConfigOutput, error) { - return utils.NATSRequestCtx[eks.DescribeIdentityProviderConfigOutput](ctx, s.natsConn, "eks.DescribeIdentityProviderConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DescribeIdentityProviderConfigOutput](ctx, s.natsConn, "eks.DescribeIdentityProviderConfig", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListIdentityProviderConfigs(ctx context.Context, input *eks.ListIdentityProviderConfigsInput, accountID string) (*eks.ListIdentityProviderConfigsOutput, error) { - return utils.NATSRequestCtx[eks.ListIdentityProviderConfigsOutput](ctx, s.natsConn, "eks.ListIdentityProviderConfigs", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListIdentityProviderConfigsOutput](ctx, s.natsConn, "eks.ListIdentityProviderConfigs", input, defaultTimeout, accountID) } func (s *NATSEKSService) DisassociateIdentityProviderConfig(ctx context.Context, input *eks.DisassociateIdentityProviderConfigInput, accountID string) (*eks.DisassociateIdentityProviderConfigOutput, error) { - return utils.NATSRequestCtx[eks.DisassociateIdentityProviderConfigOutput](ctx, s.natsConn, "eks.DisassociateIdentityProviderConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.DisassociateIdentityProviderConfigOutput](ctx, s.natsConn, "eks.DisassociateIdentityProviderConfig", input, defaultTimeout, accountID) } // --- Tags --- func (s *NATSEKSService) TagResource(ctx context.Context, input *eks.TagResourceInput, accountID string) (*eks.TagResourceOutput, error) { - return utils.NATSRequestCtx[eks.TagResourceOutput](ctx, s.natsConn, "eks.TagResource", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.TagResourceOutput](ctx, s.natsConn, "eks.TagResource", input, defaultTimeout, accountID) } func (s *NATSEKSService) UntagResource(ctx context.Context, input *eks.UntagResourceInput, accountID string) (*eks.UntagResourceOutput, error) { - return utils.NATSRequestCtx[eks.UntagResourceOutput](ctx, s.natsConn, "eks.UntagResource", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.UntagResourceOutput](ctx, s.natsConn, "eks.UntagResource", input, defaultTimeout, accountID) } func (s *NATSEKSService) ListTagsForResource(ctx context.Context, input *eks.ListTagsForResourceInput, accountID string) (*eks.ListTagsForResourceOutput, error) { - return utils.NATSRequestCtx[eks.ListTagsForResourceOutput](ctx, s.natsConn, "eks.ListTagsForResource", input, defaultTimeout, accountID) + return utils.NATSRequest[eks.ListTagsForResourceOutput](ctx, s.natsConn, "eks.ListTagsForResource", input, defaultTimeout, accountID) } diff --git a/spinifex/handlers/eks/token_review.go b/spinifex/handlers/eks/token_review.go index 04914f52b..c292ba8af 100644 --- a/spinifex/handlers/eks/token_review.go +++ b/spinifex/handlers/eks/token_review.go @@ -81,7 +81,7 @@ func ResolveTokenReview(ctx context.Context, nc *nats.Conn, accountID, clusterNa } verify := func(presignedURL string) (*TokenVerifyResponse, error) { - return utils.NATSRequestCtx[TokenVerifyResponse]( + return utils.NATSRequest[TokenVerifyResponse]( ctx, nc, TokenVerifySubject, TokenVerifyRequest{PresignedURL: presignedURL, ClusterName: clusterName}, verifyTimeout, "") diff --git a/spinifex/handlers/elbv2/service_nats.go b/spinifex/handlers/elbv2/service_nats.go index d7b5e22d6..29aa36799 100644 --- a/spinifex/handlers/elbv2/service_nats.go +++ b/spinifex/handlers/elbv2/service_nats.go @@ -30,141 +30,141 @@ func NewNATSELBv2Service(conn *nats.Conn) ELBv2Service { } func (s *NATSELBv2Service) CreateLoadBalancer(ctx context.Context, input *elbv2.CreateLoadBalancerInput, accountID string) (*elbv2.CreateLoadBalancerOutput, error) { - return utils.NATSRequestCtx[elbv2.CreateLoadBalancerOutput](ctx, s.natsConn, "elbv2.CreateLoadBalancer", input, longRunningTimeout, accountID) + return utils.NATSRequest[elbv2.CreateLoadBalancerOutput](ctx, s.natsConn, "elbv2.CreateLoadBalancer", input, longRunningTimeout, accountID) } func (s *NATSELBv2Service) DeleteLoadBalancer(ctx context.Context, input *elbv2.DeleteLoadBalancerInput, accountID string) (*elbv2.DeleteLoadBalancerOutput, error) { - return utils.NATSRequestCtx[elbv2.DeleteLoadBalancerOutput](ctx, s.natsConn, "elbv2.DeleteLoadBalancer", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DeleteLoadBalancerOutput](ctx, s.natsConn, "elbv2.DeleteLoadBalancer", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeLoadBalancers(ctx context.Context, input *elbv2.DescribeLoadBalancersInput, accountID string) (*elbv2.DescribeLoadBalancersOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeLoadBalancersOutput](ctx, s.natsConn, "elbv2.DescribeLoadBalancers", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeLoadBalancersOutput](ctx, s.natsConn, "elbv2.DescribeLoadBalancers", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) CreateTargetGroup(ctx context.Context, input *elbv2.CreateTargetGroupInput, accountID string) (*elbv2.CreateTargetGroupOutput, error) { - return utils.NATSRequestCtx[elbv2.CreateTargetGroupOutput](ctx, s.natsConn, "elbv2.CreateTargetGroup", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.CreateTargetGroupOutput](ctx, s.natsConn, "elbv2.CreateTargetGroup", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) ModifyTargetGroup(ctx context.Context, input *elbv2.ModifyTargetGroupInput, accountID string) (*elbv2.ModifyTargetGroupOutput, error) { - return utils.NATSRequestCtx[elbv2.ModifyTargetGroupOutput](ctx, s.natsConn, "elbv2.ModifyTargetGroup", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.ModifyTargetGroupOutput](ctx, s.natsConn, "elbv2.ModifyTargetGroup", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DeleteTargetGroup(ctx context.Context, input *elbv2.DeleteTargetGroupInput, accountID string) (*elbv2.DeleteTargetGroupOutput, error) { - return utils.NATSRequestCtx[elbv2.DeleteTargetGroupOutput](ctx, s.natsConn, "elbv2.DeleteTargetGroup", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DeleteTargetGroupOutput](ctx, s.natsConn, "elbv2.DeleteTargetGroup", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeTargetGroups(ctx context.Context, input *elbv2.DescribeTargetGroupsInput, accountID string) (*elbv2.DescribeTargetGroupsOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeTargetGroupsOutput](ctx, s.natsConn, "elbv2.DescribeTargetGroups", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeTargetGroupsOutput](ctx, s.natsConn, "elbv2.DescribeTargetGroups", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) RegisterTargets(ctx context.Context, input *elbv2.RegisterTargetsInput, accountID string) (*elbv2.RegisterTargetsOutput, error) { - return utils.NATSRequestCtx[elbv2.RegisterTargetsOutput](ctx, s.natsConn, "elbv2.RegisterTargets", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.RegisterTargetsOutput](ctx, s.natsConn, "elbv2.RegisterTargets", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DeregisterTargets(ctx context.Context, input *elbv2.DeregisterTargetsInput, accountID string) (*elbv2.DeregisterTargetsOutput, error) { - return utils.NATSRequestCtx[elbv2.DeregisterTargetsOutput](ctx, s.natsConn, "elbv2.DeregisterTargets", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DeregisterTargetsOutput](ctx, s.natsConn, "elbv2.DeregisterTargets", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeTargetHealth(ctx context.Context, input *elbv2.DescribeTargetHealthInput, accountID string) (*elbv2.DescribeTargetHealthOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeTargetHealthOutput](ctx, s.natsConn, "elbv2.DescribeTargetHealth", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeTargetHealthOutput](ctx, s.natsConn, "elbv2.DescribeTargetHealth", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) CreateListener(ctx context.Context, input *elbv2.CreateListenerInput, accountID string) (*elbv2.CreateListenerOutput, error) { - return utils.NATSRequestCtx[elbv2.CreateListenerOutput](ctx, s.natsConn, "elbv2.CreateListener", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.CreateListenerOutput](ctx, s.natsConn, "elbv2.CreateListener", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DeleteListener(ctx context.Context, input *elbv2.DeleteListenerInput, accountID string) (*elbv2.DeleteListenerOutput, error) { - return utils.NATSRequestCtx[elbv2.DeleteListenerOutput](ctx, s.natsConn, "elbv2.DeleteListener", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DeleteListenerOutput](ctx, s.natsConn, "elbv2.DeleteListener", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) ModifyListener(ctx context.Context, input *elbv2.ModifyListenerInput, accountID string) (*elbv2.ModifyListenerOutput, error) { - return utils.NATSRequestCtx[elbv2.ModifyListenerOutput](ctx, s.natsConn, "elbv2.ModifyListener", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.ModifyListenerOutput](ctx, s.natsConn, "elbv2.ModifyListener", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeListeners(ctx context.Context, input *elbv2.DescribeListenersInput, accountID string) (*elbv2.DescribeListenersOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeListenersOutput](ctx, s.natsConn, "elbv2.DescribeListeners", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeListenersOutput](ctx, s.natsConn, "elbv2.DescribeListeners", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) CreateRule(ctx context.Context, input *elbv2.CreateRuleInput, accountID string) (*elbv2.CreateRuleOutput, error) { - return utils.NATSRequestCtx[elbv2.CreateRuleOutput](ctx, s.natsConn, "elbv2.CreateRule", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.CreateRuleOutput](ctx, s.natsConn, "elbv2.CreateRule", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) ModifyRule(ctx context.Context, input *elbv2.ModifyRuleInput, accountID string) (*elbv2.ModifyRuleOutput, error) { - return utils.NATSRequestCtx[elbv2.ModifyRuleOutput](ctx, s.natsConn, "elbv2.ModifyRule", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.ModifyRuleOutput](ctx, s.natsConn, "elbv2.ModifyRule", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DeleteRule(ctx context.Context, input *elbv2.DeleteRuleInput, accountID string) (*elbv2.DeleteRuleOutput, error) { - return utils.NATSRequestCtx[elbv2.DeleteRuleOutput](ctx, s.natsConn, "elbv2.DeleteRule", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DeleteRuleOutput](ctx, s.natsConn, "elbv2.DeleteRule", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeRules(ctx context.Context, input *elbv2.DescribeRulesInput, accountID string) (*elbv2.DescribeRulesOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeRulesOutput](ctx, s.natsConn, "elbv2.DescribeRules", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeRulesOutput](ctx, s.natsConn, "elbv2.DescribeRules", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) SetRulePriorities(ctx context.Context, input *elbv2.SetRulePrioritiesInput, accountID string) (*elbv2.SetRulePrioritiesOutput, error) { - return utils.NATSRequestCtx[elbv2.SetRulePrioritiesOutput](ctx, s.natsConn, "elbv2.SetRulePriorities", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.SetRulePrioritiesOutput](ctx, s.natsConn, "elbv2.SetRulePriorities", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeTags(ctx context.Context, input *elbv2.DescribeTagsInput, accountID string) (*elbv2.DescribeTagsOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeTagsOutput](ctx, s.natsConn, "elbv2.DescribeTags", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeTagsOutput](ctx, s.natsConn, "elbv2.DescribeTags", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) AddTags(ctx context.Context, input *elbv2.AddTagsInput, accountID string) (*elbv2.AddTagsOutput, error) { - return utils.NATSRequestCtx[elbv2.AddTagsOutput](ctx, s.natsConn, "elbv2.AddTags", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.AddTagsOutput](ctx, s.natsConn, "elbv2.AddTags", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) RemoveTags(ctx context.Context, input *elbv2.RemoveTagsInput, accountID string) (*elbv2.RemoveTagsOutput, error) { - return utils.NATSRequestCtx[elbv2.RemoveTagsOutput](ctx, s.natsConn, "elbv2.RemoveTags", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.RemoveTagsOutput](ctx, s.natsConn, "elbv2.RemoveTags", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) ModifyTargetGroupAttributes(ctx context.Context, input *elbv2.ModifyTargetGroupAttributesInput, accountID string) (*elbv2.ModifyTargetGroupAttributesOutput, error) { - return utils.NATSRequestCtx[elbv2.ModifyTargetGroupAttributesOutput](ctx, s.natsConn, "elbv2.ModifyTargetGroupAttributes", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.ModifyTargetGroupAttributesOutput](ctx, s.natsConn, "elbv2.ModifyTargetGroupAttributes", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeTargetGroupAttributes(ctx context.Context, input *elbv2.DescribeTargetGroupAttributesInput, accountID string) (*elbv2.DescribeTargetGroupAttributesOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeTargetGroupAttributesOutput](ctx, s.natsConn, "elbv2.DescribeTargetGroupAttributes", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeTargetGroupAttributesOutput](ctx, s.natsConn, "elbv2.DescribeTargetGroupAttributes", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) ModifyLoadBalancerAttributes(ctx context.Context, input *elbv2.ModifyLoadBalancerAttributesInput, accountID string) (*elbv2.ModifyLoadBalancerAttributesOutput, error) { - return utils.NATSRequestCtx[elbv2.ModifyLoadBalancerAttributesOutput](ctx, s.natsConn, "elbv2.ModifyLoadBalancerAttributes", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.ModifyLoadBalancerAttributesOutput](ctx, s.natsConn, "elbv2.ModifyLoadBalancerAttributes", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeLoadBalancerAttributes(ctx context.Context, input *elbv2.DescribeLoadBalancerAttributesInput, accountID string) (*elbv2.DescribeLoadBalancerAttributesOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeLoadBalancerAttributesOutput](ctx, s.natsConn, "elbv2.DescribeLoadBalancerAttributes", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeLoadBalancerAttributesOutput](ctx, s.natsConn, "elbv2.DescribeLoadBalancerAttributes", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) SetSecurityGroups(ctx context.Context, input *elbv2.SetSecurityGroupsInput, accountID string) (*elbv2.SetSecurityGroupsOutput, error) { - return utils.NATSRequestCtx[elbv2.SetSecurityGroupsOutput](ctx, s.natsConn, "elbv2.SetSecurityGroups", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.SetSecurityGroupsOutput](ctx, s.natsConn, "elbv2.SetSecurityGroups", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) SetIpAddressType(ctx context.Context, input *elbv2.SetIpAddressTypeInput, accountID string) (*elbv2.SetIpAddressTypeOutput, error) { - return utils.NATSRequestCtx[elbv2.SetIpAddressTypeOutput](ctx, s.natsConn, "elbv2.SetIpAddressType", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.SetIpAddressTypeOutput](ctx, s.natsConn, "elbv2.SetIpAddressType", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) SetSubnets(ctx context.Context, input *elbv2.SetSubnetsInput, accountID string) (*elbv2.SetSubnetsOutput, error) { - return utils.NATSRequestCtx[elbv2.SetSubnetsOutput](ctx, s.natsConn, "elbv2.SetSubnets", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.SetSubnetsOutput](ctx, s.natsConn, "elbv2.SetSubnets", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) AddListenerCertificates(ctx context.Context, input *elbv2.AddListenerCertificatesInput, accountID string) (*elbv2.AddListenerCertificatesOutput, error) { - return utils.NATSRequestCtx[elbv2.AddListenerCertificatesOutput](ctx, s.natsConn, "elbv2.AddListenerCertificates", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.AddListenerCertificatesOutput](ctx, s.natsConn, "elbv2.AddListenerCertificates", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) RemoveListenerCertificates(ctx context.Context, input *elbv2.RemoveListenerCertificatesInput, accountID string) (*elbv2.RemoveListenerCertificatesOutput, error) { - return utils.NATSRequestCtx[elbv2.RemoveListenerCertificatesOutput](ctx, s.natsConn, "elbv2.RemoveListenerCertificates", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.RemoveListenerCertificatesOutput](ctx, s.natsConn, "elbv2.RemoveListenerCertificates", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeListenerCertificates(ctx context.Context, input *elbv2.DescribeListenerCertificatesInput, accountID string) (*elbv2.DescribeListenerCertificatesOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeListenerCertificatesOutput](ctx, s.natsConn, "elbv2.DescribeListenerCertificates", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeListenerCertificatesOutput](ctx, s.natsConn, "elbv2.DescribeListenerCertificates", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) DescribeSSLPolicies(ctx context.Context, input *elbv2.DescribeSSLPoliciesInput, accountID string) (*elbv2.DescribeSSLPoliciesOutput, error) { - return utils.NATSRequestCtx[elbv2.DescribeSSLPoliciesOutput](ctx, s.natsConn, "elbv2.DescribeSSLPolicies", input, defaultTimeout, accountID) + return utils.NATSRequest[elbv2.DescribeSSLPoliciesOutput](ctx, s.natsConn, "elbv2.DescribeSSLPolicies", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) LBAgentHeartbeat(ctx context.Context, input *LBAgentHeartbeatInput, accountID string) (*LBAgentHeartbeatOutput, error) { - return utils.NATSRequestCtx[LBAgentHeartbeatOutput](ctx, s.natsConn, "elbv2.LBAgentHeartbeat", input, defaultTimeout, accountID) + return utils.NATSRequest[LBAgentHeartbeatOutput](ctx, s.natsConn, "elbv2.LBAgentHeartbeat", input, defaultTimeout, accountID) } func (s *NATSELBv2Service) GetLBConfig(ctx context.Context, input *GetLBConfigInput, accountID string) (*GetLBConfigOutput, error) { - return utils.NATSRequestCtx[GetLBConfigOutput](ctx, s.natsConn, "elbv2.GetLBConfig", input, defaultTimeout, accountID) + return utils.NATSRequest[GetLBConfigOutput](ctx, s.natsConn, "elbv2.GetLBConfig", input, defaultTimeout, accountID) } diff --git a/spinifex/handlers/imds/nats_clients.go b/spinifex/handlers/imds/nats_clients.go index 59f867334..6c46499e3 100644 --- a/spinifex/handlers/imds/nats_clients.go +++ b/spinifex/handlers/imds/nats_clients.go @@ -39,7 +39,7 @@ func NewNATSSTSAssumer(nc *nats.Conn) *NATSSTSAssumer { } func (a *NATSSTSAssumer) AssumeRoleForInstance(ctx context.Context, accountID, roleARN, instanceID string, durationSeconds int64) (*sts.AssumeRoleOutput, error) { - return utils.NATSRequestCtx[sts.AssumeRoleOutput](ctx, a.nc, handlers_sts.SubjectAssumeRoleForInstance, handlers_sts.AssumeRoleForInstanceRequest{ + return utils.NATSRequest[sts.AssumeRoleOutput](ctx, a.nc, handlers_sts.SubjectAssumeRoleForInstance, handlers_sts.AssumeRoleForInstanceRequest{ AccountID: accountID, RoleARN: roleARN, InstanceID: instanceID, @@ -70,7 +70,7 @@ func (p *NATSProfileLookup) ResolveInstanceProfile(ctx context.Context, accountI if v, ok := p.profiles.get(key); ok { return v, nil } - out, err := utils.NATSRequestCtx[handlers_iam.InstanceProfile](ctx, p.nc, handlers_iam.SubjectResolveInstanceProfile, handlers_iam.ResolveInstanceProfileRequest{ + out, err := utils.NATSRequest[handlers_iam.InstanceProfile](ctx, p.nc, handlers_iam.SubjectResolveInstanceProfile, handlers_iam.ResolveInstanceProfileRequest{ AccountID: accountID, NameOrARN: nameOrARN, }, imdsRPCTimeout, accountID) @@ -86,7 +86,7 @@ func (p *NATSProfileLookup) GetRole(ctx context.Context, accountID string, input if v, ok := p.roles.get(key); ok { return v, nil } - out, err := utils.NATSRequestCtx[iam.GetRoleOutput](ctx, p.nc, handlers_iam.SubjectGetRole, handlers_iam.GetRoleRequest{ + out, err := utils.NATSRequest[iam.GetRoleOutput](ctx, p.nc, handlers_iam.SubjectGetRole, handlers_iam.GetRoleRequest{ AccountID: accountID, Input: input, }, imdsRPCTimeout, accountID) @@ -118,7 +118,7 @@ func (p *NATSPublicKeyLookup) GetPublicKey(ctx context.Context, accountID, keyNa if v, ok := p.cache.get(key); ok { return v, nil } - out, err := utils.NATSRequestCtx[handlers_ec2_key.GetPublicKeyResponse](ctx, p.nc, "imds.ec2.get_public_key", handlers_ec2_key.GetPublicKeyRequest{ + out, err := utils.NATSRequest[handlers_ec2_key.GetPublicKeyResponse](ctx, p.nc, "imds.ec2.get_public_key", handlers_ec2_key.GetPublicKeyRequest{ AccountID: accountID, KeyName: keyName, }, imdsRPCTimeout, accountID) diff --git a/spinifex/network/subscribers/respond.go b/spinifex/network/subscribers/respond.go index 21839b43d..6df4682b2 100644 --- a/spinifex/network/subscribers/respond.go +++ b/spinifex/network/subscribers/respond.go @@ -26,7 +26,7 @@ func respond(msg *nats.Msg, err error) { data, marshalErr := json.Marshal(resp) if marshalErr != nil { slog.Error("subscribers: failed to marshal NATS response", "err", marshalErr) - data = []byte(`{"success":false,"error":"internal marshal failure"}`) + return } if err := msg.Respond(data); err != nil { slog.Error("subscribers: failed to respond to NATS request", "err", err) diff --git a/spinifex/services/awsgw/eks_token_verify_test.go b/spinifex/services/awsgw/eks_token_verify_test.go index 069193fed..9382e4134 100644 --- a/spinifex/services/awsgw/eks_token_verify_test.go +++ b/spinifex/services/awsgw/eks_token_verify_test.go @@ -1,6 +1,7 @@ package awsgw import ( + "context" "errors" "testing" "time" @@ -39,7 +40,7 @@ func TestEKSTokenVerify_ResolvesPrincipal(t *testing.T) { defer func() { _ = sub.Unsubscribe() }() req := handlers_eks.TokenVerifyRequest{PresignedURL: "https://sts/?x=1", ClusterName: "alpha"} - resp, err := utils.NATSRequest[handlers_eks.TokenVerifyResponse]( + resp, err := utils.NATSRequest[handlers_eks.TokenVerifyResponse](context.Background(), nc, handlers_eks.TokenVerifySubject, req, 2*time.Second, "") require.NoError(t, err) @@ -58,7 +59,7 @@ func TestEKSTokenVerify_RejectedTokenIsError(t *testing.T) { defer func() { _ = sub.Unsubscribe() }() req := handlers_eks.TokenVerifyRequest{PresignedURL: "https://sts/?x=1", ClusterName: "alpha"} - _, err = utils.NATSRequest[handlers_eks.TokenVerifyResponse]( + _, err = utils.NATSRequest[handlers_eks.TokenVerifyResponse](context.Background(), nc, handlers_eks.TokenVerifySubject, req, 2*time.Second, "") require.Error(t, err, "a verify failure must surface as a NATS error payload") } @@ -72,7 +73,7 @@ func TestEKSTokenVerify_RejectsEmptyFields(t *testing.T) { // Missing ClusterName — responder rejects before calling the verifier. req := handlers_eks.TokenVerifyRequest{PresignedURL: "https://sts/?x=1"} - _, err = utils.NATSRequest[handlers_eks.TokenVerifyResponse]( + _, err = utils.NATSRequest[handlers_eks.TokenVerifyResponse](context.Background(), nc, handlers_eks.TokenVerifySubject, req, 2*time.Second, "") require.Error(t, err) assert.Empty(t, fake.gotURL, "verifier must not run on an invalid request") diff --git a/spinifex/types/ebs.go b/spinifex/types/ebs.go index fac045bf1..9886311cd 100644 --- a/spinifex/types/ebs.go +++ b/spinifex/types/ebs.go @@ -66,17 +66,6 @@ type EBSDeleteResponse struct { Error string `json:"Error"` } -type EBSSnapshotRequest struct { - Volume string `json:"Volume"` - SnapshotID string `json:"SnapshotID"` -} - -type EBSSnapshotResponse struct { - SnapshotID string `json:"SnapshotID"` - Success bool `json:"Success"` - Error string `json:"Error"` -} - // EBSConfigUpdateRequest carries a control-plane VolumeConfig update for an // encrypted volume. config.json is a sealed VBState; only the master-key holder // (viperblockd) can reseal it, so the EC2 edge ships the new config here instead diff --git a/spinifex/utils/nats.go b/spinifex/utils/nats.go index c980284be..7fbeb63fe 100644 --- a/spinifex/utils/nats.go +++ b/spinifex/utils/nats.go @@ -220,17 +220,11 @@ func PrincipalARNFromMsg(msg *nats.Msg) string { return msg.Header.Get(PrincipalARNHeader) } -// NATSRequest performs a NATS request-response with JSON marshaling. -// Sends with X-Account-ID (plus any extra headers) and unmarshals the successful response into Out. -// Prefer NATSRequestCtx where a request context is available so traces span the hop. -func NATSRequest[Out any](conn *nats.Conn, subject string, input any, timeout time.Duration, accountID string, headers ...NATSHeader) (*Out, error) { - return NATSRequestCtx[Out](context.Background(), conn, subject, input, timeout, accountID, headers...) -} - -// NATSRequestCtx is NATSRequest carrying ctx's trace context onto the wire: -// it opens a client span for the hop and injects traceparent into the message -// headers so the consumer joins the same trace. -func NATSRequestCtx[Out any](ctx context.Context, conn *nats.Conn, subject string, input any, timeout time.Duration, accountID string, headers ...NATSHeader) (out *Out, err error) { +// NATSRequest performs a NATS request-response with JSON marshaling. It sends +// with X-Account-ID (plus any extra headers), unmarshals the successful response +// into Out, and carries ctx's trace context onto the wire: it opens a client span +// for the hop and injects traceparent so the consumer joins the same trace. +func NATSRequest[Out any](ctx context.Context, conn *nats.Conn, subject string, input any, timeout time.Duration, accountID string, headers ...NATSHeader) (out *Out, err error) { if conn == nil || !conn.IsConnected() { return nil, ErrClusterUnavailable } @@ -337,18 +331,14 @@ type GatherOpts struct { AccountID string // sets X-Account-ID header when non-empty } -// Gather publishes payload to subject over a fresh inbox and collects reply frames -// until ExpectedNodes answer, StopOnFirst yields a success, or Timeout elapses. -// Error envelopes and oversized frames are dropped from frames but counted in sum; -// returned frames are raw daemon replies for the caller to decode and merge. -func Gather(conn *nats.Conn, subject string, payload []byte, opts GatherOpts) (frames [][]byte, sum Summary, err error) { - return GatherCtx(context.Background(), conn, subject, payload, opts) -} - -// GatherCtx is Gather carrying ctx's trace context onto the wire: it opens a -// producer span for the fan-out and injects traceparent so every consumer -// joins the same trace. Prefer it over Gather when a request context exists. -func GatherCtx(ctx context.Context, conn *nats.Conn, subject string, payload []byte, opts GatherOpts) (frames [][]byte, sum Summary, err error) { +// Gather publishes payload to subject over a fresh inbox and collects reply +// frames until ExpectedNodes answer, StopOnFirst yields a success, or Timeout +// elapses. Error envelopes and oversized frames are dropped from frames but +// counted in sum; returned frames are raw daemon replies for the caller to +// decode and merge. It carries ctx's trace context onto the wire: it opens a +// producer span for the fan-out and injects traceparent so every consumer joins +// the same trace. +func Gather(ctx context.Context, conn *nats.Conn, subject string, payload []byte, opts GatherOpts) (frames [][]byte, sum Summary, err error) { sum.ErrorCodes = map[string]int{} if conn == nil || !conn.IsConnected() { return nil, sum, ErrClusterUnavailable diff --git a/spinifex/utils/nats_test.go b/spinifex/utils/nats_test.go index 42ebc2a80..25a53c6b9 100644 --- a/spinifex/utils/nats_test.go +++ b/spinifex/utils/nats_test.go @@ -2,6 +2,7 @@ package utils import ( "bytes" + "context" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" @@ -255,7 +256,7 @@ func TestNATSRequest_Success(t *testing.T) { }) require.NoError(t, err) - result, err := NATSRequest[Resp](nc, "test.greet", Req{Name: "world"}, 2*time.Second, "") + result, err := NATSRequest[Resp](context.Background(), nc, "test.greet", Req{Name: "world"}, 2*time.Second, "") require.NoError(t, err) assert.Equal(t, "hello world", result.Greeting) } @@ -275,7 +276,7 @@ func TestNATSRequest_ErrorResponse(t *testing.T) { require.NoError(t, err) type Resp struct{} - _, err = NATSRequest[Resp](nc, "test.fail", struct{}{}, 2*time.Second, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.fail", struct{}{}, 2*time.Second, "") assert.Error(t, err) assert.Contains(t, err.Error(), "InvalidParameterValue") } @@ -288,7 +289,7 @@ func TestNATSRequest_NoResponders(t *testing.T) { defer nc.Close() type Resp struct{} - _, err = NATSRequest[Resp](nc, "test.nobody", struct{}{}, 500*time.Millisecond, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.nobody", struct{}{}, 500*time.Millisecond, "") assert.Error(t, err) } @@ -306,7 +307,7 @@ func TestNATSRequest_Timeout(t *testing.T) { require.NoError(t, err) type Resp struct{} - _, err = NATSRequest[Resp](nc, "test.slow", struct{}{}, 100*time.Millisecond, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.slow", struct{}{}, 100*time.Millisecond, "") assert.Error(t, err) } @@ -326,7 +327,7 @@ func TestNATSRequest_InvalidUnmarshal(t *testing.T) { type Resp struct { Value int `json:"value"` } - _, err = NATSRequest[Resp](nc, "test.badjson", struct{}{}, 2*time.Second, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.badjson", struct{}{}, 2*time.Second, "") assert.Error(t, err) assert.Contains(t, err.Error(), "unmarshal") } @@ -359,7 +360,7 @@ func TestNATSRequest_AccountIDHeader(t *testing.T) { }) require.NoError(t, err) - result, err := NATSRequest[Resp](nc, "test.account", Req{Name: "world"}, 2*time.Second, "111122223333") + result, err := NATSRequest[Resp](context.Background(), nc, "test.account", Req{Name: "world"}, 2*time.Second, "111122223333") require.NoError(t, err) assert.Equal(t, "hello world", result.Greeting) assert.Equal(t, "111122223333", result.AccountID) @@ -374,7 +375,7 @@ func TestNATSRequest_MarshalError(t *testing.T) { type Resp struct{} // Channels cannot be marshaled to JSON - _, err = NATSRequest[Resp](nc, "test.marshalfail", make(chan int), 2*time.Second, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.marshalfail", make(chan int), 2*time.Second, "") assert.Error(t, err) assert.Contains(t, err.Error(), "failed to marshal input") } @@ -510,7 +511,7 @@ func TestNATSRequest_DisconnectedFastFail(t *testing.T) { require.Eventually(t, func() bool { return !nc.IsConnected() }, 3*time.Second, 50*time.Millisecond) start := time.Now() - _, err = NATSRequest[map[string]any](nc, "ec2.Describe", struct{}{}, 5*time.Second, "") + _, err = NATSRequest[map[string]any](context.Background(), nc, "ec2.Describe", struct{}{}, 5*time.Second, "") elapsed := time.Since(start) require.ErrorIs(t, err, ErrClusterUnavailable) @@ -521,7 +522,7 @@ func TestNATSRequest_DisconnectedFastFail(t *testing.T) { func TestNATSRequest_NilConn_ReturnsClusterUnavailable(t *testing.T) { type Resp struct{} - _, err := NATSRequest[Resp](nil, "test.never", struct{}{}, 50*time.Millisecond, "") + _, err := NATSRequest[Resp](context.Background(), nil, "test.never", struct{}{}, 50*time.Millisecond, "") require.Error(t, err) assert.ErrorIs(t, err, ErrClusterUnavailable) } @@ -533,7 +534,7 @@ func TestNATSRequest_ClosedConn_ReturnsClusterUnavailable(t *testing.T) { nc.Close() type Resp struct{} - _, err = NATSRequest[Resp](nc, "test.never", struct{}{}, 50*time.Millisecond, "") + _, err = NATSRequest[Resp](context.Background(), nc, "test.never", struct{}{}, 50*time.Millisecond, "") require.Error(t, err) assert.ErrorIs(t, err, ErrClusterUnavailable) } @@ -713,7 +714,7 @@ func TestGather_EarlyExitBeforeTimeout(t *testing.T) { } start := time.Now() - frames, sum, err := Gather(nc, "test.gather.early", []byte("{}"), + frames, sum, err := Gather(context.Background(), nc, "test.gather.early", []byte("{}"), GatherOpts{Timeout: 5 * time.Second, ExpectedNodes: 3}) elapsed := time.Since(start) @@ -735,7 +736,7 @@ func TestGather_TimesOutBelowExpected(t *testing.T) { require.NoError(t, err) } - frames, sum, err := Gather(nc, "test.gather.timeout", []byte("{}"), + frames, sum, err := Gather(context.Background(), nc, "test.gather.timeout", []byte("{}"), GatherOpts{Timeout: 300 * time.Millisecond, ExpectedNodes: 3}) require.NoError(t, err) @@ -763,7 +764,7 @@ func TestGather_MixedSuccessAndErrors(t *testing.T) { }) require.NoError(t, err) - frames, sum, err := Gather(nc, "test.gather.mixed", []byte("{}"), + frames, sum, err := Gather(context.Background(), nc, "test.gather.mixed", []byte("{}"), GatherOpts{Timeout: 2 * time.Second, ExpectedNodes: 4}) require.NoError(t, err) @@ -791,7 +792,7 @@ func TestGather_StopOnFirstSkipsErrors(t *testing.T) { }) require.NoError(t, err) - frames, sum, err := Gather(nc, "test.gather.first", []byte("{}"), + frames, sum, err := Gather(context.Background(), nc, "test.gather.first", []byte("{}"), GatherOpts{Timeout: 2 * time.Second, ExpectedNodes: 3, StopOnFirst: true}) require.NoError(t, err) @@ -830,7 +831,7 @@ func TestGather_OversizedFrameDropped(t *testing.T) { }) require.NoError(t, err) - frames, sum, err := Gather(nc, "test.gather.oversized", []byte("{}"), + frames, sum, err := Gather(context.Background(), nc, "test.gather.oversized", []byte("{}"), GatherOpts{Timeout: 2 * time.Second, ExpectedNodes: 1}) require.NoError(t, err) @@ -858,7 +859,7 @@ func TestGather_AccountIDHeaderSet(t *testing.T) { }) require.NoError(t, err) - frames, _, err := Gather(nc, "test.gather.acct.set", []byte("{}"), + frames, _, err := Gather(context.Background(), nc, "test.gather.acct.set", []byte("{}"), GatherOpts{Timeout: time.Second, ExpectedNodes: 1, AccountID: "111122223333"}) require.NoError(t, err) require.Len(t, frames, 1) @@ -882,7 +883,7 @@ func TestGather_AccountIDHeaderAbsentWhenEmpty(t *testing.T) { }) require.NoError(t, err) - frames, _, err := Gather(nc, "test.gather.acct.empty", []byte("{}"), + frames, _, err := Gather(context.Background(), nc, "test.gather.acct.empty", []byte("{}"), GatherOpts{Timeout: time.Second, ExpectedNodes: 1}) require.NoError(t, err) require.Len(t, frames, 1) @@ -894,7 +895,7 @@ func TestGather_AccountIDHeaderAbsentWhenEmpty(t *testing.T) { } func TestGather_NilConn_ReturnsClusterUnavailable(t *testing.T) { - frames, sum, err := Gather(nil, "test.never", []byte("{}"), + frames, sum, err := Gather(context.Background(), nil, "test.never", []byte("{}"), GatherOpts{Timeout: 50 * time.Millisecond, ExpectedNodes: 1}) require.ErrorIs(t, err, ErrClusterUnavailable) assert.Nil(t, frames) @@ -907,7 +908,7 @@ func TestGather_ClosedConn_ReturnsClusterUnavailable(t *testing.T) { require.NoError(t, err) nc.Close() - _, _, err = Gather(nc, "test.never", []byte("{}"), + _, _, err = Gather(context.Background(), nc, "test.never", []byte("{}"), GatherOpts{Timeout: 50 * time.Millisecond, ExpectedNodes: 1}) require.ErrorIs(t, err, ErrClusterUnavailable) } diff --git a/spinifex/utils/nats_trace_test.go b/spinifex/utils/nats_trace_test.go index 8a1d3317c..c0ef14347 100644 --- a/spinifex/utils/nats_trace_test.go +++ b/spinifex/utils/nats_trace_test.go @@ -49,7 +49,7 @@ func TestNATSTracePropagation(t *testing.T) { require.NoError(t, err) ctx, parent := otel.Tracer("test").Start(context.Background(), "parent-op") - out, err := NATSRequestCtx[traceEchoResponse](ctx, nc, "test.trace.echo", traceEchoRequest{Name: "spinifex"}, 5*time.Second, "123456789012") + out, err := NATSRequest[traceEchoResponse](ctx, nc, "test.trace.echo", traceEchoRequest{Name: "spinifex"}, 5*time.Second, "123456789012") require.NoError(t, err) parent.End() @@ -75,9 +75,9 @@ func TestNATSTracePropagation(t *testing.T) { assert.Equal(t, clientSpanID, consumerParentID, "consumer span parent must be the producer client span") } -// TestNATSRequestCtxNoSpanStillWorks: without a recording span the request +// TestNATSRequestNoSpanStillWorks: without a recording span the request // must behave exactly like NATSRequest (no headers beyond AccountID required). -func TestNATSRequestCtxNoSpanStillWorks(t *testing.T) { +func TestNATSRequestNoSpanStillWorks(t *testing.T) { ns := startTestNATSServer(t) nc, err := nats.Connect(ns.ClientURL()) require.NoError(t, err) @@ -90,7 +90,7 @@ func TestNATSRequestCtxNoSpanStillWorks(t *testing.T) { }) require.NoError(t, err) - out, err := NATSRequest[traceEchoResponse](nc, "test.trace.plain", traceEchoRequest{Name: "plain"}, 5*time.Second, "123456789012") + out, err := NATSRequest[traceEchoResponse](context.Background(), nc, "test.trace.plain", traceEchoRequest{Name: "plain"}, 5*time.Second, "123456789012") require.NoError(t, err) assert.Equal(t, "plain", out.Name) } diff --git a/spinifex/vm/volumes.go b/spinifex/vm/volumes.go index 243ba44f4..c3c3194aa 100644 --- a/spinifex/vm/volumes.go +++ b/spinifex/vm/volumes.go @@ -20,14 +20,6 @@ import ( // gives a 20s budget. const blockdevDelMaxAttempts = 20 -// AttachVolumeResult carries the AWS-API device name (/dev/sd[f-p]) and the -// in-guest path (/dev/vd*) discovered via QMP. DeviceName is echoed in the -// API response and volume metadata; GuestDevice is used for diagnostics. -type AttachVolumeResult struct { - DeviceName string - GuestDevice string -} - // rollbackUnmount best-effort unmounts a volume while unwinding a failed // AttachVolume. The volume never took guest writes, so the unmount seal is a // no-op; a failure is logged and tolerated rather than masking the attach error. @@ -55,14 +47,15 @@ func (m *Manager) delIothreadBestEffort(ctx context.Context, instance *VM, iothr // AttachVolume hot-plugs a volume via the QMP pipeline (mount → blockdev-add → // device_add). Partial state is rolled back on failure. If device is empty, the // next free /dev/sd[f-p] slot is allocated. Instance must be in StateRunning. -func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) (AttachVolumeResult, error) { +// Returns the AWS-API device name (/dev/sd[f-p]) echoed in the API response. +func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) (string, error) { instance, ok := m.Get(id) if !ok { - return AttachVolumeResult{}, ErrInstanceNotFound + return "", ErrInstanceNotFound } if status := m.Status(instance); status != StateRunning { - return AttachVolumeResult{}, fmt.Errorf("%w: cannot attach to instance %s in state %s", + return "", fmt.Errorf("%w: cannot attach to instance %s in state %s", ErrInvalidTransition, id, status) } @@ -76,7 +69,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) if device == "" { m.UpdateState(id, func(v *VM) { device = nextAvailableDevice(v) }) if device == "" { - return AttachVolumeResult{}, ErrAttachmentLimitExceeded + return "", ErrAttachmentLimitExceeded } } @@ -86,7 +79,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) } if m.deps.VolumeMounter == nil { - return AttachVolumeResult{}, fmt.Errorf("VolumeMounter not wired") + return "", fmt.Errorf("VolumeMounter not wired") } if err := m.deps.VolumeMounter.MountOne(&ebsRequest); err != nil { slog.ErrorContext(ctx, "AttachVolume: ebs.mount failed", "volumeId", volumeID, "err", err) @@ -95,14 +88,14 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) if errors.Is(err, ErrMountAmbiguous) { m.rollbackUnmount(ebsRequest) } - return AttachVolumeResult{}, fmt.Errorf("mount volume %s: %w", volumeID, err) + return "", fmt.Errorf("mount volume %s: %w", volumeID, err) } serverType, socketPath, nbdHost, nbdPort, err := utils.ParseNBDURI(ebsRequest.NBDURI) if err != nil { slog.ErrorContext(ctx, "AttachVolume: failed to parse NBDURI", "uri", ebsRequest.NBDURI, "err", err) m.rollbackUnmount(ebsRequest) - return AttachVolumeResult{}, fmt.Errorf("parse NBDURI: %w", err) + return "", fmt.Errorf("parse NBDURI: %w", err) } var serverArg map[string]any @@ -129,7 +122,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) if hotplugPort == 0 { slog.ErrorContext(ctx, "AttachVolume: EBS hot-plug port pool exhausted", "volumeId", volumeID) m.rollbackUnmount(ebsRequest) - return AttachVolumeResult{}, ErrAttachmentLimitExceeded + return "", ErrAttachmentLimitExceeded } ebsRequest.HotplugPort = hotplugPort @@ -142,7 +135,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) }, instance.ID); err != nil { slog.ErrorContext(ctx, "AttachVolume: QMP object-add iothread failed", "volumeId", volumeID, "err", err) m.rollbackUnmount(ebsRequest) - return AttachVolumeResult{}, fmt.Errorf("QMP object-add iothread: %w", err) + return "", fmt.Errorf("QMP object-add iothread: %w", err) } if _, err := sendQMPCommand(ctx, instance.QMPClient, qmp.QMPCommand{ @@ -158,7 +151,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) slog.ErrorContext(ctx, "AttachVolume: QMP blockdev-add failed", "volumeId", volumeID, "err", err) m.delIothreadBestEffort(ctx, instance, iothreadID, volumeID) m.rollbackUnmount(ebsRequest) - return AttachVolumeResult{}, fmt.Errorf("QMP blockdev-add: %w", err) + return "", fmt.Errorf("QMP blockdev-add: %w", err) } // The virtio-blk-pci device must land on a free hot-plug PCIe root port @@ -195,7 +188,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) m.delIothreadBestEffort(ctx, instance, iothreadID, volumeID) m.rollbackUnmount(ebsRequest) } - return AttachVolumeResult{}, fmt.Errorf("QMP device_add: %w", err) + return "", fmt.Errorf("QMP device_add: %w", err) } // Discover guest device. query-block may not include the device @@ -274,7 +267,7 @@ func (m *Manager) AttachVolume(ctx context.Context, id, volumeID, device string) "volumeId", volumeID, "instanceId", instance.ID, "apiDevice", device, "guestDevice", guestDevice) - return AttachVolumeResult{DeviceName: device, GuestDevice: guestDevice}, nil + return device, nil } // DetachVolume hot-unplugs a volume via the QMP pipeline (device_del → diff --git a/spinifex/vm/volumes_test.go b/spinifex/vm/volumes_test.go index 1ffb0ed4c..a46e05a06 100644 --- a/spinifex/vm/volumes_test.go +++ b/spinifex/vm/volumes_test.go @@ -776,13 +776,11 @@ func TestAttachVolume_PersistsAPIDeviceNameInVolumeMetadata(t *testing.T) { QMPClient: qmpClient, }) - res, err := m.AttachVolume(t.Context(), "i-1", "vol-1", "/dev/sdf") + device, err := m.AttachVolume(t.Context(), "i-1", "vol-1", "/dev/sdf") require.NoError(t, err) - assert.Equal(t, "/dev/sdf", res.DeviceName, - "AttachVolumeResult.DeviceName must echo the API-form name so the daemon's AttachVolume response and aws_volume_attachment's post-attach wait both round-trip the AWS-spec contract") - assert.Equal(t, "/dev/vdc", res.GuestDevice, - "AttachVolumeResult.GuestDevice must carry the in-guest virtio path discovered from query-block") + assert.Equal(t, "/dev/sdf", device, + "AttachVolume must return the API-form name so the daemon's AttachVolume response and aws_volume_attachment's post-attach wait both round-trip the AWS-spec contract") calls := stateUpdater.snapshot() require.Len(t, calls, 1,