Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support of dynaflow on windows platform #303

Merged
merged 7 commits into from
Nov 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions commons/src/main/java/com/powsybl/dynawo/commons/DynawoConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/**
* Copyright (c) 2023, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.dynawo.commons;

import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.config.ModuleConfig;
import com.powsybl.commons.config.PlatformConfig;
import org.apache.commons.lang3.SystemUtils;

import java.nio.file.Path;
import java.util.Objects;
import java.util.function.Function;

/**
* @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
*/
public class DynawoConfig {

private static final boolean DEBUG_DEFAULT = false;

protected static <T extends DynawoConfig> T load(Function<ModuleConfig, T> configFactory, String moduleName) {
return load(configFactory, moduleName, PlatformConfig.defaultConfig());
}

protected static <T extends DynawoConfig> T load(Function<ModuleConfig, T> configFactory, String moduleName, PlatformConfig platformConfig) {
return platformConfig.getOptionalModuleConfig(moduleName)
.map(configFactory)
.orElseThrow(() -> new PowsyblException("PlatformConfig incomplete: Module " + moduleName + " not found"));
}

private final Path homeDir;
private final boolean debug;

public DynawoConfig(Path homeDir, boolean debug) {
this.homeDir = Objects.requireNonNull(homeDir);
this.debug = debug;
}

public DynawoConfig(ModuleConfig config) {
this(config.getPathProperty("homeDir"), config.getBooleanProperty("debug", DEBUG_DEFAULT));
}

public Path getHomeDir() {
return homeDir;
}

public boolean isDebug() {
return debug;
}

public String getProgram() {
return getProgram(DynawoConstants.DYNAWO_CMD_NAME);
}

public String getProgram(String programName) {
String extension = SystemUtils.IS_OS_WINDOWS ? ".cmd" : ".sh";
return homeDir.resolve(programName + extension).toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ private DynawoConstants() {
*/
public static final String IIDM_VERSION = IidmXmlVersion.V_1_4.toString(".");

public static final DynawoVersion VERSION_MIN = new DynawoVersion(1, 3, 0);
public static final String DYNAWO_CMD_NAME = "dynawo";

public static final DynawoVersion VERSION_MIN = new DynawoVersion(1, 5, 0);

public static final List<String> IIDM_EXTENSIONS = List.of(
"activePowerControl",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@ public static void writeIidm(Network network, Path file) {
network.write("XIIDM", params, file);
}

public static void requireDynawoMinVersion(ExecutionEnvironment env, ComputationManager computationManager, Command versionCmd, boolean fromErr) {
public static void requireDynaMinVersion(ExecutionEnvironment env, ComputationManager computationManager, Command versionCmd,
String dynaName, boolean fromErr) {
if (!checkDynawoVersion(env, computationManager, versionCmd, fromErr)) {
throw new PowsyblException("DynaFlow version not supported. Must be >= " + DynawoConstants.VERSION_MIN);
throw new PowsyblException(dynaName + " version not supported. Must be >= " + DynawoConstants.VERSION_MIN);
}
}

Expand Down
36 changes: 13 additions & 23 deletions dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,39 @@
package com.powsybl.dynaflow;

import com.google.common.collect.ImmutableMap;
import com.powsybl.commons.config.ModuleConfig;
import com.powsybl.commons.config.PlatformConfig;
import com.powsybl.dynawo.commons.DynawoConfig;

import java.nio.file.Path;
import java.util.Map;
import java.util.Objects;

/**
*
* @author Guillaume Pernin {@literal <guillaume.pernin at rte-france.com>}
*/
public class DynaFlowConfig {
public class DynaFlowConfig extends DynawoConfig {

private static final boolean DEFAULT_DEBUG = false;
private static final String DYNAFLOW_MODULE_NAME = "dynaflow";

private final Path homeDir;
private final boolean debug;
public static DynaFlowConfig load() {
return load(DynaFlowConfig::new, DYNAFLOW_MODULE_NAME);
}

public DynaFlowConfig(Path homeDir, boolean debug) {
this.homeDir = Objects.requireNonNull(homeDir);
this.debug = debug;
public static DynaFlowConfig load(PlatformConfig platformConfig) {
return load(DynaFlowConfig::new, DYNAFLOW_MODULE_NAME, platformConfig);
}

public static DynaFlowConfig fromPropertyFile() {
return fromPlatformConfig(PlatformConfig.defaultConfig());
public DynaFlowConfig(Path homeDir, boolean debug) {
super(homeDir, debug);
}

public static DynaFlowConfig fromPlatformConfig(PlatformConfig platformConfig) {
Objects.requireNonNull(platformConfig);
return platformConfig.getOptionalModuleConfig("dynaflow")
.map(config -> new DynaFlowConfig(config.getPathProperty("homeDir"), config.getBooleanProperty("debug", DEFAULT_DEBUG)))
.orElse(null);
private DynaFlowConfig(ModuleConfig config) {
super(config);
}

public Map<String, String> createEnv() {
return ImmutableMap.<String, String>builder()
.build();
}

public boolean isDebug() {
return debug;
}

public Path getHomeDir() {
return homeDir;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
*/
public final class DynaFlowConstants {

public static final String DYNAFLOW_LAUNCHER_PROGRAM_NAME = "dynaflow-launcher";
public static final String DYNAFLOW_NAME = "DynaFlow";
public static final String CONFIG_FILENAME = "config.json";
public static final String IIDM_FILENAME = "network.xiidm";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,15 @@ public class DynaFlowProvider implements LoadFlowProvider {
private final Supplier<DynaFlowConfig> configSupplier;

public DynaFlowProvider() {
this(DynaFlowConfig::fromPropertyFile);
this(DynaFlowConfig::load);
}

public DynaFlowProvider(Supplier<DynaFlowConfig> configSupplier) {
this.configSupplier = Suppliers.memoize(Objects.requireNonNull(configSupplier, "Config supplier is null"));
}

private static String getProgram(DynaFlowConfig config) {
return config.getHomeDir().resolve("dynaflow-launcher.sh").toString();
return config.getProgram(DynaFlowConstants.DYNAFLOW_LAUNCHER_PROGRAM_NAME);
}

public static Command getCommand(DynaFlowConfig config) {
Expand Down Expand Up @@ -116,7 +116,7 @@ public CompletableFuture<LoadFlowResult> run(Network network, ComputationManager
DynaFlowConfig config = Objects.requireNonNull(configSupplier.get());
ExecutionEnvironment env = new ExecutionEnvironment(config.createEnv(), WORKING_DIR_PREFIX, config.isDebug());
Command versionCmd = getVersionCommand(config);
DynawoUtil.requireDynawoMinVersion(env, computationManager, versionCmd, true);
DynawoUtil.requireDynaMinVersion(env, computationManager, versionCmd, DYNAFLOW_LAUNCHER_PROGRAM_NAME, true);
return computationManager.execute(env, new DynaFlowHandler(network, workingStateId, dynaFlowParameters, loadFlowParameters, config, reporter));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
public class DynaFlowSecurityAnalysis {

private static final String WORKING_DIR_PREFIX = "dynaflow_sa_";
private static final String DYNAFLOW_LAUNCHER_PROGRAM_NAME = "dynaflow-launcher.sh";
private static final String CONTINGENCIES_FILENAME = "contingencies.json";
private static final String DYNAWO_CONSTRAINTS_FOLDER = "constraints";

Expand Down Expand Up @@ -78,7 +77,7 @@ private static DynaFlowParameters getParametersExt(LoadFlowParameters parameters
}

private static String getProgram(DynaFlowConfig config) {
return config.getHomeDir().resolve(DYNAFLOW_LAUNCHER_PROGRAM_NAME).toString();
return config.getProgram(DynaFlowConstants.DYNAFLOW_LAUNCHER_PROGRAM_NAME);
}

public static Command getCommand(DynaFlowConfig config) {
Expand Down Expand Up @@ -143,7 +142,7 @@ public CompletableFuture<SecurityAnalysisReport> run(String workingVariantId,
DynaFlowConfig config = Objects.requireNonNull(configSupplier.get());
ExecutionEnvironment env = new ExecutionEnvironment(config.createEnv(), WORKING_DIR_PREFIX, config.isDebug());
Command versionCmd = getVersionCommand(config);
DynawoUtil.requireDynawoMinVersion(env, computationManager, versionCmd, true);
DynawoUtil.requireDynaMinVersion(env, computationManager, versionCmd, DynaFlowConstants.DYNAFLOW_LAUNCHER_PROGRAM_NAME, true);
List<Contingency> contingencies = contingenciesProvider.getContingencies(network);
return computationManager.execute(env, new AbstractExecutionHandler<>() {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class DynaFlowSecurityAnalysisProvider implements SecurityAnalysisProvide
private final Supplier<DynaFlowConfig> configSupplier;

public DynaFlowSecurityAnalysisProvider() {
this(DynaFlowConfig::fromPropertyFile);
this(DynaFlowConfig::load);
}

public DynaFlowSecurityAnalysisProvider(Supplier<DynaFlowConfig> configSupplier) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.config.InMemoryPlatformConfig;
import com.powsybl.commons.config.MapModuleConfig;
import org.junit.jupiter.api.AfterEach;
Expand All @@ -18,8 +19,7 @@
import java.nio.file.FileSystem;
import java.nio.file.Path;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.*;

/**
*
Expand Down Expand Up @@ -49,17 +49,16 @@ void fromPlatformConfigTest() {
moduleConfig.setStringProperty("homeDir", homeDir);
moduleConfig.setStringProperty("debug", Boolean.toString(debug));

DynaFlowConfig config = DynaFlowConfig.fromPlatformConfig(platformConfig);
DynaFlowConfig config = DynaFlowConfig.load(platformConfig);
assertEquals(homeDir, config.getHomeDir().toString());
assertEquals(debug, config.isDebug());
}

@Test
void fromPlatformConfigNull() {
InMemoryPlatformConfig platformConfig = new InMemoryPlatformConfig(fileSystem);

DynaFlowConfig config = DynaFlowConfig.fromPlatformConfig(platformConfig);
assertNull(config);
PowsyblException e = assertThrows(PowsyblException.class, () -> DynaFlowConfig.load(platformConfig));
assertEquals("PlatformConfig incomplete: Module dynaflow not found", e.getMessage());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@
import com.powsybl.computation.local.LocalCommandExecutor;
import com.powsybl.computation.local.LocalComputationConfig;
import com.powsybl.computation.local.LocalComputationManager;
import com.powsybl.dynawo.commons.DynawoConstants;
import com.powsybl.iidm.network.*;
import com.powsybl.iidm.xml.NetworkXml;
import com.powsybl.loadflow.LoadFlow;
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.loadflow.LoadFlowResult;
import org.apache.commons.lang3.SystemUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -48,26 +50,28 @@ class DynaFlowProviderTest extends AbstractConverterTest {
public void setUp() throws IOException {
super.setUp();
homeDir = fileSystem.getPath("/home/dynaflow");
config = DynaFlowConfig.fromPropertyFile();
config = DynaFlowConfig.load();
provider = new DynaFlowProvider();
}

@Test
void checkVersionCommand() {
String program = homeDir.resolve("dynaflow-launcher.sh").toString();
String versionCommand = DynaFlowProvider.getVersionCommand(config).toString(0);
String expectedVersionCommand = "[" + program + ", --version]";
String expectedVersionCommand = "[" + getProgram(homeDir) + ", --version]";
assertEquals(expectedVersionCommand, versionCommand);
}

@Test
void checkExecutionCommand() {
String program = homeDir.resolve("dynaflow-launcher.sh").toString();
String executionCommand = DynaFlowProvider.getCommand(config).toString(0);
String expectedExecutionCommand = "[" + program + ", --network, " + IIDM_FILENAME + ", --config, " + CONFIG_FILENAME + "]";
String expectedExecutionCommand = "[" + getProgram(homeDir) + ", --network, " + IIDM_FILENAME + ", --config, " + CONFIG_FILENAME + "]";
assertEquals(expectedExecutionCommand, executionCommand);
}

private static String getProgram(Path homeDir) {
return homeDir.resolve(SystemUtils.IS_OS_WINDOWS ? "dynaflow-launcher.cmd" : "dynaflow-launcher.sh").toString();
}

private static class LocalCommandExecutorMock extends AbstractLocalCommandExecutor {

private final String stdOutFileRef;
Expand Down Expand Up @@ -183,7 +187,7 @@ void testCallingBadVersionDynaFlow() throws Exception {
LocalCommandExecutor commandExecutor = new EmptyLocalCommandExecutorMock("/dynawo_bad_version.out");
ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(fileSystem.getPath("/working-dir"), 1), commandExecutor, ForkJoinPool.commonPool());
PowsyblException e = assertThrows(PowsyblException.class, () -> dynaFlowSimulation.run(network, computationManager, params));
assertEquals("DynaFlow version not supported. Must be >= 1.3.0", e.getMessage());
assertEquals("dynaflow-launcher version not supported. Must be >= " + DynawoConstants.VERSION_MIN, e.getMessage());
}

@Test
Expand Down
2 changes: 1 addition & 1 deletion dynaflow/src/test/resources/dynawo_version.out
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.4.0 (rev:HEAD-70c5c8e)
1.5.0 (rev:HEAD-32sde112)
2 changes: 1 addition & 1 deletion dynawaltz-dsl/src/test/resources/dynawo_version.out
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.4.0 (rev:HEAD-70c5c8e)
1.5.0 (rev:HEAD-34d5sf2)
35 changes: 12 additions & 23 deletions dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,43 +6,32 @@
*/
package com.powsybl.dynawaltz;

import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.config.ModuleConfig;
import com.powsybl.commons.config.PlatformConfig;
import com.powsybl.dynawo.commons.DynawoConfig;

import java.util.Objects;
import java.nio.file.Path;

/**
* @author Marcos de Miguel {@literal <demiguelm at aia.es>}
*/
public class DynaWaltzConfig {
public class DynaWaltzConfig extends DynawoConfig {

private static final String DYNAWALTZ_MODULE_NAME = "dynawaltz";

public static DynaWaltzConfig load() {
return load(PlatformConfig.defaultConfig());
return load(DynaWaltzConfig::new, DYNAWALTZ_MODULE_NAME);
}

public static DynaWaltzConfig load(PlatformConfig platformConfig) {
return platformConfig.getOptionalModuleConfig("dynawaltz")
.map(moduleConfig -> new DynaWaltzConfig(
moduleConfig.getStringProperty("homeDir"),
moduleConfig.getBooleanProperty("debug", DEBUG_DEFAULT)))
.orElseThrow(() -> new PowsyblException("PlatformConfig incomplete: Module dynawaltz not found"));
}

public DynaWaltzConfig(String homeDir, boolean debug) {
this.homeDir = Objects.requireNonNull(homeDir);
this.debug = debug;
return load(DynaWaltzConfig::new, DYNAWALTZ_MODULE_NAME, platformConfig);
}

public String getHomeDir() {
return homeDir;
public DynaWaltzConfig(Path homeDir, boolean debug) {
super(homeDir, debug);
}

public boolean isDebug() {
return debug;
private DynaWaltzConfig(ModuleConfig config) {
super(config);
}

private final String homeDir;
private final boolean debug;

private static final boolean DEBUG_DEFAULT = false;
}
Loading