From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 15162992252029.202131430073337; Thu, 18 Jan 2018 10:13:45 -0800 (PST) Received: from localhost ([::1]:45711 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEgs-00035z-IU for importer@patchew.org; Thu, 18 Jan 2018 13:13:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59742) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WC-KK for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004NX-Ir for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54328) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HL-9v; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-8t; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:18 +0300 Message-Id: <20180118181123.37056-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 1/6] qapi: add name parameter to nbd-server-add X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Allow user to specify name for new export, to not reuse internal node name and to not show it to clients. This also allows creating several exports per device. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- qapi/block.json | 9 +++++++-- blockdev-nbd.c | 14 +++++++++----- hmp.c | 5 +++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/qapi/block.json b/qapi/block.json index f093fa3f27..353e3a45bd 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -213,14 +213,19 @@ # # @device: The device name or node name of the node to be exported # +# @name: Export name. If unspecified, the @device parameter is used as the +# export name. (Since 2.12) +# # @writable: Whether clients should be able to write to the device via the # NBD connection (default false). # -# Returns: error if the device is already marked for export. +# Returns: error if the server is not running, or export with the same name +# already exists. # # Since: 1.3.0 ## -{ 'command': 'nbd-server-add', 'data': {'device': 'str', '*writable': 'boo= l'} } +{ 'command': 'nbd-server-add', + 'data': {'device': 'str', '*name': 'str', '*writable': 'bool'} } =20 ## # @nbd-server-stop: diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 9e3c22109c..104789e521 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -140,8 +140,8 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr, qapi_free_SocketAddress(addr_flat); } =20 -void qmp_nbd_server_add(const char *device, bool has_writable, bool writab= le, - Error **errp) +void qmp_nbd_server_add(const char *device, bool has_name, const char *nam= e, + bool has_writable, bool writable, Error **errp) { BlockDriverState *bs =3D NULL; BlockBackend *on_eject_blk; @@ -152,8 +152,12 @@ void qmp_nbd_server_add(const char *device, bool has_w= ritable, bool writable, return; } =20 - if (nbd_export_find(device)) { - error_setg(errp, "NBD server already exporting device '%s'", devic= e); + if (!has_name) { + name =3D device; + } + + if (nbd_export_find(name)) { + error_setg(errp, "NBD server already has export named '%s'", name); return; } =20 @@ -177,7 +181,7 @@ void qmp_nbd_server_add(const char *device, bool has_wr= itable, bool writable, return; } =20 - nbd_export_set_name(exp, device); + nbd_export_set_name(exp, name); =20 /* The list of named exports has a strong reference to this export now= and * our only way of accessing it is through nbd_export_find(), so we ca= n drop diff --git a/hmp.c b/hmp.c index c6bab5373b..37972f8322 100644 --- a/hmp.c +++ b/hmp.c @@ -2218,7 +2218,8 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *= qdict) continue; } =20 - qmp_nbd_server_add(info->value->device, true, writable, &local_err= ); + qmp_nbd_server_add(info->value->device, false, NULL, + true, writable, &local_err); =20 if (local_err !=3D NULL) { qmp_nbd_server_stop(NULL); @@ -2238,7 +2239,7 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qd= ict) bool writable =3D qdict_get_try_bool(qdict, "writable", false); Error *local_err =3D NULL; =20 - qmp_nbd_server_add(device, true, writable, &local_err); + qmp_nbd_server_add(device, false, NULL, true, writable, &local_err); =20 if (local_err !=3D NULL) { hmp_handle_error(mon, &local_err); --=20 2.11.1 From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151629934981374.56497499222155; Thu, 18 Jan 2018 10:15:49 -0800 (PST) Received: from localhost ([::1]:45754 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEj6-00057m-Uz for importer@patchew.org; Thu, 18 Jan 2018 13:15:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59743) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WD-K5 for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004Nu-TG for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54308) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HH-Lb; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-Am; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:19 +0300 Message-Id: <20180118181123.37056-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 2/6] hmp: add name parameter to nbd_server_add X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Support name parameter for HMP too. Signed-off-by: Vladimir Sementsov-Ogievskiy --- hmp.c | 3 ++- hmp-commands.hx | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hmp.c b/hmp.c index 37972f8322..964cff8aed 100644 --- a/hmp.c +++ b/hmp.c @@ -2236,10 +2236,11 @@ exit: void hmp_nbd_server_add(Monitor *mon, const QDict *qdict) { const char *device =3D qdict_get_str(qdict, "device"); + const char *name =3D qdict_get_try_str(qdict, "name"); bool writable =3D qdict_get_try_bool(qdict, "writable", false); Error *local_err =3D NULL; =20 - qmp_nbd_server_add(device, false, NULL, true, writable, &local_err); + qmp_nbd_server_add(device, name !=3D NULL, name, true, writable, &loca= l_err); =20 if (local_err !=3D NULL) { hmp_handle_error(mon, &local_err); diff --git a/hmp-commands.hx b/hmp-commands.hx index 6d5ebdf6ab..cad9a9a238 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1553,8 +1553,8 @@ ETEXI =20 { .name =3D "nbd_server_add", - .args_type =3D "writable:-w,device:B", - .params =3D "nbd_server_add [-w] device", + .args_type =3D "name:-n,writable:-w,device:B", + .params =3D "nbd_server_add [-n] [-w] device", .help =3D "export a block device via NBD", .cmd =3D hmp_nbd_server_add, }, @@ -1562,8 +1562,9 @@ STEXI @item nbd_server_add @var{device} @findex nbd_server_add Export a block device through QEMU's NBD server, which must be started -beforehand with @command{nbd_server_start}. The @option{-w} option makes = the -exported device writable too. +beforehand with @command{nbd_server_start}. The @option{-n} option sets ex= port +name. If @option{-n} option is unspecified, the @var{device} parameter is = used. +The @option{-w} option makes the exported device writable too. ETEXI =20 { --=20 2.11.1 From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516299349942154.01046847191742; Thu, 18 Jan 2018 10:15:49 -0800 (PST) Received: from localhost ([::1]:45755 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEj7-00058H-16 for importer@patchew.org; Thu, 18 Jan 2018 13:15:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59747) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WG-Ka for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004Mo-AJ for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54322) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HI-2N; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-E7; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:20 +0300 Message-Id: <20180118181123.37056-4-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 3/6] qapi: add nbd-server-remove X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add command for export removing. It is needed for cases when we don't want to keep export after the operation on it was completed. The other example is temporary node, created with blockdev-add. If we want to delete it we should firstly remove corresponding NBD export. Signed-off-by: Vladimir Sementsov-Ogievskiy --- qapi/block.json | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/block/nbd.h | 1 + blockdev-nbd.c | 24 ++++++++++++++++++++++++ nbd/server.c | 21 +++++++++++++++++++++ 4 files changed, 91 insertions(+) diff --git a/qapi/block.json b/qapi/block.json index 353e3a45bd..ddf73932ce 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -228,6 +228,51 @@ 'data': {'device': 'str', '*name': 'str', '*writable': 'bool'} } =20 ## +# @NbdServerRemoveMode: +# +# Mode of NBD export removing. +# +# @safe: Remove export if there are no existing connections, fail otherwis= e. +# +# @hard: Drop all connections immediately and remove export. +# +# Postponed, not realized yet modes: +# +# hide: Just hide export from new clients, leave existing connections as i= s. +# Remove export after all clients are disconnected. nbd-server-remove +# with mode=3Dsoft or mode=3Dhard may be called after nbd-server-rem= ove +# with mode=3Dhide. +# +# soft: Hide export from new clients, answer with ESHUTDOWN for all further +# requests from existing clients. Remove export after all clients are +# disconnected. nbd-server-requests with mode=3Dhard may be called a= fter +# nbd-server-remove with mode=3Dsoft +# +# Since: 2.12 +## +{'enum': 'NbdServerRemoveMode', 'data': ['safe', 'hard']} + +## +# @nbd-server-remove: +# +# Remove NBD export by name. +# +# @name: Export name. +# +# @mode: Mode of command operation. See @NbdServerRemoveMode description. +# Default is 'safe'. +# +# Returns: error if +# - the server is not running +# - export is not found +# - mode is 'safe' and there are existing connections +# +# Since: 2.12 +## +{ 'command': 'nbd-server-remove', + 'data': {'name': 'str', '*mode': 'NbdServerRemoveMode'} } + +## # @nbd-server-stop: # # Stop QEMU's embedded NBD server, and unregister all devices previously diff --git a/include/block/nbd.h b/include/block/nbd.h index 978e443366..ee74ec391a 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -261,6 +261,7 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t d= ev_offset, off_t size, bool writethrough, BlockBackend *on_eject_blk, Error **errp); void nbd_export_close(NBDExport *exp); +void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **e= rrp); void nbd_export_get(NBDExport *exp); void nbd_export_put(NBDExport *exp); =20 diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 104789e521..a9f79c6778 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -189,6 +189,30 @@ void qmp_nbd_server_add(const char *device, bool has_n= ame, const char *name, nbd_export_put(exp); } =20 +void qmp_nbd_server_remove(const char *name, + bool has_mode, NbdServerRemoveMode mode, + Error **errp) +{ + NBDExport *exp; + + if (!nbd_server) { + error_setg(errp, "NBD server not running"); + return; + } + + exp =3D nbd_export_find(name); + if (exp =3D=3D NULL) { + error_setg(errp, "Export '%s' is not found", name); + return; + } + + if (!has_mode) { + mode =3D NBD_SERVER_REMOVE_MODE_SAFE; + } + + nbd_export_remove(exp, mode, errp); +} + void qmp_nbd_server_stop(Error **errp) { nbd_export_close_all(); diff --git a/nbd/server.c b/nbd/server.c index 6cf2eeb2c1..fdb6be7016 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1177,6 +1177,27 @@ void nbd_export_close(NBDExport *exp) nbd_export_put(exp); } =20 +void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **e= rrp) +{ + NBDClient *client; + int nb_clients =3D 0; + + if (mode =3D=3D NBD_SERVER_REMOVE_MODE_HARD || QTAILQ_EMPTY(&exp->clie= nts)) { + nbd_export_close(exp); + return; + } + + assert(mode =3D=3D NBD_SERVER_REMOVE_MODE_SAFE); + + QTAILQ_FOREACH(client, &exp->clients, next) { + nb_clients++; + } + + error_setg(errp, "NBD export '%s' has %d active connection%s. To force= " + "remove it (and hard disconnect clients) use mode=3D'hard'", + exp->name, nb_clients, nb_clients =3D=3D 1 ? "" : "s"); +} + void nbd_export_get(NBDExport *exp) { assert(exp->refcount > 0); --=20 2.11.1 From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151629935079545.56491192577971; Thu, 18 Jan 2018 10:15:50 -0800 (PST) Received: from localhost ([::1]:45756 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEj7-00059j-UR for importer@patchew.org; Thu, 18 Jan 2018 13:15:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59745) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WE-KU for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004MZ-9X for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54332) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HJ-2I; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-I3; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:21 +0300 Message-Id: <20180118181123.37056-5-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 4/6] iotest 147: add cases to test new @name parameter of nbd-server-add X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- tests/qemu-iotests/147 | 68 +++++++++++++++++++++++++++++++++++++-----= ---- tests/qemu-iotests/147.out | 4 +-- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/tests/qemu-iotests/147 b/tests/qemu-iotests/147 index 90f40ed245..d2081df84b 100755 --- a/tests/qemu-iotests/147 +++ b/tests/qemu-iotests/147 @@ -38,8 +38,8 @@ def flatten_sock_addr(crumpled_address): =20 =20 class NBDBlockdevAddBase(iotests.QMPTestCase): - def blockdev_add_options(self, address, export=3DNone): - options =3D { 'node-name': 'nbd-blockdev', + def blockdev_add_options(self, address, export, node_name): + options =3D { 'node-name': node_name, 'driver': 'raw', 'file': { 'driver': 'nbd', @@ -50,23 +50,28 @@ class NBDBlockdevAddBase(iotests.QMPTestCase): options['file']['export'] =3D export return options =20 - def client_test(self, filename, address, export=3DNone): - bao =3D self.blockdev_add_options(address, export) + def client_test(self, filename, address, export=3DNone, + node_name=3D'nbd-blockdev', delete=3DTrue): + bao =3D self.blockdev_add_options(address, export, node_name) result =3D self.vm.qmp('blockdev-add', **bao) self.assert_qmp(result, 'return', {}) =20 + found =3D False result =3D self.vm.qmp('query-named-block-nodes') for node in result['return']: - if node['node-name'] =3D=3D 'nbd-blockdev': + if node['node-name'] =3D=3D node_name: + found =3D True if isinstance(filename, str): self.assert_qmp(node, 'image/filename', filename) else: self.assert_json_filename_equal(node['image']['filenam= e'], filename) break + self.assertTrue(found) =20 - result =3D self.vm.qmp('blockdev-del', node_name=3D'nbd-blockdev') - self.assert_qmp(result, 'return', {}) + if delete: + result =3D self.vm.qmp('blockdev-del', node_name=3Dnode_name) + self.assert_qmp(result, 'return', {}) =20 =20 class QemuNBD(NBDBlockdevAddBase): @@ -125,26 +130,63 @@ class BuiltinNBD(NBDBlockdevAddBase): except OSError: pass =20 - def _server_up(self, address): + def _server_up(self, address, export_name=3DNone, export_name2=3DNone): result =3D self.server.qmp('nbd-server-start', addr=3Daddress) self.assert_qmp(result, 'return', {}) =20 - result =3D self.server.qmp('nbd-server-add', device=3D'nbd-export') + if export_name is None: + result =3D self.server.qmp('nbd-server-add', device=3D'nbd-exp= ort') + else: + result =3D self.server.qmp('nbd-server-add', device=3D'nbd-exp= ort', + name=3Dexport_name) self.assert_qmp(result, 'return', {}) =20 + if export_name2 is not None: + result =3D self.server.qmp('nbd-server-add', device=3D'nbd-exp= ort', + name=3Dexport_name2) + self.assert_qmp(result, 'return', {}) + + def _server_down(self): result =3D self.server.qmp('nbd-server-stop') self.assert_qmp(result, 'return', {}) =20 - def test_inet(self): + def do_test_inet(self, export_name=3DNone): address =3D { 'type': 'inet', 'data': { 'host': 'localhost', 'port': str(NBD_PORT) } } - self._server_up(address) - self.client_test('nbd://localhost:%i/nbd-export' % NBD_PORT, - flatten_sock_addr(address), 'nbd-export') + self._server_up(address, export_name) + export_name =3D export_name or 'nbd-export' + self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, export_name), + flatten_sock_addr(address), export_name) + self._server_down() + + def test_inet_default_export_name(self): + self.do_test_inet() + + def test_inet_same_export_name(self): + self.do_test_inet('nbd-export') + + def test_inet_different_export_name(self): + self.do_test_inet('shadow') + + def test_inet_two_exports(self): + address =3D { 'type': 'inet', + 'data': { + 'host': 'localhost', + 'port': str(NBD_PORT) + } } + self._server_up(address, 'exp1', 'exp2') + self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, 'exp1'), + flatten_sock_addr(address), 'exp1', 'node1', Fals= e) + self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, 'exp2'), + flatten_sock_addr(address), 'exp2', 'node2', Fals= e) + result =3D self.vm.qmp('blockdev-del', node_name=3D'node1') + self.assert_qmp(result, 'return', {}) + result =3D self.vm.qmp('blockdev-del', node_name=3D'node2') + self.assert_qmp(result, 'return', {}) self._server_down() =20 def test_inet6(self): diff --git a/tests/qemu-iotests/147.out b/tests/qemu-iotests/147.out index 3f8a935a08..dae404e278 100644 --- a/tests/qemu-iotests/147.out +++ b/tests/qemu-iotests/147.out @@ -1,5 +1,5 @@ -...... +......... ---------------------------------------------------------------------- -Ran 6 tests +Ran 9 tests =20 OK --=20 2.11.1 From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516299223508959.7386318642584; Thu, 18 Jan 2018 10:13:43 -0800 (PST) Received: from localhost ([::1]:45699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEgr-00033x-Ll for importer@patchew.org; Thu, 18 Jan 2018 13:13:29 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59741) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WB-Jn for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004Mb-9l for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54312) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HG-1r; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-Jk; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:22 +0300 Message-Id: <20180118181123.37056-6-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 5/6] iotests: implement QemuIoInteractive class X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Implement QemuIoInteractive to test nbd-server-remove command when there are active connections. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/iotests.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 44477e9295..5a10b2d534 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -93,6 +93,44 @@ def qemu_io(*args): sys.stderr.write('qemu-io received signal %i: %s\n' % (-exitcode, = ' '.join(args))) return subp.communicate()[0] =20 + +class QemuIoInteractive: + def __init__(self, *args): + self.args =3D qemu_io_args + list(args) + self._p =3D subprocess.Popen(self.args, stdin=3Dsubprocess.PIPE, + stdout=3Dsubprocess.PIPE, + stderr=3Dsubprocess.STDOUT) + assert self._p.stdout.read(9) =3D=3D 'qemu-io> ' + + def close(self): + self._p.communicate('q\n') + + def _read_output(self): + pattern =3D 'qemu-io> ' + n =3D len(pattern) + pos =3D 0 + s =3D [] + while pos !=3D n: + c =3D self._p.stdout.read(1) + # check unexpected EOF + assert c !=3D '' + s.append(c) + if c =3D=3D pattern[pos]: + pos +=3D 1 + else: + pos =3D 0 + + return ''.join(s[:-n]) + + def cmd(self, cmd): + # quit command is in close(), '\n' is added automatically + assert '\n' not in cmd + cmd =3D cmd.strip() + assert cmd !=3D 'q' and cmd !=3D 'quit' + self._p.stdin.write(cmd + '\n') + return self._read_output() + + def qemu_nbd(*args): '''Run qemu-nbd in daemon mode and return the parent's exit code''' return subprocess.call(qemu_nbd_args + ['--fork'] + list(args)) --=20 2.11.1 From nobody Sat Apr 27 17:15:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516299509345128.1336070926418; Thu, 18 Jan 2018 10:18:29 -0800 (PST) Received: from localhost ([::1]:45922 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecElg-0007SC-JY for importer@patchew.org; Thu, 18 Jan 2018 13:18:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59740) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecEex-0001WA-JG for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecEeu-0004NP-Hv for qemu-devel@nongnu.org; Thu, 18 Jan 2018 13:11:31 -0500 Received: from new-relay.sw.ru ([195.214.232.40]:54318) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ecEeu-0004HK-AE; Thu, 18 Jan 2018 13:11:28 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by new-relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1ecEeq-0002kG-LZ; Thu, 18 Jan 2018 21:11:24 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 18 Jan 2018 21:11:23 +0300 Message-Id: <20180118181123.37056-7-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180118181123.37056-1-vsementsov@virtuozzo.com> References: <20180118181123.37056-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 195.214.232.40 Subject: [Qemu-devel] [PATCH v2 6/6] iotest 201: new test for qmp nbd-server-remove X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- tests/qemu-iotests/201 | 159 +++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/201.out | 5 ++ tests/qemu-iotests/group | 1 + 3 files changed, 165 insertions(+) create mode 100644 tests/qemu-iotests/201 create mode 100644 tests/qemu-iotests/201.out diff --git a/tests/qemu-iotests/201 b/tests/qemu-iotests/201 new file mode 100644 index 0000000000..1ac6d953c0 --- /dev/null +++ b/tests/qemu-iotests/201 @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# +# Tests for qmp command nbd-server-remove. +# +# Copyright (c) 2017 Virtuozzo International GmbH +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os +import sys +import iotests +import time +from iotests import qemu_img, qemu_io, filter_qemu_io, QemuIoInteractive + +nbd_port =3D '10900' +nbd_uri =3D 'nbd+tcp://localhost:' + nbd_port + '/exp' +disk =3D os.path.join(iotests.test_dir, 'disk') + + +class TestNbdServerRemove(iotests.QMPTestCase): + def setUp(self): + qemu_img('create', '-f', iotests.imgfmt, disk, '1M') + + self.vm =3D iotests.VM().add_drive(disk) + self.vm.launch() + + address =3D { + 'type': 'inet', + 'data': { + 'host': 'localhost', + 'port': nbd_port + } + } + + result =3D self.vm.qmp('nbd-server-start', addr=3Daddress) + self.assert_qmp(result, 'return', {}) + result =3D self.vm.qmp('nbd-server-add', device=3D'drive0', name= =3D'exp') + self.assert_qmp(result, 'return', {}) + + def tearDown(self): + self.vm.shutdown() + os.remove(disk) + + def remove_export(self, name, mode=3DNone): + if mode is None: + return self.vm.qmp('nbd-server-remove', name=3Dname) + else: + return self.vm.qmp('nbd-server-remove', name=3Dname, mode=3Dmo= de) + + def assertExportNotFound(self, name): + result =3D self.vm.qmp('nbd-server-remove', name=3Dname) + self.assert_qmp(result, 'error/desc', "Export 'exp' is not found") + + def assertExistingClients(self, result): + self.assert_qmp(result, 'error/desc', + "NBD export 'exp' has 1 active connection. To forc= e " + "remove it (and hard disconnect clients) use " + "mode=3D'hard'") + + def assertReadOk(self, qemu_io_output): + self.assertEqual( + filter_qemu_io(qemu_io_output).strip(), + 'read 512/512 bytes at offset 0\n' + + '512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec= )') + + def assertReadFailed(self, qemu_io_output): + self.assertEqual(filter_qemu_io(qemu_io_output).strip(), + 'read failed: Input/output error') + + def assertConnectFailed(self, qemu_io_output): + self.assertEqual(filter_qemu_io(qemu_io_output).strip(), + "can't open device nbd+tcp://localhost:" + nbd_po= rt + + "/exp: Requested export not available\n" + "server reported: export 'exp' not present") + + def do_test_connect_after_remove(self, mode=3DNone): + args =3D ('-r', '-f', 'raw', '-c', 'read 0 512', nbd_uri) + self.assertReadOk(qemu_io(*args)) + + result =3D self.remove_export('exp', mode) + self.assert_qmp(result, 'return', {}) + + self.assertExportNotFound('exp') + self.assertConnectFailed(qemu_io(*args)) + + def test_connect_after_remove_default(self): + self.do_test_connect_after_remove() + + def test_connect_after_remove_safe(self): + self.do_test_connect_after_remove('safe') + + def test_connect_after_remove_force(self): + self.do_test_connect_after_remove('hard') + + def do_test_remove_during_connect_safe(self, mode=3DNone): + qio =3D QemuIoInteractive('-r', '-f', 'raw', nbd_uri) + self.assertReadOk(qio.cmd('read 0 512')) + + result =3D self.remove_export('exp', mode) + self.assertExistingClients(result) + + self.assertReadOk(qio.cmd('read 0 512')) + + qio.close() + + result =3D self.remove_export('exp', mode) + self.assert_qmp(result, 'return', {}) + + self.assertExportNotFound('exp') + + def test_remove_during_connect_default(self): + self.do_test_remove_during_connect_safe() + + def test_remove_during_connect_safe(self): + self.do_test_remove_during_connect_safe('safe') + + def test_remove_during_connect_hard(self): + qio =3D QemuIoInteractive('-r', '-f', 'raw', nbd_uri) + self.assertReadOk(qio.cmd('read 0 512')) + + result =3D self.remove_export('exp', 'hard') + self.assert_qmp(result, 'return', {}) + + self.assertReadFailed(qio.cmd('read 0 512')) + self.assertExportNotFound('exp') + + qio.close() + + def test_remove_during_connect_safe_hard(self): + qio =3D QemuIoInteractive('-r', '-f', 'raw', nbd_uri) + self.assertReadOk(qio.cmd('read 0 512')) + + result =3D self.remove_export('exp', 'safe') + self.assertExistingClients(result) + + self.assertReadOk(qio.cmd('read 0 512')) + + result =3D self.remove_export('exp', 'hard') + self.assert_qmp(result, 'return', {}) + + self.assertExportNotFound('exp') + self.assertReadFailed(qio.cmd('read 0 512')) + qio.close() + + +if __name__ =3D=3D '__main__': + iotests.main() diff --git a/tests/qemu-iotests/201.out b/tests/qemu-iotests/201.out new file mode 100644 index 0000000000..2f7d3902f2 --- /dev/null +++ b/tests/qemu-iotests/201.out @@ -0,0 +1,5 @@ +....... +---------------------------------------------------------------------- +Ran 7 tests + +OK diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 93d96fb22f..f07d3e3df6 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -197,5 +197,6 @@ 197 rw auto quick 198 rw auto 200 rw auto +201 rw auto quick 202 rw auto quick 203 rw auto --=20 2.11.1