network: add connections counter to networks

Just as each physical device used by a network has a connections
counter, now each network has a connections counter which is
incremented once for each guest interface that connects using this
network.

The count is output in the live network XML, like this:

   <network connections='20'>
   ...
   </network>

It is read-only, and for informational purposes only - it isn't used
internally anywhere by libvirt.
This commit is contained in:
Laine Stump 2012-08-06 16:17:58 -04:00
parent 4fee4e052a
commit 300bcdb63b
5 changed files with 50 additions and 9 deletions

View File

@ -15,8 +15,14 @@
<p> <p>
The root element required for all virtual networks is The root element required for all virtual networks is
named <code>network</code> and has no attributes. named <code>network</code> and has no configurable attributes
The network XML format is available <span class="since">since 0.3.0</span> (although <span class="since">since 0.10.0</span> there is one
optional read-only attribute - when examining the live
configuration of a network, the
attribute <code>connections</code>, if present, specifies the
number of guest interfaces currently connected via this
network). The network XML format is
available <span class="since">since 0.3.0</span>
</p> </p>
<h3><a name="elementsMetadata">General metadata</a></h3> <h3><a name="elementsMetadata">General metadata</a></h3>
@ -233,12 +239,22 @@
&lt;/forward&gt; &lt;/forward&gt;
... ...
</pre> </pre>
Additionally, <span class="since">since 0.9.10</span>, libvirt <p>
allows a shorthand for specifying all virtual interfaces <span class="since">since 0.10.0</span>,
associated with a single physical function, by using <code>&lt;interface&gt;</code> also has an optional read-only
the <code>&lt;pf&gt;</code> subelement to call out the attribute - when examining the live configuration of a
corresponding physical interface associated with multiple network, the attribute <code>connections</code>, if present,
virtual interfaces: specifies the number of guest interfaces currently connected
via this physical interface.
</p>
<p>
Additionally, <span class="since">since 0.9.10</span>, libvirt
allows a shorthand for specifying all virtual interfaces
associated with a single physical function, by using
the <code>&lt;pf&gt;</code> subelement to call out the
corresponding physical interface associated with multiple
virtual interfaces:
</p>
<pre> <pre>
... ...
&lt;forward mode='passthrough'&gt; &lt;forward mode='passthrough'&gt;

View File

@ -12,6 +12,11 @@
<define name="network"> <define name="network">
<element name="network"> <element name="network">
<optional>
<attribute name="connections">
<data type="unsignedInt"/>
</attribute>
</optional>
<interleave> <interleave>
<!-- The name of the network, used to refer to it through the API <!-- The name of the network, used to refer to it through the API
@ -91,6 +96,11 @@
<attribute name='dev'> <attribute name='dev'>
<ref name='deviceName'/> <ref name='deviceName'/>
</attribute> </attribute>
<optional>
<attribute name="connections">
<data type="unsignedInt"/>
</attribute>
</optional>
</element> </element>
</zeroOrMore> </zeroOrMore>
<optional> <optional>

View File

@ -1463,7 +1463,11 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
int ii; int ii;
virBufferAddLit(&buf, "<network>\n"); virBufferAddLit(&buf, "<network");
if (!(flags & VIR_NETWORK_XML_INACTIVE) && (def->connections > 0)) {
virBufferAsprintf(&buf, " connections='%d'", def->connections);
}
virBufferAddLit(&buf, ">\n");
virBufferEscapeString(&buf, " <name>%s</name>\n", def->name); virBufferEscapeString(&buf, " <name>%s</name>\n", def->name);
uuid = def->uuid; uuid = def->uuid;

View File

@ -156,6 +156,7 @@ struct _virNetworkDef {
unsigned char uuid[VIR_UUID_BUFLEN]; unsigned char uuid[VIR_UUID_BUFLEN];
bool uuid_specified; bool uuid_specified;
char *name; char *name;
int connections; /* # of guest interfaces connected to this network */
char *bridge; /* Name of bridge device */ char *bridge; /* Name of bridge device */
char *domain; char *domain;

View File

@ -3005,6 +3005,10 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
VIR_DEBUG("Using physical device %s, %d connections", VIR_DEBUG("Using physical device %s, %d connections",
dev->dev, dev->connections); dev->dev, dev->connections);
} }
netdef->connections++;
VIR_DEBUG("Using network %s, %d connections",
netdef->name, netdef->connections);
ret = 0; ret = 0;
cleanup: cleanup:
for (ii = 0; ii < num_virt_fns; ii++) for (ii = 0; ii < num_virt_fns; ii++)
@ -3117,6 +3121,9 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
} }
success: success:
netdef->connections++;
VIR_DEBUG("Using network %s, %d connections",
netdef->name, netdef->connections);
ret = 0; ret = 0;
cleanup: cleanup:
if (network) if (network)
@ -3205,6 +3212,9 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
} }
success: success:
netdef->connections--;
VIR_DEBUG("Releasing network %s, %d connections",
netdef->name, netdef->connections);
ret = 0; ret = 0;
cleanup: cleanup:
if (network) if (network)