From nobody Sat Sep 21 01:21:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 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=1577479019; cv=none; d=zohomail.com; s=zohoarc; b=QuK33sEJJiwWvQlAO4nabgLU91D696OCSlqmKNRWiSQ2nO4u+3tRoeCX8UiDwm6rdrv1ZAMSWvlGeX0U/uyoZmN65a6tl+w63vux+8R75hrJaIqMcZQwxB5nBJeGxysGOTiYPiOSR+82QyKQrCxfPUF/8yTpPYqAUfYsUsXAo4Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1577479019; h=Content-Type:Content-Transfer-Encoding:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=NJ5ZbYK/bJaL8zI2fel+92fyUmRkASsFvYaLFBWmH74=; b=lPUqZxdfAYy6JEp1n+WFyNcIbFZ1HlhNQBWopAM55eO9cKSsemXj61D7Q9/T0UvpyGJW2bi17DpI0DWA5T7MQTfScegxLRcnZwJUHMd+Vb1Gu4KvDvOulonPxUw0hkdOTY1qnsQvit5XVWxgtdqyFE4J+SY+n+iipc34zGpPtIU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 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-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1577479019817863.6569227635466; Fri, 27 Dec 2019 12:36:59 -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-440-2Onl3QR2OEuBfsonLWauzQ-1; Fri, 27 Dec 2019 15:36:55 -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 5AAD91804191; Fri, 27 Dec 2019 20:36:49 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B6766272A0; Fri, 27 Dec 2019 20:36:45 +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 7FC3818089CD; Fri, 27 Dec 2019 20:36:39 +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 xBRKaao7016371 for ; Fri, 27 Dec 2019 15:36:36 -0500 Received: by smtp.corp.redhat.com (Postfix) id 4530D111F3DA; Fri, 27 Dec 2019 20:36:36 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 402051004B40 for ; Fri, 27 Dec 2019 20:36:34 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (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 22C9980030B for ; Fri, 27 Dec 2019 20:36:34 +0000 (UTC) Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-275-n0BErTkHNgyjhKxNbIarrg-1; Fri, 27 Dec 2019 15:36:31 -0500 Received: by mail-pj1-f66.google.com with SMTP id n96so5178511pjc.3 for ; Fri, 27 Dec 2019 12:36:31 -0800 (PST) Received: from localhost.localdomain (201-69-10-96.dial-up.telesp.net.br. [201.69.10.96]) by smtp.gmail.com with ESMTPSA id g19sm42121313pfh.134.2019.12.27.12.36.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Dec 2019 12:36:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1577479018; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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=NJ5ZbYK/bJaL8zI2fel+92fyUmRkASsFvYaLFBWmH74=; b=RmOT8CnApIz0FU/k5lX2FGYbl6L9CJC9Ivrq2CadoQl4IvO5ESOsErUnAbhLgQ60IuOa3w s6HJ2vgLVSAGKgDzdHd1NHP6+ARPObfGvgZH/jlebv8CY6ASAJUxkcXwDhBl2sEsdbIiXu irK1hlgLwYyuir+2eEQ+sTqCm9yJGbY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=nrpi1+RQtq+JNgqyBJSIZ3Pl+IhSLmDWKjdtWE0OxHs=; b=ZJhiIiDuUD6p0/+PkBXZ9NcLDERx2ZC64jMJdDH0ah8NOmPqO3jHAUAi+AcsVKasXs lvQPheeBp/qAh69ALPHgbBj3yD8gJPu+KLa6KXMVBJPVkGWKaw20ckmBwRpZhckSNpu/ 2du+/0X1S93MHUZvTYdXB0/1qdulYS1JlaknMGq0AaN9sTHUzQB1TlX8df2/yX7fDFVv FU/gwFuq2koBwnyXb6Lssk0VbSQvHpexH/zz/C8v3s2z4Q4Q0UjpB/+VZId/xlCeQrq3 aDOrXse17QP//h5r4NYehuUOLW+hGBNDFwJFceodrLbehM8IOFFgvEYpEhP+o9Nj/kfT mkqQ== X-Gm-Message-State: APjAAAVF17iz8RYubZCht2ee1o6OnAzQpKJNtkCc4ftUrSC5OgcqIZAu 6X3K2oDEx51wTm90cjRkUAVh9fhy X-Google-Smtp-Source: APXvYqzDX0cY8zXjlDucjWtB0sjF1uSqEjrSC1We1JG4bwN6htiplHGLbf8oHsXVM17Ygu7Fkghlwg== X-Received: by 2002:a17:902:8202:: with SMTP id x2mr51449763pln.314.1577478990332; Fri, 27 Dec 2019 12:36:30 -0800 (PST) From: Julio Faracco To: libvir-list@redhat.com Date: Fri, 27 Dec 2019 17:36:25 -0300 Message-Id: <20191227203625.19872-1-jcfaracco@gmail.com> MIME-Version: 1.0 X-MC-Unique: n0BErTkHNgyjhKxNbIarrg-1 X-MC-Unique: 2Onl3QR2OEuBfsonLWauzQ-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 xBRKaao7016371 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3] 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, QEMU driver has a default section inside switch to keep compatibility. So, if someone call 'domhostname' without specifying source, it will get the default option. Some other drivers like LXC and OpenVZ supports only one type, virCheckFlags will handle this case. Signed-off-by: Julio Faracco --- v1-v2: Moving sources into flags. v2-v3: Applying Michal's suggestions. --- docs/manpages/virsh.rst | 7 ++- include/libvirt/libvirt-domain.h | 5 ++ src/lxc/lxc_driver.c | 78 ++++++++++++++++++++++++++++++++ src/qemu/qemu_driver.c | 76 +++++++++++++++++++++++++++---- tools/virsh-completer-domain.c | 17 +++++++ tools/virsh-completer-domain.h | 4 ++ tools/virsh-domain.c | 26 ++++++++++- 7 files changed, 201 insertions(+), 12 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index fea0527caf..ba483d4d00 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -1797,10 +1797,15 @@ domhostname =20 .. code-block:: =20 - domhostname domain + domhostname domain [--source lease|agent] =20 Returns the hostname of a domain, if the hypervisor makes it available. =20 +The *--source* argument specifies what data source to use for the +hostnames, currently 'lease' to read DHCP leases or 'agent' to query +the guest OS via an agent. If unspecified, driver returns the default +method available (some drivers support only one type of source). + =20 domid ----- diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index e60003978a..666c1875cc 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4833,6 +4833,11 @@ typedef struct _virTypedParameter virMemoryParameter; */ typedef virMemoryParameter *virMemoryParameterPtr; =20 +typedef enum { + VIR_DOMAIN_GET_HOSTNAME_LEASE =3D (1 << 0), /* Parse DHCP lease file */ + VIR_DOMAIN_GET_HOSTNAME_AGENT =3D (1 << 1), /* Query qemu guest agent = */ +} virDomainGetHostnameFlags; + 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 780c6ed4a2..2dac730e70 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -5291,6 +5291,83 @@ lxcDomainGetCPUStats(virDomainPtr dom, } =20 =20 +static char * +lxcDomainGetHostname(virDomainPtr dom, + unsigned int flags) +{ + virLXCDriverPtr driver =3D dom->conn->privateData; + virDomainObjPtr vm =3D NULL; + char macaddr[VIR_MAC_STRING_BUFLEN]; + g_autoptr(virConnect) conn =3D NULL; + virNetworkDHCPLeasePtr *leases =3D NULL; + int n_leases; + size_t i, j; + char *hostname =3D NULL; + + virCheckFlags(VIR_DOMAIN_GET_HOSTNAME_LEASE, NULL); + + if (!(vm =3D lxcDomObjFromDomain(dom))) + return NULL; + + if (virDomainGetHostnameEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + if (virLXCDomainObjBeginJob(driver, vm, LXC_JOB_QUERY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (!(conn =3D virGetConnectNetwork())) + goto endjob; + + for (i =3D 0; i < vm->def->nnets; i++) { + g_autoptr(virNetwork) network =3D NULL; + + if (vm->def->nets[i]->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) + continue; + + virMacAddrFormat(&(vm->def->nets[i]->mac), macaddr); + network =3D virNetworkLookupByName(conn, + vm->def->nets[i]->data.network.na= me); + + if (!network) + goto endjob; + + 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 endjob; + } + + virNetworkDHCPLeaseFree(lease); + } + + VIR_FREE(leases); + } + + endjob: + virLXCDomainObjEndJob(driver, vm); + + cleanup: + virDomainObjEndAPI(&vm); + return hostname; +} + + static int lxcNodeGetFreePages(virConnectPtr conn, unsigned int npages, @@ -5436,6 +5513,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, /* 6.0.0 */ .nodeGetMemoryParameters =3D lxcNodeGetMemoryParameters, /* 0.10.2 */ .nodeSetMemoryParameters =3D lxcNodeSetMemoryParameters, /* 0.10.2 */ .domainSendProcessSignal =3D lxcDomainSendProcessSignal, /* 1.0.1 */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ec8faf384c..d8ed859f70 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20280,9 +20280,19 @@ qemuDomainGetHostname(virDomainPtr dom, virQEMUDriverPtr driver =3D dom->conn->privateData; virDomainObjPtr vm =3D NULL; qemuAgentPtr agent; + char macaddr[VIR_MAC_STRING_BUFLEN]; + g_autoptr(virConnect) conn =3D NULL; + virNetworkDHCPLeasePtr *leases =3D NULL; + int n_leases; + size_t i, j; char *hostname =3D NULL; =20 - virCheckFlags(0, NULL); + virCheckFlags(VIR_DOMAIN_GET_HOSTNAME_LEASE | + VIR_DOMAIN_GET_HOSTNAME_AGENT, NULL); + + VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_GET_HOSTNAME_LEASE, + VIR_DOMAIN_GET_HOSTNAME_AGENT, + NULL); =20 if (!(vm =3D qemuDomainObjFromDomain(dom))) return NULL; @@ -20290,18 +20300,66 @@ 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_GET_HOSTNAME_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; + + agent =3D qemuDomainObjEnterAgent(vm); + ignore_value(qemuAgentGetHostname(agent, &hostname)); + qemuDomainObjExitAgent(vm, agent); + + break; + case VIR_DOMAIN_GET_HOSTNAME_LEASE: + if (!(conn =3D virGetConnectNetwork())) + goto endjob; + + for (i =3D 0; i < vm->def->nnets; i++) { + g_autoptr(virNetwork) network =3D NULL; + + if (vm->def->nets[i]->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) + continue; + + virMacAddrFormat(&(vm->def->nets[i]->mac), macaddr); + network =3D virNetworkLookupByName(conn, + vm->def->nets[i]->data.networ= k.name); + + if (!network) + goto endjob; + + 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 endjob; + } + + virNetworkDHCPLeaseFree(lease); + } + + VIR_FREE(leases); + } + break; + } =20 endjob: qemuDomainObjEndAgentJob(vm); diff --git a/tools/virsh-completer-domain.c b/tools/virsh-completer-domain.c index 0311ee50d0..67e67d485a 100644 --- a/tools/virsh-completer-domain.c +++ b/tools/virsh-completer-domain.c @@ -296,3 +296,20 @@ virshDomainShutdownModeCompleter(vshControl *ctl, =20 return virshCommaStringListComplete(mode, modes); } + + +char ** +virshDomainGetHosnameSourcesCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags) +{ + const char *sources[] =3D {"lease", "agent", NULL}; + const char *source =3D NULL; + + virCheckFlags(0, NULL); + + if (vshCommandOptStringQuiet(ctl, cmd, "source", &source) < 0) + return NULL; + + return virshCommaStringListComplete(source, sources); +} diff --git a/tools/virsh-completer-domain.h b/tools/virsh-completer-domain.h index 083ab327cc..ad1b37a255 100644 --- a/tools/virsh-completer-domain.h +++ b/tools/virsh-completer-domain.h @@ -53,3 +53,7 @@ char ** virshDomainDeviceAliasCompleter(vshControl *ctl, char ** virshDomainShutdownModeCompleter(vshControl *ctl, const vshCmd *cmd, unsigned int flags); + +char ** virshDomainGetHosnameSourcesCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags); diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9d4cdd26dd..73e6780116 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -11743,6 +11743,11 @@ 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, + .completer =3D virshDomainGetHosnameSourcesCompleter, + .help =3D N_("address source: 'lease' or 'agent'")}, {.name =3D NULL} }; =20 @@ -11752,21 +11757,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_GET_HOSTNAME_LEASE; + } else if (STREQ(sourcestr, "agent")) { + flags |=3D VIR_DOMAIN_GET_HOSTNAME_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