Great, thanks. I've already got a working implementation of adding/removing nics from regular instances that I've been playing with, so I'm getting vaguely familiar with the various data types and things surrounding the networking. I don't know if this is quite within my reach just yet but I'll see how far I get.
On Wed, Aug 29, 2012 at 3:19 PM, Alena Prokharchyk <alena.prokharc...@citrix.com> wrote: > On 8/29/12 1:34 PM, "Edison Su" <edison...@citrix.com> wrote: > >>Hi Anthony & Alena, >> Could you help to provide information about VPC, how it works, > > > Here is the functional spec on the feature: > > wiki.cloudstack.org/display/RelOps/Inter-VLAN+Routing+functional+spec > > > VpcVirtualNetworkApplianceManagerImpl is the manager responsible for VPC > Virtual router operations (plug/unplug nics, etc) > > > >> which commands needed to implemented on the hypervisor side? > > > > 1) PlugNicCommand/UnplugNicCommand - does Nic hotplug/unplug (currently > works for VR vm only). In VPC called when add nic for Public/Guest > networks. > 2) SetupGuestNetworkCommand - sets up dhcp range, dns information, > networkDomain information on the Nic to make it > 3) SetNetworkACLCommand - creates network ACL on the virtual router > 4) SetSourceNatCommand - used for setting source nat on the Public IP on > the VPC VR. > 5) Site2SiteVpnCfgCommand - for setting up S2S VPN > > > Anthony/Kelven/Vijay did implementation for Xen/vmWare resources, they can > help you answering all hypervisor related questions. If you need more > details on business logic + Vpc VR management, I can help with that. > > > -Alena. > >> >>> -----Original Message----- >>> From: Marcus Sorensen [mailto:shadow...@gmail.com] >>> Sent: Wednesday, August 29, 2012 10:16 AM >>> To: cloudstack-dev@incubator.apache.org >>> Subject: Re: VM router spawning multiple public nics >>> >>> I'd be willing to give it a shot if someone could point me in the >>> right direction and be available to answer questions. >>> >>> On Wed, Aug 29, 2012 at 10:39 AM, Edison Su <edison...@citrix.com> >>> wrote: >>> > Yah, KVM doesn't support VPC yet. Will you help to add VPC support on >>> KVM?:) Just implement a few VPC related commands... >>> > >>> >> -----Original Message----- >>> >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >>> >> Sent: Wednesday, August 29, 2012 6:49 AM >>> >> To: cloudstack-dev@incubator.apache.org >>> >> Subject: Re: VM router spawning multiple public nics >>> >> >>> >> I can confirm that the patch has fixed my particular issue. >>> >> >>> >> This is likely unrelated and I think it doesn't even use the same >>> >> code, but I began to play with the VPC stuff a bit and noticed that >>> I >>> >> don't get any interfaces except for link local. I'd probably chalk >>> >> that up to it not being ready for KVM, but I thought it was worth a >>> >> mention. I'd be happy to try to help get it ready if someone has >>> time >>> >> to nudge me in the right direction. >>> >> >>> >> On Tue, Aug 28, 2012 at 3:15 PM, Edison Su <edison...@citrix.com> >>> wrote: >>> >> > >>> >> > >>> >> >> -----Original Message----- >>> >> >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >>> >> >> Sent: Tuesday, August 28, 2012 2:00 PM >>> >> >> To: cloudstack-dev@incubator.apache.org >>> >> >> Subject: Re: VM router spawning multiple public nics >>> >> >> >>> >> >> I thought about this solution myself, but below this portion of >>> >> code >>> >> >> it looks like it uses the hash map to determine which nic number >>> to >>> >> >> add the IP to, so with multiple 'untagged' networks it would have >>> no >>> >> >> way of knowing which nicnum in the router corresponds with the >>> >> correct >>> >> >> untagged vlan. >>> >> >> >>> >> >> nicNum = vlanAllocatedToVM.get(ip.getVlanId()); >>> >> >> networkUsage(routerIp, "addVif", "eth" + nicNum); >>> >> >> result = >>> >> >> _virtRouterResource.assignPublicIpAddress(routerName, >>> >> >> routerIp, ip.getPublicIp(), ip.isAdd(), >>> >> >> ip.isFirstIP(), >>> >> >> ip.isSourceNat(), ip.getVlanId(), >>> >> >> ip.getVlanGateway(), >>> >> >> ip.getVlanNetmask(), >>> ip.getVifMacAddress(), >>> >> >> ip.getGuestIp(), nicNum); >>> >> >> >>> >> >> if ip.getVlanId() returns untagged (as it does on networks with >>> no >>> >> >> vlan id), and we tried to put multiple untagged keys in >>> >> >> vlanAllocatedToVM (as with multiple untagged networks), we get >>> the >>> >> >> wrong nicNum, no? >>> >> > >>> >> > In the ipassoc case, if there are multiple untagged networks, all >>> of >>> >> them are use the same >>> >> > Public bridge. Then multiple ip address will be added on eth2 >>> inside >>> >> router VM. >>> >> > If it works physically, then it works. >>> >> > >>> >> >> >>> >> >> On Tue, Aug 28, 2012 at 2:48 PM, Edison Su <edison...@citrix.com> >>> >> wrote: >>> >> >> > >>> >> >> > >>> >> >> >> -----Original Message----- >>> >> >> >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >>> >> >> >> Sent: Tuesday, August 28, 2012 1:40 PM >>> >> >> >> To: cloudstack-dev@incubator.apache.org >>> >> >> >> Subject: Re: VM router spawning multiple public nics >>> >> >> >> >>> >> >> >> Yes, that looks like it would work for me, however that's not >>> >> >> >> something that would ever make it into master, right? >>> Essentially >>> >> >> >> killing tagging for the public, private, and guest traffic >>> labels? >>> >> >> >> There's also still the issue of not being able to >>> differentiate >>> >> >> >> between multiple untagged networks, if we wanted to add an IP >>> to >>> >> a >>> >> >> >> router it might not know which untagged interface to apply it >>> to. >>> >> >> > >>> >> >> > Physically, all the "untagged" network will be created on >>> >> >> public/guest/private bridge(the name we put in >>> >> >> private/public/guest.bridge.name in agent.properties"). >>> >> >> > Because, there is no way to create a new untagged bridge by >>> agent >>> >> >> itself. Agent code only knows how to create a new tagged(vlan) >>> >> bridge. >>> >> >> > So the fix should be pushed into master. >>> >> >> > >>> >> >> >> >>> >> >> >> On Tue, Aug 28, 2012 at 2:32 PM, Edison Su >>> <edison...@citrix.com> >>> >> >> wrote: >>> >> >> >> > >>> >> >> >> > >>> >> >> >> >> -----Original Message----- >>> >> >> >> >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >>> >> >> >> >> Sent: Tuesday, August 28, 2012 12:23 PM >>> >> >> >> >> To: cloudstack-dev@incubator.apache.org >>> >> >> >> >> Subject: Re: VM router spawning multiple public nics >>> >> >> >> >> >>> >> >> >> >> Thanks for pointing me in the right direction. I've >>> reviewed >>> >> this >>> >> >> >> code >>> >> >> >> >> in a bit more detail, and it seems like it's accomplishing >>> the >>> >> >> >> >> following: >>> >> >> >> >> >>> >> >> >> >> 1. get all network interfaces currently connected to the >>> >> running >>> >> >> VM >>> >> >> >> >> (a.k.a vnet devices via libvirt) >>> >> >> >> >> 2. find out which vlans these network interfaces are >>> bridged >>> >> to, >>> >> >> >> store >>> >> >> >> >> this in a hash map of vlan ids and nics >>> >> >> >> >> 3. get all ip addresses to be added to the VM >>> >> >> >> >> 4. for each ip, get the configured vlan id for the ip, >>> compare >>> >> it >>> >> >> to >>> >> >> >> >> the hash map of existing vlan ids and nics >>> >> >> >> >> 5. if the required vlan id is not found in the hash map, >>> >> create a >>> >> >> >> new >>> >> >> >> >> nic >>> >> >> >> >> 6. assign the ip to the nic identified by the vlan id key >>> in >>> >> the >>> >> >> >> hash >>> >> >> >> >> map >>> >> >> >> >> >>> >> >> >> >> In this case, we're getting a vlan id returned in step 2 >>> for a >>> >> >> >> bridged >>> >> >> >> >> nic whose network is defined as untagged in the cloudstack >>> db, >>> >> >> >> >> therefore in step 5 we never match as already having a nic >>> for >>> >> >> >> >> 'untagged'. I wrote a big long response discussing this >>> issue, >>> >> >> but >>> >> >> >> as >>> >> >> >> >> I began to dig further I realized that aside from my >>> >> particular >>> >> >> case, >>> >> >> >> >> untagged vlans in general are just broken (for example they >>> >> can't >>> >> >> be >>> >> >> >> >> dealt with uniquely in the current IpAssocCommand code, >>> given >>> >> the >>> >> >> >> hash >>> >> >> >> >> map) and it would require more effort than I have time for >>> now >>> >> to >>> >> >> >> make >>> >> >> >> >> things work. If the code were already in place to >>> >> differentiate >>> >> >> >> >> between multiple untagged nics I think that fixing my >>> problem >>> >> >> would >>> >> >> >> be >>> >> >> >> >> trivial, but since its not, I'll just find an alternative >>> >> >> solution. >>> >> >> >> >> >>> >> >> >> > >>> >> >> >> > The untagged network usually means "untagged", no vlan on >>> the >>> >> >> >> bridge... >>> >> >> >> > In your case, the untagged network actually has vlan(tagged) >>> on >>> >> >> the >>> >> >> >> bridge, thus getting things confused. >>> >> >> >> > Will this patch(http://pastebin.com/HJXzZwKp) work for you? >>> >> >> >> > >>> >> >> >> >> On Mon, Aug 27, 2012 at 10:46 PM, Marcus Sorensen >>> >> >> >> <shadow...@gmail.com> >>> >> >> >> >> wrote: >>> >> >> >> >> > ... >>> >> >> >> >> > 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 >> > >