From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24055 invoked by alias); 20 Jul 2011 15:15:43 -0000 Received: (qmail 24038 invoked by uid 9699); 20 Jul 2011 15:15:42 -0000 Date: Wed, 20 Jul 2011 15:15:00 -0000 Message-ID: <20110720151542.24036.qmail@sourceware.org> From: mornfall@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/daemons/lvmetad testclient.c Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2011-07/txt/msg00045.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mornfall@sourceware.org 2011-07-20 15:15:42 Modified files: daemons/lvmetad: testclient.c Log message: Add code to lvmetad's testclient that scans an actual physical device, effectively emulating a future "pvscan --lvmetad" command. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/testclient.c.diff?cvsroot=lvm2&r1=1.8&r2=1.9 --- LVM2/daemons/lvmetad/testclient.c 2011/07/19 16:48:13 1.8 +++ LVM2/daemons/lvmetad/testclient.c 2011/07/20 15:15:41 1.9 @@ -1,8 +1,12 @@ #include "lvmetad-client.h" +#include "label.h" +#include "lvmcache.h" +#include "metadata.h" const char *uuid1 = "abcd-efgh"; const char *uuid2 = "bbcd-efgh"; const char *vgid = "yada-yada"; +const char *uuid3 = "cbcd-efgh"; const char *metadata2 = "{\n" "id = \"yada-yada\"\n" @@ -23,27 +27,100 @@ "}\n" "}\n"; -void pv_add(daemon_handle h, const char *uuid, const char *metadata) -{ - daemon_reply reply = daemon_send_simple(h, "pv_add", "uuid = %s", uuid, - "metadata = %b", metadata, - NULL); +void _handle_reply(daemon_reply reply) { const char *repl = daemon_reply_str(reply, "response", NULL); + const char *status = daemon_reply_str(reply, "status", NULL); + const char *vgid = daemon_reply_str(reply, "vgid", NULL); + fprintf(stderr, "[C] REPLY: %s\n", repl); if (!strcmp(repl, "failed")) fprintf(stderr, "[C] REASON: %s\n", daemon_reply_str(reply, "reason", "unknown")); + if (vgid) + fprintf(stderr, "[C] VGID: %s\n", vgid); + if (status) + fprintf(stderr, "[C] STATUS: %s\n", status); daemon_reply_destroy(reply); } -int main() { - daemon_handle h = lvmetad_open(); +void _pv_add(daemon_handle h, const char *uuid, const char *metadata) +{ + daemon_reply reply = daemon_send_simple(h, "pv_add", "uuid = %s", uuid, + "metadata = %b", metadata, + NULL); + _handle_reply(reply); +} - pv_add(h, uuid1, NULL); - pv_add(h, uuid2, metadata2); +int scan(daemon_handle h, char *fn) { + struct device *dev = dev_cache_get(fn, NULL); - daemon_reply reply = daemon_send_simple(h, "vg_by_uuid", "uuid = %s", vgid, NULL); + struct label *label; + if (!label_read(dev, &label, 0)) { + fprintf(stderr, "[C] no label found on %s\n", fn); + return; + } + + char uuid[64]; + id_write_format(dev->pvid, uuid, 64); + fprintf(stderr, "[C] found PV: %s\n", uuid); + struct lvmcache_info *info = (struct lvmcache_info *) label->info; + struct physical_volume pv = { 0, }; + + if (!(info->fmt->ops->pv_read(info->fmt, dev_name(dev), &pv, 0))) { + fprintf(stderr, "[C] Failed to read PV %s", dev_name(dev)); + return; + } + + struct format_instance_ctx fic; + struct format_instance *fid = info->fmt->ops->create_instance(info->fmt, &fic); + struct metadata_area *mda; + struct volume_group *vg = NULL; + dm_list_iterate_items(mda, &info->mdas) { + struct volume_group *this = mda->ops->vg_read(fid, "", mda); + if (this && !vg || this->seqno > vg->seqno) + vg = this; + } + if (vg) { + char *buf = NULL; + /* TODO. This is not entirely correct, since export_vg_to_buffer + * adds trailing garbage to the buffer. We may need to use + * export_vg_to_config_tree and format the buffer ourselves. It + * does, however, work for now, since the garbage is well + * formatted and has no conflicting keys with the rest of the + * request. */ + export_vg_to_buffer(vg, &buf); + daemon_reply reply = + daemon_send_simple(h, "pv_add", "uuid = %s", uuid, + "metadata = %b", strchr(buf, '{'), + NULL); + _handle_reply(reply); + } +} + +void _dump_vg(daemon_handle h, const char *uuid) +{ + daemon_reply reply = daemon_send_simple(h, "vg_by_uuid", "uuid = %s", uuid, NULL); fprintf(stderr, "[C] reply buffer: %s\n", reply.buffer); daemon_reply_destroy(reply); +} + +int main(int argc, char **argv) { + daemon_handle h = lvmetad_open(); + + if (argc > 1) { + int i; + struct cmd_context *cmd = create_toolcontext(0, NULL, 0); + for (i = 1; i < argc; ++i) { + const char *uuid = NULL; + scan(h, argv[i]); + } + destroy_toolcontext(cmd); + return 0; + } + + _pv_add(h, uuid1, NULL); + _pv_add(h, uuid2, metadata2); + _dump_vg(h, vgid); + _pv_add(h, uuid3, NULL); daemon_close(h); return 0;