What I said in my reply is that there is no need for the value. It was not used in 3.0 so what is the need now? Thanks, Hans
On 09/23/2013 01:52 PM, Nagendra Kumar wrote: > HI Hans, > Amf sets NCS_ENV_COMPONENT_ERROR_SRC with value of enums. So, I > can't mention numeric like 9 or 10 in AMF PR. > > Thanks > -Nagu > > -----Original Message----- > From: Hans Feldt [mailto:[email protected]] > Sent: 23 September 2013 17:10 > To: Nagendra Kumar > Cc: Mathivanan Naickan Palanivelu; Praveen Malviya; > [email protected]; UABHANO > Subject: Re: [devel] [PATCH 1 of 1] Amf: Change NCS_ENV_COMPONENT_ERROR_SRC > to OSAF_COMPONENT_ERROR_SOURCE [#429] > > On 09/23/2013 01:26 PM, Nagendra Kumar wrote: >> Hi Hans, >> >>>> In order to complete #429 I would expect some patches that change the CLC >>>> CLI scripts for OpenSAF components. Is that pending? >> >> It is not pending from my side. After the information provided in PR doc, >> individual service owner can do it. >> >>>> changing an external interface (name of env var) >> So, you mean, in AMF PR, I can give name as AVND_ERR_ for all enums ? > > No! As I read #428 it is about generating core dumps for for opensaf > components when they have failed. In order to do that you need to change the > CLEANUP scripts to use the special environment variable previously known as > NCS_ENV_COMPONENT_ERROR_SRC. In 3.x no script used the actual value of such > variable. Thus it is more the existence of the variable that means anything. > Its value can be set 1/YES/TRUE, does not really matter. Which means > documenting this is not hard. > > And you don't have to change any interal constants because there are > internal... > > Thanks, > Hans > > >> >> Thanks >> -Nagu >> >> -----Original Message----- >> From: Hans Feldt [mailto:[email protected]] >> Sent: 23 September 2013 16:44 >> To: Nagendra Kumar >> Cc: Mathivanan Naickan Palanivelu; Praveen Malviya; >> [email protected]; UABHANO >> Subject: Re: [devel] [PATCH 1 of 1] Amf: Change >> NCS_ENV_COMPONENT_ERROR_SRC to OSAF_COMPONENT_ERROR_SOURCE [#429] >> >> Hi, >> >> First I think Hans Nordebäcks C++ changes to amfnd are first in the pipe. >> You should ack those so that his work not gets wasted. I think Praveen was >> reviewer. I have already acked with a small comment. >> >> Second you are doing two things in this patch. Refactoring the name of amfnd >> internal constants and changing an external interface (name of env var). >> Should be in separate patches. There is not much point in changing the name >> of internal constants now. There are so many of them that we should rather >> have a strategy instead. So I suggest you remove that part. >> >> In order to complete #429 I would expect some patches that change the CLC >> CLI scripts for OpenSAF components. Is that pending? >> >> Thanks, >> Hans >> >> >> On 09/23/2013 09:02 AM, Nagendra Kumar wrote: >>> Will get committed tomorrow. Please review. >>> >>> >>> Thanks >>> -Nagu >>> >>> -----Original Message----- >>> From: Nagendra Kumar >>> Sent: 17 September 2013 16:52 >>> To: [email protected]; [email protected]; Mathivanan >>> Naickan Palanivelu; Praveen Malviya >>> Cc: [email protected] >>> Subject: [devel] [PATCH 1 of 1] Amf: Change >>> NCS_ENV_COMPONENT_ERROR_SRC to OSAF_COMPONENT_ERROR_SOURCE [#429] >>> >>> osaf/services/saf/amf/amfnd/avnd_cam.c | 4 +- >>> osaf/services/saf/amf/amfnd/avnd_cbq.c | 18 ++++++------ >>> osaf/services/saf/amf/amfnd/avnd_chc.c | 4 +- >>> osaf/services/saf/amf/amfnd/avnd_clc.c | 8 ++-- >>> osaf/services/saf/amf/amfnd/avnd_comp.c | 2 +- >>> osaf/services/saf/amf/amfnd/avnd_err.c | 10 +++--- >>> osaf/services/saf/amf/amfnd/avnd_mon.c | 2 +- >>> osaf/services/saf/amf/amfnd/include/avnd_err.h | 38 >>> +++++++++++++------------- >>> 8 files changed, 43 insertions(+), 43 deletions(-) >>> >>> >>> diff --git a/osaf/services/saf/amf/amfnd/avnd_cam.c >>> b/osaf/services/saf/amf/amfnd/avnd_cam.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_cam.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_cam.c >>> @@ -66,7 +66,7 @@ uint32_t avnd_comp_am_start(AVND_CB *cb, >>> rc = avnd_comp_clc_cmd_execute(cb, comp, >>> AVND_COMP_CLC_CMD_TYPE_AMSTART); >>> } else { >>> /*** comp error processing ***/ >>> - err.src = AVND_ERR_SRC_AM; >>> + err.src = OSAF_ERR_SRC_AM; >>> err.rec_rcvr.avsv_ext = comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err); >>> } >>> @@ -167,7 +167,7 @@ uint32_t avnd_comp_amstop_clc_res_proces >>> if (!m_AVND_COMP_IS_FAILED(comp)) { >>> >>> /*** process error ***/ >>> - err.src = AVND_ERR_SRC_AM; >>> + err.src = OSAF_ERR_SRC_AM; >>> err.rec_rcvr.avsv_ext = comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err); >>> } >>> diff --git a/osaf/services/saf/amf/amfnd/avnd_cbq.c >>> b/osaf/services/saf/amf/amfnd/avnd_cbq.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_cbq.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_cbq.c >>> @@ -155,7 +155,7 @@ uint32_t avnd_evt_ava_csi_quiescing_comp >>> >>> if (SA_AIS_OK != qsc->err) { >>> /* process comp-failure */ >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_SET_FAILED; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_SET_FAILED; >>> err_info.rec_rcvr.avsv_ext = comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } else { >>> @@ -203,7 +203,7 @@ uint32_t avnd_evt_tmr_qscing_cmpl_evh(st >>> goto done; >>> } >>> ncshm_give_hdl(tmr->opq_hdl); >>> - err_info.src = AVND_ERR_SRC_QSCING_COMPL_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_QSCING_COMPL_TIMEOUT; >>> err_info.rec_rcvr.avsv_ext = comp->err_info.def_rec; >>> >>> rc = avnd_err_process(cb, comp, &err_info); @@ -347,7 +347,7 @@ >>> uint32_t avnd_evt_ava_resp_evh(AVND_CB * >>> /* process comp-failure */ >>> if (hc_rec) { >>> err_info.rec_rcvr.raw = >>> hc_rec->rec_rcvr.raw; >>> - err_info.src = >>> AVND_ERR_SRC_CBK_HC_FAILED; >>> + err_info.src = >>> OSAF_ERR_SRC_CBK_HC_FAILED; >>> rc = avnd_err_process(cb, comp, >>> &err_info); >>> } >>> } else { >>> @@ -423,7 +423,7 @@ uint32_t avnd_evt_ava_resp_evh(AVND_CB * >>> >>> if (SA_AIS_OK != resp->err) { >>> /* process comp-failure */ >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_SET_FAILED; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_SET_FAILED; >>> err_info.rec_rcvr.avsv_ext = >>> comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } else { >>> @@ -466,7 +466,7 @@ uint32_t avnd_evt_ava_resp_evh(AVND_CB * >>> >>> /* perform err prc if resp fails */ >>> if (SA_AIS_OK != resp->err) { >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_REM_FAILED; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_REM_FAILED; >>> err_info.rec_rcvr.avsv_ext = >>> comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } >>> @@ -554,17 +554,17 @@ uint32_t avnd_evt_tmr_cbk_resp_evh(AVND_ >>> } else { >>> switch (rec->cbk_info->type) { >>> case AVSV_AMF_HC: >>> - err_info.src = AVND_ERR_SRC_CBK_HC_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_CBK_HC_TIMEOUT; >>> break; >>> case AVSV_AMF_CSI_SET: >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_SET_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_SET_TIMEOUT; >>> break; >>> case AVSV_AMF_CSI_REM: >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_REM_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_REM_TIMEOUT; >>> break; >>> default: >>> >>> LOG_ER("%s,%u,type=%u",__FUNCTION__,__LINE__,rec->cbk_info->type); >>> - err_info.src = AVND_ERR_SRC_CBK_CSI_SET_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_CBK_CSI_SET_TIMEOUT; >>> break; >>> } >>> /* treat it as comp failure (determine the recommended >>> recovery) >>> */ diff --git a/osaf/services/saf/amf/amfnd/avnd_chc.c >>> b/osaf/services/saf/amf/amfnd/avnd_chc.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_chc.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_chc.c >>> @@ -874,7 +874,7 @@ uint32_t avnd_comp_hc_rec_confirm(AVND_C >>> m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, rec, >>> AVND_CKPT_COMP_HC_REC_TMR); >>> } else { >>> /* process comp failure */ >>> - err_info.src = AVND_ERR_SRC_HC; >>> + err_info.src = OSAF_ERR_SRC_HC; >>> err_info.rec_rcvr.raw = rec->rec_rcvr.raw; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } >>> @@ -922,7 +922,7 @@ uint32_t avnd_comp_hc_rec_tmr_exp(AVND_C >>> } >>> } else { >>> /* process comp failure */ >>> - err_info.src = AVND_ERR_SRC_HC; >>> + err_info.src = OSAF_ERR_SRC_HC; >>> err_info.rec_rcvr.raw = rec->rec_rcvr.raw; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } >>> diff --git a/osaf/services/saf/amf/amfnd/avnd_clc.c >>> b/osaf/services/saf/amf/amfnd/avnd_clc.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_clc.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_clc.c >>> @@ -398,7 +398,7 @@ uint32_t avnd_evt_clc_resp_evh(AVND_CB * >>> AVND_ERR_INFO err_info; >>> LOG_NO("Healthcheck failed for '%s'", >>> comp->name.value); >>> log_failed_exec(&clc_evt->exec_stat, comp, >>> clc_evt->cmd_type); >>> - err_info.src = AVND_ERR_SRC_HC; >>> + err_info.src = OSAF_ERR_SRC_HC; >>> err_info.rec_rcvr.avsv_ext = >>> comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err_info); >>> goto done; >>> @@ -581,7 +581,7 @@ uint32_t avnd_evt_tmr_clc_pxied_comp_reg >>> m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, >>> AVND_CKPT_COMP_ORPH_TMR); >>> >>> /* process comp failure */ >>> - err_info.src = AVND_ERR_SRC_PXIED_REG_TIMEOUT; >>> + err_info.src = OSAF_ERR_SRC_PXIED_REG_TIMEOUT; >>> err_info.rec_rcvr.saf_amf = SA_AMF_COMPONENT_FAILOVER; >>> rc = avnd_err_process(cb, comp, &err_info); >>> >>> @@ -2478,7 +2478,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_ >>> char env_val_comp_err[11]; /*we req only 10 */ >>> char env_var_name[] = "SA_AMF_COMPONENT_NAME"; >>> char env_var_nodeid[] = "NCS_ENV_NODE_ID"; >>> - char env_var_comp_err[] = "NCS_ENV_COMPONENT_ERROR_SRC"; >>> + char env_var_comp_err[] = "OSAF_COMPONENT_ERROR_SOURCE"; >>> char *env_attr_val = 0; >>> AVND_CLC_EVT *clc_evt; >>> AVND_EVT *evt = 0; >>> @@ -2576,7 +2576,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_ >>> arg.num_args++; >>> env_counter++; >>> >>> - /* Note:- we will set NCS_ENV_COMPONENT_ERROR_SRC only for >>> + /* Note:- we will set OSAF_COMPONENT_ERROR_SOURCE only for >>> * cleanup script >>> */ >>> >>> diff --git a/osaf/services/saf/amf/amfnd/avnd_comp.c >>> b/osaf/services/saf/amf/amfnd/avnd_comp.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_comp.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_comp.c >>> @@ -390,7 +390,7 @@ uint32_t avnd_evt_mds_ava_dn_evh(AVND_CB >>> >>> if (comp) { >>> /* found the matching comp; trigger error processing */ >>> - err_info.src = AVND_ERR_SRC_AVA_DN; >>> + err_info.src = OSAF_ERR_SRC_AVA_DN; >>> err_info.rec_rcvr.avsv_ext = comp->err_info.def_rec; >>> rc = avnd_err_process(cb, comp, &err_info); >>> } >>> diff --git a/osaf/services/saf/amf/amfnd/avnd_err.c >>> b/osaf/services/saf/amf/amfnd/avnd_err.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_err.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_err.c >>> @@ -194,7 +194,7 @@ uint32_t avnd_evt_ava_err_rep_evh(AVND_C >>> m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, >>> AVND_CKPT_COMP_ERR_INFO); >>> >>> /*** process the error ***/ >>> - err.src = AVND_ERR_SRC_REP; >>> + err.src = OSAF_ERR_SRC_REP; >>> err.rec_rcvr.raw = err_rep->rec_rcvr.raw; >>> rc = avnd_err_process(cb, comp, &err); >>> } >>> @@ -315,16 +315,16 @@ uint32_t avnd_err_process(AVND_CB *cb, A >>> >>> /* Level3 escalation is node failover. we dont expect any >>> ** more errors from application as the node is already failed >>> over. >>> - ** Except AVND_ERR_SRC_AVA_DN, AvSv will ignore any error which happens >>> + ** Except OSAF_ERR_SRC_AVA_DN, AvSv will ignore any error which >>> +happens >>> ** in level3 escalation >>> */ >>> - /* (AVND_ERR_SRC_AVA_DN != err_info->src) check is added so that comp >>> state is marked as failed >>> + /* (OSAF_ERR_SRC_AVA_DN != err_info->src) check is added so that >>> +comp state is marked as failed >>> * and error cleanup (Clearing pending assignments, deleting >>> dynamic info associated with the >>> * component) is done for components which goes down after >>> AVND_ERR_ESC_LEVEL_3 is set >>> */ >>> if ((cb->node_err_esc_level == AVND_ERR_ESC_LEVEL_3) && >>> (comp->su->is_ncs == SA_FALSE) && (esc_rcvr != >>> SA_AMF_NODE_FAILFAST) && >>> - (AVND_ERR_SRC_AVA_DN != err_info->src)) >>> { >>> + (OSAF_ERR_SRC_AVA_DN != err_info->src)) >>> { >>> /* For external component, comp->su->is_ncs is false, >>> so no need to >>> put a check here for external component explicitely. >>> */ >>> goto done; >>> @@ -343,7 +343,7 @@ uint32_t avnd_err_process(AVND_CB *cb, A >>> comp->err_info.src = err_info->src; >>> >>> /* if time's not specified, use current time TBD */ >>> - if (err_info->src != AVND_ERR_SRC_REP) >>> + if (err_info->src != OSAF_ERR_SRC_REP) >>> m_GET_TIME_STAMP(comp->err_info.detect_time); >>> >>> m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, >>> AVND_CKPT_COMP_ERR_INFO); diff --git >>> a/osaf/services/saf/amf/amfnd/avnd_mon.c >>> b/osaf/services/saf/amf/amfnd/avnd_mon.c >>> --- a/osaf/services/saf/amf/amfnd/avnd_mon.c >>> +++ b/osaf/services/saf/amf/amfnd/avnd_mon.c >>> @@ -437,7 +437,7 @@ uint32_t avnd_evt_pid_exit_evh(AVND_CB * >>> return NCSCC_RC_FAILURE; >>> >>> /* store the info */ >>> - err.src = AVND_ERR_SRC_PM; >>> + err.src = OSAF_ERR_SRC_PM; >>> err.rec_rcvr.raw = pm_rec->rec_rcvr.raw; >>> comp = pm_rec->comp; >>> >>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_err.h >>> b/osaf/services/saf/amf/amfnd/include/avnd_err.h >>> --- a/osaf/services/saf/amf/amfnd/include/avnd_err.h >>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_err.h >>> @@ -50,31 +50,31 @@ typedef enum avnd_err_esc_level { } >>> AVND_ERR_ESC_LEVEL; >>> >>> /* component error source enums */ -typedef enum avnd_err_src { >>> - AVND_ERR_SRC_REP = 1, /* comp reports an error */ >>> - AVND_ERR_SRC_HC, /* healthcheck failure */ >>> - AVND_ERR_SRC_PM, /* passive monitoring failure */ >>> - AVND_ERR_SRC_AM, /* active monitoring failure (AM_START/STOP >>> +typedef enum osaf_err_src { >>> + OSAF_ERR_SRC_REP = 1, /* comp reports an error */ >>> + OSAF_ERR_SRC_HC, /* healthcheck failure */ >>> + OSAF_ERR_SRC_PM, /* passive monitoring failure */ >>> + OSAF_ERR_SRC_AM, /* active monitoring failure (AM_START/STOP >>> execution failed) */ >>> - AVND_ERR_SRC_CMD_FAILED, /* AMF command fails (INSTANTIATE cmd >>> fails for NPI >>> + OSAF_ERR_SRC_CMD_FAILED, /* AMF command fails (INSTANTIATE cmd >>> fails for NPI >>> comp as a result of CSI >>> assignment) */ >>> - AVND_ERR_SRC_CBK_HC_TIMEOUT, /* AMF health check callback times out >>> */ >>> - AVND_ERR_SRC_CBK_HC_FAILED, /* AMF callback failed */ >>> - AVND_ERR_SRC_AVA_DN, /* AvA down */ >>> - AVND_ERR_SRC_PXIED_REG_TIMEOUT, /* orphaned state timed out */ >>> - AVND_ERR_SRC_CBK_CSI_SET_TIMEOUT, /* AMF csi set callback times >>> out */ >>> - AVND_ERR_SRC_CBK_CSI_REM_TIMEOUT, /* AMF csi rem callback times >>> out */ >>> - AVND_ERR_SRC_CBK_CSI_SET_FAILED, /* AMF callback failed */ >>> - AVND_ERR_SRC_CBK_CSI_REM_FAILED, /* AMF callback failed */ >>> + OSAF_ERR_SRC_CBK_HC_TIMEOUT, /* AMF health check callback times out >>> */ >>> + OSAF_ERR_SRC_CBK_HC_FAILED, /* AMF callback failed */ >>> + OSAF_ERR_SRC_AVA_DN, /* AvA down */ >>> + OSAF_ERR_SRC_PXIED_REG_TIMEOUT, /* orphaned state timed out */ >>> + OSAF_ERR_SRC_CBK_CSI_SET_TIMEOUT, /* AMF csi set callback times >>> out */ >>> + OSAF_ERR_SRC_CBK_CSI_REM_TIMEOUT, /* AMF csi rem callback times >>> out */ >>> + OSAF_ERR_SRC_CBK_CSI_SET_FAILED, /* AMF callback failed */ >>> + OSAF_ERR_SRC_CBK_CSI_REM_FAILED, /* AMF callback failed */ >>> /* Add other sources of error detection */ >>> - AVND_ERR_SRC_QSCING_COMPL_TIMEOUT, /* AMF qscing complete times >>> out */ >>> + OSAF_ERR_SRC_QSCING_COMPL_TIMEOUT, /* AMF qscing complete times >>> out */ >>> >>> - AVND_ERR_SRC_MAX >>> -} AVND_ERR_SRC; >>> + OSAF_ERR_SRC_MAX >>> +} OSAF_ERR_SRC; >>> >>> /* component error information */ >>> typedef struct avnd_cerr_info_tag { >>> - AVND_ERR_SRC src; /* error source */ >>> + OSAF_ERR_SRC src; /* error source */ >>> SaAmfRecommendedRecoveryT def_rec; /* default comp >>> recovery */ >>> SaTimeT detect_time; /* error detection time */ >>> uint32_t restart_cnt; /* restart counter */ >>> @@ -82,7 +82,7 @@ typedef struct avnd_cerr_info_tag { >>> >>> /* wrapper structure used to carry error info across routines */ >>> typedef struct avnd_err_tag { >>> - AVND_ERR_SRC src; /* err-src */ >>> + OSAF_ERR_SRC src; /* err-src */ >>> union { >>> uint32_t raw; >>> AVSV_ERR_RCVR avsv_ext; >>> >>> --------------------------------------------------------------------- >>> - >>> -------- LIMITED TIME SALE - Full Year of Microsoft Training For Just >>> $49.99! >>> 1,500+ hours of tutorials including VisualStudio 2012, Windows 8, >>> SharePoint 2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power >>> Pack includes Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends >>> 9/20/13. >>> http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg. >>> c lktrk _______________________________________________ >>> Opensaf-devel mailing list >>> [email protected] >>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>> >>> --------------------------------------------------------------------- >>> - >>> -------- LIMITED TIME SALE - Full Year of Microsoft Training For Just >>> $49.99! >>> 1,500+ hours of tutorials including VisualStudio 2012, Windows 8, >>> SharePoint 2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library >>> Power Pack includes Mobile, Cloud, Java, and UX Design. Lowest price ever! >>> Ends 9/20/13. >>> http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg. >>> c lktrk _______________________________________________ >>> Opensaf-devel mailing list >>> [email protected] >>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>> >>> >> >> >> > > ------------------------------------------------------------------------------ LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99! 1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint 2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
