osaf/services/saf/amf/amfd/node.cc | 55 ++++++++++++++++++++++++++++++++++---
1 files changed, 50 insertions(+), 5 deletions(-)
allow node to be removed if it is also removed from all nodegroups
diff --git a/osaf/services/saf/amf/amfd/node.cc
b/osaf/services/saf/amf/amfd/node.cc
--- a/osaf/services/saf/amf/amfd/node.cc
+++ b/osaf/services/saf/amf/amfd/node.cc
@@ -415,6 +415,7 @@
AVD_SU *su;
bool su_exist = false;
CcbUtilOperationData_t *t_opData;
+ std::string node_name(Amf::to_string(&node->name));
TRACE_ENTER2("'%s'", opdata->objectName.value);
@@ -460,12 +461,56 @@
for (std::map<std::string, AVD_AMF_NG*>::const_iterator it =
nodegroup_db->begin();
it != nodegroup_db->end(); it++) {
AVD_AMF_NG *ng = it->second;
+
if (node_in_nodegroup(Amf::to_string(&(opdata->objectName)),
ng) == true) {
- report_ccb_validation_error(opdata, "'%s' exists in"
- " the nodegroup '%s'",
- opdata->objectName.value,
ng->name.value);
- rc = SA_AIS_ERR_BAD_OPERATION;
- goto done;
+ // if the node is being removed from nodegroup too,
then it's OK
+ TRACE("check if node is being deleted from nodegroup
'%s'", ng->name.value);
+ t_opData = ccbutil_getCcbOpDataByDN(opdata->ccbId,
&ng->name);
+
+ if (t_opData == NULL) {
+ TRACE("t_opData is NULL");
+ report_ccb_validation_error(opdata, "'%s'
exists in"
+ " the nodegroup '%s'",
+ opdata->objectName.value,
ng->name.value);
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ goto done;
+ }
+
+ const SaImmAttrModificationT_2 *mod = NULL;
+ int i = 0;
+ bool node_being_removed = false;
+
+ switch (t_opData->operationType) {
+ case CCBUTIL_DELETE:
+ // the nodegroup is being removed too
+ node_being_removed = true;
+ break;
+ case CCBUTIL_MODIFY:
+ while ((mod =
t_opData->param.modify.attrMods[i++]) != NULL &&
+ node_being_removed == false) {
+ if (mod->modType ==
SA_IMM_ATTR_VALUES_DELETE) {
+ for (unsigned j = 0; j <
mod->modAttr.attrValuesNumber; j++) {
+ if
(node_name.compare(Amf::to_string((SaNameT *)mod->modAttr.attrValues[j])) == 0)
{
+ // node is
being removed from nodegroup
+ TRACE("node %s
is being removed from %s", node_name.c_str(), ng->name.value);
+
node_being_removed = true;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (node_being_removed == false) {
+ report_ccb_validation_error(opdata, "'%s'
exists in"
+ " the nodegroup '%s'",
+ opdata->objectName.value,
ng->name.value);
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ goto done;
+ }
}
}
opdata->userData = node;
------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel