This is an automated email from the ASF dual-hosted git repository.
machristie pushed a commit to branch airavata-v2-refactoring
in repository https://gitbox.apache.org/repos/asf/airavata.git
The following commit(s) were added to refs/heads/airavata-v2-refactoring by
this push:
new 554caf0c6e Mapping application inputs and outputs, tests
554caf0c6e is described below
commit 554caf0c6efe2962d4419dc6e83dd966077d8a5f
Author: Marcus Christie <[email protected]>
AuthorDate: Fri Jun 9 14:09:05 2023 -0400
Mapping application inputs and outputs, tests
---
.../application/input/ApplicationInputEntity.java | 30 +++--
.../input/ApplicationInputValueEntity.java | 61 ++++++++++
.../application/input/CommandLineInputEntity.java | 31 +----
.../application/input/EnvironmentInputEntity.java | 32 +-----
.../entity/application/input/FileInputEntity.java | 32 +-----
.../output/ApplicationOutputEntity.java | 59 +++++++---
.../output/ApplicationOutputValueEntity.java | 61 ++++++++++
.../application/output/FileOutputEntity.java | 32 +-----
.../application/output/StandardErrorEntity.java | 28 +----
.../application/output/StandardOutEntity.java | 28 +----
.../apis/handlers/ExecutionHandlerTest.java | 128 ++++++++++++++++-----
11 files changed, 295 insertions(+), 227 deletions(-)
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
index c8cbc7b4b6..2139b8f848 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
@@ -21,16 +21,8 @@ public class ApplicationInputEntity {
private boolean required;
@OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "command_line_input_id", referencedColumnName =
"input_id")
- private CommandLineInputEntity commandLineInput;
-
- @OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "environment_input_id", referencedColumnName =
"input_id")
- private EnvironmentInputEntity environmentInput;
-
- @OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "file_input_id", referencedColumnName = "input_id")
- private FileInputEntity fileInput;
+ @JoinColumn(name = "input_id")
+ private ApplicationInputValueEntity applicationInputValue;
@ManyToOne
@JoinColumn(name="application_id", nullable=false)
@@ -68,27 +60,33 @@ public class ApplicationInputEntity {
this.required = required;
}
+ /*
+ * Helper getters/setters for mapping from/to protobuf messages
+ */
+
public CommandLineInputEntity getCommandLineInput() {
- return commandLineInput;
+ return applicationInputValue instanceof CommandLineInputEntity ?
(CommandLineInputEntity) applicationInputValue
+ : null;
}
public void setCommandLineInput(CommandLineInputEntity commandLineInput) {
- this.commandLineInput = commandLineInput;
+ this.applicationInputValue = commandLineInput;
}
public EnvironmentInputEntity getEnvironmentInput() {
- return environmentInput;
+ return applicationInputValue instanceof EnvironmentInputEntity ?
(EnvironmentInputEntity) applicationInputValue
+ : null;
}
public void setEnvironmentInput(EnvironmentInputEntity environmentInput) {
- this.environmentInput = environmentInput;
+ this.applicationInputValue = environmentInput;
}
public FileInputEntity getFileInput() {
- return fileInput;
+ return applicationInputValue instanceof FileInputEntity ?
(FileInputEntity) applicationInputValue : null;
}
public void setFileInput(FileInputEntity fileInput) {
- this.fileInput = fileInput;
+ this.applicationInputValue = fileInput;
}
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
new file mode 100644
index 0000000000..50679fe4b6
--- /dev/null
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
@@ -0,0 +1,61 @@
+package org.apache.airavata.apis.db.entity.application.input;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class ApplicationInputValueEntity {
+
+ @Id
+ @Column(name = "INPUT_ID")
+ @GeneratedValue(generator = "uuid")
+ @GenericGenerator(name = "uuid", strategy = "uuid2")
+ private String inputId;
+
+ @OneToOne(mappedBy = "applicationInputValue")
+ private ApplicationInputEntity applicationInput;
+
+ public String getInputId() {
+ return inputId;
+ }
+
+ public void setInputId(String inputId) {
+ this.inputId = inputId;
+ }
+
+ public ApplicationInputEntity getApplicationInput() {
+ return applicationInput;
+ }
+
+ public void setApplicationInput(ApplicationInputEntity applicationInput) {
+ this.applicationInput = applicationInput;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((inputId == null) ? 0 : inputId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ApplicationInputValueEntity other = (ApplicationInputValueEntity) obj;
+ if (inputId == null) {
+ if (other.inputId != null)
+ return false;
+ } else if (!inputId.equals(other.inputId))
+ return false;
+ return true;
+ }
+
+}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
index 7ed4301947..abd1f09480 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
@@ -1,17 +1,10 @@
package org.apache.airavata.apis.db.entity.application.input;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class CommandLineInputEntity {
-
- @Id
- @Column(name = "INPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String inputId;
+public class CommandLineInputEntity extends ApplicationInputValueEntity {
@Column
private int position = 1;
@@ -22,16 +15,6 @@ public class CommandLineInputEntity {
@Column
private String value;
- @OneToOne(mappedBy = "commandLineInput")
- private ApplicationInputEntity applicationInput;
- public String getInputId() {
- return inputId;
- }
-
- public void setInputId(String inputId) {
- this.inputId = inputId;
- }
-
public int getPosition() {
return position;
}
@@ -55,12 +38,4 @@ public class CommandLineInputEntity {
public void setValue(String value) {
this.value = value;
}
-
- public ApplicationInputEntity getApplicationInput() {
- return applicationInput;
- }
-
- public void setApplicationInput(ApplicationInputEntity applicationInput) {
- this.applicationInput = applicationInput;
- }
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
index 6d1a501d97..cb6788cde1 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
@@ -1,17 +1,10 @@
package org.apache.airavata.apis.db.entity.application.input;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class EnvironmentInputEntity {
-
- @Id
- @Column(name = "INPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String inputId;
+public class EnvironmentInputEntity extends ApplicationInputValueEntity {
@Column
private String key;
@@ -19,25 +12,6 @@ public class EnvironmentInputEntity {
@Column
private String value;
- @OneToOne(mappedBy = "environmentInput")
- private ApplicationInputEntity applicationInput;
-
- public ApplicationInputEntity getApplicationInput() {
- return applicationInput;
- }
-
- public void setApplicationInput(ApplicationInputEntity applicationInput) {
- this.applicationInput = applicationInput;
- }
-
- public String getInputId() {
- return inputId;
- }
-
- public void setInputId(String inputId) {
- this.inputId = inputId;
- }
-
public String getKey() {
return key;
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
index 597850d372..58e86f12f5 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
@@ -1,17 +1,10 @@
package org.apache.airavata.apis.db.entity.application.input;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class FileInputEntity {
-
- @Id
- @Column(name = "INPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String inputId;
+public class FileInputEntity extends ApplicationInputValueEntity {
@Column
private String friendlyName;
@@ -19,17 +12,6 @@ public class FileInputEntity {
@Column
private String destinationPath;
- public String getInputId() {
- return inputId;
- }
-
- @OneToOne(mappedBy = "fileInput")
- private ApplicationInputEntity applicationInput;
-
- public void setInputId(String inputId) {
- this.inputId = inputId;
- }
-
public String getFriendlyName() {
return friendlyName;
}
@@ -45,12 +27,4 @@ public class FileInputEntity {
public void setDestinationPath(String destinationPath) {
this.destinationPath = destinationPath;
}
-
- public ApplicationInputEntity getApplicationInput() {
- return applicationInput;
- }
-
- public void setApplicationInput(ApplicationInputEntity applicationInput) {
- this.applicationInput = applicationInput;
- }
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
index 7d5f7ec708..2ee364c7dc 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
@@ -21,16 +21,8 @@ public class ApplicationOutputEntity {
private boolean required;
@OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "file_output_id", referencedColumnName = "output_id")
- private FileOutputEntity fileOutput;
-
- @OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "std_error_output_id", referencedColumnName =
"output_id")
- private StandardErrorEntity standardError;
-
- @OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "std_out_output_id", referencedColumnName = "output_id")
- private StandardOutEntity standardOut;
+ @JoinColumn(name = "output_id")
+ private ApplicationOutputValueEntity applicationOutputValue;
@ManyToOne
@JoinColumn(name="application_id", nullable=false)
@@ -68,27 +60,62 @@ public class ApplicationOutputEntity {
this.required = required;
}
+ public ApplicationOutputValueEntity getApplicationOutputValue() {
+ return applicationOutputValue;
+ }
+
+ public void setApplicationOutputValue(ApplicationOutputValueEntity
applicationOutputValue) {
+ this.applicationOutputValue = applicationOutputValue;
+ }
+
public FileOutputEntity getFileOutput() {
- return fileOutput;
+ return applicationOutputValue instanceof FileOutputEntity ?
(FileOutputEntity) applicationOutputValue : null;
}
public void setFileOutput(FileOutputEntity fileOutput) {
- this.fileOutput = fileOutput;
+ this.applicationOutputValue = fileOutput;
}
public StandardErrorEntity getStandardError() {
- return standardError;
+ return applicationOutputValue instanceof StandardErrorEntity ?
(StandardErrorEntity) applicationOutputValue
+ : null;
}
public void setStandardError(StandardErrorEntity standardError) {
- this.standardError = standardError;
+ this.applicationOutputValue = standardError;
}
public StandardOutEntity getStandardOut() {
- return standardOut;
+ return applicationOutputValue instanceof StandardOutEntity ?
(StandardOutEntity) applicationOutputValue : null;
}
public void setStandardOut(StandardOutEntity standardOut) {
- this.standardOut = standardOut;
+ this.applicationOutputValue = standardOut;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((applicationOutputId == null) ? 0 :
applicationOutputId.hashCode());
+ return result;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ApplicationOutputEntity other = (ApplicationOutputEntity) obj;
+ if (applicationOutputId == null) {
+ if (other.applicationOutputId != null)
+ return false;
+ } else if (!applicationOutputId.equals(other.applicationOutputId))
+ return false;
+ return true;
+ }
+
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
new file mode 100644
index 0000000000..7c2a416e6e
--- /dev/null
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
@@ -0,0 +1,61 @@
+package org.apache.airavata.apis.db.entity.application.output;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class ApplicationOutputValueEntity {
+
+ @Id
+ @Column(name = "OUTPUT_ID")
+ @GeneratedValue(generator = "uuid")
+ @GenericGenerator(name = "uuid", strategy = "uuid2")
+ private String outputId;
+
+ @OneToOne(mappedBy = "applicationOutputValue")
+ private ApplicationOutputEntity applicationOutput;
+
+ public String getOutputId() {
+ return outputId;
+ }
+
+ public void setOutputId(String outputId) {
+ this.outputId = outputId;
+ }
+
+ public ApplicationOutputEntity getApplicationOutput() {
+ return applicationOutput;
+ }
+
+ public void setApplicationOutput(ApplicationOutputEntity
applicationOutput) {
+ this.applicationOutput = applicationOutput;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((outputId == null) ? 0 :
outputId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ApplicationOutputValueEntity other = (ApplicationOutputValueEntity)
obj;
+ if (outputId == null) {
+ if (other.outputId != null)
+ return false;
+ } else if (!outputId.equals(other.outputId))
+ return false;
+ return true;
+ }
+
+}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
index 84a0e0c519..9decbdd054 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
@@ -1,17 +1,10 @@
package org.apache.airavata.apis.db.entity.application.output;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class FileOutputEntity {
-
- @Id
- @Column(name = "OUTPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String outputId;
+public class FileOutputEntity extends ApplicationOutputValueEntity {
@Column
private String friendlyName;
@@ -19,25 +12,6 @@ public class FileOutputEntity {
@Column
private String destinationPath;
- @OneToOne(mappedBy = "fileOutput")
- private ApplicationOutputEntity applicationOutput;
-
- public ApplicationOutputEntity getApplicationOutput() {
- return applicationOutput;
- }
-
- public void setApplicationOutput(ApplicationOutputEntity
applicationOutput) {
- this.applicationOutput = applicationOutput;
- }
-
- public String getOutputId() {
- return outputId;
- }
-
- public void setOutputId(String outputId) {
- this.outputId = outputId;
- }
-
public String getFriendlyName() {
return friendlyName;
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
index 65e2f5349b..24d68a9498 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
@@ -1,36 +1,14 @@
package org.apache.airavata.apis.db.entity.application.output;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class StandardErrorEntity {
-
- @Id
- @Column(name = "OUTPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String outputId;
+public class StandardErrorEntity extends ApplicationOutputValueEntity {
@Column
private String destinationPath;
- @OneToOne(mappedBy = "standardError")
- private ApplicationOutputEntity applicationOutput;
-
- public ApplicationOutputEntity getApplicationOutput() {
- return applicationOutput;
- }
-
- public String getOutputId() {
- return outputId;
- }
-
- public void setOutputId(String outputId) {
- this.outputId = outputId;
- }
-
public String getDestinationPath() {
return destinationPath;
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
index 8a2b148049..83471e4250 100644
---
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
+++
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
@@ -1,36 +1,14 @@
package org.apache.airavata.apis.db.entity.application.output;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
@Entity
-public class StandardOutEntity {
-
- @Id
- @Column(name = "OUTPUT_ID")
- @GeneratedValue(generator = "uuid")
- @GenericGenerator(name = "uuid", strategy = "uuid2")
- private String outputId;
+public class StandardOutEntity extends ApplicationOutputValueEntity {
@Column
private String destinationPath;
- @OneToOne(mappedBy = "standardOut")
- private ApplicationOutputEntity applicationOutput;
-
- public ApplicationOutputEntity getApplicationOutput() {
- return applicationOutput;
- }
-
- public String getOutputId() {
- return outputId;
- }
-
- public void setOutputId(String outputId) {
- this.outputId = outputId;
- }
-
public String getDestinationPath() {
return destinationPath;
}
diff --git
a/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
b/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
index aef1cbc210..d96007e02b 100644
---
a/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
+++
b/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
@@ -8,8 +8,16 @@ import
org.apache.airavata.apis.db.entity.DataMovementConfigurationEntity;
import org.apache.airavata.apis.db.entity.ExperimentEntity;
import org.apache.airavata.apis.db.entity.RunConfigurationEntity;
import org.apache.airavata.apis.db.entity.application.ApplicationEntity;
+import
org.apache.airavata.apis.db.entity.application.input.ApplicationInputEntity;
+import
org.apache.airavata.apis.db.entity.application.input.CommandLineInputEntity;
+import
org.apache.airavata.apis.db.entity.application.input.EnvironmentInputEntity;
+import org.apache.airavata.apis.db.entity.application.input.FileInputEntity;
+import
org.apache.airavata.apis.db.entity.application.output.ApplicationOutputEntity;
+import org.apache.airavata.apis.db.entity.application.output.FileOutputEntity;
import org.apache.airavata.apis.db.entity.backend.ComputeBackendEntity;
import org.apache.airavata.apis.db.entity.backend.ServerBackendEntity;
+import org.apache.airavata.apis.db.entity.backend.iface.SCPInterfaceEntity;
+import org.apache.airavata.apis.db.entity.backend.iface.SSHInterfaceEntity;
import org.apache.airavata.apis.db.entity.data.InDataMovementEntity;
import org.apache.airavata.apis.db.repository.ExperimentRepository;
import org.junit.jupiter.api.Test;
@@ -17,8 +25,11 @@ import
org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
+import java.util.Optional;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
@SpringBootTest
@Transactional
@@ -33,40 +44,48 @@ public class ExecutionHandlerTest {
@Test
void testExperimentMapping() {
- // TODO: ec2
- // TODO: local
- ServerBackend serverBackend = ServerBackend.newBuilder()
- .setHostName("server-hostname")
- .build();
- Application application = Application.newBuilder()
- .setName("test-application")
- .build();
- ApplicationRunInfo applicationRunInfo = ApplicationRunInfo.newBuilder()
- .setApplication(application)
+ SSHInterface sshInterface =
SSHInterface.newBuilder().setHostName("ssh-hostname").setPort(2222)
+ .setSshCredentialId("ssh-credential-id").build();
+ SCPInterface scpInterface =
SCPInterface.newBuilder().setHostName("scp-hostname").setPort(4422)
+ .setSshCredentialId("ssh-credential-id").build();
+ ServerBackend serverBackend =
ServerBackend.newBuilder().setHostName("server-hostname").setPort(1888)
+
.setCommandInterface(sshInterface).setDataInterface(scpInterface)
+
.setWorkingDirectory("/tmp/working-directory/some_wd/").build();
+ // ApplicationInputs
+ CommandLineInput commandLineInput =
CommandLineInput.newBuilder().setPosition(1).setPrefix("--prefix")
+ .setValue("input-value").build();
+ ApplicationInput applicationInput =
ApplicationInput.newBuilder().setIndex(1)
+
.setCommandLineInput(commandLineInput).setRequired(true).build();
+ FileInput fileInput = FileInput.newBuilder().setFriendlyName("config
file")
+
.setDestinationPath("/scratch/workdirs/W123/config.conf").build();
+ ApplicationInput applicationInput2 =
ApplicationInput.newBuilder().setIndex(2).setFileInput(fileInput)
+ .setRequired(true).build();
+ EnvironmentInput environmentInput =
EnvironmentInput.newBuilder().setKey("env-key").setValue("env-value")
.build();
- FileLocation sourceLocation = FileLocation.newBuilder()
- .setStorageId("source-location-storage-id")
+ ApplicationInput applicationInput3 =
ApplicationInput.newBuilder().setIndex(3)
+
.setEnvironmentInput(environmentInput).setRequired(false).build();
+ // ApplicationOutputs
+ // TODO: add StandardOut and StandardError outputs as well
+ FileOutput fileOutput =
FileOutput.newBuilder().setFriendlyName("output-file")
+ .setDestinationPath("/scratch/workdir/output.file").build();
+ ApplicationOutput applicationOutput =
ApplicationOutput.newBuilder().setIndex(1).setFileOutput(fileOutput)
+ .setRequired(true).build();
+ Application application =
Application.newBuilder().setName("test-application").addInputs(applicationInput)
+
.addInputs(applicationInput2).addInputs(applicationInput3).addOutputs(applicationOutput)
.build();
- InDataMovement inDataMovement = InDataMovement.newBuilder()
- .setInputIndex(1)
- .setSourceLocation(sourceLocation)
+ ApplicationRunInfo applicationRunInfo =
ApplicationRunInfo.newBuilder().setApplication(application).build();
+ FileLocation sourceLocation =
FileLocation.newBuilder().setStorageId("source-location-storage-id").build();
+ InDataMovement inDataMovement =
InDataMovement.newBuilder().setInputIndex(1).setSourceLocation(sourceLocation)
.build();
DataMovementConfiguration dataMovementConfiguration =
DataMovementConfiguration.newBuilder()
- .addInMovements(inDataMovement)
- .build();
- RunConfiguration runConfiguration = RunConfiguration.newBuilder()
- .setServer(serverBackend)
- .setAppRunInfo(applicationRunInfo)
- .addDataMovementConfigs(dataMovementConfiguration)
- .build();
- Experiment experiment = Experiment.newBuilder()
- .setCreationTime(System.currentTimeMillis())
- .setDescription("Sample Exp")
- .setExperimentName("Exp Name")
- .setGatewayId("gateway-id")
- .setProjectId("project-id")
- .addRunConfigs(runConfiguration)
- .build();
+ .addInMovements(inDataMovement).build();
+ // TODO: add RunConfiguration for ec2
+ // TODO: add RunConfiguration for local
+ RunConfiguration runConfiguration =
RunConfiguration.newBuilder().setServer(serverBackend)
+
.setAppRunInfo(applicationRunInfo).addDataMovementConfigs(dataMovementConfiguration).build();
+ Experiment experiment =
Experiment.newBuilder().setCreationTime(System.currentTimeMillis())
+ .setDescription("Sample Exp").setExperimentName("Exp
Name").setGatewayId("gateway-id")
+
.setProjectId("project-id").addRunConfigs(runConfiguration).build();
ExperimentRegisterRequest experimentRegisterRequest =
ExperimentRegisterRequest.newBuilder()
.setExperiment(experiment).build();
@@ -93,11 +112,60 @@ public class ExecutionHandlerTest {
assertTrue(computeBackendEntity instanceof ServerBackendEntity);
ServerBackendEntity serverBackendEntity = (ServerBackendEntity)
computeBackendEntity;
assertEquals(serverBackend.getHostName(),
serverBackendEntity.getHostName());
+ assertEquals(serverBackend.getPort(), serverBackendEntity.getPort());
+ assertEquals(serverBackend.getWorkingDirectory(),
serverBackendEntity.getWorkingDirectory());
+ SSHInterfaceEntity commandInterface =
serverBackendEntity.getCommandInterface();
+ assertEquals(sshInterface.getHostName(),
commandInterface.getHostName());
+ assertEquals(sshInterface.getPort(),
commandInterface.getPort().intValue());
+ assertEquals(sshInterface.getSshCredentialId(),
commandInterface.getSshCredentialId());
+ SCPInterfaceEntity scpInterfaceEntity =
serverBackendEntity.getDataInterface();
+ assertEquals(scpInterface.getHostName(),
scpInterfaceEntity.getHostName());
+ assertEquals(scpInterface.getPort(),
scpInterfaceEntity.getPort().intValue());
+ assertEquals(scpInterface.getSshCredentialId(),
scpInterfaceEntity.getSshCredentialId());
// ApplicationRunInfo
ApplicationRunInfoEntity applicationRunInfoEntity =
runConfigEntity.getAppRunInfo();
ApplicationEntity applicationEntity =
applicationRunInfoEntity.getApplication();
assertEquals(application.getName(), applicationEntity.getName());
+ assertEquals(application.getInputsCount(),
applicationEntity.getInputs().size());
+ Optional<ApplicationInputEntity> maybeApplicationInputEntity =
applicationEntity.getInputs().stream()
+ .filter(i -> i.getIndex() ==
applicationInput.getIndex()).findFirst();
+ assertTrue(maybeApplicationInputEntity.isPresent());
+ assertEquals(applicationInput.getRequired(),
maybeApplicationInputEntity.get().isRequired());
+ // CommandLineInput, index=1
+ CommandLineInputEntity commandLineInputEntity =
maybeApplicationInputEntity.get().getCommandLineInput();
+ assertNotNull(commandLineInputEntity);
+ assertEquals(commandLineInput.getPosition(),
commandLineInputEntity.getPosition());
+ assertEquals(commandLineInput.getPrefix(),
commandLineInputEntity.getPrefix());
+ assertEquals(commandLineInput.getValue(),
commandLineInputEntity.getValue());
+ maybeApplicationInputEntity = applicationEntity.getInputs().stream()
+ .filter(i -> i.getIndex() ==
applicationInput2.getIndex()).findFirst();
+ assertTrue(maybeApplicationInputEntity.isPresent());
+ assertEquals(applicationInput2.getRequired(),
maybeApplicationInputEntity.get().isRequired());
+ // FileInput, index=2
+ FileInputEntity fileInputEntity =
maybeApplicationInputEntity.get().getFileInput();
+ assertNotNull(fileInputEntity);
+ assertEquals(fileInput.getFriendlyName(),
fileInputEntity.getFriendlyName());
+ assertEquals(fileInput.getDestinationPath(),
fileInputEntity.getDestinationPath());
+ maybeApplicationInputEntity = applicationEntity.getInputs().stream()
+ .filter(i -> i.getIndex() ==
applicationInput3.getIndex()).findFirst();
+ assertTrue(maybeApplicationInputEntity.isPresent());
+ assertEquals(applicationInput3.getRequired(),
maybeApplicationInputEntity.get().isRequired());
+ // EnvironmentInputEntity, index=3
+ EnvironmentInputEntity environmentInputEntity =
maybeApplicationInputEntity.get().getEnvironmentInput();
+ assertNotNull(environmentInputEntity);
+ assertEquals(environmentInput.getKey(),
environmentInputEntity.getKey());
+ assertEquals(environmentInput.getValue(),
environmentInputEntity.getValue());
+ assertEquals(application.getOutputsCount(),
applicationEntity.getOutputs().size());
+ Optional<ApplicationOutputEntity> maybeApplicationOutputEntity =
applicationEntity.getOutputs().stream()
+ .filter(o -> o.getIndex() ==
applicationOutput.getIndex()).findFirst();
+ assertTrue(maybeApplicationOutputEntity.isPresent());
+ assertEquals(applicationOutput.getRequired(),
maybeApplicationOutputEntity.get().isRequired());
+ // FileOutput, index=1
+ FileOutputEntity fileOutputEntity =
maybeApplicationOutputEntity.get().getFileOutput();
+ assertNotNull(fileOutputEntity);
+ assertEquals(fileOutput.getFriendlyName(),
fileOutputEntity.getFriendlyName());
+ assertEquals(fileOutput.getDestinationPath(),
fileOutputEntity.getDestinationPath());
// DataMovementConfiguration
assertEquals(runConfiguration.getDataMovementConfigsCount(),
runConfigEntity.getDataMovementConfigs().size());