osaf/services/saf/immsv/immnd/ImmModel.cc | 322 +++++++++++++++++++++++++++++- osaf/services/saf/immsv/immnd/ImmModel.hh | 5 +- 2 files changed, 324 insertions(+), 3 deletions(-)
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -1154,6 +1154,13 @@ immModel_protocol50Allowed(IMMND_CB *cb) SA_TRUE : SA_FALSE; } +SaBoolT +immModel_protocol51Allowed(IMMND_CB *cb) +{ + return (ImmModel::instance(&cb->immModel)->protocol51Allowed()) ? + SA_TRUE : SA_FALSE; +} + OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB *cb) { @@ -3271,6 +3278,21 @@ ImmModel::classCreate(const ImmsvOmClass return SA_AIS_ERR_INVALID_PARAM; } + ObjectMap::iterator oit = sObjectMap.find(immObjectDn); + if(protocol51Allowed() && oit != sObjectMap.end() && !isLoading ){ + std::string immMaxClasses(OPENSAF_IMMSV_MAX_CLASSES); + ObjectInfo* immObject = oit->second; + ImmAttrValueMap::iterator avi = immObject->mAttrValueMap.find(immMaxClasses); + osafassert(avi != immObject->mAttrValueMap.end()); + osafassert(!(avi->second->isMultiValued())); + ImmAttrValue* valuep = avi->second; + unsigned int maxClasses = valuep->getValue_int(); + if( sClassMap.size() >= maxClasses){ + LOG_NO("ERR_NO_RESOURCES: maximum class limit %d has been reched for the cluster", + maxClasses); + return SA_AIS_ERR_NO_RESOURCES; + } + } ClassMap::iterator i = sClassMap.find(className); if (i == sClassMap.end()) { /* Class-name is unique case-sensitive. @@ -3597,6 +3619,8 @@ ImmModel::classCreate(const ImmsvOmClass } } + + if(illegal) { if(err == SA_AIS_OK) { LOG_NO("ERR_INVALID_PARAM: Problem with new class '%s'", className.c_str()); @@ -3966,6 +3990,34 @@ ImmModel::protocol50Allowed() return noStdFlags & OPENSAF_IMM_FLAG_PRT50_ALLOW; } + +bool +ImmModel::protocol51Allowed() +{ + //TRACE_ENTER(); + /* Assume that all nodes are running the same version when loading */ + if (sImmNodeState == IMM_NODE_LOADING) { + return true; + } + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); + if(oi == sObjectMap.end()) { + TRACE_LEAVE(); + return false; + } + + ObjectInfo* immObject = oi->second; + ImmAttrValueMap::iterator avi = + immObject->mAttrValueMap.find(immAttrNostFlags); + osafassert(avi != immObject->mAttrValueMap.end()); + osafassert(!(avi->second->isMultiValued())); + ImmAttrValue* valuep = avi->second; + unsigned int noStdFlags = valuep->getValue_int(); + + //TRACE_LEAVE(); + return noStdFlags & OPENSAF_IMM_FLAG_PRT51_ALLOW; +} + + bool ImmModel::protocol41Allowed() { @@ -4114,6 +4166,44 @@ ImmModel::verifySchemaChange(const std:: verifyFailed = notCompatibleAtt(className, newClassInfo, attName, NULL, newAttr, NULL) || verifyFailed; newAttrs[inew->first] = newAttr; + if(!verifyFailed && (className == immClassName)){ + unsigned int val; + if ( attName == OPENSAF_IMMSV_MAX_CLASSES) { + val = newAttr->mDefaultValue.getValue_int(); + if( sClassMap.size() > val){ + LOG_NO("The Number of classes in the cluster %lu greater than the schema change" + "value %d", sClassMap.size(), val); + verifyFailed = true; + } + } + + if ( !verifyFailed && attName == OPENSAF_IMMSV_MAX_IMPLEMENTERS) { + val = newAttr->mDefaultValue.getValue_int(); + if( sImplementerVector.size() > val){ + LOG_NO("The Number of Implementers in the cluster %lu greater than the schema change" + "value %d", sImplementerVector.size(), val); + verifyFailed = true; + } + } + + if ( !verifyFailed && attName == OPENSAF_IMMSV_MAX_ADMINOWNERS) { + val = newAttr->mDefaultValue.getValue_int(); + if( sOwnerVector.size() > val){ + LOG_NO("The Number of AdminOwners in the cluster %lu greater than the schema change" + "value %d", sOwnerVector.size(), val); + verifyFailed = true; + } + } + + if ( !verifyFailed && attName == OPENSAF_IMMSV_MAX_CCBS) { + val = newAttr->mDefaultValue.getValue_int(); + if( sCcbVector.size() > val){ + LOG_NO("The Number of Ccbs in the cluster %lu greater than the schema change" + "value %d", sCcbVector.size(), val); + verifyFailed = true; + } + } + } } else { TRACE_5("Existing attribute %s", attName.c_str()); verifyFailed = notCompatibleAtt(className, newClassInfo, attName, iold->second, newAttr, @@ -4799,6 +4889,8 @@ ImmModel::adminOwnerCreate(const ImmsvOm unsigned int nodeId) { SaAisErrorT err = SA_AIS_OK; + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); + TRACE_ENTER(); if(immNotWritable()) { TRACE_LEAVE(); @@ -4812,7 +4904,24 @@ ImmModel::adminOwnerCreate(const ImmsvOm return SA_AIS_ERR_INVALID_PARAM; } } - + + ObjectMap::iterator oi = sObjectMap.find(immObjectDn ); + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading ){ + std::string immMaxAdmOwn(OPENSAF_IMMSV_MAX_ADMINOWNERS); + ObjectInfo* immObject = oi->second; + ImmAttrValueMap::iterator avi = immObject->mAttrValueMap.find(immMaxAdmOwn); + osafassert(avi != immObject->mAttrValueMap.end()); + osafassert(!(avi->second->isMultiValued())); + ImmAttrValue* valuep = avi->second; + unsigned int maxAdmOwn= valuep->getValue_int(); + if( sOwnerVector.size() >= maxAdmOwn ){ + LOG_NO("ERR_NO_RESOURCES: maximum AdminOwners limit %d has been reached for the cluster", + maxAdmOwn); + TRACE_LEAVE(); + return SA_AIS_ERR_NO_RESOURCES; + } + } + AdminOwnerInfo* info = new AdminOwnerInfo; info->mId = ownerId; @@ -4899,6 +5008,15 @@ ImmModel::adminOwnerDelete(SaUint32T own immObject->mAttrValueMap.find(immAttrNostFlags); osafassert(avi != immObject->mAttrValueMap.end()); osafassert(!(avi->second->isMultiValued())); + ImmAttrValueMap::iterator avi1 = + immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); + ImmAttrValueMap::iterator avi2 = + immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); + ImmAttrValueMap::iterator avi3 = + immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); + ImmAttrValueMap::iterator avi4 = + immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); + ImmAttrValue* valuep = (ImmAttrValue *) avi->second; unsigned int noStdFlags = valuep->getValue_int(); noStdFlags |= OPENSAF_IMM_FLAG_PRT41_ALLOW; @@ -4907,6 +5025,16 @@ ImmModel::adminOwnerDelete(SaUint32T own noStdFlags |= OPENSAF_IMM_FLAG_PRT46_ALLOW; noStdFlags |= OPENSAF_IMM_FLAG_PRT47_ALLOW; noStdFlags |= OPENSAF_IMM_FLAG_PRT50_ALLOW; + if( (avi1 == immObject->mAttrValueMap.end()) || + (avi2 == immObject->mAttrValueMap.end()) || + (avi3 == immObject->mAttrValueMap.end()) || + (avi4 == immObject->mAttrValueMap.end())){ + LOG_NO("protcol51 is not set for opensafImmNostdFlags because" + "The new OpenSAF 5.1 attributes are not added to OpensafImm class"); + } else { + + noStdFlags |= OPENSAF_IMM_FLAG_PRT51_ALLOW; + } valuep->setValue_int(noStdFlags); LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(), noStdFlags); /* END Temporary code. */ @@ -5174,12 +5302,31 @@ ImmModel::ccbCreate(SaUint32T adminOwner SaUint32T originatingConn) { SaAisErrorT err = SA_AIS_OK; + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); + TRACE_ENTER(); if(immNotWritable()) { TRACE_LEAVE(); return SA_AIS_ERR_TRY_AGAIN; } + + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading){ + std::string immMaxCcbs(OPENSAF_IMMSV_MAX_CCBS); + ObjectInfo* immObject = oi->second; + ImmAttrValueMap::iterator avi = immObject->mAttrValueMap.find(immMaxCcbs); + osafassert(avi != immObject->mAttrValueMap.end()); + osafassert(!(avi->second->isMultiValued())); + ImmAttrValue* valuep = avi->second; + unsigned int maxCcbs= valuep->getValue_int(); + if (sCcbVector.size() >= maxCcbs){ + LOG_NO("ERR_NO_RESOURCES: maximum Ccbs limit %d has been reached for the cluster", + maxCcbs); + TRACE_LEAVE(); + return SA_AIS_ERR_NO_RESOURCES; + } + } CcbInfo* info = new CcbInfo; info->mId = ccbId; @@ -7422,6 +7569,78 @@ ImmModel::getAllWritableAttributes(const return result; } +SaAisErrorT ImmModel::verifyImmLimits(ObjectInfo* object, + std::string objectName){ + + SaAisErrorT err = SA_AIS_OK; + SaUint32T val; + + TRACE_ENTER(); + osafassert(objectName == immObjectDn); + ImmAttrValueMap::iterator class_avmi = object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); + if( class_avmi != object->mAttrValueMap.end()){ + osafassert(class_avmi->second); + val = (SaUint32T)class_avmi->second->getValue_int(); + } else { + val = IMMSV_MAX_CLASSES; + } + if(sClassMap.size() > val){ + LOG_NO("ERR_NO_RESOURCES: maximum class limit %d has been reched for the cluster", + val); + err = SA_AIS_ERR_NO_RESOURCES; + TRACE_LEAVE(); + return err; + } + + ImmAttrValueMap::iterator impl_avmi = object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); + if( impl_avmi != object->mAttrValueMap.end()){ + osafassert(impl_avmi->second); + val = (SaUint32T)impl_avmi->second->getValue_int(); + } else { + val = IMMSV_MAX_IMPLEMENTERS; + } + if(sImplementerVector.size() > val){ + LOG_NO("ERR_NO_RESOURCES: maximum implementers limit %d has been reched for the cluster", + val); + err = SA_AIS_ERR_NO_RESOURCES; + TRACE_LEAVE(); + return err; + } + + ImmAttrValueMap::iterator admi_avmi = object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); + if( admi_avmi != object->mAttrValueMap.end()){ + osafassert(admi_avmi->second); + val = (SaUint32T)admi_avmi->second->getValue_int(); + } else { + val = IMMSV_MAX_ADMINOWNERS; + } + if(sOwnerVector.size() > val){ + LOG_NO("ERR_NO_RESOURCES: maximum adminownerslimit %d has been reched for the cluster", + val); + err = SA_AIS_ERR_NO_RESOURCES; + TRACE_LEAVE(); + return err; + } + + ImmAttrValueMap::iterator ccb_avmi = object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); + if( ccb_avmi != object->mAttrValueMap.end()){ + osafassert(ccb_avmi->second); + val = (SaUint32T)ccb_avmi->second->getValue_int(); + } else { + val = IMMSV_MAX_CCBS; + } + if(sCcbVector.size() > val){ + LOG_NO("ERR_NO_RESOURCES: maximum ccbs limit %d has been reched for the cluster", + val); + err = SA_AIS_ERR_NO_RESOURCES; + TRACE_LEAVE(); + return err; + } + + TRACE_LEAVE(); + return err; +} + /** * Creates an object */ @@ -8342,6 +8561,8 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im */ sIsLongDnLoaded = true; } + err = verifyImmLimits(object, immObjectDn); + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Verifying of immLimits failed"); } else { setCcbErrorString(ccb, "IMM: ERR_BAD_OPERATION: Imm not allowing creates of instances of class '%s'", @@ -9380,6 +9601,83 @@ ImmModel::ccbObjectModify(const ImmsvOmC } } + /* From OpenSAF 5.1 immObjectDn has added with attributes maxClasses, maxImplementers, + maxAdminowners and maxCcbs */ + + + ImmAttrValueMap::iterator class_avmi = afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); + ImmAttrValueMap::iterator impl_avmi = afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); + ImmAttrValueMap::iterator admi_avmi = afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); + ImmAttrValueMap::iterator ccb_avmi = afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); + + if ( !protocol51Allowed() && class_avmi != afim->mAttrValueMap.end()) { + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. The cluster is not yet upgraded" + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_CLASSES); + err = SA_AIS_ERR_NOT_EXIST; + goto bypass_impl; + } else if(class_avmi != afim->mAttrValueMap.end()) { + osafassert(class_avmi->second); + SaUint32T val = (SaUint32T)class_avmi->second->getValue_int(); + if(val < IMMSV_MAX_CLASSES){ + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the minimum supported value %d for" + "the attribute %s", val,IMMSV_MAX_CLASSES, OPENSAF_IMMSV_MAX_CLASSES); + err = SA_AIS_ERR_BAD_OPERATION; + goto bypass_impl; + } + } + + if ( !protocol51Allowed() && impl_avmi != afim->mAttrValueMap.end()) { + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. The cluster is not yet upgraded" + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_IMPLEMENTERS); + err = SA_AIS_ERR_NOT_EXIST; + goto bypass_impl; + + } else if(class_avmi != afim->mAttrValueMap.end()) { + osafassert(impl_avmi->second); + SaUint32T val = (SaUint32T)impl_avmi->second->getValue_int(); + if(val < IMMSV_MAX_IMPLEMENTERS){ + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the minimum supported value %d for" + "the attribute %s", val, IMMSV_MAX_IMPLEMENTERS, OPENSAF_IMMSV_MAX_IMPLEMENTERS); + err = SA_AIS_ERR_BAD_OPERATION; + goto bypass_impl; + } + } + + if ( !protocol51Allowed() && admi_avmi != afim->mAttrValueMap.end()) { + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. The cluster is not yet upgraded" + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_ADMINOWNERS); + err = SA_AIS_ERR_NOT_EXIST; + goto bypass_impl; + + } else if(admi_avmi != afim->mAttrValueMap.end()) { + osafassert(admi_avmi->second); + SaUint32T val = (SaUint32T)admi_avmi->second->getValue_int(); + if(val < IMMSV_MAX_ADMINOWNERS){ + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the minimum supported value %d for" + "the attribute %s", val, IMMSV_MAX_ADMINOWNERS, OPENSAF_IMMSV_MAX_ADMINOWNERS); + err = SA_AIS_ERR_BAD_OPERATION; + goto bypass_impl; + } + } + + if ( !protocol51Allowed() && ccb_avmi != afim->mAttrValueMap.end()) { + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. The cluster is not yet upgraded" + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_CCBS); + err = SA_AIS_ERR_NOT_EXIST; + goto bypass_impl; + + } else if(ccb_avmi != afim->mAttrValueMap.end()) { + osafassert(ccb_avmi->second); + SaUint32T val = (SaUint32T)ccb_avmi->second->getValue_int(); + if(val < IMMSV_MAX_CCBS){ + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the minimum supported value %d for" + "the attribute %s", val, IMMSV_MAX_CCBS, OPENSAF_IMMSV_MAX_CCBS); + err = SA_AIS_ERR_BAD_OPERATION; + goto bypass_impl; + } + } + + /* Pre validate any changes. More efficent here than in apply/completed and we need to guard against race on long DN creation allowed. Such long DNs are themselves created in CCBs or RTO creates. @@ -13972,6 +14270,8 @@ ImmModel::implementerSet(const IMMSV_OCT { SaAisErrorT err = SA_AIS_OK; CcbVector::iterator i; + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); + TRACE_ENTER(); *discardImplementer = SA_FALSE; @@ -13997,7 +14297,25 @@ ImmModel::implementerSet(const IMMSV_OCT return err; //This return code not formally allowed here according to IMM standard. } - + + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading){ + std::string immMaxImp(OPENSAF_IMMSV_MAX_IMPLEMENTERS); + ObjectInfo* immObject = oi->second; + ImmAttrValueMap::iterator avi = immObject->mAttrValueMap.find(immMaxImp); + osafassert(avi != immObject->mAttrValueMap.end()); + osafassert(!(avi->second->isMultiValued())); + ImmAttrValue* valuep = avi->second; + unsigned int maxImp = valuep->getValue_int(); + if( sImplementerVector.size() >= maxImp){ + LOG_NO("ERR_NO_RESOURCES: maximum Implementers limit %d has been reached for the cluster", + maxImp); + TRACE_LEAVE(); + return SA_AIS_ERR_NO_RESOURCES; + } + } + + bool isApplier = (implName.at(0) == '@'); ImplementerInfo* info = findImplementer(implName); diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh b/osaf/services/saf/immsv/immnd/ImmModel.hh --- a/osaf/services/saf/immsv/immnd/ImmModel.hh +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh @@ -116,6 +116,7 @@ public: bool protocol46Allowed(); bool protocol47Allowed(); bool protocol50Allowed(); + bool protocol51Allowed(); bool oneSafe2PBEAllowed(); bool purgeSyncRequest(SaUint32T clientId); bool verifySchemaChange(const std::string& className, @@ -661,7 +662,9 @@ public: ObjectInfo* obj, AdminOwnerInfo* adm, bool doIt); - + SaAisErrorT verifyImmLimits( + ObjectInfo* object, + std::string objectName); private: bool checkSubLevel( ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports.http://sdm.link/zohodev2dev _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel