The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7115
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Also improves host_name state reporting when using VM with lxd-agent running.
From 4e1ecc846a238d6ebae63c38010abb5ff2dd1cb1 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 1 Apr 2020 09:20:12 +0100 Subject: [PATCH 1/3] lxc/network: Updates network detach checks to use bridged network property Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxc/network.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lxc/network.go b/lxc/network.go index 76e5f06b78..2c24635e5a 100644 --- a/lxc/network.go +++ b/lxc/network.go @@ -415,7 +415,7 @@ func (c *cmdNetworkDetach) Run(cmd *cobra.Command, args []string) error { // Find the device if devName == "" { for n, d := range inst.Devices { - if d["type"] == "nic" && d["parent"] == resource.name { + if d["type"] == "nic" && (d["parent"] == resource.name || d["network"] == resource.name) { if devName != "" { return fmt.Errorf(i18n.G("More than one device matches, specify the device name")) } @@ -434,7 +434,7 @@ func (c *cmdNetworkDetach) Run(cmd *cobra.Command, args []string) error { return fmt.Errorf(i18n.G("The specified device doesn't exist")) } - if device["type"] != "nic" || device["parent"] != resource.name { + if device["type"] != "nic" || (device["parent"] != resource.name && device["network"] != resource.name) { return fmt.Errorf(i18n.G("The specified device doesn't match the network")) } @@ -500,7 +500,7 @@ func (c *cmdNetworkDetachProfile) Run(cmd *cobra.Command, args []string) error { // Find the device if devName == "" { for n, d := range profile.Devices { - if d["type"] == "nic" && d["parent"] == resource.name { + if d["type"] == "nic" && (d["parent"] == resource.name || d["network"] == resource.name) { if devName != "" { return fmt.Errorf(i18n.G("More than one device matches, specify the device name")) } @@ -519,7 +519,7 @@ func (c *cmdNetworkDetachProfile) Run(cmd *cobra.Command, args []string) error { return fmt.Errorf(i18n.G("The specified device doesn't exist")) } - if device["type"] != "nic" || device["parent"] != resource.name { + if device["type"] != "nic" || (device["parent"] != resource.name && device["network"] != resource.name) { return fmt.Errorf(i18n.G("The specified device doesn't match the network")) } From 7b26c661a4b4bec3c71d835ddc0435a88969eb33 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 1 Apr 2020 10:24:42 +0100 Subject: [PATCH 2/3] lxd/network/network/utils: Updates network setting detection in IsInUse Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/network/network_utils.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go index e61b90a00d..91c6c632a0 100644 --- a/lxd/network/network_utils.go +++ b/lxd/network/network_utils.go @@ -38,8 +38,9 @@ func IsInUse(c instance.Instance, networkName string) bool { continue } - if d["network"] == networkName { - return true + // Temporarily populate parent from network setting if used. + if d["network"] != "" { + d["parent"] = d["network"] } if d["parent"] == "" { From 6b1a72d5deae8bd03408943d91d4cfd36e5820a7 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 1 Apr 2020 10:25:07 +0100 Subject: [PATCH 3/3] lxd/instance/drivers/driver/qemu: Adds host_name info to RenderState when lxd-agent is running Previously only agentless state info had host_name. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instance/drivers/driver_qemu.go | 40 ++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go index c603f7f58b..9fc600074c 100644 --- a/lxd/instance/drivers/driver_qemu.go +++ b/lxd/instance/drivers/driver_qemu.go @@ -3604,18 +3604,20 @@ func (vm *qemu) RenderState() (*api.InstanceState, error) { pid, _ := vm.pid() if statusCode == api.Running { + // Try and get state info from agent. status, err := vm.agentGetState() if err != nil { if err != errQemuAgentOffline { logger.Warn("Could not get VM state from agent", log.Ctx{"project": vm.Project(), "instance": vm.Name(), "err": err}) } - // Fallback data. + // Fallback data if agent is not reachable. status = &api.InstanceState{} status.Processes = -1 networks := map[string]api.InstanceStateNetwork{} for k, m := range vm.ExpandedDevices() { - // We only care about nics. + // We only care about bridged nics as these can use a local DHCP server that allows + // us to parse the leases file below. if m["type"] != "nic" || m.NICType() != "bridged" { continue } @@ -3626,6 +3628,11 @@ func (vm *qemu) RenderState() (*api.InstanceState, error) { return nil, err } + // Temporarily populate parent from network setting if used. + if m["network"] != "" { + m["parent"] = m["network"] + } + // Parse the lease file. addresses, err := network.GetLeaseAddresses(vm.state, m["parent"], m["hwaddr"]) if err != nil { @@ -3642,10 +3649,6 @@ func (vm *qemu) RenderState() (*api.InstanceState, error) { return nil, err } - if m["host_name"] == "" { - m["host_name"] = vm.localConfig[fmt.Sprintf("volatile.%s.host_name", k)] - } - // Retrieve the host counters, as we report the values // from the instance's point of view, those counters need to be reversed below. hostCounters := shared.NetworkGetCounters(m["host_name"]) @@ -3669,6 +3672,31 @@ func (vm *qemu) RenderState() (*api.InstanceState, error) { status.Network = networks } + // Populate host_name for network devices. + for k, m := range vm.ExpandedDevices() { + // We only care about nics. + if m["type"] != "nic" { + continue + } + + // Get hwaddr from static or volatile config. + hwaddr := m["hwaddr"] + if hwaddr == "" { + hwaddr = vm.localConfig[fmt.Sprintf("volatile.%s.hwaddr", k)] + } + + // We have to match on hwaddr as device name can be different from the configured device + // name when reported from the lxd-agent inside the VM (due to the guest OS choosing name). + for netName, netStatus := range status.Network { + if netStatus.Hwaddr == hwaddr { + if netStatus.HostName == "" { + netStatus.HostName = vm.localConfig[fmt.Sprintf("volatile.%s.host_name", k)] + status.Network[netName] = netStatus + } + } + } + } + status.Pid = int64(pid) status.Status = statusCode.String() status.StatusCode = statusCode
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel