blob: c6b6f04cd6c8395a664a8daadaa67400b1e087d8 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIBMINIFI_INCLUDE_CORE_CONTROLLER_CONTROLLERSERVICEPROVIDER_H_
#define LIBMINIFI_INCLUDE_CORE_CONTROLLER_CONTROLLERSERVICEPROVIDER_H_
#include <memory>
#include <string>
#include <utility>
#include <future>
#include <vector>
#include "core/Core.h"
#include "ControllerServiceLookup.h"
#include "core/ConfigurableComponent.h"
#include "ControllerServiceNode.h"
#include "ControllerServiceMap.h"
#include "core/ClassLoader.h"
#include "utils/Monitors.h"
namespace org {
namespace apache {
namespace nifi {
namespace minifi {
namespace core {
namespace controller {
class ControllerServiceProvider : public CoreComponent, public ConfigurableComponent, public ControllerServiceLookup {
public:
explicit ControllerServiceProvider(const std::string &name)
: CoreComponent(name),
ConfigurableComponent() {
controller_map_ = std::make_shared<ControllerServiceMap>();
}
explicit ControllerServiceProvider(std::shared_ptr<ControllerServiceMap> services)
: CoreComponent(core::getClassName<ControllerServiceProvider>()),
ConfigurableComponent(),
controller_map_(services) {
}
explicit ControllerServiceProvider(const std::string &name, std::shared_ptr<ControllerServiceMap> services)
: CoreComponent(name),
ConfigurableComponent(),
controller_map_(services) {
}
explicit ControllerServiceProvider(const ControllerServiceProvider &&other)
: CoreComponent(std::move(other)),
ConfigurableComponent(std::move(other)),
controller_map_(std::move(other.controller_map_)) {
}
virtual ~ControllerServiceProvider() = default;
/**
* Creates a controller service node wrapping the controller service
*
* @param type service type.
* @param id controller service identifier.
* @return shared pointer to the controller service node.
*/
virtual std::shared_ptr<ControllerServiceNode> createControllerService(const std::string &type, const std::string &longType, const std::string &id, bool firstTimeAdded) = 0;
/**
* Gets a controller service node wrapping the controller service
*
* @param type service type.
* @param id controller service identifier.
* @return shared pointer to the controller service node.
*/
virtual std::shared_ptr<ControllerServiceNode> getControllerServiceNode(const std::string &id) const {
return controller_map_->getControllerServiceNode(id);
}
/**
* Removes a controller service.
* @param serviceNode controller service node.
*/
virtual void removeControllerService(const std::shared_ptr<ControllerServiceNode> &serviceNode) {
controller_map_->removeControllerService(serviceNode);
}
/**
* Enables the provided controller service
* @param serviceNode controller service node.
*/
virtual std::future<utils::TaskRescheduleInfo> enableControllerService(std::shared_ptr<ControllerServiceNode> &serviceNode) = 0;
/**
* Enables the provided controller service nodes
* @param serviceNode controller service node.
*/
virtual void enableControllerServices(std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> serviceNodes) = 0;
/**
* Disables the provided controller service node
* @param serviceNode controller service node.
*/
virtual std::future<utils::TaskRescheduleInfo> disableControllerService(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Removes all controller services.
*/
virtual void clearControllerServices() = 0;
/**
* Gets a list of all controller services.
*/
virtual std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> getAllControllerServices() {
return controller_map_->getAllControllerServices();
}
/**
* Verifies that referencing components can be stopped for the controller service
*/
virtual void verifyCanStopReferencingComponents(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Unschedules referencing components.
*/
virtual std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> unscheduleReferencingComponents(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Verifies referencing components for <code>serviceNode</code> can be disabled.
* @param serviceNode shared pointer to a controller service node.
*/
virtual void verifyCanDisableReferencingServices(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Disables referencing components for <code>serviceNode</code> can be disabled.
* @param serviceNode shared pointer to a controller service node.
*/
virtual std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> disableReferencingServices(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) {
return std::vector<std::shared_ptr<core::controller::ControllerServiceNode>>();
}
/**
* Verifies referencing components for <code>serviceNode</code> can be enabled.
* @param serviceNode shared pointer to a controller service node.
*/
virtual void verifyCanEnableReferencingServices(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) {
std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> references = findLinkedComponents(serviceNode);
for (auto ref : references) {
ref->canEnable();
}
}
/**
* Enables referencing components for <code>serviceNode</code> can be Enabled.
* @param serviceNode shared pointer to a controller service node.
*/
virtual std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> enableReferencingServices(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Schedules the service node and referencing components.
* @param serviceNode shared pointer to a controller service node.
*/
virtual std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> scheduleReferencingComponents(std::shared_ptr<core::controller::ControllerServiceNode> &serviceNode) = 0;
/**
* Returns a controller service for the service identifier and componentID
* @param service Identifier service identifier.
*/
virtual std::shared_ptr<ControllerService> getControllerServiceForComponent(const std::string &serviceIdentifier, const utils::Identifier &componentId) {
std::shared_ptr<ControllerService> node = getControllerService(serviceIdentifier);
return node;
}
/**
* Gets the controller service for the provided identifier
* @param identifier service identifier.
*/
virtual std::shared_ptr<ControllerService> getControllerService(const std::string &identifier);
/**
* Determines if Controller service is enabled.
* @param identifier service identifier.
*/
virtual bool isControllerServiceEnabled(const std::string &identifier) {
std::shared_ptr<ControllerServiceNode> node = getControllerServiceNode(identifier);
if (nullptr != node) {
return linkedServicesAre(ENABLED, node);
} else {
return false;
}
}
/**
* Determines if Controller service is being enabled.
* @param identifier service identifier.
*/
virtual bool isControllerServiceEnabling(const std::string &identifier) {
std::shared_ptr<ControllerServiceNode> node = getControllerServiceNode(identifier);
if (nullptr != node) {
return linkedServicesAre(ENABLING, node);
} else {
return false;
}
}
virtual const std::string getControllerServiceName(const std::string &identifier) {
std::shared_ptr<ControllerService> node = getControllerService(identifier);
if (nullptr != node) {
return node->getName();
} else {
return "";
}
}
virtual void enableAllControllerServices() = 0;
virtual void disableAllControllerServices() = 0;
virtual bool supportsDynamicProperties() {
return false;
}
protected:
/**
* verifies that linked services match the provided state.
*/
inline bool linkedServicesAre(ControllerServiceState state, const std::shared_ptr<ControllerServiceNode> &node) {
if (node->getControllerServiceImplementation()->getState() == state) {
for (auto child_service : node->getLinkedControllerServices()) {
if (child_service->getControllerServiceImplementation()->getState() != state) {
return false;
}
}
return true;
} else {
return false;
}
}
bool canEdit() {
return true;
}
/**
* Finds linked components
* @param referenceNode reference node from whcih we will find linked references.
*/
std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> findLinkedComponents(std::shared_ptr<core::controller::ControllerServiceNode> &referenceNode) {
std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> references;
for (std::shared_ptr<core::controller::ControllerServiceNode> linked_node : referenceNode->getLinkedControllerServices()) {
references.push_back(linked_node);
std::vector<std::shared_ptr<core::controller::ControllerServiceNode>> linked_references = findLinkedComponents(linked_node);
auto removal_predicate = [&linked_references](std::shared_ptr<core::controller::ControllerServiceNode> key) ->bool {
return std::find(linked_references.begin(), linked_references.end(), key) != linked_references.end();
};
references.erase(std::remove_if(references.begin(), references.end(), removal_predicate), references.end());
references.insert(std::end(references), linked_references.begin(), linked_references.end());
}
return references;
}
std::shared_ptr<ControllerServiceMap> controller_map_;
};
} // namespace controller
} // namespace core
} // namespace minifi
} // namespace nifi
} // namespace apache
} // namespace org
#endif // LIBMINIFI_INCLUDE_CORE_CONTROLLER_CONTROLLERSERVICEPROVIDER_H_