Repository: nifi-minifi-cpp Updated Branches: refs/heads/master 23c5c197a -> 1f2e60061
MINIFICPP-664: Require C2 agent class to be defined This closes #434. 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/1f2e6006 Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/1f2e6006 Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/1f2e6006 Branch: refs/heads/master Commit: 1f2e600614d8a85c3abf9ea621a8f6c27793ccd7 Parents: 23c5c19 Author: Marc Parisi <phroc...@apache.org> Authored: Tue Nov 6 11:17:31 2018 -0500 Committer: Aldrin Piri <ald...@apache.org> Committed: Tue Nov 6 13:28:35 2018 -0500 ---------------------------------------------------------------------- C2.md | 2 +- OPS.md | 3 +- conf/minifi.properties | 5 +-- .../http-curl/tests/C2FailedUpdateTest.cpp | 2 ++ .../http-curl/tests/C2NullConfiguration.cpp | 3 +- .../http-curl/tests/C2UpdateAgentTest.cpp | 4 ++- extensions/http-curl/tests/C2UpdateTest.cpp | 4 ++- .../tests/C2VerifyHeartbeatAndStop.cpp | 2 ++ .../http-curl/tests/C2VerifyServeResults.cpp | 10 +++--- libminifi/src/FlowController.cpp | 34 ++++++++++++++------ 10 files changed, 46 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/C2.md ---------------------------------------------------------------------- diff --git a/C2.md b/C2.md index fdd12b8..c6c1572 100644 --- a/C2.md +++ b/C2.md @@ -76,7 +76,7 @@ an alternate key, but you are encouraged to switch your configuration options as # c2 agent identifier nifi.c2.agent.identifier=<your identifier> - # c2 agent class + # c2 agent class -- must be defined to run agent nifi.c2.agent.class=<your agent class> # configure SSL Context service for REST Protocol http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/OPS.md ---------------------------------------------------------------------- diff --git a/OPS.md b/OPS.md index c993785..923de64 100644 --- a/OPS.md +++ b/OPS.md @@ -27,7 +27,8 @@ This readme defines operational commands for managing instances. ## Description Apache NiFi MiNiFi C++ can be managed through our [C2 protocol](https://cwiki.apache.org/confluence/display/MINIFI/C2+Design+Proposal) -or through a local interface called the MiNiFi Controller +or through a local interface called the MiNiFi Controller. This feature is disabled by default, and requires that C2 be enabled +and configured with an agent class before using the MiNiFi controller features outlined here. ## Managing MiNiFi http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/conf/minifi.properties ---------------------------------------------------------------------- diff --git a/conf/minifi.properties b/conf/minifi.properties index b32708b..568669a 100644 --- a/conf/minifi.properties +++ b/conf/minifi.properties @@ -38,5 +38,6 @@ nifi.database.content.repository.directory.default=${MINIFI_HOME}/content_reposi #nifi.rest.api.password=password ## enable the controller socket provider on port 9998 -controller.socket.host=localhost -controller.socket.port=9998 +## off by default. C2 must be enabled to support these +#controller.socket.host=localhost +#controller.socket.port=9998 http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2FailedUpdateTest.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2FailedUpdateTest.cpp b/extensions/http-curl/tests/C2FailedUpdateTest.cpp index fc3e79a..904d931 100644 --- a/extensions/http-curl/tests/C2FailedUpdateTest.cpp +++ b/extensions/http-curl/tests/C2FailedUpdateTest.cpp @@ -142,6 +142,8 @@ int main(int argc, char **argv) { std::shared_ptr<minifi::Configure> configuration = std::make_shared<minifi::Configure>(); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.rest.url", "http://localhost:7071/update"); configuration->set("c2.agent.heartbeat.period", "1000"); mkdir("content_repository", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2NullConfiguration.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2NullConfiguration.cpp b/extensions/http-curl/tests/C2NullConfiguration.cpp index 934cf02..02474d1 100644 --- a/extensions/http-curl/tests/C2NullConfiguration.cpp +++ b/extensions/http-curl/tests/C2NullConfiguration.cpp @@ -94,9 +94,10 @@ class VerifyC2Server : public HTTPIntegrationBase { std::string url = ""; inv->getProperty(minifi::processors::InvokeHTTP::URL.getName(), url); - std::string port, scheme, path; parse_http_components(url, port, scheme, path); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.agent.protocol.class", "null"); configuration->set("c2.rest.url", ""); configuration->set("c2.rest.url.ack", ""); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2UpdateAgentTest.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2UpdateAgentTest.cpp b/extensions/http-curl/tests/C2UpdateAgentTest.cpp index 8bb7b22..d1e83aa 100644 --- a/extensions/http-curl/tests/C2UpdateAgentTest.cpp +++ b/extensions/http-curl/tests/C2UpdateAgentTest.cpp @@ -140,6 +140,8 @@ int main(int argc, char **argv) { std::shared_ptr<minifi::Configure> configuration = std::make_shared<minifi::Configure>(); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.rest.url", "http://localhost:7072/update"); configuration->set("c2.agent.heartbeat.period", "1000"); mkdir("content_repository", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); @@ -157,7 +159,7 @@ int main(int argc, char **argv) { std::shared_ptr<TestRepository> repo = std::static_pointer_cast<TestRepository>(test_repo); std::shared_ptr<minifi::FlowController> controller = std::make_shared<minifi::FlowController>(test_repo, test_flow_repo, configuration, std::move(yaml_ptr), content_repo, DEFAULT_ROOT_GROUP_NAME, - true); + true); core::YamlConfiguration yaml_config(test_repo, test_repo, content_repo, stream_factory, configuration, test_file_location); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2UpdateTest.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2UpdateTest.cpp b/extensions/http-curl/tests/C2UpdateTest.cpp index c51376d..a5166f3 100644 --- a/extensions/http-curl/tests/C2UpdateTest.cpp +++ b/extensions/http-curl/tests/C2UpdateTest.cpp @@ -140,6 +140,8 @@ int main(int argc, char **argv) { std::shared_ptr<minifi::Configure> configuration = std::make_shared<minifi::Configure>(); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.rest.url", "http://localhost:7070/update"); configuration->set("c2.agent.heartbeat.period", "1000"); mkdir("content_repository", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); @@ -156,7 +158,7 @@ int main(int argc, char **argv) { std::shared_ptr<TestRepository> repo = std::static_pointer_cast<TestRepository>(test_repo); std::shared_ptr<minifi::FlowController> controller = std::make_shared<minifi::FlowController>(test_repo, test_flow_repo, configuration, std::move(yaml_ptr), content_repo, DEFAULT_ROOT_GROUP_NAME, - true); + true); core::YamlConfiguration yaml_config(test_repo, test_repo, content_repo, stream_factory, configuration, test_file_location); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2VerifyHeartbeatAndStop.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2VerifyHeartbeatAndStop.cpp b/extensions/http-curl/tests/C2VerifyHeartbeatAndStop.cpp index b31fc51..60738e4 100644 --- a/extensions/http-curl/tests/C2VerifyHeartbeatAndStop.cpp +++ b/extensions/http-curl/tests/C2VerifyHeartbeatAndStop.cpp @@ -162,6 +162,8 @@ class VerifyC2Heartbeat : public HTTPIntegrationBase { std::string url = ""; inv->getProperty(minifi::processors::InvokeHTTP::URL.getName(), url); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.rest.url", "http://localhost:8888/api/heartbeat"); configuration->set("c2.agent.heartbeat.period", "1000"); configuration->set("c2.rest.url.ack", "http://localhost:8888/api/heartbeat"); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/extensions/http-curl/tests/C2VerifyServeResults.cpp ---------------------------------------------------------------------- diff --git a/extensions/http-curl/tests/C2VerifyServeResults.cpp b/extensions/http-curl/tests/C2VerifyServeResults.cpp index 69afb29..1d3e03f 100644 --- a/extensions/http-curl/tests/C2VerifyServeResults.cpp +++ b/extensions/http-curl/tests/C2VerifyServeResults.cpp @@ -51,15 +51,13 @@ #include "HTTPIntegrationBase.h" #include "processors/LogAttribute.h" - class Responder : public CivetHandler { public: explicit Responder(bool isSecure) : isSecure(isSecure) { } bool handlePost(CivetServer *server, struct mg_connection *conn) { - std::string resp = - "{\"operation\" : \"heartbeat\", \"requested_operations\" : [{ \"operationid\" : 41, \"operation\" : \"stop\", \"name\" : \"invoke\" }, " + std::string resp = "{\"operation\" : \"heartbeat\", \"requested_operations\" : [{ \"operationid\" : 41, \"operation\" : \"stop\", \"name\" : \"invoke\" }, " "{ \"operationid\" : 42, \"operation\" : \"stop\", \"name\" : \"FlowController\" } ]}"; mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: " "text/plain\r\nContent-Length: %lu\r\nConnection: close\r\n\r\n", @@ -72,7 +70,6 @@ class Responder : public CivetHandler { bool isSecure; }; - class VerifyC2Server : public HTTPIntegrationBase { public: explicit VerifyC2Server(bool isSecure) @@ -85,7 +82,7 @@ class VerifyC2Server : public HTTPIntegrationBase { LogTestController::getInstance().setDebug<utils::HTTPClient>(); LogTestController::getInstance().setDebug<processors::InvokeHTTP>(); LogTestController::getInstance().setDebug<minifi::c2::RESTReceiver>(); - LogTestController::getInstance().setDebug<minifi::c2::C2Agent>(); + LogTestController::getInstance().setDebug<minifi::c2::C2Agent>(); LogTestController::getInstance().setDebug<processors::LogAttribute>(); LogTestController::getInstance().setDebug<minifi::core::ProcessSession>(); std::fstream file; @@ -116,9 +113,10 @@ class VerifyC2Server : public HTTPIntegrationBase { std::string url = ""; inv->getProperty(minifi::processors::InvokeHTTP::URL.getName(), url); - std::string port, scheme, path; parse_http_components(url, port, scheme, path); + configuration->set("c2.enable", "true"); + configuration->set("c2.agent.class", "test"); configuration->set("c2.agent.heartbeat.reporter.classes", "RESTReceiver"); configuration->set("c2.rest.listener.port", port); configuration->set("c2.agent.heartbeat.period", "10"); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1f2e6006/libminifi/src/FlowController.cpp ---------------------------------------------------------------------- diff --git a/libminifi/src/FlowController.cpp b/libminifi/src/FlowController.cpp index 80f883a..8ee15d4 100644 --- a/libminifi/src/FlowController.cpp +++ b/libminifi/src/FlowController.cpp @@ -356,16 +356,36 @@ void FlowController::initializeC2() { return; std::string c2_enable_str; + std::string class_str; + + // don't need to worry about the return code, only whether class_str is defined. + configuration_->get("nifi.c2.agent.class", "c2.agent.class", class_str); if (configuration_->get(Configure::nifi_c2_enable, "c2.enable", c2_enable_str)) { bool enable_c2 = true; utils::StringUtils::StringToBool(c2_enable_str, enable_c2); c2_enabled_ = enable_c2; - if (!c2_enabled_) { - return; + if (c2_enabled_ && class_str.empty()) { + logger_->log_error("Class name must be defined when C2 is enabled"); + std::cerr << "Class name must be defined when C2 is enabled" << std::endl; + stop(true); + exit(1); } } else { - c2_enabled_ = true; + /** + * To require a C2 agent class we will disable C2 by default. If a registration process + * is implemented we can re-enable. The reason for always enabling C2 is because this allows the controller + * mechanism that can be used for local config/access to be used. Without this agent information cannot be + * gathered even if a remote C2 server is enabled. + * + * The ticket that impacts this, MINIFICPP-664, should be reversed in the event that agent registration + * can be performed and agent classes needn't be defined a priori. + */ + c2_enabled_ = false; + } + + if (!c2_enabled_) { + return; } std::string identifier_str; @@ -424,13 +444,7 @@ void FlowController::initializeC2() { if (identifier != nullptr) { identifier->setIdentifier(identifier_str); - std::string class_str; - if (configuration_->get("nifi.c2.agent.class", class_str) && !class_str.empty()) { - identifier->setAgentClass(class_str); - } else { - // set to the flow controller's identifier - identifier->setAgentClass("default"); - } + identifier->setAgentClass(class_str); } auto monitor = std::dynamic_pointer_cast<state::response::AgentMonitor>(processor);