Skip to content

Commit

Permalink
adding initial CRD changes for Model based Round Robin for APIPolicy,…
Browse files Browse the repository at this point in the history
… Backend and AIProvider
  • Loading branch information
CrowleyRajapakse committed Jan 20, 2025
1 parent c10446a commit 5b02f81
Show file tree
Hide file tree
Showing 100 changed files with 5,777 additions and 1,299 deletions.
68 changes: 34 additions & 34 deletions adapter/internal/oasparser/envoyconf/routes_with_clusters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ import (
"github.com/wso2/apk/adapter/internal/operator/synchronizer"
operatorutils "github.com/wso2/apk/adapter/internal/operator/utils"
"github.com/wso2/apk/common-go-libs/apis/dp/v1alpha1"
"github.com/wso2/apk/common-go-libs/apis/dp/v1alpha2"
"github.com/wso2/apk/common-go-libs/apis/dp/v1alpha3"
"github.com/wso2/apk/common-go-libs/apis/dp/v1alpha4"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
k8types "k8s.io/apimachinery/pkg/types"
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
Expand Down Expand Up @@ -124,15 +124,15 @@ func TestCreateRoutesWithClustersWithExactAndRegularExpressionRules(t *testing.T
xds.SanitizeGateway("default-gateway", true)
httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "backend-1"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "test-service-1.default", Port: 7001}}, Protocol: v1alpha2.HTTPProtocol}
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "test-service-1.default", Port: 7001}}, Protocol: v1alpha4.HTTPProtocol}
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "backend-2"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "test-service-2.default", Port: 7002}}, Protocol: v1alpha2.HTTPProtocol}
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "test-service-2.default", Port: 7002}}, Protocol: v1alpha4.HTTPProtocol}
httpRouteState.BackendMapping = backendMapping

apiState.ProdHTTPRoute = &httpRouteState
apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
adapterInternalAPI, labels, err := synchronizer.UpdateInternalMapsFromHTTPRoute(apiState, &httpRouteState, constants.Production)
assert.Equal(t, map[string]struct{}{"default-gateway": {}}, labels, "Labels are incorrect.")
Expand Down Expand Up @@ -189,7 +189,7 @@ func TestExtractAPIDetailsFromHTTPRouteForDefaultCase(t *testing.T) {
apiState := generateSampleAPI("test-api-1", "1.0.0", "/test-api/1.0.0")
httpRouteState := synchronizer.HTTPRouteState{}
httpRouteState = *apiState.ProdHTTPRoute
apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
xds.SanitizeGateway("default-gateway", true)
adapterInternalAPI, labels, err := synchronizer.UpdateInternalMapsFromHTTPRoute(apiState, &httpRouteState, constants.Production)
Expand All @@ -206,7 +206,7 @@ func TestExtractAPIDetailsFromHTTPRouteForSpecificEnvironment(t *testing.T) {
apiState.APIDefinition.Spec.Environment = "dev"
xds.SanitizeGateway("default-gateway", true)

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
adapterInternalAPI, labels, err := synchronizer.UpdateInternalMapsFromHTTPRoute(apiState, &httpRouteState, constants.Production)
assert.Equal(t, map[string]struct{}{"default-gateway": {}}, labels, "Labels are incorrect.")
Expand Down Expand Up @@ -268,14 +268,14 @@ func generateSampleAPI(apiName string, apiVersion string, basePath string) synch

httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: apiName + "backend-1"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "test-service-1.default", Port: 7001}}, Protocol: v1alpha2.HTTPProtocol}
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "test-service-1.default", Port: 7001}}, Protocol: v1alpha4.HTTPProtocol}
httpRouteState.BackendMapping = backendMapping

apiState.ProdHTTPRoute = &httpRouteState

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
return apiState
}
Expand Down Expand Up @@ -304,7 +304,7 @@ func TestCreateRoutesWithClustersWithMultiplePathPrefixRules(t *testing.T) {
apiState.APIDefinition = &apiDefinition
httpRouteState := synchronizer.HTTPRouteState{}

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
httpRoute := gwapiv1.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -347,17 +347,17 @@ func TestCreateRoutesWithClustersWithMultiplePathPrefixRules(t *testing.T) {

httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "order-backend"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{
{Host: "order-service.default", Port: 80},
{Host: "order-service-2.default", Port: 8080}},
Protocol: v1alpha2.HTTPProtocol}
Protocol: v1alpha4.HTTPProtocol}
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "user-backend"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{
{Host: "user-service.default", Port: 8081},
{Host: "user-service-2.default", Port: 8081}},
Protocol: v1alpha2.HTTPProtocol}
Protocol: v1alpha4.HTTPProtocol}
httpRouteState.BackendMapping = backendMapping

apiState.ProdHTTPRoute = &httpRouteState
Expand Down Expand Up @@ -456,7 +456,7 @@ func TestCreateRoutesWithClustersWithBackendTLSConfigs(t *testing.T) {
httpRouteState := synchronizer.HTTPRouteState{}
methodTypeGet := gwapiv1.HTTPMethodGet

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
httpRoute := gwapiv1.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -487,11 +487,11 @@ func TestCreateRoutesWithClustersWithBackendTLSConfigs(t *testing.T) {

httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "test-backend-3"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "webhook.site", Port: 443}},
Protocol: v1alpha2.HTTPSProtocol,
TLS: v1alpha2.ResolvedTLSConfig{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "webhook.site", Port: 443}},
Protocol: v1alpha4.HTTPSProtocol,
TLS: v1alpha4.ResolvedTLSConfig{
ResolvedCertificate: `-----BEGIN CERTIFICATE-----test-cert-data-----END CERTIFICATE-----`,
}}
httpRouteState.BackendMapping = backendMapping
Expand Down Expand Up @@ -581,7 +581,7 @@ func TestCreateRoutesWithClustersDifferentBackendRefs(t *testing.T) {
httpRouteState := synchronizer.HTTPRouteState{}
methodTypeGet := gwapiv1.HTTPMethodGet

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
httpRoute := gwapiv1.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -626,17 +626,17 @@ func TestCreateRoutesWithClustersDifferentBackendRefs(t *testing.T) {

httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "test-backend-1"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "webhook.site.1", Port: 443}},
Protocol: v1alpha2.HTTPSProtocol,
TLS: v1alpha2.ResolvedTLSConfig{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "webhook.site.1", Port: 443}},
Protocol: v1alpha4.HTTPSProtocol,
TLS: v1alpha4.ResolvedTLSConfig{
ResolvedCertificate: `-----BEGIN CERTIFICATE-----test-cert-data-----END CERTIFICATE-----`,
}}
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "test-backend-2"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "webhook.site.2", Port: 443}},
Protocol: v1alpha2.HTTPSProtocol,
TLS: v1alpha2.ResolvedTLSConfig{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "webhook.site.2", Port: 443}},
Protocol: v1alpha4.HTTPSProtocol,
TLS: v1alpha4.ResolvedTLSConfig{
ResolvedCertificate: `-----BEGIN CERTIFICATE-----test-cert-data-----END CERTIFICATE-----`,
}}
httpRouteState.BackendMapping = backendMapping
Expand Down Expand Up @@ -675,7 +675,7 @@ func TestCreateRoutesWithClustersSameBackendRefs(t *testing.T) {
httpRouteState := synchronizer.HTTPRouteState{}
methodTypeGet := gwapiv1.HTTPMethodGet

apiState.AIProvider = new(v1alpha3.AIProvider)
apiState.AIProvider = new(v1alpha4.AIProvider)
httpRouteState.RuleIdxToAiRatelimitPolicyMapping = make(map[int]*v1alpha3.AIRateLimitPolicy)
httpRoute := gwapiv1.HTTPRoute{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -720,11 +720,11 @@ func TestCreateRoutesWithClustersSameBackendRefs(t *testing.T) {

httpRouteState.HTTPRouteCombined = &httpRoute

backendMapping := make(map[string]*v1alpha2.ResolvedBackend)
backendMapping := make(map[string]*v1alpha4.ResolvedBackend)
backendMapping[k8types.NamespacedName{Namespace: "default", Name: "test-backend-1"}.String()] =
&v1alpha2.ResolvedBackend{Services: []v1alpha2.Service{{Host: "webhook.site", Port: 443}},
Protocol: v1alpha2.HTTPSProtocol,
TLS: v1alpha2.ResolvedTLSConfig{
&v1alpha4.ResolvedBackend{Services: []v1alpha4.Service{{Host: "webhook.site", Port: 443}},
Protocol: v1alpha4.HTTPSProtocol,
TLS: v1alpha4.ResolvedTLSConfig{
ResolvedCertificate: `-----BEGIN CERTIFICATE-----test-cert-data-----END CERTIFICATE-----`,
}}
httpRouteState.BackendMapping = backendMapping
Expand Down
11 changes: 7 additions & 4 deletions adapter/internal/oasparser/model/adapter_internal_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
dpv1alpha1 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha1"
dpv1alpha2 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha2"
dpv1alpha3 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha3"
dpv1alpha4 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha4"
"golang.org/x/exp/maps"
"k8s.io/apimachinery/pkg/types"
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
Expand Down Expand Up @@ -100,6 +101,7 @@ type InternalAIProvider struct {
ProviderName string
ProviderAPIVersion string
Organization string
SupportedModels []string
Model ValueDetails
PromptTokens ValueDetails
CompletionToken ValueDetails
Expand Down Expand Up @@ -451,12 +453,13 @@ func (adapterInternalAPI *AdapterInternalAPI) GetEnvironment() string {
}

// SetAIProvider sets the AIProvider of the API.
func (adapterInternalAPI *AdapterInternalAPI) SetAIProvider(aiProvider dpv1alpha3.AIProvider) {
func (adapterInternalAPI *AdapterInternalAPI) SetAIProvider(aiProvider dpv1alpha4.AIProvider) {
adapterInternalAPI.AIProvider = InternalAIProvider{
Enabled: true,
ProviderName: aiProvider.Spec.ProviderName,
ProviderAPIVersion: aiProvider.Spec.ProviderAPIVersion,
Organization: aiProvider.Spec.Organization,
SupportedModels: aiProvider.Spec.SupportedModels,
Model: ValueDetails{
In: aiProvider.Spec.Model.In,
Value: aiProvider.Spec.Model.Value,
Expand Down Expand Up @@ -515,7 +518,7 @@ func (adapterInternalAPI *AdapterInternalAPI) SetInfoHTTPRouteCR(httpRoute *gwap
if outputAuthScheme != nil {
authScheme = *outputAuthScheme
}
var apiPolicy *dpv1alpha3.APIPolicy
var apiPolicy *dpv1alpha4.APIPolicy
if outputAPIPolicy != nil {
apiPolicy = *outputAPIPolicy
}
Expand Down Expand Up @@ -1043,7 +1046,7 @@ func (adapterInternalAPI *AdapterInternalAPI) SetInfoGQLRouteCR(gqlRoute *dpv1al
if outputAuthScheme != nil {
authScheme = *outputAuthScheme
}
var apiPolicy *dpv1alpha3.APIPolicy
var apiPolicy *dpv1alpha4.APIPolicy
if outputAPIPolicy != nil {
apiPolicy = *outputAPIPolicy
}
Expand Down Expand Up @@ -1199,7 +1202,7 @@ func (adapterInternalAPI *AdapterInternalAPI) SetInfoGRPCRouteCR(grpcRoute *gwap
if outputAuthScheme != nil {
authScheme = *outputAuthScheme
}
var apiPolicy *dpv1alpha3.APIPolicy
var apiPolicy *dpv1alpha4.APIPolicy
if outputAPIPolicy != nil {
apiPolicy = *outputAPIPolicy
}
Expand Down
21 changes: 11 additions & 10 deletions adapter/internal/oasparser/model/http_route.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
dpv1alpha1 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha1"
dpv1alpha2 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha2"
dpv1alpha3 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha3"
dpv1alpha4 "github.com/wso2/apk/common-go-libs/apis/dp/v1alpha4"
"k8s.io/apimachinery/pkg/types"
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
)
Expand All @@ -33,11 +34,11 @@ import (
type ResourceParams struct {
AuthSchemes map[string]dpv1alpha2.Authentication
ResourceAuthSchemes map[string]dpv1alpha2.Authentication
APIPolicies map[string]dpv1alpha3.APIPolicy
ResourceAPIPolicies map[string]dpv1alpha3.APIPolicy
APIPolicies map[string]dpv1alpha4.APIPolicy
ResourceAPIPolicies map[string]dpv1alpha4.APIPolicy
InterceptorServiceMapping map[string]dpv1alpha1.InterceptorService
BackendJWTMapping map[string]dpv1alpha1.BackendJWT
BackendMapping map[string]*dpv1alpha2.ResolvedBackend
BackendMapping map[string]*dpv1alpha4.ResolvedBackend
ResourceScopes map[string]dpv1alpha1.Scope
RateLimitPolicies map[string]dpv1alpha3.RateLimitPolicy
ResourceRateLimitPolicies map[string]dpv1alpha3.RateLimitPolicy
Expand Down Expand Up @@ -69,7 +70,7 @@ func parseBackendJWTTokenToInternal(backendJWTToken dpv1alpha1.BackendJWTSpec) *
return backendJWTTokenInternal
}

func getCorsConfigFromAPIPolicy(apiPolicy *dpv1alpha3.APIPolicy) *CorsConfig {
func getCorsConfigFromAPIPolicy(apiPolicy *dpv1alpha4.APIPolicy) *CorsConfig {
globalCorsConfig := config.ReadConfigs().Enforcer.Cors

var corsConfig = CorsConfig{
Expand Down Expand Up @@ -111,9 +112,9 @@ func parseRateLimitPolicyToInternal(ratelimitPolicy *dpv1alpha3.RateLimitPolicy)
}

// addOperationLevelInterceptors add the operation level interceptor policy to the policies
func addOperationLevelInterceptors(policies *OperationPolicies, apiPolicy *dpv1alpha3.APIPolicy,
func addOperationLevelInterceptors(policies *OperationPolicies, apiPolicy *dpv1alpha4.APIPolicy,
interceptorServicesMapping map[string]dpv1alpha1.InterceptorService,
backendMapping map[string]*dpv1alpha2.ResolvedBackend, namespace string) {
backendMapping map[string]*dpv1alpha4.ResolvedBackend, namespace string) {
if apiPolicy != nil && apiPolicy.Spec.Override != nil {
if len(apiPolicy.Spec.Override.RequestInterceptors) > 0 {
requestInterceptor := interceptorServicesMapping[types.NamespacedName{
Expand Down Expand Up @@ -161,7 +162,7 @@ func addOperationLevelInterceptors(policies *OperationPolicies, apiPolicy *dpv1a
}

// GetEndpoints creates endpoints using resolved backends in backendMapping
func GetEndpoints(backendName types.NamespacedName, backendMapping map[string]*dpv1alpha2.ResolvedBackend) []Endpoint {
func GetEndpoints(backendName types.NamespacedName, backendMapping map[string]*dpv1alpha4.ResolvedBackend) []Endpoint {
endpoints := []Endpoint{}
backend, ok := backendMapping[backendName.String()]
if ok && backend != nil {
Expand All @@ -182,7 +183,7 @@ func GetEndpoints(backendName types.NamespacedName, backendMapping map[string]*d
}

// GetBackendBasePath gets basePath of the the Backend
func GetBackendBasePath(backendName types.NamespacedName, backendMapping map[string]*dpv1alpha2.ResolvedBackend) string {
func GetBackendBasePath(backendName types.NamespacedName, backendMapping map[string]*dpv1alpha4.ResolvedBackend) string {
backend, ok := backendMapping[backendName.String()]
if ok && backend != nil {
if len(backend.Services) > 0 {
Expand All @@ -204,8 +205,8 @@ func concatRateLimitPolicies(schemeUp *dpv1alpha3.RateLimitPolicy, schemeDown *d
return &finalRateLimit
}

func concatAPIPolicies(schemeUp *dpv1alpha3.APIPolicy, schemeDown *dpv1alpha3.APIPolicy) *dpv1alpha3.APIPolicy {
apiPolicy := dpv1alpha3.APIPolicy{}
func concatAPIPolicies(schemeUp *dpv1alpha4.APIPolicy, schemeDown *dpv1alpha4.APIPolicy) *dpv1alpha4.APIPolicy {
apiPolicy := dpv1alpha4.APIPolicy{}
if schemeUp != nil && schemeDown != nil {
apiPolicy.Spec.Override = utils.SelectPolicy(&schemeUp.Spec.Override, &schemeUp.Spec.Default, &schemeDown.Spec.Override, &schemeDown.Spec.Default)
} else if schemeUp != nil {
Expand Down
Loading

0 comments on commit 5b02f81

Please sign in to comment.