Repository: nifi-minifi-cpp Updated Branches: refs/heads/master ed6dc27f6 -> 1c1f53ba5
MINFICIPP-568: Change resp to componentmanifest MINIFICP-568: Add type for agent information MINIFICPP-569: Break apart the different extensions in the c2 response This closes #378. Signed-off-by: Aldrin Piri <ald...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/1c1f53ba Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/1c1f53ba Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/1c1f53ba Branch: refs/heads/master Commit: 1c1f53ba5626ebfe0621a14bc6fa3c492949274a Parents: ed6dc27 Author: Marc Parisi <phroc...@apache.org> Authored: Sat Jul 21 20:52:56 2018 -0400 Committer: Aldrin Piri <ald...@apache.org> Committed: Tue Jul 24 09:53:01 2018 -0400 ---------------------------------------------------------------------- CMakeLists.txt | 2 - cmake/Extensions.cmake | 3 +- extensions/ExtensionHeader.txt | 2 +- extensions/civetweb/CMakeLists.txt | 3 +- extensions/http-curl/CMakeLists.txt | 5 +- libminifi/CMakeLists.txt | 1 + libminifi/include/agent/build_description.h | 50 +-- libminifi/include/core/ClassLoader.h | 25 +- libminifi/include/core/Resource.h | 11 +- libminifi/include/core/state/Value.h | 5 + .../include/core/state/nodes/AgentInformation.h | 317 ++++++++++--------- .../include/core/state/nodes/MetricsBase.h | 1 - libminifi/src/c2/C2Agent.cpp | 3 + .../unit/PropertyValidationAgentInfoTests.cpp | 4 +- 14 files changed, 242 insertions(+), 190 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/CMakeLists.txt b/CMakeLists.txt index 1177813..c996758 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,8 +356,6 @@ if (NOT DISABLE_CURL) add_subdirectory(LibExample) endif() - - get_property(selected_extensions GLOBAL PROPERTY EXTENSION-OPTIONS) if (NOT BUILD_IDENTIFIER) http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/cmake/Extensions.cmake ---------------------------------------------------------------------- diff --git a/cmake/Extensions.cmake b/cmake/Extensions.cmake index b945f0b..05daeea 100644 --- a/cmake/Extensions.cmake +++ b/cmake/Extensions.cmake @@ -23,8 +23,9 @@ define_property(GLOBAL PROPERTY EXTENSION-OPTIONS set_property(GLOBAL PROPERTY EXTENSION-OPTIONS "") macro(register_extension extension-name) - get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS) + get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS) set_property(GLOBAL APPEND PROPERTY EXTENSION-OPTIONS ${extension-name}) + target_compile_definitions(${extension-name} PRIVATE "MODULE_NAME=${extension-name}") endmacro() ### TESTING MACROS http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/ExtensionHeader.txt ---------------------------------------------------------------------- diff --git a/extensions/ExtensionHeader.txt b/extensions/ExtensionHeader.txt index 8deafa5..328e3be 100644 --- a/extensions/ExtensionHeader.txt +++ b/extensions/ExtensionHeader.txt @@ -23,4 +23,4 @@ cmake_minimum_required(VERSION 2.6) set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols") set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols") -include_directories(../../libminifi/include ../../libminifi/include/core/yaml ../../libminifi/include/core ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/) \ No newline at end of file +include_directories(../../libminifi/include ../../libminifi/include/core/yaml ../../libminifi/include/core ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/) http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/civetweb/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/extensions/civetweb/CMakeLists.txt b/extensions/civetweb/CMakeLists.txt index 470a231..755cbf8 100644 --- a/extensions/civetweb/CMakeLists.txt +++ b/extensions/civetweb/CMakeLists.txt @@ -17,8 +17,7 @@ # under the License. # -set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols") -set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols") +include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt) include_directories(${CMAKE_SOURCE_DIR}/libminifi/include ${CMAKE_SOURCE_DIR}/libminifi/include/core http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/http-curl/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/extensions/http-curl/CMakeLists.txt b/extensions/http-curl/CMakeLists.txt index 14d4193..9d2d816 100644 --- a/extensions/http-curl/CMakeLists.txt +++ b/extensions/http-curl/CMakeLists.txt @@ -63,10 +63,7 @@ endif() find_package(CURL REQUIRED) -set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols") -set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols") - -include_directories(../../libminifi/include ../../libminifi/include/core/yaml ../../libminifi/include/core ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/) +include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt) include_directories(protocols client processors sitetosite) file(GLOB SOURCES "*.cpp" "protocols/*.cpp" "client/*.cpp" "processors/*.cpp" "sitetosite/*.cpp") http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt index f7f3e93..54a9801 100644 --- a/libminifi/CMakeLists.txt +++ b/libminifi/CMakeLists.txt @@ -25,6 +25,7 @@ set(PROJECT_VERSION_MAJOR 0) set(PROJECT_VERSION_MINOR 5) set(PROJECT_VERSION_PATCH 0) + #### Establish Project Configuration #### # Enable usage of the VERSION specifier set(CMAKE_CXX_STANDARD 11) http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/agent/build_description.h ---------------------------------------------------------------------- diff --git a/libminifi/include/agent/build_description.h b/libminifi/include/agent/build_description.h index b653b93..b46dde5 100644 --- a/libminifi/include/agent/build_description.h +++ b/libminifi/include/agent/build_description.h @@ -51,45 +51,45 @@ struct Components { class BuildDescription { public: - static struct Components getClassDescriptions() { - static struct Components classes; - if (UNLIKELY(IsNullOrEmpty(classes.processors_) && IsNullOrEmpty(classes.controller_services_))) { - for (auto clazz : core::ClassLoader::getDefaultClassLoader().getClasses()) { - + static struct Components getClassDescriptions(const std::string group = "default") { + static std::map<std::string, struct Components> class_mappings; + if (UNLIKELY(IsNullOrEmpty(class_mappings[group].processors_) && IsNullOrEmpty(class_mappings[group].processors_))) { + for (auto clazz : core::ClassLoader::getDefaultClassLoader().getClasses(group)) { + std::string class_name = clazz; auto lastOfIdx = clazz.find_last_of("::"); if (lastOfIdx != std::string::npos) { lastOfIdx++; // if a value is found, increment to move beyond the . int nameLength = clazz.length() - lastOfIdx; - std::string class_name = clazz.substr(lastOfIdx, nameLength); - - auto obj = core::ClassLoader::getDefaultClassLoader().instantiate(class_name, class_name); + class_name = clazz.substr(lastOfIdx, nameLength); + } + auto obj = core::ClassLoader::getDefaultClassLoader().instantiate(class_name, class_name); - std::shared_ptr<core::ConfigurableComponent> component = std::dynamic_pointer_cast<core::ConfigurableComponent>(obj); + std::shared_ptr<core::ConfigurableComponent> component = std::dynamic_pointer_cast<core::ConfigurableComponent>(obj); - ClassDescription description(clazz); - if (nullptr != component) { + ClassDescription description(clazz); + if (nullptr != component) { - bool is_processor = std::dynamic_pointer_cast<core::Processor>(obj) != nullptr; - bool is_controller_service = LIKELY(is_processor == true) ? false : std::dynamic_pointer_cast<core::controller::ControllerService>(obj) != nullptr; + bool is_processor = std::dynamic_pointer_cast<core::Processor>(obj) != nullptr; + bool is_controller_service = LIKELY(is_processor == true) ? false : std::dynamic_pointer_cast<core::controller::ControllerService>(obj) != nullptr; - component->initialize(); - description.class_properties_ = component->getProperties(); - description.support_dynamic_ = component->supportsDynamicProperties(); - if (is_processor) { - classes.processors_.emplace_back(description); - } else if (is_controller_service) { - classes.controller_services_.emplace_back(description); - } else { - classes.other_components_.emplace_back(description); - } + component->initialize(); + description.class_properties_ = component->getProperties(); + description.support_dynamic_ = component->supportsDynamicProperties(); + if (is_processor) { + class_mappings[group].processors_.emplace_back(description); + } else if (is_controller_service) { + class_mappings[group].controller_services_.emplace_back(description); + } else { + class_mappings[group].other_components_.emplace_back(description); } } } } - return classes; + return class_mappings[group]; } -}; +} +; } /* namespace minifi */ } /* namespace nifi */ http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/ClassLoader.h ---------------------------------------------------------------------- diff --git a/libminifi/include/core/ClassLoader.h b/libminifi/include/core/ClassLoader.h index 6c17493..b1ecaf8 100644 --- a/libminifi/include/core/ClassLoader.h +++ b/libminifi/include/core/ClassLoader.h @@ -224,6 +224,27 @@ class ClassLoader { std::lock_guard<std::mutex> lock(internal_mutex_); loaded_factories_.insert(std::make_pair(name, std::move(factory))); + + } + + /** + * Register a class with the give ProcessorFactory + */ + void registerClass(const std::string &group, const std::string &name, std::unique_ptr<ObjectFactory> factory) { + if (loaded_factories_.find(name) != loaded_factories_.end()) { + return; + } + + std::lock_guard<std::mutex> lock(internal_mutex_); + + module_mapping_[group].push_back(factory->getName()); + + loaded_factories_.insert(std::make_pair(name, std::move(factory))); + } + + std::vector<std::string> getClasses(const std::string &group) { + std::lock_guard<std::mutex> lock(internal_mutex_); + return module_mapping_[group]; } std::vector<std::string> getGroups() { @@ -242,7 +263,7 @@ class ClassLoader { if (nullptr != resource.second) { auto classes = resource.second->getClassNames(); groups.insert(groups.end(), classes.begin(), classes.end()); - }else{ + } else { } } return groups; @@ -286,6 +307,8 @@ class ClassLoader { protected: + std::map<std::string, std::vector<std::string>> module_mapping_; + std::map<std::string, std::unique_ptr<ObjectFactory>> loaded_factories_; std::mutex internal_mutex_; http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/Resource.h ---------------------------------------------------------------------- diff --git a/libminifi/include/core/Resource.h b/libminifi/include/core/Resource.h index 8bb7c97..0dc6723 100644 --- a/libminifi/include/core/Resource.h +++ b/libminifi/include/core/Resource.h @@ -26,13 +26,22 @@ namespace nifi { namespace minifi { namespace core { + +#define MKSOC(x) #x +#define MAKESTRING(x) MKSOC(x) + + template<class T> class StaticClassType { public: StaticClassType(const std::string &name) { // Notify when the static member is created - ClassLoader::getDefaultClassLoader().registerClass(name, std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>())); +#ifdef MODULE_NAME + ClassLoader::getDefaultClassLoader().registerClass(MAKESTRING(MODULE_NAME), name, std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>())); +#else + ClassLoader::getDefaultClassLoader().registerClass("default", name, std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>())); +#endif } }; http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/Value.h ---------------------------------------------------------------------- diff --git a/libminifi/include/core/state/Value.h b/libminifi/include/core/state/Value.h index 5abe9a3..f4a92ad 100644 --- a/libminifi/include/core/state/Value.h +++ b/libminifi/include/core/state/Value.h @@ -194,12 +194,17 @@ class ValueNode { struct SerializedResponseNode { std::string name; ValueNode value; + bool array; + + SerializedResponseNode() : array(false){ + } std::vector<SerializedResponseNode> children; SerializedResponseNode &operator=(const SerializedResponseNode &other) { name = other.name; value = other.value; children = other.children; + array = other.array; return *this; } }; http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/nodes/AgentInformation.h ---------------------------------------------------------------------- diff --git a/libminifi/include/core/state/nodes/AgentInformation.h b/libminifi/include/core/state/nodes/AgentInformation.h index 8ca8954..5797ed8 100644 --- a/libminifi/include/core/state/nodes/AgentInformation.h +++ b/libminifi/include/core/state/nodes/AgentInformation.h @@ -58,6 +58,160 @@ namespace response { #define GROUP_STR "org::apache::nifi::minifi" + +class ComponentManifest : public DeviceInformation { + public: + ComponentManifest(std::string name, uuid_t uuid) + : DeviceInformation(name, uuid) { + } + + ComponentManifest(const std::string &name) + : DeviceInformation(name, 0) { + } + + std::string getName() const { + return CoreComponent::getName(); + } + + std::vector<SerializedResponseNode> serialize() { + std::vector<SerializedResponseNode> serialized; + SerializedResponseNode resp; + resp.name = "componentManifest"; + struct Components group = BuildDescription::getClassDescriptions(getName()); + serializeClassDescription(group.processors_, "processors", resp); + serializeClassDescription(group.controller_services_, "controllerServices", resp); + serialized.push_back(resp); + return serialized; + } + protected: + + void serializeClassDescription(const std::vector<ClassDescription> &descriptions, const std::string name, SerializedResponseNode &response) { + if (!descriptions.empty()) { + SerializedResponseNode type; + type.name = name; + type.array = true; + std::vector<SerializedResponseNode> serialized; + for (auto group : descriptions) { + + SerializedResponseNode desc; + desc.name = group.class_name_; + + SerializedResponseNode bgroup; + bgroup.name = "group"; + bgroup.value = GROUP_STR; + SerializedResponseNode artifact; + artifact.name = "artifact"; + artifact.value = group.class_name_; + + SerializedResponseNode className; + className.name = "type"; + className.value = group.class_name_; + + SerializedResponseNode version; + version.name = "version"; + version.value = AgentBuild::VERSION; + + if (!group.class_properties_.empty()) { + SerializedResponseNode props; + props.name = "propertyDescriptors"; + for (auto && prop : group.class_properties_) { + + SerializedResponseNode child; + child.name = prop.first; + + SerializedResponseNode descriptorName; + descriptorName.name = "name"; + descriptorName.value = prop.first; + + SerializedResponseNode descriptorDescription; + descriptorDescription.name = "description"; + descriptorDescription.value = prop.second.getDescription(); + + SerializedResponseNode descriptorRequired; + descriptorRequired.name = "required"; + descriptorRequired.value = prop.second.getRequired(); + + SerializedResponseNode descriptorDependentProperties; + descriptorDependentProperties.name = "dependentProperties"; + + for (const auto &propName : prop.second.getDependentProperties()) { + SerializedResponseNode descriptorDependentProperty; + descriptorDependentProperty.name = propName; + descriptorDependentProperties.children.push_back(descriptorDependentProperty); + } + + SerializedResponseNode descriptorExclusiveOfProperties; + descriptorExclusiveOfProperties.name = "exclusiveOfProperties"; + + for (const auto &exclusiveProp : prop.second.getExclusiveOfProperties()) { + SerializedResponseNode descriptorExclusiveOfProperty; + descriptorExclusiveOfProperty.name = exclusiveProp.first; + descriptorExclusiveOfProperty.value = exclusiveProp.second; + descriptorExclusiveOfProperties.children.push_back(descriptorExclusiveOfProperty); + } + + child.children.push_back(descriptorName); + child.children.push_back(descriptorDescription); + child.children.push_back(descriptorRequired); + child.children.push_back(descriptorDependentProperties); + child.children.push_back(descriptorExclusiveOfProperties); + + props.children.push_back(child); + } + + desc.children.push_back(props); + } + + SerializedResponseNode dyn_prop; + dyn_prop.name = "supportsDynamicProperties"; + dyn_prop.value = group.support_dynamic_; + + desc.children.push_back(dyn_prop); + + desc.children.push_back(bgroup); + desc.children.push_back(artifact); + desc.children.push_back(className); + desc.children.push_back(version); + + SerializedResponseNode buildInfo; + buildInfo.name = "buildInfo"; + + SerializedResponseNode build_version; + build_version.name = "version"; + build_version.value = AgentBuild::VERSION; + + SerializedResponseNode build_rev; + build_rev.name = "revision"; + build_rev.value = AgentBuild::BUILD_REV; + + SerializedResponseNode build_date; + build_date.name = "timestamp"; + build_date.value = (uint64_t) std::stoull(AgentBuild::BUILD_DATE); + + SerializedResponseNode compiler_command; + compiler_command.name = "compiler"; + compiler_command.value = AgentBuild::COMPILER; + + SerializedResponseNode compiler_flags; + compiler_flags.name = "flags"; + compiler_flags.value = AgentBuild::COMPILER_FLAGS; + + buildInfo.children.push_back(compiler_flags); + buildInfo.children.push_back(compiler_command); + + buildInfo.children.push_back(build_version); + buildInfo.children.push_back(build_rev); + buildInfo.children.push_back(build_date); + desc.children.push_back(buildInfo); + type.children.push_back(desc); + } + response.children.push_back(type); + } + + } +}; + + class Bundles : public DeviceInformation { public: Bundles(std::string name, uuid_t uuid) @@ -94,6 +248,12 @@ class Bundles : public DeviceInformation { bundle.children.push_back(bgroup); bundle.children.push_back(artifact); bundle.children.push_back(version); + + ComponentManifest compMan(group, nullptr); + // serialize the component information. + for (auto component : compMan.serialize()) { + bundle.children.push_back(component); + } serialized.push_back(bundle); } @@ -192,7 +352,7 @@ class AgentStatus : public StateMonitorNode { class AgentIdentifier { public: - AgentIdentifier(){ + AgentIdentifier() { } @@ -200,7 +360,7 @@ class AgentIdentifier { identifier_ = identifier; } - void setAgentClass(const std::string &agentClass){ + void setAgentClass(const std::string &agentClass) { agent_class_ = agentClass; } @@ -231,151 +391,6 @@ class AgentMonitor { std::shared_ptr<state::StateMonitor> monitor_; }; -class ComponentManifest : public DeviceInformation { - public: - ComponentManifest(std::string name, uuid_t uuid) - : DeviceInformation(name, uuid) { - } - - ComponentManifest(const std::string &name) - : DeviceInformation(name, 0) { - } - - std::string getName() const { - return "componentManifest"; - } - - std::vector<SerializedResponseNode> serialize() { - std::vector<SerializedResponseNode> serialized; - struct Components group = BuildDescription::getClassDescriptions(); - serializeClassDescription(group.processors_, "processors", serialized); - serializeClassDescription(group.controller_services_, "controllerServices", serialized); - return serialized; - } - protected: - - void serializeClassDescription(const std::vector<ClassDescription> &descriptions, const std::string name, std::vector<SerializedResponseNode> &response) { - SerializedResponseNode resp; - resp.name = " resp"; - if (!descriptions.empty()) { - - SerializedResponseNode type; - type.name = name; - - for (auto group : descriptions) { - - SerializedResponseNode desc; - desc.name = group.class_name_; - - SerializedResponseNode bgroup; - bgroup.name = "group"; - bgroup.value = GROUP_STR; - SerializedResponseNode artifact; - artifact.name = "artifact"; - artifact.value = group.class_name_; - SerializedResponseNode version; - version.name = "version"; - version.value = AgentBuild::VERSION; - - if (!group.class_properties_.empty()) { - SerializedResponseNode props; - props.name = "propertyDescriptors"; - for (auto && prop : group.class_properties_) { - - SerializedResponseNode child; - child.name = prop.first; - - SerializedResponseNode descriptorName; - descriptorName.name = "name"; - descriptorName.value = prop.first; - - SerializedResponseNode descriptorDescription; - descriptorDescription.name = "description"; - descriptorDescription.value = prop.second.getDescription(); - - SerializedResponseNode descriptorRequired; - descriptorRequired.name = "required"; - descriptorRequired.value = prop.second.getRequired(); - - SerializedResponseNode descriptorDependentProperties; - descriptorDependentProperties.name = "dependentProperties"; - - for (const auto &propName : prop.second.getDependentProperties()) { - SerializedResponseNode descriptorDependentProperty; - descriptorDependentProperty.name = propName; - descriptorDependentProperties.children.push_back(descriptorDependentProperty); - } - - SerializedResponseNode descriptorExclusiveOfProperties; - descriptorExclusiveOfProperties.name = "exclusiveOfProperties"; - - for (const auto &exclusiveProp : prop.second.getExclusiveOfProperties()) { - SerializedResponseNode descriptorExclusiveOfProperty; - descriptorExclusiveOfProperty.name = exclusiveProp.first; - descriptorExclusiveOfProperty.value = exclusiveProp.second; - descriptorExclusiveOfProperties.children.push_back(descriptorExclusiveOfProperty); - } - - child.children.push_back(descriptorName); - child.children.push_back(descriptorDescription); - child.children.push_back(descriptorRequired); - child.children.push_back(descriptorDependentProperties); - child.children.push_back(descriptorExclusiveOfProperties); - - props.children.push_back(child); - } - - desc.children.push_back(props); - } - - SerializedResponseNode dyn_prop; - dyn_prop.name = "supportsDynamicProperties"; - dyn_prop.value = group.support_dynamic_; - - desc.children.push_back(dyn_prop); - - desc.children.push_back(bgroup); - desc.children.push_back(artifact); - desc.children.push_back(version); - - SerializedResponseNode buildInfo; - buildInfo.name = "buildInfo"; - - SerializedResponseNode build_version; - build_version.name = "version"; - build_version.value = AgentBuild::VERSION; - - SerializedResponseNode build_rev; - build_rev.name = "revision"; - build_rev.value = AgentBuild::BUILD_REV; - - SerializedResponseNode build_date; - build_date.name = "timestamp"; - build_date.value = (uint64_t)std::stoull(AgentBuild::BUILD_DATE); - - SerializedResponseNode compiler_command; - compiler_command.name = "compiler"; - compiler_command.value = AgentBuild::COMPILER; - - SerializedResponseNode compiler_flags; - compiler_flags.name = "flags"; - compiler_flags.value = AgentBuild::COMPILER_FLAGS; - - buildInfo.children.push_back(compiler_flags); - buildInfo.children.push_back(compiler_command); - - buildInfo.children.push_back(build_version); - buildInfo.children.push_back(build_rev); - buildInfo.children.push_back(build_date); - desc.children.push_back(buildInfo); - type.children.push_back(desc); - } - resp.children.push_back(type); - } - response.push_back(resp); - - } -}; /** * Justification and Purpose: Provides available extensions for the agent information block. @@ -428,7 +443,7 @@ class AgentManifest : public DeviceInformation { SerializedResponseNode build_date; build_date.name = "timestamp"; - build_date.value = (uint64_t)std::stoull(AgentBuild::BUILD_DATE); + build_date.value = (uint64_t) std::stoull(AgentBuild::BUILD_DATE); SerializedResponseNode compiler_command; compiler_command.name = "compiler"; @@ -455,7 +470,7 @@ class AgentManifest : public DeviceInformation { serialized.push_back(bundle); } - ComponentManifest compMan("componentManifest", nullptr); + ComponentManifest compMan("default", nullptr); // serialize the component information. for (auto component : compMan.serialize()) { serialized.push_back(component); @@ -473,10 +488,12 @@ class AgentInformation : public DeviceInformation, public AgentMonitor, public A AgentInformation(std::string name, uuid_t uuid) : DeviceInformation(name, uuid) { + setArray(false); } AgentInformation(const std::string &name) : DeviceInformation(name, 0) { + setArray(false); } std::string getName() const { @@ -525,7 +542,7 @@ class AgentInformation : public DeviceInformation, public AgentMonitor, public A void serializeClass(const std::vector<ClassDescription> &processors, const std::vector<ClassDescription> &controller_services, const std::vector<ClassDescription> &other_components, std::vector<SerializedResponseNode> &response) { SerializedResponseNode resp; - resp.name = " resp"; + resp.name = "componentManifest"; if (!processors.empty()) { SerializedResponseNode type; type.name = "Processors"; http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/nodes/MetricsBase.h ---------------------------------------------------------------------- diff --git a/libminifi/include/core/state/nodes/MetricsBase.h b/libminifi/include/core/state/nodes/MetricsBase.h index 323b6cd..6e5aaf6 100644 --- a/libminifi/include/core/state/nodes/MetricsBase.h +++ b/libminifi/include/core/state/nodes/MetricsBase.h @@ -51,7 +51,6 @@ class ResponseNode : public core::Connectable { virtual ~ResponseNode() { } - virtual std::string getName() const = 0; virtual std::vector<SerializedResponseNode> serialize() = 0; http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/src/c2/C2Agent.cpp ---------------------------------------------------------------------- diff --git a/libminifi/src/c2/C2Agent.cpp b/libminifi/src/c2/C2Agent.cpp index cb7e0f4..2514906 100644 --- a/libminifi/src/c2/C2Agent.cpp +++ b/libminifi/src/c2/C2Agent.cpp @@ -269,6 +269,9 @@ void C2Agent::serializeMetrics(C2Payload &metric_payload, const std::string &nam for (auto metric : metrics) { if (metric.children.size() > 0) { C2Payload child_metric_payload(metric_payload.getOperation()); + if (metric.array) { + child_metric_payload.setContainer(true); + } child_metric_payload.setLabel(metric.name); serializeMetrics(child_metric_payload, metric.name, metric.children, is_container); metric_payload.addPayload(std::move(child_metric_payload)); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp ---------------------------------------------------------------------- diff --git a/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp b/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp index a7b297d..61fc95f 100644 --- a/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp +++ b/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp @@ -26,7 +26,7 @@ #include "core/ClassLoader.h" TEST_CASE("Test Required", "[required]") { - minifi::state::response::ComponentManifest manifest("PutFile"); + minifi::state::response::ComponentManifest manifest("default"); auto serialized = manifest.serialize(); REQUIRE(serialized.size() > 0); const auto &resp = serialized[0]; @@ -45,7 +45,7 @@ TEST_CASE("Test Required", "[required]") { } TEST_CASE("Test Dependent", "[dependent]") { - minifi::state::response::ComponentManifest manifest("manifest"); + minifi::state::response::ComponentManifest manifest("default"); auto serialized = manifest.serialize(); REQUIRE(serialized.size() > 0); const auto &resp = serialized[0];