[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Implement session.last_active, session.this_host, session.get_record,
# HG changeset patch # User Ewan Mellor <ewan@xxxxxxxxxxxxx> # Date 1174864093 -3600 # Node ID af07c7b01893c2916060f8f48716de7072a3432f # Parent e3e7c59cdba11b600466f4af225b912cbd4cf790 Implement session.last_active, session.this_host, session.get_record, session.get_uuid. Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx> --- tools/libxen/include/xen_common.h | 67 ++++++++++++++++++++- tools/libxen/src/xen_common.c | 117 +++++++++++++++++++++++++++++++++++++- tools/libxen/test/test_bindings.c | 50 +++++++++++++++- tools/python/xen/xend/XendAPI.py | 47 ++++++++++----- 4 files changed, 258 insertions(+), 23 deletions(-) diff -r e3e7c59cdba1 -r af07c7b01893 tools/libxen/include/xen_common.h --- a/tools/libxen/include/xen_common.h Sun Mar 25 22:17:30 2007 +0100 +++ b/tools/libxen/include/xen_common.h Mon Mar 26 00:08:13 2007 +0100 @@ -51,6 +51,30 @@ typedef struct } xen_session; +typedef struct xen_session_record +{ + char *uuid; + struct xen_host_record_opt *this_host; + char *this_user; + time_t last_active; +} xen_session_record; + + +/** + * Allocate a xen_session_record. + */ +extern xen_session_record * +xen_session_record_alloc(void); + + +/** + * Free the given xen_session_record, and all referenced values. The + * given record must have been allocated by this library. + */ +extern void +xen_session_record_free(xen_session_record *record); + + struct xen_task_; typedef struct xen_task_ * xen_task_id; @@ -136,10 +160,45 @@ xen_session_logout(xen_session *session) /** - * Set *result to be a handle to the host to which this session is connected. - */ -extern int -xen_session_get_this_host(xen_session *session, xen_host *result); + * Get the UUID of the second given session. Set *result to point at a + * string, yours to free. + */ +extern bool +xen_session_get_uuid(xen_session *session, char **result, + xen_session *self_session); + + +/** + * Get the this_host field of the second given session. Set *result to be a + * handle to that host. + */ +extern bool +xen_session_get_this_host(xen_session *session, xen_host *result, + xen_session *self_session); + + +/** + * Get the this_user field of the second given session. Set *result to point + * at a string, yours to free. + */ +extern bool +xen_session_get_this_user(xen_session *session, char **result, + xen_session *self_session); + + +/** + * Get the last_active field of the given session, and place it in *result. + */ +extern bool +xen_session_get_last_active(xen_session *session, time_t *result, + xen_session *self_session); + +/** + * Get a record containing the current state of the second given session. + */ +extern bool +xen_session_get_record(xen_session *session, xen_session_record **result, + xen_session *self_session); #endif diff -r e3e7c59cdba1 -r af07c7b01893 tools/libxen/src/xen_common.c --- a/tools/libxen/src/xen_common.c Sun Mar 25 22:17:30 2007 +0100 +++ b/tools/libxen/src/xen_common.c Mon Mar 26 00:08:13 2007 +0100 @@ -32,6 +32,7 @@ #include <libxml/xpath.h> #include "xen_common.h" +#include "xen_host.h" #include "xen_internal.h" #include "xen_int_float_map.h" #include "xen_string_string_map.h" @@ -138,6 +139,20 @@ xen_fini(void) } +void +xen_session_record_free(xen_session_record *record) +{ + if (record == NULL) + { + return; + } + free(record->uuid); + xen_host_record_opt_free(record->this_host); + free(record->this_user); + free(record); +} + + xen_session * xen_session_login_with_password(xen_call_func call_func, void *handle, const char *uname, const char *pwd) @@ -187,15 +202,111 @@ xen_session_logout(xen_session *session) } -int -xen_session_get_this_host(xen_session *session, xen_host *result) +bool +xen_session_get_uuid(xen_session *session, char **result, + xen_session *self_session) { abstract_value params[] = { + { .type = &abstract_type_string, + .u.string_val = self_session->session_id } }; - xen_call_(session, "session.get_this_host", params, 0, + xen_call_(session, "session.get_uuid", params, 1, &abstract_type_string, result); + return session->ok; +} + + +bool +xen_session_get_this_host(xen_session *session, xen_host *result, + xen_session *self_session) +{ + abstract_value params[] = + { + { .type = &abstract_type_string, + .u.string_val = self_session->session_id } + }; + + xen_call_(session, "session.get_this_host", params, 1, + &abstract_type_string, result); + return session->ok; +} + + +bool +xen_session_get_this_user(xen_session *session, char **result, + xen_session *self_session) +{ + abstract_value params[] = + { + { .type = &abstract_type_string, + .u.string_val = self_session->session_id } + }; + + xen_call_(session, "session.get_this_user", params, 1, + &abstract_type_string, result); + return session->ok; +} + + +bool +xen_session_get_last_active(xen_session *session, time_t *result, + xen_session *self_session) +{ + abstract_value params[] = + { + { .type = &abstract_type_string, + .u.string_val = self_session->session_id } + }; + + xen_call_(session, "session.get_last_active", params, 1, + &abstract_type_datetime, result); + return session->ok; +} + + +static const struct_member xen_session_record_struct_members[] = + { + { .key = "uuid", + .type = &abstract_type_string, + .offset = offsetof(xen_session_record, uuid) }, + { .key = "this_host", + .type = &abstract_type_ref, + .offset = offsetof(xen_session_record, this_host) }, + { .key = "this_user", + .type = &abstract_type_string, + .offset = offsetof(xen_session_record, this_user) }, + { .key = "last_active", + .type = &abstract_type_datetime, + .offset = offsetof(xen_session_record, last_active) }, + }; + +const abstract_type xen_session_record_abstract_type_ = + { + .typename = STRUCT, + .struct_size = sizeof(xen_session_record), + .member_count = + sizeof(xen_session_record_struct_members) / sizeof(struct_member), + .members = xen_session_record_struct_members + }; + + +bool +xen_session_get_record(xen_session *session, xen_session_record **result, + xen_session *self_session) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = self_session->session_id } + }; + + abstract_type result_type = xen_session_record_abstract_type_; + + *result = NULL; + XEN_CALL_("session.get_record"); + return session->ok; } diff -r e3e7c59cdba1 -r af07c7b01893 tools/libxen/test/test_bindings.c --- a/tools/libxen/test/test_bindings.c Sun Mar 25 22:17:30 2007 +0100 +++ b/tools/libxen/test/test_bindings.c Mon Mar 26 00:08:13 2007 +0100 @@ -17,6 +17,7 @@ */ #define _GNU_SOURCE +#include <assert.h> #include <inttypes.h> #include <stdlib.h> #include <stdio.h> @@ -61,6 +62,7 @@ typedef struct static xen_vm create_new_vm(xen_session *session, bool hvm); +static void print_session_info(xen_session *session); static void print_vm_power_state(xen_session *session, xen_vm vm); static void print_vm_metrics(xen_session *session, xen_vm vm); @@ -144,6 +146,14 @@ int main(int argc, char **argv) xen_session *session = xen_session_login_with_password(call_func, NULL, username, password); + print_session_info(session); + if (!session->ok) + { + /* Error has been logged, just clean up. */ + CLEANUP; + return 1; + } + xen_vm vm; if (!xen_vm_get_by_uuid(session, &vm, "00000000-0000-0000-0000-000000000000")) @@ -184,7 +194,7 @@ int main(int argc, char **argv) } xen_host host; - if (!xen_session_get_this_host(session, &host)) + if (!xen_session_get_this_host(session, &host, session)) { print_error(session); xen_vm_record_free(vm_record); @@ -583,6 +593,44 @@ static size_t my_strftime(char *s, size_ /** + * Print some session details. + */ +static void print_session_info(xen_session *session) +{ + xen_session_record *record; + if (!xen_session_get_record(session, &record, session)) + { + print_error(session); + return; + } + + printf("Session UUID: %s.\n", record->uuid); + printf("Session user: %s.\n", record->this_user); + char time[256]; + struct tm *tm = localtime(&record->last_active); + my_strftime(time, 256, "Session last active: %c, local time.\n", tm); + printf(time); + + char *uuid = NULL; + char *this_user = NULL; + xen_session_get_uuid(session, &uuid, session); + xen_session_get_this_user(session, &this_user, session); + + if (!session->ok) + { + xen_session_record_free(record); + print_error(session); + return; + } + + assert(!strcmp(record->uuid, uuid)); + assert(!strcmp(record->this_user, this_user)); + + xen_session_record_free(record); +} + + +/** * Print the metrics for the given VM. */ static void print_vm_metrics(xen_session *session, xen_vm vm) diff -r e3e7c59cdba1 -r af07c7b01893 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Sun Mar 25 22:17:30 2007 +0100 +++ b/tools/python/xen/xend/XendAPI.py Mon Mar 26 00:08:13 2007 +0100 @@ -523,8 +523,11 @@ class XendAPI(object): # ---------------------------------------------------------------- # NOTE: Left unwrapped by __init__ - session_attr_ro = ['this_host', 'this_user'] + session_attr_ro = ['this_host', 'this_user', 'last_active'] session_methods = [('logout', None)] + + def session_get_all(self, session): + return xen_api_success([session]) def session_login_with_password(self, *args): if len(args) != 2: @@ -534,8 +537,8 @@ class XendAPI(object): username = args[0] password = args[1] try: - session = (self.auth == AUTH_NONE and - auth_manager().login_unconditionally(username) or + session = ((self.auth == AUTH_NONE and + auth_manager().login_unconditionally(username)) or auth_manager().login_with_password(username, password)) return xen_api_success(session) except XendError, e: @@ -546,26 +549,40 @@ class XendAPI(object): def session_logout(self, session): auth_manager().logout(session) return xen_api_success_void() - def session_get_record(self, session): - record = {'uuid' : session, - 'this_host': XendNode.instance().uuid, - 'this_user': auth_manager().get_user(session)} + + def session_get_record(self, session, self_session): + if self_session != session: + return xen_api_error(['PERMISSION_DENIED']) + record = {'uuid' : session, + 'this_host' : XendNode.instance().uuid, + 'this_user' : auth_manager().get_user(session), + 'last_active': now()} return xen_api_success(record) - def session_get_uuid(self, session): - return xen_api_success(session) - - def session_get_by_uuid(self, session): - return xen_api_success(session) + def session_get_uuid(self, session, self_session): + return xen_api_success(self_session) + + def session_get_by_uuid(self, session, self_session): + return xen_api_success(self_session) # attributes (ro) - def session_get_this_host(self, session): + def session_get_this_host(self, session, self_session): + if self_session != session: + return xen_api_error(['PERMISSION_DENIED']) return xen_api_success(XendNode.instance().uuid) - def session_get_this_user(self, session): + + def session_get_this_user(self, session, self_session): + if self_session != session: + return xen_api_error(['PERMISSION_DENIED']) user = auth_manager().get_user(session) - if user: + if user is not None: return xen_api_success(user) return xen_api_error(['SESSION_INVALID', session]) + + def session_get_last_active(self, session, self_session): + if self_session != session: + return xen_api_error(['PERMISSION_DENIED']) + return xen_api_success(now()) # Xen API: Class User _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |