Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set circuitbreaker if org is paid #3626

Open
wants to merge 5 commits into
base: choreo
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
12 changes: 6 additions & 6 deletions adapter/config/default_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,18 +143,18 @@ var defaultConfig = &Config{
{
Organizations: "*",
CircuitBreakerName: "BasicCircuitBreaker",
MaxConnections: 3,
MaxRequests: 3,
MaxConnections: 1,
MaxRequests: 1,
MaxPendingRequests: 1,
MaxRetries: 3,
MaxConnectionPools: 1,
},
{
Organizations: "*",
CircuitBreakerName: "EnhancedCircuitBreaker",
MaxConnections: 50,
MaxRequests: 50,
MaxConnections: 25,
MaxRequests: 25,
MaxPendingRequests: 1,
MaxRetries: 50,
MaxConnectionPools: 2,
},
},
},
Expand Down
5 changes: 3 additions & 2 deletions adapter/internal/api/apis_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ func validateAndUpdateXds(apiProject mgw.ProjectAPI, override *bool) (err error)

// TODO: (renuka) optimize to update cache only once when all internal memory maps are updated
for vhost, environments := range vhostToEnvsMap {
_, err = xds.UpdateAPI(vhost, apiProject, environments, common.XdsOptions{})
_, err = xds.UpdateAPI(vhost, apiProject, environments, common.XdsOptions{}, synchronizer.ChoreoComponentInfo{})
if err != nil {
return
}
Expand All @@ -238,6 +238,7 @@ func ApplyAPIProjectFromAPIM(
vhostToEnvsMap map[string][]*synchronizer.GatewayLabel,
apiEnvs map[string]map[string]synchronizer.APIEnvProps,
xdsOptions common.XdsOptions,
choreoComponentInfo synchronizer.ChoreoComponentInfo,
) (deployedRevisionList []*notifier.DeployedAPIRevision, err error) {
apiProject, err := extractAPIProject(payload)
if err != nil {
Expand Down Expand Up @@ -283,7 +284,7 @@ func ApplyAPIProjectFromAPIM(
loggers.LoggerAPI.Debugf("Update all environments (%v) of API %v %v:%v with UUID \"%v\".",
environments, vhost, apiYaml.Name, apiYaml.Version, apiYaml.ID)
// first update the API for vhost
deployedRevision, err := xds.UpdateAPI(vhost, apiProject, environments, xdsOptions)
deployedRevision, err := xds.UpdateAPI(vhost, apiProject, environments, xdsOptions, choreoComponentInfo)
if err != nil {
return deployedRevisionList, fmt.Errorf("%v:%v with UUID \"%v\"", apiYaml.Name, apiYaml.Version, apiYaml.ID)
}
Expand Down
6 changes: 3 additions & 3 deletions adapter/internal/discovery/xds/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ func DeployReadinessAPI(envs []string) {

// UpdateAPI updates the Xds Cache when OpenAPI Json content is provided
func UpdateAPI(vHost string, apiProject mgw.ProjectAPI, deployedEnvironments []*synchronizer.GatewayLabel,
xdsOptions common.XdsOptions) (*notifier.DeployedAPIRevision, error) {
xdsOptions common.XdsOptions, apiChoreoComponentInfo synchronizer.ChoreoComponentInfo) (*notifier.DeployedAPIRevision, error) {

var mgwSwagger mgw.MgwSwagger
var deployedRevision *notifier.DeployedAPIRevision
Expand Down Expand Up @@ -372,14 +372,14 @@ func UpdateAPI(vHost string, apiProject mgw.ProjectAPI, deployedEnvironments []*
apiHashValue := generateHashValue(apiYaml.Name, apiYaml.Version)

if mgwSwagger.GetProdEndpoints() != nil {
mgwSwagger.GetProdEndpoints().SetEndpointsConfig(apiYaml.EndpointConfig.ProductionEndpoints, apiYaml.EndpointConfig.EndpointType, apiYaml.OrganizationID)
mgwSwagger.GetProdEndpoints().SetEndpointsConfig(apiYaml.EndpointConfig.ProductionEndpoints, apiYaml.EndpointConfig.EndpointType, apiYaml.OrganizationID, apiChoreoComponentInfo.IsChoreoOrgPaid)
if !mgwSwagger.GetProdEndpoints().SecurityConfig.Enabled && apiYaml.EndpointConfig.APIEndpointSecurity.Production.Enabled {
mgwSwagger.GetProdEndpoints().SecurityConfig = apiYaml.EndpointConfig.APIEndpointSecurity.Production
}
}

if mgwSwagger.GetSandEndpoints() != nil {
mgwSwagger.GetSandEndpoints().SetEndpointsConfig(apiYaml.EndpointConfig.SandBoxEndpoints, apiYaml.EndpointConfig.EndpointType, apiYaml.OrganizationID)
mgwSwagger.GetSandEndpoints().SetEndpointsConfig(apiYaml.EndpointConfig.SandBoxEndpoints, apiYaml.EndpointConfig.EndpointType, apiYaml.OrganizationID, apiChoreoComponentInfo.IsChoreoOrgPaid)
if !mgwSwagger.GetSandEndpoints().SecurityConfig.Enabled && apiYaml.EndpointConfig.APIEndpointSecurity.Sandbox.Enabled {
mgwSwagger.GetSandEndpoints().SecurityConfig = apiYaml.EndpointConfig.APIEndpointSecurity.Sandbox
}
Expand Down
30 changes: 12 additions & 18 deletions adapter/internal/oasparser/model/mgw_swagger.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ const prototypedAPI = "prototyped"

// BasicCircuitBreaker is the name for free tier cluster level circuit breaker
const BasicCircuitBreaker = "BasicCircuitBreaker"
const EnhancedCircuitBreaker = "EnhancedCircuitBreaker"

// GetCorsConfig returns the CorsConfiguration Object.
func (swagger *MgwSwagger) GetCorsConfig() *CorsConfig {
Expand Down Expand Up @@ -643,7 +644,7 @@ func (swagger *MgwSwagger) setXWso2Endpoints() error {
}

// SetEndpointsConfig set configs for Endpoints sent by api.yaml
func (endpointCluster *EndpointCluster) SetEndpointsConfig(endpointInfos []EndpointInfo, apiType string, orgID string) error {
func (endpointCluster *EndpointCluster) SetEndpointsConfig(endpointInfos []EndpointInfo, apiType string, orgID string, isChoreoOrgPaid bool) error {
if endpointInfos == nil || len(endpointInfos) == 0 {
return nil
}
Expand Down Expand Up @@ -685,7 +686,16 @@ func (endpointCluster *EndpointCluster) SetEndpointsConfig(endpointInfos []Endpo
var selectedCircuitBreaker *CircuitBreakers

for _, circuitBreaker := range conf.Envoy.Upstream.CircuitBreakers {
if utills.GetIsOrganizationInList(orgID, circuitBreaker.Organizations) {
if isChoreoOrgPaid && circuitBreaker.CircuitBreakerName == EnhancedCircuitBreaker {
selectedCircuitBreaker = createCircuitBreaker(
circuitBreaker.MaxConnections,
circuitBreaker.MaxPendingRequests,
circuitBreaker.MaxRequests,
circuitBreaker.MaxRetries,
circuitBreaker.MaxConnectionPools,
)
break
} else if !isChoreoOrgPaid && circuitBreaker.CircuitBreakerName == BasicCircuitBreaker {
selectedCircuitBreaker = createCircuitBreaker(
circuitBreaker.MaxConnections,
circuitBreaker.MaxPendingRequests,
Expand All @@ -694,22 +704,6 @@ func (endpointCluster *EndpointCluster) SetEndpointsConfig(endpointInfos []Endpo
circuitBreaker.MaxConnectionPools,
)
break
}
}
if selectedCircuitBreaker == nil {
for _, circuitBreaker := range conf.Envoy.Upstream.CircuitBreakers {
// breaks from the first iteration
if circuitBreaker.CircuitBreakerName == BasicCircuitBreaker {
selectedCircuitBreaker = createCircuitBreaker(
circuitBreaker.MaxConnections,
circuitBreaker.MaxPendingRequests,
circuitBreaker.MaxRequests,
circuitBreaker.MaxRetries,
circuitBreaker.MaxConnectionPools,
)
break
}

}
}
endpointCluster.Config.CircuitBreakers = selectedCircuitBreaker
Expand Down
9 changes: 5 additions & 4 deletions adapter/internal/oasparser/model/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,11 @@ type apiData struct {
}

type choreoComponentInfo struct {
OrganizationID string `json:"organizationId,omitempty"`
ProjectID string `json:"projectId,omitempty"`
ComponentID string `json:"componentId,omitempty"`
VersionID string `json:"versionId,omitempty"`
OrganizationID string `json:"organizationId,omitempty"`
ProjectID string `json:"projectId,omitempty"`
ComponentID string `json:"componentId,omitempty"`
VersionID string `json:"versionId,omitempty"`
IsChoreoOrgPaid bool `json:"isChoreoOrgPaid,omitempty"`
}

type backendJWTConfiguration struct {
Expand Down
4 changes: 2 additions & 2 deletions adapter/internal/synchronizer/apis_fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func PushAPIProjects(payload []byte, environments []string, xdsOptions common.Xd
// Pass the byte slice for the XDS APIs to push it to the enforcer and router
// TODO: (renuka) optimize applying API project, update maps one by one and apply xds once
var deployedRevisionList []*notifier.DeployedAPIRevision
deployedRevisionList, err = apiServer.ApplyAPIProjectFromAPIM(apiFileData, vhostToEnvsMap, envProps, xdsOptions)
deployedRevisionList, err = apiServer.ApplyAPIProjectFromAPIM(apiFileData, vhostToEnvsMap, envProps, xdsOptions, deployment.ChoreoComponentInfo)
if err != nil {
logger.LoggerSync.Errorf("Error occurred while applying project %v", err)
} else if deployedRevisionList != nil {
Expand All @@ -123,7 +123,7 @@ func PushAPIProjects(payload []byte, environments []string, xdsOptions common.Xd

// TODO: (renuka) notify the revision deployment to the control plane once all chunks are deployed.
// This is not fixed as notify the control plane chunk by chunk (even though the chunk is not really applied to the Enforcer and Router) is not a drastic issue.
// This path is only happening when Adapter is restarting and at that time the deployed time is already updated in the control plane.
// This path is only happening when Adapter is restarting and at that time the deployed time is already updated in the control plane.
notifier.SendRevisionUpdate(deploymentList)
logger.LoggerSync.Infof("Successfully deployed %d API/s", len(deploymentList))
// Error nil for successful execution
Expand Down
15 changes: 12 additions & 3 deletions adapter/pkg/synchronizer/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,10 @@ type APIDeployment struct {
APIFile string `json:"apiFile"`
Environments []GatewayLabel `json:"environments"`
// These properties are used by global Adapter
OrganizationID string `json:"organizationId"`
APIContext string `json:"apiContext"`
Version string `json:"version"`
OrganizationID string `json:"organizationId"`
ChoreoComponentInfo ChoreoComponentInfo `json:"choreoComponentInfo"`
APIContext string `json:"apiContext"`
Version string `json:"version"`
}

// GatewayLabel represents gateway environment name, vhost and deployedTimeStamp of an API project.
Expand All @@ -68,6 +69,14 @@ type GatewayLabel struct {
DeploymentType string `json:"deploymentType"`
}

type ChoreoComponentInfo struct {
OrganizationID string `json:"organizationId"`
ProjectID string `json:"projectId"`
ComponentID string `json:"componentId"`
VersionID string `json:"versionId"`
IsChoreoOrgPaid bool `json:"isChoreoOrgPaid"` // isPaidOrg
}

// APIConfigs represents env properties belongs to the API
type APIConfigs struct {
ProductionEndpoint string `mapstructure:"productionEndpoint,omitempty"`
Expand Down
18 changes: 9 additions & 9 deletions resources/conf/config.toml.template
Original file line number Diff line number Diff line change
Expand Up @@ -206,18 +206,18 @@ retainKeys = ["self_validate_jwt", "issuer", "claim_mappings", "consumer_key_cla
[[router.upstream.circuitBreakers]]
organizations = "*"
circuitBreakerName = "BasicCircuitBreaker"
maxConnections = 3
maxRequests = 3
maxPendingRequests = 0
maxConnectionPools = 3
maxConnections = 1
maxRequests = 1
maxPendingRequests = 1
maxConnectionPools = 1

[[router.upstream.circuitBreakers]]
organizations = "e0682456-2ba6-4c5f-8f36-3c5b6dc46913,4b9afefb-4bcc-4e63-85d3-ddd593841012,d3a7dfea-fb10-4371-b21d-85d1bc28667b"
organizations = "e0682456-2ba6-4c5f-8f36-3c5b6dc46913,4b9afefb-4bcc-4e63-85d3-ddd593841012"
circuitBreakerName = "EnhancedCircuitBreaker"
maxConnections = 50
maxRequests = 50
maxPendingRequests = 0
maxConnectionPools = 50
maxConnections = 25
maxRequests = 25
maxPendingRequests = 1
maxConnectionPools = 2

# Configs relevant to the envoy rate-limit service
[router.ratelimit]
Expand Down
Loading