Merge pull request #9608 from AndriiLandiak/fix/edge-old-version-support
Fix widget type and tenant profile data backward compatibility
This commit is contained in:
commit
b0bfdc535a
@ -641,7 +641,7 @@ public final class EdgeGrpcSession implements Closeable {
|
|||||||
case WIDGETS_BUNDLE:
|
case WIDGETS_BUNDLE:
|
||||||
return ctx.getWidgetBundleProcessor().convertWidgetsBundleEventToDownlink(edgeEvent);
|
return ctx.getWidgetBundleProcessor().convertWidgetsBundleEventToDownlink(edgeEvent);
|
||||||
case WIDGET_TYPE:
|
case WIDGET_TYPE:
|
||||||
return ctx.getWidgetTypeProcessor().convertWidgetTypeEventToDownlink(edgeEvent);
|
return ctx.getWidgetTypeProcessor().convertWidgetTypeEventToDownlink(edgeEvent, this.edgeVersion);
|
||||||
case ADMIN_SETTINGS:
|
case ADMIN_SETTINGS:
|
||||||
return ctx.getAdminSettingsProcessor().convertAdminSettingsEventToDownlink(edgeEvent);
|
return ctx.getAdminSettingsProcessor().convertAdminSettingsEventToDownlink(edgeEvent);
|
||||||
case OTA_PACKAGE:
|
case OTA_PACKAGE:
|
||||||
@ -651,9 +651,9 @@ public final class EdgeGrpcSession implements Closeable {
|
|||||||
case QUEUE:
|
case QUEUE:
|
||||||
return ctx.getQueueEdgeProcessor().convertQueueEventToDownlink(edgeEvent);
|
return ctx.getQueueEdgeProcessor().convertQueueEventToDownlink(edgeEvent);
|
||||||
case TENANT:
|
case TENANT:
|
||||||
return ctx.getTenantEdgeProcessor().convertTenantEventToDownlink(edgeEvent);
|
return ctx.getTenantEdgeProcessor().convertTenantEventToDownlink(edgeEvent, this.getEdgeVersion());
|
||||||
case TENANT_PROFILE:
|
case TENANT_PROFILE:
|
||||||
return ctx.getTenantProfileEdgeProcessor().convertTenantProfileEventToDownlink(edgeEvent);
|
return ctx.getTenantProfileEdgeProcessor().convertTenantProfileEventToDownlink(edgeEvent, this.getEdgeVersion());
|
||||||
default:
|
default:
|
||||||
log.warn("[{}] Unsupported edge event type [{}]", this.tenantId, edgeEvent);
|
log.warn("[{}] Unsupported edge event type [{}]", this.tenantId, edgeEvent);
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -19,10 +19,12 @@ import com.google.protobuf.ByteString;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.TenantProfile;
|
import org.thingsboard.server.common.data.TenantProfile;
|
||||||
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
|
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@ -31,7 +33,9 @@ public class TenantProfileMsgConstructor {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DataDecodingEncodingService dataDecodingEncodingService;
|
private DataDecodingEncodingService dataDecodingEncodingService;
|
||||||
|
|
||||||
public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile) {
|
public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
|
||||||
|
ByteString profileData = EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_1) ?
|
||||||
|
ByteString.empty() : ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData()));
|
||||||
TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
|
TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(tenantProfile.getId().getId().getMostSignificantBits())
|
.setIdMSB(tenantProfile.getId().getId().getMostSignificantBits())
|
||||||
@ -39,7 +43,7 @@ public class TenantProfileMsgConstructor {
|
|||||||
.setName(tenantProfile.getName())
|
.setName(tenantProfile.getName())
|
||||||
.setDefault(tenantProfile.isDefault())
|
.setDefault(tenantProfile.isDefault())
|
||||||
.setIsolatedRuleChain(tenantProfile.isIsolatedTbRuleEngine())
|
.setIsolatedRuleChain(tenantProfile.isIsolatedTbRuleEngine())
|
||||||
.setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData())));
|
.setProfileDataBytes(profileData);
|
||||||
if (tenantProfile.getDescription() != null) {
|
if (tenantProfile.getDescription() != null) {
|
||||||
builder.setDescription(tenantProfile.getDescription());
|
builder.setDescription(tenantProfile.getDescription());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,9 +20,11 @@ import org.thingsboard.common.util.JacksonUtil;
|
|||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ import java.util.Arrays;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class WidgetTypeMsgConstructor {
|
public class WidgetTypeMsgConstructor {
|
||||||
|
|
||||||
public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails) {
|
public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion) {
|
||||||
WidgetTypeUpdateMsg.Builder builder = WidgetTypeUpdateMsg.newBuilder()
|
WidgetTypeUpdateMsg.Builder builder = WidgetTypeUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(widgetTypeDetails.getId().getId().getMostSignificantBits())
|
.setIdMSB(widgetTypeDetails.getId().getId().getMostSignificantBits())
|
||||||
@ -58,7 +60,12 @@ public class WidgetTypeMsgConstructor {
|
|||||||
builder.setImage(widgetTypeDetails.getImage());
|
builder.setImage(widgetTypeDetails.getImage());
|
||||||
}
|
}
|
||||||
if (widgetTypeDetails.getDescription() != null) {
|
if (widgetTypeDetails.getDescription() != null) {
|
||||||
builder.setDescription(widgetTypeDetails.getDescription());
|
if (EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_0) &&
|
||||||
|
widgetTypeDetails.getDescription().length() > 255) {
|
||||||
|
builder.setDescription(widgetTypeDetails.getDescription().substring(0, 254));
|
||||||
|
} else {
|
||||||
|
builder.setDescription(widgetTypeDetails.getDescription());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
builder.setDeprecated(widgetTypeDetails.isDeprecated());
|
builder.setDeprecated(widgetTypeDetails.isDeprecated());
|
||||||
if (widgetTypeDetails.getTags() != null) {
|
if (widgetTypeDetails.getTags() != null) {
|
||||||
|
|||||||
@ -71,12 +71,12 @@ public class RelationEdgeProcessor extends BaseRelationProcessor {
|
|||||||
if (relation == null || (relation.getFrom().getEntityType().equals(EntityType.EDGE) || relation.getTo().getEntityType().equals(EntityType.EDGE))) {
|
if (relation == null || (relation.getFrom().getEntityType().equals(EntityType.EDGE) || relation.getTo().getEntityType().equals(EntityType.EDGE))) {
|
||||||
return Futures.immediateFuture(null);
|
return Futures.immediateFuture(null);
|
||||||
}
|
}
|
||||||
EdgeId sourceEdgeId = safeGetEdgeId(edgeNotificationMsg.getOriginatorEdgeIdMSB(), edgeNotificationMsg.getOriginatorEdgeIdLSB());
|
EdgeId originatorEdgeId = safeGetEdgeId(edgeNotificationMsg.getOriginatorEdgeIdMSB(), edgeNotificationMsg.getOriginatorEdgeIdLSB());
|
||||||
|
|
||||||
Set<EdgeId> uniqueEdgeIds = new HashSet<>();
|
Set<EdgeId> uniqueEdgeIds = new HashSet<>();
|
||||||
uniqueEdgeIds.addAll(edgeService.findAllRelatedEdgeIds(tenantId, relation.getTo()));
|
uniqueEdgeIds.addAll(edgeService.findAllRelatedEdgeIds(tenantId, relation.getTo()));
|
||||||
uniqueEdgeIds.addAll(edgeService.findAllRelatedEdgeIds(tenantId, relation.getFrom()));
|
uniqueEdgeIds.addAll(edgeService.findAllRelatedEdgeIds(tenantId, relation.getFrom()));
|
||||||
uniqueEdgeIds.remove(sourceEdgeId);
|
uniqueEdgeIds.remove(originatorEdgeId);
|
||||||
if (uniqueEdgeIds.isEmpty()) {
|
if (uniqueEdgeIds.isEmpty()) {
|
||||||
return Futures.immediateFuture(null);
|
return Futures.immediateFuture(null);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
|
|||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
||||||
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
@ -35,7 +36,7 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class TenantEdgeProcessor extends BaseEdgeProcessor {
|
public class TenantEdgeProcessor extends BaseEdgeProcessor {
|
||||||
|
|
||||||
public DownlinkMsg convertTenantEventToDownlink(EdgeEvent edgeEvent) {
|
public DownlinkMsg convertTenantEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
|
||||||
TenantId tenantId = new TenantId(edgeEvent.getEntityId());
|
TenantId tenantId = new TenantId(edgeEvent.getEntityId());
|
||||||
DownlinkMsg downlinkMsg = null;
|
DownlinkMsg downlinkMsg = null;
|
||||||
if (EdgeEventActionType.UPDATED.equals(edgeEvent.getAction())) {
|
if (EdgeEventActionType.UPDATED.equals(edgeEvent.getAction())) {
|
||||||
@ -44,7 +45,7 @@ public class TenantEdgeProcessor extends BaseEdgeProcessor {
|
|||||||
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
||||||
TenantUpdateMsg tenantUpdateMsg = tenantMsgConstructor.constructTenantUpdateMsg(msgType, tenant);
|
TenantUpdateMsg tenantUpdateMsg = tenantMsgConstructor.constructTenantUpdateMsg(msgType, tenant);
|
||||||
TenantProfile tenantProfile = tenantProfileService.findTenantProfileById(tenantId, tenant.getTenantProfileId());
|
TenantProfile tenantProfile = tenantProfileService.findTenantProfileById(tenantId, tenant.getTenantProfileId());
|
||||||
TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile);
|
TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
|
||||||
downlinkMsg = DownlinkMsg.newBuilder()
|
downlinkMsg = DownlinkMsg.newBuilder()
|
||||||
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
||||||
.addTenantUpdateMsg(tenantUpdateMsg)
|
.addTenantUpdateMsg(tenantUpdateMsg)
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
|
|||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.id.TenantProfileId;
|
import org.thingsboard.server.common.data.id.TenantProfileId;
|
||||||
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
||||||
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
@ -33,7 +34,7 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class TenantProfileEdgeProcessor extends BaseEdgeProcessor {
|
public class TenantProfileEdgeProcessor extends BaseEdgeProcessor {
|
||||||
|
|
||||||
public DownlinkMsg convertTenantProfileEventToDownlink(EdgeEvent edgeEvent) {
|
public DownlinkMsg convertTenantProfileEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
|
||||||
TenantProfileId tenantProfileId = new TenantProfileId(edgeEvent.getEntityId());
|
TenantProfileId tenantProfileId = new TenantProfileId(edgeEvent.getEntityId());
|
||||||
DownlinkMsg downlinkMsg = null;
|
DownlinkMsg downlinkMsg = null;
|
||||||
if (EdgeEventActionType.UPDATED.equals(edgeEvent.getAction())) {
|
if (EdgeEventActionType.UPDATED.equals(edgeEvent.getAction())) {
|
||||||
@ -41,7 +42,7 @@ public class TenantProfileEdgeProcessor extends BaseEdgeProcessor {
|
|||||||
if (tenantProfile != null) {
|
if (tenantProfile != null) {
|
||||||
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
||||||
TenantProfileUpdateMsg tenantProfileUpdateMsg =
|
TenantProfileUpdateMsg tenantProfileUpdateMsg =
|
||||||
tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile);
|
tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
|
||||||
downlinkMsg = DownlinkMsg.newBuilder()
|
downlinkMsg = DownlinkMsg.newBuilder()
|
||||||
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
||||||
.addTenantProfileUpdateMsg(tenantProfileUpdateMsg)
|
.addTenantProfileUpdateMsg(tenantProfileUpdateMsg)
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
|
|||||||
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
|
||||||
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
@ -32,7 +33,7 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
|
public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
|
||||||
|
|
||||||
public DownlinkMsg convertWidgetTypeEventToDownlink(EdgeEvent edgeEvent) {
|
public DownlinkMsg convertWidgetTypeEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
|
||||||
WidgetTypeId widgetTypeId = new WidgetTypeId(edgeEvent.getEntityId());
|
WidgetTypeId widgetTypeId = new WidgetTypeId(edgeEvent.getEntityId());
|
||||||
DownlinkMsg downlinkMsg = null;
|
DownlinkMsg downlinkMsg = null;
|
||||||
switch (edgeEvent.getAction()) {
|
switch (edgeEvent.getAction()) {
|
||||||
@ -42,7 +43,7 @@ public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
|
|||||||
if (widgetTypeDetails != null) {
|
if (widgetTypeDetails != null) {
|
||||||
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
||||||
WidgetTypeUpdateMsg widgetTypeUpdateMsg =
|
WidgetTypeUpdateMsg widgetTypeUpdateMsg =
|
||||||
widgetTypeMsgConstructor.constructWidgetTypeUpdateMsg(msgType, widgetTypeDetails);
|
widgetTypeMsgConstructor.constructWidgetTypeUpdateMsg(msgType, widgetTypeDetails, edgeVersion);
|
||||||
downlinkMsg = DownlinkMsg.newBuilder()
|
downlinkMsg = DownlinkMsg.newBuilder()
|
||||||
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
||||||
.addWidgetTypeUpdateMsg(widgetTypeUpdateMsg)
|
.addWidgetTypeUpdateMsg(widgetTypeUpdateMsg)
|
||||||
|
|||||||
@ -21,16 +21,7 @@ import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public final class EdgeVersionUtils {
|
public final class EdgeVersionUtils {
|
||||||
|
|
||||||
public static boolean isEdgeProtoDeprecated(EdgeVersion edgeVersion) {
|
public static boolean isEdgeVersionOlderThan(EdgeVersion currentVersion, EdgeVersion requiredVersion) {
|
||||||
switch (edgeVersion) {
|
return currentVersion.ordinal() < requiredVersion.ordinal();
|
||||||
case V_3_3_0:
|
|
||||||
case V_3_3_3:
|
|
||||||
case V_3_4_0:
|
|
||||||
case V_3_6_0:
|
|
||||||
return true;
|
|
||||||
case V_3_6_1:
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -249,7 +249,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
|
|||||||
validateMsgsCnt(RuleChainMetadataUpdateMsg.class, 1);
|
validateMsgsCnt(RuleChainMetadataUpdateMsg.class, 1);
|
||||||
validateRuleChainMetadataUpdates(ruleChainUUID);
|
validateRuleChainMetadataUpdates(ruleChainUUID);
|
||||||
|
|
||||||
// 4 messages ('general', 'mail', 'connectivity', 'jwt)
|
// 4 messages ('general', 'mail', 'connectivity', 'jwt')
|
||||||
validateMsgsCnt(AdminSettingsUpdateMsg.class, 4);
|
validateMsgsCnt(AdminSettingsUpdateMsg.class, 4);
|
||||||
validateAdminSettings(4);
|
validateAdminSettings(4);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user