From 77359949bd832a7edbb61f6fc442fd30e32455d5 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 16:57:35 -0800 Subject: [PATCH 01/13] policies: add grow_allocation Problem: adding support for growing an allocation requires a new match_op. Add match_op_t::MATCH_GROW_ALLOCATION. --- resource/policies/base/match_op.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resource/policies/base/match_op.h b/resource/policies/base/match_op.h index 56520aea3..724de31f1 100644 --- a/resource/policies/base/match_op.h +++ b/resource/policies/base/match_op.h @@ -6,6 +6,7 @@ typedef enum match_op_t { MATCH_ALLOCATE, MATCH_ALLOCATE_W_SATISFIABILITY, MATCH_ALLOCATE_ORELSE_RESERVE, + MATCH_GROW_ALLOCATION, MATCH_SATISFIABILITY } match_op_t; @@ -18,6 +19,8 @@ static const char *match_op_to_string (match_op_t match_op) return "allocate_orelse_reserve"; case MATCH_ALLOCATE_W_SATISFIABILITY: return "allocate_with_satisfiability"; + case MATCH_GROW_ALLOCATION: + return "grow_allocation"; case MATCH_SATISFIABILITY: return "satisfiability"; default: @@ -28,7 +31,8 @@ static const char *match_op_to_string (match_op_t match_op) static bool match_op_valid (match_op_t match_op) { if ((match_op != MATCH_ALLOCATE) && (match_op != MATCH_ALLOCATE_W_SATISFIABILITY) - && (match_op != MATCH_ALLOCATE_ORELSE_RESERVE) && (match_op != MATCH_SATISFIABILITY)) { + && (match_op != MATCH_ALLOCATE_ORELSE_RESERVE) && (match_op != MATCH_SATISFIABILITY) + && (match_op != MATCH_GROW_ALLOCATION)) { return false; } From 78475d701e1246c3f84e9c82f9b51da13d2a875a Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 16:59:02 -0800 Subject: [PATCH 02/13] traversers: support MATCH_GROW_ALLOCATION match op Problem: adding support for growing an allocation requires a new match_op. Add match_op_t::MATCH_GROW_ALLOCATION to the traverser. While the new match operation behaves identically to MATCH_ALLOCATE in the traverser, creating a new operation is clearer in intent. --- resource/traversers/dfu.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/resource/traversers/dfu.cpp b/resource/traversers/dfu.cpp index 974c14908..607314fb2 100644 --- a/resource/traversers/dfu.cpp +++ b/resource/traversers/dfu.cpp @@ -76,7 +76,8 @@ int dfu_traverser_t::request_feasible (detail::jobmeta_t const &meta, // check if there are enough nodes up at all if (target_nodes > get_graph_db ()->metadata.nodes_up) { - if (op == match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE || op == match_op_t::MATCH_ALLOCATE) { + if (op == match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE || op == match_op_t::MATCH_ALLOCATE + || op == match_op_t::MATCH_GROW_ALLOCATION) { errno = EBUSY; return -1; } @@ -99,7 +100,10 @@ int dfu_traverser_t::request_feasible (detail::jobmeta_t const &meta, get_graph_db ()->metadata.graph_duration.graph_end.time_since_epoch ()) .count (); // only the initial time matters for allocate - const int64_t target_time = op == match_op_t::MATCH_ALLOCATE ? meta.at : graph_end - 1; + const int64_t target_time = + (op == match_op_t::MATCH_ALLOCATE || op == match_op_t::MATCH_GROW_ALLOCATION) + ? meta.at + : graph_end - 1; int feasible_nodes = 0; for (auto const &node_vtx : all_nodes) { auto const &node = g[node_vtx]; @@ -118,7 +122,8 @@ int dfu_traverser_t::request_feasible (detail::jobmeta_t const &meta, } if (feasible_nodes < target_nodes) { // no chance, don't even try - if (op == match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE || op == match_op_t::MATCH_ALLOCATE) { + if (op == match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE || op == match_op_t::MATCH_ALLOCATE + || op == match_op_t::MATCH_GROW_ALLOCATION) { errno = EBUSY; return -1; } @@ -217,6 +222,7 @@ int dfu_traverser_t::schedule (Jobspec::Jobspec &jobspec, break; } case match_op_t::MATCH_ALLOCATE: + case match_op_t::MATCH_GROW_ALLOCATION: errno = EBUSY; break; default: From cb5afdb428a49f0280bd41bc21893785403a2f13 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:00:38 -0800 Subject: [PATCH 03/13] modules: add support for grow_allocation Problem: adding support for growing an allocation requires a new match command in the resource module. Add the grow_allocation command to the module and add error handling for existent or nonexistent jobids. --- resource/modules/resource_match.cpp | 43 +++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/resource/modules/resource_match.cpp b/resource/modules/resource_match.cpp index f615a3a84..9423ad78a 100644 --- a/resource/modules/resource_match.cpp +++ b/resource/modules/resource_match.cpp @@ -1790,6 +1790,8 @@ static int run (std::shared_ptr &ctx, rc = tr.run (j, ctx->writers, match_op_t::MATCH_ALLOCATE_W_SATISFIABILITY, jobid, at); else if (std::string ("allocate_orelse_reserve") == cmd) rc = tr.run (j, ctx->writers, match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE, jobid, at); + else if (std::string ("grow_allocation") == cmd) + rc = tr.run (j, ctx->writers, match_op_t::MATCH_GROW_ALLOCATION, jobid, at); else if (std::string ("satisfiability") == cmd) rc = tr.run (j, ctx->writers, match_op_t::MATCH_SATISFIABILITY, jobid, at); else @@ -1877,8 +1879,8 @@ static int run_match (std::shared_ptr &ctx, start = std::chrono::system_clock::now (); if (strcmp ("allocate", cmd) != 0 && strcmp ("allocate_orelse_reserve", cmd) != 0 - && strcmp ("allocate_with_satisfiability", cmd) != 0 - && strcmp ("satisfiability", cmd) != 0) { + && strcmp ("allocate_with_satisfiability", cmd) != 0 && strcmp ("satisfiability", cmd) != 0 + && strcmp ("grow_allocation", cmd) != 0) { rc = -1; errno = EINVAL; flux_log (ctx->h, LOG_ERR, "%s: unknown cmd: %s", __FUNCTION__, cmd); @@ -2114,9 +2116,17 @@ static void match_request_cb (flux_t *h, flux_msg_handler_t *w, const flux_msg_t < 0) goto error; if (is_existent_jobid (ctx, jobid)) { - errno = EINVAL; - flux_log_error (h, "%s: existent job (%jd).", __FUNCTION__, (intmax_t)jobid); - goto error; + if (strcmp ("grow_allocation", cmd) != 0) { + errno = EINVAL; + flux_log_error (h, "%s: existent job (%jd).", __FUNCTION__, (intmax_t)jobid); + goto error; + } + } else { + if (strcmp ("grow_allocation", cmd) == 0) { + errno = EINVAL; + flux_log_error (h, "%s: non-existent job (%jd).", __FUNCTION__, (intmax_t)jobid); + goto error; + } } if (run_match (ctx, jobid, cmd, js_str, &now, &at, &overhead, R, NULL) < 0) { if (errno != EBUSY && errno != ENODEV) @@ -2194,12 +2204,23 @@ static void match_multi_request_cb (flux_t *h, if (json_unpack (value, "{s:I s:s}", "jobid", &jobid, "jobspec", &js_str) < 0) goto error; if (is_existent_jobid (ctx, jobid)) { - errno = EINVAL; - flux_log_error (h, - "%s: existent job (%jd).", - __FUNCTION__, - static_cast (jobid)); - goto error; + if (strcmp ("grow_allocation", cmd) != 0) { + errno = EINVAL; + flux_log_error (h, + "%s: existent job (%jd).", + __FUNCTION__, + static_cast (jobid)); + goto error; + } + } else { + if (strcmp ("grow_allocation", cmd) == 0) { + errno = EINVAL; + flux_log_error (h, + "%s: nonexistent job (%jd).", + __FUNCTION__, + static_cast (jobid)); + goto error; + } } if (run_match (ctx, jobid, cmd, js_str, &now, &at, &overhead, R, NULL) < 0) { if (errno != EBUSY && errno != ENODEV) From 17be7f0bc5d9772e4d06d1cf7985942fdda95957 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:02:02 -0800 Subject: [PATCH 04/13] C++ REAPI: add CLI support for grow_allocation Problem: adding support for growing an allocation requires a new match operation in the REAPI CLI. Add the MATCH_GROW_ALLOCATION operation to the CLI and add error handling for nonexistent jobids. --- resource/reapi/bindings/c++/reapi.hpp | 4 ++++ resource/reapi/bindings/c++/reapi_cli_impl.hpp | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/resource/reapi/bindings/c++/reapi.hpp b/resource/reapi/bindings/c++/reapi.hpp index cf5eec3e9..f5f572550 100644 --- a/resource/reapi/bindings/c++/reapi.hpp +++ b/resource/reapi/bindings/c++/reapi.hpp @@ -111,6 +111,8 @@ class reapi_t { * allocate. * MATCH_ALLOCATE_W_SATISFIABILITY: try to allocate and run * satisfiability check if resources are not available. + * MATCH_GROW_ALLOCATION: try to grow an existing allocation + * now and fail if resources aren't available. * \param jobspec jobspec string. * \param jobid jobid of the uint64_t type. * \param reserved Boolean into which to return true if this job has been @@ -150,6 +152,8 @@ class reapi_t { * aren't available. * MATCH_ALLOCATE_ORELSE_RESERVE : Try to allocate and reseve * if resources aren't available now. + * MATCH_GROW_ALLOCATION: try to grow an existing allocation + * now and fail if resources aren't available. * MATCH_SATISFIABILITY: Do a satisfiablity check and do not * allocate. * MATCH_ALLOCATE_W_SATISFIABILITY: try to allocate and run diff --git a/resource/reapi/bindings/c++/reapi_cli_impl.hpp b/resource/reapi/bindings/c++/reapi_cli_impl.hpp index 197929194..3c2130699 100644 --- a/resource/reapi/bindings/c++/reapi_cli_impl.hpp +++ b/resource/reapi/bindings/c++/reapi_cli_impl.hpp @@ -74,6 +74,14 @@ int reapi_cli_t::match_allocate (void *h, rc = -1; goto out; } + if (match_op == match_op_t::MATCH_GROW_ALLOCATION) { + if (!rq->job_exists (jobid)) { + m_err_msg += __FUNCTION__; + m_err_msg += ": ERROR: Nonexistent jobid: " + std::to_string (jobid) + "\n"; + rc = -1; + goto out; + } + } try { Flux::Jobspec::Jobspec job{jobspec}; From 15c11deafd8a69cb5dfa7c869b788899fa42a07a Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:03:17 -0800 Subject: [PATCH 05/13] C REAPI: add CLI support for grow_allocation Problem: adding support for growing an allocation requires a new match operation in the C REAPI CLI. Add the MATCH_GROW_ALLOCATION operation to the C CLI and add error handling for nonexistent jobids. --- resource/reapi/bindings/c/reapi_cli.cpp | 4 +++- resource/reapi/bindings/c/reapi_cli.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resource/reapi/bindings/c/reapi_cli.cpp b/resource/reapi/bindings/c/reapi_cli.cpp index 6bec44ca9..1dd47d85d 100644 --- a/resource/reapi/bindings/c/reapi_cli.cpp +++ b/resource/reapi/bindings/c/reapi_cli.cpp @@ -103,7 +103,9 @@ extern "C" int reapi_cli_match (reapi_cli_ctx_t *ctx, goto out; } - *jobid = ctx->rqt->get_job_counter (); + if (match_op != match_op_t::MATCH_GROW_ALLOCATION) { + *jobid = ctx->rqt->get_job_counter (); + } if ((rc = reapi_cli_t:: match_allocate (ctx->rqt, match_op, jobspec, *jobid, *reserved, R_buf, *at, *ov)) < 0) { diff --git a/resource/reapi/bindings/c/reapi_cli.h b/resource/reapi/bindings/c/reapi_cli.h index eeca639dd..2ec4d4f08 100644 --- a/resource/reapi/bindings/c/reapi_cli.h +++ b/resource/reapi/bindings/c/reapi_cli.h @@ -56,6 +56,8 @@ int reapi_cli_initialize (reapi_cli_ctx_t *ctx, const char *rgraph, const char * * allocate. * MATCH_ALLOCATE_W_SATISFIABILITY: try to allocate and run * satisfiability check if resources are not available. + * MATCH_GROW_ALLOCATION: try to grow an existing allocation + * now and fail if resources aren't available. * \param jobspec jobspec string. * \param jobid jobid of the uint64_t type. * \param reserved Boolean into which to return true if this job has been From eae7ad14e9ed5f5f442aea047abdea7501e76242 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:04:12 -0800 Subject: [PATCH 06/13] C REAPI: add module support for grow_allocation Problem: the new MATCH_GROW_ALLOCATION isn't documented in the C REAPI module. Add an entry for MATCH_GROW_ALLOCATION. --- resource/reapi/bindings/c/reapi_module.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resource/reapi/bindings/c/reapi_module.h b/resource/reapi/bindings/c/reapi_module.h index 84fa2f0bc..5b1a6d117 100644 --- a/resource/reapi/bindings/c/reapi_module.h +++ b/resource/reapi/bindings/c/reapi_module.h @@ -48,6 +48,8 @@ void reapi_module_destroy (reapi_module_ctx_t *ctx); * allocate. * MATCH_ALLOCATE_W_SATISFIABILITY: try to allocate and run * satisfiability check if resources are not available. + * MATCH_GROW_ALLOCATION: try to grow an existing allocation + * now and fail if resources aren't available. * \param jobspec jobspec string. * \param jobid jobid of the uint64_t type. * \param reserved Boolean into which to return true if this job has been From 42d33de63711f22a86fbb2b86da71a4f9fc1d54c Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:05:44 -0800 Subject: [PATCH 07/13] resource-query: add support for grow_allocation Problem: adding support for growing an allocation requires handing the grow_allocation command in resource-query. Add the grow_allocation command to resource-query and add error handling for nonexistent jobids. --- resource/utilities/command.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/resource/utilities/command.cpp b/resource/utilities/command.cpp index 8d205e0f6..61a15a701 100644 --- a/resource/utilities/command.cpp +++ b/resource/utilities/command.cpp @@ -37,14 +37,14 @@ command_t commands[] = cmd_match, "Allocate or reserve matching resources (subcmd: " "allocate | allocate_with_satisfiability | allocate_orelse_reserve) | " - "satisfiability: " + "satisfiability | grow_allocation: " "resource-query> match allocate jobspec"}, {"multi-match", "M", cmd_match_multi, "Allocate or reserve for " "multiple jobspecs (subcmd: allocate | allocate_with_satisfiability | " - "allocate_orelse_reserve): " + "allocate_orelse_reserve | grow_allocation): " "resource-query> multi-match allocate jobspec1 jobspec2 ..."}, {"update", "u", @@ -284,6 +284,12 @@ static int run_match (std::shared_ptr &ctx, match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE, (int64_t)jobid, &at); + else if (cmd == "grow_allocation") + rc2 = ctx->traverser->run (job, + ctx->writers, + match_op_t::MATCH_GROW_ALLOCATION, + (int64_t)jobid, + &at); else if (cmd == "satisfiability") rc2 = ctx->traverser->run (job, ctx->writers, @@ -336,19 +342,29 @@ static int run_match (std::shared_ptr &ctx, int cmd_match (std::shared_ptr &ctx, std::vector &args) { - if (args.size () != 3) { + if (args.size () < 3 || args.size () > 4) { std::cerr << "ERROR: malformed command" << std::endl; return 0; } std::string subcmd = args[1]; if (!(subcmd == "allocate" || subcmd == "allocate_orelse_reserve" - || subcmd == "allocate_with_satisfiability" || subcmd == "satisfiability")) { + || subcmd == "allocate_with_satisfiability" || subcmd == "satisfiability" + || subcmd == "grow_allocation")) { std::cerr << "ERROR: unknown subcmd " << args[1] << std::endl; return 0; } + int64_t jobid = 0; try { - int64_t jobid = ctx->jobid_counter; + if (subcmd != "grow_allocation") { + jobid = ctx->jobid_counter; + } else { + jobid = static_cast (std::strtoll (args[3].c_str (), NULL, 10)); + if (!ctx->jobs.contains (jobid)) { + std::cerr << "ERROR: nonexistent jobid " << jobid << std::endl; + return 0; + } + } std::string &jobspec_fn = args[2]; std::ifstream jobspec_in (jobspec_fn); if (!jobspec_in) { From 213598b34da68d36e33d6f2bd20ff5d5de09a481 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:06:08 -0800 Subject: [PATCH 08/13] rq2: add support for grow_allocation Problem: adding support for growing an allocation requires handing the grow_allocation command in rq2. Add the grow_allocation command to rq2 and add error handling for nonexistent jobids. --- resource/utilities/rq2.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/resource/utilities/rq2.cpp b/resource/utilities/rq2.cpp index 862c3cb9c..31ee038b0 100644 --- a/resource/utilities/rq2.cpp +++ b/resource/utilities/rq2.cpp @@ -56,7 +56,7 @@ command_t commands[] = {{"match", match, "Allocate or reserve matching resources (subcmd: " "allocate | allocate_with_satisfiability | allocate_orelse_reserve) | " - "satisfiability: " + "satisfiability | grow_allocation: " "resource-query> match allocate jobspec"}, {"info", "i", info, "Print info on a jobid: resource-query> info jobid"}, {"cancel", @@ -358,13 +358,14 @@ int match (resource_query_t &ctx, std::vector &args, json_t *params double ov = 0.0; std::stringstream o; struct timeval st, et; + uint64_t jobid = 0; if ((gettimeofday (&st, NULL)) < 0) { std::cerr << "ERROR: gettimeofday: " << strerror (errno) << std::endl; return 0; } - if (args.size () != 3) { + if (args.size () < 3 || args.size () > 4) { std::cerr << "ERROR: malformed command" << std::endl; return 0; } @@ -373,6 +374,8 @@ int match (resource_query_t &ctx, std::vector &args, json_t *params match_op = match_op_t::MATCH_ALLOCATE; } else if (subcmd == "allocate_orelse_reserve") { match_op = match_op_t::MATCH_ALLOCATE_ORELSE_RESERVE; + } else if (subcmd == "grow_allocation") { + match_op = match_op_t::MATCH_GROW_ALLOCATION; } else if (subcmd == "allocate_with_satisfiability") { match_op = match_op_t::MATCH_ALLOCATE_W_SATISFIABILITY; } else if (subcmd == "satisfiability") { @@ -382,7 +385,11 @@ int match (resource_query_t &ctx, std::vector &args, json_t *params return 0; } - uint64_t jobid = ctx.get_job_counter (); + if (subcmd != "grow_allocation") { + jobid = ctx.get_job_counter (); + } else { + jobid = static_cast (std::strtoull (args[3].c_str (), NULL, 10)); + } std::string &jobspec_fn = args[2]; std::ifstream jobspec_in (jobspec_fn); if (!jobspec_in) { From 02cd27e8a49cf1d650d409a18cca67abb105a5ca Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 13 Feb 2025 17:07:36 -0800 Subject: [PATCH 09/13] testsuite: add tests for grow_allocation Problem: growing an allocation is untested in the sharness testsuite. Add tests to the existing grow sharness test. --- t/data/resource/commands/elastic/cmds10.in | 6 +++ t/data/resource/commands/elastic/cmds11.in | 11 ++++++ t/data/resource/expected/elastic/010.R.out | 24 ++++++++++++ t/data/resource/expected/elastic/011.R.out | 44 ++++++++++++++++++++++ t/t3028-resource-grow.t | 18 +++++++++ 5 files changed, 103 insertions(+) create mode 100644 t/data/resource/commands/elastic/cmds10.in create mode 100644 t/data/resource/commands/elastic/cmds11.in create mode 100644 t/data/resource/expected/elastic/010.R.out create mode 100644 t/data/resource/expected/elastic/011.R.out diff --git a/t/data/resource/commands/elastic/cmds10.in b/t/data/resource/commands/elastic/cmds10.in new file mode 100644 index 000000000..86d0482ee --- /dev/null +++ b/t/data/resource/commands/elastic/cmds10.in @@ -0,0 +1,6 @@ +match allocate @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml +find sched-now=allocated +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +find sched-now=allocated +quit diff --git a/t/data/resource/commands/elastic/cmds11.in b/t/data/resource/commands/elastic/cmds11.in new file mode 100644 index 000000000..a2d8a6f8f --- /dev/null +++ b/t/data/resource/commands/elastic/cmds11.in @@ -0,0 +1,11 @@ +match allocate @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml +find sched-now=allocated +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +find sched-now=allocated +attach @TEST_SRCDIR@/data/resource/jgfs/elastic/node-add-test.json +find status=up +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +match grow_allocation @TEST_SRCDIR@/data/resource/jobspecs/basics/test006.yaml 1 +find sched-now=allocated +quit diff --git a/t/data/resource/expected/elastic/010.R.out b/t/data/resource/expected/elastic/010.R.out new file mode 100644 index 000000000..1315c651a --- /dev/null +++ b/t/data/resource/expected/elastic/010.R.out @@ -0,0 +1,24 @@ +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="sched-now=allocated" +INFO: ============================= +{"graph": {"nodes": [{"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +INFO: ============================= +INFO: No matching resources found +INFO: JOBID=1 +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="sched-now=allocated" +INFO: ============================= diff --git a/t/data/resource/expected/elastic/011.R.out b/t/data/resource/expected/elastic/011.R.out new file mode 100644 index 000000000..bcbbe0c6c --- /dev/null +++ b/t/data/resource/expected/elastic/011.R.out @@ -0,0 +1,44 @@ +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="sched-now=allocated" +INFO: ============================= +{"graph": {"nodes": [{"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="sched-now=allocated" +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "329", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core0"}}}, {"id": "330", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core1"}}}, {"id": "331", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core2"}}}, {"id": "332", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core3"}}}, {"id": "333", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core4"}}}, {"id": "334", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core5"}}}, {"id": "335", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core6"}}}, {"id": "336", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core7"}}}, {"id": "337", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core8"}}}, {"id": "338", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core9"}}}, {"id": "339", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core10"}}}, {"id": "340", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core11"}}}, {"id": "341", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core12"}}}, {"id": "342", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core13"}}}, {"id": "343", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core14"}}}, {"id": "344", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core15"}}}, {"id": "345", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core16"}}}, {"id": "346", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core17"}}}, {"id": "83", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0"}}}, {"id": "347", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core18"}}}, {"id": "348", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core19"}}}, {"id": "349", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core20"}}}, {"id": "350", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core21"}}}, {"id": "351", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core22"}}}, {"id": "352", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core23"}}}, {"id": "353", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core24"}}}, {"id": "354", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core25"}}}, {"id": "355", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core26"}}}, {"id": "356", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core27"}}}, {"id": "357", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core28"}}}, {"id": "358", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core29"}}}, {"id": "359", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core30"}}}, {"id": "360", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core31"}}}, {"id": "361", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core32"}}}, {"id": "362", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core33"}}}, {"id": "363", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core34"}}}, {"id": "364", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core35"}}}, {"id": "84", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1"}}}, {"id": "8", "metadata": {"type": "node", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "83", "target": "329"}, {"source": "83", "target": "330"}, {"source": "83", "target": "331"}, {"source": "83", "target": "332"}, {"source": "83", "target": "333"}, {"source": "83", "target": "334"}, {"source": "83", "target": "335"}, {"source": "83", "target": "336"}, {"source": "83", "target": "337"}, {"source": "83", "target": "338"}, {"source": "83", "target": "339"}, {"source": "83", "target": "340"}, {"source": "83", "target": "341"}, {"source": "83", "target": "342"}, {"source": "83", "target": "343"}, {"source": "83", "target": "344"}, {"source": "83", "target": "345"}, {"source": "83", "target": "346"}, {"source": "8", "target": "83"}, {"source": "84", "target": "347"}, {"source": "84", "target": "348"}, {"source": "84", "target": "349"}, {"source": "84", "target": "350"}, {"source": "84", "target": "351"}, {"source": "84", "target": "352"}, {"source": "84", "target": "353"}, {"source": "84", "target": "354"}, {"source": "84", "target": "355"}, {"source": "84", "target": "356"}, {"source": "84", "target": "357"}, {"source": "84", "target": "358"}, {"source": "84", "target": "359"}, {"source": "84", "target": "360"}, {"source": "84", "target": "361"}, {"source": "84", "target": "362"}, {"source": "84", "target": "363"}, {"source": "84", "target": "364"}, {"source": "8", "target": "84"}, {"source": "1", "target": "8"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="status=up" +INFO: ============================= +{"graph": {"nodes": [{"id": "329", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core0"}}}, {"id": "330", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core1"}}}, {"id": "331", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core2"}}}, {"id": "332", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core3"}}}, {"id": "333", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core4"}}}, {"id": "334", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core5"}}}, {"id": "335", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core6"}}}, {"id": "336", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core7"}}}, {"id": "337", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core8"}}}, {"id": "338", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core9"}}}, {"id": "339", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core10"}}}, {"id": "340", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core11"}}}, {"id": "341", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core12"}}}, {"id": "342", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core13"}}}, {"id": "343", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core14"}}}, {"id": "344", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core15"}}}, {"id": "345", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core16"}}}, {"id": "346", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core17"}}}, {"id": "83", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0"}}}, {"id": "8", "metadata": {"type": "node", "id": 3, "rank": -1, "paths": {"containment": "/medium0/rack0/node3"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "83", "target": "329"}, {"source": "83", "target": "330"}, {"source": "83", "target": "331"}, {"source": "83", "target": "332"}, {"source": "83", "target": "333"}, {"source": "83", "target": "334"}, {"source": "83", "target": "335"}, {"source": "83", "target": "336"}, {"source": "83", "target": "337"}, {"source": "83", "target": "338"}, {"source": "83", "target": "339"}, {"source": "83", "target": "340"}, {"source": "83", "target": "341"}, {"source": "83", "target": "342"}, {"source": "83", "target": "343"}, {"source": "83", "target": "344"}, {"source": "83", "target": "345"}, {"source": "83", "target": "346"}, {"source": "8", "target": "83"}, {"source": "1", "target": "8"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +{"graph": {"nodes": [{"id": "347", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core18"}}}, {"id": "348", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core19"}}}, {"id": "349", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core20"}}}, {"id": "350", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core21"}}}, {"id": "351", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core22"}}}, {"id": "352", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core23"}}}, {"id": "353", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core24"}}}, {"id": "354", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core25"}}}, {"id": "355", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core26"}}}, {"id": "356", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core27"}}}, {"id": "357", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core28"}}}, {"id": "358", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core29"}}}, {"id": "359", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core30"}}}, {"id": "360", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core31"}}}, {"id": "361", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core32"}}}, {"id": "362", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core33"}}}, {"id": "363", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core34"}}}, {"id": "364", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core35"}}}, {"id": "84", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1"}}}, {"id": "8", "metadata": {"type": "node", "id": 3, "rank": -1, "paths": {"containment": "/medium0/rack0/node3"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "84", "target": "347"}, {"source": "84", "target": "348"}, {"source": "84", "target": "349"}, {"source": "84", "target": "350"}, {"source": "84", "target": "351"}, {"source": "84", "target": "352"}, {"source": "84", "target": "353"}, {"source": "84", "target": "354"}, {"source": "84", "target": "355"}, {"source": "84", "target": "356"}, {"source": "84", "target": "357"}, {"source": "84", "target": "358"}, {"source": "84", "target": "359"}, {"source": "84", "target": "360"}, {"source": "84", "target": "361"}, {"source": "84", "target": "362"}, {"source": "84", "target": "363"}, {"source": "84", "target": "364"}, {"source": "8", "target": "84"}, {"source": "1", "target": "8"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: JOBID=1 +INFO: RESOURCES=ALLOCATED +INFO: SCHEDULED AT=Now +INFO: ============================= +INFO: ============================= +INFO: No matching resources found +INFO: JOBID=1 +INFO: ============================= +{"graph": {"nodes": [{"id": "221", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core0"}}}, {"id": "222", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core1"}}}, {"id": "223", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core2"}}}, {"id": "224", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core3"}}}, {"id": "225", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core4"}}}, {"id": "226", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core5"}}}, {"id": "227", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core6"}}}, {"id": "228", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core7"}}}, {"id": "229", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core8"}}}, {"id": "230", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core9"}}}, {"id": "231", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core10"}}}, {"id": "232", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core11"}}}, {"id": "233", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core12"}}}, {"id": "234", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core13"}}}, {"id": "235", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core14"}}}, {"id": "236", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core15"}}}, {"id": "237", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core16"}}}, {"id": "238", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0/core17"}}}, {"id": "77", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket0"}}}, {"id": "239", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core18"}}}, {"id": "240", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core19"}}}, {"id": "241", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core20"}}}, {"id": "242", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core21"}}}, {"id": "243", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core22"}}}, {"id": "244", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core23"}}}, {"id": "245", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core24"}}}, {"id": "246", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core25"}}}, {"id": "247", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core26"}}}, {"id": "248", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core27"}}}, {"id": "249", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core28"}}}, {"id": "250", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core29"}}}, {"id": "251", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core30"}}}, {"id": "252", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core31"}}}, {"id": "253", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core32"}}}, {"id": "254", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core33"}}}, {"id": "255", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core34"}}}, {"id": "256", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1/core35"}}}, {"id": "78", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0/socket1"}}}, {"id": "5", "metadata": {"type": "node", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node0"}}}, {"id": "329", "metadata": {"type": "core", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core0"}}}, {"id": "330", "metadata": {"type": "core", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core1"}}}, {"id": "331", "metadata": {"type": "core", "id": 2, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core2"}}}, {"id": "332", "metadata": {"type": "core", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core3"}}}, {"id": "333", "metadata": {"type": "core", "id": 4, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core4"}}}, {"id": "334", "metadata": {"type": "core", "id": 5, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core5"}}}, {"id": "335", "metadata": {"type": "core", "id": 6, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core6"}}}, {"id": "336", "metadata": {"type": "core", "id": 7, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core7"}}}, {"id": "337", "metadata": {"type": "core", "id": 8, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core8"}}}, {"id": "338", "metadata": {"type": "core", "id": 9, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core9"}}}, {"id": "339", "metadata": {"type": "core", "id": 10, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core10"}}}, {"id": "340", "metadata": {"type": "core", "id": 11, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core11"}}}, {"id": "341", "metadata": {"type": "core", "id": 12, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core12"}}}, {"id": "342", "metadata": {"type": "core", "id": 13, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core13"}}}, {"id": "343", "metadata": {"type": "core", "id": 14, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core14"}}}, {"id": "344", "metadata": {"type": "core", "id": 15, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core15"}}}, {"id": "345", "metadata": {"type": "core", "id": 16, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core16"}}}, {"id": "346", "metadata": {"type": "core", "id": 17, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0/core17"}}}, {"id": "83", "metadata": {"type": "socket", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket0"}}}, {"id": "347", "metadata": {"type": "core", "id": 18, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core18"}}}, {"id": "348", "metadata": {"type": "core", "id": 19, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core19"}}}, {"id": "349", "metadata": {"type": "core", "id": 20, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core20"}}}, {"id": "350", "metadata": {"type": "core", "id": 21, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core21"}}}, {"id": "351", "metadata": {"type": "core", "id": 22, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core22"}}}, {"id": "352", "metadata": {"type": "core", "id": 23, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core23"}}}, {"id": "353", "metadata": {"type": "core", "id": 24, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core24"}}}, {"id": "354", "metadata": {"type": "core", "id": 25, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core25"}}}, {"id": "355", "metadata": {"type": "core", "id": 26, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core26"}}}, {"id": "356", "metadata": {"type": "core", "id": 27, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core27"}}}, {"id": "357", "metadata": {"type": "core", "id": 28, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core28"}}}, {"id": "358", "metadata": {"type": "core", "id": 29, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core29"}}}, {"id": "359", "metadata": {"type": "core", "id": 30, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core30"}}}, {"id": "360", "metadata": {"type": "core", "id": 31, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core31"}}}, {"id": "361", "metadata": {"type": "core", "id": 32, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core32"}}}, {"id": "362", "metadata": {"type": "core", "id": 33, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core33"}}}, {"id": "363", "metadata": {"type": "core", "id": 34, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core34"}}}, {"id": "364", "metadata": {"type": "core", "id": 35, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1/core35"}}}, {"id": "84", "metadata": {"type": "socket", "id": 1, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3/socket1"}}}, {"id": "8", "metadata": {"type": "node", "id": 3, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0/node3"}}}, {"id": "1", "metadata": {"type": "rack", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0/rack0"}}}, {"id": "0", "metadata": {"type": "cluster", "basename": "medium", "id": 0, "rank": -1, "exclusive": true, "paths": {"containment": "/medium0"}}}], "edges": [{"source": "77", "target": "221"}, {"source": "77", "target": "222"}, {"source": "77", "target": "223"}, {"source": "77", "target": "224"}, {"source": "77", "target": "225"}, {"source": "77", "target": "226"}, {"source": "77", "target": "227"}, {"source": "77", "target": "228"}, {"source": "77", "target": "229"}, {"source": "77", "target": "230"}, {"source": "77", "target": "231"}, {"source": "77", "target": "232"}, {"source": "77", "target": "233"}, {"source": "77", "target": "234"}, {"source": "77", "target": "235"}, {"source": "77", "target": "236"}, {"source": "77", "target": "237"}, {"source": "77", "target": "238"}, {"source": "5", "target": "77"}, {"source": "78", "target": "239"}, {"source": "78", "target": "240"}, {"source": "78", "target": "241"}, {"source": "78", "target": "242"}, {"source": "78", "target": "243"}, {"source": "78", "target": "244"}, {"source": "78", "target": "245"}, {"source": "78", "target": "246"}, {"source": "78", "target": "247"}, {"source": "78", "target": "248"}, {"source": "78", "target": "249"}, {"source": "78", "target": "250"}, {"source": "78", "target": "251"}, {"source": "78", "target": "252"}, {"source": "78", "target": "253"}, {"source": "78", "target": "254"}, {"source": "78", "target": "255"}, {"source": "78", "target": "256"}, {"source": "5", "target": "78"}, {"source": "1", "target": "5"}, {"source": "83", "target": "329"}, {"source": "83", "target": "330"}, {"source": "83", "target": "331"}, {"source": "83", "target": "332"}, {"source": "83", "target": "333"}, {"source": "83", "target": "334"}, {"source": "83", "target": "335"}, {"source": "83", "target": "336"}, {"source": "83", "target": "337"}, {"source": "83", "target": "338"}, {"source": "83", "target": "339"}, {"source": "83", "target": "340"}, {"source": "83", "target": "341"}, {"source": "83", "target": "342"}, {"source": "83", "target": "343"}, {"source": "83", "target": "344"}, {"source": "83", "target": "345"}, {"source": "83", "target": "346"}, {"source": "8", "target": "83"}, {"source": "84", "target": "347"}, {"source": "84", "target": "348"}, {"source": "84", "target": "349"}, {"source": "84", "target": "350"}, {"source": "84", "target": "351"}, {"source": "84", "target": "352"}, {"source": "84", "target": "353"}, {"source": "84", "target": "354"}, {"source": "84", "target": "355"}, {"source": "84", "target": "356"}, {"source": "84", "target": "357"}, {"source": "84", "target": "358"}, {"source": "84", "target": "359"}, {"source": "84", "target": "360"}, {"source": "84", "target": "361"}, {"source": "84", "target": "362"}, {"source": "84", "target": "363"}, {"source": "84", "target": "364"}, {"source": "8", "target": "84"}, {"source": "1", "target": "8"}, {"source": "0", "target": "1"}]}} +INFO: ============================= +INFO: EXPRESSION="sched-now=allocated" +INFO: ============================= diff --git a/t/t3028-resource-grow.t b/t/t3028-resource-grow.t index 2430328b9..32f959f02 100755 --- a/t/t3028-resource-grow.t +++ b/t/t3028-resource-grow.t @@ -95,4 +95,22 @@ test_expect_success "${test009_desc}" ' test_cmp 009.R.out ${exp_dir}/009.R.out ' +cmds010="${cmd_dir}/cmds10.in" +test010_desc="grow existing job to occupy all resources; can't occupy more than exist" +test_expect_success "${test010_desc}" ' + sed "s~@TEST_SRCDIR@~${SHARNESS_TEST_SRCDIR}~g" ${cmds010} > cmds010 && + ${query} -L ${jgf} -F jgf -f jgf -S CA -P low -t 010.R.out \ + < cmds010 && + test_cmp 010.R.out ${exp_dir}/010.R.out +' + +cmds011="${cmd_dir}/cmds11.in" +test011_desc="grow existing job four times, grow graph and grow allocation onto new resources; can't occupy more than exist" +test_expect_success "${test010_desc}" ' + sed "s~@TEST_SRCDIR@~${SHARNESS_TEST_SRCDIR}~g" ${cmds011} > cmds011 && + ${query} -L ${jgf} -F jgf -f jgf -S CA -P low -t 011.R.out \ + < cmds011 && + test_cmp 011.R.out ${exp_dir}/011.R.out +' + test_done From 8d6a7724b09cad75a4b2297f5ec79d259a5e1cb1 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Wed, 16 Jul 2025 23:45:20 -0700 Subject: [PATCH 10/13] reapi: add allocation grow unit tests Problem: growing an allocation does not have any unit testing. Add unit tests of initialization and allocation growth via Catch2. --- resource/reapi/CMakeLists.txt | 4 +- resource/reapi/test/CMakeLists.txt | 11 ++++ resource/reapi/test/reapi_cli_test_c.cpp | 71 +++++++++++++++++++++ resource/reapi/test/reapi_cli_test_cxx.cpp | 74 ++++++++++++++++++++++ 4 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 resource/reapi/test/CMakeLists.txt create mode 100644 resource/reapi/test/reapi_cli_test_c.cpp create mode 100644 resource/reapi/test/reapi_cli_test_cxx.cpp diff --git a/resource/reapi/CMakeLists.txt b/resource/reapi/CMakeLists.txt index 118ab605b..765cd0aee 100644 --- a/resource/reapi/CMakeLists.txt +++ b/resource/reapi/CMakeLists.txt @@ -1,2 +1,2 @@ - -add_subdirectory( bindings ) \ No newline at end of file +add_subdirectory( bindings ) +add_subdirectory( test ) diff --git a/resource/reapi/test/CMakeLists.txt b/resource/reapi/test/CMakeLists.txt new file mode 100644 index 000000000..0be9bcdf9 --- /dev/null +++ b/resource/reapi/test/CMakeLists.txt @@ -0,0 +1,11 @@ +add_executable(reapi_cli_cxx_test reapi_cli_test_cxx.cpp) +add_sanitizers(reapi_cli_cxx_test) +target_link_libraries(reapi_cli_cxx_test PRIVATE reapi_cli intern Catch2::Catch2WithMain) +flux_add_test(NAME reapi_cli_cxx_test COMMAND reapi_cli_cxx_test) +set_property(TEST reapi_cli_cxx_test APPEND PROPERTY ENVIRONMENT "TESTRESRC_INPUT_FILE=$(CMAKE_SOURCE_DIR)/conf/hype.lua") + +add_executable(reapi_cli_c_test reapi_cli_test_c.cpp) +add_sanitizers(reapi_cli_c_test) +target_link_libraries(reapi_cli_c_test PRIVATE reapi_cli intern Catch2::Catch2WithMain) +flux_add_test(NAME reapi_cli_c_test COMMAND reapi_cli_c_test) +set_property(TEST reapi_cli_c_test APPEND PROPERTY ENVIRONMENT "TESTRESRC_INPUT_FILE=$(CMAKE_SOURCE_DIR)/conf/hype.lua") diff --git a/resource/reapi/test/reapi_cli_test_c.cpp b/resource/reapi/test/reapi_cli_test_c.cpp new file mode 100644 index 000000000..88cf1beec --- /dev/null +++ b/resource/reapi/test/reapi_cli_test_c.cpp @@ -0,0 +1,71 @@ +#define CATCH_CONFIG_MAIN + +#include +#include +#include +#include + +namespace Flux::resource_model::detail { + +TEST_CASE( "Initialize REAPI CLI", "[initialize C]" ) { + const std::string options = "{}"; + std::stringstream buffer; + std::ifstream inputFile ("../../../t/data/resource/jgfs/tiny.json"); + + if (!inputFile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + buffer << inputFile.rdbuf (); + std::string rgraph = buffer.str (); + + reapi_cli_ctx_t *ctx = nullptr; + ctx = reapi_cli_new (); + REQUIRE (ctx); +} + +TEST_CASE( "Match basic jobspec", "[match C]" ) { + int rc = -1; + const std::string options = "{}"; + std::stringstream gbuffer, jbuffer; + std::ifstream graphfile ("../../../t/data/resource/jgfs/tiny.json"); + std::ifstream jobspecfile ("../../../t/data/resource/jobspecs/basics/test006.yaml"); + + if (!graphfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + jbuffer << jobspecfile.rdbuf (); + std::string jobspec = jbuffer.str (); + + if (!jobspecfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + gbuffer << graphfile.rdbuf (); + std::string rgraph = gbuffer.str (); + + reapi_cli_ctx_t *ctx = nullptr; + ctx = reapi_cli_new (); + REQUIRE (ctx); + + rc = reapi_cli_initialize (ctx, rgraph.c_str (), options.c_str ()); + REQUIRE (rc == 0); + + match_op_t match_op = match_op_t::MATCH_ALLOCATE; + bool reserved = false; + char *R; + uint64_t jobid = 1; + double ov = 0.0; + int64_t at = 0; + + rc = reapi_cli_match (ctx, match_op, jobspec.c_str (), &jobid, &reserved, &R, &at, &ov); + REQUIRE (rc == 0); + REQUIRE (reserved == false); + REQUIRE (at == 0); +} + +} + + + diff --git a/resource/reapi/test/reapi_cli_test_cxx.cpp b/resource/reapi/test/reapi_cli_test_cxx.cpp new file mode 100644 index 000000000..61a7b3c04 --- /dev/null +++ b/resource/reapi/test/reapi_cli_test_cxx.cpp @@ -0,0 +1,74 @@ +#define CATCH_CONFIG_MAIN + +#include +#include +#include + +namespace Flux::resource_model::detail { + +TEST_CASE( "Initialize REAPI CLI", "[initialize C++]" ) { + const std::string options = "{}"; + std::stringstream buffer; + std::ifstream inputFile ("../../../t/data/resource/jgfs/tiny.json"); + + if (!inputFile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + buffer << inputFile.rdbuf (); + std::string rgraph = buffer.str (); + + std::shared_ptr ctx = nullptr; + ctx = std::make_shared (rgraph, options); + REQUIRE (ctx); +} + +TEST_CASE( "Match basic jobspec", "[match grow C++]" ) { + int rc = -1; + const std::string options = "{}"; + std::stringstream gbuffer, jbuffer; + std::ifstream graphfile ("../../../t/data/resource/jgfs/tiny.json"); + std::ifstream jobspecfile ("../../../t/data/resource/jobspecs/basics/test006.yaml"); + + if (!graphfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + jbuffer << jobspecfile.rdbuf (); + std::string jobspec = jbuffer.str (); + + if (!jobspecfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + gbuffer << graphfile.rdbuf (); + std::string rgraph = gbuffer.str (); + + std::shared_ptr ctx = nullptr; + ctx = std::make_shared (rgraph, options); + REQUIRE (ctx); + + match_op_t match_op = match_op_t::MATCH_ALLOCATE; + bool reserved = false; + std::string R = ""; + uint64_t jobid = 1; + double ov = 0.0; + int64_t at = 0; + + rc = detail::reapi_cli_t::match_allocate (ctx.get (), match_op, jobspec, jobid, reserved, R, at, ov); + REQUIRE (rc == 0); + REQUIRE (reserved == false); + REQUIRE (at == 0); + + R = ""; + match_op = match_op_t::MATCH_GROW_ALLOCATION; + rc = detail::reapi_cli_t::match_allocate (ctx.get (), match_op, jobspec, jobid, reserved, R, at, ov); + REQUIRE (rc == 0); + REQUIRE (reserved == false); + REQUIRE (at == 0); +} + +} + + + From 8896ed13269bb2cca0de7ed915bcd6f2eef9e002 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Sun, 20 Jul 2025 23:44:01 -0700 Subject: [PATCH 11/13] reapi unit test: add shrink Problem: shrinking an allocation does not have any unit testing. Add unit tests of initialization and allocation shrink via Catch2. --- resource/reapi/test/reapi_cli_test_c.cpp | 63 ++++++++++++++-- resource/reapi/test/reapi_cli_test_cxx.cpp | 83 ++++++++++++++++++++-- 2 files changed, 135 insertions(+), 11 deletions(-) diff --git a/resource/reapi/test/reapi_cli_test_c.cpp b/resource/reapi/test/reapi_cli_test_c.cpp index 88cf1beec..de227546f 100644 --- a/resource/reapi/test/reapi_cli_test_c.cpp +++ b/resource/reapi/test/reapi_cli_test_c.cpp @@ -1,4 +1,4 @@ -#define CATCH_CONFIG_MAIN +#define CATCH_CONFIG_MAIN #include #include @@ -7,7 +7,8 @@ namespace Flux::resource_model::detail { -TEST_CASE( "Initialize REAPI CLI", "[initialize C]" ) { +TEST_CASE ("Initialize REAPI CLI", "[initialize C]") +{ const std::string options = "{}"; std::stringstream buffer; std::ifstream inputFile ("../../../t/data/resource/jgfs/tiny.json"); @@ -24,7 +25,8 @@ TEST_CASE( "Initialize REAPI CLI", "[initialize C]" ) { REQUIRE (ctx); } -TEST_CASE( "Match basic jobspec", "[match C]" ) { +TEST_CASE ("Match basic jobspec", "[match C]") +{ int rc = -1; const std::string options = "{}"; std::stringstream gbuffer, jbuffer; @@ -58,14 +60,65 @@ TEST_CASE( "Match basic jobspec", "[match C]" ) { uint64_t jobid = 1; double ov = 0.0; int64_t at = 0; - + rc = reapi_cli_match (ctx, match_op, jobspec.c_str (), &jobid, &reserved, &R, &at, &ov); REQUIRE (rc == 0); REQUIRE (reserved == false); REQUIRE (at == 0); } -} +TEST_CASE ("Match shrink basic jobspec", "[match shrink C]") +{ + int rc = -1; + const std::string options = "{\"load_format\": \"rv1exec\"}"; + std::stringstream gbuffer, jbuffer, cbuffer; + std::ifstream graphfile ("../../../t/data/resource/rv1exec/tiny_rv1exec.json"); + std::ifstream jobspecfile ("../../../t/data/resource/jobspecs/cancel/test018.yaml"); + std::ifstream cancelfile ("../../../t/data/resource/rv1exec/cancel/rank1_cancel.json"); + + if (!graphfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + if (!jobspecfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + if (!cancelfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + gbuffer << graphfile.rdbuf (); + std::string rgraph = gbuffer.str (); + jbuffer << jobspecfile.rdbuf (); + std::string jobspec = jbuffer.str (); + cbuffer << cancelfile.rdbuf (); + std::string cancel_string = cbuffer.str (); + reapi_cli_ctx_t *ctx = nullptr; + ctx = reapi_cli_new (); + REQUIRE (ctx); + + rc = reapi_cli_initialize (ctx, rgraph.c_str (), options.c_str ()); + REQUIRE (rc == 0); + + match_op_t match_op = match_op_t::MATCH_ALLOCATE; + bool reserved = false; + char *R; + uint64_t jobid = 1; + double ov = 0.0; + int64_t at = 0; + + rc = reapi_cli_match (ctx, match_op, jobspec.c_str (), &jobid, &reserved, &R, &at, &ov); + REQUIRE (rc == 0); + REQUIRE (reserved == false); + REQUIRE (at == 0); + + bool noent_ok = false; + bool full_removal = true; + rc = reapi_cli_partial_cancel (ctx, jobid, cancel_string.c_str (), noent_ok, &full_removal); + REQUIRE (rc == 0); + REQUIRE (full_removal == false); +} +} // namespace Flux::resource_model::detail diff --git a/resource/reapi/test/reapi_cli_test_cxx.cpp b/resource/reapi/test/reapi_cli_test_cxx.cpp index 61a7b3c04..f064aff49 100644 --- a/resource/reapi/test/reapi_cli_test_cxx.cpp +++ b/resource/reapi/test/reapi_cli_test_cxx.cpp @@ -1,4 +1,4 @@ -#define CATCH_CONFIG_MAIN +#define CATCH_CONFIG_MAIN #include #include @@ -6,7 +6,8 @@ namespace Flux::resource_model::detail { -TEST_CASE( "Initialize REAPI CLI", "[initialize C++]" ) { +TEST_CASE ("Initialize REAPI CLI", "[initialize C++]") +{ const std::string options = "{}"; std::stringstream buffer; std::ifstream inputFile ("../../../t/data/resource/jgfs/tiny.json"); @@ -23,7 +24,8 @@ TEST_CASE( "Initialize REAPI CLI", "[initialize C++]" ) { REQUIRE (ctx); } -TEST_CASE( "Match basic jobspec", "[match grow C++]" ) { +TEST_CASE ("Match and basic jobspec", "[match grow C++]") +{ int rc = -1; const std::string options = "{}"; std::stringstream gbuffer, jbuffer; @@ -55,20 +57,89 @@ TEST_CASE( "Match basic jobspec", "[match grow C++]" ) { double ov = 0.0; int64_t at = 0; - rc = detail::reapi_cli_t::match_allocate (ctx.get (), match_op, jobspec, jobid, reserved, R, at, ov); + rc = detail::reapi_cli_t::match_allocate (ctx.get (), + match_op, + jobspec, + jobid, + reserved, + R, + at, + ov); REQUIRE (rc == 0); REQUIRE (reserved == false); REQUIRE (at == 0); R = ""; match_op = match_op_t::MATCH_GROW_ALLOCATION; - rc = detail::reapi_cli_t::match_allocate (ctx.get (), match_op, jobspec, jobid, reserved, R, at, ov); + rc = detail::reapi_cli_t::match_allocate (ctx.get (), + match_op, + jobspec, + jobid, + reserved, + R, + at, + ov); REQUIRE (rc == 0); REQUIRE (reserved == false); REQUIRE (at == 0); } -} +TEST_CASE ("Match shrink basic jobspec", "[match shrink C++]") +{ + int rc = -1; + const std::string options = "{\"load_format\": \"rv1exec\"}"; + std::stringstream gbuffer, jbuffer, cbuffer; + std::ifstream graphfile ("../../../t/data/resource/rv1exec/tiny_rv1exec.json"); + std::ifstream jobspecfile ("../../../t/data/resource/jobspecs/cancel/test018.yaml"); + std::ifstream cancelfile ("../../../t/data/resource/rv1exec/cancel/rank1_cancel.json"); + + if (!graphfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + if (!jobspecfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + if (!cancelfile.is_open ()) { + std::cerr << "Error opening file!" << std::endl; + } + + gbuffer << graphfile.rdbuf (); + std::string rgraph = gbuffer.str (); + jbuffer << jobspecfile.rdbuf (); + std::string jobspec = jbuffer.str (); + cbuffer << cancelfile.rdbuf (); + std::string cancel_string = cbuffer.str (); + std::shared_ptr ctx = nullptr; + ctx = std::make_shared (rgraph, options); + REQUIRE (ctx); + match_op_t match_op = match_op_t::MATCH_ALLOCATE; + bool reserved = false; + std::string R = ""; + uint64_t jobid = 1; + double ov = 0.0; + int64_t at = 0; + + rc = detail::reapi_cli_t::match_allocate (ctx.get (), + match_op, + jobspec, + jobid, + reserved, + R, + at, + ov); + REQUIRE (rc == 0); + REQUIRE (reserved == false); + REQUIRE (at == 0); + + bool noent_ok = false; + bool full_removal = true; + rc = detail::reapi_cli_t::cancel (ctx.get (), jobid, cancel_string, noent_ok, full_removal); + REQUIRE (rc == 0); + REQUIRE (full_removal == false); +} +} // namespace Flux::resource_model::detail From 43d7f40fed8aaf84b080d0086144a7939b9bc27e Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Mon, 21 Jul 2025 17:05:43 -0700 Subject: [PATCH 12/13] ion-resource: add support for growing an allocation Problem: growing an allocation is not supported in flux ion-resource. Add the ability to send match RPCs to grow an existing allocation. --- src/cmd/flux-ion-resource.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/cmd/flux-ion-resource.py b/src/cmd/flux-ion-resource.py index ad1d67a10..73e355b9c 100755 --- a/src/cmd/flux-ion-resource.py +++ b/src/cmd/flux-ion-resource.py @@ -44,6 +44,10 @@ def rpc_allocate(self, jobid, jobspec_str): payload = {"cmd": "allocate", "jobid": jobid, "jobspec": jobspec_str} return self.handle.rpc("sched-fluxion-resource.match", payload).get() + def rpc_match_grow(self, jobid, jobspec_str): + payload = {"cmd": "grow_allocation", "jobid": jobid, "jobspec": jobspec_str} + return self.handle.rpc("sched-fluxion-resource.match", payload).get() + def rpc_update(self, jobid, Res): payload = {"jobid": jobid, "R": Res} return self.handle.rpc("sched-fluxion-resource.update", payload).get() @@ -135,6 +139,23 @@ def match_alloc_action(args): print(resp["R"]) +def match_grow_action(args): + """ + Action for match grow sub-command + """ + + with open(args.jobspec, "r") as stream: + jobspec_str = yaml.dump(yaml.safe_load(stream)) + jobid = args.jobid + rmormod = ResourceModuleInterface() + resp = rmormod.rpc_match_grow(jobid, jobspec_str) + print(heading()) + print(body(resp["jobid"], resp["status"], resp["at"], resp["overhead"])) + print("=" * width()) + print("MATCHED RESOURCES:") + print(resp["R"]) + + def match_alloc_sat_action(args): """ Action for match allocate_with_satisfiability sub-command @@ -430,6 +451,10 @@ def parse_match(parser_m: argparse.ArgumentParser): parser_ma = subparsers_m.add_parser( "allocate", help="Allocate the best matching resources if found." ) + parser_mg = subparsers_m.add_parser( + "grow_allocation", + help="Grow allocation with the best matching resources if found.", + ) parser_ms = subparsers_m.add_parser( "allocate_with_satisfiability", help=( @@ -451,12 +476,15 @@ def parse_match(parser_m: argparse.ArgumentParser): # # Jobspec positional argument for all match sub-commands # - for subparser in parser_ma, parser_ms, parser_mr, parser_fe: + for subparser in parser_ma, parser_mg, parser_ms, parser_mr, parser_fe: subparser.add_argument( "jobspec", metavar="Jobspec", type=str, help="Jobspec file name" ) + # Add jobid positional argument for match grow + parser_mg.add_argument("jobid", metavar="Jobid", type=JobID, help="Jobid") parser_ma.set_defaults(func=match_alloc_action) + parser_mg.set_defaults(func=match_grow_action) parser_ms.set_defaults(func=match_alloc_sat_action) parser_mr.set_defaults(func=match_reserve_action) parser_fe.set_defaults(func=satisfiability_action) From 0f6afd44d94d63c2d07cacafb1882fef5b02b4ef Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Mon, 21 Jul 2025 17:06:22 -0700 Subject: [PATCH 13/13] testsuite: add flux ion-resource tests Problem: growing an allocation via flux ion-resource is untested. Add tests to grow an existing allocation via flux ion-resource. --- t/CMakeLists.txt | 1 + t/t4014-match-grow.t | 47 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100755 t/t4014-match-grow.t diff --git a/t/CMakeLists.txt b/t/CMakeLists.txt index bb5e9a3e8..aa8d14d04 100644 --- a/t/CMakeLists.txt +++ b/t/CMakeLists.txt @@ -85,6 +85,7 @@ set(ALL_TESTS t4011-match-duration.t t4012-set-status.t t4013-unreservable.sh + t4014-match-grow.t t5000-valgrind.t t5100-issues-test-driver.t t6000-graph-size.t diff --git a/t/t4014-match-grow.t b/t/t4014-match-grow.t new file mode 100755 index 000000000..760d3139d --- /dev/null +++ b/t/t4014-match-grow.t @@ -0,0 +1,47 @@ +#!/bin/sh +#set -x + +test_description='Test the basic functionality of resource-match-grow-allocation + +Ensure that the match (allocate) handler within the resource module works +' + +. `dirname $0`/sharness.sh + +grug="${SHARNESS_TEST_SRCDIR}/data/resource/grugs/tiny.graphml" +jobspec="${SHARNESS_TEST_SRCDIR}/data/resource/jobspecs/basics/test001.yaml" + +# +# test_under_flux is under sharness.d/ +# +test_under_flux 1 + +# +# print only with --debug +# +test_debug ' + echo ${grug} && + echo ${jobspec} +' + +test_expect_success 'loading resource module with a tiny machine config works' ' + load_resource \ +load-file=${grug} prune-filters=ALL:core \ +load-format=grug subsystems=containment policy=high +' + +test_expect_success 'match-grow works with a 1-node, 1-socket jobspec' ' + output=$( flux ion-resource match allocate ${jobspec} ) && + jobid=$(echo ${output} | awk "{print \$6}") && + flux ion-resource match grow_allocation ${jobspec} ${jobid} +' + +test_expect_failure 'match-grow fails with nonexistent jobid' ' + flux ion-resource match grow_allocation ${jobspec} 10000000 +' + +test_expect_success 'removing resource works' ' + remove_resource +' + +test_done