[libvirt] [PATCH 2/2] network: check for bridge name conflict with existing devices
Shivaprasad bhat
shivaprasadbhat at gmail.com
Mon Apr 27 09:53:36 UTC 2015
On Sat, Apr 25, 2015 at 12:11 AM, Laine Stump <laine at laine.org> wrote:
> On 04/24/2015 06:58 AM, Shivaprasad bhat wrote:
>> Thanks for the patches Laine. I agree pretty much with both the patches.
>> also had a chance to try these out.
>>
>> Only scenario I see a trouble is,
>>
>> net-create without bridge name in the xml, followed by net-define
>> using the same xml file.
>> The live and --inactive xmls both show different bridge names, though
>> the active bridge
>> can be reused by the network for "this scenario alone". I think this
>> is a very rare case and not worth
>> to fix it,
>
> Using the original XML from net-create for a subsequent net-define is
> problematic in other ways too - if you don't specify MAC address you'll
> end up with def and newDef having different MAC addresses, and if you
> don't specify uuid (I would daresay almost nobody does) you will be
> unable to define the network since a different uuid will be
> autogenerated in both cases, and libvirt will refuse to redefine a
> network with the same name but different uuid. So I don't think we
> should consider this same/similar complication with bridge name a problem.
>
> The proper way to make a transient network persistent is this:
>
> virsh net-dumpxml $netname --inactive >/tmp/xyz.xml && \
> virsh net-define /tmp/xyz.xml
>
>
>> as net-destroy followed by net-create using the same xml
>> file would anyway reuse the
>> same old bridge name if available.
>>
>> Outside of this patch,
>> the net->newDef->bridge's are not considered in virNetworkBridgeInUseHelper().
>> Do we need to?
>
> Yes, that's a good idea. I'm posting a patch 3/2 to this series.
>
> You seem to approve of the patches and have tested them; will you be
> ACKing them?
>
>
Certainly! ACK the first two patches.
The third patch, I am leaving a comment there.
Thanks,
Shiva
>>
>> Thanks,
>> Shiva
>>
>> On Fri, Apr 24, 2015 at 12:33 AM, Laine Stump <laine at laine.org> wrote:
>>> Since some people use the same naming convention as libvirt for bridge
>>> devices they create outside the context of libvirt, it is much nicer
>>> if we check for those devices when looking for a bridge device name to
>>> auto-assign to a new network.
>>> ---
>>> src/network/bridge_driver.c | 25 +++++++++++++++++--------
>>> 1 file changed, 17 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
>>> index abacae3..3b879cd 100644
>>> --- a/src/network/bridge_driver.c
>>> +++ b/src/network/bridge_driver.c
>>> @@ -2037,11 +2037,13 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
>>>
>>> /* Create and configure the bridge device */
>>> if (!network->def->bridge) {
>>> - /* this can only happen if the config files were edited
>>> - * directly. Otherwise networkValidate() (called after parsing
>>> - * the XML from networkCreateXML() and networkDefine())
>>> - * guarantees we will have a valid bridge name before this
>>> - * point.
>>> + /* bridge name can only be empty if the config files were
>>> + * edited directly. Otherwise networkValidate() (called after
>>> + * parsing the XML from networkCreateXML() and
>>> + * networkDefine()) guarantees we will have a valid bridge
>>> + * name before this point. Since hand editing of the config
>>> + * files is explicitly prohibited we can, with clear
>>> + * conscience, log an error and fail at this point.
>>> */
>>> virReportError(VIR_ERR_INTERNAL_ERROR,
>>> _("network '%s' has no bridge name defined"),
>>> @@ -2762,8 +2764,9 @@ static int networkIsPersistent(virNetworkPtr net)
>>>
>>> /*
>>> * networkFindUnusedBridgeName() - try to find a bridge name that is
>>> - * unused by the currently configured libvirt networks, and set this
>>> - * network's name to that new name.
>>> + * unused by the currently configured libvirt networks, as well as by
>>> + * the host system itself (possibly created by someone/something other
>>> + * than libvirt). Set this network's name to that new name.
>>> */
>>> static int
>>> networkFindUnusedBridgeName(virNetworkObjListPtr nets,
>>> @@ -2777,7 +2780,13 @@ networkFindUnusedBridgeName(virNetworkObjListPtr nets,
>>> do {
>>> if (virAsprintf(&newname, templ, id) < 0)
>>> goto cleanup;
>>> - if (!virNetworkBridgeInUse(nets, newname, def->name)) {
>>> + /* check if this name is used in another libvirt network or
>>> + * there is an existing device with that name. ignore errors
>>> + * from virNetDevExists(), just in case it isn't implemented
>>> + * on this platform (probably impossible).
>>> + */
>>> + if (!(virNetworkBridgeInUse(nets, newname, def->name) ||
>>> + virNetDevExists(newname) == 1)) {
>>> VIR_FREE(def->bridge); /*could contain template */
>>> def->bridge = newname;
>>> ret = 0;
>>> --
>>> 2.1.0
>>>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
More information about the libvir-list
mailing list