Skip to content

Commit 43ec166

Browse files
Merge pull request #2066 from akto-api-security/feature/custom_mini_testing_selection_cyborg
feat: custom mini testing module selection for cyborg
2 parents 7eb9a8f + ef3b5ae commit 43ec166

File tree

5 files changed

+76
-4
lines changed

5 files changed

+76
-4
lines changed

apps/dashboard/src/main/java/com/akto/action/testing/StartTestAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ private TestingRun createTestingRun(int scheduleTimestamp, int periodInSeconds)
159159

160160
return new TestingRun(scheduleTimestamp, user.getLogin(),
161161
testingEndpoints, testIdConfig, State.SCHEDULED, periodInSeconds, testName, this.testRunTime,
162-
this.maxConcurrentRequests, this.sendSlackAlert);
162+
this.maxConcurrentRequests, this.sendSlackAlert, null);
163163
}
164164

165165
private List<String> selectedTests;

apps/database-abstractor/src/main/java/com/akto/action/DbAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,7 +2347,7 @@ public String findTestSubCategoriesByTestSuiteId() {
23472347
}
23482348
return Action.SUCCESS.toUpperCase();
23492349
}
2350-
2350+
23512351
public String getCurrentTestingRunDetailsFromEditor(){
23522352
try {
23532353
testingRunPlayground = DbLayer.getCurrentTestingRunDetailsFromEditor(this.ts);
@@ -3485,7 +3485,7 @@ public void setTestSuiteId(List<String> testSuiteId) {
34853485
public List<String> getTestSuiteTestSubCategories() {
34863486
return testSuiteTestSubCategories;
34873487
}
3488-
3488+
34893489
public TestingRunPlayground getTestingRunPlayground() {
34903490
return testingRunPlayground;
34913491
}

libs/dao/src/main/java/com/akto/dto/monitoring/ModuleInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class ModuleInfo {
1313
private int startedTs;
1414
public static final String LAST_HEARTBEAT_RECEIVED = "lastHeartbeatReceived";
1515
private int lastHeartbeatReceived;
16+
public static final String NAME = "name";
1617
private String name;
1718

1819
public ModuleType getModuleType() {

libs/dao/src/main/java/com/akto/dto/testing/TestingRun.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class TestingRun {
3737
public static final String NAME = "name";
3838
private String name;
3939

40+
public static final String MINI_TESTING_SERVICE_NAME = "miniTestingServiceName";
41+
private String miniTestingServiceName;
42+
4043
public enum TestingRunType{
4144
ONE_TIME, RECURRING, CI_CD, CONTINUOUS_TESTING
4245
}
@@ -61,7 +64,7 @@ public TestingRun(int scheduleTimestamp, String userEmail, TestingEndpoints test
6164
this.triggeredBy = triggeredBy;
6265
this.sendSlackAlert = sendSlackAlert;
6366
}
64-
public TestingRun(int scheduleTimestamp, String userEmail, TestingEndpoints testingEndpoints, int testIdConfig, State state, int periodInSeconds, String name, int testRunTime, int maxConcurrentRequests, boolean sendSlackAlert) {
67+
public TestingRun(int scheduleTimestamp, String userEmail, TestingEndpoints testingEndpoints, int testIdConfig, State state, int periodInSeconds, String name, int testRunTime, int maxConcurrentRequests, boolean sendSlackAlert, String miniTestingServiceName) {
6568
this.scheduleTimestamp = scheduleTimestamp;
6669
this.testRunTime = testRunTime;
6770
this.maxConcurrentRequests = maxConcurrentRequests;
@@ -74,6 +77,7 @@ public TestingRun(int scheduleTimestamp, String userEmail, TestingEndpoints test
7477
this.periodInSeconds = periodInSeconds;
7578
this.name = name;
7679
this.sendSlackAlert = sendSlackAlert;
80+
this.miniTestingServiceName = miniTestingServiceName;
7781
}
7882

7983
public TestingRunConfig getTestingRunConfig() {
@@ -209,6 +213,14 @@ public void setSendSlackAlert(boolean sendSlackAlert) {
209213
this.sendSlackAlert = sendSlackAlert;
210214
}
211215

216+
public String getMiniTestingServiceName() {
217+
return miniTestingServiceName;
218+
}
219+
220+
public void setMiniTestingServiceName(String miniTestingServiceName) {
221+
this.miniTestingServiceName = miniTestingServiceName;
222+
}
223+
212224
@Override
213225
public String toString() {
214226
return "{" +

libs/utils/src/main/java/com/akto/data_actor/DbLayer.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313
import java.util.Set;
14+
import java.util.concurrent.ConcurrentHashMap;
1415

1516
import com.akto.bulk_update_util.ApiInfoBulkUpdate;
1617
import com.akto.dao.*;
@@ -106,6 +107,12 @@ public class DbLayer {
106107

107108
private static final LoggerMaker loggerMaker = new LoggerMaker(DbLayer.class, LoggerMaker.LogDb.DASHBOARD);
108109

110+
private static final ConcurrentHashMap<Integer, Integer> lastUpdatedTsMap = new ConcurrentHashMap<>();
111+
112+
private static int getLastUpdatedTsForAccount(int accountId) {
113+
return lastUpdatedTsMap.computeIfAbsent(accountId, k -> 0);
114+
}
115+
109116
public DbLayer() {
110117
}
111118

@@ -138,8 +145,60 @@ public static void updateModuleInfo(ModuleInfo moduleInfo) {
138145
Updates.setOnInsert(ModuleInfo.MODULE_TYPE, moduleInfo.getModuleType()),
139146
Updates.setOnInsert(ModuleInfo.STARTED_TS, moduleInfo.getStartedTs()),
140147
Updates.setOnInsert(ModuleInfo.CURRENT_VERSION, moduleInfo.getCurrentVersion()),
148+
Updates.setOnInsert(ModuleInfo.NAME, moduleInfo.getName()),
141149
Updates.set(ModuleInfo.LAST_HEARTBEAT_RECEIVED, moduleInfo.getLastHeartbeatReceived())
142150
), updateOptions);
151+
if (moduleInfo.getModuleType() == ModuleInfo.ModuleType.MINI_TESTING) {
152+
//Only for mini-testing heartbeat mark testing run failed state
153+
if (Context.now() - getLastUpdatedTsForAccount(Context.accountId.get()) > 10 * 60) {
154+
try {
155+
fetchAndFailOutdatedTests();
156+
} catch (Exception e) {
157+
loggerMaker.errorAndAddToDb("Error while updating out");
158+
//Ignore
159+
}
160+
lastUpdatedTsMap.put(Context.accountId.get(), Context.now());
161+
}
162+
}
163+
}
164+
165+
public static void fetchAndFailOutdatedTests() {
166+
List<TestingRun> testingRunList = TestingRunDao.instance.findAll(
167+
Filters.and(
168+
Filters.or(
169+
Filters.eq(TestingRun.STATE, State.SCHEDULED),
170+
Filters.eq(TestingRun.STATE, State.RUNNING)
171+
),
172+
Filters.exists(ModuleInfo.NAME, true),
173+
Filters.ne(ModuleInfo.NAME, null)
174+
)
175+
);
176+
177+
for (TestingRun testingRun : testingRunList) {
178+
String miniTestingServiceName = testingRun.getMiniTestingServiceName();
179+
if(!miniTestingServiceName.isEmpty()) {
180+
List<ModuleInfo> moduleInfos = ModuleInfoDao.instance.
181+
findAll(Filters.eq(ModuleInfo.NAME, miniTestingServiceName), 0, 1,
182+
Sorts.descending(ModuleInfo.LAST_HEARTBEAT_RECEIVED));
183+
boolean isValid = true;
184+
if (moduleInfos != null && !moduleInfos.isEmpty()) {
185+
isValid = Context.now() - moduleInfos.get(0).getLastHeartbeatReceived() < 20 * 60;
186+
}
187+
188+
if(!isValid) {
189+
Bson filter = Filters.or(
190+
Filters.eq(TestingRun.STATE, State.SCHEDULED),
191+
Filters.eq(TestingRun.STATE, State.RUNNING));
192+
TestingRunDao.instance.updateOne(
193+
Filters.and(filter, Filters.eq(Constants.ID, testingRun.getId())),
194+
Updates.set(TestingRun.STATE, State.FAILED));
195+
TestingRunResultSummariesDao.instance.updateOneNoUpsert(
196+
Filters.eq(TestingRunResultSummary.TESTING_RUN_ID, testingRun.getId()),
197+
Updates.set(TestingRunResultSummary.STATE, State.FAILED)
198+
);
199+
}
200+
}
201+
}
143202
}
144203

145204

0 commit comments

Comments
 (0)