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

Subscription improvment #2129

Merged
merged 2 commits into from
Mar 14, 2024
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,63 @@

package org.wso2.apk.enforcer.models;

import org.wso2.apk.enforcer.subscription.SubscribedAPIDto;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
* Model class for Subscription related API details
*/
public class SubscribedAPI {

private String name = null;
private String version = null;
private String name;
private String version;
private Pattern versionRegexPattern;

public SubscribedAPI(org.wso2.apk.enforcer.discovery.subscription.SubscribedAPI subscribedApi) {

this.name = subscribedApi.getName();
this.version = subscribedApi.getVersion();
this.versionRegexPattern = Pattern.compile(this.version);
}

public SubscribedAPI() {
public SubscribedAPI(SubscribedAPIDto subscribedApi) {

this.name = subscribedApi.getName();
this.version = subscribedApi.getVersion();
this.versionRegexPattern = Pattern.compile(this.version);

}

public String getName() {

return name;
}

public void setName(String name) {

this.name = name;
}

public String getVersion() {

return version;
}

public void setVersion(String version) {

this.version = version;
}

public Pattern getVersionRegexPattern() {

return versionRegexPattern;
}

public void setVersionRegexPattern(Pattern versionRegexPattern) {

this.versionRegexPattern = versionRegexPattern;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public static void validateSubscriptionUsingConsumerKey(APIKeyValidationInfoDTO
if (keyMapping != null) {
// Get application and application mapping using application UUID
String applicationUUID = keyMapping.getApplicationUUID();
app = datastore.getMatchingApplication(applicationUUID);
app = datastore.getApplicationById(applicationUUID);
appMappings = datastore.getMatchingApplicationMappings(applicationUUID);

if (appMappings != null && app != null) {
Expand All @@ -155,9 +155,8 @@ public static void validateSubscriptionUsingConsumerKey(APIKeyValidationInfoDTO

if (validationInfo.getApiName().equals(subscription.getSubscribedApi().getName())) {
// Validate API version
String versionRegex = subscription.getSubscribedApi().getVersion();
Pattern pattern = subscription.getSubscribedApi().getVersionRegexPattern();
String versionToMatch = validationInfo.getApiVersion();
Pattern pattern = Pattern.compile(versionRegex);
Matcher matcher = pattern.matcher(versionToMatch);
if (matcher.matches()) {
sub = subscription;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public class SubscriptionDataStoreImpl implements SubscriptionDataStore {

// Maps for keeping Subscription related details.
private Map<String, ApplicationKeyMapping> applicationKeyMappingMap = new ConcurrentHashMap<>();
private Map<String, ApplicationMapping> applicationMappingMap = new ConcurrentHashMap<>();
private Map<String, Map<String, ApplicationMapping>> applicationMappingMap = new ConcurrentHashMap<>();
private Map<String, Application> applicationMap = new ConcurrentHashMap<>();
private Map<String, Subscription> subscriptionMap = new ConcurrentHashMap<>();

Expand Down Expand Up @@ -91,10 +91,9 @@ public void addSubscriptions(List<SubscriptionDto> subscriptionList) {
Map<String, Subscription> newSubscriptionMap = new ConcurrentHashMap<>();

for (SubscriptionDto subscription : subscriptionList) {
SubscribedAPI subscribedAPI = new SubscribedAPI();
SubscribedAPI subscribedAPI = new SubscribedAPI(subscription.getSubscribedApi());
subscribedAPI.setName(subscription.getSubscribedApi().getName());
subscribedAPI.setVersion(subscription.getSubscribedApi().getVersion());

Subscription newSubscription = new Subscription();
newSubscription.setSubscriptionId(subscription.getUuid());
newSubscription.setSubscriptionStatus(subscription.getSubStatus());
Expand Down Expand Up @@ -149,14 +148,19 @@ public void addApplicationKeyMappings(List<ApplicationKeyMappingDTO> application

public void addApplicationMappings(List<ApplicationMappingDto> applicationMappingList) {

Map<String, ApplicationMapping> newApplicationMappingMap = new ConcurrentHashMap<>();
Map<String, Map<String, ApplicationMapping>> newApplicationMappingMap = new ConcurrentHashMap<>();
for (ApplicationMappingDto applicationMapping : applicationMappingList) {
ApplicationMapping appMapping = new ApplicationMapping();
appMapping.setUuid(applicationMapping.getUuid());
appMapping.setApplicationUUID(applicationMapping.getApplicationRef());
appMapping.setSubscriptionUUID(applicationMapping.getSubscriptionRef());
appMapping.setOrganization(applicationMapping.getOrganizationId());
newApplicationMappingMap.put(appMapping.getCacheKey(), appMapping);
Map<String, ApplicationMapping> applicationMappings = new HashMap<>();
if (newApplicationMappingMap.containsKey(appMapping.getApplicationUUID())) {
applicationMappings = newApplicationMappingMap.get(appMapping.getApplicationUUID());
}
applicationMappings.put(appMapping.getCacheKey(), appMapping);
newApplicationMappingMap.put(appMapping.getApplicationUUID(), applicationMappings);
}
if (log.isDebugEnabled()) {
log.debug("Total Application Mappings in new cache: {}", newApplicationMappingMap.size());
Expand All @@ -176,15 +180,12 @@ public ApplicationKeyMapping getMatchingApplicationKeyMapping(String application
@Override
public Set<ApplicationMapping> getMatchingApplicationMappings(String uuid) {

Set<ApplicationMapping> applicationMappings = new HashSet<>();
if (StringUtils.isNotEmpty(uuid)) {
for (ApplicationMapping applicationMapping : applicationMappingMap.values()) {
if (applicationMapping.getApplicationUUID().equals(uuid)) {
applicationMappings.add(applicationMapping);
}
if (applicationMappingMap.containsKey(uuid)) {
return new HashSet<>(applicationMappingMap.get(uuid).values());
}
}
return applicationMappings;
return new HashSet<>();
}

@Override
Expand All @@ -203,12 +204,8 @@ public Application getMatchingApplication(String uuid) {
@Override
public Subscription getMatchingSubscription(String uuid) {

for (Subscription subscription : subscriptionMap.values()) {
if (StringUtils.isNotEmpty(uuid)) {
if (subscription.getSubscriptionId().equals(uuid)) {
return subscription;
}
}
if (StringUtils.isNotEmpty(uuid)) {
return subscriptionMap.get(uuid);
}
return null;
}
Expand Down Expand Up @@ -309,11 +306,12 @@ public void addApplicationMapping(org.wso2.apk.enforcer.discovery.subscription.A
resolvedApplicationMapping.setApplicationUUID(applicationMapping.getApplicationRef());
resolvedApplicationMapping.setSubscriptionUUID(applicationMapping.getSubscriptionRef());
resolvedApplicationMapping.setOrganization(applicationMapping.getOrganization());
if (applicationMappingMap.containsKey(resolvedApplicationMapping.getCacheKey())) {
applicationMappingMap.replace(resolvedApplicationMapping.getCacheKey(), resolvedApplicationMapping);
} else {
applicationMappingMap.put(resolvedApplicationMapping.getCacheKey(), resolvedApplicationMapping);
Map<String, ApplicationMapping> applicationMappings = new HashMap<>();
if (applicationMappingMap.containsKey(resolvedApplicationMapping.getApplicationUUID())) {
applicationMappings = applicationMappingMap.get(resolvedApplicationMapping.getApplicationUUID());
}
applicationMappings.put(resolvedApplicationMapping.getCacheKey(), resolvedApplicationMapping);
applicationMappingMap.put(resolvedApplicationMapping.getApplicationUUID(), applicationMappings);
}

@Override
Expand Down Expand Up @@ -344,7 +342,11 @@ public void removeApplicationMapping(org.wso2.apk.enforcer.discovery.subscriptio
resolvedApplicationMapping.setApplicationUUID(applicationMapping.getApplicationRef());
resolvedApplicationMapping.setSubscriptionUUID(applicationMapping.getSubscriptionRef());
resolvedApplicationMapping.setOrganization(applicationMapping.getOrganization());
applicationMappingMap.remove(resolvedApplicationMapping.getCacheKey());
Map<String, ApplicationMapping> applicationMappings =
applicationMappingMap.get(applicationMapping.getApplicationRef());
if (applicationMappings != null) {
applicationMappings.remove(resolvedApplicationMapping.getCacheKey());
}
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion test/performance/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ sudo apt install openjdk-11-jre-headless
sudo snap install kubectl --classic
wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.5.tgz
tar -xvzf apache-jmeter-5.5.tgz apache-jmeter-5.5
sudo apt install jq
sudo snap install jq

cd apache-jmeter-5.5/bin/
mkdir payloads
Expand Down
13 changes: 13 additions & 0 deletions test/performance/artifacts/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,16 @@ spec:
sandbox: null
apiProperties: []
status: null

---
apiVersion: dp.wso2.com/v1alpha2
kind: APIPolicy
metadata:
name: default-api-policy
spec:
default:
subscriptionValidation: true
targetRef:
group: dp.wso2.com
kind: API
name: default-api-definition-endpoint-test
19 changes: 19 additions & 0 deletions test/performance/artifacts/perf-test-tokenIssuer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
kind: TokenIssuer
apiVersion: dp.wso2.com/v1alpha1
metadata:
name: perf-test-token-issuer
spec:
consumerKeyClaim: azp
issuer: https://idp1.com
name: idp-1
organization: default
scopesClaim: scope
signatureValidation:
certificate:
configMapRef:
name: custom-jwt-cm
key: "wso2carboncustom.pem"
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: wso2-apk-default
35 changes: 35 additions & 0 deletions test/performance/artifacts/subscriptions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
apiVersion: cp.wso2.com/v1alpha2
kind: Subscription
metadata:
name: perf-test-subscription
spec:
api:
name: "APIDefinitionEndpointDefault"
version: "3.14"
organization: "default"
subscriptionStatus: "UNBLOCKED"
---
apiVersion: cp.wso2.com/v1alpha2
kind: Application
metadata:
name: perf-test-application
spec:
name: "application1"
organization: "default"
owner: "admin"
securitySchemes:
oauth2:
environments:
- appId: "123-456-789"
envId: "Default"
keyType: "PRODUCTION"

---
apiVersion: cp.wso2.com/v1alpha2
kind: ApplicationMapping
metadata:
name: perf-test-application-mapping
spec:
applicationRef: "perf-test-application"
subscriptionRef: "perf-test-subscription"
---
34 changes: 34 additions & 0 deletions test/performance/deployment/1cpu.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
wso2:
apk:
dp:
adapter:
deployment:
resources:
requests:
memory: 500Mi
cpu: 500m
limits:
memory: 500Mi
cpu: 500m
gatewayRuntime:
deployment:
enforcer:
resources:
requests:
memory: 1000Mi
cpu: 1000m
limits:
memory: 1000Mi
cpu: 1000m
router:
resources:
requests:
memory: 500Mi
cpu: 1000m
limites:
memory: 500Mi
cpu: 1000m
service:
annotations:
"service.beta.kubernetes.io/azure-load-balancer-internal": "true"
"service.beta.kubernetes.io/azure-load-balancer-internal-subnet": "default"
50 changes: 50 additions & 0 deletions test/performance/deployment/deploy100subscriptions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/bin/bash

for i in {101..1000}
do
result=$(echo "scale=0; $i/100" | bc)
echo "apiVersion: cp.wso2.com/v1alpha2
kind: Subscription
metadata:
name: perf-test-subscription-$i
spec:
api:
name: "APIDefinitionEndpointDefault"
version: \""3.14"\"
organization: "default"
subscriptionStatus: "UNBLOCKED"
---">>perf-test-subsciption-$result.yaml
done

for i in {101..1000}
do
result=$(echo "scale=0; $i/100" | bc)
echo "apiVersion: cp.wso2.com/v1alpha2
kind: Application
metadata:
name: perf-test-application-$i
spec:
name: "application-$i"
organization: "default"
owner: "admin"
securitySchemes:
oauth2:
environments:
- appId: "$(uuidgen)"
envId: "Default"
keyType: "PRODUCTION"
---">>perf-test-subsciption-$result.yaml
done

for i in {101..1000}
do
result=$(echo "scale=0; $i/100" | bc)
echo "apiVersion: cp.wso2.com/v1alpha2
kind: ApplicationMapping
metadata:
name: perf-test-application-mapping-$i
spec:
applicationRef: "perf-test-application-$i"
subscriptionRef: "perf-test-subscription-$i"
---">>perf-test-subsciption-$result.yaml
done
Loading
Loading