Developing Microservice Plugins
Jason Coposky, Chief Technologist
The iRODS Plugin Architecture
iRODS provides 6 plugin interfaces
- Storage Resource
- Authentication
- Network
- Database
- RPC API
- Microservice
Anatomy of a Plugin
- Built as a dynamic shared object
- provides a plugin_factory method which instantiates the plugin object
-
contains a class derived from a plugin interface base class:
- api
- auth
- network
- resource
- database
- ms_table_entry
- NOTE: microservices do not require a derived class, the factory can return an instance of ms_table_entry
Example Code
git clone https://github.com/irods/contrib
cd contrib/microservices/training_example/msiget_image_meta
Writing a microservice - part 1
-
The microservice must use C linkage
extern "C" {
-
Declare the microservice implementation as usual, following the parameters with the rule engine context
int msiget_image_meta_impl(msParam_t* _in, msParam_t* _out, ruleExecInfo_t* rei) {
using std::cout;
using std::endl;
using std::string;
char *filePath = parseMspForStr( _in );
if( !filePath ) {
cout << "msiget_image_meta - null filePath parameter" << endl;
return SYS_INVALID_INPUT_PARAM;
}
Writing a microservice - part 2
InitializeMagick((const char*)0); Image imgObj; imgObj.read(filePath); std::stringstream metaData; metaData << "ImageDepth=" << imgObj.modulusDepth() << "%Width=" << imgObj.columns() << "%Height=" << imgObj.rows() << "%CompressionType=" << convertCompressTypeToStr(imgObj.compressType()) << "%Format=" << imgObj.format() << "%Colorspace=" << convertColorSpaceTypeToStr(imgObj.colorSpace()); fillStrInMsParam(_out, metaData.str().c_str()); return 0; } // msi_get_image_meta_impl
The plugin factory
-
factory function requires C linkage and must follow the signature
irods::ms_table_entry* plugin_factory() {
-
instantiate a table entry and pass it the number of parameters of the microservice - not including the rule engine context irods::ms_table_entry* msvc = new irods::ms_table_entry(2);
-
wire the microservice name to the name of the implementation and return the plugin msvc->add_operation( "msiget_image_meta_impl", "msiget_image_meta"); return msvc; } } // extern "C"
Building a microservice plugin
- The irods-dev package is required to build plugins
GCC = g++
INC=-I/usr/include/irods/ -I/usr/include/irods/boost/ -I/usr/include/ImageMagick
all: libmsiget_image_meta
libmsiget_image_meta:
${GCC} ${INC} -DRODS_SERVER -fPIC "-Wl,-E" -shared -g \
-Wno-deprecated -rdynamic -o $@.so $@.cpp -lMagick++
clean:
@rm -f ./*.so
Questions?
Developing Microservice Plugins
By iRODS Consortium
Developing Microservice Plugins
An overview of how to write and build an iRODS microservice plugin
- 1,752