[libvirt] [PATCH 1/2] Add VIR_DOMAIN_EVENT_ID_DEVICE_ADDED event

John Ferlan jferlan at redhat.com
Mon Apr 13 17:59:39 UTC 2015



On 04/04/2015 01:16 PM, Ján Tomko wrote:
> The counterpart to VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED.
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1206114
> ---
>  daemon/remote.c                  | 37 +++++++++++++++++++
>  include/libvirt/libvirt-domain.h | 18 ++++++++++
>  src/conf/domain_event.c          | 77 ++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_event.h          |  6 ++++
>  src/libvirt_private.syms         |  2 ++
>  src/remote/remote_driver.c       | 29 +++++++++++++++
>  src/remote/remote_protocol.x     | 14 +++++++-
>  src/remote_protocol-structs      |  6 ++++
>  tools/virsh-domain.c             | 20 +++++++++++
>  9 files changed, 208 insertions(+), 1 deletion(-)
> 

I searched on VIR_DOMAIN_EVENT_ID_DEVICE - what about
examples/object-events/event-test.c ?

Also should 'src/libvirt-domain.c' have a description for the _ADDED
flag in 'virDomainAttachDeviceFlags' like there is for _REMOVED in
'virDomainDetachDeviceFlags'?  (although even that text is a bit shy of
an 'a' - as in "or add a handler for" rather than "or add handler for"
<sigh>

ACK in general for what's here and with the new test and change to
AttachDevice description...

John


> diff --git a/daemon/remote.c b/daemon/remote.c
> index 2e1f973..3a3f168 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -1045,6 +1045,42 @@ remoteRelayDomainEventAgentLifecycle(virConnectPtr conn,
>  }
>  
>  
> +static int
> +remoteRelayDomainEventDeviceAdded(virConnectPtr conn,
> +                                  virDomainPtr dom,
> +                                  const char *devAlias,
> +                                  void *opaque)
> +{
> +    daemonClientEventCallbackPtr callback = opaque;
> +    remote_domain_event_callback_device_added_msg data;
> +
> +    if (callback->callbackID < 0 ||
> +        !remoteRelayDomainEventCheckACL(callback->client, conn, dom))
> +        return -1;
> +
> +    VIR_DEBUG("Relaying domain device added event %s %d %s, callback %d",
> +              dom->name, dom->id, devAlias, callback->callbackID);
> +
> +    /* build return data */
> +    memset(&data, 0, sizeof(data));
> +
> +    if (VIR_STRDUP(data.devAlias, devAlias) < 0)
> +        return -1;
> +
> +    make_nonnull_domain(&data.dom, dom);
> +    data.callbackID = callback->callbackID,
> +
> +    remoteDispatchObjectEventSend(callback->client, remoteProgram,
> +                                  REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED,
> +                                  (xdrproc_t)xdr_remote_domain_event_callback_device_added_msg,
> +                                  &data);
> +
> +    return 0;
> +}
> +
> +
> +
> +
>  static virConnectDomainEventGenericCallback domainEventCallbacks[] = {
>      VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventLifecycle),
>      VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventReboot),
> @@ -1065,6 +1101,7 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = {
>      VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventBlockJob2),
>      VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventTunable),
>      VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventAgentLifecycle),
> +    VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventDeviceAdded),
>  };
>  
>  verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST);
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 7be4219..8a4fe53 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -3202,6 +3202,23 @@ typedef void (*virConnectDomainEventDeviceRemovedCallback)(virConnectPtr conn,
>                                                             void *opaque);
>  
>  /**
> + * virConnectDomainEventDeviceAddedCallback:
> + * @conn: connection object
> + * @dom: domain on which the event occurred
> + * @devAlias: device alias
> + * @opaque: application specified data
> + *
> + * This callback occurs when a device is added to the domain.
> + *
> + * The callback signature to use when registering for an event of type
> + * VIR_DOMAIN_EVENT_ID_DEVICE_ADDED with virConnectDomainEventRegisterAny()
> + */
> +typedef void (*virConnectDomainEventDeviceAddedCallback)(virConnectPtr conn,
> +                                                         virDomainPtr dom,
> +                                                         const char *devAlias,
> +                                                         void *opaque);
> +
> +/**
>   * VIR_DOMAIN_TUNABLE_CPU_VCPUPIN:
>   *
>   * Macro represents formatted pinning for one vcpu specified by id which is
> @@ -3483,6 +3500,7 @@ typedef enum {
>      VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2 = 16,    /* virConnectDomainEventBlockJobCallback */
>      VIR_DOMAIN_EVENT_ID_TUNABLE = 17,        /* virConnectDomainEventTunableCallback */
>      VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE = 18,/* virConnectDomainEventAgentLifecycleCallback */
> +    VIR_DOMAIN_EVENT_ID_DEVICE_ADDED = 19,   /* virConnectDomainEventDeviceAddedCallback */
>  
>  # ifdef VIR_ENUM_SENTINELS
>      VIR_DOMAIN_EVENT_ID_LAST
> diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
> index 2786c1e..20d66e1 100644
> --- a/src/conf/domain_event.c
> +++ b/src/conf/domain_event.c
> @@ -55,6 +55,7 @@ static virClassPtr virDomainEventPMClass;
>  static virClassPtr virDomainQemuMonitorEventClass;
>  static virClassPtr virDomainEventTunableClass;
>  static virClassPtr virDomainEventAgentLifecycleClass;
> +static virClassPtr virDomainEventDeviceAddedClass;
>  
>  
>  static void virDomainEventDispose(void *obj);
> @@ -72,6 +73,7 @@ static void virDomainEventPMDispose(void *obj);
>  static void virDomainQemuMonitorEventDispose(void *obj);
>  static void virDomainEventTunableDispose(void *obj);
>  static void virDomainEventAgentLifecycleDispose(void *obj);
> +static void virDomainEventDeviceAddedDispose(void *obj);
>  
>  static void
>  virDomainEventDispatchDefaultFunc(virConnectPtr conn,
> @@ -189,6 +191,14 @@ struct _virDomainEventDeviceRemoved {
>  typedef struct _virDomainEventDeviceRemoved virDomainEventDeviceRemoved;
>  typedef virDomainEventDeviceRemoved *virDomainEventDeviceRemovedPtr;
>  
> +struct _virDomainEventDeviceAdded {
> +    virDomainEvent parent;
> +
> +    char *devAlias;
> +};
> +typedef struct _virDomainEventDeviceAdded virDomainEventDeviceAdded;
> +typedef virDomainEventDeviceAdded *virDomainEventDeviceAddedPtr;
> +
>  struct _virDomainEventPM {
>      virDomainEvent parent;
>  
> @@ -296,6 +306,12 @@ virDomainEventsOnceInit(void)
>                        sizeof(virDomainEventDeviceRemoved),
>                        virDomainEventDeviceRemovedDispose)))
>          return -1;
> +    if (!(virDomainEventDeviceAddedClass =
> +          virClassNew(virDomainEventClass,
> +                      "virDomainEventDeviceAdded",
> +                      sizeof(virDomainEventDeviceAdded),
> +                      virDomainEventDeviceAddedDispose)))
> +        return -1;
>      if (!(virDomainEventPMClass =
>            virClassNew(virDomainEventClass,
>                        "virDomainEventPM",
> @@ -439,6 +455,15 @@ virDomainEventDeviceRemovedDispose(void *obj)
>  }
>  
>  static void
> +virDomainEventDeviceAddedDispose(void *obj)
> +{
> +    virDomainEventDeviceAddedPtr event = obj;
> +    VIR_DEBUG("obj=%p", event);
> +
> +    VIR_FREE(event->devAlias);
> +}
> +
> +static void
>  virDomainEventPMDispose(void *obj)
>  {
>      virDomainEventPMPtr event = obj;
> @@ -1226,6 +1251,47 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom,
>                                            devAlias);
>  }
>  
> +static virObjectEventPtr
> +virDomainEventDeviceAddedNew(int id,
> +                             const char *name,
> +                             unsigned char *uuid,
> +                             const char *devAlias)
> +{
> +    virDomainEventDeviceAddedPtr ev;
> +
> +    if (virDomainEventsInitialize() < 0)
> +        return NULL;
> +
> +    if (!(ev = virDomainEventNew(virDomainEventDeviceAddedClass,
> +                                 VIR_DOMAIN_EVENT_ID_DEVICE_ADDED,
> +                                 id, name, uuid)))
> +        return NULL;
> +
> +    if (VIR_STRDUP(ev->devAlias, devAlias) < 0)
> +        goto error;
> +
> +    return (virObjectEventPtr)ev;
> +
> + error:
> +    virObjectUnref(ev);
> +    return NULL;
> +}
> +
> +virObjectEventPtr
> +virDomainEventDeviceAddedNewFromObj(virDomainObjPtr obj,
> +                                       const char *devAlias)
> +{
> +    return virDomainEventDeviceAddedNew(obj->def->id, obj->def->name,
> +                                           obj->def->uuid, devAlias);
> +}
> +
> +virObjectEventPtr
> +virDomainEventDeviceAddedNewFromDom(virDomainPtr dom,
> +                                      const char *devAlias)
> +{
> +    return virDomainEventDeviceAddedNew(dom->id, dom->name, dom->uuid,
> +                                          devAlias);
> +}
>  
>  static virObjectEventPtr
>  virDomainEventAgentLifecycleNew(int id,
> @@ -1537,6 +1603,17 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn,
>              goto cleanup;
>          }
>  
> +    case VIR_DOMAIN_EVENT_ID_DEVICE_ADDED:
> +        {
> +            virDomainEventDeviceAddedPtr deviceAddedEvent;
> +
> +            deviceAddedEvent = (virDomainEventDeviceAddedPtr)event;
> +            ((virConnectDomainEventDeviceAddedCallback)cb)(conn, dom,
> +                                                           deviceAddedEvent->devAlias,
> +                                                           cbopaque);
> +            goto cleanup;
> +        }
> +
>      case VIR_DOMAIN_EVENT_ID_LAST:
>          break;
>      }
> diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h
> index 534ff9e..afbed89 100644
> --- a/src/conf/domain_event.h
> +++ b/src/conf/domain_event.h
> @@ -185,6 +185,12 @@ virObjectEventPtr
>  virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom,
>                                        const char *devAlias);
>  virObjectEventPtr
> +virDomainEventDeviceAddedNewFromObj(virDomainObjPtr obj,
> +                                    const char *devAlias);
> +virObjectEventPtr
> +virDomainEventDeviceAddedNewFromDom(virDomainPtr dom,
> +                                    const char *devAlias);
> +virObjectEventPtr
>  virDomainEventTunableNewFromObj(virDomainObjPtr obj,
>                                  virTypedParameterPtr params,
>                                  int nparams);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9f82926..cbd8089 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -486,6 +486,8 @@ virDomainEventBlockJobNewFromDom;
>  virDomainEventBlockJobNewFromObj;
>  virDomainEventControlErrorNewFromDom;
>  virDomainEventControlErrorNewFromObj;
> +virDomainEventDeviceAddedNewFromDom;
> +virDomainEventDeviceAddedNewFromObj;
>  virDomainEventDeviceRemovedNewFromDom;
>  virDomainEventDeviceRemovedNewFromObj;
>  virDomainEventDiskChangeNewFromDom;
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index b275d86..9c3b53f 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -321,6 +321,10 @@ static void
>  remoteDomainBuildEventCallbackDeviceRemoved(virNetClientProgramPtr prog,
>                                              virNetClientPtr client,
>                                              void *evdata, void *opaque);
> +static void
> +remoteDomainBuildEventCallbackDeviceAdded(virNetClientProgramPtr prog,
> +                                          virNetClientPtr client,
> +                                          void *evdata, void *opaque);
>  
>  static void
>  remoteDomainBuildEventBlockJob2(virNetClientProgramPtr prog,
> @@ -496,6 +500,10 @@ static virNetClientProgramEvent remoteEvents[] = {
>        remoteDomainBuildEventCallbackAgentLifecycle,
>        sizeof(remote_domain_event_callback_agent_lifecycle_msg),
>        (xdrproc_t)xdr_remote_domain_event_callback_agent_lifecycle_msg },
> +    { REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED,
> +      remoteDomainBuildEventCallbackDeviceAdded,
> +      sizeof(remote_domain_event_callback_device_added_msg),
> +      (xdrproc_t)xdr_remote_domain_event_callback_device_added_msg },
>  };
>  
>  
> @@ -5431,6 +5439,27 @@ remoteDomainBuildEventCallbackDeviceRemoved(virNetClientProgramPtr prog ATTRIBUT
>      remoteDomainBuildEventDeviceRemovedHelper(conn, &msg->msg, msg->callbackID);
>  }
>  
> +static void
> +remoteDomainBuildEventCallbackDeviceAdded(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
> +                                          virNetClientPtr client ATTRIBUTE_UNUSED,
> +                                          void *evdata, void *opaque)
> +{
> +    virConnectPtr conn = opaque;
> +    remote_domain_event_callback_device_added_msg *msg = evdata;
> +    struct private_data *priv = conn->privateData;
> +    virDomainPtr dom;
> +    virObjectEventPtr event = NULL;
> +
> +    dom = get_nonnull_domain(conn, msg->dom);
> +    if (!dom)
> +        return;
> +
> +    event = virDomainEventDeviceAddedNewFromDom(dom, msg->devAlias);
> +
> +    virObjectUnref(dom);
> +
> +    remoteEventQueue(priv, event, msg->callbackID);
> +}
>  
>  static void
>  remoteDomainBuildEventCallbackTunable(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index d90e6b5..b02e58c 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -3045,6 +3045,12 @@ struct remote_domain_event_callback_tunable_msg {
>      remote_typed_param params<REMOTE_DOMAIN_EVENT_TUNABLE_MAX>;
>  };
>  
> +struct remote_domain_event_callback_device_added_msg {
> +    int callbackID;
> +    remote_nonnull_domain dom;
> +    remote_nonnull_string devAlias;
> +};
> +
>  struct remote_connect_get_cpu_model_names_args {
>      remote_nonnull_string arch;
>      int need_results;
> @@ -5643,5 +5649,11 @@ enum remote_procedure {
>       * @generate: none
>       * @acl: domain:read
>       */
> -    REMOTE_PROC_DOMAIN_INTERFACE_ADDRESSES = 353
> +    REMOTE_PROC_DOMAIN_INTERFACE_ADDRESSES = 353,
> +
> +    /**
> +     * @generate: both
> +     * @acl: none
> +     */
> +    REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED = 354
>  };
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index e614f77..2b6b47a 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -2487,6 +2487,11 @@ struct remote_domain_event_callback_tunable_msg {
>                  remote_typed_param * params_val;
>          } params;
>  };
> +struct remote_domain_event_callback_device_added_msg {
> +        int                        callbackID;
> +        remote_nonnull_domain      dom;
> +        remote_nonnull_string      devAlias;
> +};
>  struct remote_connect_get_cpu_model_names_args {
>          remote_nonnull_string      arch;
>          int                        need_results;
> @@ -3017,4 +3022,5 @@ enum remote_procedure {
>          REMOTE_PROC_DOMAIN_GET_IOTHREAD_INFO = 351,
>          REMOTE_PROC_DOMAIN_PIN_IOTHREAD = 352,
>          REMOTE_PROC_DOMAIN_INTERFACE_ADDRESSES = 353,
> +        REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED = 354,
>  };
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 020a308..aeacf59 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -11959,6 +11959,24 @@ vshEventDeviceRemovedPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
>  }
>  
>  static void
> +vshEventDeviceAddedPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                           virDomainPtr dom,
> +                           const char *alias,
> +                           void *opaque)
> +{
> +    vshDomEventData *data = opaque;
> +
> +    if (!data->loop && *data->count)
> +        return;
> +    vshPrint(data->ctl,
> +             _("event 'device-added' for domain %s: %s\n"),
> +             virDomainGetName(dom), alias);
> +    (*data->count)++;
> +    if (!data->loop)
> +        vshEventDone(data->ctl);
> +}
> +
> +static void
>  vshEventTunablePrint(virConnectPtr conn ATTRIBUTE_UNUSED,
>                       virDomainPtr dom,
>                       virTypedParameterPtr params,
> @@ -12063,6 +12081,8 @@ static vshEventCallback vshEventCallbacks[] = {
>        VIR_DOMAIN_EVENT_CALLBACK(vshEventTunablePrint), },
>      { "agent-lifecycle",
>        VIR_DOMAIN_EVENT_CALLBACK(vshEventAgentLifecyclePrint), },
> +    { "device-added",
> +      VIR_DOMAIN_EVENT_CALLBACK(vshEventDeviceAddedPrint), },
>  };
>  verify(VIR_DOMAIN_EVENT_ID_LAST == ARRAY_CARDINALITY(vshEventCallbacks));
>  
> 




More information about the libvir-list mailing list