This commit adds the support for 'downscript' feature:
- For QEMU command line with the option:
'-net downscript=/etc/qemu-ifdown,...'.
- For Domains with a network interface description:
'<interface type='ethernet'>
...
<downscript path='/etc/qemu-ifdown'/>
...
</interface>'
The options 'script' and 'downscript' accept the argument 'no' to
disable
the script executions. The way that the code was implemented, the XML file
accepts '<[down]script path='no'>' to solve this problem.
This commit updates the tests too.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=825939
Signed-off-by: Julio Faracco <jcfaracco(a)gmail.com>
---
docs/schemas/domaincommon.rng | 8 ++++++++
src/conf/domain_conf.c | 13 +++++++++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_parse_command.c | 4 ++++
tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.args | 2 +-
tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.xml | 1 +
tests/qemuargv2xmldata/qemuargv2xml-net-eth.args | 2 +-
tests/qemuargv2xmldata/qemuargv2xml-net-eth.xml | 1 +
tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml | 1 +
tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 +
tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth-ifname.xml | 1 +
tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth.xml | 1 +
12 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 281309e..2f88dda 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2609,6 +2609,14 @@
</element>
</optional>
<optional>
+ <element name="downscript">
+ <attribute name="path">
+ <ref name="filePath"/>
+ </attribute>
+ <empty/>
+ </element>
+ </optional>
+ <optional>
<element name="backenddomain">
<attribute name="name">
<ref name="domainName"/>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0ff216e..32d5720 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1935,6 +1935,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
VIR_FREE(def->backend.vhost);
VIR_FREE(def->virtPortProfile);
VIR_FREE(def->script);
+ VIR_FREE(def->downscript);
VIR_FREE(def->domain_name);
VIR_FREE(def->ifname);
VIR_FREE(def->ifname_guest);
@@ -9589,6 +9590,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
char *ifname_guest = NULL;
char *ifname_guest_actual = NULL;
char *script = NULL;
+ char *downscript = NULL;
char *address = NULL;
char *port = NULL;
char *localaddr = NULL;
@@ -9761,6 +9763,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
} else if (!script &&
xmlStrEqual(cur->name, BAD_CAST "script")) {
script = virXMLPropString(cur, "path");
+ } else if (!downscript &&
+ xmlStrEqual(cur->name, BAD_CAST "downscript")) {
+ downscript = virXMLPropString(cur, "path");
} else if (!domain_name &&
xmlStrEqual(cur->name, BAD_CAST "backenddomain")) {
domain_name = virXMLPropString(cur, "name");
@@ -10074,6 +10079,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
def->script = script;
script = NULL;
}
+ if (downscript != NULL) {
+ def->downscript = downscript;
+ downscript = NULL;
+ }
if (domain_name != NULL) {
def->domain_name = domain_name;
domain_name = NULL;
@@ -10356,6 +10365,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(dev);
virDomainActualNetDefFree(actual);
VIR_FREE(script);
+ VIR_FREE(downscript);
VIR_FREE(bridge);
VIR_FREE(model);
VIR_FREE(backend);
@@ -22158,6 +22168,9 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferEscapeString(buf, "<script path='%s'/>\n",
def->script);
+ if (def->downscript)
+ virBufferEscapeString(buf, "<downscript path='%s'/>\n",
+ def->downscript);
virBufferEscapeString(buf, "<backenddomain name='%s'/>\n",
def->domain_name);
if (def->ifname &&
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 09fb7aa..9deca76 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1024,6 +1024,7 @@ struct _virDomainNetDef {
unsigned long sndbuf;
} tune;
char *script;
+ char *downscript;
char *domain_name; /* backend domain name */
char *ifname; /* interface name on the host (<target dev='x'/>) */
virNetDevIPInfo hostIP;
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index af9063c..d773917 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -1060,6 +1060,10 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
def->script = values[i];
values[i] = NULL;
} else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
+ STREQ(keywords[i], "downscript") &&
STRNEQ(values[i], "")) {
+ def->downscript = values[i];
+ values[i] = NULL;
+ } else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
STREQ(keywords[i], "ifname")) {
def->ifname = values[i];
values[i] = NULL;
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.args
b/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.args
index 4d74ae4..5d7129c 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.args
+++ b/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.args
@@ -18,6 +18,6 @@ QEMU_AUDIO_DRV=none \
-usb \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=ide,bus=0,unit=0 \
-net nic,macaddr=00:11:22:33:44:55,vlan=0,model=rtl8139,name=net0 \
--net tap,ifname=nic02,script=/etc/qemu-ifup,vlan=0,name=hostnet0 \
+-net
tap,ifname=nic02,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,vlan=0,name=hostnet0 \
-serial none \
-parallel none
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.xml
b/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.xml
index fa9a892..8e04efb 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.xml
+++ b/tests/qemuargv2xmldata/qemuargv2xml-net-eth-ifname.xml
@@ -30,6 +30,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<target dev='nic02'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-net-eth.args
b/tests/qemuargv2xmldata/qemuargv2xml-net-eth.args
index 89eb4c1..0e3fa21 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-net-eth.args
+++ b/tests/qemuargv2xmldata/qemuargv2xml-net-eth.args
@@ -18,6 +18,6 @@ QEMU_AUDIO_DRV=none \
-usb \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=ide,bus=0,unit=0 \
-net nic,macaddr=00:11:22:33:44:55,vlan=0,model=rtl8139,name=net0 \
--net tap,script=/etc/qemu-ifup,vlan=0,name=hostnet0 \
+-net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,vlan=0,name=hostnet0 \
-serial none \
-parallel none
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-net-eth.xml
b/tests/qemuargv2xmldata/qemuargv2xml-net-eth.xml
index 57c4be8..d177ca8 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-net-eth.xml
+++ b/tests/qemuargv2xmldata/qemuargv2xml-net-eth.xml
@@ -30,6 +30,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</interface>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml
b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml
index dd0d752..21d8259 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml
@@ -26,6 +26,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<target dev='nic02'/>
<model type='rtl8139'/>
</interface>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml
b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml
index 48acadf..9f40122 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml
@@ -26,6 +26,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<model type='rtl8139'/>
</interface>
<input type='mouse' bus='ps2'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth-ifname.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth-ifname.xml
index c36baa0..b71fd5a 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth-ifname.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth-ifname.xml
@@ -30,6 +30,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<target dev='nic02'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth.xml
index 898bda6..c55cd68 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-eth.xml
@@ -30,6 +30,7 @@
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
+ <downscript path='/etc/qemu-ifdown'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</interface>
--
2.7.4