450 likes | 720 Views
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.
E N D
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 OpenDaylightcontroller • 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.
Projects in the Hydrogen Release • OpenFlow Protocol • OpenFlow SB Plugin • OVSDB • SNMP4SDN • GUI • Integration Testing • Controller • VTN • OpenDove • Affinity Management Service • LISP Mapping Service • Yang Tools • Defense4All • BGP-LS/PCEP • OpenStack Plugin 7
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
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 Table Stats Config 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 Producer Consumer
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 Producer Consumer 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 { uses types:flow; } container updated-flow { uses types:flow; } } rpc add-flow { input { uses node-flow; } } rpcremove-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] Node[key=foo:node:2] Node [key=foo:node:1] Node [key=foo:node:2] ... ... add-flow add-flow update-fow update-fow remove-flow remove-flow 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] Routing Table: Node[key=foo:node:2] Node [key=foo:node:1] Node [key=foo:node:2] ... ... add-flow add-flow update-fow update-fow remove-flow remove-flow 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] Routing Table: Node[key=foo:node:2] Node [key=foo:node:1] Node [key=foo:node:2] ... ... add-flow add-flow update-fow update-fow remove-flow remove-flow 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:1] Node[key=foo:node:2] Node[key=foo:node:2] Node[key=foo:node:1] Node[key=foo:node:1] ... ... ... ... add-flow add-flow add-flow add-flow update-fow update-fow update-fow update-fow remove-flow remove-flow remove-flow remove-flow 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 Routing Table: NE1 NE2 NEn NE1 NE2 NEn f1 f1 f1 f2 f2 f2 fn fn fn module node-feature-inventory { prefixnf; import opendaylight-inventory {prefixinv}; importyang-ext { prefixext}; 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 Routing Table: NE1 NE2 NEn NE1 NE2 NEn f1 f1 f1 f2 f2 f2 fn fn fn module node-feature-inventory { prefixnf; import opendaylight-inventory {prefixinv}; importyang-ext { prefixext}; 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 • 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
Request Routing (App->NE) Application NE1 NE2 NEn Models Models Models Models Controller (Container Instance) RESTCONF Inventory Netconf Network Inventory Request Routing Routing Table: NE1 NE2 NEn NE1 NE2 NEn f1 f1 f1 f2 f2 f2 fn fn fn module node-feature-inventory { prefixnf; import opendaylight-inventory {prefixinv}; importyang-ext { prefixext}; 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 Routing Table: NE1 NE2 NEn NE1 NE2 NEn f1 f1 f1 f2 f2 f2 fn fn fn module node-feature-inventory { prefixnf; import opendaylight-inventory {prefixinv}; importyang-ext { prefixext}; 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} rpcOp11 { input { leaf foo { type bar; } } } } module Service2 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpcOp21 { 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”] } Service1 Service2 Controller (Container Instance) RESTCONF (Proxy Server) Op21 Op11 Op_1n Op_2n RESTCONF (Proxy Client) ... ... Op21 Op22 Network Services Request Routing Routing Table: Service1 Service2
Request Routing (RPC App->Service) module Service1 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpcOp11 { input { leaf foo { type bar; } } } } module Service2 { prefix svc1; import yang-ext {prefix ext} import inventory {prefix inv} rpcOp21 { 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”] } Service1 Service2 Controller (Container Instance) Netconf Op21 Op11 Op_1n Op_2n ... ... Op21 Op22 Network Services Request Routing 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 NE3 NE2 Routing Table: Routing Table: NE1 NE1 NE2 NE2 NEn NEn NE1 NE2 NEn Message Bus f1 f1 f1 f2 f2 f2 fn fn fn module node-feature-inventory { prefixnf; import opendaylight-inventory {prefixinv}; importyang-ext { prefixext}; 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 … ARP Handler Topology Manager Flow Programmer Service Statistics Manager 1 6 RESTCONF/ NETCONF MD-SAL SAL Notification 5 “Is generated from” Request Routing OF Plugin API 4 3 OF Plugin OF Library 2 OF Plugin Model
Adding a Flow Flow Service Model 2 “Is generated from” Controller … ARP Handler Topology Manager Flow Programmer Service Statistics Manager 1 4 5 MD-SAL RESTCONF/ NETCONF 6 Flow Service API 7 RPC Request Routing “Is generated from” Flow Service Model Data RPC OF Plugin API 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 Network Representation Autogenerate code … … API Load NE Model Network API API Network Element Network Element … … Feature change
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 Adaptation Plugin NB-Plugin 2 NB-Plugin 1 NB-Plugin 2 NB-Plugin 1 MD-SAL Java plugin NB API Java Service NB API AD-SAL Request Routing Java NB Service Modeled API Request Routing Adaptation Data Store SB Model Data NB Model Data Java SB Modeled API 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 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 Model Model Yang Model Generate APIs 1 Yang Tools Create API Bundle Deploy 2 Maven Build Tools “API” OSGI Bundle 4 Java API Definition Java API Definition Generated API Definition Controller “Plugin” OSGI Bundle Maven Build Tools 4 Deploy 3 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 Table Stats Config 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 ALTO Netconf OF Network Services 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 TopoMgr 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
Applications Architecture Binding-Aware Consumers Binding-Independent Consumers Binding-Aware Core Binding Independent Core Binding Generator Controller SAL Core Data Repository Schema Repository Providers Transient Repository(MI Data Repository) Providers Binding-Aware Providers Binding-Independent Providers