Slide 1

Slide 1 text

Dynamic Code Patterns: Extending Your Applications with Plugins Doug Hellmann – @doughellmann – PyCon 2013 1 Saturday, March 16, 13

Slide 2

Slide 2 text

What is a “Plugin”? • Loaded Dynamically • Extends Core • Possibly Unknown Source 2 Saturday, March 16, 13

Slide 3

Slide 3 text

Why Plugins? • Better API Abstraction • Reduce Core Dependencies • Strategy Pattern • Visitor Pattern • Indirect Code Contributions 3 Saturday, March 16, 13

Slide 4

Slide 4 text

• OpenStack Metering • Measures Clouds • Varied Billing Requirements • Deployers Extend and Customize Ceilometer 4 Saturday, March 16, 13

Slide 5

Slide 5 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 6

Slide 6 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 7

Slide 7 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 8

Slide 8 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 9

Slide 9 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 10

Slide 10 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 11

Slide 11 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 12

Slide 12 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 13

Slide 13 text

Ceilometer Design Compute Images Volumes Network Objects Notification Message Bus Event Listener Compute Pollsters Central Pollsters Collector Meter Data Message Bus 5 Saturday, March 16, 13

Slide 14

Slide 14 text

Ceilometer Plugins • Message Bus • Receiving Notifications • Polling Compute • Polling Other • Storage 6 Saturday, March 16, 13

Slide 15

Slide 15 text

Research • Blogofile • Sphinx • Mercurial • cliff • virtualenvwrapper • Nose • Trac • Django • Pyramid • SQLAlchemy • Diamond • Nova 7 Saturday, March 16, 13

Slide 16

Slide 16 text

Discovery Explicit Scan File Import Reference Mercurial Diamond Blogofile Mercurial Django Pyramid Sphinx Nova Trac Nose cliff virtualenvwrapper 8 Saturday, March 16, 13

Slide 17

Slide 17 text

Enabling Explicit Implicit Django Pyramid SQLAlchemy Blogofile Mercurial Trac Sphinx virtualenvwrapper cliff 9 Saturday, March 16, 13

Slide 18

Slide 18 text

Importing Custom pkg_resources Django Pyramid Sphinx Diamond Nova Nose SQLAlchemy Blogofile Trac Nose SQLAlchemy Blogofile cliff virtualenvwrapper 10 Saturday, March 16, 13

Slide 19

Slide 19 text

Integration Fine Coarse Prompt Inspect Nose virtualenvwrapper Sphinx Trac cliff Diamond Mercurial Blogofile Pyramid Django 11 Saturday, March 16, 13

Slide 20

Slide 20 text

Integration Fine Coarse Prompt Inspect Nose virtualenvwrapper Sphinx Trac cliff Diamond Mercurial Blogofile Pyramid Django 12 Saturday, March 16, 13

Slide 21

Slide 21 text

API Enforcement Convention Base Class / Interface Blogofile Mercurial Django Sphinx Pyramid virtualenvwrapper Nose (optional) Trac (interface) Diamond cliff (abc) 13 Saturday, March 16, 13

Slide 22

Slide 22 text

Invocation Driver Dispatcher Iterator SQLAlchemy Nova Mercurial Django Pyramid cliff Nose Diamond virtualenvwrapper 14 Saturday, March 16, 13

Slide 23

Slide 23 text

Discovery / Importing • Entry Points • Distribute and pkg_resources • Be Consistent 15 Saturday, March 16, 13

Slide 24

Slide 24 text

Enabling • Explicit disabling • Automatic disabling 16 Saturday, March 16, 13

Slide 25

Slide 25 text

Integration • Fine • Inspect • Application Owns Relationship 17 Saturday, March 16, 13

Slide 26

Slide 26 text

API Enforcement • Abstract Base Classes • Duck Typing 18 Saturday, March 16, 13

Slide 27

Slide 27 text

Invocation • Storage – Driver • Notifications – Dispatcher • Pollsters – Iterator 19 Saturday, March 16, 13

Slide 28

Slide 28 text

stevedore • Implements Patterns • Wraps pkg_resources 20 Saturday, March 16, 13

Slide 29

Slide 29 text

NamedExtensionManager • Multiple Plugins • Only Loads Named Plugins • map() 21 Saturday, March 16, 13

Slide 30

Slide 30 text

EnabledExtensionManager • Multiple Plugins • Checks Each with Function on Load • map() 22 Saturday, March 16, 13

Slide 31

Slide 31 text

DispatchExtensionManager • Multiple Plugins • Invokes Subset on map() 23 Saturday, March 16, 13

Slide 32

Slide 32 text

DriverManager • Single Plugin • Direct Access 24 Saturday, March 16, 13

Slide 33

Slide 33 text

Dynamic Code Patterns: Extending Your Applications with Plugins Doug Hellmann – @doughellmann – PyCon 2013 http://packages.python.org/distribute/pkg_resources.html https://github.com/dreamhost/stevedore https://launchpad.net/ceilometer http://doughellmann.com 25 Saturday, March 16, 13