class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin):
- """Mixin class for L3 DVR scheduler."""
+ """Mixin class for L3 DVR scheduler.
+
+ DVR currently supports the following use cases:
+
+ - East/West (E/W) traffic between VMs: this is handled in a
+ distributed manner across Compute Nodes without a centralized element.
+ This includes E/W traffic between VMs on the same Compute Node.
+ - North/South traffic for Floating IPs (FIP N/S): this is supported on the
+ distributed routers on Compute Nodes without any centralized element.
+ - North/South traffic for SNAT (SNAT N/S): this is supported via a
+ centralized element that handles the SNAT traffic.
+
+ To support these use cases, DVR routers rely on an L3 agent that runs on a
+ central node (also known as Network Node or Service Node), as well as, L3
+ agents that run individually on each Compute Node of an OpenStack cloud.
+
+ Each L3 agent creates namespaces to route traffic according to the use
+ cases outlined above. The mechanism adopted for creating and managing
+ these namespaces is via (Router, Agent) binding and Scheduling in general.
+
+ The main difference between distributed routers and centralized ones is
+ that in the distributed case, multiple bindings will exist, one for each
+ of the agents participating in the routed topology for the specific router.
+
+ These bindings are created in the following circumstances:
+
+ - A subnet is added to a router via router-interface-add, and that subnet
+ has running VM's deployed in it. A binding will be created between the
+ router and any L3 agent whose Compute Node is hosting the VM(s).
+ - An external gateway is set to a router via router-gateway-set. A binding
+ will be created between the router and the L3 agent running centrally
+ on the Network Node.
+
+ Therefore, any time a router operation occurs (create, update or delete),
+ scheduling will determine whether the router needs to be associated to an
+ L3 agent, just like a regular centralized router, with the difference that,
+ in the distributed case, the bindings required are established based on
+ the state of the router and the Compute Nodes.
+ """
def dvr_update_router_addvm(self, context, port):
ips = port['fixed_ips']