January 2014 Thomas D. Nadeau OpenDaylight January 2014 Thomas D. Nadeau
What is OpenDaylight An OpenSource Project to build an ecosystem of OpenSource SDN software Multi-project Multi-vendor #3 on CIO Magazine’s “Top 10 Software Defined Networking Startups” 2
OpenDaylight Scope Scope: Projects chosen by TSC are limited to the following areas: The OpenDaylight controller Software for forwarding elements Southbound plugins to enable the controller to speak to the OpenDaylight supplied and other network elements Northbound plugins to expose interfaces to those writing applications to the controller Network services and applications intended to run on top of the controller, integration between the controller and other elements, and Support projects such as tools, infrastructure, or testing. Plugins for inter-controller communication
Who is OpenDaylight Project? Platinum Gold Silver
OpenDaylight Project Goals Code: To create a robust, extensible, open source code base that covers the major common components required to build an SDN solution Acceptance: To get broad industry acceptance amongst vendors and users Community: To have a thriving and growing technical community contributing to the code base, using the code in commercial products, and adding value above, below and around.
ODL “Hydrogen” Release Plan 6
Projects in the Hydrogen Release Controller VTN OpenDove Affinity Management Service LISP Mapping Service Yang Tools Defense4All BGP-LS/PCEP OpenStack Plugin OpenFlow Protocol OpenFlow SB Plugin OVSDB SNMP4SDN GUI Integration Testing 7
OpenDaylight Controller Architecture
OpenFlow in Open Daylight The OpenDaylight OpenFlow plugin will provide: Abstraction of OpenFlow networks to the MD-SAL Interim support for Hard-SAL developed functions Support for OpenFlow 1.0 and 1.3.1 in Hydrogen The OpenFlow projects will additionally: Develop network functions for 1.3.1 network models Expose 1.3.1 OpenFlow capabilities through the ODL NBI Follow the ONF OpenFlow release cycle Preliminary plan to support OF 1.5 in Helium
OpenFlow Plugin Architecture
Moving to Model-Driven SAL Applications Northbound APIs (Generated & Handcrafted) Network Service Plugin Platform Service Plugin Transformer/ Adapter Internal Plugin Java & REST SAL APIs (Generated) Network Abstraction Layer … Topology NE NE NE Tunnels System Flows … Nodes Links Table Table … Table … Config Stats Config Stats Table Table … … Paths Flow Flow Flow Flow Flow Flow Java SAL APIs (Generated) Netconf OF-Config/OVSDB OF x.y PCEP … BGP-LS Network Elements
Moving to Model-Driven SAL: The Software Engineer’s View Network Applications Netconf NB APIs (Generated & Handcrafted) Controller (Container Instance) … REST CONF Network Service Platform Service Internal Plugin SB Protocol OfConfig OVSDB OF x.y FCAPS Java SAL APIs (Generated) SAL Consumer Producer
Moving to Model-Driven SAL: Add Clustering Network Applications Netconf NB APIs (Generated & Handcrafted) Controller (Container Instance) … REST CONF Network Service Platform Service Internal Plugin SB Protocol OfConfig OVSDB OF x.y FCAPS Java SAL APIs (Generated) SAL Consumer Producer Data Store kv-store, SQL, ... Message Bus AMQP, 0-MQ... … Container instance Container Instance
Demo: RPC Request Routing Module sal-flow { namespace "urn:opendaylight:flow:service"; prefix flow; import yang-ext {prefix ext;} import opendaylight-inventory {prefix inv;} import ietf-inet-types {prefix inet;} import opendaylight-flow-types {prefix types;} typedef flow-table-ref { type instance-identifier; } grouping node-flow { leaf node { ext:context-reference "inv:node-context"; type inv:node-ref; leaf flow-table { type flow-table-ref; uses types:flow; grouping flow-update { container original-flow { container updated-flow { rpc add-flow { input { uses node-flow; } rpc remove-flow { ... } rpc update-flow { ... } ... API: salFlowService add-flow(AddFlowInput) remove-flow(RemoveFlowInput) update-flow(ApdateflowInput) ... Yang Tools ConsumerService TestFlowService
Demo: RPC Request Routing Controller (Container Instance) Consumer TestFlowService (“FlowService1”) TestFlowService (“FlowService2”) salFlowService API Network Nodes Routing Table: Node[key=foo:node:1] add-flow remove-flow ... update-fow Node[key=foo:node:2] add-flow remove-flow ... update-fow Node [key=foo:node:1] Node [key=foo:node:2] 1. Create Deploy Providers and Consumer 2. Register “FlowService1” as the provider for the ‘salFlowService’ API 3. Register “FlowService2” as the provider for the ‘salFlowService’ API 4. Register “Consumer” as the consumer for the ‘salFlowService’ API 5. Register path /Nodes/Node[key=foo:node:1] for “FlowService1” 6. Register path /Nodes/Node[key=foo:node:2] for “FlowService2”
Demo: RPC Request Routing Controller (Container Instance) Consumer TestFlowService (“FlowService1”) TestFlowService (“FlowService2”) salFlowService API Network Nodes Node[key=foo:node:1] add-flow remove-flow ... update-fow Routing Table: Node[key=foo:node:2] add-flow remove-flow ... update-fow Node [key=foo:node:1] Node [key=foo:node:2] 1. Consumer invokes ‘add-flow’ with node id ‘foo:node:1” 2. Consumer invokes ‘add-flow’ with node id ‘foo:node:2”
Demo: RPC Request Routing Controller (Container Instance) Consumer TestFlowService (“FlowService1”) TestFlowService (“FlowService2”) salFlowService API Network Nodes Node[key=foo:node:1] add-flow remove-flow ... update-fow Routing Table: Node[key=foo:node:2] add-flow remove-flow ... update-fow Node [key=foo:node:1] Node [key=foo:node:2] 1. Consumer invokes ‘add-flow’ with node id ‘foo:node:1”
Demo: Remote Request Routing Controller (Container Instance) Controller (Container Instance) RPC Client RpcService PingAPI Ping API Message Bus Network Network Nodes Nodes Routing Table: Routing Table: Node [key=foo:node:1] Node[key=foo:node:2] add-flow remove-flow ... update-fow Node [key=foo:node:1] Node[key=foo:node:2] add-flow remove-flow ... update-fow Node[key=foo:node:1] add-flow remove-flow ... update-fow Node[key=foo:node:1] add-flow remove-flow ... update-fow 1. Consumer invokes ‘add-flow’ with node id ‘foo:node:1”
Request Routing (App->NE) Application NE1 NE2 NEn Models Models Models Models Controller (Container Instance) RESTCONF Inventory Netconf Network Inventory Request Routing NE1 f1 f2 ... fn NEn f1 f2 ... fn Routing Table: NE2 f1 f2 ... fn NE1 NE2 NEn module node-feature-inventory { prefix nf; import opendaylight-inventory {prefix inv}; import yang-ext { prefix ext}; import mount { prefix mount}; augment "/inv:nodes/inv:node" { ext:context-instance “node"; ext:augment-identifier "netconf-node"; mount:mountpoint "mounted-data" { mount:subtree "/"; } } } Path: “/inv:nodes/inv:node[id=”NE1"]/nf:mounted-data/f1”
Request Routing (App->NE, Multi-Dest) Application NE1 NE2 NEn Models Models Models Controller (Container Instance) RESTCONF Inventory Netconf OpenFlow Models Network Inventory Request Routing NE1 f1 f2 ... fn NEn f1 f2 ... fn Routing Table: NE2 f1 f2 ... fn NE1 NE2 NEn module node-feature-inventory { prefix nf; import opendaylight-inventory {prefix inv}; import yang-ext { prefix ext}; import mount { prefix mount}; augment "/inv:nodes/inv:node" { ext:context-instance “node"; ext:augment-identifier "of-node"; mount:mountpoint "mounted-data" { mount:subtree "/"; } } } Path: “/inv:nodes/inv:node[id=”NEn"]/nf:mounted-data/f1”
Call to Action Open Source is standards for the 21st Century OpenDaylight is rapidly becoming the focal point for SDN Code is the Coin of the Realm Influence comes from contribution of code Brings forth ideas to contribute and resources to do the work 21
Resources IRC: #opendaylight on Freenone More information and to join: wiki.opendaylight.org Keep informed and join the conversation IRC: #opendaylight on Freenone Open mailing lists: lists.opendaylight.org @openDaylightSDN #OpenDaylight 22
Thank you
Request Routing (App->NE) Application NE1 NE2 NEn Models Models Models Models Controller (Container Instance) RESTCONF Inventory Netconf Network Inventory Request Routing NE1 f1 f2 ... fn NEn f1 f2 ... fn Routing Table: NE2 f1 f2 ... fn NE1 NE2 NEn module node-feature-inventory { prefix nf; import opendaylight-inventory {prefix inv}; import yang-ext { prefix ext}; import mount { prefix mount}; augment "/inv:nodes/inv:node" { ext:context-instance “node"; ext:augment-identifier "netconf-node"; mount:mountpoint "mounted-data" { mount:subtree "/"; } } } Path: “/inv:nodes/inv:node[id=”NE1"]/nf:mounted-data/f1”
Request Routing (App->NE, Multi-Dest) Application NE1 NE2 NEn Models Models Models Controller (Container Instance) RESTCONF Inventory Netconf OpenFlow Models Network Inventory Request Routing NE1 f1 f2 ... fn NEn f1 f2 ... fn Routing Table: NE2 f1 f2 ... fn NE1 NE2 NEn module node-feature-inventory { prefix nf; import opendaylight-inventory {prefix inv}; import yang-ext { prefix ext}; import mount { prefix mount}; augment "/inv:nodes/inv:node" { ext:context-instance “node"; ext:augment-identifier "of-node"; mount:mountpoint "mounted-data" { mount:subtree "/"; } } } Path: “/inv:nodes/inv:node[id=”NEn"]/nf:mounted-data/f1”
Request Routing (RPC App->Service) module Service1 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpc Op11 { input { leaf foo { type bar; } module Service2 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpc Op21 { input { leaf foo { type bar; } POST /restconf/v1/operations/Service2:Op21 { input: { [foo=“1234”] } Application Service1 Service2 Model2 Model1 Model1 Model2 POST /restconf/v1/operations/Service1:Op11 { input: { [foo=“1234”] } Controller (Container Instance) RESTCONF (Proxy Server) RESTCONF (Proxy Client) Network Services Request Routing Service1 Op11 Op21 ... Op_1n Service2 Op21 Op22 ... Op_2n Routing Table: Service1 Service2
Request Routing (RPC App->Service) module Service1 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpc Op11 { input { leaf foo { type bar; } module Service2 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpc Op21 { input { leaf foo { type bar; } POST /restconf/v1/operations/Service2:Op21 { input: { [foo=“1234”] } Application Service1 Service2 Model2 Model1 Model1 Model2 POST /restconf/v1/operations/Service1:Op11 { input: { [foo=“1234”] } Controller (Container Instance) Netconf Network Services Request Routing Service1 Op11 Op21 ... Op_1n Service2 Op21 Op22 ... Op_2n Routing Table: Service1 Service2
Distributed Request Routing (App->NE) Application NE1 NE2 NEn Models Models Models Models Controller (Container Instance) Controller (Container Instance) Data Store RESTCONF Inventory Netconf Network Network Request Routing Inventory Request Routing Inventory NE1 NE2 NE3 NE1 f1 f2 ... fn NEn f1 f2 ... fn Routing Table: Routing Table: NE1 NE1 NE2 f1 f2 ... fn NE2 NE2 NEn NEn Message Bus module node-feature-inventory { prefix nf; import opendaylight-inventory {prefix inv}; import yang-ext { prefix ext}; import mount { prefix mount}; augment "/inv:nodes/inv:node" { ext:context-instance “node"; ext:augment-identifier "netconf-node"; mount:mountpoint "mounted-data" { mount:subtree "/"; } } } Path: “/inv:nodes/inv:node[id=”NE1"]/nf:mounted-data/f1”
Receiving a ‘Flow Delete’ Message Controller … Topology Manager ARP Handler Statistics Manager Flow Programmer Service 1 MD-SAL 6 RESTCONF/ NETCONF SAL Notification “Is generated from” 5 Request Routing OF Plugin API 3 4 OF Plugin OF Library 2 OF Plugin Model
Adding a Flow … Controller Topology Manager ARP Handler Flow Service Model 2 “Is generated from” Controller … Topology Manager ARP Handler Statistics Manager Flow Programmer Service 1 4 MD-SAL 5 RESTCONF/ NETCONF 6 Flow Service API 7 RPC Request Routing “Is generated from” OF Plugin API RPC Flow Service Model Data 3 9 8 1 OF Plugin OF Library 10 OF Plugin Model
Network Application Life Cycle (Today) Application change Application Application Application GUI/API change API Controller Controller change Network Representation … … API Network API change API API Network Element Network Element Feature change … …
Network Application Life Cycle (End-to-End Model-Driven Archictecture) Application change Application Application Application Auto-update API API Controller Autogenerate code Network Representation … … API Load NE Model Network API API Network Element Network Element Feature change … …
Java NB Service Modeled API NFV Virtual Appliance SB Plugin Model NB Service Model “Is generated from” “Is generated from” Controller Controller REST API … REST API REST API REST API NB-Plugin 1 NB-Plugin 2 NB-Plugin 1 Adaptation Plugin NB-Plugin 2 AD-SAL Java plugin NB API Java Service NB API MD-SAL Request Routing Java NB Service Modeled API Request Routing Adaptation Data Store SB Model Data Java SB Modeled API NB Model Data Java plugin SB API … … SB-Plugin 1 SB-Plugin 2 SB-Plugin 1 SB-Plugin 2 API-Driven SAL (AD-SAL) Model-Driven SAL (MD-SAL)
NFV Virtual Appliance Controller/EMS/Orchestration ODL Netconf, REST (XML & JSON) ODL Control Plane App Control Plane App Control Plane App Netconf/RESTCONF Application development environment: NFV Control Plane Manageability Service apps SAL SB Plugin SB Plugin SB Plugin DP1 OVS DPDK Data Path Fastpath
Plugin Build Process Controller Generate APIs 1 Yang Tools Model Model Yang Model Generate APIs 1 Yang Tools Create API Bundle 2 Deploy Maven Build Tools “API” OSGI Bundle Java API Definition 4 Java API Definition Generated API Definition Controller Maven Build Tools “Plugin” OSGI Bundle 4 3 Deploy Create Plugin Bundle Module Implementations Module Implementations Plugin source code
Moving to Model-Driven SAL Applications Northbound APIs (Generated & Handcrafted) Network Service Plugin Platform Service Plugin Transformer/ Adapter Internal Plugin Java & REST SAL APIs (Generated) Network Abstraction Layer … Topology NE NE NE Tunnels System Flows … Nodes Links Table Table … Table … Config Stats Config Stats Table Table … … Paths Flow Flow Flow Flow Flow Flow Java SAL APIs (Generated) SB Protocol OF-Config/OVSDB OF x.y PCEP … BGP-LS Network Elements
Moving to Model-Driven SAL (Cont.) Applications NB APIs (Generated & Handcrafted) Platform Services Netconf OF Network Services ALTO Internal Plugin Java & REST SAL APIs (Generated) Abstraction Layer … Topology NE NE NE System Flows RIB … Tunnels Paths Nodes Links Table Table … Table Config Stats … Java SAL APIs (Generated) SB Protocol OF-Config/OVSDB OF x.y PCEP … BGP-LS Network Elements
Moving to Model-Driven SAL (Cont.) Applications Topo Mgr REST API NB APIs (Generated & Handcrafted) Platform Services Netconf RESTCONF OF Network Services Topology Manager Topology Module Java & REST SAL APIs (Generated) Abstraction Layer … NE NE NE IETF Topology System Flows RIB … Tunnels Paths Nodes Links Table Table … Table XMP topology Config Stats … Topology Service Java SAL APIs (Generated) SB Protocol OF-Config/OVSDB OF x.y PCEP … XMP -Conn Network Elements
Architecture Binding-Aware Core Binding Independent Core Data Repository Transient Repository (MI Data Repository) Providers Binding-Aware Providers Binding-Aware Consumers Applications Controller SAL Core Binding Generator Binding-Independent Consumers Schema Repository Binding-Independent Providers