Public bug reported:

Existing functionality of l2pop:
L2pop driver on server side -
1) when port binding or status or ip_address(or mac) is updated, notify this 
port's FDB(i.e port's 
   ip address, mac, hosting agent's tunnel ip) to all agents
2) also checks if it is the first or last port on the hosting agent's network, 
if so
   a) notifies all agents to create/delete tunnels and flood flows to hosting 
agent
   b) notifies hosting agent about all the existing network ports on other 
agents(so that hosting 
      agent can create tunnels, flood and unicast flows to these ports).
L2pop on agent side, after receiving notification from l2pop driver, 
creates/deletes tunnel endpoints, flood, unicast and ARP ovs flows to other 
agent's ports.


New Implementation:
But the same functionality can be achieved without l2pop. Whenever a port is 
created/updated/deleted, l2 agents get that port(ip, mac and host_id) through 
port_update and port_delete RPC notifications. Agents can get get hostname[1] 
and tunnel_ip of other agents through tunnel_update(and agents can locally save 
this mapping).
As we are getting port's FDB trough these API, we can build the ovs flows 
without l2pop FDB.


L2pop driver uses port context's original_port and new_port, to identify 
changes to port's FDB. In the new implementation, agent can save port's 
FDB(only required fields), so that new port update can be always compared with 
saved FDB, and then identify changes to port's FDB.
We can use port's revision_number to maintain order of port's updates.


When l2 agent adds first port on a network(i.e Provisions a local VLAN for the 
network), it can request server with a new RPC call to provide all network 
port's FDB on other agents. Then it can create flows to all these existing 
ports.


DVR implications:
Currently when DVR router port is bound, it notifies all agents[2]. But server 
will set port's host_id  to ''[3]. Need to change it to calling host and check 
the implications.

HA implications:
Port's host_id will always be set to master host. This allows other agents to 
create flows to master host only. Need to update HA to use existing DVR 
multiple portbinding approach, to allow other agents to create flows to all HA 
agents.

Other TODO:
1) In existing implementation, port status updates(update_port_status) won't 
notify agent. Need to enhance it.


Advantages
1) Existing l2pop driver code to identify 'active port count' on agent with 
multiple servers can be
   buggy[4].
2) L2pop driver identifies first port on a agent and notifies it other port's 
FDB through RPC.
   If this RPC is not reaching the agent for any reason(example, that rpc 
worker dead),
   then agents can never establish tunnels and flows to other agents.
3) We can remove additional l2pop mechanism driver on the server. Also can 
avoid separate l2pop
   RPC consumer threads on agent and related concurrency issues[5].


[1] need to patch type_tunnel.py to send hostname as argument for tunnel_update.
[2] 
https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L1564
[3] 
https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L542
[4] Got stabilized with https://review.openstack.org/#/c/300539/
[5] https://bugs.launchpad.net/neutron/+bug/1611308

** Affects: neutron
     Importance: Undecided
         Status: New


** Tags: l2-pop linuxbridge ovs

** Tags added: l2-pop linuxbridge ovs

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/1630981

Title:
  Implement l2pop driver functionality in l2 agent

Status in neutron:
  New

Bug description:
  Existing functionality of l2pop:
  L2pop driver on server side -
  1) when port binding or status or ip_address(or mac) is updated, notify this 
port's FDB(i.e port's 
     ip address, mac, hosting agent's tunnel ip) to all agents
  2) also checks if it is the first or last port on the hosting agent's 
network, if so
     a) notifies all agents to create/delete tunnels and flood flows to hosting 
agent
     b) notifies hosting agent about all the existing network ports on other 
agents(so that hosting 
        agent can create tunnels, flood and unicast flows to these ports).
  L2pop on agent side, after receiving notification from l2pop driver, 
creates/deletes tunnel endpoints, flood, unicast and ARP ovs flows to other 
agent's ports.

  
  New Implementation:
  But the same functionality can be achieved without l2pop. Whenever a port is 
created/updated/deleted, l2 agents get that port(ip, mac and host_id) through 
port_update and port_delete RPC notifications. Agents can get get hostname[1] 
and tunnel_ip of other agents through tunnel_update(and agents can locally save 
this mapping).
  As we are getting port's FDB trough these API, we can build the ovs flows 
without l2pop FDB.

  
  L2pop driver uses port context's original_port and new_port, to identify 
changes to port's FDB. In the new implementation, agent can save port's 
FDB(only required fields), so that new port update can be always compared with 
saved FDB, and then identify changes to port's FDB.
  We can use port's revision_number to maintain order of port's updates.

  
  When l2 agent adds first port on a network(i.e Provisions a local VLAN for 
the network), it can request server with a new RPC call to provide all network 
port's FDB on other agents. Then it can create flows to all these existing 
ports.

  
  DVR implications:
  Currently when DVR router port is bound, it notifies all agents[2]. But 
server will set port's host_id  to ''[3]. Need to change it to calling host and 
check the implications.

  HA implications:
  Port's host_id will always be set to master host. This allows other agents to 
create flows to master host only. Need to update HA to use existing DVR 
multiple portbinding approach, to allow other agents to create flows to all HA 
agents.

  Other TODO:
  1) In existing implementation, port status updates(update_port_status) won't 
notify agent. Need to enhance it.

  
  Advantages
  1) Existing l2pop driver code to identify 'active port count' on agent with 
multiple servers can be
     buggy[4].
  2) L2pop driver identifies first port on a agent and notifies it other port's 
FDB through RPC.
     If this RPC is not reaching the agent for any reason(example, that rpc 
worker dead),
     then agents can never establish tunnels and flows to other agents.
  3) We can remove additional l2pop mechanism driver on the server. Also can 
avoid separate l2pop
     RPC consumer threads on agent and related concurrency issues[5].

  
  [1] need to patch type_tunnel.py to send hostname as argument for 
tunnel_update.
  [2] 
https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L1564
  [3] 
https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L542
  [4] Got stabilized with https://review.openstack.org/#/c/300539/
  [5] https://bugs.launchpad.net/neutron/+bug/1611308

To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/1630981/+subscriptions

-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to