Python Bindings for the SAF-AIS APIs 5.18.2011

23
Python Bindings for the SAF-AIS APIs Currie Reid Linux Product Division Wind River

description

Python bindings for SAF-AIS APIs offer many advantages to middleware developers, application developers, tool developers and testers. The bindings help to speed up the software development lifecycle and enable rapid deployment of architecture-independent components and services. This session will describe main principles guiding Python bindings implementation, and will have extensive in-depth application Python code examples using SAF-AIS services.

Transcript of Python Bindings for the SAF-AIS APIs 5.18.2011

Page 1: Python Bindings for the SAF-AIS APIs 5.18.2011

Python Bindings for the SAF-AIS APIs

Currie ReidLinux Product Division

Wind River

Page 2: Python Bindings for the SAF-AIS APIs 5.18.2011

Outline of Presentation

• Requirements

• What is Python?

• Mapping Python to Requirements

• Demo setup

• How Python bindings are implemented

• Demonstration

• Future Works

Page 3: Python Bindings for the SAF-AIS APIs 5.18.2011

Requirements

• Enable testing in all phases of the software

lifecycle.

• Simplify development across different

architectures.

• Simplify presentation to developers and

engineers.

• Quickly create tools that make it easy to

investigate and monitor the system.

• Make it easy to create and modify prototypes.

Page 4: Python Bindings for the SAF-AIS APIs 5.18.2011

What is Python?

• General purpose, high-level, interpreted

language.

• Design philosophy emphasizes code readability.

• Large, comprehensive standard library.

• Supports object-oriented, imperative, and (lesser

degree) functional programming paradigms.

• Dynamic type system, automatic memory

management.

• Free, open-source, many 3rd party packages.

Page 5: Python Bindings for the SAF-AIS APIs 5.18.2011

Enable testing in all phases of software

lifecycle

• Test coverage more complete if easy to write

tests; test-driven development encouraged!

• Tests are portable across architectures.

• Built-in modules for testing include unittest and

doctest.

• Modules available for unit testing, mock testing,

fuzz testing, web testing, gui testing, etc.

• i.e.: nose, py.test, zope.testing.

Page 6: Python Bindings for the SAF-AIS APIs 5.18.2011

Simplify development across different

architectures

• Python scripts are portable across different

architectures.

• Edit-compile-run cycle is greatly reduced.

• Python code can be edited on the target system

if required.

• Huge collection of native and 3rd-party bindings

available to aid/speed development.

Page 7: Python Bindings for the SAF-AIS APIs 5.18.2011

Simplify presentation to developers and

engineers

• Python syntax reads like pseudo-code.

• Most Python programs much smaller than lower-

level implementations.

• Easier to examine the problem domain when

you abstract-away programming details and

challenges associated with the machine.

Page 8: Python Bindings for the SAF-AIS APIs 5.18.2011

Make it easy to create and modify

prototypes

• Components and applications can be rapidly

prototyped in Python.

• Designs can then be hardened in another

implementation language.

• Ideal glue language.

• Working code can be developed much faster

than lower-level languages.

Page 9: Python Bindings for the SAF-AIS APIs 5.18.2011

What Will be Demonstrated

• Unit tests written for every interface except SMF.

• AMF demo component written in Python.

• Admin-commands written in Python.

• Server implemented in Python: receives NTF

notifications, queries IMM and updates web-

client.

• Alarms resulting from admin-commands.

• Logging from AMF demo component.

Page 10: Python Bindings for the SAF-AIS APIs 5.18.2011

Explanation of Demonstration System

• Virtual appliance; 2 system controllers

• OpenSAF framework

• Amf_demo: saAmf, saLog

• Immwebsocket: saImmOm, saNtf

• Immwebclient: HTML5 websockets, CSS,

Javascript, JSON

Page 11: Python Bindings for the SAF-AIS APIs 5.18.2011

Ctypes module: Wrap Libraries in Python

• Advanced FFI (Foreign Function Interface) for

Python 2.3 and higher.

• Included in Python 2.5.

• Call functions from DLLs (shared libraries).

• Create, access and manipulate simple and

complicated C data types in Python.

• Enables C callbacks to be implemented in

Python.

Page 12: Python Bindings for the SAF-AIS APIs 5.18.2011

Python Implementation

• Conversion of SAF types to ctypes

• Definition of Const

• Definition of Enumeration

• Definition of Structs

• Definition of Unions

• Dynamic Loading of Libraries and CDLL

• Definition of Functions

• Definition of callbacks and CFUNCTYPE

Page 13: Python Bindings for the SAF-AIS APIs 5.18.2011

Conversion of SAF types to ctypes

SaInt8T = c_char

SaInt16T = c_short

SaInt32T = c_int

SaInt64T = c_longlong

SaUint8T = c_ubyte

SaUint16T = c_ushort

SaUint32T = c_uint

SaUint64T = c_ulonglong

...

myuint = SaUint64T(12)

Page 14: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of Const

saAis = Const()

saAis.SA_TIME_END = 0x7FFFFFFFFFFFFFFF

saAis.SA_TIME_BEGIN = 0x0

saAis.SA_TIME_UNKNOWN = 0x8000000000000000

time_start = saAis.SA_TIME_BEGIN

saAis.SA_TIME_BEGIN = 5 #ERROR: EXCEPTION

Page 15: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of Enumeration

SaDispatchFlagsT = SaEnumT

eSaDispatchFlagsT = Enumeration((

('SA_DISPATCH_ONE', 1),

('SA_DISPATCH_ALL', 2),

('SA_DISPATCH_BLOCKING', 3),

))

flag = eSaDispatchFlagsT.SA_DISPATCH_ALL

flag_str = eSaDispatchFlagsT.whatis(flag)

Page 16: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of Structs

class SaNameT(Structure):

_fields_ = [('length', SaUint16T),

('value',(SaInt8T*saAis.SA_MAX_NAME_LENGTH))]

def __init__(self, name=''):

super(SaNameT, self).__init__(len(name), name)

dn = SaNameT(‘safApp=OpenSAF’)

Page 17: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of Unions

class SaLimitValueT(Union):

_fields_ = [('int64Value', SaInt64T),

('uint64Value', SaUint64T),

('timeValue', SaTimeT),

('floatValue', SaFloatT),

('doubleValue', SaDoubleT)]

un = SaLimitValueT()

un.timeValue = 5000000000

Page 18: Python Bindings for the SAF-AIS APIs 5.18.2011

Dynamic Loading of Libraries and CDLL

amfdll = CDLL('libSaAmf.so.0')

amfHandle = SaAmfHandleT()

amfCallbacks = None

version = SaVersionT(‘B’, 1, 1)

rc = saAmfInitialize(amfHandle,

amfCallbacks, version)

Page 19: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of Functions

def saAmfInitialize(amfHandle,

amfCallbacks, version):

return amfdll.saAmfInitialize(

BYREF(amfHandle),

BYREF(amfCallbacks),

BYREF(version))

Page 20: Python Bindings for the SAF-AIS APIs 5.18.2011

Definition of callbacks and CFUNCTYPE

SaAmfCSISetCallbackT = CFUNCTYPE(None,

SaInvocationT, POINTER(SaNameT),

SaAmfHAStateT, SaAmfCSIDescriptorT)

def myCSISetCallback(invoc,

comp, hastate, descr):

callbacks = SaAmfCallbacksT()

callbacks.saAmfCSISetCallbackT(

SaAmfCSISetCallbackT(myCSISetCallback))

Page 21: Python Bindings for the SAF-AIS APIs 5.18.2011

Concluding Demonstations

• Unit tests written for every interface except SMF.

• AMF demo component written in Python.

• Admin-commands written in Python.

• Server implemented in Python: receives NTF

notification, queries IMM and updates web-

client.

• Alarms resulting from admin-commands.

• Logging from AMF demo component.

Page 22: Python Bindings for the SAF-AIS APIs 5.18.2011

Future Work

• Complete unit tests for all interfaces.

• Bind Python admin-commands into CLI.

• Complete SMF bindings.

• Create more tools to enhance system useability.

• Consider Pythonic interfaces, similar as what

was done for Java.

• Consider code-generation for Python bindings.

• Consider compiled Python: Cython, Psyco, etc.

Page 23: Python Bindings for the SAF-AIS APIs 5.18.2011

Questions?