#ifndef _qpid_agent_ManagementAgent_ #define _qpid_agent_ManagementAgent_ // // 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. // #include "qpid/agent/QmfAgentImportExport.h" #include "qpid/management/ManagementObject.h" #include "qpid/management/ManagementEvent.h" #include "qpid/management/Manageable.h" #include "qpid/management/ConnectionSettings.h" namespace qpid { namespace management { class Notifyable { public: virtual ~Notifyable() {} virtual void notify() = 0; }; class ManagementAgent { public: class Singleton { public: QMF_AGENT_EXTERN Singleton(bool disableManagement = false); QMF_AGENT_EXTERN ~Singleton(); QMF_AGENT_EXTERN static ManagementAgent* getInstance(); }; typedef enum { SEV_EMERG = 0, SEV_ALERT = 1, SEV_CRIT = 2, SEV_ERROR = 3, SEV_WARN = 4, SEV_NOTE = 5, SEV_INFO = 6, SEV_DEBUG = 7, SEV_DEFAULT = 8 } severity_t; ManagementAgent() {} virtual ~ManagementAgent() {} virtual int getMaxThreads() = 0; // Set the name of the agent // // vendor - Vendor name or domain (i.e. "apache.org") // product - Product name (i.e. "qpid") // instance - A unique identifier for this instance of the agent. // If empty, the agent will create a GUID for the instance. // Note: the ":" character is reserved - do no use it in the vendor or product name. // virtual void setName(const std::string& vendor, const std::string& product, const std::string& instance="") = 0; // Retrieve the name of the agent as assigned by setName() // virtual void getName(std::string& vendor, std::string& product, std::string& instance) = 0; // Obtain the fully qualified name of the agent // virtual const std::string& getAddress() = 0; // Connect to a management broker // // brokerHost - Hostname or IP address (dotted-quad) of broker. // // brokerPort - TCP port of broker. // // intervalSeconds - The interval (in seconds) that this agent shall use // between broadcast updates to the broker. // // useExternalThread - If true, the thread of control used for callbacks // must be supplied by the user of the object (via the // pollCallbacks method). // // If false, callbacks shall be invoked on the management // agent's thread. In this case, the callback implementations // MUST be thread safe. // // storeFile - File where this process has read and write access. This // file shall be used to store persistent state. // virtual void init(const std::string& brokerHost = "localhost", uint16_t brokerPort = 5672, uint16_t intervalSeconds = 10, bool useExternalThread = false, const std::string& storeFile = "", const std::string& uid = "guest", const std::string& pwd = "guest", const std::string& mech = "PLAIN", const std::string& proto = "tcp") = 0; virtual void init(const management::ConnectionSettings& settings, uint16_t intervalSeconds = 10, bool useExternalThread = false, const std::string& storeFile = "") = 0; // Register a schema with the management agent. This is normally called by the // package initializer generated by the management code generator. // virtual void registerClass(const std::string& packageName, const std::string& className, uint8_t* md5Sum, management::ManagementObject::writeSchemaCall_t schemaCall) = 0; virtual void registerEvent(const std::string& packageName, const std::string& eventName, uint8_t* md5Sum, management::ManagementEvent::writeSchemaCall_t schemaCall) = 0; // Add a management object to the agent. Once added, this object shall be visible // in the greater management context. // // Please note that ManagementObject instances are not explicitly deleted from // the management agent. When the core object represented by a management object // is deleted, the "resourceDestroy" method on the management object must be called. // It will then be reclaimed in due course by the management agent. // // Once a ManagementObject instance is added to the agent, the agent then owns the // instance. The caller MUST NOT free the resources of the instance at any time. // When it is no longer needed, invoke its "resourceDestroy" method and discard the // pointer. This allows the management agent to report the deletion of the object // in an orderly way. // virtual ObjectId addObject(ManagementObject* objectPtr, uint64_t persistId = 0) = 0; virtual ObjectId addObject(ManagementObject* objectPtr, const std::string& key, bool persistent = true) = 0; // // virtual void raiseEvent(const ManagementEvent& event, severity_t severity = SEV_DEFAULT) = 0; // If "useExternalThread" was set to true in init, this method must // be called to provide a thread for any pending method calls that have arrived. // The method calls for ManagementObject instances shall be invoked synchronously // during the execution of this method. // // callLimit may optionally be used to limit the number of callbacks invoked. // if 0, no limit is imposed. // // The return value is the number of callbacks that remain queued after this // call is complete. It can be used to determine whether or not further calls // to pollCallbacks are necessary to clear the backlog. If callLimit is zero, // the return value will also be zero. // virtual uint32_t pollCallbacks(uint32_t callLimit = 0) = 0; // In the "useExternalThread" scenario, there are three ways that an application can // use to be notified that there is work to do. Of course the application may periodically // call pollCallbacks if it wishes, but this will cause long latencies in the responses // to method calls. // // The notification methods are: // // 1) Register a C-style callback by providing a pointer to a function // 2) Register a C++-style callback by providing an object of a class that is derived // from Notifyable // 3) Call getSignalFd() to get a file descriptor that can be used in a select // call. The file descriptor shall become readable when the agent has work to // do. Note that this mechanism is specific to Posix-based operating environments. // getSignalFd will probably not function correctly on Windows. // // If a callback is registered, the callback function will be called on the agent's // thread. The callback function must perform no work other than to signal the application // thread to call pollCallbacks. // typedef void (*cb_t)(void*); virtual void setSignalCallback(cb_t callback, void* context) = 0; virtual void setSignalCallback(Notifyable& notifyable) = 0; virtual int getSignalFd() = 0; }; }} #endif /*!_qpid_agent_ManagementAgent_*/