DISPATCH-557 - Moved management of connections from python agent to router core


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/a38673a6
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/a38673a6
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/a38673a6

Branch: refs/heads/master
Commit: a38673a69f5d7dd2a206a71e9d1bef38711feb53
Parents: 75492de
Author: Ganesh Murthy <gmur...@redhat.com>
Authored: Mon Dec 12 16:30:38 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Jan 3 09:30:24 2017 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router.h        |   1 +
 include/qpid/dispatch/router_core.h   |  32 ++-
 src/CMakeLists.txt                    |   1 +
 src/router_core/agent.c               |  17 +-
 src/router_core/agent_connection.c    | 359 +++++++++++++++++++++++++++++
 src/router_core/agent_connection.h    |  36 +++
 src/router_core/connections.c         |  84 ++++++-
 src/router_core/management_agent.c    |   7 +-
 src/router_core/router_core.c         |   1 +
 src/router_core/router_core_private.h |  19 ++
 src/router_node.c                     |  72 +++++-
 src/server.c                          | 134 -----------
 tests/system_test.py                  |   8 +-
 tests/system_tests_deprecated.py      |   6 +-
 tests/system_tests_management.py      |   2 +-
 tests/system_tests_one_router.py      |   6 +-
 tests/system_tests_qdmanage.py        |  24 +-
 tests/system_tests_sasl_plain.py      |  29 ++-
 tests/system_tests_user_id.py         |  28 +--
 19 files changed, 653 insertions(+), 213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/include/qpid/dispatch/router.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router.h b/include/qpid/dispatch/router.h
index 86e6e6d..78a7599 100644
--- a/include/qpid/dispatch/router.h
+++ b/include/qpid/dispatch/router.h
@@ -32,6 +32,7 @@
 #include <qpid/dispatch/iterator.h>
 #include <stdbool.h>
 
+typedef struct qdr_core_t   qdr_core_t;
 typedef struct qd_router_t  qd_router_t;
 typedef struct qd_address_t qd_address_t;
 typedef struct qd_router_delivery_t qd_router_delivery_t;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h 
b/include/qpid/dispatch/router_core.h
index 3530e14..b7cb224 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -32,13 +32,14 @@
  * exclusive access to that connection.
  */
 
-typedef struct qdr_core_t         qdr_core_t;
-typedef struct qdr_subscription_t qdr_subscription_t;
-typedef struct qdr_connection_t   qdr_connection_t;
-typedef struct qdr_link_t         qdr_link_t;
-typedef struct qdr_delivery_t     qdr_delivery_t;
-typedef struct qdr_terminus_t     qdr_terminus_t;
-typedef struct qdr_error_t        qdr_error_t;
+typedef struct qdr_core_t            qdr_core_t;
+typedef struct qdr_subscription_t    qdr_subscription_t;
+typedef struct qdr_connection_t      qdr_connection_t;
+typedef struct qdr_link_t            qdr_link_t;
+typedef struct qdr_delivery_t        qdr_delivery_t;
+typedef struct qdr_terminus_t        qdr_terminus_t;
+typedef struct qdr_error_t           qdr_error_t;
+typedef struct qdr_connection_info_t qdr_connection_info_t;
 
 typedef enum {
     QD_ROUTER_MODE_STANDALONE,  ///< Standalone router.  No routing protocol 
participation
@@ -140,7 +141,6 @@ typedef enum {
     QDR_ROLE_ON_DEMAND
 } qdr_connection_role_t;
 
-
 /**
  * qdr_connection_opened
  *
@@ -170,7 +170,8 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t          
  *core,
                                         bool                   
strip_annotations_in,
                                         bool                   
strip_annotations_out,
                                         int                    link_capacity,
-                                        const char            *vhost);
+                                        const char            *vhost,
+                                        qdr_connection_info_t 
*connection_info);
 
 /**
  * qdr_connection_closed
@@ -694,4 +695,17 @@ void qdr_query_free(qdr_query_t *query);
 typedef void (*qdr_manage_response_t) (void *context, const qd_amqp_error_t 
*status, bool more);
 void qdr_manage_handler(qdr_core_t *core, qdr_manage_response_t 
response_handler);
 
+qdr_connection_info_t *qdr_connection_info(bool             is_encrypted,
+                                           bool             is_authenticated,
+                                           bool             opened,
+                                           char            *sasl_mechanisms,
+                                           qd_direction_t   dir,
+                                           char            *host,
+                                           char            *ssl_proto,
+                                           char            *ssl_cipher,
+                                           char            *user,
+                                           const char      *container,
+                                           pn_data_t       
*connection_properties,
+                                           int ssl_ssf);
+
 #endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b9c2221..5bafcab 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -70,6 +70,7 @@ set(qpid_dispatch_SOURCES
   router_core/agent_address.c
   router_core/agent_config_address.c
   router_core/agent_config_auto_link.c
+  router_core/agent_connection.c
   router_core/agent_config_link_route.c
   router_core/agent_link.c
   router_core/agent_router.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index d61d478..a150667 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -24,6 +24,7 @@
 #include "agent_address.h"
 #include "agent_link.h"
 #include "agent_router.h"
+#include "agent_connection.h"
 #include "router_core_private.h"
 #include <stdio.h>
 
@@ -139,8 +140,8 @@ void qdr_manage_delete(qdr_core_t *core,
 }
 
 
-void qdr_manage_read(qdr_core_t *core,
-                     void  *context,
+void qdr_manage_read(qdr_core_t              *core,
+                     void                    *context,
                      qd_router_entity_type_t  entity_type,
                      qd_iterator_t           *name,
                      qd_iterator_t           *identity,
@@ -188,8 +189,8 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_set_columns(query, 
attribute_names, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT);  
break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_set_columns(query, 
attribute_names, qdr_config_link_route_columns, 
QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT);  break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  qdr_agent_set_columns(query, 
attribute_names, qdr_config_auto_link_columns, 
QDR_CONFIG_AUTO_LINK_COLUMN_COUNT);  break;
-    case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_ROUTER:            qdr_agent_set_columns(query, 
attribute_names, qdr_router_columns, QDR_ROUTER_COLUMN_COUNT);  break;
+    case QD_ROUTER_CONNECTION:        qdr_agent_set_columns(query, 
attribute_names, qdr_connection_columns, QDR_CONNECTION_COLUMN_COUNT);  break;
     case QD_ROUTER_LINK:              qdr_agent_set_columns(query, 
attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT);  break;
     case QD_ROUTER_ADDRESS:           qdr_agent_set_columns(query, 
attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
     case QD_ROUTER_FORBIDDEN:         break;
@@ -207,8 +208,8 @@ void qdr_query_add_attribute_names(qdr_query_t *query)
     case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_emit_columns(query, 
qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT); break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_emit_columns(query, 
qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT); break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  qdr_agent_emit_columns(query, 
qdr_config_auto_link_columns, QDR_CONFIG_AUTO_LINK_COLUMN_COUNT); break;
-    case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_ROUTER:            qdr_agent_emit_columns(query, 
qdr_router_columns, QDR_ROUTER_COLUMN_COUNT); break;
+    case QD_ROUTER_CONNECTION:        qdr_agent_emit_columns(query, 
qdr_connection_columns, QDR_CONNECTION_COLUMN_COUNT); break;
     case QD_ROUTER_LINK:              qdr_agent_emit_columns(query, 
qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:           qdr_agent_emit_columns(query, 
qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
     case QD_ROUTER_FORBIDDEN:         qd_compose_empty_list(query->body); 
break;
@@ -302,11 +303,11 @@ static void qdr_agent_set_columns(qdr_query_t *query,
             }
         }
     }
+
     if (count == 1 && idx == 1)
         query->columns[idx] = -1;
     else
         query->columns[idx+1] = -1;
-
 }
 
 
@@ -348,8 +349,8 @@ static void qdr_manage_read_CT(qdr_core_t *core, 
qdr_action_t *action, bool disc
     case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_CT(core, name, 
identity, query, qdr_config_address_columns); break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_CT(core, 
name, identity, query, qdr_config_link_route_columns); break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  qdra_config_auto_link_get_CT(core, name, 
identity, query, qdr_config_auto_link_columns); break;
-    case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_ROUTER:            qdr_agent_forbidden(core, query, false); 
break;
+    case QD_ROUTER_CONNECTION:        qdra_connection_get_CT(core, name, 
identity, query, qdr_connection_columns); break;
     case QD_ROUTER_LINK:              break;
     case QD_ROUTER_ADDRESS:           qdra_address_get_CT(core, name, 
identity, query, qdr_address_columns); break;
     case QD_ROUTER_FORBIDDEN:         qdr_agent_forbidden(core, query, false); 
break;
@@ -450,8 +451,8 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, 
qdr_action_t *action, bool
         case QD_ROUTER_CONFIG_ADDRESS:    
qdra_config_address_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONFIG_LINK_ROUTE: 
qdra_config_link_route_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONFIG_AUTO_LINK:  
qdra_config_auto_link_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_ROUTER:            qdra_router_get_first_CT(core, 
query, offset); break;
+        case QD_ROUTER_CONNECTION:        qdra_connection_get_first_CT(core, 
query, offset); break;
         case QD_ROUTER_LINK:              qdra_link_get_first_CT(core, query, 
offset); break;
         case QD_ROUTER_ADDRESS:           qdra_address_get_first_CT(core, 
query, offset); break;
         case QD_ROUTER_FORBIDDEN:         qdr_agent_forbidden(core, query, 
true); break;
@@ -471,8 +472,8 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, 
qdr_action_t *action, bool
         case QD_ROUTER_CONFIG_ADDRESS:    
qdra_config_address_get_next_CT(core, query); break;
         case QD_ROUTER_CONFIG_LINK_ROUTE: 
qdra_config_link_route_get_next_CT(core, query); break;
         case QD_ROUTER_CONFIG_AUTO_LINK:  
qdra_config_auto_link_get_next_CT(core, query); break;
-        case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_ROUTER:            qdra_router_get_next_CT(core, 
query); break;
+        case QD_ROUTER_CONNECTION:        qdra_connection_get_next_CT(core, 
query); break;
         case QD_ROUTER_LINK:              qdra_link_get_next_CT(core, query); 
break;
         case QD_ROUTER_ADDRESS:           qdra_address_get_next_CT(core, 
query); break;
         case QD_ROUTER_FORBIDDEN:         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/agent_connection.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_connection.c 
b/src/router_core/agent_connection.c
new file mode 100644
index 0000000..a2570f5
--- /dev/null
+++ b/src/router_core/agent_connection.c
@@ -0,0 +1,359 @@
+/*
+ * 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/dispatch/ctools.h>
+#include "agent_connection.h"
+#include <inttypes.h>
+#include <stdio.h>
+
+#define QDR_CONNECTION_IDENTITY         0
+#define QDR_CONNECTION_HOST             1
+#define QDR_CONNECTION_ROLE             2
+#define QDR_CONNECTION_DIR              3
+#define QDR_CONNECTION_CONTAINER_ID     4
+#define QDR_CONNECTION_SASL_MECHANISMS  5
+#define QDR_CONNECTION_IS_AUTHENTICATED 6
+#define QDR_CONNECTION_USER             7
+#define QDR_CONNECTION_IS_ENCRYPTED     8
+#define QDR_CONNECTION_SSLPROTO         9
+#define QDR_CONNECTION_SSLCIPHER        10
+#define QDR_CONNECTION_PROPERTIES       11
+#define QDR_CONNECTION_SSLSSF           12
+
+const char * const QDR_CONNECTION_DIR_IN  = "in";
+const char * const QDR_CONNECTION_DIR_OUT = "out";
+
+const char *qdr_connection_roles[] =
+    {"normal",
+     "inter-router",
+     "route-container",
+     "on-demand",
+     0};
+
+const char *qdr_connection_columns[] =
+    {"identity",
+     "host",
+     "role",
+     "dir",
+     "container",
+     "sasl",
+     "isAuthenticated",
+     "user",
+     "isEncrypted",
+     "sslProto",
+     "sslCipher",
+     "properties",
+     "sslSsf",
+     0};
+
+const char *CONFIG_CONNECTION_TYPE = "org.apache.qpid.dispatch.connection";
+
+static void qd_get_next_pn_data(pn_data_t **data, const char **d, int *d1)
+{
+    if (pn_data_next(*data)) {
+        switch (pn_data_type(*data)) {
+            case PN_STRING:
+                *d = pn_data_get_string(*data).start;
+                break;
+            case PN_SYMBOL:
+                *d = pn_data_get_symbol(*data).start;
+                break;
+            case PN_INT:
+                *d1 = pn_data_get_int(*data);
+                break;
+            default:
+                break;
+        }
+    }
+    }
+
+
+static void qdr_connection_insert_column_CT(qdr_connection_t *conn, int col, 
qd_composed_field_t *body, bool as_map)
+{
+    char id_str[100];
+
+    if (as_map)
+        qd_compose_insert_string(body, qdr_connection_columns[col]);
+
+    switch(col) {
+    case QDR_CONNECTION_IDENTITY: {
+        snprintf(id_str, 100, "%"PRId64, conn->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+    }
+
+    case QDR_CONNECTION_HOST:
+        qd_compose_insert_string(body, conn->connection_info->host);
+        break;
+
+    case QDR_CONNECTION_ROLE:
+        qd_compose_insert_string(body, 
qdr_connection_roles[conn->connection_info->role]);
+        break;
+
+    case QDR_CONNECTION_DIR:
+        if (conn->connection_info->dir == QD_INCOMING)
+            qd_compose_insert_string(body, QDR_CONNECTION_DIR_IN);
+        else
+            qd_compose_insert_string(body, QDR_CONNECTION_DIR_OUT);
+        break;
+
+    case QDR_CONNECTION_CONTAINER_ID:
+        if (conn->connection_info->container)
+            qd_compose_insert_string(body, conn->connection_info->container);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONNECTION_SASL_MECHANISMS:
+        if (conn->connection_info->sasl_mechanisms) 
+            qd_compose_insert_string(body, 
conn->connection_info->sasl_mechanisms);
+       else
+           qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONNECTION_IS_AUTHENTICATED:
+        qd_compose_insert_bool(body, conn->connection_info->is_authenticated);
+        break;
+
+    case QDR_CONNECTION_USER:
+        qd_compose_insert_string(body, conn->connection_info->user);
+        break;
+
+    case QDR_CONNECTION_IS_ENCRYPTED:
+        qd_compose_insert_bool(body, conn->connection_info->is_encrypted);
+        break;
+
+    case QDR_CONNECTION_SSLPROTO:
+        if (conn->connection_info->ssl_proto[0] != '\0')
+            qd_compose_insert_string(body, conn->connection_info->ssl_proto);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONNECTION_SSLCIPHER:
+        if (conn->connection_info->ssl_cipher[0] != '\0')
+            qd_compose_insert_string(body, conn->connection_info->ssl_cipher);
+        else
+            qd_compose_insert_null(body);
+        break;
+    case QDR_CONNECTION_SSLSSF:
+        qd_compose_insert_long(body, conn->connection_info->ssl_ssf);
+        break;
+    case QDR_CONNECTION_PROPERTIES: {
+        pn_data_t *data = conn->connection_info->connection_properties;
+        qd_compose_start_map(body);
+        if (data) {
+            pn_data_next(data);
+            size_t count = pn_data_get_map(data);
+            pn_data_enter(data);
+
+            if (count > 0) {
+
+                for (size_t i = 0; i < count/2; i++) {
+                    const char *key   = 0;
+                    // We are assuming for now that all keys are strings
+                    qd_get_next_pn_data(&data, &key, 0);
+
+                    const char *value_string = 0;
+                    int value_int = 0;
+                    // We are assuming for now that all values are either 
strings or integers
+                    qd_get_next_pn_data(&data, &value_string, &value_int);
+
+                    qd_compose_insert_string(body, key);
+
+                    if (value_string)
+                        qd_compose_insert_string(body, value_string);
+                    else if (value_int)
+                        qd_compose_insert_int(body, value_int);
+
+                }
+            }
+
+            pn_data_exit(data);
+
+        }
+        qd_compose_end_map(body);
+    }
+    break;
+    }
+}
+
+
+static void qdr_agent_write_connection_CT(qdr_query_t *query,  
qdr_connection_t *conn)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_connection_insert_column_CT(conn, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+
+static void qdr_manage_advance_connection_CT(qdr_query_t *query, 
qdr_connection_t *conn)
+{
+    query->next_offset++;
+    conn = DEQ_NEXT(conn);
+    query->more = !!conn;
+}
+
+
+void qdra_connection_get_first_CT(qdr_core_t *core, qdr_query_t *query, int 
offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->open_connections)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_connection_t *conn = DEQ_HEAD(core->open_connections);
+    for (int i = 0; i < offset && conn; i++)
+        conn = DEQ_NEXT(conn);
+    assert(conn);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_connection_CT(query, conn);
+
+    //
+    // Advance to the next connection
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_connection_CT(query, conn);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+void qdra_connection_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_connection_t *conn = 0;
+
+    if (query->next_offset < DEQ_SIZE(core->open_connections)) {
+        conn = DEQ_HEAD(core->open_connections);
+        for (int i = 0; i < query->next_offset && conn; i++)
+            conn = DEQ_NEXT(conn);
+    }
+
+    if (conn) {
+        //
+        // Write the columns of the connection entity into the response body.
+        //
+        qdr_agent_write_connection_CT(query, conn);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_connection_CT(query, conn);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+static void qdr_manage_write_connection_map_CT(qdr_core_t          *core,
+                                               qdr_connection_t    *conn,
+                                               qd_composed_field_t *body,
+                                               const char          
*qdr_connection_columns[])
+{
+    qd_compose_start_map(body);
+
+    for(int i = 0; i < QDR_CONNECTION_COLUMN_COUNT; i++) {
+        qd_compose_insert_string(body, qdr_connection_columns[i]);
+        qdr_connection_insert_column_CT(conn, i, body, false);
+    }
+
+    qd_compose_end_map(body);
+}
+
+
+static qdr_connection_t *qdr_connection_find_by_identity_CT(qdr_core_t *core, 
qd_iterator_t *identity)
+{
+    if (!identity)
+        return 0;
+
+    qdr_connection_t *conn = DEQ_HEAD(core->open_connections);
+    while (conn) {
+        // Convert the passed in identity to a char*
+        char id[100];
+        snprintf(id, 100, "%"PRId64, conn->identity);
+        if (qd_iterator_equal(identity, (const unsigned char*) id))
+            break;
+        conn = DEQ_NEXT(conn);
+    }
+
+    return conn;
+
+}
+
+
+void qdra_connection_get_CT(qdr_core_t          *core,
+                            qd_iterator_t *name,
+                            qd_iterator_t *identity,
+                            qdr_query_t         *query,
+                            const char          *qdr_connection_columns[])
+{
+    qdr_connection_t *conn = 0;
+
+    if (!identity) {
+        query->status = QD_AMQP_BAD_REQUEST;
+        query->status.description = "Name not supported. Identity required";
+        qd_log(core->agent_log, QD_LOG_ERROR, "Error performing READ of %s: 
%s", CONFIG_CONNECTION_TYPE, query->status.description);
+    }
+    else {
+        conn = qdr_connection_find_by_identity_CT(core, identity);
+
+        if (conn == 0) {
+            // Send back a 404
+            query->status = QD_AMQP_NOT_FOUND;
+        }
+        else {
+            //
+            // Write the columns of the connection entity into the response 
body.
+            //
+            qdr_manage_write_connection_map_CT(core, conn, query->body, 
qdr_connection_columns);
+            query->status = QD_AMQP_OK;
+        }
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/agent_connection.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_connection.h 
b/src/router_core/agent_connection.h
new file mode 100644
index 0000000..72c15af
--- /dev/null
+++ b/src/router_core/agent_connection.h
@@ -0,0 +1,36 @@
+#ifndef qdr_agent_connection
+#define qdr_agent_connection 1
+/*
+ * 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 "router_core_private.h"
+
+void qdra_connection_get_first_CT(qdr_core_t *core, qdr_query_t *query, int 
offset);
+void qdra_connection_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_connection_get_CT(qdr_core_t          *core,
+                            qd_iterator_t       *name,
+                            qd_iterator_t       *identity,
+                            qdr_query_t         *query,
+                            const char          *qdr_connection_columns[]);
+
+
+#define QDR_CONNECTION_COLUMN_COUNT 13
+const char *qdr_connection_columns[QDR_CONNECTION_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 00e9eb3..6175b85 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -17,10 +17,11 @@
  * under the License.
  */
 
-#include "router_core_private.h"
+#include <qpid/dispatch/router_core.h>
 #include "route_control.h"
 #include <qpid/dispatch/amqp.h>
 #include <stdio.h>
+#include "router_core_private.h"
 
 static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, 
bool discard);
 static void qdr_connection_closed_CT(qdr_core_t *core, qdr_action_t *action, 
bool discard);
@@ -65,12 +66,15 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t          
  *core,
                                         bool                   
strip_annotations_in,
                                         bool                   
strip_annotations_out,
                                         int                    link_capacity,
-                                        const char            *vhost)
+                                        const char            *vhost,
+                                        qdr_connection_info_t *connection_info)
 {
     qdr_action_t     *action = qdr_action(qdr_connection_opened_CT, 
"connection_opened");
     qdr_connection_t *conn   = new_qdr_connection_t();
 
     ZERO(conn);
+    conn->identity              = qdr_identifier(core);
+    conn->connection_info       = connection_info;
     conn->core                  = core;
     conn->user_context          = 0;
     conn->incoming              = incoming;
@@ -83,6 +87,7 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            
*core,
     conn->mask_bit              = -1;
     DEQ_INIT(conn->links);
     DEQ_INIT(conn->work_list);
+    conn->connection_info->role = conn->role;
     conn->work_lock = sys_mutex();
 
     if (vhost) {
@@ -115,6 +120,61 @@ void qdr_connection_set_context(qdr_connection_t *conn, 
void *context)
         conn->user_context = context;
 }
 
+qdr_connection_info_t *qdr_connection_info(bool             is_encrypted,
+                                           bool             is_authenticated,
+                                           bool             opened,
+                                           char            *sasl_mechanisms,
+                                           qd_direction_t   dir,
+                                           char            *host,
+                                           char            *ssl_proto,
+                                           char            *ssl_cipher,
+                                           char            *user,
+                                           const char      *container,
+                                           pn_data_t       
*connection_properties,
+                                           int              ssl_ssf)
+{
+    qdr_connection_info_t *connection_info = new_qdr_connection_info_t();
+    connection_info->is_encrypted          = is_encrypted;
+    connection_info->is_authenticated      = is_authenticated;
+    connection_info->opened                = opened;
+    connection_info->container             = container;
+
+    if (sasl_mechanisms)
+        connection_info->sasl_mechanisms      = strdup(sasl_mechanisms);
+    else
+        connection_info->sasl_mechanisms = 0;
+
+    connection_info->dir = dir;
+
+    if (host)
+        connection_info->host = strdup(host);
+    else
+        connection_info->host = 0;
+
+    if (ssl_proto)
+        connection_info->ssl_proto = strdup(ssl_proto);
+    else
+        connection_info->ssl_proto = 0;
+
+    if (ssl_cipher)
+        connection_info->ssl_cipher = strdup(ssl_cipher);
+    else
+        connection_info->ssl_cipher = 0;
+
+    if (user)
+        connection_info->user = strdup(user);
+    else
+        connection_info->user = 0;
+
+    pn_data_t *qdr_conn_properties = pn_data(0);
+    pn_data_copy(qdr_conn_properties, connection_properties);
+
+    connection_info->connection_properties = qdr_conn_properties;
+    connection_info->ssl_ssf = ssl_ssf;
+
+    return connection_info;
+}
+
 
 void *qdr_connection_get_context(const qdr_connection_t *conn)
 {
@@ -1012,6 +1072,23 @@ static void qdr_connection_opened_CT(qdr_core_t *core, 
qdr_action_t *action, boo
     qdr_field_free(action->args.connection.container_id);
 }
 
+static void qdr_connection_free(qdr_connection_t *conn)
+{
+    if (conn->connection_info) {
+        free(conn->connection_info->sasl_mechanisms);
+        free(conn->connection_info->host);
+        free(conn->connection_info->ssl_proto);
+        free(conn->connection_info->ssl_cipher);
+        free(conn->connection_info->user);
+        pn_data_free(conn->connection_info->connection_properties);
+    }
+
+    free(conn->tenant_space);
+
+    free_qdr_connection_info_t(conn->connection_info);
+    free_qdr_connection_t(conn);
+}
+
 
 static void qdr_connection_closed_CT(qdr_core_t *core, qdr_action_t *action, 
bool discard)
 {
@@ -1071,8 +1148,7 @@ static void qdr_connection_closed_CT(qdr_core_t *core, 
qdr_action_t *action, boo
 
     DEQ_REMOVE(core->open_connections, conn);
     sys_mutex_free(conn->work_lock);
-    free(conn->tenant_space);
-    free_qdr_connection_t(conn);
+    qdr_connection_free(conn);
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c 
b/src/router_core/management_agent.c
index 455337b..52da6a2 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -47,6 +47,7 @@ const unsigned char *address_entity_type        = (unsigned 
char*) "org.apache.q
 const unsigned char *link_entity_type           = (unsigned char*) 
"org.apache.qpid.dispatch.router.link";
 const unsigned char *console_entity_type        = (unsigned char*) 
"org.apache.qpid.dispatch.console";
 const unsigned char *router_entity_type         = (unsigned char*) 
"org.apache.qpid.dispatch.router";
+const unsigned char *connection_entity_type     = (unsigned char*) 
"org.apache.qpid.dispatch.connection";
 
 const char * const status_description = "statusDescription";
 const char * const correlation_id = "correlation-id";
@@ -121,13 +122,10 @@ static void qd_set_response_status(const qd_amqp_error_t 
*error, qd_composed_fie
     //
     *field = qd_compose(QD_PERFORMATIVE_APPLICATION_PROPERTIES, *field);
     qd_compose_start_map(*field);
-
     qd_compose_insert_string(*field, status_description);
     qd_compose_insert_string(*field, error->description);
-
     qd_compose_insert_string(*field, status_code);
     qd_compose_insert_uint(*field, error->status);
-
     qd_compose_end_map(*field);
 }
 
@@ -197,6 +195,7 @@ static void qd_manage_response_handler(void *context, const 
qd_amqp_error_t *sta
 
     // Finally, compose and send the message.
     qd_message_compose_3(ctx->msg, fld, ctx->field);
+
     qdr_send_to1(ctx->core, ctx->msg, reply_to, true, false);
 
     // We have come to the very end. Free the appropriate memory.
@@ -410,6 +409,8 @@ static bool qd_can_handle_request(qd_parsed_field_t         
  *properties_fld,
         *entity_type = QD_ROUTER_ROUTER;
     else if (qd_iterator_equal(qd_parse_raw(parsed_field), 
console_entity_type))
         *entity_type = QD_ROUTER_FORBIDDEN;
+    else if (qd_iterator_equal(qd_parse_raw(parsed_field), 
connection_entity_type))
+        *entity_type = QD_ROUTER_CONNECTION;
     else
         return false;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 635d85c..2227cfb 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,6 +30,7 @@ ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
 ALLOC_DEFINE(qdr_connection_ref_t);
+ALLOC_DEFINE(qdr_connection_info_t);
 
 static void qdr_general_handler(void *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h 
b/src/router_core/router_core_private.h
index 39cf6d1..00f4ff3 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -441,10 +441,28 @@ typedef struct qdr_connection_work_t {
 ALLOC_DECLARE(qdr_connection_work_t);
 DEQ_DECLARE(qdr_connection_work_t, qdr_connection_work_list_t);
 
+struct qdr_connection_info_t {
+    const  char                *container;
+    char                       *sasl_mechanisms;
+    char                       *host;
+    bool                        is_encrypted;
+    char                       *ssl_proto;
+    char                       *ssl_cipher;
+    char                       *user;
+    bool                        is_authenticated;
+    bool                        opened;
+    qd_direction_t              dir;
+    qdr_connection_role_t       role;
+    pn_data_t                  *connection_properties;
+    int                         ssl_ssf; //ssl strength factor
+};
+
+ALLOC_DECLARE(qdr_connection_info_t);
 
 struct qdr_connection_t {
     DEQ_LINKS(qdr_connection_t);
     DEQ_LINKS_N(ACTIVATE, qdr_connection_t);
+    uint64_t                    identity;
     qdr_core_t                 *core;
     void                       *user_context;
     bool                        incoming;
@@ -464,6 +482,7 @@ struct qdr_connection_t {
     qdr_link_ref_list_t         links_with_credit;
     char                       *tenant_space;
     int                         tenant_space_len;
+    qdr_connection_info_t      *connection_info;
 };
 
 ALLOC_DECLARE(qdr_connection_t);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index d027388..75d2101 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -26,6 +26,7 @@
 #include "dispatch_private.h"
 #include "entity_cache.h"
 #include "router_private.h"
+#include <qpid/dispatch/router_core.h>
 
 const char *QD_ROUTER_NODE_TYPE = "router.node";
 const char *QD_ROUTER_ADDRESS_TYPE = "router.address";
@@ -595,15 +596,50 @@ static void AMQP_opened_handler(qd_router_t *router, 
qd_connection_t *conn, bool
     const char            *vhost = 0;
     uint64_t               connection_id = qd_connection_connection_id(conn);
     pn_connection_t       *pn_conn = qd_connection_pn(conn);
+    pn_transport_t *tport = 0;
+    pn_sasl_t      *sasl  = 0;
+    pn_ssl_t       *ssl   = 0;
+    const char     *mech  = 0;
+    const char     *user  = 0;
+    const char *container = conn->pn_conn ? 
pn_connection_remote_container(conn->pn_conn) : 0;
+    if (conn->pn_conn) {
+        tport = pn_connection_transport(conn->pn_conn);
+        ssl   = conn->ssl;
+    }
+    if (tport) {
+        sasl = pn_sasl(tport);
+        if(conn->user_id)
+            user = conn->user_id;
+        else
+            user = pn_transport_get_user(tport);
+    }
+
+    if (sasl)
+        mech = pn_sasl_get_mech(sasl);
+
+    char *host = 0;
+
+    const qd_server_config_t *config;
+    if (conn->connector) {
+        char host_local[255];
+        config = conn->connector->config;
+        snprintf(host_local, strlen(config->host)+strlen(config->port)+2, 
"%s:%s", config->host, config->port);
+        host = &host_local[0];
+    }
+    else
+        host = (char *)qdpn_connector_name(conn->pn_cxtr);
+
 
     qd_router_connection_get_config(conn, &role, &cost, &name, &multi_tenant,
                                     &strip_annotations_in, 
&strip_annotations_out, &link_capacity);
 
+    pn_data_t *props = pn_conn ? pn_connection_remote_properties(pn_conn) : 0;
+
     if (role == QDR_ROLE_INTER_ROUTER) {
         //
         // Check the remote properties for an inter-router cost value.
         //
-        pn_data_t *props = pn_conn ? pn_connection_remote_properties(pn_conn) 
: 0;
+
         if (props) {
             pn_data_rewind(props);
             pn_data_next(props);
@@ -634,10 +670,40 @@ static void AMQP_opened_handler(qd_router_t *router, 
qd_connection_t *conn, bool
     if (multi_tenant)
         vhost = pn_connection_remote_hostname(pn_conn);
 
+    char proto[50];
+    memset(proto, 0, 50);
+    char cipher[50];
+    memset(cipher, 0, 50);
+
+    int ssl_ssf = 0;
+
+    if (ssl) {
+        pn_ssl_get_protocol_name(ssl, proto, 50);
+        pn_ssl_get_cipher_name(ssl, cipher, 50);
+        ssl_ssf = pn_ssl_get_ssf(ssl);
+    }
+
+
+    qdr_connection_info_t *connection_info = qdr_connection_info(tport && 
pn_transport_is_encrypted(tport),
+                                                                 tport && 
pn_transport_is_authenticated(tport),
+                                                                 conn->opened,
+                                                                 (char *)mech,
+                                                                 
conn->connector ? QD_OUTGOING : QD_INCOMING,
+                                                                 host,
+                                                                 proto,
+                                                                 cipher,
+                                                                 (char *)user,
+                                                                 container,
+                                                                 props,
+                                                                 ssl_ssf);
+
     qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, 
inbound, role, cost, connection_id, name,
                                                    
pn_connection_remote_container(pn_conn),
-                                                   strip_annotations_in, 
strip_annotations_out, link_capacity,
-                                                   vhost);
+                                                   strip_annotations_in,
+                                                   strip_annotations_out,
+                                                   link_capacity,
+                                                   vhost,
+                                                   connection_info);
 
     qd_connection_set_context(conn, qdrc);
     qdr_connection_set_context(qdrc, conn);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/src/server.c
----------------------------------------------------------------------
diff --git a/src/server.c b/src/server.c
index 91338a0..4a937cd 100644
--- a/src/server.c
+++ b/src/server.c
@@ -121,19 +121,6 @@ static void qd_transport_tracer(pn_transport_t *transport, 
const char *message)
         qd_log(ctx->server->log_source, QD_LOG_TRACE, "[%"PRIu64"]:%s", 
ctx->connection_id, message);
 }
 
-static qd_error_t connection_entity_update_host(qd_entity_t* entity, 
qd_connection_t *conn)
-{
-    const qd_server_config_t *config;
-    if (conn->connector) {
-        config = conn->connector->config;
-        char host[strlen(config->host)+strlen(config->port)+2];
-        snprintf(host, sizeof(host), "%s:%s", config->host, config->port);
-        return qd_entity_set_string(entity, "host", host);
-    }
-    else
-        return qd_entity_set_string(entity, "host", 
qdpn_connector_name(conn->pn_cxtr));
-}
-
 
 /**
  * Save displayNameService object instance and ImportModule address
@@ -390,131 +377,12 @@ void qd_connection_set_user(qd_connection_t *conn)
 }
 
 
-static void qd_get_next_pn_data(pn_data_t *data, const char **d, int *d1)
-{
-    if (pn_data_next(data)) {
-        switch (pn_data_type(data)) {
-            case PN_STRING:
-                *d = pn_data_get_string(data).start;
-                break;
-            case PN_SYMBOL:
-                *d = pn_data_get_symbol(data).start;
-                break;
-            case PN_INT:
-                *d1 = pn_data_get_int(data);
-                break;
-            default:
-                break;
-        }
-    }
-}
-
-
-/**
- * Obtains the remote connection properties and sets it as a map on the passed 
in entity.
- * @param
- */
-static qd_error_t qd_set_connection_properties(qd_entity_t* entity, 
qd_connection_t *conn)
-{
-    // Get the connection properties and stick it into the entity as a map
-    pn_data_t *data = pn_connection_remote_properties(conn->pn_conn);
-    const char *props = "properties";
-    if (data) {
-        size_t count = pn_data_get_map(data);
-        pn_data_enter(data);
-
-        // Create a new map.
-        qd_error_t error_t = qd_entity_set_map(entity, props);
-
-        if (error_t != QD_ERROR_NONE)
-            return error_t;
-
-        for (size_t i = 0; i < count/2; i++) {
-            const char *key   = 0;
-            // We are assuming for now that all keys are strings
-            qd_get_next_pn_data(data, &key, 0);
-            const char *value_string = 0;
-            int value_int = 0;
-            // We are assuming for now that all values are either strings or 
integers
-            qd_get_next_pn_data(data, &value_string, &value_int);
-
-            if (value_string)
-                error_t = qd_entity_set_map_key_value_string(entity, props, 
key, value_string);
-            else if (value_int)
-                error_t = qd_entity_set_map_key_value_int(entity, props, key, 
value_int);
-
-            if (error_t != QD_ERROR_NONE)
-                return error_t;
-        }
-        pn_data_exit(data);
-    }
-
-    return QD_ERROR_NONE;
-}
-
-
 qd_error_t qd_entity_refresh_sslProfile(qd_entity_t* entity, void *impl)
 {
     return QD_ERROR_NONE;
 }
 
 
-qd_error_t qd_entity_refresh_connection(qd_entity_t* entity, void *impl)
-{
-    qd_connection_t *conn = (qd_connection_t*)impl;
-    pn_transport_t *tport = 0;
-    pn_sasl_t      *sasl  = 0;
-    pn_ssl_t       *ssl   = 0;
-    const char     *mech  = 0;
-    const char     *user  = 0;
-
-    if (conn->pn_conn) {
-        tport = pn_connection_transport(conn->pn_conn);
-        ssl   = conn->ssl;
-    }
-    if (tport) {
-        sasl = pn_sasl(tport);
-        if(conn->user_id)
-            user = conn->user_id;
-        else
-            user = pn_transport_get_user(tport);
-    }
-    if (sasl)
-        mech = pn_sasl_get_mech(sasl);
-
-    if (qd_entity_set_bool(entity, "opened", conn->opened) == 0 &&
-        qd_entity_set_string(entity, "container",
-                             conn->pn_conn ? 
pn_connection_remote_container(conn->pn_conn) : 0) == 0 &&
-        connection_entity_update_host(entity, conn) == 0 &&
-        qd_entity_set_string(entity, "sasl", mech) == 0 &&
-        qd_entity_set_string(entity, "role", conn->role) == 0 &&
-        qd_entity_set_string(entity, "dir", conn->connector ? "out" : "in") == 
0 &&
-        qd_entity_set_string(entity, "user", user) == 0 &&
-        qd_set_connection_properties(entity, conn) == 0 &&
-        qd_entity_set_long(entity, "identity", conn->connection_id) == 0 &&
-        qd_entity_set_bool(entity, "isAuthenticated", tport && 
pn_transport_is_authenticated(tport)) == 0 &&
-        qd_entity_set_bool(entity, "isEncrypted", tport && 
pn_transport_is_encrypted(tport)) == 0 &&
-        qd_entity_set_bool(entity, "ssl", ssl != 0) == 0) {
-
-        if (ssl) {
-            #define SSL_ATTR_SIZE 50
-            char proto[SSL_ATTR_SIZE];
-            char cipher[SSL_ATTR_SIZE];
-            pn_ssl_get_protocol_name(ssl, proto, SSL_ATTR_SIZE);
-            pn_ssl_get_cipher_name(ssl, cipher, SSL_ATTR_SIZE);
-            if (qd_entity_set_string(entity, "sslProto", proto)   == 0 &&
-                qd_entity_set_string(entity, "sslCipher", cipher) == 0 &&
-                qd_entity_set_long(entity, "sslSsf", pn_ssl_get_ssf(ssl)) == 
0) {
-                    return QD_ERROR_NONE;
-            }
-        }
-        else
-            return QD_ERROR_NONE;
-    }
-
-    return qd_error_code();
-}
-
 static qd_error_t listener_setup_ssl(qd_connection_t *ctx, const 
qd_server_config_t *config, pn_transport_t *tport)
 {
     pn_ssl_domain_t *domain = pn_ssl_domain(PN_SSL_MODE_SERVER);
@@ -662,7 +530,6 @@ static void thread_process_listeners_LH(qd_server_t 
*qd_server)
 
         // qd_server->lock is already locked
         DEQ_INSERT_TAIL(qd_server->connections, ctx);
-        qd_entity_cache_add(QD_CONNECTION_TYPE, ctx);
 
         qd_log(qd_server->log_source, QD_LOG_TRACE, "Accepting %s with 
connection id [%"PRIu64"]",
            log_incoming(logbuf, sizeof(logbuf), cxtr), ctx->connection_id);
@@ -1214,7 +1081,6 @@ static void cxtr_try_open(void *context)
     ctx->pn_cxtr = qdpn_connector(ct->server->driver, ct->config->host, 
ct->config->port, ct->config->protocol_family, (void*) ctx);
     if (ctx->pn_cxtr) {
         DEQ_INSERT_TAIL(ct->server->connections, ctx);
-        qd_entity_cache_add(QD_CONNECTION_TYPE, ctx);
     }
     sys_mutex_unlock(ct->server->lock);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_test.py
----------------------------------------------------------------------
diff --git a/tests/system_test.py b/tests/system_test.py
index 7d8c95d..0c67a6e 100755
--- a/tests/system_test.py
+++ b/tests/system_test.py
@@ -341,7 +341,6 @@ class Qdrouterd(Process):
         if wait:
             self.wait_ready()
 
-
     @property
     def management(self):
         """Return a management agent proxy for this router"""
@@ -414,11 +413,10 @@ class Qdrouterd(Process):
         try:
             ret_val = False
             response = 
self.management.query(type="org.apache.qpid.dispatch.connection")
-            index_name = response.attribute_names.index('name')
-            index_identity = response.attribute_names.index('identity')
+            index_host = response.attribute_names.index('host')
             for result in response.results:
-                outs = 'connection/%s:%s:%s' % (host, port, 
str(result[index_identity]))
-                if result[index_name] == outs:
+                outs = '%s:%s' % (host, port)
+                if result[index_host] == outs:
                     ret_val = True
             return ret_val
         except:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_deprecated.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_deprecated.py b/tests/system_tests_deprecated.py
index f66e14a..da7c19a 100644
--- a/tests/system_tests_deprecated.py
+++ b/tests/system_tests_deprecated.py
@@ -100,13 +100,13 @@ class RouterTestDeprecated(RouterTestPlainSaslCommon):
         # ContainerEntity has been deprecated.
 
         # role should be inter-router
-        self.assertEqual(u'inter-router', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][9])
+        self.assertEqual(u'inter-router', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][2])
 
         # sasl must be plain
-        self.assertEqual(u'PLAIN', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][12])
+        self.assertEqual(u'PLAIN', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][5])
 
         # user must be t...@domain.com
-        self.assertEqual(u't...@domain.com', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][16])
+        self.assertEqual(u't...@domain.com', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][7])
 
         # Make sure that the deprecated linkRoutePattern is set up correctly
         query_response = 
local_node.query(type='org.apache.qpid.dispatch.router.config.linkRoute')

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_management.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_management.py b/tests/system_tests_management.py
index 129e70f..19f69fc 100644
--- a/tests/system_tests_management.py
+++ b/tests/system_tests_management.py
@@ -325,7 +325,7 @@ class ManagementTest(system_test.TestCase):
 
     def test_connection(self):
         """Verify there is at least one connection"""
-        response = self.node.query(type='connection')
+        response = self.node.query(type='org.apache.qpid.dispatch.connection')
         self.assertTrue(response.results)
 
     def test_router(self):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_one_router.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_one_router.py b/tests/system_tests_one_router.py
index 0ac4f72..2c0dce9 100644
--- a/tests/system_tests_one_router.py
+++ b/tests/system_tests_one_router.py
@@ -1128,10 +1128,10 @@ class RouterTest(TestCase):
 
         node = Node.connect(self.router.addresses[0])
 
-        results = [[{u'connection': u'properties', u'int_property': 6451}], 
[{}]]
+        results = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'properties']).results
 
-        
self.assertEqual(node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['properties']).results,
-                         results)
+        self.assertEqual(results[0][0][u'connection'], u'properties')
+        self.assertEqual(results[0][0][u'int_property'], 6451)
 
         client.connection.close()
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_qdmanage.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_qdmanage.py b/tests/system_tests_qdmanage.py
index 395d874..dde5df2 100644
--- a/tests/system_tests_qdmanage.py
+++ b/tests/system_tests_qdmanage.py
@@ -284,14 +284,15 @@ class QdmanageTest(TestCase):
         # Re-create the connector and then try wait_connectors
         self.create(long_type, name, str(QdmanageTest.inter_router_port))
 
-        results = json.loads(self.run_qdmanage('QUERY 
--type=org.apache.qpid.dispatch.connection'))
-
+        outputs = json.loads(self.run_qdmanage(query_command))
         created = False
-        for result in results:
-            name = result['name']
-            conn_name = 'connection/0.0.0.0:%s:' % 
QdmanageTest.inter_router_port
-            if conn_name in name:
+        for output in outputs:
+            conn_name = 'connector/127.0.0.1:%s' % 
QdmanageTest.inter_router_port
+            conn_name_1 = 'connector/0.0.0.0:%s' % 
QdmanageTest.inter_router_port
+            if conn_name == output['name'] or conn_name_1 == output['name']:
                 created = True
+                break
+
         self.assertTrue(created)
 
     def test_zzz_add_connector(self):
@@ -424,14 +425,15 @@ class QdmanageTestSsl(QdmanageTest):
         # Re-create the connector and then try wait_connectors
         self.create(long_type, name, str(QdmanageTestSsl.inter_router_port))
 
-        results = json.loads(self.run_qdmanage('QUERY 
--type=org.apache.qpid.dispatch.connection'))
 
+        outputs = json.loads(self.run_qdmanage(query_command))
         created = False
-        for result in results:
-            name = result['name']
-            conn_name = 'connection/0.0.0.0:%s:' % 
QdmanageTestSsl.inter_router_port
-            if conn_name in name:
+        for output in outputs:
+            conn_name = 'connector/127.0.0.1:%s' % 
QdmanageTestSsl.inter_router_port
+            conn_name_1 = 'connector/0.0.0.0:%s' % 
QdmanageTestSsl.inter_router_port
+            if conn_name == output['name'] or conn_name_1 == output['name']:
                 created = True
+                break
         self.assertTrue(created)
 
     def test_create_delete_ssl_profile(self):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_sasl_plain.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_sasl_plain.py b/tests/system_tests_sasl_plain.py
index 17ca86b..4de567d 100644
--- a/tests/system_tests_sasl_plain.py
+++ b/tests/system_tests_sasl_plain.py
@@ -283,16 +283,16 @@ class 
RouterTestPlainSaslOverSsl(RouterTestPlainSaslCommon):
         local_node = Node.connect(self.routers[0].addresses[1], 
timeout=TIMEOUT)
 
         # sslProto should be TLSv1/SSLv3
-        self.assertEqual(u'TLSv1/SSLv3', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][4])
+        self.assertEqual(u'TLSv1/SSLv3', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][9])
 
         # role should be inter-router
-        self.assertEqual(u'inter-router', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][9])
+        self.assertEqual(u'inter-router', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][2])
 
         # sasl must be plain
-        self.assertEqual(u'PLAIN', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][12])
+        self.assertEqual(u'PLAIN', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][5])
 
         # user must be t...@domain.com
-        self.assertEqual(u't...@domain.com', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][16])
+        self.assertEqual(u't...@domain.com', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][7])
 
 
 class RouterTestVerifyHostNameYes(RouterTestPlainSaslCommon):
@@ -373,12 +373,11 @@ class 
RouterTestVerifyHostNameYes(RouterTestPlainSaslCommon):
         # There should be only two connections.
         # There will be no inter-router connection
         self.assertEqual(2, 
len(local_node.query(type='org.apache.qpid.dispatch.connection').results))
-        self.assertEqual('in', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][15])
-        self.assertEqual('normal', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][9])
-        self.assertEqual('anonymous', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][16])
-
-        self.assertEqual('normal', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[1][9])
-        self.assertEqual('anonymous', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[1][16])
+        self.assertEqual('in', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][3])
+        self.assertEqual('normal', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][2])
+        self.assertEqual('anonymous', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[0][7])
+        self.assertEqual('normal', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[1][2])
+        self.assertEqual('anonymous', 
local_node.query(type='org.apache.qpid.dispatch.connection').results[1][7])
 
 class RouterTestVerifyHostNameNo(RouterTestPlainSaslCommon):
 
@@ -471,23 +470,23 @@ class 
RouterTestVerifyHostNameNo(RouterTestPlainSaslCommon):
         found = False
 
         for N in range(0, len(results)):
-            if results[N][0] == search:
+            if results[N][4] == search:
                 found = True
                 break
 
         self.assertTrue(found, "Connection to %s not found" % search)
 
         # sslProto should be TLSv1/SSLv3
-        self.assertEqual(u'TLSv1/SSLv3', results[N][4])
+        self.assertEqual(u'TLSv1/SSLv3', results[N][9])
 
         # role should be inter-router
-        self.assertEqual(u'inter-router', results[N][9])
+        self.assertEqual(u'inter-router', results[N][2])
 
         # sasl must be plain
-        self.assertEqual(u'PLAIN', results[N][12])
+        self.assertEqual(u'PLAIN', results[N][5])
 
         # user must be t...@domain.com
-        self.assertEqual(u't...@domain.com', results[N][16])
+        self.assertEqual(u't...@domain.com', results[N][7])
 
     def test_inter_router_plain_over_ssl_exists(self):
         """

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a38673a6/tests/system_tests_user_id.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_user_id.py b/tests/system_tests_user_id.py
index 1d1d07d..7c71e6a 100644
--- a/tests/system_tests_user_id.py
+++ b/tests/system_tests_user_id.py
@@ -240,72 +240,72 @@ class QdSSLUseridTest(TestCase):
         addr = self.address(0).replace("amqp", "amqps")
 
         node = Node.connect(addr, ssl_domain=domain)
-        user_id = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[0][0]
+        user_id = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[0][0]
         self.assertEqual("3eccbf1a2f3e46da823c63a9da9158983cb495a3", user_id)
 
         addr = self.address(1).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         
self.assertEqual("72d543690cb0a8fc2d0f4c704c65411b9ee8ad53839fced4c720d73e58e4f0d7",
-                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[1][0])
+                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[1][0])
 
         addr = self.address(2).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         
self.assertEqual("c6de3a340014b0f8a1d2b41d22e414fc5756494ffa3c8760bbff56f3aa9f179a5a6eae09413fd7a6afbf36b5fb4bad8795c2836774acfe00a701797cc2a3a9ab",
-                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[2][0])
+                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[2][0])
 
         addr = self.address(3).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         
self.assertEqual("72d543690cb0a8fc2d0f4c704c65411b9ee8ad53839fced4c720d73e58e4f0d7;127.0.0.1;Client;Dev;US;NC",
-                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[3][0])
+                         
node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[3][0])
 
         addr = self.address(4).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         self.assertEqual("3eccbf1a2f3e46da823c63a9da9158983cb495a3;US;NC",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[4][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[4][0])
 
         addr = self.address(5).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         
self.assertEqual("US;NC;c6de3a340014b0f8a1d2b41d22e414fc5756494ffa3c8760bbff56f3aa9f179a5a6eae09413fd7a6afbf36b5fb4bad8795c2836774acfe00a701797cc2a3a9ab",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[5][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[5][0])
 
         addr = self.address(6).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         self.assertEqual("127.0.0.1;NC;Dev;US;Client",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[6][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[6][0])
 
         addr = self.address(7).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         self.assertEqual("NC;US;Client;Dev;127.0.0.1;Raleigh",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[7][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[7][0])
 
         addr = self.address(8).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         self.assertEqual("C=US,ST=NC,L=Raleigh,OU=Dev,O=Client,CN=127.0.0.1",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[8][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[8][0])
 
         addr = self.address(9).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
         self.assertEqual("C=US,ST=NC,L=Raleigh,OU=Dev,O=Client,CN=127.0.0.1",
-        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[9][0])
+        node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[9][0])
 
         addr = self.address(10).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
-        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[10][0]
+        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[10][0]
         self.assertEqual("C=US,ST=NC,L=Raleigh,OU=Dev,O=Client,CN=127.0.0.1", 
str(user))
 
         addr = self.address(11).replace("amqp", "amqps")
         node = Node.connect(addr)
-        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[11][0]
+        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[11][0]
         self.assertEqual("anonymous", user)
 
         addr = self.address(12).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
-        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[12][0]
+        user = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[12][0]
         self.assertEqual("user12", str(user))
 
         addr = self.address(13).replace("amqp", "amqps")
         node = Node.connect(addr, ssl_domain=domain)
-        user_id = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=['user']).results[13][0]
+        user_id = node.query(type='org.apache.qpid.dispatch.connection', 
attribute_names=[u'user']).results[13][0]
         self.assertEqual("user13", user_id)
 
         node.close()


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to