66
Modular SDN Programming w/ Pyretic Joshua Reich Princeton University www.frenetic-lang.org/pyretic

Pyretic - A new programmer friendly language for SDN

Embed Size (px)

DESCRIPTION

Managing a network requires support for multiple concurrent tasks, from routing and traffic monitoring, to access control and server load balancing. Software-Defined Networking (SDN) allows applications to realize these tasks directly, by installing packet-processing rules on switches. However, today's SDN platforms provide limited support for creating modular applications. Join Bay Area Network Virtualization as Dr. Joshua Reich, Postdoctoral Research Scientist and Computing Innovation Fellow at Princeton University presents Pyretic - a new programmer-friendly domain-specific language embedded in Python that enables modular programming for SDN applications. Pyretic is part of the Frenetic Network Programming Language initiative sponsored by Princeton University and Cornell University, with support from the National Science Foundation, the Office of Naval Research, Google, Intel and Dell.

Citation preview

Page 1: Pyretic - A new programmer friendly language for SDN

Modular SDN Programming w/ Pyretic

Joshua ReichPrinceton University

www.frenetic-lang.org/pyretic

Page 2: Pyretic - A new programmer friendly language for SDN

2

SDN Is Great!

Page 3: Pyretic - A new programmer friendly language for SDN

3

Programming w/ OpenFlow, Not So Much.

Page 4: Pyretic - A new programmer friendly language for SDN

Example Network

4

Internet

Servers

B

A1

2

3

SDN Switchw/ labeled ports

Page 5: Pyretic - A new programmer friendly language for SDN

Counters for each rule - #bytes, #packets

A Simple OpenFlow Program

5

Pattern Action

Priority

Route: IP/fwd

B

A1

2

3

2:dstip=A -> fwd(2)1:* -> fwd(1)2:dstip=B -> fwd(3)

OpenFlowProgram

dstip=A

dstip=B

dstip!=Adstip!=B

Page 6: Pyretic - A new programmer friendly language for SDN

6

1:dstmac=A -> fwd(2)1:dstmac=B -> fwd(3)2:* -> fwd(1)

Pattern

Switch: MAC/fwd

B

A1

2

3

One API, Many Uses

PriorityOrdered

Action

Page 7: Pyretic - A new programmer friendly language for SDN

7

Load Balancer: IP/mod

B

A1

2

3

Pattern Action

srcip=0*,dstip=P -> mod(dstip=A) srcip=1*,dstip=P -> mod(dstip=B)

One API, Many Uses

Page 8: Pyretic - A new programmer friendly language for SDN

Controller Platform

Switch API (OpenFlow)

Monolithic Controller

Switches

App

Runtime

OpenFlow Programming Stack

Control Flow, Data Structures, etc.

*First Order Approximation

Page 9: Pyretic - A new programmer friendly language for SDN

Programming SDN w/ OpenFlow

9

Images by Billy Perkins

• The Good– Network-wide visibility– Direct control over the switches– Simple data-plane abstraction

• The Bad– Low-level programming interface– Functionality tied to hardware– Explicit resource control

• The Ugly– Non-modular, non-compositional– Challenging distributed programming

Page 10: Pyretic - A new programmer friendly language for SDN

Controller Platform

Switch API (OpenFlow)

Monolithic Controller

Switches

App

Runtime

Today: OpenDaylight, POX, etc.

Data and Control Flow

~ Registers, adders, etc.

~ Assembly language

Page 11: Pyretic - A new programmer friendly language for SDN

Pyretic Controller Platform

Switch API

Programmer API

(OpenFlow)

LBRouteMonitor FW

Switches

Apps

Runtime

(Pyretic)

Pyretic: Language & Platform

Page 12: Pyretic - A new programmer friendly language for SDN

12

Pyretic from 10,000 ft

Page 13: Pyretic - A new programmer friendly language for SDN

13

Pyretic Philosophy

• Provide high-level programming abstractions

• Based on state-of-the-art PL techniques

• Implement w/ state-of-the-art systems tech

• Package for the networking community

• Focus on real world utility and cutting edge features

Page 14: Pyretic - A new programmer friendly language for SDN

Open Source and Programmer-Friendly

• Embedded and Implemented in Python– Rich support for dynamic policies– Familiar constructs and environment– Python library / module system

• Default 3-clause BSD license• Active & growing developer

community– GitHub repository & wiki– Video tutorials and documentation

Page 15: Pyretic - A new programmer friendly language for SDN

15

Where Pyretic Fits• Hard and soft-switches

– Network processors

– Reconfigurable pipelines

– Hardware accelerated features

– Programmable x86 dataplane

• APIs and Languages

• Traffic Monitoring/Sampling/QoS

• Testing, Debugging, Verification

• Experimentation & Testbeds

• Integration & Orchestration

– End hosts

– Legacy switches

– Middleboxes

– Network Services

• WAN, Enterprise, DC, Home

• Wireless & Optical

• Systems Challenges

– Scalability

– Fault-tolerance

– Consistency

– Upgradability

– Performance

• Security

• Virtualization

– of network

– of services

– of address space

Page 16: Pyretic - A new programmer friendly language for SDN

16

Pyretic from 1,000 ft

Page 17: Pyretic - A new programmer friendly language for SDN

17

Basic Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 18: Pyretic - A new programmer friendly language for SDN

18

Pyretic =

* Our goal

Page 19: Pyretic - A new programmer friendly language for SDN

19

Pyretic Provides

Feature ExampleConcise policy encoding

• flood()

Boolean predicates • ~(match(dstip=10.0.0.1) | match(srcip=10.0.0.1) )

Composition operators

• (load_balance + monitor) >> route

Virtual header fields • match(switch)• modify(class=‘staff’)

Query Policies • count_packets()

Topology abstraction

• merge split refine

Page 20: Pyretic - A new programmer friendly language for SDN

20

Pyretic from 500 ft

Page 21: Pyretic - A new programmer friendly language for SDN

21

Policy in OpenFlow

• Defining “policy” is complicated– All rules in all switches– Packet-in handlers– Polling of counters

• Programming “policy” is error-prone– Duplication between rules and handlers– Frequent changes in policy (e.g.,

flowmods)– Policy changes affect packets in flight

Page 22: Pyretic - A new programmer friendly language for SDN

22

From Rules to a Policy Function

• Located packet– A packet and its location (switch and port)

• Policy function– From located packet to set of located packets

• Examples– Original packet: identity– Drop the packet: drop– Modified header: modify(f=v)– New location: fwd(a)

Page 23: Pyretic - A new programmer friendly language for SDN

23

Pyretic at sea-level

Page 24: Pyretic - A new programmer friendly language for SDN

24

Why a set? Consider flood

To flood every packet:

from pyretic.lib.corelib import *

def main():return flood()

Page 25: Pyretic - A new programmer friendly language for SDN

25

No worrying about:

• Writing a separate handler for controller

• Constructing and sending OpenFlow rules

• Keeping track of each switch • Whether all switches supports the

OpenFlow “flood” action (portability!)

Page 26: Pyretic - A new programmer friendly language for SDN

26

Programmer Wishlist

• Encode policy concisely

• Specify traffic of interest

• Write portable code

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 27: Pyretic - A new programmer friendly language for SDN

27

From Bit Patterns to Predicates

• OpenFlow: bit patterns – No direct way to specify dstip!=10.0.0.1 – Requires two prioritized bitmatches

• Higher priority: dstip=10.0.0.1• Lower priority: *

• Pyretic: boolean predicates– Combined with &, |, and ~– E.g., ~match(dstip=10.0.0.1)

Page 28: Pyretic - A new programmer friendly language for SDN

28

Example: Access Control

Block host 10.0.0.3

def access_control():return

~(match(srcip=‘10.0.0.3’) | match(dstip=‘10.0.0.3’) )

Page 29: Pyretic - A new programmer friendly language for SDN

29

Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 30: Pyretic - A new programmer friendly language for SDN

30

OpenFlow Packets

• Location specific code needs both– The packet– The OF packet_in message*

• Tagging packets requires choosing – Header field (e.g., VLAN, MPLS, TOS bits)– Set of values

