mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-15 17:11:30 +00:00
5de598e85a
* ci: skip building unused E2E suite binaries in e2e.yml's single/multi jobs These two jobs immediately rebuild suite-aware binaries after Build Install Artifacts and never consume the tar's _bin contents, so the cross-compiled suite build was pure waste. build-install-artifacts.sh gains an optional --skip-e2e-build flag (positional contract unchanged); e2e-nightly.yml and the other callers keep building the full set. * refactor: replace hand-rolled IMDS client with AWS SDK v2 internal/imdscreds, cmd/ecs-agent's metadata fetch and its credentials provider used a hand-written IMDSv2 token/GET flow with manual RFC3339 expiry parsing. A malformed Expiration silently fell back to "never expires" instead of failing. Replace it with feature/ec2/imds, credentials/ec2rolecreds and aws.CredentialsCache, following the internal/gwsign/signer.go precedent. An unparseable Expiration is now a hard error from Fetch, covered by TestFetch_BadExpirationErrors. Output shapes to callers are unchanged, and IMDS base URLs ending in /latest keep working. * refactor: derive predastore bind config from spinifex.toml in spx itself predastore-start.sh awk-parsed spinifex.toml for the bind host/port and node_id, exported them as env vars, then exec'd spx. Move that derivation into predastoreStartCmd via derivePredastoreBind, which reads the raw (non-DIAL-normalized) nodes.<node>.predastore section, defaulting node_id to -1 (co-located) when the key is absent, same as the script. An explicit --host/--port/--node-id flag or SPINIFEX_PREDASTORE_* env var still overrides the derived value. Delete the now-unused script and point the systemd unit's ExecStart directly at spx service predastore start, matching the spinifex-viperblock.service precedent.
62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
|
|
"github.com/mulgadc/spinifex/internal/imdscreds"
|
|
)
|
|
|
|
// instanceMetadata is the IMDS-derived identity of the host the agent runs on.
|
|
type instanceMetadata struct {
|
|
AccountID string
|
|
InstanceID string
|
|
AZ string
|
|
}
|
|
|
|
// fetchInstanceMetadata reads the instance-id, AZ and account-id from IMDSv2
|
|
// via the SDK IMDS client. base is the IMDS root, e.g.
|
|
// "http://169.254.169.254/latest".
|
|
func fetchInstanceMetadata(client *http.Client, base string) (instanceMetadata, error) {
|
|
imdsClient := imdscreds.NewClient(client, base)
|
|
ctx := context.Background()
|
|
|
|
instanceID, err := getMetadata(ctx, imdsClient, "instance-id")
|
|
if err != nil {
|
|
return instanceMetadata{}, fmt.Errorf("instance-id: %w", err)
|
|
}
|
|
az, err := getMetadata(ctx, imdsClient, "placement/availability-zone")
|
|
if err != nil {
|
|
return instanceMetadata{}, fmt.Errorf("availability-zone: %w", err)
|
|
}
|
|
|
|
doc, err := imdsClient.GetInstanceIdentityDocument(ctx, &imds.GetInstanceIdentityDocumentInput{})
|
|
if err != nil {
|
|
return instanceMetadata{}, fmt.Errorf("identity document: %w", err)
|
|
}
|
|
|
|
return instanceMetadata{
|
|
AccountID: doc.AccountID,
|
|
InstanceID: strings.TrimSpace(instanceID),
|
|
AZ: strings.TrimSpace(az),
|
|
}, nil
|
|
}
|
|
|
|
// getMetadata reads a single meta-data path and returns its body as a string.
|
|
func getMetadata(ctx context.Context, imdsClient *imds.Client, path string) (string, error) {
|
|
out, err := imdsClient.GetMetadata(ctx, &imds.GetMetadataInput{Path: path})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer out.Content.Close()
|
|
body, err := io.ReadAll(out.Content)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(body), nil
|
|
}
|