diff --git a/CMakeLists.txt b/CMakeLists.txt index f34792c78f..9e048837fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -368,7 +368,7 @@ set(TEST_FILES test/pilot_job/CriticalPathSchedulerTest.cpp test/misc/PointerUtilTest.cpp test/misc/BogusMessageTest.cpp - examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp + examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp test/compute_services/ScratchSpaceTest.cpp test/energy_consumption/EnergyConsumptionTest.cpp test/simulation/simulation_output/SimulationDumpJSONTest.cpp diff --git a/conf/cmake/Examples.cmake b/conf/cmake/Examples.cmake index 069f364ed8..e631a5e98d 100644 --- a/conf/cmake/Examples.cmake +++ b/conf/cmake/Examples.cmake @@ -1,14 +1,15 @@ # list of examples set(EXAMPLES_CMAKEFILES_TXT - examples/simple-example/CMakeLists.txt examples/basic-examples/bare-metal-chain/CMakeLists.txt examples/basic-examples/bare-metal-chain-scratch/CMakeLists.txt examples/basic-examples/bare-metal-bag-of-tasks/CMakeLists.txt examples/basic-examples/bare-metal-complex-job/CMakeLists.txt + examples/basic-examples/bare-metal-data-movement/CMakeLists.txt examples/basic-examples/cloud-bag-of-tasks/CMakeLists.txt examples/basic-examples/virtualized-cluster-bag-of-tasks/CMakeLists.txt examples/basic-examples/batch-bag-of-tasks/CMakeLists.txt examples/basic-examples/batch-pilot-job/CMakeLists.txt + examples/real-workflow-example/CMakeLists.txt ) foreach (cmakefile ${EXAMPLES_CMAKEFILES_TXT}) diff --git a/examples/README.md b/examples/README.md index 4cd2b2979d..6b8d6adeb3 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,36 +10,42 @@ Below are high-level descriptions of the example in each sub-directory. Details on the specifics of each simulator are in extensive source code comments. +--- + ### Basic simulator examples #### Simulators that showcase fundamental functionality (using the bare-metal compute service) - - ```bare-metal-chain```: A simulation of the execution of a + - ```basic-examples/bare-metal-chain```: A simulation of the execution of a chain workflow by a Workflow Management System on a bare-metal compute service, with all workflow data being read/written from/to a single storage service. The compute service runs on a 10-core host, and each task is executed as a single job that uses 10 cores - - ```bare-metal-chain-scratch```: Similar, but the compute service now + - ```basic-examples/bare-metal-chain-scratch```: Similar, but the compute service now has scratch space to hold intermediate workflow files. Since files created in the scratch space during a job's execution are erased after that job's completion. As a result, the workflow is executed as a single multi-task job. - - ```bare-metal-bag-of-tasks```: A simulation of the execution of a + - ```basic-examples/bare-metal-bag-of-tasks```: A simulation of the execution of a bag-of-task workflow by a Workflow Management System on a bare-metal compute service, with all workflow data being read/written from/to a single storage service. Up to two workflow tasks are executed concurrently on the compute service, in which case one task is executed on 6 cores and the other on 4 cores. - - ```bare-metal-complex-job```: A simulation of the execution of a + - ```basic-examples/bare-metal-complex-job```: A simulation of the execution of a one-task workflow on a compute service as a job that includes not only the task computation but also data movements. + + - ```basic-examples/bare-metal-data-movement```: A simulation that is similar + to the previous one, but instead of using a complex job to do data movements + and deletions, the WMS does it "by hang". #### Simulators that showcase the use of the cloud compute service - - ```cloud-bag-of-tasks```: A simulation of the execution of a + - ```basic-examples/cloud-bag-of-tasks```: A simulation of the execution of a bag-of-task workflow by a Workflow Management System on a cloud compute service, with all workflow data being read/written from/to a single storage service. Up to two workflow tasks are executed concurrently on @@ -48,7 +54,7 @@ Details on the specifics of each simulator are in extensive source code #### Simulators that showcase the use of the batch compute service - - ```batch-bag-of-tasks```: A simulation of the execution of a + - ```basic-examples/batch-bag-of-tasks```: A simulation of the execution of a bag-of-task workflow by a Workflow Management System on a batch compute service, with all workflow data being read/written from/to a single storage service. Up to two workflow tasks are executed concurrently on @@ -56,6 +62,18 @@ Details on the specifics of each simulator are in extensive source code **This example also features low-level workflow execution handling, and dealing with job failures**. - - ```batch-pilot-jobs```: A simulation that showcases the use of - "pilot jobs" on a batch compute service. + - ```basic-examples/batch-pilot-jobs```: A simulation that showcases the use of + "pilot jobs" on a batch compute service. In this example, due to a pilot job + expiration, the workflow does not complete successfully. +--- + +### Examples with real workflows and more sophisticated WMS implementations + + - ```real-workflow-example```: Two simulators, one in which the workflow is executed + using a batch compute service, and another in which the workflow is executed + using a cloud compute service. These simulators take as input workflow description + files from real-world workflow applications. They use the scheduler abstraction + provided by WREMNCH to implement complex Workflow Management System. + +--- \ No newline at end of file diff --git a/examples/basic-examples/bare-metal-bag-of-tasks/BareMetalBagOfTasks.cpp b/examples/basic-examples/bare-metal-bag-of-tasks/BareMetalBagOfTasks.cpp index 1b002a3c8a..0635c0885c 100644 --- a/examples/basic-examples/bare-metal-bag-of-tasks/BareMetalBagOfTasks.cpp +++ b/examples/basic-examples/bare-metal-bag-of-tasks/BareMetalBagOfTasks.cpp @@ -86,7 +86,7 @@ int main(int argc, char **argv) { /* Add workflow tasks and files */ for (int i=0; i < num_tasks; i++) { - /* Create a task: 10GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ + /* Create a task: random GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ auto task = workflow.addTask("task_" + std::to_string(i), dist(rng), 1, 10, 0.90, 10000000); task->addInputFile(workflow.addFile("input_" + std::to_string(i), 10000000)); task->addOutputFile(workflow.addFile("output_" + std::to_string(i), 10000000)); diff --git a/examples/basic-examples/bare-metal-bag-of-tasks/TwoTasksAtATimeWMS.h b/examples/basic-examples/bare-metal-bag-of-tasks/TwoTasksAtATimeWMS.h index 688d49ef4b..ba91901836 100644 --- a/examples/basic-examples/bare-metal-bag-of-tasks/TwoTasksAtATimeWMS.h +++ b/examples/basic-examples/bare-metal-bag-of-tasks/TwoTasksAtATimeWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_TWO_TASKS_AT_A_TIME_H -#define WRENCH_TWO_TASKS_AT_A_TIME_H +#ifndef WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_H +#define WRENCH_EXCAMPLE_TWO_TASKS_AT_A_TIME_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_TWO_TASKS_AT_A_TIME_H +#endif //WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_H diff --git a/examples/basic-examples/bare-metal-chain/OneTaskAtATimeWMS.h b/examples/basic-examples/bare-metal-chain/OneTaskAtATimeWMS.h index 2f5b5e390a..892b2c1def 100644 --- a/examples/basic-examples/bare-metal-chain/OneTaskAtATimeWMS.h +++ b/examples/basic-examples/bare-metal-chain/OneTaskAtATimeWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_ONE_TASK_AT_A_TIME_H -#define WRENCH_ONE_TASK_AT_A_TIME_H +#ifndef WRENCH_EXAMPLE_ONE_TASK_AT_A_TIME_H +#define WRENCH_EXAMPLE_ONE_TASK_AT_A_TIME_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_ONE_TASK_AT_A_TIME_H +#endif //WRENCH_EXAMPLE_ONE_TASK_AT_A_TIME_H diff --git a/examples/basic-examples/bare-metal-complex-job/ComplexJobWMS.h b/examples/basic-examples/bare-metal-complex-job/ComplexJobWMS.h index ad0cd26c1f..b9cb73d5c2 100644 --- a/examples/basic-examples/bare-metal-complex-job/ComplexJobWMS.h +++ b/examples/basic-examples/bare-metal-complex-job/ComplexJobWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_COMPLEX_JOB_H -#define WRENCH_COMPLEX_JOB_H +#ifndef WRENCH_EXAMPLE_COMPLEX_JOB_H +#define WRENCH_EXAMPLE_COMPLEX_JOB_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_COMPLEX_JOB_H +#endif //WRENCH_EXAMPLE_COMPLEX_JOB_H diff --git a/examples/basic-examples/bare-metal-data-movement/CMakeLists.txt b/examples/basic-examples/bare-metal-data-movement/CMakeLists.txt new file mode 100644 index 0000000000..f600f01ddf --- /dev/null +++ b/examples/basic-examples/bare-metal-data-movement/CMakeLists.txt @@ -0,0 +1,12 @@ +set(SOURCE_FILES + DataMovementWMS.h + DataMovementWMS.cpp + DataMovement.cpp + ) + +add_executable(wrench-bare-metal-data-movement-simulator ${SOURCE_FILES}) + +target_link_libraries(wrench-bare-metal-data-movement-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) + +install(TARGETS wrench-bare-metal-data-movement-simulator DESTINATION bin) + diff --git a/examples/basic-examples/bare-metal-data-movement/DataMovement.cpp b/examples/basic-examples/bare-metal-data-movement/DataMovement.cpp new file mode 100644 index 0000000000..61964ef001 --- /dev/null +++ b/examples/basic-examples/bare-metal-data-movement/DataMovement.cpp @@ -0,0 +1,146 @@ +/** + * Copyright (c) 2017-2018. The WRENCH Team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +/** + ** This simulator simulates the execution of a one-task workflow, where the task is: + ** + ** {InFile #0, InFile #1} -> Task -> {OutFile #0, OutFile #1} + ** + ** The compute platform comprises four hosts, WMSHost, StorageHost1, StorageHost2, and ComputeHost. + ** On WMSHost runs a WMS (defined in class DataMovementWMS). On ComputeHost runs a bare metal + ** compute service, that has access to the 10 cores of that host. On StorageHost1 and + ** StorageHost2 run two storage services. Once the simulation is done, + ** the completion time of each workflow task is printed. + ** + ** Example invocation of the simulator with only WMS logging: + ** ./bare-metal-data-movement-simulator ./four_hosts.xml --wrench-no-logs --log=custom_wms.threshold=info + ** + ** Example invocation of the simulator for a 5-task workflow with full logging: + ** ./bare-metal-data-movement-simulator ./four_hosts.xml + **/ + + +#include +#include + +#include "DataMovementWMS.h" // WMS implementation + +/** + * @brief The Simulator's main function + * + * @param argc: argument count + * @param argv: argument array + * @return 0 on success, non-zero otherwise + */ +int main(int argc, char **argv) { + + /* + * Declare a WRENCH simulation object + */ + wrench::Simulation simulation; + + /* Initialize the simulation, which may entail extracting WRENCH-specific and + * Simgrid-specific command-line arguments that can modify general simulation behavior. + * Two special command-line arguments are --help-wrench and --help-simgrid, which print + * details about available command-line arguments. */ + simulation.init(&argc, argv); + + /* Parsing of the command-line arguments for this WRENCH simulation */ + if (argc != 2) { + std::cerr << "Usage: " << argv[0] << " [--wrench-no-logs --log=custom_wms.threshold=info]" << std::endl; + exit(1); + } + + /* Reading and parsing the platform description file, written in XML following the SimGrid-defined DTD, + * to instantiate the simulated platform */ + std::cerr << "Instantiating simulated platform..." << std::endl; + simulation.instantiatePlatform(argv[1]); + + /* Declare a workflow */ + wrench::Workflow workflow; + + /* Add the workflow task an files */ + auto task = workflow.addTask("task", 10000000000.0, 1, 10, 0.90, 10000000); + task->addInputFile(workflow.addFile("infile_1", 100000000)); + task->addInputFile(workflow.addFile("infile_2", 10000000)); + task->addOutputFile(workflow.addFile("outfile_1", 200000000)); + task->addOutputFile(workflow.addFile("outfile_2", 5000000)); + + /* Instantiate a storage service, and add it to the simulation. + * A wrench::StorageService is an abstraction of a service on + * which files can be written and read. This particular storage service, which is an instance + * of wrench::SimpleStorageService, is started on StorageHost1 in the + * platform , which has an attached disk mounted at "/". The SimpleStorageService + * is a basic storage service implementation provided by WRENCH. + * Throughout the simulation execution, input/output files of workflow tasks will be located + * in this storage service, and accessed remotely by the compute service. Note that the + * storage service is configured to use a buffer size of 50M when transferring data over + * the network (i.e., to pipeline disk reads/writes and network revs/sends). */ + std::cerr << "Instantiating a SimpleStorageService on StorageHost1..." << std::endl; + auto storage_service1 = simulation.add(new wrench::SimpleStorageService( + "StorageHost1", {"/"}, {{wrench::SimpleStorageServiceProperty::BUFFER_SIZE, "50000000"}}, {})); + + /* Instantiate another one on StorageHost2 */ + std::cerr << "Instantiating a SimpleStorageService on StorageHost2..." << std::endl; + auto storage_service2 = simulation.add(new wrench::SimpleStorageService( + "StorageHost2", {"/"}, {{wrench::SimpleStorageServiceProperty::BUFFER_SIZE, "50000000"}}, {})); + + /* Instantiate a bare-metal compute service, and add it to the simulation. + * A wrench::BareMetalComputeService is an abstraction of a compute service that corresponds + * to a software infrastructure that can execute tasks on hardware resources. + * This particular service is started on ComputeHost and has no scratch storage space (mount point argument = ""). + * This means that tasks running on this service will access data only from remote storage services. */ + std::cerr << "Instantiating a BareMetalComputeService on ComputeHost..." << std::endl; + auto baremetal_service = simulation.add(new wrench::BareMetalComputeService( + "ComputeHost", {"ComputeHost"}, "", {}, {})); + + /* Instantiate a WMS, to be stated on WMSHost, which is responsible + * for executing the workflow. */ + + auto wms = simulation.add( + new wrench::DataMovementWMS({baremetal_service}, {storage_service1, storage_service2}, "WMSHost")); + + /* Associate the workflow to the WMS */ + wms->addWorkflow(&workflow); + + /* Instantiate a file registry service to be started on WMSHost. This service is + * essentially a replica catalog that stores pairs so that + * any service, in particular a WMS, can discover where workflow files are stored. */ + std::cerr << "Instantiating a FileRegistryService on WMSHost ..." << std::endl; + auto file_registry_service = new wrench::FileRegistryService("WMSHost"); + simulation.add(file_registry_service); + + /* It is necessary to store, or "stage", input files that only input. The getInputFiles() + * method of the Workflow class returns the set of all workflow files that are not generated + * by workflow tasks, and thus are only input files. These files are then staged on the storage service. */ + std::cerr << "Staging task input files..." << std::endl; + for (auto const &f : workflow.getInputFiles()) { + simulation.stageFile(f, storage_service1); + } + + /* Launch the simulation. This call only returns when the simulation is complete. */ + std::cerr << "Launching the Simulation..." << std::endl; + try { + simulation.launch(); + } catch (std::runtime_error &e) { + std::cerr << "Exception: " << e.what() << std::endl; + return 1; + } + std::cerr << "Simulation done!" << std::endl; + + /* Simulation results can be examined via simulation.output, which provides access to traces + * of events. In the code below, we print the retrieve the trace of all task completion events, print how + * many such events there are, and print some information for the first such event. */ + auto trace = simulation.getOutput().getTrace(); + for (auto const &item : trace) { + std::cerr << "Task " << item->getContent()->getTask()->getID() << " completed at time " << item->getDate() << std::endl; + } + + return 0; +} diff --git a/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.cpp b/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.cpp new file mode 100644 index 0000000000..b4adcdf317 --- /dev/null +++ b/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.cpp @@ -0,0 +1,182 @@ +/** + * Copyright (c) 2017-2018. The WRENCH Team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +/** + ** A Workflow Management System (WMS) implementation that operates on a workflow + ** with a single task that has two input files and two output files as follows: + ** + ** - Copy the first input file from the first storage service to the second one + ** - Runs the task so that it produces its output files on the second storage service + ** - Copy the task's first output file to the first storage service + ** - Delete the task's second output file on the second storage service + **/ + +#include + +#include "DataMovementWMS.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(custom_wms, "Log category for DataMovementWMS"); + +namespace wrench { + + /** + * @brief Constructor, which calls the super constructor + * + * @param compute_services: a set of compute services available to run tasks + * @param storage_services: a set of storage services available to store files + * @param hostname: the name of the host on which to start the WMS + */ + DataMovementWMS::DataMovementWMS(const std::set> &compute_services, + const std::set> &storage_services, + const std::string &hostname) : WMS( + nullptr, nullptr, + compute_services, + storage_services, + {}, nullptr, + hostname, + "data-movement") {} + + /** + * @brief main method of the DataMovementWMS daemon + * + * @return 0 on completion + * + * @throw std::runtime_error + */ + int DataMovementWMS::main() { + + /* Set the logging output to GREEN */ + TerminalOutput::setThisProcessLoggingColor(TerminalOutput::COLOR_GREEN); + + WRENCH_INFO("WMS starting on host %s", Simulation::getHostName().c_str()); + WRENCH_INFO("About to execute a workflow with %lu tasks", this->getWorkflow()->getNumberOfTasks()); + + /* Create a job manager so that we can create/submit jobs */ + auto job_manager = this->createJobManager(); + + /* Create a data movement manager so that we can create/submit jobs */ + auto data_movement_manager = this->createDataMovementManager(); + + /* Get the first available bare-metal compute service */ + auto compute_service = *(this->getAvailableComputeServices().begin()); + + /* Get the first and second available storage services */ + auto storage_services = this->getAvailableStorageServices(); + std::shared_ptr storage_service1, storage_service2; + if ((*(this->getAvailableStorageServices().begin()))->getHostname() == "StorageHost1") { + storage_service1 = *(this->getAvailableStorageServices().begin()); + storage_service2 = *(this->getAvailableStorageServices().begin()++); + } else { + storage_service2 = *(this->getAvailableStorageServices().begin()); + storage_service1 = *(this->getAvailableStorageServices().begin()++); + } + + /* Get references to the task and files */ + auto task = this->getWorkflow()->getTaskByID("task"); + auto infile_1 = this->getWorkflow()->getFileByID("infile_1"); + auto infile_2 = this->getWorkflow()->getFileByID("infile_2"); + auto outfile_1 = this->getWorkflow()->getFileByID("outfile_1"); + auto outfile_2 = this->getWorkflow()->getFileByID("outfile_2"); + + /* Synchronously copy infile_1 from storage_service1 to storage_service2 */ + WRENCH_INFO("Synchronously copying file infile_1 from storage_service1 to storage_service2"); + data_movement_manager->doSynchronousFileCopy(infile_1, + FileLocation::LOCATION(storage_service1), + FileLocation::LOCATION(storage_service2)); + WRENCH_INFO("File copy complete"); + + + /* Now let's create a map of file locations, stating for each file + * where is should be read/written while the task executes */ + std::map> file_locations; + + file_locations[infile_1] = FileLocation::LOCATION(storage_service2); + file_locations[infile_2] = FileLocation::LOCATION(storage_service1); + file_locations[outfile_1] = FileLocation::LOCATION(storage_service2); + file_locations[outfile_2] = FileLocation::LOCATION(storage_service2); + + /* Create the standard job */ + WRENCH_INFO("Creating a job to execute task %s", task->getID().c_str()); + auto job = job_manager->createStandardJob(task, file_locations); + + /* Submit the job to the compute service */ + WRENCH_INFO("Submitting job to the compute service"); + job_manager->submitJob(job, compute_service); + + /* Wait for a workflow execution event and process it. In this case we know that + * the event will be a StandardJobCompletionEvent, which is processed by the method + * processEventStandardJobCompletion() that this class overrides. */ + WRENCH_INFO("Waiting for next event"); + this->waitForAndProcessNextEvent(); + + /* Let's copying outfile_1 from storage_service2 to storage_service1, and let's + * do it asynchronously for kicks */ + WRENCH_INFO("Asynchronously copying outfile_1 from storage_service2 to storage_service1") + data_movement_manager->initiateAsynchronousFileCopy(outfile_1, + FileLocation::LOCATION(storage_service2), + FileLocation::LOCATION(storage_service1)); + + /* Just for kicks again, let's wait for the next event using the low-level + * waitForNextEvent() instead of waitForAndProcessNextEvent() */ + WRENCH_INFO("Waiting for an event"); + try { + auto event = this->waitForNextEvent(); + // Check that it is the expected event, just in case + if (auto file_copy_completion_event = std::dynamic_pointer_cast( + event)) { + WRENCH_INFO("Notified of the file copy completion!"); + } else { + throw std::runtime_error("Unexpected event (" + event->toString() + ")"); + } + } catch (WorkflowExecutionException &e) { + throw std::runtime_error("Unexpected workflow execution exception (" + + std::string(e.what()) + ")"); + } + + /* Delete outfile_2 on storage_service2 */ + WRENCH_INFO("Deleting file outfile_2 from storage_service2"); + StorageService::deleteFile(outfile_2, FileLocation::LOCATION(storage_service2)); + WRENCH_INFO("File deleted"); + + WRENCH_INFO("Workflow execution complete"); + return 0; + } + + /** + * @brief Process a standard job completion event + * + * @param event: the event + */ + void DataMovementWMS::processEventStandardJobCompletion(std::shared_ptr event) { + /* Retrieve the job that this event is for */ + auto job = event->standard_job; + /* Retrieve the job's first (and in our case only) task */ + auto task = job->getTasks().at(0); + WRENCH_INFO("Notified that a standard job has completed task %s", task->getID().c_str()); + } + + /** + * @brief Process a standard job failure event + * + * @param event: the event + */ + void DataMovementWMS::processEventStandardJobFailure(std::shared_ptr event) { + /* Retrieve the job that this event is for */ + auto job = event->standard_job; + /* Retrieve the job's first (and in our case only) task */ + auto task = job->getTasks().at(0); + /* Print some error message */ + WRENCH_INFO("Notified that a standard job has failed for task %s with error %s", + task->getID().c_str(), + event->failure_cause->toString().c_str()); + throw std::runtime_error("ABORTING DUE TO JOB FAILURE"); + } + + +} diff --git a/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.h b/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.h new file mode 100644 index 0000000000..e897e9ff6f --- /dev/null +++ b/examples/basic-examples/bare-metal-data-movement/DataMovementWMS.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2017-2018. The WRENCH Team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + + +#ifndef WRENCH_EXAMPLE_DATA_MOVEMENT_H +#define WRENCH_EXAMPLE_DATA_MOVEMENT_H + +#include + + +namespace wrench { + + class Simulation; + + /** + * @brief A Workflow Management System (WMS) implementation (inherits from WMS) + */ + class DataMovementWMS : public WMS { + + public: + // Constructor + DataMovementWMS( + const std::set> &compute_services, + const std::set> &storage_services, + const std::string &hostname); + + protected: + + // Overriden method + void processEventStandardJobCompletion(std::shared_ptr) override; + void processEventStandardJobFailure(std::shared_ptr) override; + + private: + // main() method of the WMS + int main() override; + + }; +} +#endif //WRENCH_EXAMPLE_DATA_MOVEMENT_H diff --git a/examples/basic-examples/bare-metal-data-movement/four_hosts.xml b/examples/basic-examples/bare-metal-data-movement/four_hosts.xml new file mode 100644 index 0000000000..56d70beda6 --- /dev/null +++ b/examples/basic-examples/bare-metal-data-movement/four_hosts.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/basic-examples/batch-bag-of-tasks/BatchBagOfTasks.cpp b/examples/basic-examples/batch-bag-of-tasks/BatchBagOfTasks.cpp index ddfa996807..20b27e1394 100644 --- a/examples/basic-examples/batch-bag-of-tasks/BatchBagOfTasks.cpp +++ b/examples/basic-examples/batch-bag-of-tasks/BatchBagOfTasks.cpp @@ -79,7 +79,7 @@ int main(int argc, char **argv) { /* Add workflow tasks and files */ for (int i=0; i < num_tasks; i++) { - /* Create a task: 10GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ + /* Create a task: increasing GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ auto task = workflow.addTask("task_" + std::to_string(i), (100 + i * 500) * TFLOP, 1, 10, 0.90, 1000); task->addInputFile(workflow.addFile("input_" + std::to_string(i), 10000000)); diff --git a/examples/basic-examples/batch-bag-of-tasks/CMakeLists.txt b/examples/basic-examples/batch-bag-of-tasks/CMakeLists.txt index e1910e6be8..632d8b8594 100644 --- a/examples/basic-examples/batch-bag-of-tasks/CMakeLists.txt +++ b/examples/basic-examples/batch-bag-of-tasks/CMakeLists.txt @@ -7,7 +7,13 @@ set(SOURCE_FILES add_executable(wrench-batch-bag-of-tasks-simulator ${SOURCE_FILES}) -target_link_libraries(wrench-batch-bag-of-tasks-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) +if (ENABLE_BATSCHED) + find_library(ZMQ_LIBRARY NAMES zmq) + target_link_libraries(wrench-batch-bag-of-tasks-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY} ${ZMQ_LIBRARY}) +else() + target_link_libraries(wrench-batch-bag-of-tasks-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) +endif() + install(TARGETS wrench-batch-bag-of-tasks-simulator DESTINATION bin) diff --git a/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.cpp b/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.cpp index 6c90d5dc90..08c9ac0993 100644 --- a/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.cpp +++ b/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.cpp @@ -162,10 +162,10 @@ namespace wrench { auto event = this->waitForNextEvent(); // Check that it is the expected event, just in case if (auto job_failed_event = std::dynamic_pointer_cast( - event)) { WRENCH_INFO("Received a job failure event (%s)", + event)) { WRENCH_INFO("Notified of a job failure event (%s)", job_failed_event->failure_cause->toString().c_str()); } else if (auto job_completed_event = std::dynamic_pointer_cast( - event)) { WRENCH_INFO("Received a job completion event!"); + event)) { WRENCH_INFO("Notified of a job completion event!"); } else { throw std::runtime_error("Unexpected event (" + event->toString() + ")"); } diff --git a/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.h b/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.h index 43a366a884..80e1981d52 100644 --- a/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.h +++ b/examples/basic-examples/batch-bag-of-tasks/TwoTasksAtATimeBatchWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_TWO_TASKS_AT_A_TIME_BATCH_H -#define WRENCH_TWO_TASKS_AT_A_TIME_BATCH_H +#ifndef WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_BATCH_H +#define WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_BATCH_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_TWO_TASKS_AT_A_TIME_BATCH_H +#endif //WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_BATCH_H diff --git a/examples/basic-examples/batch-pilot-job/CMakeLists.txt b/examples/basic-examples/batch-pilot-job/CMakeLists.txt index bc4e3f425d..24a5ccfbb4 100644 --- a/examples/basic-examples/batch-pilot-job/CMakeLists.txt +++ b/examples/basic-examples/batch-pilot-job/CMakeLists.txt @@ -7,7 +7,12 @@ set(SOURCE_FILES add_executable(wrench-batch-pilot-job-simulator ${SOURCE_FILES}) -target_link_libraries(wrench-batch-pilot-job-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) +if (ENABLE_BATSCHED) + find_library(ZMQ_LIBRARY NAMES zmq) + target_link_libraries(wrench-batch-pilot-job-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY} ${ZMQ_LIBRARY}) +else() + target_link_libraries(wrench-batch-pilot-job-simulator wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) +endif() install(TARGETS wrench-batch-pilot-job-simulator DESTINATION bin) diff --git a/examples/basic-examples/cloud-bag-of-tasks/CloudBagOfTasks.cpp b/examples/basic-examples/cloud-bag-of-tasks/CloudBagOfTasks.cpp index 5ca11a8871..41f2103eaf 100644 --- a/examples/basic-examples/cloud-bag-of-tasks/CloudBagOfTasks.cpp +++ b/examples/basic-examples/cloud-bag-of-tasks/CloudBagOfTasks.cpp @@ -85,7 +85,7 @@ int main(int argc, char **argv) { /* Add workflow tasks and files */ for (int i=0; i < num_tasks; i++) { - /* Create a task: 10GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ + /* Create a task: random GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ auto task = workflow.addTask("task_" + std::to_string(i), dist(rng), 1, 10, 0.90, 1000); task->addInputFile(workflow.addFile("input_" + std::to_string(i), 10000000)); task->addOutputFile(workflow.addFile("output_" + std::to_string(i), 10000000)); diff --git a/examples/basic-examples/cloud-bag-of-tasks/TwoTasksAtATimeCloudWMS.h b/examples/basic-examples/cloud-bag-of-tasks/TwoTasksAtATimeCloudWMS.h index 028b317a63..6c1284ace8 100644 --- a/examples/basic-examples/cloud-bag-of-tasks/TwoTasksAtATimeCloudWMS.h +++ b/examples/basic-examples/cloud-bag-of-tasks/TwoTasksAtATimeCloudWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_TWO_TASKS_AT_A_TIME_CLOUD_H -#define WRENCH_TWO_TASKS_AT_A_TIME_CLOUD_H +#ifndef WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_CLOUD_H +#define WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_CLOUD_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_TWO_TASKS_AT_A_TIME_CLOUD_H +#endif //WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_CLOUD_H diff --git a/examples/basic-examples/virtualized-cluster-bag-of-tasks/TwoTasksAtATimeVirtualizedClusterWMS.h b/examples/basic-examples/virtualized-cluster-bag-of-tasks/TwoTasksAtATimeVirtualizedClusterWMS.h index b0c0ee9922..bcb6c5f386 100644 --- a/examples/basic-examples/virtualized-cluster-bag-of-tasks/TwoTasksAtATimeVirtualizedClusterWMS.h +++ b/examples/basic-examples/virtualized-cluster-bag-of-tasks/TwoTasksAtATimeVirtualizedClusterWMS.h @@ -8,8 +8,8 @@ */ -#ifndef WRENCH_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H -#define WRENCH_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H +#ifndef WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H +#define WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H +#endif //WRENCH_EXAMPLE_TWO_TASKS_AT_A_TIME_VIRTUALIZED_CLUSTER_H diff --git a/examples/basic-examples/virtualized-cluster-bag-of-tasks/VirtualizedClusterBagOfTasks.cpp b/examples/basic-examples/virtualized-cluster-bag-of-tasks/VirtualizedClusterBagOfTasks.cpp index fc685caa50..4df6fb6d75 100644 --- a/examples/basic-examples/virtualized-cluster-bag-of-tasks/VirtualizedClusterBagOfTasks.cpp +++ b/examples/basic-examples/virtualized-cluster-bag-of-tasks/VirtualizedClusterBagOfTasks.cpp @@ -85,7 +85,7 @@ int main(int argc, char **argv) { /* Add workflow tasks and files */ for (int i=0; i < num_tasks; i++) { - /* Create a task: 10GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ + /* Create a task: random GFlop, 1 to 10 cores, 0.90 parallel efficiency, 10MB memory footprint */ auto task = workflow.addTask("task_" + std::to_string(i), dist(rng), 1, 10, 0.90, 1000); task->addInputFile(workflow.addFile("input_" + std::to_string(i), 10000000)); task->addOutputFile(workflow.addFile("output_" + std::to_string(i), 10000000)); diff --git a/examples/simple-example/CMakeLists.txt b/examples/real-workflow-example/CMakeLists.txt similarity index 84% rename from examples/simple-example/CMakeLists.txt rename to examples/real-workflow-example/CMakeLists.txt index 3875d0ef97..38ec87b190 100644 --- a/examples/simple-example/CMakeLists.txt +++ b/examples/real-workflow-example/CMakeLists.txt @@ -19,12 +19,7 @@ set(SOURCE_FILES set(APP_CLOUD_FILES SimpleSimulatorCloud.cpp) add_executable(wrench-simple-example-cloud ${SOURCE_FILES} ${APP_CLOUD_FILES}) -if (ENABLE_BATSCHED) - find_library(ZMQ_LIBRARY NAMES zmq) - target_link_libraries(wrench-simple-example-cloud wrenchpegasusworkflowparser wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY} ${ZMQ_LIBRARY}) -else() - target_link_libraries(wrench-simple-example-cloud wrenchpegasusworkflowparser wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) -endif() +target_link_libraries(wrench-simple-example-cloud wrenchpegasusworkflowparser wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) @@ -34,6 +29,7 @@ install(TARGETS wrench-simple-example-cloud DESTINATION bin) set(APP_BATCH_FILES SimpleSimulatorBatch.cpp) add_executable(wrench-simple-example-batch ${SOURCE_FILES} ${APP_BATCH_FILES}) if (ENABLE_BATSCHED) + find_library(ZMQ_LIBRARY NAMES zmq) target_link_libraries(wrench-simple-example-batch wrenchpegasusworkflowparser wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY} ${ZMQ_LIBRARY}) else() target_link_libraries(wrench-simple-example-batch wrenchpegasusworkflowparser wrench ${SimGrid_LIBRARY} ${PUGIXML_LIBRARY} ${LEMON_LIBRARY}) diff --git a/examples/simple-example/SimpleSimulatorBatch.cpp b/examples/real-workflow-example/SimpleSimulatorBatch.cpp similarity index 100% rename from examples/simple-example/SimpleSimulatorBatch.cpp rename to examples/real-workflow-example/SimpleSimulatorBatch.cpp diff --git a/examples/simple-example/SimpleSimulatorCloud.cpp b/examples/real-workflow-example/SimpleSimulatorCloud.cpp similarity index 100% rename from examples/simple-example/SimpleSimulatorCloud.cpp rename to examples/real-workflow-example/SimpleSimulatorCloud.cpp diff --git a/examples/simple-example/SimpleWMS.cpp b/examples/real-workflow-example/SimpleWMS.cpp similarity index 100% rename from examples/simple-example/SimpleWMS.cpp rename to examples/real-workflow-example/SimpleWMS.cpp diff --git a/examples/simple-example/SimpleWMS.h b/examples/real-workflow-example/SimpleWMS.h similarity index 91% rename from examples/simple-example/SimpleWMS.h rename to examples/real-workflow-example/SimpleWMS.h index 5a917845af..fca30d026a 100644 --- a/examples/simple-example/SimpleWMS.h +++ b/examples/real-workflow-example/SimpleWMS.h @@ -7,8 +7,8 @@ * (at your option) any later version. */ -#ifndef WRENCH_SIMPLEWMS_H -#define WRENCH_SIMPLEWMS_H +#ifndef WRENCH_EXAMPLE_SIMPLEWMS_H +#define WRENCH_EXAMPLE_SIMPLEWMS_H #include @@ -41,4 +41,4 @@ namespace wrench { bool abort = false; }; } -#endif //WRENCH_SIMPLEWMS_H +#endif //WRENCH_EXAMPLE_SIMPLEWMS_H diff --git a/examples/simple-example/optimizations/dynamic/FailureDynamicClustering.cpp b/examples/real-workflow-example/optimizations/dynamic/FailureDynamicClustering.cpp similarity index 100% rename from examples/simple-example/optimizations/dynamic/FailureDynamicClustering.cpp rename to examples/real-workflow-example/optimizations/dynamic/FailureDynamicClustering.cpp diff --git a/examples/simple-example/optimizations/dynamic/FailureDynamicClustering.h b/examples/real-workflow-example/optimizations/dynamic/FailureDynamicClustering.h similarity index 83% rename from examples/simple-example/optimizations/dynamic/FailureDynamicClustering.h rename to examples/real-workflow-example/optimizations/dynamic/FailureDynamicClustering.h index b4fac3998e..ff28fb8de3 100644 --- a/examples/simple-example/optimizations/dynamic/FailureDynamicClustering.h +++ b/examples/real-workflow-example/optimizations/dynamic/FailureDynamicClustering.h @@ -7,8 +7,8 @@ * (at your option) any later version. */ -#ifndef WRENCH_SIMPLEDYNAMICOPTIMIZATION_H -#define WRENCH_SIMPLEDYNAMICOPTIMIZATION_H +#ifndef WRENCH_EXAMPLE_SIMPLEDYNAMICOPTIMIZATION_H +#define WRENCH_EXAMPLE_SIMPLEDYNAMICOPTIMIZATION_H #include @@ -32,4 +32,4 @@ namespace wrench { } -#endif //WRENCH_SIMPLEDYNAMICOPTIMIZATION_H +#endif //WRENCH_EXAMPLE_SIMPLEDYNAMICOPTIMIZATION_H diff --git a/examples/simple-example/optimizations/static/SimplePipelineClustering.cpp b/examples/real-workflow-example/optimizations/static/SimplePipelineClustering.cpp similarity index 100% rename from examples/simple-example/optimizations/static/SimplePipelineClustering.cpp rename to examples/real-workflow-example/optimizations/static/SimplePipelineClustering.cpp diff --git a/examples/simple-example/optimizations/static/SimplePipelineClustering.h b/examples/real-workflow-example/optimizations/static/SimplePipelineClustering.h similarity index 86% rename from examples/simple-example/optimizations/static/SimplePipelineClustering.h rename to examples/real-workflow-example/optimizations/static/SimplePipelineClustering.h index aa3637d906..7925a78fce 100644 --- a/examples/simple-example/optimizations/static/SimplePipelineClustering.h +++ b/examples/real-workflow-example/optimizations/static/SimplePipelineClustering.h @@ -7,8 +7,8 @@ * (at your option) any later version. */ -#ifndef WRENCH_SIMPLETASKCLUSTERING_H -#define WRENCH_SIMPLETASKCLUSTERING_H +#ifndef WRENCH_EXAMPLE_SIMPLETASKCLUSTERING_H +#define WRENCH_EXAMPLE_SIMPLETASKCLUSTERING_H #include @@ -35,4 +35,4 @@ namespace wrench { } -#endif //WRENCH_SIMPLETASKCLUSTERING_H +#endif //WRENCH_EXAMPLE_SIMPLETASKCLUSTERING_H diff --git a/examples/simple-example/platform_files/batch_hosts.xml b/examples/real-workflow-example/platform_files/batch_hosts.xml similarity index 100% rename from examples/simple-example/platform_files/batch_hosts.xml rename to examples/real-workflow-example/platform_files/batch_hosts.xml diff --git a/examples/simple-example/platform_files/cloud_hosts.xml b/examples/real-workflow-example/platform_files/cloud_hosts.xml similarity index 100% rename from examples/simple-example/platform_files/cloud_hosts.xml rename to examples/real-workflow-example/platform_files/cloud_hosts.xml diff --git a/examples/simple-example/scheduler/BatchStandardJobScheduler.cpp b/examples/real-workflow-example/scheduler/BatchStandardJobScheduler.cpp similarity index 100% rename from examples/simple-example/scheduler/BatchStandardJobScheduler.cpp rename to examples/real-workflow-example/scheduler/BatchStandardJobScheduler.cpp diff --git a/examples/simple-example/scheduler/BatchStandardJobScheduler.h b/examples/real-workflow-example/scheduler/BatchStandardJobScheduler.h similarity index 87% rename from examples/simple-example/scheduler/BatchStandardJobScheduler.h rename to examples/real-workflow-example/scheduler/BatchStandardJobScheduler.h index d8aa51ec18..5e79466b34 100644 --- a/examples/simple-example/scheduler/BatchStandardJobScheduler.h +++ b/examples/real-workflow-example/scheduler/BatchStandardJobScheduler.h @@ -8,8 +8,8 @@ * */ -#ifndef WRENCH_BATCHSTANDARDJOBSCHEDULER_H -#define WRENCH_BATCHSTANDARDJOBSCHEDULER_H +#ifndef WRENCH_EXAMPLE_BATCHSTANDARDJOBSCHEDULER_H +#define WRENCH_EXAMPLE_BATCHSTANDARDJOBSCHEDULER_H #include @@ -42,4 +42,4 @@ namespace wrench { }; } -#endif //WRENCH_BATCHSTANDARDJOBSCHEDULER_H +#endif //WRENCH_EXAMPLE_BATCHSTANDARDJOBSCHEDULER_H diff --git a/examples/simple-example/scheduler/CloudStandardJobScheduler.cpp b/examples/real-workflow-example/scheduler/CloudStandardJobScheduler.cpp similarity index 99% rename from examples/simple-example/scheduler/CloudStandardJobScheduler.cpp rename to examples/real-workflow-example/scheduler/CloudStandardJobScheduler.cpp index a972e5e8e4..bbdc60e56b 100644 --- a/examples/simple-example/scheduler/CloudStandardJobScheduler.cpp +++ b/examples/real-workflow-example/scheduler/CloudStandardJobScheduler.cpp @@ -1,4 +1,4 @@ -/** +w/** * Copyright (c) 2017-2018. The WRENCH Team. * * This program is free software: you can redistribute it and/or modify diff --git a/examples/simple-example/scheduler/CloudStandardJobScheduler.h b/examples/real-workflow-example/scheduler/CloudStandardJobScheduler.h similarity index 91% rename from examples/simple-example/scheduler/CloudStandardJobScheduler.h rename to examples/real-workflow-example/scheduler/CloudStandardJobScheduler.h index 8938fb2bc8..98bd6739e5 100644 --- a/examples/simple-example/scheduler/CloudStandardJobScheduler.h +++ b/examples/real-workflow-example/scheduler/CloudStandardJobScheduler.h @@ -8,8 +8,8 @@ * */ -#ifndef WRENCH_CLOUDSCHEDULER_H -#define WRENCH_CLOUDSCHEDULER_H +#ifndef WRENCH_EXAMPLE_CLOUDSCHEDULER_H +#define WRENCH_EXAMPLE_CLOUDSCHEDULER_H #include @@ -43,4 +43,4 @@ namespace wrench { }; } -#endif //WRENCH_CLOUDSCHEDULER_H +#endif //WRENCH_EXAMPLE_CLOUDSCHEDULER_H diff --git a/examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp b/examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp similarity index 100% rename from examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp rename to examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.cpp diff --git a/examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h b/examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h similarity index 90% rename from examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h rename to examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h index 0e10dfd694..f51bdb14df 100644 --- a/examples/simple-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h +++ b/examples/real-workflow-example/scheduler/pilot_job/CriticalPathPilotJobScheduler.h @@ -7,8 +7,8 @@ * (at your option) any later version. */ -#ifndef WRENCH_CRITICALPATHSCHEDULER_H -#define WRENCH_CRITICALPATHSCHEDULER_H +#ifndef WRENCH_EXAMPLE_CRITICALPATHSCHEDULER_H +#define WRENCH_EXAMPLE_CRITICALPATHSCHEDULER_H #include #include @@ -53,4 +53,4 @@ namespace wrench { } -#endif //WRENCH_CRITICALPATHSCHEDULER_H +#endif //WRENCH_EXAMPLE_CRITICALPATHSCHEDULER_H diff --git a/examples/simple-example/workflow_files/genome.dax b/examples/real-workflow-example/workflow_files/genome.dax similarity index 100% rename from examples/simple-example/workflow_files/genome.dax rename to examples/real-workflow-example/workflow_files/genome.dax diff --git a/examples/simple-example/workflow_files/genome.json b/examples/real-workflow-example/workflow_files/genome.json similarity index 100% rename from examples/simple-example/workflow_files/genome.json rename to examples/real-workflow-example/workflow_files/genome.json