Fix cassandra audit log dao.

This commit is contained in:
Igor Kulikov 2018-02-22 11:28:24 +02:00
parent 9f0a8b860f
commit e639dd1fe8
5 changed files with 93 additions and 60 deletions

View File

@ -0,0 +1,34 @@
/**
* Copyright © 2016-2017 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.install;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.thingsboard.server.dao.audit.AuditLogLevelFilter;
import java.util.HashMap;
@Configuration
@Profile("install")
public class ThingsboardInstallConfiguration {
@Bean
public AuditLogLevelFilter emptyAuditLogLevelFilter() {
return new AuditLogLevelFilter(new HashMap<>());
}
}

View File

@ -310,10 +310,10 @@ audit_log:
# Allowed values: OFF (disable), W (log write operations), RW (log read and write operations)
logging_level:
mask:
"device": "W"
"asset": "W"
"dashboard": "W"
"customer": "W"
"user": "W"
"rule": "W"
"plugin": "W"
"device": "${AUDIT_LOG_MASK_DEVICE:W}"
"asset": "${AUDIT_LOG_MASK_ASSET:W}"
"dashboard": "${AUDIT_LOG_MASK_DASHBOARD:W}"
"customer": "${AUDIT_LOG_MASK_CUSTOMER:W}"
"user": "${AUDIT_LOG_MASK_USER:W}"
"rule": "${AUDIT_LOG_MASK_RULE:W}"
"plugin": "${AUDIT_LOG_MASK_PLUGIN:W}"

View File

@ -48,10 +48,7 @@ import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@ -135,12 +132,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
long partition = toPartitionTs(LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli());
BoundStatement stmt = getSaveByTenantStmt().bind();
stmt = stmt.setUUID(0, auditLog.getId().getId())
.setUUID(1, auditLog.getTenantId().getId())
.setUUID(2, auditLog.getEntityId().getId())
.setString(3, auditLog.getEntityId().getEntityType().name())
.setString(4, auditLog.getActionType().name())
.setLong(5, partition);
stmt = setSaveStmtVariables(stmt, auditLog, partition);
return getFuture(executeAsyncWrite(stmt), rs -> null);
}
@ -149,7 +141,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndEntityId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndEntityIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog);
stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null);
}
@ -158,7 +150,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndCustomerId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndCustomerIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog);
stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null);
}
@ -167,12 +159,12 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndUserId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndUserIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog);
stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null);
}
private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog) {
return stmt.setUUID(0, auditLog.getId().getId())
private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog, long partition) {
stmt.setUUID(0, auditLog.getId().getId())
.setUUID(1, auditLog.getTenantId().getId())
.setUUID(2, auditLog.getCustomerId().getId())
.setUUID(3, auditLog.getEntityId().getId())
@ -184,6 +176,10 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
.setString(9, auditLog.getActionData() != null ? auditLog.getActionData().toString() : null)
.setString(10, auditLog.getActionStatus().name())
.setString(11, auditLog.getActionFailureDetails());
if (partition > -1) {
stmt.setLong(12, partition);
}
return stmt;
}
@Override
@ -198,42 +194,57 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
return getFuture(executeAsyncWrite(stmt), rs -> null);
}
private PreparedStatement getSaveByTenantStmt() {
if (saveByTenantStmt == null) {
saveByTenantStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_TENANT_ID_CF, true);
}
return saveByTenantStmt;
}
private PreparedStatement getSaveByTenantIdAndEntityIdStmt() {
if (saveByTenantIdAndEntityIdStmt == null) {
saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF);
saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF, false);
}
return saveByTenantIdAndEntityIdStmt;
}
private PreparedStatement getSaveByTenantIdAndCustomerIdStmt() {
if (saveByTenantIdAndCustomerIdStmt == null) {
saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF);
saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF, false);
}
return saveByTenantIdAndCustomerIdStmt;
}
private PreparedStatement getSaveByTenantIdAndUserIdStmt() {
if (saveByTenantIdAndUserIdStmt == null) {
saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF);
saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF, false);
}
return saveByTenantIdAndUserIdStmt;
}
private PreparedStatement getSaveByTenantIdAndCFName(String cfName) {
return getSession().prepare(INSERT_INTO + cfName +
"(" + ModelConstants.AUDIT_LOG_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY +
"," + ModelConstants.AUDIT_LOG_USER_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY + ")" +
" VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
private PreparedStatement getSaveByTenantIdAndCFName(String cfName, boolean hasPartition) {
List columnsList = new ArrayList();
columnsList.add(ModelConstants.AUDIT_LOG_ID_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_USER_ID_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY);
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY);
if (hasPartition) {
columnsList.add(ModelConstants.AUDIT_LOG_PARTITION_PROPERTY);
}
StringJoiner values = new StringJoiner(",");
for (int i=0;i<columnsList.size();i++) {
values.add("?");
}
String statementString = INSERT_INTO + cfName + " (" + String.join(",", columnsList) + ") VALUES (" + values.toString() + ")";
return getSession().prepare(statementString);
}
private PreparedStatement getPartitionInsertStmt() {
@ -246,20 +257,6 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
return partitionInsertStmt;
}
private PreparedStatement getSaveByTenantStmt() {
if (saveByTenantStmt == null) {
saveByTenantStmt = getSession().prepare(INSERT_INTO + ModelConstants.AUDIT_LOG_BY_TENANT_ID_CF +
"(" + ModelConstants.AUDIT_LOG_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY +
"," + ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY +
"," + ModelConstants.AUDIT_LOG_PARTITION_PROPERTY + ")" +
" VALUES(?, ?, ?, ?, ?, ?)");
}
return saveByTenantStmt;
}
private long toPartitionTs(long ts) {
LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC);
return tsFormat.truncatedTo(time).toInstant(ZoneOffset.UTC).toEpochMilli();

View File

@ -20,9 +20,6 @@ import com.datastax.driver.core.*;
import com.datastax.driver.core.ProtocolOptions.Compression;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -36,7 +33,6 @@ import java.util.Collections;
import java.util.List;
@Slf4j
@Data
public abstract class AbstractCassandraCluster {
private static final String COMMA = ",";
@ -77,7 +73,7 @@ public abstract class AbstractCassandraCluster {
private Cluster cluster;
private Cluster.Builder clusterBuilder;
@Getter(AccessLevel.NONE) private Session session;
private Session session;
private MappingManager mappingManager;
@ -115,6 +111,10 @@ public abstract class AbstractCassandraCluster {
}
}
public Cluster getCluster() {
return cluster;
}
public Session getSession() {
if (!isInstall()) {
return session;

View File

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.Table;
import com.fasterxml.jackson.databind.JsonNode;
@ -114,10 +115,11 @@ public class AuditLogEntity implements BaseEntity<AuditLog> {
@Override
public AuditLog toData() {
AuditLog auditLog = new AuditLog(new AuditLogId(id));
auditLog.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
auditLog.setTenantId(new TenantId(tenantId));
}
if (entityId != null & entityType != null) {
if (entityId != null && entityType != null) {
auditLog.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, entityId));
}
if (customerId != null) {