diff --git a/go/porcelain/deploy.go b/go/porcelain/deploy.go index 1cd24c73..7548bb13 100644 --- a/go/porcelain/deploy.go +++ b/go/porcelain/deploy.go @@ -822,15 +822,34 @@ func bundleFromManifest(ctx context.Context, manifestFile *os.File, observer Dep } } - hasConfig := function.DisplayName != "" || function.Generator != "" || len(routes) > 0 || len(function.BuildData) > 0 || function.Priority != 0 + hasConfig := function.DisplayName != "" || function.Generator != "" || len(routes) > 0 || len(function.BuildData) > 0 || function.Priority != 0 || function.TrafficRules != nil if hasConfig { - functionsConfig[file.Name] = models.FunctionConfig{ + cfg := models.FunctionConfig{ DisplayName: function.DisplayName, Generator: function.Generator, Routes: routes, BuildData: function.BuildData, Priority: int64(function.Priority), } + + if function.TrafficRules != nil { + cfg.TrafficRules = &models.TrafficRulesConfig{ + Action: &models.TrafficRulesConfigAction{ + Type: function.TrafficRules.Action.Type, + Config: &models.TrafficRulesConfigActionConfig{ + Aggregate: function.TrafficRules.Action.Config.Aggregate, + RateLimitConfig: &models.TrafficRulesRateLimitConfig{ + Algorithm: function.TrafficRules.Action.Config.RateLimitConfig.Algorithm, + WindowSize: int64(function.TrafficRules.Action.Config.RateLimitConfig.WindowSize), + WindowLimit: int64(function.TrafficRules.Action.Config.RateLimitConfig.WindowLimit), + }, + To: function.TrafficRules.Action.Config.To, + }, + }, + } + } + + functionsConfig[file.Name] = cfg } functions.Add(file.Name, file) diff --git a/go/porcelain/functions_manifest.go b/go/porcelain/functions_manifest.go index 9644a66b..a8444c3a 100644 --- a/go/porcelain/functions_manifest.go +++ b/go/porcelain/functions_manifest.go @@ -1,5 +1,7 @@ package porcelain +import "github.com/netlify/open-api/v2/go/models" + // https://github.com/netlify/zip-it-and-ship-it/blob/main/src/manifest.ts type functionsManifest struct { Functions []functionsManifestEntry `json:"functions"` @@ -19,6 +21,7 @@ type functionsManifestEntry struct { InvocationMode string `json:"invocationMode"` Routes []functionRoute `json:"routes"` Priority int `json:"priority"` + TrafficRules *functionTrafficRules `json:"trafficRules"` } type functionRoute struct { @@ -28,3 +31,18 @@ type functionRoute struct { Methods []string `json:"methods"` PreferStatic bool `json:"prefer_static"` } + +type functionTrafficRules struct { + Action struct { + Type string `json:"type"` + Config struct { + RateLimitConfig struct { + Algorithm string `json:"algorithm"` + WindowSize int `json:"windowSize"` + WindowLimit int `json:"windowLimit"` + } + Aggregate *models.TrafficRulesAggregateConfig + To string `json:"to"` + } + } +}