From 8e01e76dc05cb9917abadd253a76f21edf66b013 Mon Sep 17 00:00:00 2001 From: Julian Sommer <115516918+juliansommer@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:52:03 +1000 Subject: [PATCH] fix: disable embedlit --- .golangci.yml | 1 + cmd/installer/install/zfs.go | 3 +-- cmd/rds-agent/health.go | 3 +-- internal/preflightgate/rungate_test.go | 3 +-- spinifex/awserrors/awserrors.go | 3 +-- spinifex/gateway/bedrock/converse_stream.go | 3 +-- spinifex/gateway/bedrock/invoke_stream.go | 3 +-- spinifex/gateway/bedrock/usage.go | 3 +-- spinifex/gateway/ec2/instance/placement.go | 2 +- spinifex/gateway/ecr/registry.go | 6 ++---- spinifex/gateway/ecr_image.go | 3 +-- spinifex/handlers/dns/zonelock.go | 3 +-- spinifex/handlers/eks/nodegroup.go | 2 +- spinifex/handlers/quota/vcpu.go | 3 +-- spinifex/instancetypes/generate_test.go | 2 +- spinifex/loadgen/clients.go | 3 +-- spinifex/migrate/version_readers.go | 2 +- spinifex/network/host/gateway_claim.go | 3 +-- spinifex/objectstore/objectstore.go | 3 +-- spinifex/services/nats/nats_test.go | 2 +- spinifex/vpcd/vpcd.go | 9 +++------ tests/bench/ebsctl/collector.go | 3 +-- 22 files changed, 25 insertions(+), 43 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index ad42438fe..860ef2bd9 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -118,6 +118,7 @@ linters: modernize: disable: + - embedlit # its fix promotes embedded fields into the outer literal, which does not compile - newexpr # don't replace aws.String() with new() — AWS SDK idiom - stringsbuilder # don't replace small string concatenations with strings.Builder diff --git a/cmd/installer/install/zfs.go b/cmd/installer/install/zfs.go index b3fa65c56..d78726566 100644 --- a/cmd/installer/install/zfs.go +++ b/cmd/installer/install/zfs.go @@ -182,8 +182,7 @@ func ImportablePools() ([]string, error) { // zpool exits non-zero when there is nothing to import, which is the // normal case. Anything else — no binary, no /dev/zfs — must surface, or // a machine with an existing pool looks empty to the caller. - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if _, ok := errors.AsType[*exec.ExitError](err); ok { return nil, nil } return nil, fmt.Errorf("zpool import: %w", err) diff --git a/cmd/rds-agent/health.go b/cmd/rds-agent/health.go index 0100d1fc2..83f9ee01a 100644 --- a/cmd/rds-agent/health.go +++ b/cmd/rds-agent/health.go @@ -28,8 +28,7 @@ func execProbeRunner(ctx context.Context, name string, args ...string) (int, str if ctxErr := ctx.Err(); ctxErr != nil { return -1, out, ctxErr } - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { return exitErr.ExitCode(), out, nil } return -1, out, err diff --git a/internal/preflightgate/rungate_test.go b/internal/preflightgate/rungate_test.go index 52cf3a93d..4bc738b94 100644 --- a/internal/preflightgate/rungate_test.go +++ b/internal/preflightgate/rungate_test.go @@ -30,8 +30,7 @@ func runGate(t *testing.T, args ...string) (string, int) { if err == nil { return string(out), 0 } - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { return string(out), exitErr.ExitCode() } t.Fatalf("running run-gate.sh: %v", err) diff --git a/spinifex/awserrors/awserrors.go b/spinifex/awserrors/awserrors.go index 82f100bdc..01cfcddbe 100644 --- a/spinifex/awserrors/awserrors.go +++ b/spinifex/awserrors/awserrors.go @@ -591,8 +591,7 @@ func resolveErrorDetail(err error) (code, message string, ok bool) { } text := err.Error() if _, exists := ErrorLookup[text]; exists { - var cause *codedError - if errors.As(err, &cause) { + if cause, ok := errors.AsType[*codedError](err); ok { return text, cause.message, true } return text, "", true diff --git a/spinifex/gateway/bedrock/converse_stream.go b/spinifex/gateway/bedrock/converse_stream.go index b79e27d6b..944646634 100644 --- a/spinifex/gateway/bedrock/converse_stream.go +++ b/spinifex/gateway/bedrock/converse_stream.go @@ -231,8 +231,7 @@ func pumpConverseStream(ctx context.Context, fw *frameWriter, src converseStream event, ok, err := src.Next(ctx) if err != nil { excType := excInternalServerException - var fault *streamFaultError - if errors.As(err, &fault) { + if _, ok := errors.AsType[*streamFaultError](err); ok { excType = excModelStreamErrorException } errCode = awserrors.ValidErrorCodeFromError(err) diff --git a/spinifex/gateway/bedrock/invoke_stream.go b/spinifex/gateway/bedrock/invoke_stream.go index c9bd8e465..1aef6bf6a 100644 --- a/spinifex/gateway/bedrock/invoke_stream.go +++ b/spinifex/gateway/bedrock/invoke_stream.go @@ -124,8 +124,7 @@ func pumpInvokeStream(ctx context.Context, fw *frameWriter, src invokeStreamSour chunk, ok, err := src.Next(ctx) if err != nil { excType := excInternalServerException - var fault *streamFaultError - if errors.As(err, &fault) { + if _, ok := errors.AsType[*streamFaultError](err); ok { excType = excModelStreamErrorException } errCode = awserrors.ValidErrorCodeFromError(err) diff --git a/spinifex/gateway/bedrock/usage.go b/spinifex/gateway/bedrock/usage.go index 55f67b034..744edd6a8 100644 --- a/spinifex/gateway/bedrock/usage.go +++ b/spinifex/gateway/bedrock/usage.go @@ -294,8 +294,7 @@ func isUsageCASConflict(err error) bool { if errors.Is(err, jetstream.ErrKeyExists) { return true } - var apiErr *jetstream.APIError - if errors.As(err, &apiErr) { + if apiErr, ok := errors.AsType[*jetstream.APIError](err); ok { return apiErr.ErrorCode == jetstream.JSErrCodeStreamWrongLastSequence } return false diff --git a/spinifex/gateway/ec2/instance/placement.go b/spinifex/gateway/ec2/instance/placement.go index f60e6bd5d..7f4bffb83 100644 --- a/spinifex/gateway/ec2/instance/placement.go +++ b/spinifex/gateway/ec2/instance/placement.go @@ -94,7 +94,7 @@ func queryNodeCapacity(ctx context.Context, natsConn *nats.Conn, instanceType st } // Random shuffle then stable-sort: fair distribution among equal-capacity nodes. - rand.Shuffle(len(nodes), func(i, j int) { + rand.Shuffle(len(nodes), func(i, j int) { //nolint:gosec // placement spread, not cryptographic nodes[i], nodes[j] = nodes[j], nodes[i] }) sort.SliceStable(nodes, func(i, j int) bool { diff --git a/spinifex/gateway/ecr/registry.go b/spinifex/gateway/ecr/registry.go index 761b443dc..5ca67eead 100644 --- a/spinifex/gateway/ecr/registry.go +++ b/spinifex/gateway/ecr/registry.go @@ -254,8 +254,7 @@ func (reg *Registry) getBlob(ctx context.Context, w http.ResponseWriter, _, dige func (reg *Registry) startUpload(w http.ResponseWriter, r *http.Request, name string) { ctx := r.Context() if err := reg.requireRepo(ctx, name); err != nil { - var mErr *ManifestStoreError - if errors.As(err, &mErr) { + if mErr, ok := errors.AsType[*ManifestStoreError](err); ok { WriteError(w, mErr.Status, mErr.Code, mErr.Msg) return } @@ -593,8 +592,7 @@ func (reg *Registry) putManifest(w http.ResponseWriter, r *http.Request, name, r digest, err := reg.StoreManifest(ctx, reg.AccountID, name, reference, r.Header.Get("Content-Type"), body) if err != nil { - var mErr *ManifestStoreError - if errors.As(err, &mErr) { + if mErr, ok := errors.AsType[*ManifestStoreError](err); ok { WriteError(w, mErr.Status, mErr.Code, mErr.Msg) return } diff --git a/spinifex/gateway/ecr_image.go b/spinifex/gateway/ecr_image.go index b197bff40..a01e1a56a 100644 --- a/spinifex/gateway/ecr_image.go +++ b/spinifex/gateway/ecr_image.go @@ -385,8 +385,7 @@ func (gw *GatewayConfig) ecrListImages(ctx context.Context, accountID, repo stri // mapStoreManifestError translates the OCI manifest-store error codes into AWS // PutImage error codes. func mapStoreManifestError(ctx context.Context, err error, repo string) error { - var mErr *gateway_ecr.ManifestStoreError - if errors.As(err, &mErr) { + if mErr, ok := errors.AsType[*gateway_ecr.ManifestStoreError](err); ok { switch mErr.Code { case "DIGEST_INVALID": return errors.New(awserrors.ErrorImageDigestDoesNotMatch) diff --git a/spinifex/handlers/dns/zonelock.go b/spinifex/handlers/dns/zonelock.go index 1fdf36508..15edaa540 100644 --- a/spinifex/handlers/dns/zonelock.go +++ b/spinifex/handlers/dns/zonelock.go @@ -203,8 +203,7 @@ func isZoneLockHeld(err error) bool { if errors.Is(err, jetstream.ErrKeyExists) { return true } - var apiErr *jetstream.APIError - if errors.As(err, &apiErr) { + if apiErr, ok := errors.AsType[*jetstream.APIError](err); ok { return apiErr.ErrorCode == jetstream.JSErrCodeStreamWrongLastSequence } return false diff --git a/spinifex/handlers/eks/nodegroup.go b/spinifex/handlers/eks/nodegroup.go index 0120ed0c0..f46b192e9 100644 --- a/spinifex/handlers/eks/nodegroup.go +++ b/spinifex/handlers/eks/nodegroup.go @@ -677,7 +677,7 @@ func (s *EKSServiceImpl) selectWorkerHost(ctx context.Context, instanceType stri counts[host]++ } } - rand.Shuffle(len(hosts), func(i, j int) { hosts[i], hosts[j] = hosts[j], hosts[i] }) + rand.Shuffle(len(hosts), func(i, j int) { hosts[i], hosts[j] = hosts[j], hosts[i] }) //nolint:gosec // worker spread, not cryptographic best := hosts[0] for _, h := range hosts[1:] { if counts[h] < counts[best] { diff --git a/spinifex/handlers/quota/vcpu.go b/spinifex/handlers/quota/vcpu.go index a93cf9ed0..20b6e07d7 100644 --- a/spinifex/handlers/quota/vcpu.go +++ b/spinifex/handlers/quota/vcpu.go @@ -121,8 +121,7 @@ func isCASConflict(err error) bool { if errors.Is(err, jetstream.ErrKeyExists) { return true } - var apiErr *jetstream.APIError - if errors.As(err, &apiErr) { + if apiErr, ok := errors.AsType[*jetstream.APIError](err); ok { return apiErr.ErrorCode == jetstream.JSErrCodeStreamWrongLastSequence } return false diff --git a/spinifex/instancetypes/generate_test.go b/spinifex/instancetypes/generate_test.go index 737db80e4..d4d408409 100644 --- a/spinifex/instancetypes/generate_test.go +++ b/spinifex/instancetypes/generate_test.go @@ -407,7 +407,7 @@ func TestGenerateInstanceTypes_BurstableFlag(t *testing.T) { for name, info := range broadwellTypes { isBurstable := strings.HasPrefix(name, "t") - family := strings.SplitN(name, ".", 2)[0] + family, _, _ := strings.Cut(name, ".") assert.Equal(t, isBurstable, *info.BurstablePerformanceSupported, "%s burstable flag mismatch", name) assert.Equal(t, !prevGen[family], *info.CurrentGeneration, diff --git a/spinifex/loadgen/clients.go b/spinifex/loadgen/clients.go index a74e22e4a..4a8eef450 100644 --- a/spinifex/loadgen/clients.go +++ b/spinifex/loadgen/clients.go @@ -115,8 +115,7 @@ func ErrorCode(err error) string { if err == nil { return "" } - var awsErr awserr.Error - if errors.As(err, &awsErr) { + if awsErr, ok := errors.AsType[awserr.Error](err); ok { return awsErr.Code() } if errors.Is(err, ErrShed) { diff --git a/spinifex/migrate/version_readers.go b/spinifex/migrate/version_readers.go index c4b2b63b2..1dc388144 100644 --- a/spinifex/migrate/version_readers.go +++ b/spinifex/migrate/version_readers.go @@ -91,7 +91,7 @@ func (r *NATSConfVersionReader) ReadVersion(path string) (int, error) { } // Check first line only. - firstLine := strings.SplitN(string(data), "\n", 2)[0] + firstLine, _, _ := strings.Cut(string(data), "\n") match := natsVersionRe.FindStringSubmatch(firstLine) if match == nil { return 0, nil // no version marker diff --git a/spinifex/network/host/gateway_claim.go b/spinifex/network/host/gateway_claim.go index f055c1db5..1edf55d1f 100644 --- a/spinifex/network/host/gateway_claim.go +++ b/spinifex/network/host/gateway_claim.go @@ -165,8 +165,7 @@ func (p *GatewayClaimProber) GatewayReachable(ctx context.Context, gwIP string) } cmd := exec.CommandContext(ctx, "ping", "-c", "1", "-W", "1", gwIP) if err := cmd.Run(); err != nil { - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if _, ok := errors.AsType[*exec.ExitError](err); ok { return false, nil } return false, fmt.Errorf("ping %s: %w", gwIP, err) diff --git a/spinifex/objectstore/objectstore.go b/spinifex/objectstore/objectstore.go index 6f92285e3..2f103132f 100644 --- a/spinifex/objectstore/objectstore.go +++ b/spinifex/objectstore/objectstore.go @@ -148,8 +148,7 @@ func (s *S3ObjectStore) EnsureBucket(ctx context.Context, bucket string) error { } _, err := s.client.CreateBucketWithContext(ctx, &s3.CreateBucketInput{Bucket: aws.String(bucket)}) if err != nil { - var aerr awserr.Error - if errors.As(err, &aerr) { + if aerr, ok := errors.AsType[awserr.Error](err); ok { switch aerr.Code() { case s3.ErrCodeBucketAlreadyOwnedByYou, s3.ErrCodeBucketAlreadyExists: return nil diff --git a/spinifex/services/nats/nats_test.go b/spinifex/services/nats/nats_test.go index 8ce5c7965..c2467a363 100644 --- a/spinifex/services/nats/nats_test.go +++ b/spinifex/services/nats/nats_test.go @@ -111,7 +111,7 @@ func TestRenderedConfig_HasMigrationVersionMarker(t *testing.T) { raw, err := os.ReadFile(templatePath(t)) require.NoError(t, err) - firstLine := strings.SplitN(string(raw), "\n", 2)[0] + firstLine, _, _ := strings.Cut(string(raw), "\n") assert.Equal(t, "# spinifex-config-version: 3", firstLine, "nats.conf template must start with the current migration version marker") } diff --git a/spinifex/vpcd/vpcd.go b/spinifex/vpcd/vpcd.go index 5f3f17691..31fd31069 100644 --- a/spinifex/vpcd/vpcd.go +++ b/spinifex/vpcd/vpcd.go @@ -246,8 +246,7 @@ var localSystemID = func() (string, error) { out, err := sudoCommand("ovs-vsctl", "get", "open_vswitch", ".", "external-ids:system-id").Output() if err != nil { var stderr string - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { stderr = strings.TrimSpace(string(exitErr.Stderr)) } return "", fmt.Errorf("ovs-vsctl get system-id: %s: %w", stderr, err) @@ -274,8 +273,7 @@ var discoverChassis = func(sbAddr string) ([]string, error) { out, err := sudoCommand("ovn-sbctl", args...).Output() if err != nil { var stderr string - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { stderr = strings.TrimSpace(string(exitErr.Stderr)) } return nil, fmt.Errorf("ovn-sbctl list Chassis: %s: %w", stderr, err) @@ -992,8 +990,7 @@ var portToBr = func(port string) (string, error) { out, err := sudoCommand("ovs-vsctl", "port-to-br", port).Output() if err != nil { var stderr string - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { + if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { stderr = strings.TrimSpace(string(exitErr.Stderr)) } return "", fmt.Errorf("ovs-vsctl port-to-br %s: %s: %w", port, stderr, err) diff --git a/tests/bench/ebsctl/collector.go b/tests/bench/ebsctl/collector.go index 14194cd32..1c8a575e8 100644 --- a/tests/bench/ebsctl/collector.go +++ b/tests/bench/ebsctl/collector.go @@ -21,8 +21,7 @@ func errCodeMessage(err error) (code, message string) { if err == nil { return "", "" } - var aerr awserr.Error - if errors.As(err, &aerr) { + if aerr, ok := errors.AsType[awserr.Error](err); ok { return aerr.Code(), aerr.Message() } return "non-aws-error", err.Error()