44 "fmt"
55 "os"
66
7+ "github.com/firecracker-microvm/firecracker-go-sdk"
8+ "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
79 "github.com/go-playground/validator/v10"
810 "gopkg.in/yaml.v3"
911)
@@ -16,7 +18,7 @@ type Config struct {
1618 BasicAuthEnabled bool `yaml:"basic_auth_enabled" validate:""`
1719 BasicAuthUsers map [string ]string `yaml:"basic_auth_users" validate:"required_if=basic_auth_enabled true"`
1820 GitHub * GitHubConfig `yaml:"github" validate:"required"`
19- Pools []* PoolConfig `yaml:"pools" validate:"required,min=1"`
21+ Pools []* PoolConfig `yaml:"pools" validate:"required,min=1,dive,required "`
2022 LogLevel string `yaml:"log_level" validate:"required,oneof=debug info warn error fatal panic trace"`
2123
2224 path string
@@ -47,18 +49,67 @@ type RunnerConfig struct {
4749}
4850
4951type FirecrackerConfig struct {
50- BinaryPath string `yaml:"binary_path" `
51- KernelImagePath string `yaml:"kernel_image_path"`
52- KernelArgs string `yaml:"kernel_args"`
53- MachineConfig FirecrackerMachineConfig `yaml:"machine_config"`
54- Metadata map [string ]interface {} `yaml:"metadata"`
52+ BinaryPath string `yaml:"binary_path" `
53+ KernelImagePath string `yaml:"kernel_image_path"`
54+ KernelArgs string `yaml:"kernel_args"`
55+ MachineConfig FirecrackerMachineConfig `yaml:"machine_config"`
56+ NetworkInterface * FirecrackerNetworkInterfaceConfig `yaml:"network_interface"`
57+ Metadata map [string ]interface {} `yaml:"metadata"`
5558}
5659
5760type FirecrackerMachineConfig struct {
5861 VcpuCount int64 `yaml:"vcpu_count"`
5962 MemSizeMib int64 `yaml:"mem_size_mib"`
6063}
6164
65+ // FirecrackerNetworkInterfaceConfig configures the MicroVM's network interface.
66+ // Rate limiters are optional, a nil limiter leaves that direction unlimited.
67+ type FirecrackerNetworkInterfaceConfig struct {
68+ InRateLimiter * FirecrackerRateLimiterConfig `yaml:"in_rate_limiter"`
69+ OutRateLimiter * FirecrackerRateLimiterConfig `yaml:"out_rate_limiter"`
70+ }
71+
72+ // FirecrackerRateLimiterConfig defines an IO rate limiter with independent
73+ // bytes/s and ops/s limits. A nil token bucket leaves that limit unlimited.
74+ type FirecrackerRateLimiterConfig struct {
75+ Bandwidth * FirecrackerTokenBucketConfig `yaml:"bandwidth"`
76+ Ops * FirecrackerTokenBucketConfig `yaml:"ops"`
77+ }
78+
79+ // FirecrackerTokenBucketConfig defines a token bucket with a maximum capacity
80+ // (Size), an optional initial burst size (OneTimeBurst) and the interval in
81+ // milliseconds it takes to refill the bucket (RefillTime). The resulting rate
82+ // is Size / RefillTime.
83+ type FirecrackerTokenBucketConfig struct {
84+ Size int64 `yaml:"size" validate:"required,gt=0"`
85+ OneTimeBurst * int64 `yaml:"one_time_burst" validate:"omitempty,gte=0"`
86+ RefillTime int64 `yaml:"refill_time" validate:"required,gt=0"`
87+ }
88+
89+ // toSDK converts the rate limiter configuration into its Firecracker SDK
90+ // representation. Returns nil if the rate limiter isn't configured.
91+ func (c * FirecrackerRateLimiterConfig ) toSDK () * models.RateLimiter {
92+ if c == nil {
93+ return nil
94+ }
95+
96+ return & models.RateLimiter {Bandwidth : c .Bandwidth .toSDK (), Ops : c .Ops .toSDK ()}
97+ }
98+
99+ // toSDK converts the token bucket configuration into its Firecracker SDK
100+ // representation. Returns nil if the token bucket isn't configured.
101+ func (c * FirecrackerTokenBucketConfig ) toSDK () * models.TokenBucket {
102+ if c == nil {
103+ return nil
104+ }
105+
106+ return & models.TokenBucket {
107+ Size : firecracker .Int64 (c .Size ),
108+ RefillTime : firecracker .Int64 (c .RefillTime ),
109+ OneTimeBurst : c .OneTimeBurst ,
110+ }
111+ }
112+
62113// DefaultConfig creates a new Config with default values.
63114func DefaultConfig () * Config {
64115 c := & Config {
0 commit comments