>>> Gets a bit long, how about init_clc_cli_attributes? Ok. -Nagu
> -----Original Message----- > From: Hans Feldt [mailto:hans.fe...@ericsson.com] > Sent: 04 February 2014 13:15 > To: Nagendra Kumar > Cc: opensaf-devel@lists.sourceforge.net > Subject: Re: [devel] [PATCH 2 of 2] amfnd: ignore saAmfCtSwBundle when > abspath in CLC-CLI cmds [#662] > > > On 02/04/2014 08:23 AM, Nagendra Kumar wrote: > > Ack with comments. > > > > 1. Please change name of init_clc_cli_commands to > init_clc_cli_commands_and_timeouts. > > Gets a bit long, how about init_clc_cli_attributes? > > > 2. If I am configuring saAmfCtRelPathInstantiateCmd with relative > > patch (/opt/amf_demo) and also configure > ^^^^^^^^^^^^^^ > you mean abspath? > > saAmfCtSwBundle, then it is only taking saAmfCtRelPathInstantiateCmd. This > need to be documented. > > yes the AMF PR needs more updates, I plan to take a stab at it. > > Thanks, > Hans > > > > > Thanks -Nagu > > > >> -----Original Message----- From: Hans Feldt > >> [mailto:osafde...@gmail.com] Sent: 28 January 2014 19:11 To: Nagendra > >> Kumar Cc: opensaf-devel@lists.sourceforge.net Subject: [PATCH 2 of 2] > >> amfnd: ignore saAmfCtSwBundle when abspath in > >> CLC- CLI cmds [#662] > >> > >> osaf/services/saf/amf/amfnd/compdb.cc | 290 > >> ++++++++++++-------------------- - 1 files changed, 108 > >> insertions(+), > >> 182 deletions(-) > >> > >> > >> diff --git a/osaf/services/saf/amf/amfnd/compdb.cc > >> b/osaf/services/saf/amf/amfnd/compdb.cc --- > >> a/osaf/services/saf/amf/amfnd/compdb.cc +++ > >> b/osaf/services/saf/amf/amfnd/compdb.cc @@ -956,10 +956,10 @@ static > >> amf_comp_type_t *avnd_comptype_cr if > >> (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtCompCategory"), > >> attributes, 0, &compt->saAmfCtCompCategory) != SA_AIS_OK) > >> osafassert(0); > >> > >> - if (IS_COMP_LOCAL(compt->saAmfCtCompCategory) && - > >> immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtSwBundle"), > attributes, 0, &compt->saAmfCtSwBundle) != > >> SA_AIS_OK) { - osafassert(0); - return NULL; + > >> if > (IS_COMP_LOCAL(compt->saAmfCtCompCategory)) { + // Ignore if > >> bundle not found, commands can be absolute path + > >> immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtSwBundle"), + > >> attributes, 0, &compt->saAmfCtSwBundle); } > >> > >> > >> > immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCtDefCm > >> dEnv"), attributes, &j); @@ -1170,170 > >> +1170,145 @@ done: } > >> > >> /** - * Initialize the bundle dependent attributes in comp (the - * > >> CLC-CLI commands). - * - * If path in comptype for AM & HC scripts is > >> absolute it is - * used, else (it is relative) it is prepended with > >> path prefix. + * Initializes a single CLC-CLI command for a > >> component. + * + * If path in comptype is absolute it is used, else > >> (it is relative) it is + * prepended with path prefix. + * + * @param > >> cmd + * @param clc_cmd + * @param type_cmd_argv + > >> * @param path_prefix + * @param attributes + * @param attr_name + */ > +static void > >> init_clc_cli_command(AVND_COMP_CLC_CMD_PARAM *cmd, const char > *clc_cmd, + char **clc_cmd_argv, const char > >> *path_prefix, + const SaImmAttrValuesT_2 **attributes, + > const char *attr_name) +{ + char *buf = cmd->cmd; + > int > >> i, j; + const char *argv; + + // prepend with path prefix (from > saAmfNodeSwBundlePathPrefix) if needed + if > >> (clc_cmd[0] == '/') + i = snprintf(buf, sizeof(cmd->cmd), > >> "%s", > clc_cmd); + else + i = snprintf(buf, > >> sizeof(cmd->cmd), "%s/%s", path_prefix, clc_cmd); + + // append > argv from comp type + j = 0; + while ((argv = > >> clc_cmd_argv[j++]) != NULL) + i += snprintf(&buf[i], > sizeof(cmd->cmd) - i, " %s", argv); + + // append argv from > >> comp instance + j = 0; + while ((argv = > immutil_getStringAttr(attributes, attr_name, j++)) != NULL) + i += > >> snprintf(&buf[i], sizeof(cmd->cmd) - i, " %s", argv); + + cmd->len = i; > + + /* Check for truncation, should alloc > >> these strings dynamically instead */ + osafassert((cmd->len > 0) && > >> (cmd- > >len < sizeof(cmd->cmd))); + > >> TRACE("cmd=%s", cmd->cmd); +} + +/** + * Initializes the CLC-CLI > >> commands for a component. * * @param comp * @param comptype * > @param > >> path_prefix * @param attributes */ -static void > >> init_bundle_dependent_attributes(AVND_COMP > >> *comp, +static void init_clc_cli_commands(AVND_COMP *comp, const > amf_comp_type_t *comptype, const char > >> *path_prefix, const SaImmAttrValuesT_2 **attributes) { - int i, j; > AVND_COMP_CLC_CMD_PARAM *cmd; - const char > >> *argv; + TRACE_ENTER(); > >> > >> cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_INSTANTIATE - 1]; > >> if (comptype->saAmfCtRelPathInstantiateCmd != NULL) { - i = 0; > - i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - > >> i, "%s/%s", - path_prefix, comptype- > >>> saAmfCtRelPathInstantiateCmd); > >> + init_clc_cli_command(cmd, comptype- > >>> saAmfCtRelPathInstantiateCmd, > >> + comptype->saAmfCtDefInstantiateCmdArgv, > path_prefix, + attributes, > "saAmfCompInstantiateCmdArgv"); + } > >> > >> - j = 0; - while ((argv = comptype- > >>> saAmfCtDefInstantiateCmdArgv[j++]) != NULL) > >> - i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " > %s", argv); - - j = 0; - while ((argv = > >> immutil_getStringAttr(attributes, "saAmfCompInstantiateCmdArgv", j++)) != > NULL) - i += snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - cmd->len = i; - - > >> /* > Check for truncation, should alloc these strings > >> dynamically instead */ - osafassert((cmd->len > 0) && (cmd- > >len < sizeof(cmd->cmd))); - TRACE("cmd=%s", > >> cmd->cmd); + if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompInstantiateTimeo > ut"), + attributes, 0, > >> &cmd->timeout) != SA_AIS_OK) { + cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; + comp->pxied_inst_cbk_timeout > >> = comptype- > >>> saAmfCtDefCallbackTimeout; > >> + } else { + comp->pxied_inst_cbk_timeout = cmd- > >timeout; } > >> > >> cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1]; > >> if (comptype->saAmfCtRelPathTerminateCmd != NULL) { - i = 0; > - i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, > >> "%s/%s", - path_prefix, comptype- > >>> saAmfCtRelPathTerminateCmd); > >> + init_clc_cli_command(cmd, comptype- > >>> saAmfCtRelPathTerminateCmd, > >> + comptype->saAmfCtDefTerminateCmdArgv, > path_prefix, + attributes, > "saAmfCompTerminateCmdArgv"); + } > >> > >> - j = 0; - while ((argv = comptype- > >saAmfCtDefTerminateCmdArgv[j++]) != NULL) - i += > snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - j = 0; - > >> while ((argv = > immutil_getStringAttr(attributes, > >> "saAmfCompTerminateCmdArgv", j++)) != NULL) - i += > snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " %s", argv); - - > >> cmd->len = i; - - /* Check for truncation, should alloc these > strings dynamically instead */ - > >> osafassert((cmd->len > 0) && (cmd->len < sizeof(cmd->cmd))); - > TRACE("cmd=%s", cmd->cmd); + if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompTerminateTimeo > ut"), + attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { + if > (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) { + > cmd->timeout = comptype- > >>> saAmfCtDefCallbackTimeout; > >> + comp->term_cbk_timeout = cmd->timeout; + > } + else + cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; } > >> > >> cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_CLEANUP - 1]; > >> if (comptype->saAmfCtRelPathCleanupCmd != NULL) { - i = 0; > - i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, > >> "%s/%s", - path_prefix, comptype- > >saAmfCtRelPathCleanupCmd); + init_clc_cli_command(cmd, > comptype- > >>> saAmfCtRelPathCleanupCmd, > >> + comptype->saAmfCtDefCleanupCmdArgv, > path_prefix, + attributes, > "saAmfCompCleanupCmdArgv"); + } > >> > >> - j = 0; - while ((argv = comptype- > >saAmfCtDefCleanupCmdArgv[j++]) != NULL) - i += > snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - j = 0; - > >> while ((argv = > immutil_getStringAttr(attributes, > >> "saAmfCompCleanupCmdArgv", j++)) != NULL) - i += > snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " %s", argv); - - > >> cmd->len = i; - - /* Check for truncation, should alloc these > strings dynamically instead */ - > >> osafassert((cmd->len > 0) && (cmd->len < sizeof(cmd->cmd))); - > TRACE("cmd=%s", cmd->cmd); + if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompCleanupTimeout" > ), + attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { + cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; + comp->pxied_clean_cbk_timeout = > comptype- > >>> saAmfCtDefCallbackTimeout; > >> + } else { + comp->pxied_clean_cbk_timeout = cmd- > >timeout; } > >> > >> cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTART - 1]; > >> if (comptype->saAmfCtRelPathAmStartCmd != NULL) { - i = 0; > + init_clc_cli_command(cmd, comptype- > >>> saAmfCtRelPathAmStartCmd, > >> + comptype->saAmfCtDefAmStartCmdArgv, > path_prefix, + attributes, > "saAmfCompAmStartCmdArgv"); + > >> comp->is_am_en = true; + } > >> > >> - if (comptype->saAmfCtRelPathAmStartCmd[0] == '/') - > i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, "%s", - > >> comptype->saAmfCtRelPathAmStartCmd); - else - > i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, "%s/%s", - > >> path_prefix, comptype- > >>> saAmfCtRelPathAmStartCmd); > >> - - j = 0; - while ((argv = comptype- > >saAmfCtDefAmStartCmdArgv[j++]) != NULL) - i += > snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - j = 0; - > >> while ((argv = > immutil_getStringAttr(attributes, > >> "saAmfCompAmStartCmdArgv", j++)) != NULL) - i += > snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " %s", argv); - - > >> cmd->len = i; - - comp->is_am_en = true; - - /* > Check for truncation, should alloc these strings dynamically > >> instead */ - osafassert((cmd->len > 0) && (cmd->len < > >> sizeof(cmd- > >cmd))); - TRACE("cmd=%s", cmd->cmd); + if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompAmStartTimeout > "), + attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { + cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; } > >> > >> cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTOP - 1]; > >> if (comptype->saAmfCtRelPathAmStopCmd != NULL) { - i = 0; > + init_clc_cli_command(cmd, comptype- > >>> saAmfCtRelPathAmStopCmd, > >> + comptype->saAmfCtDefAmStopCmdArgv, > path_prefix, + attributes, > "saAmfCompAmStopCmdArgv"); + } > >> > >> - if (comptype->saAmfCtRelPathAmStopCmd[0] == '/') - > i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, "%s", - > >> comptype->saAmfCtRelPathAmStopCmd); - else - > i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, "%s/%s", - > >> path_prefix, comptype- > >>> saAmfCtRelPathAmStopCmd); > >> - - j = 0; - while ((argv = comptype- > >saAmfCtDefAmStopCmdArgv[j++]) != NULL) - i += > snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - j = 0; - > >> while ((argv = > immutil_getStringAttr(attributes, > >> "saAmfCompAmStopCmdArgv", j++)) != NULL) - i += > snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " %s", argv); - - > >> cmd->len = i; - - /* Check for truncation, should alloc these > strings dynamically instead */ - > >> osafassert((cmd->len > 0) && (cmd->len < sizeof(cmd->cmd))); - > TRACE("cmd=%s", cmd->cmd); + if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompAmStopTimeout" > ), + attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { + cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; } > >> > >> cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_HC - 1]; if > (comptype->osafAmfCtRelPathHcCmd != NULL) { - i = > >> 0; - - if (comptype->osafAmfCtRelPathHcCmd[0] == '/') - > i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, "%s", > >> - comptype->osafAmfCtRelPathHcCmd); - > else - i += snprintf(&cmd->cmd[i], sizeof(cmd->cmd) > - i, "%s/%s", - > >> path_prefix, comptype- > >>> osafAmfCtRelPathHcCmd); > >> - - j = 0; - while ((argv = comptype- > >osafAmfCtDefHcCmdArgv[j++]) != NULL) - i += > snprintf(&cmd->cmd[i], > >> sizeof(cmd->cmd) - i, " %s", argv); - - j = 0; - > >> while ((argv = > immutil_getStringAttr(attributes, > >> "osafAmfCompHcCmdArgv", j++)) != NULL) - i += > snprintf(&cmd->cmd[i], sizeof(cmd->cmd) - i, " %s", argv); - - > >> cmd->len = i; - + init_clc_cli_command(cmd, comptype- > >>> osafAmfCtRelPathHcCmd, > >> + comptype->osafAmfCtDefHcCmdArgv, > path_prefix, + attributes, > "osafAmfCompHcCmdArgv"); > >> comp->is_hc_cmd_configured = true; - - /* Check for > truncation, should alloc these strings dynamically instead */ > >> - osafassert((cmd->len > 0) && (cmd->len < sizeof(cmd->cmd))); > - TRACE("cmd=%s", cmd->cmd); } > >> > >> TRACE_LEAVE(); @@ -1344,16 +1319,12 @@ static void > >> init_bundle_dependent_attrib * * @param comp * @param attributes - * > >> @param bundle_missing_is_error if true skip further initialization and > >> return > error code. - * if false continue initialization to get most attributes > correct. * * > @return int */ -static int comp_init(AVND_COMP > >> *comp, const SaImmAttrValuesT_2 **attributes, - bool > bundle_missing_is_error) +static int comp_init(AVND_COMP > >> *comp, const SaImmAttrValuesT_2 **attributes) { int res = -1; - > AVND_COMP_CLC_CMD_PARAM *cmd; amf_comp_type_t > >> *comptype; SaNameT nodeswbundle_name; SaBoolT disable_restart; @@ > >> -1380,30 +1351,11 @@ static int comp_init(AVND_COMP *comp, co > >> avsv_create_association_class_dn(&comptype->saAmfCtSwBundle, > >> &avnd_cb->amf_nodeName, "safInstalledSwBundle", > &nodeswbundle_name); > >> > >> - res = get_string_attr_from_imm(immOmHandle, > const_cast<SaImmAttrNameT>("saAmfNodeSwBundlePathPrefix"), + (void) > >> get_string_attr_from_imm(immOmHandle, + > >> const_cast<SaImmAttrNameT>("saAmfNodeSwBundlePathPrefix"), > >> &nodeswbundle_name, &path_prefix); > >> > >> - if (res == 0) { - init_bundle_dependent_attributes(comp, > comptype, path_prefix, attributes); - } else { - if > >> (bundle_missing_is_error) { - LOG_NO("%s: '%s'", > __FUNCTION__, comp- > >>> name.value); > >> - LOG_ER("%s: FAILED to read '%s'", __FUNCTION__, > nodeswbundle_name.value); - goto done; - } else > { - > >> TRACE("%s is missing, will refresh attributes later", > nodeswbundle_name.value); - /* Continue initialization to > >> get the correct type set. Especially - * > >> pre-instantiable or > not is important when instantion request comes. */ > >> - } - } - - cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_INSTANTIATE - 1]; > >> - if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompInstantiateTimeo > ut"), attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { - cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; - comp->pxied_inst_cbk_timeout = > comptype- > >>> saAmfCtDefCallbackTimeout; > >> - } else { - comp->pxied_inst_cbk_timeout = cmd->timeout; - > } + init_clc_cli_commands(comp, comptype, path_prefix, > >> attributes); > >> > >> if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompInstantiationLe > >> ve l"), attributes, 0, &comp->inst_level) != SA_AIS_OK) > >> comp->inst_level = comptype->saAmfCtDefInstantiationLevel; @@ > >> -1423,26 +1375,10 @@ static int comp_init(AVND_COMP *comp, co > >> comp->inst_retry_delay = > >> comp_global_attrs.saAmfDelayBetweenInstantiateAttempts; > >> #endif > >> > >> - cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_CLEANUP - 1]; > >> - if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompCleanupTimeout" > ), attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { - cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; - comp->pxied_clean_cbk_timeout = > comptype- > >>> saAmfCtDefCallbackTimeout; > >> - } else { - comp->pxied_clean_cbk_timeout = cmd->timeout; - > } - - cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTART - 1]; > >> - if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompAmStartTimeout > "), attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) - cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; - if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompNumMaxAmStart > >> Attempts"), attributes, 0, > >> &comp->clc_info.am_start_retry_max) != SA_AIS_OK) > >> comp->clc_info.am_start_retry_max = > >> comp_global_attrs.saAmfNumMaxAmStartAttempts; > >> > >> - cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTOP - 1]; > >> - if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompAmStopTimeout" > ), attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) - cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; - if > >> > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompNumMaxAmStop > >> Attempts"), attributes, 0, &comp- > >>> clc_info.saAmfCompNumMaxAmStopAttempts) != SA_AIS_OK) > >> comp->clc_info.saAmfCompNumMaxAmStopAttempts = > >> comp->comp_global_attrs.saAmfNumMaxAmStopAttempts; @@ -1476,16 > >> comp->+1412,6 @@ > >> static int comp_init(AVND_COMP *comp, co > >> > >> init_comp_category(comp, comptype->saAmfCtCompCategory); > >> > >> - cmd = &comp- > >>> clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1]; > >> - if > (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompTerminateTimeo > ut"), attributes, 0, &cmd->timeout) != > >> SA_AIS_OK) { - if > (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) { - cmd- > >timeout = comptype- > >>> saAmfCtDefCallbackTimeout; > >> - comp->term_cbk_timeout = cmd->timeout; - > } - else - cmd->timeout = comptype- > >saAmfCtDefClcCliTimeout; - } > >> - if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) > >> m_AVND_COMP_OPER_STATE_SET(comp, > SA_AMF_OPERATIONAL_DISABLED); else > >> @@ -1598,7 +1524,7 @@ static AVND_COMP *avnd_comp_create(const > error > >> = immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompType"), > >> attributes, 0, &comp->saAmfCompType); osafassert(error == SA_AIS_OK); > >> > >> - if (comp_init(comp, attributes, false) != 0) + if (comp_init(comp, > attributes) != 0) goto done; > >> > >> /* create the association with hdl-mngr */ @@ -1776,7 +1702,7 @@ int > >> avnd_comp_config_reinit(AVND_COMP *c goto done2; } > >> > >> - res = comp_init(comp, attributes, true); + res = > comp_init(comp, attributes); if (res == 0) TRACE("'%s' > >> configuration reread from IMM", comp- > >>> name.value); > >> > > > > ---------------------------------------------------------------------- > > -------- Managing the Performance of Cloud-Based Applications Take > advantage of what the Cloud has to offer - Avoid Common Pitfalls. Read the > Whitepaper. > > http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg. > > clktrk _______________________________________________ Opensaf- > devel > > mailing list Opensaf-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/opensaf-devel > > > > ------------------------------------------------------------------------------ Managing the Performance of Cloud-Based Applications Take advantage of what the Cloud has to offer - Avoid Common Pitfalls. Read the Whitepaper. http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel