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