From nobody Fri Apr 26 20:47:45 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1575257082; cv=none; d=zohomail.com; s=zohoarc; b=W7xRM0J9NdFHKT3rqEOEwpbWQp3aPws1LwnmHL5jmaVT4hI05r0qImHwpk0l1P1ZWXjhophswgD3wrGzV1cSe40lh/R+3XNL7RcT6x1aO9vLWqGaw0N/OVYRxbD2LcW2m5TXYScW8gjys8S72Hmz1h99koPlyw7coAGPGaBPlZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1575257082; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=O7yMUdI4PDd40hpIRoZo9amhDKW6jf0ASXop+wYPnoM=; b=aQp1sTPx4Ke5KUUQmiyJuq9ziMHSYZSnmcVWtmXsnRXpL7uIqJabi2HVl3HL0NxVAHyPabBI/aLjnAVI7rT8m6Yg2DWpHNQevMzu+dy1k5vch7j6myRYHCIckEPo4pIS00NOxYZX0fvifaaW37j7wcEhJeoR6qwbrOs7l/tdvaY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1575257082547613.9292849067325; Sun, 1 Dec 2019 19:24:42 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-305-YJJtDbT-O2OU0uyK6kSoUw-1; Sun, 01 Dec 2019 22:24:39 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 033DF1005510; Mon, 2 Dec 2019 03:24:34 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8829819C68; Mon, 2 Dec 2019 03:24:33 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 2C4924EA2E; Mon, 2 Dec 2019 03:24:31 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id xB23OThN032278 for ; Sun, 1 Dec 2019 22:24:29 -0500 Received: by smtp.corp.redhat.com (Postfix) id 6CE7110031E5; Mon, 2 Dec 2019 03:24:29 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 68C621005E57 for ; Mon, 2 Dec 2019 03:24:27 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 186C5185AB84 for ; Mon, 2 Dec 2019 03:24:27 +0000 (UTC) Received: from mail-qv1-f67.google.com (mail-qv1-f67.google.com [209.85.219.67]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-51-_m7LVh6IPhuiOoBJOWfe-Q-1; Sun, 01 Dec 2019 22:24:25 -0500 Received: by mail-qv1-f67.google.com with SMTP id o18so6598892qvf.1 for ; Sun, 01 Dec 2019 19:24:25 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7cb:57c2:81e:38f2:1f7b:397c]) by smtp.gmail.com with ESMTPSA id a66sm13919218qkb.27.2019.12.01.19.24.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Dec 2019 19:24:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1575257081; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=O7yMUdI4PDd40hpIRoZo9amhDKW6jf0ASXop+wYPnoM=; b=LQCpAZ/v4v2yg3GcOShbqHnTD2rjOvNO4njRD7Yern+NjUl8GqhXNRHtyE74FkuLcgh3j3 0rvWgvYAEvpAFDwNCPwzZy9ftMfC0S1oOx/vsGJi9oDB++lYRNuM56iP9y+yDDV+gRZu31 bWFAkcjxUHs5sAQZfxFGAuPopCBakQ8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZnjxqYGjvIAmQyIa+FkOlhZV5KYP1ZplOhxG5lOJ4Tk=; b=mB9eWy2OHNDSPhWGe26O3d+3KYwgztLidt3banANUn363QvD8mEID5zEwbf66tVEeD WxSfJcRL/DGChmFA5CPcRiB3Z+mudALRcs2vNmVpoO5fp/EOZ3zRYvqohBUkwyx5OwWY tyhIjNYFkJcGVjT7WZkU4lPrUVRdFsPo5meXRbUQm1tQwW3eky5sOyf9l1MHCFj/8Ghr 00EJp3vjcpPdQd16b/wuBK049oK9CF6JcW+q046XKSQ99pIGJv288k7d7P8UuiYKwvF6 iDYUY52VN+/Hug3xy8WsaqVwuL2OMxVHLvkZSgFiG2kaHNlgRwKXajSUCcc3WBkCzjdA v34w== X-Gm-Message-State: APjAAAURipBz44U0fvTEQu8XzJHwRsbV3c3X2+jQLv23A8ZPiYsjcEbz ICIdO7hUsZJq1iLvOoueaR4nTA48 X-Google-Smtp-Source: APXvYqwdku2+Bpg91c3V083L1SYSHt0hL9R8kkLtHC2Uqf+PtLiiPfcxaCF+ZXd4MT4S+wghQSGY4A== X-Received: by 2002:a0c:e74a:: with SMTP id g10mr30796861qvn.29.1575257064311; Sun, 01 Dec 2019 19:24:24 -0800 (PST) From: Julio Faracco To: libvir-list@redhat.com Date: Mon, 2 Dec 2019 00:24:17 -0300 Message-Id: <20191202032417.20568-1-jcfaracco@gmail.com> MIME-Version: 1.0 X-MC-Unique: _m7LVh6IPhuiOoBJOWfe-Q-1 X-MC-Unique: YJJtDbT-O2OU0uyK6kSoUw-1 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id xB23OThN032278 X-loop: libvir-list@redhat.com Cc: Julio Faracco Subject: [libvirt] [PATCH v2] driver: Include source as a flag to virDomainGetHostname X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" There is a lots of possibilities to retrieve hostname information from domain. Libvirt could use lease information from dnsmasq to get current hostname too. QEMU supports QEMU-agent but it can use lease source. See 'domifaddr' as an example. This commit still adds lease options for QEMU. It will get the first hostname available from domain networks. This case, every driver has a default section inside switch to keep compatibility. So, if someone call 'domhostname' without specifying source, it will get the default option. Signed-off-by: Julio Faracco --- include/libvirt/libvirt-domain.h | 5 +++ src/lxc/lxc_driver.c | 71 ++++++++++++++++++++++++++++++++ src/openvz/openvz_driver.c | 30 ++++++++++---- src/qemu/qemu_driver.c | 69 ++++++++++++++++++++++++++----- tools/virsh-domain.c | 25 ++++++++++- 5 files changed, 178 insertions(+), 22 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index a2f007568c..b37f33d5d0 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4790,6 +4790,11 @@ typedef struct _virTypedParameter virMemoryParameter; */ typedef virMemoryParameter *virMemoryParameterPtr; =20 +typedef enum { + VIR_DOMAIN_HOSTNAME_SRC_LEASE =3D (1 << 0), /* Parse DHCP lease file */ + VIR_DOMAIN_HOSTNAME_SRC_AGENT =3D (1 << 1), /* Query qemu guest agent = */ +} virDomainHostnameSource; + typedef enum { VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE =3D 0, /* Parse DHCP lease fi= le */ VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT =3D 1, /* Query qemu guest ag= ent */ diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 826bf074e3..3221b06261 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -5321,6 +5321,76 @@ lxcDomainGetCPUStats(virDomainPtr dom, return ret; } =20 +static char * +lxcDomainGetHostname(virDomainPtr dom, + unsigned int flags) +{ + virDomainObjPtr vm =3D NULL; + char macaddr[VIR_MAC_STRING_BUFLEN]; + g_autoptr(virNetwork) network =3D NULL; + virNetworkDHCPLeasePtr *leases =3D NULL; + int n_leases; + size_t i, j; + char *hostname =3D NULL; + + virCheckFlags(VIR_DOMAIN_HOSTNAME_SRC_LEASE | + VIR_DOMAIN_HOSTNAME_SRC_AGENT, NULL); + + if (!(vm =3D lxcDomObjFromDomain(dom))) + return NULL; + + if (virDomainGetHostnameEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + switch (flags) { + default: + case VIR_DOMAIN_HOSTNAME_SRC_LEASE: + for (i =3D 0; i < vm->def->nnets; i++) { + if (vm->def->nets[i]->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) + continue; + + virMacAddrFormat(&(vm->def->nets[i]->mac), macaddr); + virObjectUnref(network); + network =3D virNetworkLookupByName(dom->conn, + vm->def->nets[i]->data.networ= k.name); + + if ((n_leases =3D virNetworkGetDHCPLeases(network, macaddr, + &leases, 0)) < 0) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("There is no available hostname %d"), + flags); + + for (j =3D 0; j < n_leases; j++) { + virNetworkDHCPLeasePtr lease =3D leases[j]; + if (lease->hostname) { + hostname =3D g_strdup(lease->hostname); + + for (j =3D 0; j < n_leases; j++) + virNetworkDHCPLeaseFree(leases[j]); + + VIR_FREE(leases); + + goto cleanup; + } + } + + for (j =3D 0; j < n_leases; j++) + virNetworkDHCPLeaseFree(leases[j]); + + VIR_FREE(leases); + } + break; + case VIR_DOMAIN_HOSTNAME_SRC_AGENT: + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("Unknown hostname data source %d"), + flags); + break; + } + + cleanup: + virDomainObjEndAPI(&vm); + return hostname; +} =20 static int lxcNodeGetFreePages(virConnectPtr conn, @@ -5467,6 +5537,7 @@ static virHypervisorDriver lxcHypervisorDriver =3D { .domainSetMetadata =3D lxcDomainSetMetadata, /* 1.1.3 */ .domainGetMetadata =3D lxcDomainGetMetadata, /* 1.1.3 */ .domainGetCPUStats =3D lxcDomainGetCPUStats, /* 1.2.2 */ + .domainGetHostname =3D lxcDomainGetHostname, /* 5.9.0 */ .nodeGetMemoryParameters =3D lxcNodeGetMemoryParameters, /* 0.10.2 */ .nodeSetMemoryParameters =3D lxcNodeSetMemoryParameters, /* 0.10.2 */ .domainSendProcessSignal =3D lxcDomainSendProcessSignal, /* 1.0.1 */ diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index e07b3b302d..c9f8255f19 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -301,19 +301,31 @@ openvzDomainGetHostname(virDomainPtr dom, unsigned in= t flags) struct openvz_driver *driver =3D dom->conn->privateData; virDomainObjPtr vm; =20 - virCheckFlags(0, NULL); + virCheckFlags(VIR_DOMAIN_HOSTNAME_SRC_LEASE | + VIR_DOMAIN_HOSTNAME_SRC_AGENT, NULL); + if (!(vm =3D openvzDomObjFromDomain(driver, dom->uuid))) return NULL; =20 - hostname =3D openvzVEGetStringParam(dom, "hostname"); - if (hostname =3D=3D NULL) - goto cleanup; + switch (flags) { + default: + hostname =3D openvzVEGetStringParam(dom, "hostname"); + if (hostname =3D=3D NULL) + goto cleanup; =20 - /* vzlist prints an unset hostname as '-' */ - if (STREQ(hostname, "-")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Hostname of '%s' is unset"), vm->def->name); - VIR_FREE(hostname); + /* vzlist prints an unset hostname as '-' */ + if (STREQ(hostname, "-")) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("Hostname of '%s' is unset"), vm->def->name); + VIR_FREE(hostname); + } + break; + case VIR_DOMAIN_HOSTNAME_SRC_AGENT: + case VIR_DOMAIN_HOSTNAME_SRC_LEASE: + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("Unknown hostname data source %d"), + flags); + break; } =20 cleanup: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b5300241a8..928f75cafe 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20090,9 +20090,15 @@ qemuDomainGetHostname(virDomainPtr dom, virQEMUDriverPtr driver =3D dom->conn->privateData; virDomainObjPtr vm =3D NULL; qemuAgentPtr agent; + char macaddr[VIR_MAC_STRING_BUFLEN]; + g_autoptr(virNetwork) network =3D NULL; + virNetworkDHCPLeasePtr *leases =3D NULL; + int n_leases; + size_t i, j; char *hostname =3D NULL; =20 - virCheckFlags(0, NULL); + virCheckFlags(VIR_DOMAIN_HOSTNAME_SRC_LEASE | + VIR_DOMAIN_HOSTNAME_SRC_AGENT, NULL); =20 if (!(vm =3D qemuDomainObjFromDomain(dom))) return NULL; @@ -20100,21 +20106,62 @@ qemuDomainGetHostname(virDomainPtr dom, if (virDomainGetHostnameEnsureACL(dom->conn, vm->def) < 0) goto cleanup; =20 - if (qemuDomainObjBeginAgentJob(driver, vm, QEMU_AGENT_JOB_QUERY) < 0) - goto cleanup; - if (virDomainObjCheckActive(vm) < 0) goto endjob; =20 - if (!qemuDomainAgentAvailable(vm, true)) - goto endjob; + switch (flags) { + default: + case VIR_DOMAIN_HOSTNAME_SRC_AGENT: + if (qemuDomainObjBeginAgentJob(driver, vm, QEMU_AGENT_JOB_QUERY) <= 0) + goto cleanup; =20 - agent =3D qemuDomainObjEnterAgent(vm); - ignore_value(qemuAgentGetHostname(agent, &hostname)); - qemuDomainObjExitAgent(vm, agent); + if (!qemuDomainAgentAvailable(vm, true)) + goto endjob; =20 - endjob: - qemuDomainObjEndAgentJob(vm); + agent =3D qemuDomainObjEnterAgent(vm); + ignore_value(qemuAgentGetHostname(agent, &hostname)); + qemuDomainObjExitAgent(vm, agent); + + endjob: + qemuDomainObjEndAgentJob(vm); + break; + case VIR_DOMAIN_HOSTNAME_SRC_LEASE: + for (i =3D 0; i < vm->def->nnets; i++) { + if (vm->def->nets[i]->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) + continue; + + virMacAddrFormat(&(vm->def->nets[i]->mac), macaddr); + virObjectUnref(network); + network =3D virNetworkLookupByName(dom->conn, + vm->def->nets[i]->data.networ= k.name); + + if ((n_leases =3D virNetworkGetDHCPLeases(network, macaddr, + &leases, 0)) < 0) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("There is no available hostname %d"), + flags); + + for (j =3D 0; j < n_leases; j++) { + virNetworkDHCPLeasePtr lease =3D leases[j]; + if (lease->hostname) { + hostname =3D g_strdup(lease->hostname); + + for (j =3D 0; j < n_leases; j++) + virNetworkDHCPLeaseFree(leases[j]); + + VIR_FREE(leases); + + goto cleanup; + } + } + + for (j =3D 0; j < n_leases; j++) + virNetworkDHCPLeaseFree(leases[j]); + + VIR_FREE(leases); + } + break; + } =20 cleanup: virDomainObjEndAPI(&vm); diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 6be9780836..01de6b633a 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -11669,6 +11669,10 @@ static const vshCmdInfo info_domhostname[] =3D { =20 static const vshCmdOptDef opts_domhostname[] =3D { VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE), + {.name =3D "source", + .type =3D VSH_OT_STRING, + .flags =3D VSH_OFLAG_NONE, + .help =3D N_("address source: 'lease' or 'agent'")}, {.name =3D NULL} }; =20 @@ -11678,21 +11682,38 @@ cmdDomHostname(vshControl *ctl, const vshCmd *cmd) char *hostname; virDomainPtr dom; bool ret =3D false; + const char *sourcestr =3D NULL; + int flags =3D 0; /* Use default value. Drivers can have its own defaul= t. */ =20 if (!(dom =3D virshCommandOptDomain(ctl, cmd, NULL))) return false; =20 - hostname =3D virDomainGetHostname(dom, 0); + if (vshCommandOptStringReq(ctl, cmd, "source", &sourcestr) < 0) + goto error; + + if (sourcestr) { + if (STREQ(sourcestr, "lease")) { + flags |=3D VIR_DOMAIN_HOSTNAME_SRC_LEASE; + } else if (STREQ(sourcestr, "agent")) { + flags |=3D VIR_DOMAIN_HOSTNAME_SRC_AGENT; + } else { + vshError(ctl, _("Unknown data source '%s'"), sourcestr); + goto error; + } + } + + hostname =3D virDomainGetHostname(dom, flags); if (hostname =3D=3D NULL) { vshError(ctl, "%s", _("failed to get hostname")); goto error; } =20 vshPrint(ctl, "%s\n", hostname); + + VIR_FREE(hostname); ret =3D true; =20 error: - VIR_FREE(hostname); virshDomainFree(dom); return ret; } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list