Skip to content

Commit ba52b1b

Browse files
Merge pull request thingsboard#14065 from thingsboard/rc
rc
2 parents 9fac615 + 07280bc commit ba52b1b

3 files changed

Lines changed: 51 additions & 15 deletions

File tree

application/src/main/java/org/thingsboard/server/service/apiusage/DefaultTbApiUsageStateService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,13 +442,13 @@ private interface StateChecker {
442442
boolean check(long threshold, long warnThreshold, long value);
443443
}
444444

445-
private void checkStartOfNextCycle() {
445+
public void checkStartOfNextCycle() {
446446
updateLock.lock();
447447
try {
448448
long now = System.currentTimeMillis();
449449
myUsageStates.values().forEach(state -> {
450450
if ((state.getNextCycleTs() < now) && (now - state.getNextCycleTs() < TimeUnit.HOURS.toMillis(1))) {
451-
state.setCycles(state.getNextCycleTs(), SchedulerUtils.getStartOfNextNextMonth());
451+
state.setCycles(state.getNextCycleTs(), SchedulerUtils.getStartOfNextMonth());
452452
if (log.isTraceEnabled()) {
453453
log.trace("[{}][{}] Updating state cycles (currentCycleTs={},nextCycleTs={})", state.getTenantId(), state.getEntityId(), state.getCurrentCycleTs(), state.getNextCycleTs());
454454
}

application/src/test/java/org/thingsboard/server/service/apiusage/DefaultTbApiUsageStateServiceTest.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@
2020
import org.junit.Test;
2121
import org.springframework.beans.factory.annotation.Autowired;
2222
import org.thingsboard.server.common.data.ApiUsageRecordKey;
23+
import org.thingsboard.server.common.data.ApiUsageState;
2324
import org.thingsboard.server.common.data.ApiUsageStateValue;
2425
import org.thingsboard.server.common.data.Tenant;
2526
import org.thingsboard.server.common.data.TenantProfile;
27+
import org.thingsboard.server.common.data.id.ApiUsageStateId;
28+
import org.thingsboard.server.common.data.id.EntityId;
2629
import org.thingsboard.server.common.data.id.TenantId;
2730
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
2831
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData;
@@ -33,8 +36,17 @@
3336
import org.thingsboard.server.gen.transport.TransportProtos;
3437
import org.thingsboard.server.queue.common.TbProtoQueueMsg;
3538

39+
import java.lang.reflect.Field;
40+
import java.time.LocalDate;
41+
import java.util.HashMap;
42+
import java.util.Map;
3643
import java.util.UUID;
44+
import java.util.concurrent.TimeUnit;
3745

46+
import static java.time.ZoneOffset.UTC;
47+
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
48+
import static java.time.temporal.ChronoUnit.MONTHS;
49+
import static org.assertj.core.api.Assertions.assertThat;
3850
import static org.junit.Assert.assertEquals;
3951

4052
@DaoSqlTest
@@ -48,6 +60,7 @@ public class DefaultTbApiUsageStateServiceTest extends AbstractControllerTest {
4860

4961
private TenantId tenantId;
5062
private Tenant savedTenant;
63+
private TenantProfile savedTenantProfile;
5164

5265
private static final int MAX_ENABLE_VALUE = 5000;
5366
private static final long VALUE_WARNING = 4500L;
@@ -59,7 +72,7 @@ public void init() throws Exception {
5972
loginSysAdmin();
6073

6174
TenantProfile tenantProfile = createTenantProfile();
62-
TenantProfile savedTenantProfile = doPost("/api/tenantProfile", tenantProfile, TenantProfile.class);
75+
savedTenantProfile = doPost("/api/tenantProfile", tenantProfile, TenantProfile.class);
6376
Assert.assertNotNull(savedTenantProfile);
6477

6578
Tenant tenant = new Tenant();
@@ -109,6 +122,41 @@ public void testProcess_transitionFromWarningToDisabled() {
109122
assertEquals(ApiUsageStateValue.DISABLED, apiUsageStateService.findTenantApiUsageState(tenantId).getDbStorageState());
110123
}
111124

125+
@Test
126+
public void checkStartOfNextCycle_setsNextCycleToNextMonth() throws Exception {
127+
ApiUsageState apiUsageState = new ApiUsageState(new ApiUsageStateId(UUID.randomUUID()));
128+
apiUsageState.setDbStorageState(ApiUsageStateValue.ENABLED);
129+
apiUsageState.setAlarmExecState(ApiUsageStateValue.ENABLED);
130+
apiUsageState.setSmsExecState(ApiUsageStateValue.ENABLED);
131+
apiUsageState.setTbelExecState(ApiUsageStateValue.ENABLED);
132+
apiUsageState.setReExecState(ApiUsageStateValue.ENABLED);
133+
apiUsageState.setTransportState(ApiUsageStateValue.ENABLED);
134+
apiUsageState.setEmailExecState(ApiUsageStateValue.ENABLED);
135+
apiUsageState.setJsExecState(ApiUsageStateValue.ENABLED);
136+
apiUsageState.setTenantId(tenantId);
137+
apiUsageState.setEntityId(tenantId);
138+
139+
long now = System.currentTimeMillis();
140+
long currentCycleTs = now - TimeUnit.DAYS.toMillis(30);
141+
long nextCycleTs = now - TimeUnit.MINUTES.toMillis(5); // < 1h ago
142+
TenantApiUsageState tenantApiUsageState = new TenantApiUsageState(savedTenantProfile, apiUsageState);
143+
tenantApiUsageState.setCycles(currentCycleTs, nextCycleTs);
144+
Map<EntityId, BaseApiUsageState> map = new HashMap<>();
145+
map.put(tenantId, tenantApiUsageState);
146+
147+
Field fieldToSet = DefaultTbApiUsageStateService.class.getDeclaredField("myUsageStates");
148+
fieldToSet.setAccessible(true);
149+
fieldToSet.set(service, map);
150+
151+
service.checkStartOfNextCycle();
152+
153+
long firstOfNextMonth = LocalDate.now()
154+
.with((temporal) -> temporal.with(DAY_OF_MONTH, 1)
155+
.plus(1, MONTHS))
156+
.atStartOfDay(UTC).toInstant().toEpochMilli();
157+
assertThat(tenantApiUsageState.getNextCycleTs()).isEqualTo(firstOfNextMonth);
158+
}
159+
112160
private TenantProfile createTenantProfile() {
113161
TenantProfile tenantProfile = new TenantProfile();
114162
tenantProfile.setName("Tenant Profile");

common/message/src/main/java/org/thingsboard/server/common/msg/tools/SchedulerUtils.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,4 @@ public static long getStartOfNextMonth(ZoneId zoneId) {
6060
return LocalDate.now(UTC).with(TemporalAdjusters.firstDayOfNextMonth()).atStartOfDay(zoneId).toInstant().toEpochMilli();
6161
}
6262

63-
public static long getStartOfNextNextMonth() {
64-
return getStartOfNextNextMonth(UTC);
65-
}
66-
67-
public static long getStartOfNextNextMonth(ZoneId zoneId) {
68-
return LocalDate.now(UTC).with(firstDayOfNextNextMonth()).atStartOfDay(zoneId).toInstant().toEpochMilli();
69-
}
70-
71-
public static TemporalAdjuster firstDayOfNextNextMonth() {
72-
return (temporal) -> temporal.with(DAY_OF_MONTH, 1).plus(2, MONTHS);
73-
}
74-
7563
}

0 commit comments

Comments
 (0)