Author: tross
Date: Thu Nov 13 14:04:59 2008
New Revision: 713838

URL: http://svn.apache.org/viewvc?rev=713838&view=rev
Log:
QPID-1461 - Added qmf event support for connections.

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.h
    incubator/qpid/trunk/qpid/specs/management-schema.xml

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.cpp Thu Nov 13 
14:04:59 2008
@@ -25,8 +25,9 @@
 #include "qpid/log/Statement.h"
 #include "qpid/ptr_map.h"
 #include "qpid/framing/AMQP_ClientProxy.h"
-#include "qpid/agent/ManagementAgent.h"
 #include "qpid/framing/enum.h"
+#include "qmf/org/apache/qpid/broker/EventClientConnect.h"
+#include "qmf/org/apache/qpid/broker/EventClientDisconnect.h"
 
 #include <boost/bind.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
@@ -55,7 +56,8 @@
     mgmtClosing(false),
     mgmtId(mgmtId_),
     mgmtObject(0),
-    links(broker_.getLinks())
+    links(broker_.getLinks()),
+    agent(0)
 {
     Manageable* parent = broker.GetVhostObject();
 
@@ -64,7 +66,7 @@
 
     if (parent != 0)
     {
-        ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+        agent = ManagementAgent::Singleton::getInstance();
                
                
         // TODO set last bool true if system connection
@@ -83,8 +85,11 @@
 
 Connection::~Connection()
 {
-    if (mgmtObject != 0)
+    if (mgmtObject != 0) {
         mgmtObject->resourceDestroy();
+        if (!isLink)
+            agent->raiseEvent(_qmf::EventClientDisconnect(mgmtId, 
ConnectionState::getUserId()));
+    }
     if (isLink)
         links.notifyClosed(mgmtId);
 }
@@ -153,8 +158,10 @@
 void Connection::setUserId(const string& userId)
 {
     ConnectionState::setUserId(userId);
-    if (mgmtObject != 0)
+    if (mgmtObject != 0) {
         mgmtObject->set_authIdentity(userId);
+        agent->raiseEvent(_qmf::EventClientConnect(mgmtId, userId));
+    }
 }
 
 void Connection::setFederationLink(bool b)

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h Thu Nov 13 
14:04:59 2008
@@ -39,6 +39,7 @@
 #include "qpid/framing/AMQP_ClientProxy.h"
 #include "qpid/framing/AMQP_ServerOperations.h"
 #include "qpid/framing/ProtocolVersion.h"
+#include "qpid/agent/ManagementAgent.h"
 #include "qpid/management/Manageable.h"
 #include "qpid/ptr_map.h"
 #include "qpid/sys/AggregateOutput.h"
@@ -93,6 +94,9 @@
     std::string getAuthCredentials();
     void notifyConnectionForced(const std::string& text);
     void setUserId(const string& uid);
+    const std::string& getUserId() const { return 
ConnectionState::getUserId(); }
+    const std::string& getMgmtId() const { return mgmtId; }
+    management::ManagementAgent* getAgent() const { return agent; }
     void setFederationLink(bool b);
 
     template <class F> void eachSessionHandler(F f) {
@@ -115,6 +119,7 @@
     boost::function0<void> ioCallback;
     qmf::org::apache::qpid::broker::Connection* mgmtObject;
     LinkRegistry& links;
+    management::ManagementAgent* agent;
 };
 
 }}

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp Thu Nov 
13 14:04:59 2008
@@ -28,11 +28,12 @@
 #include "qpid/log/Statement.h"
 #include "qpid/Url.h"
 #include "AclModule.h"
+#include "qmf/org/apache/qpid/broker/EventClientConnectFail.h"
 
 using namespace qpid;
 using namespace qpid::broker;
 using namespace qpid::framing;
