static void test_nc_rpc_edit(void **state) { (void)state; struct nc_rpc *rpc = NULL; /* create edit rpc with NC_PARAMTYPE_CONST */ rpc = nc_rpc_edit(NC_DATASTORE_RUNNING, NC_RPC_EDIT_DFLTOP_REPLACE, NC_RPC_EDIT_TESTOPT_TESTSET, NC_RPC_EDIT_ERROPT_STOP, "url", NC_PARAMTYPE_CONST); assert_non_null(rpc); check_edit(rpc, NC_DATASTORE_RUNNING, NC_RPC_EDIT_DFLTOP_REPLACE, NC_RPC_EDIT_TESTOPT_TESTSET, NC_RPC_EDIT_ERROPT_STOP, "url"); nc_rpc_free(rpc); /* create edit rpc with NC_PARAMTYPE_FREE */ char *str = strdup("string"); rpc = nc_rpc_edit(NC_DATASTORE_CANDIDATE, NC_RPC_EDIT_DFLTOP_MERGE, NC_RPC_EDIT_TESTOPT_SET, NC_RPC_EDIT_ERROPT_ROLLBACK, str, NC_PARAMTYPE_FREE); assert_non_null(rpc); check_edit(rpc, NC_DATASTORE_CANDIDATE, NC_RPC_EDIT_DFLTOP_MERGE, NC_RPC_EDIT_TESTOPT_SET, NC_RPC_EDIT_ERROPT_ROLLBACK, str); nc_rpc_free(rpc); /* create edit rpc with NC_PARAMTYPE_DUP_AND_FREE */ rpc = nc_rpc_edit(NC_DATASTORE_CONFIG, NC_RPC_EDIT_DFLTOP_NONE, NC_RPC_EDIT_TESTOPT_TEST, NC_RPC_EDIT_ERROPT_CONTINUE, "url1", NC_PARAMTYPE_DUP_AND_FREE); assert_non_null(rpc); check_edit(rpc, NC_DATASTORE_CONFIG, NC_RPC_EDIT_DFLTOP_NONE, NC_RPC_EDIT_TESTOPT_TEST, NC_RPC_EDIT_ERROPT_CONTINUE, "url1"); nc_rpc_free(rpc); }
/******************************************************************** * FUNCTION process_apply * (config mode input received) * Handle the apply command and check if there are edits * to apply to the server. If so apply the edits. * * INPUTS: * server_cb == server control block to use * session_cb == session control block to use * * RETURNS: * status *********************************************************************/ static status_t process_apply (server_cb_t *server_cb, session_cb_t *session_cb) { if (dlq_empty(&session_cb->config_editQ)) { if (LOGDEBUG2) { log_debug2("\nSkipping apply, no edits"); } session_cb->config_edit_dirty = FALSE; return NO_ERR; } /* make a dummy config root -- it will not be used; only the child * nodes added to this container will be added to the <config> * parameter in the <edit-config> operation */ val_value_t *configval = xml_val_new_root(NCX_EL_CONFIG, xmlns_nc_id()); if (configval == NULL) { log_error("\nError: malloc failed"); return ERR_INTERNAL_MEM; } status_t res = NO_ERR; boolean anyedits = FALSE; uint32 editcnt = dlq_count(&session_cb->config_editQ); while (!dlq_empty(&session_cb->config_editQ)) { config_edit_t *edit = (config_edit_t *) dlq_deque(&session_cb->config_editQ); /* compare the edit to the shadow config to see if it * represents any change or not */ boolean ischange = check_edit(session_cb, edit); if (ischange) { /** TBD: add to tree and collapse all edits!!! */ val_add_child(edit->edit_payload, configval); edit->edit_payload = NULL; anyedits = TRUE; } else if (LOGDEBUG3) { log_debug3("\nSkipping edit due to no change:\n"); val_dump_value(edit->edit_payload, 0); } free_config_edit(edit); } if (!anyedits) { val_free_value(configval); return NO_ERR; } if (server_cb->program_mode == PROG_MODE_SERVER) { if (LOGDEBUG) { if (editcnt == 1) { log_debug("\nApplying 1 edit\n"); } else { log_debug("\nApplying %u edits\n", editcnt); } } } else { if (LOGINFO) { const xmlChar *sesname = (session_cb->session_cfg) ? session_cb->session_cfg->name : NCX_EL_DEFAULT; if (editcnt == 1) { log_info("\nApplying 1 edit to session '%s'\n", sesname); } else { log_info("\nApplying %u edits to session '%s'\n", editcnt, sesname); } } } session_cb->command_mode = CMD_MODE_CONF_APPLY; session_cb->config_edit_dirty = FALSE; res = send_edit_config_to_server(server_cb, session_cb, NULL, configval, TRUE, session_cb->timeout, OP_DEFOP_MERGE); /* configval consumed no matter what! */ return res; } /* process_apply */