Neither concise nor portable

* https://github.com/noxrepo/pox/tree/betta/pox/misc/of_tutorial.py

Page 31: Pyretic - A new programmer friendly language for SDN

31

Pyretic Virtual Header Fields

• Unified abstraction– Real headers: dstip, srcport, …– Packet location: switch and port– User-defined: e.g., traffic_class

• Simple operations, concise syntax– Match: match(f=v)– Modify: modify(f=v)

• Example– match(switch=A) & match(dstip=‘1.0.0.3’)

Page 32: Pyretic - A new programmer friendly language for SDN

32

Runtime Handles Implementation

• Compiler chooses – What set of header bits to use – What each value means

• Conceptual – no tying to particular mech.

• Portable – different hw, other modules • Efficient

– Don’t need same vlan value network-wide– Sometimes tags will ‘factor out’

Page 33: Pyretic - A new programmer friendly language for SDN

33

Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 34: Pyretic - A new programmer friendly language for SDN

34

Recall OpenFlow

Page 35: Pyretic - A new programmer friendly language for SDN

35

srcip=0*,dstip=P -> mod(dstip=A) srcip=1*,dstip=P -> mod(dstip=B)

dstip=A -> fwd(2)dstip=B -> fwd(3)* -> fwd(1)

Balance then Route (in Sequence)

Combined Rules?(only one match)

srcip=0*,dstip=P -> mod(dstip=A) srcip=1*,dstip=P -> mod(dstip=B) dstip=A -> fwd(2) dstip=B -> fwd(3) * -> fwd(1)

Balances w/oForwarding!srcip=0*,dstip=P -> mod(dstip=A)

srcip=1*,dstip=P -> mod(dstip=B)

dstip=A -> fwd(2) dstip=B -> fwd(3) * -> fwd(1)

Forwards w/o Balancing!

Page 36: Pyretic - A new programmer friendly language for SDN

36

dstip = 10.0.0.2 fwd(2)dstip = 10.0.0.3 fwd(3)* fwd(1)

srcip = 5.6.7.8 count dstip = 10.0.0.2 fwd(2)dstip = 10.0.0.3 fwd(3)* fwd(1)

Forwards but doesn’t count

Route and Monitor (in Parallel)

IP = 10.0.0.2

IP = 10.0.0.3

2

31

MonitorRoute

dstip = 10.0.0.2 fwd(2)dstip = 10.0.0.3 fwd(3)* fwd(1)

srcip = 5.6.7.8 count

Counts but doesn’t forward

srcip = 5.6.7.8 count

Combined rules installed on switch?

Page 37: Pyretic - A new programmer friendly language for SDN

37

srcip = 5.6.7.8 count dstip = 10.0.0.2 fwd(2)dstip = 10.0.0.3 fwd(3)* fwd(1)

Requires a Cross Product [ICFP’11, POPL’12]

IP = 10.0.0.2

IP = 10.0.0.3

2

31

MonitorRoute

srcip = 5.6.7.8 , dstip = 10.0.0.2 fwd(2) , countsrcip = 5.6.7.8 , dstip = 10.0.0.3 fwd(3) , countsrcip = 5.6.7.8 fwd(1) , count dstip = 10.0.0.2 fwd(2) dstip = 10.0.0.3 fwd(3) * fwd(1)

Page 38: Pyretic - A new programmer friendly language for SDN

38

Parallel ‘|’: Do both C1 and C2 simultaneously

Sequential ‘>>’: First do C1 and then do C2

Policy Functions Enable Compositional Operators

Page 39: Pyretic - A new programmer friendly language for SDN

39

Example: Sequential Composition

To first apply access control and then floodaccess_control() >> flood()

• Two totally independent policies• Combined w/o any change to either

Page 40: Pyretic - A new programmer friendly language for SDN

40

E.g., the ‘if_’ policy

def if_(F,P1,P2): return (F >> P1) + (~F >> P2)

Easily Define New Policies

Page 41: Pyretic - A new programmer friendly language for SDN

41

Or flood