-
+namespace _qmf = qmf::org::apache::qpid::broker;
 
 namespace
 {
@@ -103,7 +104,19 @@
                                          const string& response,
                                          const string& /*locale*/)
 {
-    authenticator->start(mechanism, response);
+    try {
+        authenticator->start(mechanism, response);
+    } catch (std::exception& e) {
+        management::ManagementAgent* agent = connection.getAgent();
+        if (agent) {
+            string error;
+            string uid;
+            authenticator->getError(error);
+            authenticator->getUid(uid);
+            
agent->raiseEvent(_qmf::EventClientConnectFail(connection.getMgmtId(), uid, 
error));
+        }
+        throw;
+    }
     connection.setFederationLink(clientProperties.get(QPID_FED_LINK));
     
connection.setFederationPeerTag(clientProperties.getAsString(QPID_FED_TAG));
     if (connection.isFederationLink()) {
@@ -117,7 +130,19 @@
 
 void ConnectionHandler::Handler::secureOk(const string& response)
 {
-    authenticator->step(response);
+    try {
+        authenticator->step(response);
+    } catch (std::exception& e) {
+        management::ManagementAgent* agent = connection.getAgent();
+        if (agent) {
+            string error;
+            string uid;
+            authenticator->getError(error);
+            authenticator->getUid(uid);
+            
agent->raiseEvent(_qmf::EventClientConnectFail(connection.getMgmtId(), uid, 
error));
+        }
+        throw;
+    }
 }
 
 void ConnectionHandler::Handler::tuneOk(uint16_t /*channelmax*/,

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.cpp?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.cpp Thu Nov 13 14:04:59 
2008
@@ -23,7 +23,8 @@
 #include "LinkRegistry.h"
 #include "Broker.h"
 #include "Connection.h"
-#include "qpid/agent/ManagementAgent.h"
+#include "qmf/org/apache/qpid/broker/EventBrokerLinkUp.h"
+#include "qmf/org/apache/qpid/broker/EventBrokerLinkDown.h"
 #include "boost/bind.hpp"
 #include "qpid/log/Statement.h"
 #include "qpid/framing/enum.h"
@@ -40,6 +41,7 @@
 using qpid::management::Manageable;
 using qpid::management::Args;
 using qpid::sys::Mutex;
+using std::stringstream;
 namespace _qmf = qmf::org::apache::qpid::broker;
 
 Link::Link(LinkRegistry*  _links,
@@ -62,11 +64,12 @@
       currentInterval(1),
       closing(false),
       channelCounter(1),
-      connection(0)
+      connection(0),
+      agent(0)
 {
     if (parent != 0)
     {
-        ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+        agent = ManagementAgent::Singleton::getInstance();
         if (agent != 0)
         {
             mgmtObject = new _qmf::Link(agent, this, parent, _host, _port, 
_transport, _durable);
@@ -123,8 +126,11 @@
 void Link::established ()
 {
     Mutex::ScopedLock mutex(lock);
+    stringstream addr;
+    addr << host << ":" << port;
 
-    QPID_LOG (info, "Inter-broker link established to " << host << ":" << 
port);
+    QPID_LOG (info, "Inter-broker link established to " << addr.str());
+    agent->raiseEvent(_qmf::EventBrokerLinkUp(addr.str()));
     setStateLH(STATE_OPERATIONAL);
     currentInterval = 1;
     visitCount      = 0;
@@ -138,8 +144,12 @@
 
     connection = 0;
 
-    if (state == STATE_OPERATIONAL)
-        QPID_LOG (warning, "Inter-broker link disconnected from " << host << 
":" << port);
+    if (state == STATE_OPERATIONAL) {
+        stringstream addr;
+        addr << host << ":" << port;
+        QPID_LOG (warning, "Inter-broker link disconnected from " << 
addr.str());
+        agent->raiseEvent(_qmf::EventBrokerLinkDown(addr.str()));
+    }
 
     for (Bridges::iterator i = active.begin(); i != active.end(); i++) {
         (*i)->cancel();

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.h?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Link.h Thu Nov 13 14:04:59 
2008
@@ -29,6 +29,7 @@
 #include "qpid/sys/Mutex.h"
 #include "qpid/framing/FieldTable.h"
 #include "qpid/management/Manageable.h"
+#include "qpid/agent/ManagementAgent.h"
 #include "qmf/org/apache/qpid/broker/Link.h"
 #include <boost/ptr_container/ptr_vector.hpp>
 
@@ -65,6 +66,7 @@
             Bridges active;    // Bridges active
             uint channelCounter;
             Connection* connection;
+            management::ManagementAgent* agent;
 
             static const int STATE_WAITING     = 1;
             static const int STATE_CONNECTING  = 2;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp Thu Nov 
13 14:04:59 2008
@@ -70,6 +70,8 @@
     void getMechanisms(framing::Array& mechanisms);
     void start(const std::string& mechanism, const std::string& response);
     void step(const std::string& response);
+    void getUid(std::string& uid);
+    void getError(std::string& error);
 };
 
 bool SaslAuthenticator::available(void)
@@ -202,6 +204,23 @@
     }
 }
 
+void CyrusAuthenticator::getError(string& error)
+{
+    error = string(sasl_errdetail(sasl_conn));
+}
+
+void CyrusAuthenticator::getUid(string& uid)
+{
+    int code;
+    const void* ptr;
+
+    code = sasl_getprop(sasl_conn, SASL_USERNAME, &ptr);
+    if (SASL_OK != code)
+        return;
+
+    uid = string(const_cast<char*>(static_cast<const char*>(ptr)));
+}
+
 void CyrusAuthenticator::getMechanisms(Array& mechanisms)
 {
     const char *separator = " ";

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.h?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SaslAuthenticator.h Thu Nov 
13 14:04:59 2008
@@ -38,6 +38,8 @@
     virtual void getMechanisms(framing::Array& mechanisms) = 0;
     virtual void start(const std::string& mechanism, const std::string& 
response) = 0;
     virtual void step(const std::string& response) = 0;
+    virtual void getUid(std::string&) {}
+    virtual void getError(std::string&) {}
 
     static bool available(void);
 

Modified: incubator/qpid/trunk/qpid/specs/management-schema.xml
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/specs/management-schema.xml?rev=713838&r1=713837&r2=713838&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/specs/management-schema.xml (original)
+++ incubator/qpid/trunk/qpid/specs/management-schema.xml Thu Nov 13 14:04:59 
2008
@@ -307,18 +307,18 @@
     <arg name="exName"  type="sstr"   desc="Name of an exchange"/>
     <arg name="exType"  type="sstr"   desc="Type of an exchange"/>
     <arg name="excl"    type="bool"   desc="Created object is exclusive for 
the use of the owner only"/>
-    <arg name="key"     type="sstr"   desc="Key text used for routing or 
binding"/>
+    <arg name="key"     type="lstr"   desc="Key text used for routing or 
binding"/>
     <arg name="qName"   type="sstr"   desc="Name of a queue"/>
+    <arg name="reason"  type="lstr"   desc="Reason for a failure"/>
     <arg name="rhost"   type="sstr"   desc="Address (i.e. DNS name, IP 
address, etc.) of a remotely connected host"/>
     <arg name="user"    type="sstr"   desc="Authentication identity"/>
   </eventArguments>
 
   <event name="clientConnect"     sev="inform" args="rhost, user"/>
+  <event name="clientConnectFail" sev="warn"   args="rhost, user, reason"/>
   <event name="clientDisconnect"  sev="inform" args="rhost, user"/>
-  <event name="agentConnect"      sev="inform" args="rhost, user"/>
-  <event name="agentDisconnect"   sev="inform" args="rhost, user"/>
-  <event name="brokerConnect"     sev="inform" args="rhost, user"/>
-  <event name="brokerDisconnect"  sev="inform" args="rhost, user"/>
+  <event name="brokerLinkUp"      sev="inform" args="rhost"/>
+  <event name="brokerLinkDown"    sev="warn"   args="rhost"/>
   <event name="queueDeclare"      sev="inform" args="rhost, user, qName, 
durable, excl, autoDel, args, disp"/>
   <event name="queueDelete"       sev="inform" args="rhost, user, qName"/>
   <event name="exchangeDeclare"   sev="inform" args="rhost, user, exName, 
exType, altEx, durable, autoDel, args, disp"/>


Reply via email to