提交 90064d76 编写于 作者: D Daniel P. Berrangé

conf: record a portid against the domain conf

The portid will be the UUID of the virNetworkPort object associated
with the network interface when a guest is running.
Reviewed-by: NLaine Stump <laine@laine.org>
Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
上级 e64a08fb
...@@ -5309,6 +5309,14 @@ ...@@ -5309,6 +5309,14 @@
information for different classes of network information for different classes of network
connections. <span class="since">Since 0.9.4</span>. connections. <span class="since">Since 0.9.4</span>.
</p> </p>
<p>
When a guest is running and interface of type <code>network</code>
may include a <code>portid</code> attribute. This provides the UUID
of an associated virNetworkPortPtr object that records the association
between the domain interface and the network. This attribute is
read-only since port objects are create and deleted automatically
during startup and shutdown. <span class="since">Since 5.1.0</span>/
</p>
<p> <p>
Also, similar to <code>direct</code> network connections Also, similar to <code>direct</code> network connections
(described below), a connection of type <code>network</code> may (described below), a connection of type <code>network</code> may
......
...@@ -2591,6 +2591,11 @@ ...@@ -2591,6 +2591,11 @@
<ref name="deviceName"/> <ref name="deviceName"/>
</attribute> </attribute>
</optional> </optional>
<optional>
<attribute name="portid">
<ref name="UUID"/>
</attribute>
</optional>
</define> </define>
<define name="interface-bridge-attributes"> <define name="interface-bridge-attributes">
......
...@@ -11399,6 +11399,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11399,6 +11399,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_AUTOFREE(char *) type = NULL; VIR_AUTOFREE(char *) type = NULL;
VIR_AUTOFREE(char *) network = NULL; VIR_AUTOFREE(char *) network = NULL;
VIR_AUTOFREE(char *) portgroup = NULL; VIR_AUTOFREE(char *) portgroup = NULL;
VIR_AUTOFREE(char *) portid = NULL;
VIR_AUTOFREE(char *) bridge = NULL; VIR_AUTOFREE(char *) bridge = NULL;
VIR_AUTOFREE(char *) dev = NULL; VIR_AUTOFREE(char *) dev = NULL;
VIR_AUTOFREE(char *) ifname = NULL; VIR_AUTOFREE(char *) ifname = NULL;
...@@ -11476,6 +11477,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11476,6 +11477,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
virXMLNodeNameEqual(cur, "source")) { virXMLNodeNameEqual(cur, "source")) {
network = virXMLPropString(cur, "network"); network = virXMLPropString(cur, "network");
portgroup = virXMLPropString(cur, "portgroup"); portgroup = virXMLPropString(cur, "portgroup");
if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE))
portid = virXMLPropString(cur, "portid");
} else if (!internal && } else if (!internal &&
def->type == VIR_DOMAIN_NET_TYPE_INTERNAL && def->type == VIR_DOMAIN_NET_TYPE_INTERNAL &&
virXMLNodeNameEqual(cur, "source")) { virXMLNodeNameEqual(cur, "source")) {
...@@ -11689,6 +11692,13 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11689,6 +11692,13 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
"specified with <interface type='network'/>")); "specified with <interface type='network'/>"));
goto error; goto error;
} }
if (portid &&
virUUIDParse(portid, def->data.network.portid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to parse port id '%s'"), portid);
goto error;
}
VIR_STEAL_PTR(def->data.network.name, network); VIR_STEAL_PTR(def->data.network.name, network);
VIR_STEAL_PTR(def->data.network.portgroup, portgroup); VIR_STEAL_PTR(def->data.network.portgroup, portgroup);
VIR_STEAL_PTR(def->data.network.actual, actual); VIR_STEAL_PTR(def->data.network.actual, actual);
...@@ -24977,6 +24987,11 @@ virDomainActualNetDefContentsFormat(virBufferPtr buf, ...@@ -24977,6 +24987,11 @@ virDomainActualNetDefContentsFormat(virBufferPtr buf,
def->data.network.name); def->data.network.name);
virBufferEscapeString(buf, " portgroup='%s'", virBufferEscapeString(buf, " portgroup='%s'",
def->data.network.portgroup); def->data.network.portgroup);
if (virUUIDIsValid(def->data.network.portid)) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(def->data.network.portid, uuidstr);
virBufferAsprintf(buf, " portid='%s'", uuidstr);
}
} }
if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE || if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
actualType == VIR_DOMAIN_NET_TYPE_NETWORK) { actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
...@@ -25280,6 +25295,12 @@ virDomainNetDefFormat(virBufferPtr buf, ...@@ -25280,6 +25295,12 @@ virDomainNetDefFormat(virBufferPtr buf,
def->data.network.name); def->data.network.name);
virBufferEscapeString(buf, " portgroup='%s'", virBufferEscapeString(buf, " portgroup='%s'",
def->data.network.portgroup); def->data.network.portgroup);
if (virUUIDIsValid(def->data.network.portid) &&
!(flags & (VIR_DOMAIN_DEF_FORMAT_INACTIVE))) {
char portidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(def->data.network.portid, portidstr);
virBufferEscapeString(buf, " portid='%s'", portidstr);
}
sourceLines++; sourceLines++;
break; break;
......
...@@ -968,6 +968,7 @@ struct _virDomainNetDef { ...@@ -968,6 +968,7 @@ struct _virDomainNetDef {
struct { struct {
char *name; char *name;
char *portgroup; char *portgroup;
unsigned char portid[VIR_UUID_BUFLEN];
/* actual has info about the currently used physical /* actual has info about the currently used physical
* device (if the network is of type * device (if the network is of type
* bridge/private/vepa/passthrough). This is saved in the * bridge/private/vepa/passthrough). This is saved in the
...@@ -975,6 +976,9 @@ struct _virDomainNetDef { ...@@ -975,6 +976,9 @@ struct _virDomainNetDef {
* since it needs to be re-allocated whenever the domain * since it needs to be re-allocated whenever the domain
* is restarted. It is also never shown to the user, and * is restarted. It is also never shown to the user, and
* the user cannot specify it in XML documents. * the user cannot specify it in XML documents.
*
* This information is populated from the virNetworkPort
* object associated with the portid UUID above.
*/ */
virDomainActualNetDefPtr actual; virDomainActualNetDefPtr actual;
} network; } network;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<controller type='pci' index='0' model='pci-root'/> <controller type='pci' index='0' model='pci-root'/>
<interface type='network' trustGuestRxFilters='yes'> <interface type='network' trustGuestRxFilters='yes'>
<mac address='00:11:22:33:44:55'/> <mac address='00:11:22:33:44:55'/>
<source network='rednet' portgroup='bob'/> <source network='rednet' portgroup='bob' portid='873be5a0-6b8a-4a0b-a1df-ef3659cd64bc'/>
<vlan> <vlan>
<tag id='4095'/> <tag id='4095'/>
</vlan> </vlan>
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
</interface> </interface>
<interface type='network' trustGuestRxFilters='no'> <interface type='network' trustGuestRxFilters='no'>
<mac address='10:11:22:33:44:55'/> <mac address='10:11:22:33:44:55'/>
<source network='blue' portgroup='sam'/> <source network='blue' portgroup='sam' portid='b884cc7e-b347-4a17-9e78-4f672a67794e'/>
<virtualport> <virtualport>
<parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/> <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
</virtualport> </virtualport>
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
</interface> </interface>
<interface type='network'> <interface type='network'>
<mac address='22:11:22:33:44:55'/> <mac address='22:11:22:33:44:55'/>
<source network='blue' portgroup='sam'/> <source network='blue' portgroup='sam' portid='c5fc8eb4-cb69-4fea-8f8b-65e00e6d1dba'/>
<virtualport type='802.1Qbh'> <virtualport type='802.1Qbh'>
<parameters profileid='testhis99'/> <parameters profileid='testhis99'/>
</virtualport> </virtualport>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册