Add CEL local optimization record type

This adds a new CEL event type, AST_CEL_LOCAL_OPTIMIZE, to represent
local channel optimizations. Local channel optimizations were one of
several things conveyed by the now defunct BRIDGE_UPDATE event type.
This also adds a unit test to test generation of this new CEL event.

Review: https://reviewboard.asterisk.org/r/2676/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@394870 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/78/78/1
Kinsey Moore 12 years ago
parent 684c83b29b
commit c3b8939be8

@ -337,6 +337,10 @@ CEL (Channel Event Logging)
and a channel running an app, the 'extra' JSON blob contains the primary and a channel running an app, the 'extra' JSON blob contains the primary
bridge unique identifier, the secondary channel name, and the app name. bridge unique identifier, the secondary channel name, and the app name.
* AST_CEL_LOCAL_OPTIMIZE events have been added to convey local channel
optimizations with the record occurring for the semi-one channel and
the semi-two channel name in the peer field.
Features Features
------------------- -------------------
* The BRIDGE_FEATURES channel variable would previously only set features for * The BRIDGE_FEATURES channel variable would previously only set features for

@ -87,6 +87,8 @@ enum ast_cel_event_type {
AST_CEL_FORWARD = 25, AST_CEL_FORWARD = 25,
/*! \brief a bridge turned into a conference and will be treated as such until it is torn down */ /*! \brief a bridge turned into a conference and will be treated as such until it is torn down */
AST_CEL_BRIDGE_TO_CONF = 26, AST_CEL_BRIDGE_TO_CONF = 26,
/*! \brief A local channel optimization occurred */
AST_CEL_LOCAL_OPTIMIZE = 27,
}; };
/*! /*!

@ -4341,12 +4341,12 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
if (ast_cel_engine_init()) { if (ast_local_init()) {
printf("%s", term_quit()); printf("%s", term_quit());
exit(1); exit(1);
} }
if (ast_local_init()) { if (ast_cel_engine_init()) {
printf("%s", term_quit()); printf("%s", term_quit());
exit(1); exit(1);
} }

@ -62,6 +62,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/bridging.h" #include "asterisk/bridging.h"
#include "asterisk/parking.h" #include "asterisk/parking.h"
#include "asterisk/features.h" #include "asterisk/features.h"
#include "asterisk/core_local.h"
/*** DOCUMENTATION /*** DOCUMENTATION
<configInfo name="cel" language="en_US"> <configInfo name="cel" language="en_US">
@ -113,7 +114,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name="3WAY_END"/> <enum name="3WAY_END"/>
<enum name="HOOKFLASH"/> <enum name="HOOKFLASH"/>
<enum name="LINKEDID_END"/> <enum name="LINKEDID_END"/>
<enum name="LOCAL_OPTIMIZE"/>
</enumlist> </enumlist>
</description> </description>
</configOption> </configOption>
@ -319,6 +320,7 @@ static const char * const cel_event_types[CEL_MAX_EVENT_IDS] = {
[AST_CEL_3WAY_END] = "3WAY_END", [AST_CEL_3WAY_END] = "3WAY_END",
[AST_CEL_HOOKFLASH] = "HOOKFLASH", [AST_CEL_HOOKFLASH] = "HOOKFLASH",
[AST_CEL_LINKEDID_END] = "LINKEDID_END", [AST_CEL_LINKEDID_END] = "LINKEDID_END",
[AST_CEL_LOCAL_OPTIMIZE] = "LOCAL_OPTIMIZE",
}; };
struct bridge_assoc { struct bridge_assoc {
@ -1473,6 +1475,22 @@ static void cel_pickup_cb(
cel_report_event(target, AST_CEL_PICKUP, NULL, NULL, channel->name); cel_report_event(target, AST_CEL_PICKUP, NULL, NULL, channel->name);
} }
static void cel_local_cb(
void *data, struct stasis_subscription *sub,
struct stasis_topic *topic,
struct stasis_message *message)
{
struct ast_multi_channel_blob *obj = stasis_message_data(message);
struct ast_channel_snapshot *localone = ast_multi_channel_blob_get_channel(obj, "1");
struct ast_channel_snapshot *localtwo = ast_multi_channel_blob_get_channel(obj, "2");
if (!localone || !localtwo) {
return;
}
cel_report_event(localone, AST_CEL_LOCAL_OPTIMIZE, NULL, NULL, localtwo->name);
}
static void ast_cel_engine_term(void) static void ast_cel_engine_term(void)
{ {
aco_info_destroy(&cel_cfg_info); aco_info_destroy(&cel_cfg_info);
@ -1609,6 +1627,11 @@ int ast_cel_engine_init(void)
cel_pickup_cb, cel_pickup_cb,
NULL); NULL);
ret |= stasis_message_router_add(cel_state_router,
ast_local_optimization_end_type(),
cel_local_cb,
NULL);
/* If somehow we failed to add any routes, just shut down the whole /* If somehow we failed to add any routes, just shut down the whole
* thing and fail it. * thing and fail it.
*/ */

@ -49,6 +49,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/stasis_bridging.h" #include "asterisk/stasis_bridging.h"
#include "asterisk/json.h" #include "asterisk/json.h"
#include "asterisk/features.h" #include "asterisk/features.h"
#include "asterisk/core_local.h"
#define TEST_CATEGORY "/main/cel/" #define TEST_CATEGORY "/main/cel/"
@ -1496,6 +1497,63 @@ AST_TEST_DEFINE(test_cel_dial_pickup)
return AST_TEST_PASS; return AST_TEST_PASS;
} }
AST_TEST_DEFINE(test_cel_local_optimize)
{
RAII_VAR(struct ast_channel *, chan_alice, NULL, safe_channel_release);
RAII_VAR(struct ast_channel *, chan_bob, NULL, safe_channel_release);
struct ast_party_caller alice_caller = ALICE_CALLERID;
struct ast_party_caller bob_caller = BOB_CALLERID;
RAII_VAR(struct ast_multi_channel_blob *, mc_blob, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, alice_snapshot, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, bob_snapshot, NULL, ao2_cleanup);
RAII_VAR(struct stasis_message *, local_opt_begin, NULL, ao2_cleanup);
RAII_VAR(struct stasis_message *, local_opt_end, NULL, ao2_cleanup);
switch (cmd) {
case TEST_INIT:
info->name = __func__;
info->category = TEST_CATEGORY;
info->summary = "Test local channel optimization record generation";
info->description =
"Test CEL records for two local channels being optimized\n"
"out by sending a messages indicating local optimization\n"
"begin and end\n";
return AST_TEST_NOT_RUN;
case TEST_EXECUTE:
break;
}
mc_blob = ast_multi_channel_blob_create(ast_json_null());
ast_test_validate(test, mc_blob != NULL);
CREATE_ALICE_CHANNEL(chan_alice, &alice_caller);
CREATE_BOB_CHANNEL(chan_bob, &bob_caller);
alice_snapshot = ast_channel_snapshot_create(chan_alice);
ast_test_validate(test, alice_snapshot != NULL);
bob_snapshot = ast_channel_snapshot_create(chan_bob);
ast_test_validate(test, bob_snapshot != NULL);
ast_multi_channel_blob_add_channel(mc_blob, "1", alice_snapshot);
ast_multi_channel_blob_add_channel(mc_blob, "2", bob_snapshot);
local_opt_begin = stasis_message_create(ast_local_optimization_begin_type(), mc_blob);
ast_test_validate(test, local_opt_begin != NULL);
local_opt_end = stasis_message_create(ast_local_optimization_end_type(), mc_blob);
ast_test_validate(test, local_opt_end != NULL);
stasis_publish(ast_channel_topic(chan_alice), local_opt_begin);
stasis_publish(ast_channel_topic(chan_alice), local_opt_end);
APPEND_EVENT_SNAPSHOT(alice_snapshot, AST_CEL_LOCAL_OPTIMIZE, NULL, NULL, bob_snapshot->name);
HANGUP_CHANNEL(chan_alice, AST_CAUSE_NORMAL, "");
HANGUP_CHANNEL(chan_bob, AST_CAUSE_NORMAL, "");
return AST_TEST_PASS;
}
/*! Subscription for CEL events */ /*! Subscription for CEL events */
static struct ast_event_sub *event_sub = NULL; static struct ast_event_sub *event_sub = NULL;
@ -1909,6 +1967,8 @@ static int unload_module(void)
AST_TEST_UNREGISTER(test_cel_dial_pickup); AST_TEST_UNREGISTER(test_cel_dial_pickup);
AST_TEST_UNREGISTER(test_cel_local_optimize);
ast_channel_unregister(&test_cel_chan_tech); ast_channel_unregister(&test_cel_chan_tech);
ao2_cleanup(cel_test_config); ao2_cleanup(cel_test_config);
@ -1947,6 +2007,7 @@ static int load_module(void)
cel_test_config->events |= 1<<AST_CEL_BLINDTRANSFER; cel_test_config->events |= 1<<AST_CEL_BLINDTRANSFER;
cel_test_config->events |= 1<<AST_CEL_ATTENDEDTRANSFER; cel_test_config->events |= 1<<AST_CEL_ATTENDEDTRANSFER;
cel_test_config->events |= 1<<AST_CEL_PICKUP; cel_test_config->events |= 1<<AST_CEL_PICKUP;
cel_test_config->events |= 1<<AST_CEL_LOCAL_OPTIMIZE;
ast_channel_register(&test_cel_chan_tech); ast_channel_register(&test_cel_chan_tech);
@ -1979,6 +2040,8 @@ static int load_module(void)
AST_TEST_REGISTER(test_cel_dial_pickup); AST_TEST_REGISTER(test_cel_dial_pickup);
AST_TEST_REGISTER(test_cel_local_optimize);
/* ast_test_register_* has to happen after AST_TEST_REGISTER */ /* ast_test_register_* has to happen after AST_TEST_REGISTER */
/* Verify received vs expected events and clean things up after every test */ /* Verify received vs expected events and clean things up after every test */
ast_test_register_init(TEST_CATEGORY, test_cel_init_cb); ast_test_register_init(TEST_CATEGORY, test_cel_init_cb);

Loading…
Cancel
Save