Just want to clarify: "We can add implementation of SetupGuestNetworkCommand/SetNetworkACLCommand/SetSourceNatCommand/Site2SiteVpnCfgCommand in VirtualRoutingResource."
So the Xen implementation of SetupGuestNetworkCommand is in CitrixResourceBase.java, and the VMware one is in VmwareResource.java, but you're saying I should put an implementation of these in VirtualRoutingResource.java for KVM? Sorry, still trying to piece together how everything relates. On Thu, Aug 30, 2012 at 10:42 AM, Edison Su <edison...@citrix.com> wrote: > Yes, it is. > >> -----Original Message----- >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >> Sent: Thursday, August 30, 2012 8:45 AM >> To: Edison Su >> Cc: cloudstack-dev@incubator.apache.org; Anthony Xu; Kelven Yang; >> Vijayendra Bhamidipati >> Subject: VPC for KVM (was VM router spawning multiple public nics) >> >> I notice there's also an 'IpAssocVpcCommand', I'm assuming that should >> be added to the list? >> >> On Wed, Aug 29, 2012 at 6:37 PM, Edison Su <edison...@citrix.com> wrote: >> > You can find the VPC reference implementation from >> CitrixResourceBase.java, which is the implementation for Xenserver. >> Just take a look at how the VPC related commands are implemented. >> > Take SetNetworkACLCommand as an example: >> > The function execute(SetNetworkACLCommand cmd) in citrixResourceBase: >> > 1. parse SetNetworkACLCommand >> > 2. call scripts/vm/hypervisor/xenserver/vmops, function routerProxy >> > 3. routerproxy will call scripts/network/domr/router_proxy.sh >> > 4. router_proxy.sh will login into router vm, execute a shell script >> inside router VM to program rules. >> > >> > In KVM, we can directly call router_proxy.sh or directly login into >> router vm, we just need to prepare the parameters for this script. >> > The reference code is in VirtualRoutingResource.java, all the network >> related command(extended from NetworkElementCommand) will be redirected >> to VirtualRoutingResource. >> > We can add implementation of >> SetupGuestNetworkCommand/SetNetworkACLCommand/SetSourceNatCommand/Site2 >> SiteVpnCfgCommand in VirtualRoutingResource. >> > >> > >> >> -----Original Message----- >> >> From: Marcus Sorensen [mailto:shadow...@gmail.com] >> >> Sent: Wednesday, August 29, 2012 4:34 PM >> >> To: cloudstack-dev@incubator.apache.org >> >> Cc: Edison Su; Anthony Xu; Kelven Yang; Vijayendra Bhamidipati >> >> Subject: Re: VM router spawning multiple public nics >> >> >> >> 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 >> >> >> >> >> > >> >> >