refactor: dead-code cleanup and helper deduplication (#486)

This commit is contained in:
Julian Sommer
2026-07-09 14:53:49 +10:00
committed by GitHub
parent ee936ee8ad
commit 20288dbe5d
71 changed files with 397 additions and 676 deletions
+6 -8
View File
@@ -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")
+12 -29
View File
@@ -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
-5
View File
@@ -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.
+1 -2
View File
@@ -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
+4 -4
View File
@@ -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"))
+2 -2
View File
@@ -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
+2 -13
View File
@@ -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
}
@@ -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)
+2 -2
View File
@@ -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"},
}))
+1 -1
View File
@@ -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
+5 -23
View File
@@ -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)
-10
View File
@@ -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)
+15 -5
View File
@@ -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"},
}))
-7
View File
@@ -1,7 +0,0 @@
package gateway
import "net/http"
func (gw *GatewayConfig) Account_Request(w http.ResponseWriter, r *http.Request) error {
return nil
}
+8 -8
View File
@@ -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)
@@ -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
@@ -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
}
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
}
@@ -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
}
@@ -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)
+2 -2
View File
@@ -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
+10 -29
View File
@@ -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))
})
}
+5 -10
View File
@@ -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",
+2 -1
View File
@@ -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)
}),
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
}
+2 -2
View File
@@ -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
+3 -18
View File
@@ -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
+3 -3
View File
@@ -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)
}
+1 -1
View File
@@ -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)
+7 -7
View File
@@ -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)
}
@@ -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)
}
+3 -3
View File
@@ -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)
}
+6 -6
View File
@@ -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)
}
+5 -5
View File
@@ -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)
}
+8 -8
View File
@@ -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)
}
@@ -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
}
@@ -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)
}
-54
View File
@@ -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
}
+4 -4
View File
@@ -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)
}
+3 -3
View File
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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)
}
+3 -3
View File
@@ -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)
}
+2 -2
View File
@@ -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 != "" {
+6 -6
View File
@@ -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)
}
+21 -21
View File
@@ -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)
}
+22 -22
View File
@@ -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
}
+4 -4
View File
@@ -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)
}
+26 -26
View File
@@ -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)
}
+37 -37
View File
@@ -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)
}
+1 -1
View File
@@ -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, "")
+35 -35
View File
@@ -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)
}
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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)
@@ -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")
-11
View File
@@ -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
+13 -23
View File
@@ -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
+20 -19
View File
@@ -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)
}
+4 -4
View File
@@ -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)
}
+13 -20
View File
@@ -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 →
+3 -5
View File
@@ -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,