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) # Allowed values: OFF (disable), W (log write operations), RW (log read and write operations)
logging_level: logging_level:
mask: mask:
"device": "W" "device": "${AUDIT_LOG_MASK_DEVICE:W}"
"asset": "W" "asset": "${AUDIT_LOG_MASK_ASSET:W}"
"dashboard": "W" "dashboard": "${AUDIT_LOG_MASK_DASHBOARD:W}"
"customer": "W" "customer": "${AUDIT_LOG_MASK_CUSTOMER:W}"
"user": "W" "user": "${AUDIT_LOG_MASK_USER:W}"
"rule": "W" "rule": "${AUDIT_LOG_MASK_RULE:W}"
"plugin": "W" "plugin": "${AUDIT_LOG_MASK_PLUGIN:W}"

View File

@ -48,10 +48,7 @@ import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.Arrays; import java.util.*;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.stream.Collectors; 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()); long partition = toPartitionTs(LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli());
BoundStatement stmt = getSaveByTenantStmt().bind(); BoundStatement stmt = getSaveByTenantStmt().bind();
stmt = stmt.setUUID(0, auditLog.getId().getId()) stmt = setSaveStmtVariables(stmt, auditLog, partition);
.setUUID(1, auditLog.getTenantId().getId())
.setUUID(2, auditLog.getEntityId().getId())
.setString(3, auditLog.getEntityId().getEntityType().name())
.setString(4, auditLog.getActionType().name())
.setLong(5, partition);
return getFuture(executeAsyncWrite(stmt), rs -> null); return getFuture(executeAsyncWrite(stmt), rs -> null);
} }
@ -149,7 +141,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndEntityId [{}] ", auditLog); log.debug("Save saveByTenantIdAndEntityId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndEntityIdStmt().bind(); BoundStatement stmt = getSaveByTenantIdAndEntityIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog); stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null); return getFuture(executeAsyncWrite(stmt), rs -> null);
} }
@ -158,7 +150,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndCustomerId [{}] ", auditLog); log.debug("Save saveByTenantIdAndCustomerId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndCustomerIdStmt().bind(); BoundStatement stmt = getSaveByTenantIdAndCustomerIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog); stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null); return getFuture(executeAsyncWrite(stmt), rs -> null);
} }
@ -167,12 +159,12 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
log.debug("Save saveByTenantIdAndUserId [{}] ", auditLog); log.debug("Save saveByTenantIdAndUserId [{}] ", auditLog);
BoundStatement stmt = getSaveByTenantIdAndUserIdStmt().bind(); BoundStatement stmt = getSaveByTenantIdAndUserIdStmt().bind();
stmt = setSaveStmtVariables(stmt, auditLog); stmt = setSaveStmtVariables(stmt, auditLog, -1);
return getFuture(executeAsyncWrite(stmt), rs -> null); return getFuture(executeAsyncWrite(stmt), rs -> null);
} }
private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog) { private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog, long partition) {
return stmt.setUUID(0, auditLog.getId().getId()) stmt.setUUID(0, auditLog.getId().getId())
.setUUID(1, auditLog.getTenantId().getId()) .setUUID(1, auditLog.getTenantId().getId())
.setUUID(2, auditLog.getCustomerId().getId()) .setUUID(2, auditLog.getCustomerId().getId())
.setUUID(3, auditLog.getEntityId().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(9, auditLog.getActionData() != null ? auditLog.getActionData().toString() : null)
.setString(10, auditLog.getActionStatus().name()) .setString(10, auditLog.getActionStatus().name())
.setString(11, auditLog.getActionFailureDetails()); .setString(11, auditLog.getActionFailureDetails());
if (partition > -1) {
stmt.setLong(12, partition);
}
return stmt;
} }
@Override @Override
@ -198,42 +194,57 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
return getFuture(executeAsyncWrite(stmt), rs -> null); 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() { private PreparedStatement getSaveByTenantIdAndEntityIdStmt() {
if (saveByTenantIdAndEntityIdStmt == null) { if (saveByTenantIdAndEntityIdStmt == null) {
saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF); saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF, false);
} }
return saveByTenantIdAndEntityIdStmt; return saveByTenantIdAndEntityIdStmt;
} }
private PreparedStatement getSaveByTenantIdAndCustomerIdStmt() { private PreparedStatement getSaveByTenantIdAndCustomerIdStmt() {
if (saveByTenantIdAndCustomerIdStmt == null) { if (saveByTenantIdAndCustomerIdStmt == null) {
saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF); saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF, false);
} }
return saveByTenantIdAndCustomerIdStmt; return saveByTenantIdAndCustomerIdStmt;
} }
private PreparedStatement getSaveByTenantIdAndUserIdStmt() { private PreparedStatement getSaveByTenantIdAndUserIdStmt() {
if (saveByTenantIdAndUserIdStmt == null) { if (saveByTenantIdAndUserIdStmt == null) {
saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF); saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF, false);
} }
return saveByTenantIdAndUserIdStmt; return saveByTenantIdAndUserIdStmt;
} }
private PreparedStatement getSaveByTenantIdAndCFName(String cfName) { private PreparedStatement getSaveByTenantIdAndCFName(String cfName, boolean hasPartition) {
return getSession().prepare(INSERT_INTO + cfName + List columnsList = new ArrayList();
"(" + ModelConstants.AUDIT_LOG_ID_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ID_PROPERTY);
"," + ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY);
"," + ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY);
"," + ModelConstants.AUDIT_LOG_USER_ID_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_USER_ID_PROPERTY);
"," + ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY + columnsList.add(ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY);
"," + ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY + ")" + columnsList.add(ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY);
" VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 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() { private PreparedStatement getPartitionInsertStmt() {
@ -246,20 +257,6 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo
return partitionInsertStmt; 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) { private long toPartitionTs(long ts) {
LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC); LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC);
return tsFormat.truncatedTo(time).toInstant(ZoneOffset.UTC).toEpochMilli(); 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.core.ProtocolOptions.Compression;
import com.datastax.driver.mapping.Mapper; import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager; import com.datastax.driver.mapping.MappingManager;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -36,7 +33,6 @@ import java.util.Collections;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
@Data
public abstract class AbstractCassandraCluster { public abstract class AbstractCassandraCluster {
private static final String COMMA = ","; private static final String COMMA = ",";
@ -77,7 +73,7 @@ public abstract class AbstractCassandraCluster {
private Cluster cluster; private Cluster cluster;
private Cluster.Builder clusterBuilder; private Cluster.Builder clusterBuilder;
@Getter(AccessLevel.NONE) private Session session; private Session session;
private MappingManager mappingManager; private MappingManager mappingManager;
@ -115,6 +111,10 @@ public abstract class AbstractCassandraCluster {
} }
} }
public Cluster getCluster() {
return cluster;
}
public Session getSession() { public Session getSession() {
if (!isInstall()) { if (!isInstall()) {
return session; return session;

View File

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