mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-19 19:01:42 +00:00
refactor: dead-code cleanup and helper deduplication (#486)
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"},
|
||||
}))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"},
|
||||
}))
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
package gateway
|
||||
|
||||
import "net/http"
|
||||
|
||||
func (gw *GatewayConfig) Account_Request(w http.ResponseWriter, r *http.Request) error {
|
||||
return nil
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
}),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 != "" {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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, "")
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 →
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user