...
            Integer nicPos = 0;
            for (InterfaceDef nic : nics) {
                if (nic.getBrName().equalsIgnoreCase(_linkLocalBridgeName)) {
                    vlanAllocatedToVM.put("LinkLocal", nicPos);
                } else {
                    String vlanId = getVlanIdFromBridge(nic.getBrName());
                    if (vlanId != null) {
                        vlanAllocatedToVM.put(vlanId, nicPos);
                    } else {
                        vlanAllocatedToVM.put(Vlan.UNTAGGED, nicPos);
                    }
                }
                nicPos++;
            }
            IpAddressTO[] ips = cmd.getIpAddresses();
            int i = 0;
            String result = null;
            int nicNum = 0;
            for (IpAddressTO ip : ips) {
                if (!vlanAllocatedToVM.containsKey(ip.getVlanId())) {
                    /* plug a vif into router */
                    VifHotPlug(conn, routerName, ip.getVlanId(),
                            ip.getVifMacAddress());
                    vlanAllocatedToVM.put(ip.getVlanId(), nicPos++);
                }
...

Looks like the getVlanIdFromBridge might be a bit misleading. I am
running my guest public traffic on a 'cloudbr470', which is a bridge
to eth2.470, yet I configured this network as 'untagged' because I
have a vlan 470 available on eth3 for cloudstack to autoassign (eth3
is where all of my stuff will be autoassigned). So I'm not 100% sure
yet what's going on here but it seems as though the above is not
setting any 'Vlan.UNTAGGED', since it finds a vlan number for
eth2.470, but when it enumerates the IPs for the router, it then runs
ip.getVlanId() and doesn't find a nic for the untagged IP and creates
one.


I realize this is perhaps an uncommon case, but a bug nonetheless.
I'll play with the code a bit and see if I can come up with a
solution. I'm thinking I can look at the nic's broadcast URI and see
if it's supposed to be untagged, then add to vlanAllocatedToVM
appropriately, off the top of my head something like:

                    String vlanId = getVlanIdFromBridge(nic.getBrName());
                    if (vlanId != null &&
!nic.getBroadcastUri().toString().contains("untagged") {
                        vlanAllocatedToVM.put(vlanId, nicPos);
                    } else {
                        vlanAllocatedToVM.put(Vlan.UNTAGGED, nicPos);
                    }



On Mon, Aug 27, 2012 at 6:42 PM, Edison Su <edison...@citrix.com> wrote:
> Possible bug in in kvm code: LibvirtComputingResource->execute(IpAssocCommand 
> cmd)-> VifHotPlug, which is only place adding nic into router vm.
> Turn on agent log, then take a look what happened.
>
>> -----Original Message-----
>> From: Marcus Sorensen [mailto:shadow...@gmail.com]
>> Sent: Monday, August 27, 2012 5:10 PM
>> To: cloudstack-dev@incubator.apache.org
>> Subject: VM router spawning multiple public nics
>>
>> I've got two zones running the same build of cloudstack (a recent copy
>> of master). One of them creates routers that turn into ugly
>> multi-headed beasts, and by that I mean that any time I create a port
>> forwarding or iptables rule for that router I get a new public NIC
>> with an identical IP address, I have an instance with a few tens of
>> NICs.  My guess is that some script isn't detecting that there's
>> already a NIC with the public IP on it.  It looks fine in the
>> database, there is only one public NIC defined in the nics table.
>> I'll troubleshoot it tomorrow, but if anyone knows where I should
>> begin the headstart would be appreciated.
>>
>> Thanks

Reply via email to