xfwd(a) = ~match(inport=a) >> fwd(a)

flood = parallel([match(switch=sw) >> parallel(map(xfwd,ports)) for sw,ports in MST])

• Portable: compiler chooses whether to implement using OpenFlow ‘flood’ or ‘forward’

Page 42: Pyretic - A new programmer friendly language for SDN

42

Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 43: Pyretic - A new programmer friendly language for SDN

43

Querying In OpenFlow

• Pre-install rules at the needed granularity (so byte/packet counters are available)

• Issue queries to poll these counters

• Parse the responses when they arrive

• Combine counter values from multiple rules

• Keep track of any packets sent to controller

Page 44: Pyretic - A new programmer friendly language for SDN

44

Queries in Pyretic

• Just a special type of policy• Forwarding to a “bucket”

– q = packets(limit=1,group_by=['srcip'])

• Used like any other (>>, +)• w/ Callback function registration

– q.register_callback(printer)

Page 45: Pyretic - A new programmer friendly language for SDN

45

Example: Monitor

q = count_bytes(interval=1)q.register_callback(printer)monitor = match(srcip='10.0.0.1') >> q

Page 46: Pyretic - A new programmer friendly language for SDN

46

Query Policy Library

Syntax Side Effectpackets( limit=n, group_by=[f1,f2,…])

callback on every packet received for up to n packets identical on fields f1,f2,...

count_packets( interval=t, group_by=[f1,f2,…])

count every packet received callback every t seconds providing count for each group

count_bytes( interval=t, group_by=[f1,f2,…])

count bytes receivedcallback every t seconds providing count for each group

Page 47: Pyretic - A new programmer friendly language for SDN

47

Recall OpenFlow ToyBalance Route Monitor

Page 48: Pyretic - A new programmer friendly language for SDN

48

In Pyreticbalance = (match(srcip=0*,dstip=P) >> modify(dstip=A)) + (match(srcip=1*,dstip=P) >> modify(dstip=B)) + (~match( dstip=P) >> identity)

route = (match(dstip=A) >> fwd(2)) + (match(dstip=B) >> fwd(3)) + (~(match(dstip=A) | match(dstip=B)) >> fwd(1))

b = count_bytes(interval=1)b.register_callback(print)monitor = match(srcip=X) >> b

mlb = (balance >> route) + monitor

1*

0*

B

A1

23

Page 49: Pyretic - A new programmer friendly language for SDN

49

Compared to

install_flowmod(5,srcip=X & dstip=P,[mod(dstip=A), fwd(2)])install_flowmod(4,srcip=0* & dstip=P,[mod(dstip=A), fwd(2)])install_flowmod(4,srcip=1* & dstip=P,[mod(dstip=B), fwd(3)])install_flowmod(4,srcip=X & dstip=A ,[ fwd(2)])install_flowmod(4,srcip=X & dstip=B,[ fwd(3)])install_flowmod(3, dstip=A,[ fwd(2)])install_flowmod(3, dstip=B,[ fwd(3)])install_flowmod(2,srcip=X ,[ fwd(1)])install_flowmod(1,* ,[ fwd(3)])

Page 50: Pyretic - A new programmer friendly language for SDN

50

Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 51: Pyretic - A new programmer friendly language for SDN

51

Functions Support Dynamism

• Dynamic policies are also functions of time

• Value at current moment in self.policy

• Reassigning updates dynamic policy• Can be driven by queries

Page 52: Pyretic - A new programmer friendly language for SDN

Update current val Otherwise, policy unchanged

Example: MAC-Learning

class learn(DynamicPolicy): def init(self): q = packets(limit=1,[’srcmac’,’switch’]) q.register_callback(update) self.policy = flood() + q

def update(self,pkt): self.policy = if_(match(dstmac=pkt[’srcmac’], switch=pkt[’switch’]), fwd(pkt[’inport’]), self.policy) 52

First packet with uniquesrcmac, switch

Defined momentarily

to flood

If newly learned MAC

New Type of Dynamic Policy

and query Initialize currentvalue of time series

Forward directly tolearned port

Page 53: Pyretic - A new programmer friendly language for SDN

53

Dynamic Policies

Can also be driven by external events!

Page 54: Pyretic - A new programmer friendly language for SDN

54

Example: UI Firewall def __init__(self): print "initializing firewall" self.firewall = {} ... self.ui = threading.Thread( target=self.ui_loop) self.ui.daemon = True self.ui.start()

def update_policy (self): self.policy = ~union([(match(srcmac=mac1) & match(dstmac=mac2)) | (match(dstmac=mac1) & match(srcmac=mac2)) for (mac1,mac2) in self.firewall.keys()])

def AddRule (self, mac1, mac2): if (mac2,mac1) in self.firewall: return self.firewall[(mac1,mac2)]=True self.update_policy()

Page 55: Pyretic - A new programmer friendly language for SDN

55

Programmer Wishlist

• Encode policy concisely

• Write portable code

• Specify traffic of interest

• Compose code from independent modules

• Query network state

• Modify policy dynamically

Page 56: Pyretic - A new programmer friendly language for SDN

56

OpenFlow Topology-Dependence

• Application written for single switch cannot easily be ported to run over a distributed collection of switches

• Or be made to share switch hardware with other packet-processing applications.

Page 57: Pyretic - A new programmer friendly language for SDN

57

Pyretic Topology Abstraction

• Built as an application-level library• On top of other features introduced• Examples provided for

– Merging– Splitting– Refining

Page 58: Pyretic - A new programmer friendly language for SDN

58

• Simplest of topology abstraction examples• Build a distributed middlebox by

running centralized middlebox app on V!

Topology Abstraction: Merge

V

S T

58

Derived Network

Underlying Network

1

1 2

2

12

Page 59: Pyretic - A new programmer friendly language for SDN

59

Topology Abstraction: SplitReplace Legacy Gateway

LegacyEthernet

LegacyIP CoreFI 341 E2 G

Module 1:MAC-learn

Module 3:IP-Route

Module 2: Forward

(ARP or MAC Rewrite)

Gateway acts like:• Legacy router• Legacy switch

• ARP responder• Hybrid MAC-

rewriter, legacy router/switch

Page 60: Pyretic - A new programmer friendly language for SDN

60

Pyretic Platform

Page 61: Pyretic - A new programmer friendly language for SDN

Switches

OF Controller Platform

OF Controller Client

Pyretic Backend

Pyretic Runtime

Main App 1 App 2

OpenFlow Messages

Serialized Messages (TCP socket)

Controller

Platform Architecture

Process 1

Process 2

Page 62: Pyretic - A new programmer friendly language for SDN

62

Modes of Operation• Interpreted (on controller)

– Fallback when rules haven’t been installed– Good for debugging

• Reactive– Rules installed in response to packets seen– Fallback when proactive isn’t feasible– Various flavors and optimizations

• Proactive– Analyze policy and push rules– Computation can be an issue– Currently working out kinks

Page 63: Pyretic - A new programmer friendly language for SDN

HA &Scale Out

Interpreter, QoS, ACL, Topo

Runtime Architecture (in Progress)

Flow Table Cache Management

Consistent Update

Incrementalization

Classifier GenerationQueryMgmt

Page 64: Pyretic - A new programmer friendly language for SDN

64

Also in Progress• New features

– Policy access controls– QoS operators– Enhanced querying library

• Applications– Incorporation of RADIUS & DHCP

services – Wide-area traffic-management solutions

for ISPs at SDN-enabled Internet Exchange Points.

Page 65: Pyretic - A new programmer friendly language for SDN

65

Don’t Just Take Our Word

• 2013 NSDI Community Award Winner• Featured in Coursera SDN MOOC

(~50K students, over 1K did assignments)• Georgia Tech Resonance Reimplementation

– Approximately one programmer-day – Six-fold reduction in code size (prev in NOX)– Short expressions replaced complex code

• Matching packets • Modifying and injecting packets • Constructing and installing OpenFlow rules

– Added new features too complex for NOX

Page 66: Pyretic - A new programmer friendly language for SDN

66

www.frenetic-lang.org/pyretic

Test It Out Yourself