[libvirt] [PATCH perl 0/2] Add bindings for new events

Daniel P. Berrange (2): Add domain metadata change event Add support for secret event APIs Changes | 2 + Virt.xs | 184 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/Sys/Virt.pm | 36 ++++++++++ lib/Sys/Virt/Domain.pm | 4 ++ lib/Sys/Virt/Secret.pm | 33 +++++++++ t/030-api-coverage.t | 4 ++ 6 files changed, 263 insertions(+) -- 2.9.3

Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Changes | 1 + Virt.xs | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/Sys/Virt/Domain.pm | 4 ++++ t/030-api-coverage.t | 1 + 4 files changed, 50 insertions(+) diff --git a/Changes b/Changes index 672b566..e425ad4 100644 --- a/Changes +++ b/Changes @@ -10,6 +10,7 @@ Revision history for perl module Sys::Virt - Add PERF_PARAM_STALLED_CYCLES_BACKEND constant - Add PERF_PARAM_REF_CPU_CYCLES constant - Add virStorageVolGetInfoFlags & associated constants + - Add domain metdata change event 2.5.0 2016-12-05 diff --git a/Virt.xs b/Virt.xs index 1eb94a8..9a7ce17 100644 --- a/Virt.xs +++ b/Virt.xs @@ -1096,6 +1096,46 @@ _domain_event_job_completed_callback(virConnectPtr con, static int +_domain_event_metadata_change_callback(virConnectPtr con, + virDomainPtr dom, + int type, + const char *nsuri, + void *opaque) +{ + AV *data = opaque; + SV **self; + SV **cb; + SV *domref; + dSP; + + self = av_fetch(data, 0, 0); + cb = av_fetch(data, 1, 0); + + SvREFCNT_inc(*self); + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + XPUSHs(*self); + domref = sv_newmortal(); + sv_setref_pv(domref, "Sys::Virt::Domain", (void*)dom); + virDomainRef(dom); + XPUSHs(domref); + XPUSHs(sv_2mortal(newSViv(type))); + XPUSHs(sv_2mortal(newSVpv(nsuri, 0))); + PUTBACK; + + call_sv(*cb, G_DISCARD); + + FREETMPS; + LEAVE; + + return 0; +} + + +static int _network_event_lifecycle_callback(virConnectPtr con, virNetworkPtr net, int event, @@ -3248,6 +3288,9 @@ PREINIT: case VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED: callback = VIR_DOMAIN_EVENT_CALLBACK(_domain_event_device_generic_callback); break; + case VIR_DOMAIN_EVENT_ID_METADATA_CHANGE: + callback = VIR_DOMAIN_EVENT_CALLBACK(_domain_event_metadata_change_callback); + break; default: callback = VIR_DOMAIN_EVENT_CALLBACK(_domain_event_generic_callback); break; @@ -8197,6 +8240,7 @@ BOOT: REGISTER_CONSTANT(VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION, EVENT_ID_MIGRATION_ITERATION); REGISTER_CONSTANT(VIR_DOMAIN_EVENT_ID_JOB_COMPLETED, EVENT_ID_JOB_COMPLETED); REGISTER_CONSTANT(VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED, EVENT_ID_DEVICE_REMOVAL_FAILED); + REGISTER_CONSTANT(VIR_DOMAIN_EVENT_ID_METADATA_CHANGE, EVENT_ID_METADATA_CHANGE); REGISTER_CONSTANT(VIR_DOMAIN_EVENT_WATCHDOG_NONE, EVENT_WATCHDOG_NONE); REGISTER_CONSTANT(VIR_DOMAIN_EVENT_WATCHDOG_PAUSE, EVENT_WATCHDOG_PAUSE); diff --git a/lib/Sys/Virt/Domain.pm b/lib/Sys/Virt/Domain.pm index bd59139..aa7b5bd 100644 --- a/lib/Sys/Virt/Domain.pm +++ b/lib/Sys/Virt/Domain.pm @@ -3211,6 +3211,10 @@ method. Guest device removal has failed. +=item Sys::Virt::Domain::EVENT_ID_METADATA_CHANGE + +The domain metadata has changed + =back =head2 IO ERROR EVENT CONSTANTS diff --git a/t/030-api-coverage.t b/t/030-api-coverage.t index 2c7d146..7bc33fb 100644 --- a/t/030-api-coverage.t +++ b/t/030-api-coverage.t @@ -94,6 +94,7 @@ virConnectDomainEventAgentLifecycleCallback virConnectDomainEventMigrationIterationCallback virConnectDomainEventJobCompletedCallback virConnectDomainEventDeviceRemovalFailedCallback +virConnectDomainEventMetadataChangeCallback virConnectNetworkEventLifecycleCallback -- 2.9.3

Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Changes | 1 + Virt.xs | 140 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/Sys/Virt.pm | 36 +++++++++++++ lib/Sys/Virt/Secret.pm | 33 ++++++++++++ t/030-api-coverage.t | 3 ++ 5 files changed, 213 insertions(+) diff --git a/Changes b/Changes index e425ad4..efa1058 100644 --- a/Changes +++ b/Changes @@ -11,6 +11,7 @@ Revision history for perl module Sys::Virt - Add PERF_PARAM_REF_CPU_CYCLES constant - Add virStorageVolGetInfoFlags & associated constants - Add domain metdata change event + - Add secret event APIs 2.5.0 2016-12-05 diff --git a/Virt.xs b/Virt.xs index 9a7ce17..a2947b6 100644 --- a/Virt.xs +++ b/Virt.xs @@ -1363,6 +1363,82 @@ _node_device_event_lifecycle_callback(virConnectPtr con, } +static int +_secret_event_lifecycle_callback(virConnectPtr con, + virSecretPtr secret, + int event, + int detail, + void *opaque) +{ + AV *data = opaque; + SV **self; + SV **cb; + SV *secretref; + dSP; + + self = av_fetch(data, 0, 0); + cb = av_fetch(data, 1, 0); + + SvREFCNT_inc(*self); + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + XPUSHs(*self); + secretref = sv_newmortal(); + sv_setref_pv(secretref, "Sys::Virt::Secret", (void*)secret); + virSecretRef(secret); + XPUSHs(secretref); + XPUSHs(sv_2mortal(newSViv(event))); + XPUSHs(sv_2mortal(newSViv(detail))); + PUTBACK; + + call_sv(*cb, G_DISCARD); + + FREETMPS; + LEAVE; + + return 0; +} + + +static int +_secret_event_generic_callback(virConnectPtr con, + virSecretPtr secret, + void *opaque) +{ + AV *data = opaque; + SV **self; + SV **cb; + SV *secretref; + dSP; + + self = av_fetch(data, 0, 0); + cb = av_fetch(data, 1, 0); + + SvREFCNT_inc(*self); + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + XPUSHs(*self); + secretref = sv_newmortal(); + sv_setref_pv(secretref, "Sys::Virt::Secret", (void*)secret); + virSecretRef(secret); + XPUSHs(secretref); + PUTBACK; + + call_sv(*cb, G_DISCARD); + + FREETMPS; + LEAVE; + + return 0; +} + + static void _domain_event_free(void *opaque) { @@ -1396,6 +1472,14 @@ _node_device_event_free(void *opaque) static void +_secret_event_free(void *opaque) +{ + SV *sv = opaque; + SvREFCNT_dec(sv); +} + + +static void _close_callback(virConnectPtr con, int reason, void *opaque) @@ -3462,6 +3546,56 @@ node_device_event_deregister_any(con, callbackID) virConnectNodeDeviceEventDeregisterAny(con, callbackID); +int +secret_event_register_any(conref, secretref, eventID, cb) + SV* conref; + SV* secretref; + int eventID; + SV* cb; +PREINIT: + AV *opaque; + virConnectPtr con; + virSecretPtr secret; + virConnectSecretEventGenericCallback callback; + CODE: + con = (virConnectPtr)SvIV((SV*)SvRV(conref)); + if (SvROK(secretref)) { + secret = (virSecretPtr)SvIV((SV*)SvRV(secretref)); + } else { + secret = NULL; + } + + switch (eventID) { + case VIR_SECRET_EVENT_ID_LIFECYCLE: + callback = VIR_SECRET_EVENT_CALLBACK(_secret_event_lifecycle_callback); + break; + case VIR_SECRET_EVENT_ID_VALUE_CHANGED: + callback = VIR_SECRET_EVENT_CALLBACK(_secret_event_generic_callback); + break; + default: + callback = VIR_SECRET_EVENT_CALLBACK(_secret_event_generic_callback); + break; + } + + opaque = newAV(); + SvREFCNT_inc(cb); + SvREFCNT_inc(conref); + av_push(opaque, conref); + av_push(opaque, cb); + if ((RETVAL = virConnectSecretEventRegisterAny(con, secret, eventID, callback, opaque, _secret_event_free)) < 0) + _croak_error(); +OUTPUT: + RETVAL + + +void +secret_event_deregister_any(con, callbackID) + virConnectPtr con; + int callbackID; + PPCODE: + virConnectSecretEventDeregisterAny(con, callbackID); + + void register_close_callback(conref, cb) SV* conref; @@ -8767,6 +8901,12 @@ BOOT: REGISTER_CONSTANT(VIR_CONNECT_LIST_SECRETS_PRIVATE, LIST_PRIVATE); REGISTER_CONSTANT(VIR_CONNECT_LIST_SECRETS_NO_PRIVATE, LIST_NO_PRIVATE); + REGISTER_CONSTANT(VIR_SECRET_EVENT_ID_LIFECYCLE, EVENT_ID_LIFECYCLE); + REGISTER_CONSTANT(VIR_SECRET_EVENT_ID_VALUE_CHANGED, EVENT_ID_VALUE_CHANGED); + + REGISTER_CONSTANT(VIR_SECRET_EVENT_DEFINED, EVENT_DEFINED); + REGISTER_CONSTANT(VIR_SECRET_EVENT_UNDEFINED, EVENT_UNDEFINED); + stash = gv_stashpv( "Sys::Virt::Stream", TRUE ); REGISTER_CONSTANT(VIR_STREAM_NONBLOCK, NONBLOCK); diff --git a/lib/Sys/Virt.pm b/lib/Sys/Virt.pm index f2975a7..f1a6e16 100644 --- a/lib/Sys/Virt.pm +++ b/lib/Sys/Virt.pm @@ -1648,6 +1648,42 @@ unregistering the event. Unregister a callback, associated with the C<$callbackID> previously obtained from C<node_device_event_register_any>. +=item $callback = $conn->secret_event_register_any($secret, $eventID, $callback) + +Register a callback to received notifications of secret events. +The C<$secret> parameter can be C<undef> to request events on all +known secrets, or a specific C<Sys::Virt::Secret> object to +filter events. The C<$eventID> parameter is one of the EVENT ID +constants described later in this document. The C<$callback> is +a subroutine reference that will receive the events. + +All callbacks receive a C<Sys::Virt> connection as the first parameter +and a C<Sys::Virt::Secret> object indicating the secret on which the +event occurred as the second parameter. Subsequent parameters vary +according to the event type + +=over + +=item EVENT_ID_LIFECYCLE + +Extra C<event> and C<detail> parameters defining the lifecycle +transition that occurred. + +=item EVENT_ID_VALUE_CHANGED + +No extra parameters. + +=back + +The return value is a unique callback ID that must be used when +unregistering the event. + + +=item $conn->secret_event_deregister_any($callbackID) + +Unregister a callback, associated with the C<$callbackID> previously +obtained from C<secret_event_register_any>. + =item $conn->register_close_callback($coderef); Register a callback to be invoked when the connection is closed. diff --git a/lib/Sys/Virt/Secret.pm b/lib/Sys/Virt/Secret.pm index 1f2defc..0c6a021 100644 --- a/lib/Sys/Virt/Secret.pm +++ b/lib/Sys/Virt/Secret.pm @@ -182,6 +182,39 @@ Include any secrets not marked as private =back +=head2 EVENT ID CONSTANTS + +=over 4 + +=item Sys::Virt::Secret::EVENT_ID_LIFECYCLE + +Secret lifecycle events + +=item Sys::Virt::Secret::EVENT_ID_VALUE_CHANGED + +Secret value change events + +=back + +=head2 LIFECYCLE CHANGE EVENTS + +The following constants allow secret lifecycle change events to be +interpreted. The events contain both a state change, and a +reason though the reason is currently unsed. + +=over 4 + +=item Sys::Virt::Secret::EVENT_DEFINED + +Indicates that a persistent configuration has been defined for +the secret. + +=item Sys::Virt::Secret::EVENT_UNDEFINED + +The persistent configuration has gone away + +=back + =cut diff --git a/t/030-api-coverage.t b/t/030-api-coverage.t index 7bc33fb..3a0d0c5 100644 --- a/t/030-api-coverage.t +++ b/t/030-api-coverage.t @@ -102,6 +102,8 @@ virConnectStoragePoolEventLifecycleCallback virConnectNodeDeviceEventLifecycleCallback +virConnectSecretEventLifecycleCallback + virEventAddHandleFunc virEventAddTimeoutFunc virEventRemoveHandleFunc @@ -180,6 +182,7 @@ VIR_DOMAIN_EVENT_CALLBACK VIR_NETWORK_EVENT_CALLBACK VIR_STORAGE_POOL_EVENT_CALLBACK VIR_NODE_DEVICE_EVENT_CALLBACK +VIR_SECRET_EVENT_CALLBACK VIR_DOMAIN_MEMORY_FIELD_LENGTH VIR_DOMAIN_MEMORY_PARAM_UNLIMITED VIR_DOMAIN_SCHED_FIELD_LENGTH -- 2.9.3
participants (1)
-
Daniel P. Berrange