Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions activities/builder/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import (
"go.uber.org/zap"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ecrpublic"
ecrtypes "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types"
"github.com/aws/aws-sdk-go-v2/service/ecr"
ecrtypes "github.com/aws/aws-sdk-go-v2/service/ecr/types"
"github.com/aws/aws-sdk-go-v2/service/sts"
"github.com/docker/cli/cli/config/configfile"
configtypes "github.com/docker/cli/cli/config/types"
Expand Down Expand Up @@ -96,12 +96,11 @@ func (a *Activity) createRepositoryIfNotExists(ctx context.Context) error {
return fmt.Errorf("failed to fetch STS identity: %w", err)
}

ecrClient := ecrpublic.NewFromConfig(*a.AwsConfig, func(options *ecrpublic.Options) {
// ecrpublic only works in us-east-1
options.Region = "us-east-1"
ecrClient := ecr.NewFromConfig(*a.AwsConfig, func(options *ecr.Options) {
options.Region = "us-east-2"
})

repositories, err := ecrClient.DescribeRepositories(ctx, &ecrpublic.DescribeRepositoriesInput{
repositories, err := ecrClient.DescribeRepositories(ctx, &ecr.DescribeRepositoriesInput{
RepositoryNames: []string{
a.BuilderConfig.Registry.ImageName,
},
Expand All @@ -118,7 +117,7 @@ func (a *Activity) createRepositoryIfNotExists(ctx context.Context) error {
return nil
}

_, err = ecrClient.CreateRepository(ctx, &ecrpublic.CreateRepositoryInput{
_, err = ecrClient.CreateRepository(ctx, &ecr.CreateRepositoryInput{
RepositoryName: aws.String(a.BuilderConfig.Registry.ImageName),
})

Expand Down
30 changes: 10 additions & 20 deletions activities/loadtest/mocks/nodei.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,31 +102,11 @@ func (m MockNode) Height(ctx context.Context) (uint64, error) {
panic("implement me")
}

func (m MockNode) InitHome(ctx context.Context) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) AddGenesisAccount(ctx context.Context, s string, coins []sdk.Coin) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) GenerateGenTx(ctx context.Context, coin sdk.Coin) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) CopyGenTx(ctx context.Context, i types.NodeI) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) CollectGenTxs(ctx context.Context) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) GenesisFileContent(ctx context.Context) ([]byte, error) {
//TODO implement me
panic("implement me")
Expand Down Expand Up @@ -172,6 +152,16 @@ func (m MockNode) SetSeedMode(ctx context.Context) error {
panic("implement me")
}

func (m MockNode) SetupNode(ctx context.Context) error {
//TODO implement me
panic("implement me")
}

func (m MockNode) SetupValidator(context.Context, types.WalletConfig, []sdk.Coin, sdk.Coin) (types.WalletI, string, error) {
//TODO implement me
panic("implement me")
}

func (m MockNode) NodeId(ctx context.Context) (string, error) {
//TODO implement me
panic("implement me")
Expand Down
54 changes: 43 additions & 11 deletions activities/testnet/testnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package testnet

import (
"context"
"encoding/base64"
"encoding/json"
"fmt"
"math/big"
"strings"

pb "github.com/skip-mev/ironbird/server/proto"

Expand Down Expand Up @@ -39,6 +42,31 @@ type Activity struct {
AwsConfig *aws.Config
}

// convertECRTokenToDockerAuth converts an ECR authorization token to Docker API RegistryAuth format
func convertECRTokenToDockerAuth(ecrToken string) (string, error) {
decodedToken, err := base64.StdEncoding.DecodeString(ecrToken)
if err != nil {
return "", fmt.Errorf("failed to decode ECR token: %w", err)
}

parts := strings.Split(string(decodedToken), ":")
if len(parts) != 2 {
return "", fmt.Errorf("invalid ECR token format")
}

authConfig := map[string]string{
"username": parts[0],
"password": parts[1],
}

authJSON, err := json.Marshal(authConfig)
if err != nil {
return "", fmt.Errorf("failed to marshal auth config: %w", err)
}

return base64.StdEncoding.EncodeToString(authJSON), nil
}

var (
CosmosWalletConfig = petritypes.WalletConfig{
SigningAlgorithm: "secp256k1",
Expand Down Expand Up @@ -150,18 +178,22 @@ func (a *Activity) LaunchTestnet(ctx context.Context, req messages.LaunchTestnet

nodeOptions := petritypes.NodeOptions{}

if req.RunnerType == messages.DigitalOcean {
token, err := util.FetchDockerRepoToken(ctx, *a.AwsConfig)
if err != nil {
logger.Error("Failed to fetch docker repo token", zap.Error(err))
}
nodeOptions.NodeDefinitionModifier = func(definition provider.TaskDefinition, config petritypes.NodeConfig) provider.TaskDefinition {
if definition.ProviderSpecificConfig == nil {
definition.ProviderSpecificConfig = make(map[string]string)
}
definition.ProviderSpecificConfig["docker_auth"] = token
return definition
token, err := util.FetchDockerRepoToken(ctx, *a.AwsConfig)
if err != nil {
logger.Error("Failed to fetch docker repo token", zap.Error(err))
}

dockerAuth, err := convertECRTokenToDockerAuth(token)
if err != nil {
logger.Error("Failed to convert ECR token to Docker auth format", zap.Error(err))
}

nodeOptions.NodeDefinitionModifier = func(definition provider.TaskDefinition, config petritypes.NodeConfig) provider.TaskDefinition {
if definition.ProviderSpecificConfig == nil {
definition.ProviderSpecificConfig = make(map[string]string)
}
definition.ProviderSpecificConfig["docker_auth"] = dockerAuth
return definition
}

chainConfig, walletConfig := constructChainConfig(req, a.Chains)
Expand Down
1 change: 0 additions & 1 deletion activities/walletcreator/walletcreator.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ func (a *Activity) CreateWallets(ctx context.Context, req messages.CreateWallets
}
}
}
time.Sleep(5 * time.Second)

if a.GRPCClient != nil {
walletInfo := &pb.WalletInfo{
Expand Down
4 changes: 2 additions & 2 deletions conf/worker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ temporal:
builder:
build_kit_address: "tcp://localhost:1234"
registry:
url: "public.ecr.aws"
image_name: "n7v2p5f8/skip-mev/ironbird-local"
url: "533266954560.dkr.ecr.us-east-2.amazonaws.com"
image_name: "ironbird/images"

tailscale:
node_tags:
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ toolchain go1.24.2

require (
cosmossdk.io/math v1.5.3
github.com/aws/aws-sdk-go-v2 v1.36.3
github.com/aws/aws-sdk-go-v2 v1.38.3
github.com/aws/aws-sdk-go-v2/config v1.29.5
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.32.1
github.com/aws/aws-sdk-go-v2/service/ecr v1.50.1
github.com/aws/aws-sdk-go-v2/service/sts v1.33.13
github.com/cilium/ipam v0.0.0-20230509084518-fd66eae7909b
github.com/cometbft/cometbft v0.38.17
Expand All @@ -34,6 +34,7 @@ require (
github.com/skip-mev/catalyst v0.0.0-beta.9
github.com/spf13/afero v1.12.0
github.com/stretchr/testify v1.10.0
github.com/tidwall/sjson v1.2.5
github.com/tonistiigi/fsutil v0.0.0-20241121093142-31cf1f437184
github.com/uber-go/tally/v4 v4.1.17
go.temporal.io/api v1.40.0
Expand Down Expand Up @@ -90,15 +91,15 @@ require (
github.com/ashanbrown/makezero v1.1.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.58 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 // indirect
github.com/aws/aws-sdk-go-v2/service/ssm v1.44.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 // indirect
github.com/aws/smithy-go v1.22.2 // indirect
github.com/aws/smithy-go v1.23.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bgentry/speakeasy v0.2.0 // indirect
github.com/bits-and-blooms/bitset v1.22.0 // indirect
Expand Down Expand Up @@ -379,7 +380,6 @@ require (
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tidwall/sjson v1.2.5 // indirect
github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect
github.com/timonwong/loggercheck v0.9.4 // indirect
github.com/tomarrell/wrapcheck/v2 v2.8.3 // indirect
Expand Down
20 changes: 10 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -187,22 +187,22 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA=
github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
github.com/aws/aws-sdk-go-v2 v1.38.3 h1:B6cV4oxnMs45fql4yRH+/Po/YU+597zgWqvDpYMturk=
github.com/aws/aws-sdk-go-v2 v1.38.3/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
github.com/aws/aws-sdk-go-v2/config v1.29.5 h1:4lS2IB+wwkj5J43Tq/AwvnscBerBJtQQ6YS7puzCI1k=
github.com/aws/aws-sdk-go-v2/config v1.29.5/go.mod h1:SNzldMlDVbN6nWxM7XsUiNXPSa1LWlqiXtvh/1PrJGg=
github.com/aws/aws-sdk-go-v2/credentials v1.17.58 h1:/d7FUpAPU8Lf2KUdjniQvfNdlMID0Sd9pS23FJ3SS9Y=
github.com/aws/aws-sdk-go-v2/credentials v1.17.58/go.mod h1:aVYW33Ow10CyMQGFgC0ptMRIqJWvJ4nxZb0sUiuQT/A=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 h1:7lOW8NUwE9UZekS1DYoiPdVAqZ6A+LheHWb+mHbNOq8=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27/go.mod h1:w1BASFIPOPUae7AgaH4SbjNbfdkxuggLyGfNFTn8ITY=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6 h1:uF68eJA6+S9iVr9WgX1NaRGyQ/6MdIyc4JNUo6TN1FA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6/go.mod h1:qlPeVZCGPiobx8wb1ft0GHT5l+dc6ldnwInDFaMvC7Y=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6 h1:pa1DEC6JoI0zduhZePp3zmhWvk/xxm4NB8Hy/Tlsgos=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6/go.mod h1:gxEjPebnhWGJoaDdtDkA0JX46VRg1wcTHYe63OfX5pE=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.32.1 h1:Tgvq4EuB0AcM2Au4kOmEHt/sm2BSwKrOzsM402g3iwg=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.32.1/go.mod h1:RZL7ov7c72wSmoM8bIiVxRHgcVdzhNkVW2J36C8RF4s=
github.com/aws/aws-sdk-go-v2/service/ecr v1.50.1 h1:lcwFjRx3C/hBxJzoWkD6DIG2jeB+mzLmFVBFVOadxxE=
github.com/aws/aws-sdk-go-v2/service/ecr v1.50.1/go.mod h1:qt9OL5kXqWoSub4QAkOF74mS3M2zOTNxMODqgwEUjt8=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 h1:O+8vD2rGjfihBewr5bT+QUfYUHIxCVgG61LHoT59shM=
Expand All @@ -215,8 +215,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 h1:f1L/JtUkVODD+k1+IiSJUUv
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13/go.mod h1:tvqlFoja8/s0o+UruA1Nrezo/df0PzdunMDDurUfg6U=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.13 h1:3LXNnmtH3TURctC23hnC0p/39Q5gre3FI7BNOiDcVWc=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.13/go.mod h1:7Yn+p66q/jt38qMoVfNvjbm3D89mGBnkwDcijgtih8w=
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
Expand Down
6 changes: 3 additions & 3 deletions messages/testnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import (
"fmt"

ctlttypes "github.com/skip-mev/catalyst/chains/types"
pb "github.com/skip-mev/ironbird/server/proto"
"github.com/skip-mev/ironbird/types"
petritypes "github.com/skip-mev/ironbird/petri/core/types"
petrichain "github.com/skip-mev/ironbird/petri/cosmos/chain"
pb "github.com/skip-mev/ironbird/server/proto"
"github.com/skip-mev/ironbird/types"
)

const (
Expand All @@ -18,7 +18,7 @@ const (

var (
DigitalOceanDefaultOpts = map[string]string{"region": "nyc1", "size": "s-4vcpu-8gb",
"image_id": "197794447"}
"image_id": "199449450"}
)

type RunnerType string
Expand Down
18 changes: 9 additions & 9 deletions petri/contrib/digitalocean/files/config.alloy
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ foreach "container" {
targets = [{ __address__ = string.format("127.0.0.1:%s", port), provider=json_path(local.file.creds.content, ".provider")[0], node_name=container["__meta_docker_container_label_petri_node_name"]}]
scrape_interval = "5s"
scrape_timeout = "5s"
forward_to = [prometheus.remote_write.overseer.receiver]
forward_to = [prometheus.remote_write.grafana_cloud.receiver]
}
}
}
}
}

prometheus.relabel "instance" {
forward_to = [prometheus.remote_write.overseer.receiver]
forward_to = [prometheus.remote_write.grafana_cloud.receiver]

rule {
action = "replace"
Expand All @@ -37,13 +37,13 @@ prometheus.relabel "instance" {
}
}

prometheus.remote_write "overseer" {
prometheus.remote_write "grafana_cloud" {
endpoint {
url = json_path(local.file.creds.content, ".prometheus.url")[0]

basic_auth {
username = json_path(local.file.creds.content, ".prometheus.username")[0]
password = json_path(local.file.creds.content, ".prometheus.password")[0]
username = <GRAFANA_OTLP_USER>
password = <GRAFANA_OTLP_PASSWORD>
}
}
}
Expand Down Expand Up @@ -73,16 +73,16 @@ loki.source.docker "default" {
targets = discovery.docker.containers.targets
labels = {"service" = "ironbird", "provider" = json_path(local.file.creds.content, ".provider")[0]}
relabel_rules = discovery.relabel.logs_integrations_docker.rules
forward_to = [loki.write.overseer.receiver]
forward_to = [loki.write.grafana_cloud.receiver]
}

loki.write "overseer" {
loki.write "grafana_cloud" {
endpoint {
url = json_path(local.file.creds.content, ".loki.url")[0]

basic_auth {
username = json_path(local.file.creds.content, ".loki.username")[0]
password = json_path(local.file.creds.content, ".loki.password")[0]
username = <GRAFANA_LOGS_USER>
password = <GRAFANA_LOGS_PASS>
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion petri/contrib/docs/digitalocean.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ as you would use the Docker provider.

1. Rename the `contrib/digitalocean/petri_docker.pkr.hcl.example` file to `contrib/digitalocean/petri_docker.pkr.hcl`
2. Replace `<DO_API_TOKEN>` with your DigitalOcean API token
3. Replace `<GRAF_PYRO_USER>` and `<GRAF_PYRO_PASS>` in `config.alloy` with your Grafana username and password for Pyroscope profiling data publication.
3. Replace `<GRAF_PYRO_USER>`, `<GRAF_PYRO_PASS>`,`<GRAF_LOKI_USER>`, `<GRAF_LOKI_PASS>`,`<GRAF_OTLP_USER>`, `<GRAF_OTLP_PASS>` in `config.alloy` with your Grafana username and password for Pyroscope profiling data publication.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So you need grafana admin to create the images yes?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah thats correct

4. Include the regions you're going to run Petri on in the "snapshot_regions" variable.
5. Run `packer build petri_docker.pkr.hcl`

Expand Down
9 changes: 6 additions & 3 deletions petri/core/provider/digitalocean/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,19 @@ func (p *Provider) CreateTask(ctx context.Context, definition provider.TaskDefin
}

_, _, err = task.dockerClient.ImageInspectWithRaw(ctx, definition.Image.Image)
registryAuth := doConfig["docker_auth"]
var registryAuth string
if provider.IsECRImage(definition.Image.Image) {
registryAuth = doConfig["docker_auth"]
}
if err != nil {
p.logger.Info("image not found, pulling", zap.String("image", definition.Image.Image))
for retries := 5; retries > 0; retries-- {
err = task.dockerClient.ImagePull(ctx, p.logger, definition.Image.Image, image.PullOptions{
RegistryAuth: registryAuth,
})
if err != nil {
p.logger.Info("got rate limited on docker pull, sleeping 10 seconds and going again")
time.Sleep(10 * time.Second)
p.logger.Info("error pulling image, reattempting in 2 seconds", zap.Error(err))
time.Sleep(2 * time.Second)
} else {
break
}
Expand Down
Loading
Loading