Skip to content

Commit 59565ea

Browse files
committed
fix: consistently being validated
1 parent ba747da commit 59565ea

File tree

6 files changed

+365
-188
lines changed

6 files changed

+365
-188
lines changed

pkg/builder/types.go

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,42 +33,42 @@ type BuilderComponentArgs struct {
3333

3434
// BuilderEnv contains all environment variables required by the builder service.
3535
type BuilderEnv struct {
36-
AuthTokenRefreshInterval pulumi.StringInput `pulumi:"authTokenRefreshInterval"`
37-
AwsAccountId pulumi.StringInput `pulumi:"awsAccountId"`
38-
AwsAccessKeyId pulumi.StringInput `pulumi:"awsAccessKeyId"`
39-
AwsRegion pulumi.StringInput `pulumi:"awsRegion"`
40-
AwsSecretAccessKey pulumi.StringInput `pulumi:"awsSecretAccessKey"`
41-
BlockConfirmationBuffer pulumi.StringInput `pulumi:"blockConfirmationBuffer"`
42-
BlockQueryCutoff pulumi.StringInput `pulumi:"blockQueryCutoff"`
43-
BlockQueryStart pulumi.StringInput `pulumi:"blockQueryStart"`
44-
BuilderHelperAddress pulumi.StringInput `pulumi:"builderHelperAddress"`
45-
BuilderKey pulumi.StringInput `pulumi:"builderKey"`
46-
BuilderPort pulumi.StringInput `pulumi:"builderPort"`
47-
BuilderRewardsAddress pulumi.StringInput `pulumi:"builderRewardsAddress"`
48-
ChainOffset pulumi.StringInput `pulumi:"chainOffset"`
49-
ConcurrentLimit pulumi.StringInput `pulumi:"concurrentLimit"`
50-
HostChainId pulumi.StringInput `pulumi:"hostChainId"`
51-
HostRpcUrl pulumi.StringInput `pulumi:"hostRpcUrl"`
52-
OauthAudience pulumi.StringInput `pulumi:"oauthAudience"`
53-
OauthAuthenticateUrl pulumi.StringInput `pulumi:"oauthAuthenticateUrl"`
54-
OAuthClientId pulumi.StringInput `pulumi:"oauthClientId"`
55-
OauthClientSecret pulumi.StringInput `pulumi:"oauthClientSecret"`
56-
OauthIssuer pulumi.StringInput `pulumi:"oauthIssuer"`
57-
OauthTokenUrl pulumi.StringInput `pulumi:"oauthTokenUrl"`
36+
AuthTokenRefreshInterval pulumi.StringInput `pulumi:"authTokenRefreshInterval" validate:"required"`
37+
AwsAccountId pulumi.StringInput `pulumi:"awsAccountId" validate:"required"`
38+
AwsAccessKeyId pulumi.StringInput `pulumi:"awsAccessKeyId" validate:"required"`
39+
AwsRegion pulumi.StringInput `pulumi:"awsRegion" validate:"required"`
40+
AwsSecretAccessKey pulumi.StringInput `pulumi:"awsSecretAccessKey" validate:"required"`
41+
BlockConfirmationBuffer pulumi.StringInput `pulumi:"blockConfirmationBuffer" validate:"required"`
42+
BlockQueryCutoff pulumi.StringInput `pulumi:"blockQueryCutoff" validate:"required"`
43+
BlockQueryStart pulumi.StringInput `pulumi:"blockQueryStart" validate:"required"`
44+
BuilderHelperAddress pulumi.StringInput `pulumi:"builderHelperAddress" validate:"required"`
45+
BuilderKey pulumi.StringInput `pulumi:"builderKey" validate:"required"`
46+
BuilderPort pulumi.StringInput `pulumi:"builderPort" validate:"required"`
47+
BuilderRewardsAddress pulumi.StringInput `pulumi:"builderRewardsAddress" validate:"required"`
48+
ChainOffset pulumi.StringInput `pulumi:"chainOffset" validate:"required"`
49+
ConcurrentLimit pulumi.StringInput `pulumi:"concurrentLimit" validate:"required"`
50+
HostChainId pulumi.StringInput `pulumi:"hostChainId" validate:"required"`
51+
HostRpcUrl pulumi.StringInput `pulumi:"hostRpcUrl" validate:"required"`
52+
OauthAudience pulumi.StringInput `pulumi:"oauthAudience" validate:"required"`
53+
OauthAuthenticateUrl pulumi.StringInput `pulumi:"oauthAuthenticateUrl" validate:"required"`
54+
OAuthClientId pulumi.StringInput `pulumi:"oauthClientId" validate:"required"`
55+
OauthClientSecret pulumi.StringInput `pulumi:"oauthClientSecret" validate:"required"`
56+
OauthIssuer pulumi.StringInput `pulumi:"oauthIssuer" validate:"required"`
57+
OauthTokenUrl pulumi.StringInput `pulumi:"oauthTokenUrl" validate:"required"`
5858
OtelExporterOtlpEndpoint pulumi.StringInput `pulumi:"otelExporterOtlpEndpoint"`
59-
QuinceyUrl pulumi.StringInput `pulumi:"quinceyUrl"`
60-
RollupBlockGasLimit pulumi.StringInput `pulumi:"rollupBlockGasLimit"`
61-
RollupChainId pulumi.StringInput `pulumi:"rollupChainId"`
62-
RollupRpcUrl pulumi.StringInput `pulumi:"rollupRpcUrl"`
59+
QuinceyUrl pulumi.StringInput `pulumi:"quinceyUrl" validate:"required"`
60+
RollupBlockGasLimit pulumi.StringInput `pulumi:"rollupBlockGasLimit" validate:"required"`
61+
RollupChainId pulumi.StringInput `pulumi:"rollupChainId" validate:"required"`
62+
RollupRpcUrl pulumi.StringInput `pulumi:"rollupRpcUrl" validate:"required"`
6363
RustLog pulumi.StringInput `pulumi:"rustLog"`
64-
SlotOffset pulumi.StringInput `pulumi:"slotOffset"`
65-
StartTimestamp pulumi.StringInput `pulumi:"startTimestamp"`
66-
SubmitViaCallData pulumi.StringInput `pulumi:"submitViaCallData"`
67-
TargetSlotTime pulumi.StringInput `pulumi:"targetSlotTime"`
68-
TxBroadcastUrls pulumi.StringInput `pulumi:"txBroadcastUrls"`
69-
TxPoolCacheDuration pulumi.StringInput `pulumi:"txPoolCacheDuration"`
70-
TxPoolUrl pulumi.StringInput `pulumi:"txPoolUrl"`
71-
ZenithAddress pulumi.StringInput `pulumi:"zenithAddress"`
64+
SlotOffset pulumi.StringInput `pulumi:"slotOffset" validate:"required"`
65+
StartTimestamp pulumi.StringInput `pulumi:"startTimestamp" validate:"required"`
66+
SubmitViaCallData pulumi.StringInput `pulumi:"submitViaCallData" validate:"required"`
67+
TargetSlotTime pulumi.StringInput `pulumi:"targetSlotTime" validate:"required"`
68+
TxBroadcastUrls pulumi.StringInput `pulumi:"txBroadcastUrls" validate:"required"`
69+
TxPoolCacheDuration pulumi.StringInput `pulumi:"txPoolCacheDuration" validate:"required"`
70+
TxPoolUrl pulumi.StringInput `pulumi:"txPoolUrl" validate:"required"`
71+
ZenithAddress pulumi.StringInput `pulumi:"zenithAddress" validate:"required"`
7272
}
7373

7474
// GetEnvMap implements the utils.EnvProvider interface

pkg/builder/validation.go

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,53 @@ func (args *BuilderComponentArgs) Validate() error {
2323

2424
// Validate validates the BuilderEnv
2525
func (env *BuilderEnv) Validate() error {
26-
if env.BuilderPort == nil {
27-
return fmt.Errorf("builder port is required")
26+
if env.AuthTokenRefreshInterval == nil {
27+
return fmt.Errorf("auth token refresh interval is required")
28+
}
29+
if env.AwsAccountId == nil {
30+
return fmt.Errorf("aws account id is required")
31+
}
32+
if env.AwsAccessKeyId == nil {
33+
return fmt.Errorf("aws access key id is required")
34+
}
35+
if env.AwsRegion == nil {
36+
return fmt.Errorf("aws region is required")
37+
}
38+
if env.AwsSecretAccessKey == nil {
39+
return fmt.Errorf("aws secret access key is required")
40+
}
41+
if env.BlockConfirmationBuffer == nil {
42+
return fmt.Errorf("block confirmation buffer is required")
43+
}
44+
if env.BlockQueryCutoff == nil {
45+
return fmt.Errorf("block query cutoff is required")
46+
}
47+
if env.BlockQueryStart == nil {
48+
return fmt.Errorf("block query start is required")
49+
}
50+
if env.BuilderHelperAddress == nil {
51+
return fmt.Errorf("builder helper address is required")
2852
}
2953
if env.BuilderKey == nil {
3054
return fmt.Errorf("builder key is required")
3155
}
32-
if env.HostRpcUrl == nil {
33-
return fmt.Errorf("host RPC URL is required")
56+
if env.BuilderPort == nil {
57+
return fmt.Errorf("builder port is required")
3458
}
35-
if env.RollupRpcUrl == nil {
36-
return fmt.Errorf("rollup RPC URL is required")
59+
if env.BuilderRewardsAddress == nil {
60+
return fmt.Errorf("builder rewards address is required")
3761
}
38-
if env.ZenithAddress == nil {
39-
return fmt.Errorf("zenith address is required")
62+
if env.ChainOffset == nil {
63+
return fmt.Errorf("chain offset is required")
4064
}
41-
if env.QuinceyUrl == nil {
42-
return fmt.Errorf("quincey URL is required")
65+
if env.ConcurrentLimit == nil {
66+
return fmt.Errorf("concurrent limit is required")
4367
}
44-
if env.OtelExporterOtlpEndpoint == nil {
45-
return fmt.Errorf("otel exporter otlp endpoint is required")
68+
if env.HostChainId == nil {
69+
return fmt.Errorf("host chain id is required")
70+
}
71+
if env.HostRpcUrl == nil {
72+
return fmt.Errorf("host RPC URL is required")
4673
}
4774
if env.OauthAudience == nil {
4875
return fmt.Errorf("oauth audience is required")
@@ -62,6 +89,21 @@ func (env *BuilderEnv) Validate() error {
6289
if env.OauthTokenUrl == nil {
6390
return fmt.Errorf("oauth token URL is required")
6491
}
92+
if env.OtelExporterOtlpEndpoint == nil {
93+
return fmt.Errorf("otel exporter otlp endpoint is required")
94+
}
95+
if env.QuinceyUrl == nil {
96+
return fmt.Errorf("quincey URL is required")
97+
}
98+
if env.RollupBlockGasLimit == nil {
99+
return fmt.Errorf("rollup block gas limit is required")
100+
}
101+
if env.RollupChainId == nil {
102+
return fmt.Errorf("rollup chain id is required")
103+
}
104+
if env.RollupRpcUrl == nil {
105+
return fmt.Errorf("rollup RPC URL is required")
106+
}
65107
if env.RustLog == nil {
66108
return fmt.Errorf("rust log is required")
67109
}
@@ -86,6 +128,9 @@ func (env *BuilderEnv) Validate() error {
86128
if env.TxPoolUrl == nil {
87129
return fmt.Errorf("tx pool URL is required")
88130
}
131+
if env.ZenithAddress == nil {
132+
return fmt.Errorf("zenith address is required")
133+
}
89134

90135
return nil
91136
}

pkg/builder/validation_test.go

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func TestBuilderComponentArgsValidate(t *testing.T) {
6363
}
6464
err := args.Validate()
6565
assert.Error(t, err)
66-
assert.Equal(t, "builder port is required", err.Error())
66+
assert.Equal(t, "auth token refresh interval is required", err.Error())
6767
})
6868

6969
// Test with valid args and minimal valid BuilderEnv
@@ -74,19 +74,33 @@ func TestBuilderComponentArgsValidate(t *testing.T) {
7474
Image: "test-image:latest",
7575
AppLabels: AppLabels{Labels: pulumi.StringMap{"app": pulumi.String("test")}},
7676
BuilderEnv: BuilderEnv{
77-
BuilderPort: pulumi.String("8080"),
77+
AuthTokenRefreshInterval: pulumi.String("300"),
78+
AwsAccountId: pulumi.String("123456789012"),
79+
AwsAccessKeyId: pulumi.String("test-access-key"),
80+
AwsRegion: pulumi.String("us-west-2"),
81+
AwsSecretAccessKey: pulumi.String("test-secret-key"),
82+
BlockConfirmationBuffer: pulumi.String("10"),
83+
BlockQueryCutoff: pulumi.String("2000"),
84+
BlockQueryStart: pulumi.String("1000"),
85+
BuilderHelperAddress: pulumi.String("0x123456"),
7886
BuilderKey: pulumi.String("test-key"),
87+
BuilderPort: pulumi.String("8080"),
88+
BuilderRewardsAddress: pulumi.String("0x789abc"),
89+
ChainOffset: pulumi.String("10"),
90+
ConcurrentLimit: pulumi.String("100"),
91+
HostChainId: pulumi.String("1"),
7992
HostRpcUrl: pulumi.String("http://host-rpc"),
80-
RollupRpcUrl: pulumi.String("http://rollup-rpc"),
81-
ZenithAddress: pulumi.String("0x123456"),
82-
QuinceyUrl: pulumi.String("http://quincey"),
83-
OtelExporterOtlpEndpoint: pulumi.String("http://otel"),
8493
OauthAudience: pulumi.String("audience"),
8594
OauthAuthenticateUrl: pulumi.String("http://auth"),
8695
OAuthClientId: pulumi.String("client-id"),
8796
OauthClientSecret: pulumi.String("secret"),
8897
OauthIssuer: pulumi.String("issuer"),
8998
OauthTokenUrl: pulumi.String("http://token"),
99+
OtelExporterOtlpEndpoint: pulumi.String("http://otel"),
100+
QuinceyUrl: pulumi.String("http://quincey"),
101+
RollupBlockGasLimit: pulumi.String("30000000"),
102+
RollupChainId: pulumi.String("2"),
103+
RollupRpcUrl: pulumi.String("http://rollup-rpc"),
90104
RustLog: pulumi.String("info"),
91105
SlotOffset: pulumi.String("10"),
92106
StartTimestamp: pulumi.String("123456789"),
@@ -95,29 +109,10 @@ func TestBuilderComponentArgsValidate(t *testing.T) {
95109
TxBroadcastUrls: pulumi.String("http://broadcast"),
96110
TxPoolCacheDuration: pulumi.String("60"),
97111
TxPoolUrl: pulumi.String("http://txpool"),
112+
ZenithAddress: pulumi.String("0xdef456"),
98113
},
99114
}
100115
err := args.Validate()
101116
assert.NoError(t, err)
102117
})
103118
}
104-
105-
func TestBuilderEnvValidate(t *testing.T) {
106-
// Test just one case for BuilderEnv validation
107-
t.Run("missing builder port", func(t *testing.T) {
108-
env := BuilderEnv{}
109-
err := env.Validate()
110-
assert.Error(t, err)
111-
assert.Equal(t, "builder port is required", err.Error())
112-
})
113-
114-
// Test with just BuilderPort set
115-
t.Run("missing builder key", func(t *testing.T) {
116-
env := BuilderEnv{
117-
BuilderPort: pulumi.String("8080"),
118-
}
119-
err := env.Validate()
120-
assert.Error(t, err)
121-
assert.Equal(t, "builder key is required", err.Error())
122-
})
123-
}

pkg/quincey/validation_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package quincey
2+
3+
import (
4+
"testing"
5+
6+
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestQuinceyComponentArgsValidate(t *testing.T) {
11+
// Test validation with missing fields
12+
testCases := []struct {
13+
name string
14+
args QuinceyComponentArgs
15+
wantErr string
16+
}{
17+
{
18+
name: "missing namespace",
19+
args: QuinceyComponentArgs{},
20+
wantErr: "namespace is required",
21+
},
22+
{
23+
name: "missing image",
24+
args: QuinceyComponentArgs{
25+
Namespace: pulumi.String("test-namespace"),
26+
},
27+
wantErr: "image is required",
28+
},
29+
{
30+
name: "missing virtual service hosts",
31+
args: QuinceyComponentArgs{
32+
Namespace: pulumi.String("test-namespace"),
33+
Image: pulumi.String("test-image:latest"),
34+
Env: QuinceyEnv{
35+
QuinceyPort: pulumi.String("8080"),
36+
QuinceyKeyId: pulumi.String("test-key-id"),
37+
AwsAccessKeyId: pulumi.String("test-access-key"),
38+
AwsSecretAccessKey: pulumi.String("test-secret-key"),
39+
AwsDefaultRegion: pulumi.String("us-west-2"),
40+
BlockQueryStart: pulumi.String("1000"),
41+
BlockQueryCutoff: pulumi.String("2000"),
42+
ChainOffset: pulumi.String("10"),
43+
HostRpcUrl: pulumi.String("http://host-rpc"),
44+
OauthIssuer: pulumi.String("https://issuer"),
45+
OauthJwksUri: pulumi.String("https://jwks"),
46+
QuinceyBuilders: pulumi.String("builder1,builder2"),
47+
},
48+
},
49+
wantErr: "virtual service hosts is required",
50+
},
51+
}
52+
53+
for _, tc := range testCases {
54+
t.Run(tc.name, func(t *testing.T) {
55+
err := tc.args.Validate()
56+
assert.Error(t, err)
57+
assert.Equal(t, tc.wantErr, err.Error())
58+
})
59+
}
60+
61+
// Test with valid args but empty QuinceyEnv
62+
t.Run("valid args but empty QuinceyEnv", func(t *testing.T) {
63+
args := QuinceyComponentArgs{
64+
Namespace: pulumi.String("test-namespace"),
65+
Image: pulumi.String("test-image:latest"),
66+
VirtualServiceHosts: pulumi.StringArray{pulumi.String("example.com")},
67+
}
68+
err := args.Validate()
69+
assert.Error(t, err)
70+
assert.Contains(t, err.Error(), "env is invalid")
71+
})
72+
73+
// Test with valid args and complete QuinceyEnv
74+
t.Run("valid args with complete QuinceyEnv", func(t *testing.T) {
75+
args := QuinceyComponentArgs{
76+
Namespace: pulumi.String("test-namespace"),
77+
Image: pulumi.String("test-image:latest"),
78+
VirtualServiceHosts: pulumi.StringArray{pulumi.String("example.com")},
79+
Env: QuinceyEnv{
80+
QuinceyPort: pulumi.String("8080"),
81+
QuinceyKeyId: pulumi.String("test-key-id"),
82+
AwsAccessKeyId: pulumi.String("test-access-key"),
83+
AwsSecretAccessKey: pulumi.String("test-secret-key"),
84+
AwsDefaultRegion: pulumi.String("us-west-2"),
85+
BlockQueryStart: pulumi.String("1000"),
86+
BlockQueryCutoff: pulumi.String("2000"),
87+
ChainOffset: pulumi.String("10"),
88+
HostRpcUrl: pulumi.String("http://host-rpc"),
89+
OauthIssuer: pulumi.String("https://issuer"),
90+
OauthJwksUri: pulumi.String("https://jwks"),
91+
QuinceyBuilders: pulumi.String("builder1,builder2"),
92+
// Optional fields
93+
OtelExporterOtlpEndpoint: pulumi.String("http://otel"),
94+
OtelExporterOtlpProtocol: pulumi.String("grpc"),
95+
RustLog: pulumi.String("info"),
96+
},
97+
}
98+
err := args.Validate()
99+
assert.NoError(t, err)
100+
})
101+
}

0 commit comments

Comments
 (0)