November 17-21, 2008, Santa Clara Marriott, Santa Clara, CA

Scripting Openwsman server plugins

Klaus Kämpf Motivation

• Management instrumentation is not sexy • CIM learning curve • Writing CIM providers is complex

Easy remote access to services

2 Instrumentation wishlist

• Single protocol • Single daemon • Single open port • Firewall friendly • Easy to code • Interoperable

3 Properties of WS-Management

• Management of Resources – Universal resource identifiers • Generic semantics on resources • Transport interface • There's more than just WS-CIM openwsman

• Open source implementation of WS- Management • Client and Server • Server architecture is plugin based • Includes (WS-)CIM plugin openwsman plugins

• Plugins handle resources • Resources are accessed by their universal resource identifier (URI) • URI = namespace + classname + keys • namespace + class prefix identify plugin • Plugins provide endpoints for resource operations Openwsman Architecture

HTTP Server openwsmand Listen Authorize Dispatch

Endpoints Endpoints WS-Enumeration InvokeEndpoints Enumerate Identify Pull Release WS-Transfer Create WS-Eventing Delete Subscribe Get Unsubscribe Put Renew

7 Plugins

• Simple interface • See my MDC2007 presentation “Web Service Management Application Enablement”

• Goal: Write plugins in scripting language

8 Motivation

• Make the developers life easier • Scripting language – Edit-Run vs. Edit-Compile-Link-Run • Use the tools best fitted to the task • Drastically reduce code size • Let developers focus on instrumentation • Leverage dynamic scripting languages • Portability

9 Design goals

• Support most popular scripting languages – Python, Ruby, , ... • Object orientation – Reduce parameters – Leverage exceptions • Reuse openwsman client bindings – Add server bindings • Consistent API – Similar code across scripting languages

10 How it was done

• Use a code generator (SWIG) • Reuse of generic code • Similar 'look&feel' across languages • Small language dependent layer

SWIG Simplified Wrapper and Interface Generator SWIG

SWIG is an interface that connects programs written in C and C++ with scripting languages such as Perl, Python, Ruby, and more. SWIG: Motivation

• Building more powerful C/C++ programs • Portability • Make C libraries 'object oriented' • Rapid prototyping and debugging • Systems integration • Construction of scripting language extension modules SWIG: About

• Homepage: http://www.swig.org • Available for – (AIX, HP-UX, Solaris, ...) – Macintosh OS-X/Darwin – Windows 95/98/NT/2000/XP/Vista

• History Initially started in July, 1995 at Los Alamos National Laboratory. First alpha release: February, 1996. Latest release: April 7, 2008. SWIG-1.3.35 • Active development 3-4 releases per year SWIG: Languages

Allegro CFFI (Common Lisp)

CLisp Octave

Chicken (Scheme) MzScheme SWIG – How does it work ?

wsman.h

C header SWIG – How does it work ?

wsman.h

C header

%module wsman wsman.i %include "wsman.h" Interface description SWIG – How does it work ?

cmpi.h SWIG

C header

cmpi.i

Interface description SWIG – How does it work ?

wsman.h SWIG

C header wsman_wrap.c

Binding code wsman.i

Interface description wsman.py

(Python code) SWIG – How does it work ?

wsman.h SWIG

C header wsman_wrap.c

Binding code wsman.i

Interface description Compiler wsman.py

(Python code) wsman_wrap.so

Target language module SWIG - Usage

Example: Python

test.py import pywsman SWIG - Usage

Example: Python

test.py pywsman.py import pywsman SWIG - Usage

Example: Python

test.py pywsman.py wsman_wrap.so import pywsman SWIG - Usage

Example: Python

test.py pywsman.py wsman_wrap.so import pywsman client = Client(“http://localhost”) options = ClientOptions() doc = client.identify( options ) Result

• Target language module • Access to openwsman data structures • Access to openwsman manipulation functions • Data wrappers ( C <-> target language)

• Missing: openwsman plugin API swig-plugin.c

• Manually crafted plugin interface • Supports all endpoint functions • Target language agnostic • Converts C data to target language • Calls target language • Status handling Building bridges

wsman.h SWIG

C header wsman_wrap.c swig-plugin.c

Binding code wsman.i

Interface description Compiler wsman.py

(Python code) wsman_wrap.so

Target language module + openwsman plugin API Plugin endpoint example

static int Swig_Enumerate_EP( WsContextH cntx, WsEnumerateInfo* enumInfo, WsmanStatus *status, void *opaqueData ) { Target_Type _context, _enumInfo; Target_Type _status; int rc;

_context = SWIG_NewPointerObj((void*) cntx, SWIGTYPE_p__WS_CONTEXT, OWN); _enumInfo = SWIG_NewPointerObj((void*) enumInfo, SWIGTYPE_p___WsEnumerateInfo, OWN); _status = SWIG_NewPointerObj((void*) status, SWIGTYPE_p__WsmanStatus, OWN);

rc = TargetCall(cntx->indoc, _TARGET_MODULE, "enumerate", 3, _context, _enumInfo, _status ); return rc; } target_$lang.c

• Target language specific layer • Very thin – TargetInitialize(...) – TargetCall(...) – TargetCleanup(...) • Loads/Unloads target interpreter • Loads endpoint implementation • Calls endpoint implementation Code size

• swig-plugin.c: 1225 lines • target_python.c: 491 lines • target_ruby.c: 401 lines

• Easy to maintain • Easy to extend Implementation example

• Enumerate (Ruby) def enumerate context, enum_info, status selectors = context.selectors

results = compute( selectors ) # compute enumeration result

enum_info.index = 0; enum_info.total_items = results.size enum_info.enum_results = results enum_info.enum_context = self true # success ! end Implementation example (cont.)

• Pull (Ruby) def self.pull context, enum_info, status if enum_info.index < enum_info.total_items then # create SOAP response out_doc = context.indoc.create_response_envelope body = out_doc.body # Construct WS-Enumeration pull response response = body.add(XML_NS_ENUMERATION, WSENUM_PULL_RESP) response = response.add(XML_NS_ENUMERATION, WSENUM_ITEMS) # resource representation response.add(enum_info.result[enum_info.index].to_xml) enum_info.pull_result = out_doc return true end end Status

• Beta quality – Code available through openwsman svn • Ruby as first choice – Author is a Python illiterate • Need other languages ? – Please give feedback (or code) Outlook

• Documentation • Improve openwsman plugin API • Finish Python backend References

• Openwsman – http://www.openwsman.org • Swig plugin source – http://www.openwsman.org/trac/browser/openws man/trunk/src/plugins/swig • Swig – http://www.swig.org Thank you !

Questions ?