From c7aa1bc9b6f918d3e0d3dd6516776c6bc6988d59 Mon Sep 17 00:00:00 2001 From: Marcos Bento Date: Mon, 3 Feb 2025 11:56:39 +0000 Subject: [PATCH] Enable Mirror of inherited variables Re ECFLOW-1999 --- libs/node/src/ecflow/node/MirrorAttr.cpp | 3 +++ libs/node/src/ecflow/node/Node.cpp | 18 ++++++++++++++++++ libs/node/src/ecflow/node/Node.hpp | 1 + .../src/ecflow/service/mirror/MirrorClient.cpp | 1 + .../src/ecflow/service/mirror/MirrorClient.hpp | 11 ++++++++++- 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/libs/node/src/ecflow/node/MirrorAttr.cpp b/libs/node/src/ecflow/node/MirrorAttr.cpp index 4cfedfb0e..f912b9ded 100644 --- a/libs/node/src/ecflow/node/MirrorAttr.cpp +++ b/libs/node/src/ecflow/node/MirrorAttr.cpp @@ -117,6 +117,9 @@ void MirrorAttr::mirror() { // ** Node Variables std::vector all_variables = notification.data().regular_variables; + for (const auto& variable : notification.data().inherited_variables) { + all_variables.push_back(variable); + } for (const auto& variable : notification.data().generated_variables) { all_variables.push_back(variable); } diff --git a/libs/node/src/ecflow/node/Node.cpp b/libs/node/src/ecflow/node/Node.cpp index 1e24dfd69..812d6b1bd 100644 --- a/libs/node/src/ecflow/node/Node.cpp +++ b/libs/node/src/ecflow/node/Node.cpp @@ -2652,6 +2652,24 @@ size_t Node::position() const { return std::numeric_limits::max(); } +std::vector Node::get_all_inherited_variables() const { + std::vector all; + const Node* current = this->parent(); + + std::set cache; + while (current) { + for (const Variable& var : current->variables()) { + if (auto found = std::find(std::begin(cache), std::end(cache), var.name()); found == std::end(cache)) { + cache.insert(var.name()); + all.push_back(var); + } + } + current = current->parent(); + } + + return all; +} + std::vector Node::get_all_generated_variables() const { std::vector all; const Node* current = this; diff --git a/libs/node/src/ecflow/node/Node.hpp b/libs/node/src/ecflow/node/Node.hpp index 4f6b44376..b4e28fb8d 100644 --- a/libs/node/src/ecflow/node/Node.hpp +++ b/libs/node/src/ecflow/node/Node.hpp @@ -456,6 +456,7 @@ class Node : public std::enable_shared_from_this { void replace_meters(const std::vector& meters); void replace_events(const std::vector& events); + std::vector get_all_inherited_variables() const; std::vector get_all_generated_variables() const; // Add functions: =============================================================== diff --git a/libs/service/src/ecflow/service/mirror/MirrorClient.cpp b/libs/service/src/ecflow/service/mirror/MirrorClient.cpp index 582e456db..d485ffd84 100644 --- a/libs/service/src/ecflow/service/mirror/MirrorClient.cpp +++ b/libs/service/src/ecflow/service/mirror/MirrorClient.cpp @@ -96,6 +96,7 @@ MirrorData MirrorClient::get_node_status(const std::string& remote_host, // ** Node Variables data.regular_variables = node->variables(); + data.inherited_variables = node->get_all_inherited_variables(); data.generated_variables = node->get_all_generated_variables(); // Filter out the Definitions structural variables (SUITE, to avoid conflicts with "local" side definitions diff --git a/libs/service/src/ecflow/service/mirror/MirrorClient.hpp b/libs/service/src/ecflow/service/mirror/MirrorClient.hpp index e690d9b49..0f4bfe519 100644 --- a/libs/service/src/ecflow/service/mirror/MirrorClient.hpp +++ b/libs/service/src/ecflow/service/mirror/MirrorClient.hpp @@ -22,11 +22,19 @@ namespace ecf::service::mirror { struct MirrorData { - MirrorData() : state{0}, regular_variables{}, generated_variables{}, labels{}, meters{}, events{} {} + MirrorData() + : state{0}, + regular_variables{}, + inherited_variables{}, + generated_variables{}, + labels{}, + meters{}, + events{} {} explicit MirrorData(int state) : state{state}, regular_variables{}, + inherited_variables{}, generated_variables{}, labels{}, meters{}, @@ -35,6 +43,7 @@ struct MirrorData int state; std::vector regular_variables; + std::vector inherited_variables; std::vector generated_variables; std::vector