[libvirt] RFC [2/3]: The lock manager plugin driver API

Daniel P. Berrange berrange at redhat.com
Fri Sep 10 16:00:52 UTC 2010


typedef struct _virLockManagerDriver virLockManagerDriver;
typedef virLockManagerDriver *virLockManagerDriverPtr;

/* Which callbacks are supported */
typedef enum {
    VIR_LOCK_MANAGER_DRIVER_RESOURCES = (1 << 0),
    VIR_LOCK_MANAGER_DRIVER_MIGRATE   = (1 << 0),
    VIR_LOCK_MANAGER_DRIVER_HOTPLUG   = (1 << 1),
};

struct _virLockManagerDriver {
    /**
     * @version: the newest implemented plugin ABI version
     * @flags: the implemented plugin optional extras
     */
    unsigned int version;
    unsigned int flags;

    /**
     * load_drv:
     * @version: the libvirt requested plugin ABI version
     * @flags: the libvirt requested plugin optional extras
     *
     * Allow the plugin to validate the libvirt requested
     * plugin version / flags. This allows it to reject
     * use of versions which are too old. A plugin may
     * be loaded multiple times, for different libvirt
     * drivers
     *
     * Returns -1 if the requested version/flags were inadequate
     */
    int (*load_drv)(unsigned int version,
                    unsigned int flags);

    /**
     * unload_drv:
     *
     * Called to release any resources prior to the plugin
     * being unloaded from memory. Returns -1 to prevent
     * plugin unloading.
     */
    int (*load_drv)(void);

    /* Mandatory callbacks */
    virLockManagerPtr (*new_drv)(unsigned int type,
                                 unsigned int flags);

    int (*set_parameter_drv)(virLockManagerPtr man,
                             const char *key,
                             const char *value);

    char *(*get_supervisor_path_drv)(virLockManagerPtr man);
    char *(*get_supervisor_context_drv)(virLockManagerPtr man);
    int (*get_supervisor_args_drv)(virLockManagerPtr man,
                                   char ***argv,
                                   int *argc,
                                   unsigned int flags);

    int (*connect_drv)(virLockManagerPtr man,
                       unsigned int flags);
    int (*startup_drv)(virLockManagerPtr man,
                       pid_t *pid,
                       unsigned int flags);
    int (*shutdown_drv)(virLockManagerPtr man,
                        unsigned int flags);
    void (*free_drv)(virLockManagerPtr man);
    /* End of mandatory callbacks */


    /* Only if VIR_LOCK_MANAGER_DRIVER_RESOURCES */
    int (*set_file_drv)(virLockManagerPtr man,
                        const char *file,
                        unsigned int flags);


    /* Only if VIR_LOCK_MANAGER_DRIVER_HOTPLUG */
    int (*add_file_drv)(virLockManagerPtr man,
                        const char *file,
                        unsigned int flags);
    int (*remove_file_drv)(virLockManagerPtr man,
                           const char *file,
                           unsigned int flags);


    /* Only if VIR_LOCK_MANAGER_DRIVER_MIGRATE */
    int (*prepare_migrate_drv)(virLockManagerPtr man,
                               const gchar *targetURI,
                               unsigned int flags);
    int (*complete_migrate_out_drv)(virLockManagerPtr man,
                                    const gchar *targetURI,
                                    unsigned int flags);
    int (*complete_migrate_in_drv)(virLockManagerPtr man,
                                   const gchar *sourceURI,
                                   unsigned int flags);

};

/**
 * virLockManagerPluginDriver:
 *
 * The signature of the function for obtaining a lock manager
 * driver from a dlopen()d plugin module. The plugin must contain
 * a symbol called "plugin_init" with this signature
 */
typedef virLockManagerDriverPtr (*virLockManagerPluginDriver)(void);

/**
 * virLockManagerPluginLoad:
 * @name: the name of the plugin
 *
 * Attempt to load the plugin $(libdir)/libvirt/lock-manager/@name.so
 * The plugin driver entry point will be resolved & invoked to obtain
 * the lock manager driver
 */
virLockManagerPluginPtr virLockManagerPluginLoad(const char *name);
int virLockManagerPluginUnload(virLockManagerPluginPtr);

-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list