Skip to content
Snippets Groups Projects
Commit 4a5964fa authored by Alexandre TISON's avatar Alexandre TISON
Browse files

Added context support TANGOARCH-908

parent 35d38791
Branches
No related tags found
1 merge request!2Context support
......@@ -7,15 +7,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tango.DeviceState;
import org.tango.server.ServerManager;
import org.tango.server.annotation.Attribute;
import org.tango.server.annotation.Command;
import org.tango.server.annotation.Device;
import org.tango.server.annotation.DeviceProperty;
import org.tango.server.annotation.Init;
import org.tango.server.annotation.State;
import org.tango.server.annotation.Status;
import org.tango.server.annotation.*;
import org.tango.server.attribute.log.LogAttribute;
import org.tango.server.dynamic.DynamicManager;
import org.tango.utils.DevFailedUtils;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.Set;
......@@ -85,6 +82,9 @@ public class ArchivingManager {
private final Logger logger = LoggerFactory.getLogger(ArchivingManager.class);
@DeviceProperty(name = "DbPort")
protected String dbPort = "";
private Logger auditLogger;
@DynamicManagement
private DynamicManager dynamicManager;
/**
* Computer identifier on wich is settled the database. The identifier
* can be the computer name or its IP address. <br>
......@@ -134,6 +134,27 @@ public class ArchivingManager {
ServerManager.getInstance().start(args, ArchivingManager.class);
}
private static DatabaseConnectionConfig getDatabaseConnectionConfig(String archiverClassName) {
final DatabaseConnectionConfig params = new DatabaseConnectionConfig();
// get default value from class properties of HDBArchiver
DatabaseConnectionConfig.TangoDbProperties tangoDbProperties =
new DatabaseConnectionConfig.TangoDbProperties("dbType", "dbHost", "dbName",
"dbSchema", "dbUser", "dbPassword",
"dbMinPoolSize", "dbMaxPoolSize",
"dbCnxInactivityTimeout", "dbPort");
// retrieve archiver class properties
params.setParametersFromTango(archiverClassName, tangoDbProperties);
return params;
}
public DynamicManager getDynamicManager() {
return dynamicManager;
}
public void setDynamicManager(DynamicManager dynamicManager) {
this.dynamicManager = dynamicManager;
}
public void setDbPort(String dbPort) {
this.dbPort = dbPort;
}
......@@ -181,8 +202,8 @@ public class ArchivingManager {
@Init(lazyLoading = true)
public void init() throws DevFailed {
final boolean isHdb = ConfigConst.HDB_CLASS_DEVICE.equals(archiverClass);
auditLogger = LoggerFactory.getLogger("audit." + ArchivingManager.class.getName());
dynamicManager.addAttribute(new LogAttribute("audit", 100, auditLogger));
connectDb();
Set<String> archivers = databaseAccess.getExportedArchiverList();
final String statusBuilder = archivers.size() + " archivers: " + archivers + "\n";
......@@ -190,7 +211,6 @@ public class ArchivingManager {
status = statusBuilder;
}
private void connectDb() throws DevFailed {
final boolean isHdb = ConfigConst.HDB_CLASS_DEVICE.equals(archiverClass);
final DatabaseConnectionConfig params = getDatabaseConnectionConfig(isHdb ? ConfigConst.HDB_CLASS_DEVICE : ConfigConst.TDB_CLASS_DEVICE);
......@@ -219,19 +239,6 @@ public class ArchivingManager {
}
private static DatabaseConnectionConfig getDatabaseConnectionConfig(String archiverClassName) {
final DatabaseConnectionConfig params = new DatabaseConnectionConfig();
// get default value from class properties of HDBArchiver
DatabaseConnectionConfig.TangoDbProperties tangoDbProperties =
new DatabaseConnectionConfig.TangoDbProperties("dbType", "dbHost", "dbName",
"dbSchema", "dbUser", "dbPassword",
"dbMinPoolSize", "dbMaxPoolSize",
"dbCnxInactivityTimeout", "dbPort");
// retrieve archiver class properties
params.setParametersFromTango(archiverClassName, tangoDbProperties);
return params;
}
public String getStatus() {
return status;
}
......@@ -248,7 +255,10 @@ public class ArchivingManager {
*/
@Command(name = "ArchivingStop", inTypeDesc = "The attribute list")
public String archivingStop(final String[] argin) throws DevFailed {
return databaseAccess.archivingStop(argin);
auditLogger.debug("Entering ArchivingStop with params {}", String.join(",", argin));
String res = databaseAccess.archivingStop(argin);
auditLogger.debug("Exiting ArchivingStop with result {}", res);
return res;
}
/**
......@@ -314,7 +324,9 @@ public class ArchivingManager {
*/
@Command(name = "ArchivingModif", inTypeDesc = "The configuration to switch to")
public void archivingModif(final String[] argin) throws DevFailed {
auditLogger.debug("Entering ArchivingModif with params {}", String.join(",", argin));
databaseAccess.archivingModif(argin);
auditLogger.debug("Exiting ArchivingModif");
}
/**
......@@ -380,9 +392,19 @@ public class ArchivingManager {
*/
@Command(name = "ArchivingStart", inTypeDesc = "The configuration to start")
public void archivingStart(final String[] argin) throws DevFailed {
auditLogger.debug("Entering ArchivingStart with params {}", String.join(",", argin));
databaseAccess.archivingStart(argin);
auditLogger.debug("Exiting ArchivingStart");
}
/**
* Execute command "ArchivingStartJson" on device. Start an
* archiving for the specified attributes, and following the specified mode.
* The configuration is given as a JSON array and you may specify a context id
* by adding a <code>;contextId</code> at the end of your input parameter.
* @param jsonAsString
* @throws DevFailed
*/
@Command(name = "ArchivingStartJson", inTypeDesc = "A JSON array. Example:\n [ {\n" +
" \"attributeFullName\" : \"tango/tangotest/1/ampli\",\n" +
" \"archiverName\" : \"tango://fokrred\",\n" +
......@@ -433,7 +455,16 @@ public class ArchivingManager {
" }\n" +
"} ]")
public void archivingStartJson(final String jsonAsString) throws DevFailed {
databaseAccess.archivingStartJson(jsonAsString);
auditLogger.debug("Entering ArchivingStartJson with params {}", jsonAsString);
String[] parts = jsonAsString.split(";");
int contextId;
try {
contextId = Integer.parseInt(parts[1]);
} catch (NumberFormatException | IndexOutOfBoundsException e) {
contextId = -1;
}
databaseAccess.archivingStartJson(parts[0], contextId);
auditLogger.debug("Exiting ArchivingStartJson");
}
/**
......@@ -449,7 +480,10 @@ public class ArchivingManager {
*/
@Command(name = "IsArchived", inTypeDesc = "The attribute list to check", outTypeDesc = "The archiving state for each attribute")
public short[] isArchived(final String[] argin) throws DevFailed {
return databaseAccess.isArchived(argin);
auditLogger.debug("Entering IsArchived with params {}", String.join(",", argin));
short[] res = databaseAccess.isArchived(argin);
auditLogger.debug("Exiting IsArchived with result {}", Arrays.toString(res));
return res;
}
/**
......@@ -503,7 +537,10 @@ public class ArchivingManager {
*/
@Command(name = "GetArchivingMode", inTypeDesc = "The attribute name", outTypeDesc = "The applied mode")
public String[] getArchivingMode(final String argin) throws DevFailed {
return databaseAccess.getArchivingMode(argin);
auditLogger.debug("Entering GetArchivingMode with params {}", argin);
String[] res = databaseAccess.getArchivingMode(argin);
auditLogger.debug("Exiting GetArchivingMode with result {}", String.join(",", res));
return res;
}
/**
......@@ -515,7 +552,10 @@ public class ArchivingManager {
*/
@Command(name = "GetStatus", inTypeDesc = "The attribute list", outTypeDesc = "The list of status")
public String[] getStatus(final String[] argin) throws DevFailed {
return databaseAccess.getStatus(argin);
auditLogger.debug("Entering GetStatus with params {}", String.join(",", argin));
String[] res = databaseAccess.getStatus(argin);
auditLogger.debug("Exiting GetStatus with result {}", String.join(",", res));
return res;
}
/**
......@@ -527,10 +567,13 @@ public class ArchivingManager {
*/
@Command(name = "CreateNewContext", inTypeDesc = "contextName,contextDescription", outTypeDesc = "contextId")
public int createNewContext(final String[] argin) throws DevFailed {
auditLogger.debug("Entering CreateNewContext with params {}", String.join(",", argin));
if (argin.length != 2) {
throw DevFailedUtils.newDevFailed("Invalid number of arguments");
}
return databaseAccess.createNewContext(argin[0], argin[1]);
int res = databaseAccess.createNewContext(argin[0], argin[1]);
auditLogger.debug("Exiting CreateNewContext with result {}", res);
return res;
}
/**
......@@ -541,7 +584,10 @@ public class ArchivingManager {
*/
@Command(name = "GetAllContexts", outTypeDesc = "Every contexts declared")
public String[] getAllContexts() throws DevFailed {
return databaseAccess.getAllContexts();
auditLogger.debug("Entering GetAllContexts");
String[] res = databaseAccess.getAllContexts();
auditLogger.debug("Exiting GetAllContexts with result {}", String.join(",", res));
return res;
}
}
......@@ -95,7 +95,7 @@ public class HDBTDBAccess implements IArchivingAccess {
}
@Override
public void archivingStartJson(final String configAsString) throws DevFailed {
public void archivingStartJson(final String configAsString, final int contextId) throws DevFailed {
ObjectMapper objectMapper = new ObjectMapper();
List<ArchivingStartConfig> jsonConfig = null;
try {
......
......@@ -7,7 +7,6 @@ import java.util.Set;
public interface IArchivingAccess {
void connect(final DatabaseConnectionConfig params, boolean isHistoric) throws DevFailed;
......@@ -19,7 +18,7 @@ public interface IArchivingAccess {
void archivingStart(final String[] argin) throws DevFailed;
void archivingStartJson(final String jsonAsString) throws DevFailed;
void archivingStartJson(final String jsonAsString, final int contextId) throws DevFailed;
short[] isArchived(final String[] argin) throws DevFailed;
......
......@@ -10,11 +10,13 @@ import fr.soleil.tango.archiving.TangoArchivingSystemConfigurationService;
import fr.soleil.tango.archiving.build.DatabaseConnectionConfig;
import fr.soleil.tango.archiving.build.TangoArchivingServicesBuilder;
import fr.soleil.tango.archiving.config.AttributeConfig;
import fr.soleil.tango.archiving.config.Context;
import fr.soleil.tango.archiving.config.InsertionModes;
import fr.soleil.tango.archiving.infra.tango.ArchivingConfig;
import fr.soleil.tango.archiving.infra.tango.ArchivingConfigs;
import fr.soleil.tango.archiving.infra.tango.TangoArchiverProperties;
import fr.soleil.tango.archiving.services.TangoArchivingConfigService;
import fr.soleil.tango.archiving.services.TangoArchivingInserterService;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -35,6 +37,7 @@ public class TimeseriesAccess implements IArchivingAccess {
private final static String IMAGE_CHARGE = "imageCharge";
private final static String INSERTION_RATE = "insertionRate";
protected TangoArchivingConfigService configService;
protected TangoArchivingInserterService inserterService;
private final Logger logger = LoggerFactory.getLogger(TimeseriesAccess.class);
private TangoArchivingSystemConfigurationService service;
......@@ -54,6 +57,7 @@ public class TimeseriesAccess implements IArchivingAccess {
service = new TangoArchivingSystemConfigurationBuilder().build(params, properties);
service.updateArchiversList();
configService = new TangoArchivingServicesBuilder().buildConfigFetcher(params);
inserterService = new TangoArchivingServicesBuilder().buildInserter(params);
}
@Override
......@@ -78,7 +82,7 @@ public class TimeseriesAccess implements IArchivingAccess {
}
@Override
public void archivingStartJson(final String configAsString) throws DevFailed {
public void archivingStartJson(final String configAsString, final int contextId) throws DevFailed {
ObjectMapper objectMapper = new ObjectMapper();
List<ArchivingStartConfig> jsonConfig = null;
try {
......@@ -100,7 +104,11 @@ public class TimeseriesAccess implements IArchivingAccess {
attributeConfig.setFormat(attributeInfo.data_format.value());
attributeConfig.setWriteType(attributeInfo.writable.value());
archivingConfig.setAttributeConfig(attributeConfig);
archivingConfig.setModes(InsertionModesMapper.INSTANCE.mapModes(conf.getModes()));
InsertionModes modes = InsertionModesMapper.INSTANCE.mapModes(conf.getModes());
if (contextId >= 0) { // contextId is optional
modes.setContextId(contextId);
}
archivingConfig.setModes(modes);
configs.addConfiguration(archivingConfig);
}
service.startArchiving(configs);
......@@ -178,11 +186,16 @@ public class TimeseriesAccess implements IArchivingAccess {
@Override
public String[] getAllContexts() throws DevFailed {
return new String[0]; // TODO: Implement
List<Context> res = configService.getAllContexts();
return res.stream().map(Context::toString).toArray(String[]::new);
}
@Override
public int createNewContext(final String contextName, String description) throws DevFailed {
return 0; // TODO: Implement
List<Context> res = configService.getAllContexts();
if (res.stream().anyMatch(c -> c.getName().equals(contextName))) {
throw DevFailedUtils.newDevFailed("context " + contextName + " already exists");
}
return inserterService.createNewContext(contextName, description);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment