[devel] [PATCH 0/1] Review Request for imm: allow empty-value attribute with default-tag persisted [#2985] V2

2018-12-19 Thread Vu Minh Nguyen
Summary: imm: allow empty-value attribute with default-tag persisted [#2985] V2
Review request for Ticket(s): 2985
Peer Reviewer(s): Lennart, Hans, Gary
Pull request to: *** LIST THE PERSON WITH PUSH ACCESS HERE ***
Affected branch(es): develop
Development branch: ticket-2985
Base revision: 9ce47c5a79cc080d89d192bc1947ebd04aa0a122
Personal repository: git://git.code.sf.net/u/winhvu/review


Impacted area   Impact y/n

 Docsn
 Build systemn
 RPM/packaging   n
 Configuration files n
 Startup scripts n
 SAF servicesy
 OpenSAF servicesn
 Core libraries  n
 Samples n
 Tests   n
 Other   n

NOTE: Patch(es) contain lines longer than 80 characers

Comments (indicate scope for each "y" above):
-
*** EXPLAIN/COMMENT THE PATCH SERIES HERE ***

revision 39f46dd06f7705929c293d00b48443570b6af235
Author: Vu Minh Nguyen 
Date:   Wed, 19 Dec 2018 18:00:48 +0700

imm: allow empty-value attribute with default-tag persisted [#2985]

During runtime, when replacing value of an attribute which has default-value
tag with NULL, this NULL value is not persistent after cluster is rebooted -
NULL value will be automatically replaced with its default value by IMM.

This behavior causes several unexpected results. Below is a use case.

User defines an attribute with name `maxAge`. It is used to shows how many days
user passwords will be expired, default value is 30 days; if replacing with
a NULL/empty, it means the passwords will never get expired.

During runtime, user changes the existing value with NULL - expect the passwords
never get expired. Later on, then cluster is rebooted, that value is silently
replaced with the default without notice of user.

This patch makes some changes in immdump/immloader/imm om library/immnd
to make NULL value in such case persisted even after cluster is rebooted.



Complete diffstat:
--
 src/imm/README   | 10 +
 src/imm/agent/imma_om_api.cc |  7 ++-
 src/imm/immloadd/imm_loader.cc   | 23 ++
 src/imm/immloadd/imm_pbe_load.cc | 16 ---
 src/imm/immnd/ImmModel.cc|  9 +++-
 src/imm/tools/imm_xmlw_dump.cc   | 96 +---
 6 files changed, 100 insertions(+), 61 deletions(-)


Testing Commands:
-
1) Import TestClass.xml
immcfg -f TestClass.xml
2) Create an object of TestClass
immcfg -c TestClass testClass=0
3) Replace all attribute values of that object with empty
4) Dump whole IMM database, and overwrite existing imm.xml file
5) Restart cluster with new dump
6) Check the values of attributes that have been replaced with empty
6) Repeat the test with PBE enable.


Testing, Expected Results:
--
The values remains empty after cluster is rebooted.


Conditions of Submission:
-
Ack from peer reviewers


Arch  Built StartedLinux distro
---
mipsn  n
mips64  n  n
x86 n  n
x86_64  n  n
powerpc n  n
powerpc64   n  n


Reviewer Checklist:
---
[Submitters: make sure that your review doesn't trigger any checkmarks!]


Your checkin has not passed review because (see checked entries):

___ Your RR template is generally incomplete; it has too many blank entries
that need proper data filled in.

___ You have failed to nominate the proper persons for review and push.

___ Your patches do not have proper short+long header

___ You have grammar/spelling in your header that is unacceptable.

___ You have exceeded a sensible line length in your headers/comments/text.

___ You have failed to put in a proper Trac Ticket # into your commits.

___ You have incorrectly put/left internal data in your comments/files
(i.e. internal bug tracking tool IDs, product names etc)

___ You have not given any evidence of testing beyond basic build tests.
Demonstrate some level of runtime or other sanity testing.

___ You have ^M present in some of your files. These have to be removed.

___ You have needlessly changed whitespace or added whitespace crimes
like trailing spaces, or spaces before tabs.

___ You have mixed real technical changes with whitespace and other
cosmetic code cleanup changes. These have to be separate commits.

___ You need to refactor your submission into logical chunks; there is
too much content into a single commit.

___ You have extraneous garbage in your review (merge commits etc)

___ You have giant attachments which should never have been sent;
Instead you should place your content in a public tree to be pulled.

___ You have too many commits attached to an e-mail; resend as threaded
commits, or place in a public tree for a pull.

___ You have resent this 

[devel] [PATCH 1/1] imm: allow empty-value attribute with default-tag persisted [#2985]

2018-12-19 Thread Vu Minh Nguyen
During runtime, when replacing value of an attribute which has default-value
tag with NULL, this NULL value is not persistent after cluster is rebooted -
NULL value will be automatically replaced with its default value by IMM.

This behavior causes several unexpected results. Below is a use case.

User defines an attribute with name `maxAge`. It is used to shows how many days
user passwords will be expired, default value is 30 days; if replacing with
a NULL/empty, it means the passwords will never get expired.

During runtime, user changes the existing value with NULL - expect the passwords
never get expired. Later on, then cluster is rebooted, that value is silently
replaced with the default without notice of user.

This patch makes some changes in immdump/immloader/imm om library/immnd
to make NULL value in such case persisted even after cluster is rebooted.
---
 src/imm/README   | 10 +---
 src/imm/agent/imma_om_api.cc |  7 ++-
 src/imm/immloadd/imm_loader.cc   | 23 +---
 src/imm/immloadd/imm_pbe_load.cc | 16 --
 src/imm/immnd/ImmModel.cc|  9 ++-
 src/imm/tools/imm_xmlw_dump.cc   | 96 
 6 files changed, 100 insertions(+), 61 deletions(-)

diff --git a/src/imm/README b/src/imm/README
index 7ace34741..132ee0ac0 100644
--- a/src/imm/README
+++ b/src/imm/README
@@ -351,14 +351,8 @@ as part of an attribute definition.
 (i) A default declaration is only allowed for single valued attributes (no
 concept of a multivalued default exists).
 
-(ii) Default values are assigned at object creation. Default values are NOT
-assigned if an attribute is set to the empty/null value by a modification.
-
-(iii) Default values are assigned at cluster restart for any attributes that
-are null/empty and that have a default. This is a special case of (i) because
-imm loading actually uses the regular imm API to recreate the imm contents.
-In particular, saImmOmCcbObjectCreate is used to recreate all objects from
-the file-system image.
+(ii) Default values are assigned at object creation, except the creation comes
+from IMM loader.
 
 Common missunderstandings about "system attributes" of an imm object.
 -
diff --git a/src/imm/agent/imma_om_api.cc b/src/imm/agent/imma_om_api.cc
index 7155799d9..0d24b2335 100644
--- a/src/imm/agent/imma_om_api.cc
+++ b/src/imm/agent/imma_om_api.cc
@@ -2037,7 +2037,7 @@ static SaAisErrorT ccb_object_create_common(
 TRACE_2("ERR_INVALID_PARAM: Not allowed to set attribute %s",
 sysaImplName);
 goto mds_send_fail;
-  } else if (attr->attrValuesNumber == 0) {
+  } else if (attr->attrValuesNumber == 0 && !immOmIsLoader) {
 TRACE("CcbObjectCreate ignoring attribute %s with no values",
   attr->attrName);
 continue;
@@ -2065,7 +2065,9 @@ static SaAisErrorT ccb_object_create_common(
 
   const SaImmAttrValueT *avarr = attr->attrValues;
   /*alloc-5 */
-  imma_copyAttrValue(&(p->n.attrValue), attr->attrValueType, avarr[0]);
+  if (attr->attrValuesNumber > 0) {
+imma_copyAttrValue(&(p->n.attrValue), attr->attrValueType, avarr[0]);
+  }
 
   if (attr->attrValuesNumber > 1) {
 unsigned int numAdded = attr->attrValuesNumber - 1;
@@ -2087,6 +2089,7 @@ static SaAisErrorT ccb_object_create_common(
 }
   }
 
+
   rc = imma_evt_fake_evs(cb, , _evt, cl_node->syncr_timeout,
  cl_node->handle, , false);
   cl_node = NULL;
diff --git a/src/imm/immloadd/imm_loader.cc b/src/imm/immloadd/imm_loader.cc
index e9a985c22..3bd3e2b2e 100644
--- a/src/imm/immloadd/imm_loader.cc
+++ b/src/imm/immloadd/imm_loader.cc
@@ -117,6 +117,7 @@ typedef struct ParserStateStruct {
   SaImmAttrFlagsT attrFlags;
   SaUint32T attrNtfId;
   char *attrDefaultValueBuffer;
+  bool is_null_value;
 
   int attrValueTypeSet;
   int attrNtfIdSet;
@@ -925,6 +926,13 @@ static void startElementHandler(void *userData, const 
xmlChar *name,
 state->state[state->depth] = VALUE;
 state->valueContinue = 0;
 state->isBase64Encoded = isBase64Encoded(attrs);
+state->is_null_value = false;
+if (attrs) {
+  char* null_value = getAttributeValue("xsi:nil", attrs);
+  if (null_value && std::string{null_value} == "true") {
+state->is_null_value = true;
+  }
+}
 /*  */
   } else if (strcmp((const char *)name, "category") == 0) {
 state->state[state->depth] = CATEGORY;
@@ -982,7 +990,7 @@ static void endElementHandler(void *userData, const xmlChar 
*name) {
 
   /*  */
   if (strcmp((const char *)name, "value") == 0) {
-if (state->attrValueBuffers.empty()) {
+if (state->attrValueBuffers.empty() && !state->is_null_value) {
   char *str = (char *)malloc(1);
 
   str[0] = '\0';
@@ -1759,14 +1767,13 @@ void addObjectAttributeDefinition(
   SaImmAttrValuesT_2 attrValues;
   int i;
   size_t len;
+  bool null_value = 

[devel] [PATCH 1/1] imm: allow empty-value attribute with default-tag persisted [#2985]

2018-12-19 Thread Vu Minh Nguyen
When replacing value of an attribute which has default-value tag with NULL
during runtime, NULL value will be replaced with its default value after
cluster is rebooted; in other words, that value is not persisted.

This patch makes some changes in immdump/immloader/imm om library/immnd
to handle such requirement.
---
 src/imm/README   | 10 +---
 src/imm/agent/imma_om_api.cc |  7 ++-
 src/imm/immloadd/imm_loader.cc   | 23 +---
 src/imm/immloadd/imm_pbe_load.cc | 16 --
 src/imm/immnd/ImmModel.cc|  9 ++-
 src/imm/tools/imm_xmlw_dump.cc   | 96 
 6 files changed, 100 insertions(+), 61 deletions(-)

diff --git a/src/imm/README b/src/imm/README
index 7ace34741..132ee0ac0 100644
--- a/src/imm/README
+++ b/src/imm/README
@@ -351,14 +351,8 @@ as part of an attribute definition.
 (i) A default declaration is only allowed for single valued attributes (no
 concept of a multivalued default exists).
 
-(ii) Default values are assigned at object creation. Default values are NOT
-assigned if an attribute is set to the empty/null value by a modification.
-
-(iii) Default values are assigned at cluster restart for any attributes that
-are null/empty and that have a default. This is a special case of (i) because
-imm loading actually uses the regular imm API to recreate the imm contents.
-In particular, saImmOmCcbObjectCreate is used to recreate all objects from
-the file-system image.
+(ii) Default values are assigned at object creation, except the creation comes
+from IMM loader.
 
 Common missunderstandings about "system attributes" of an imm object.
 -
diff --git a/src/imm/agent/imma_om_api.cc b/src/imm/agent/imma_om_api.cc
index 7155799d9..0d24b2335 100644
--- a/src/imm/agent/imma_om_api.cc
+++ b/src/imm/agent/imma_om_api.cc
@@ -2037,7 +2037,7 @@ static SaAisErrorT ccb_object_create_common(
 TRACE_2("ERR_INVALID_PARAM: Not allowed to set attribute %s",
 sysaImplName);
 goto mds_send_fail;
-  } else if (attr->attrValuesNumber == 0) {
+  } else if (attr->attrValuesNumber == 0 && !immOmIsLoader) {
 TRACE("CcbObjectCreate ignoring attribute %s with no values",
   attr->attrName);
 continue;
@@ -2065,7 +2065,9 @@ static SaAisErrorT ccb_object_create_common(
 
   const SaImmAttrValueT *avarr = attr->attrValues;
   /*alloc-5 */
-  imma_copyAttrValue(&(p->n.attrValue), attr->attrValueType, avarr[0]);
+  if (attr->attrValuesNumber > 0) {
+imma_copyAttrValue(&(p->n.attrValue), attr->attrValueType, avarr[0]);
+  }
 
   if (attr->attrValuesNumber > 1) {
 unsigned int numAdded = attr->attrValuesNumber - 1;
@@ -2087,6 +2089,7 @@ static SaAisErrorT ccb_object_create_common(
 }
   }
 
+
   rc = imma_evt_fake_evs(cb, , _evt, cl_node->syncr_timeout,
  cl_node->handle, , false);
   cl_node = NULL;
diff --git a/src/imm/immloadd/imm_loader.cc b/src/imm/immloadd/imm_loader.cc
index e9a985c22..3bd3e2b2e 100644
--- a/src/imm/immloadd/imm_loader.cc
+++ b/src/imm/immloadd/imm_loader.cc
@@ -117,6 +117,7 @@ typedef struct ParserStateStruct {
   SaImmAttrFlagsT attrFlags;
   SaUint32T attrNtfId;
   char *attrDefaultValueBuffer;
+  bool is_null_value;
 
   int attrValueTypeSet;
   int attrNtfIdSet;
@@ -925,6 +926,13 @@ static void startElementHandler(void *userData, const 
xmlChar *name,
 state->state[state->depth] = VALUE;
 state->valueContinue = 0;
 state->isBase64Encoded = isBase64Encoded(attrs);
+state->is_null_value = false;
+if (attrs) {
+  char* null_value = getAttributeValue("xsi:nil", attrs);
+  if (null_value && std::string{null_value} == "true") {
+state->is_null_value = true;
+  }
+}
 /*  */
   } else if (strcmp((const char *)name, "category") == 0) {
 state->state[state->depth] = CATEGORY;
@@ -982,7 +990,7 @@ static void endElementHandler(void *userData, const xmlChar 
*name) {
 
   /*  */
   if (strcmp((const char *)name, "value") == 0) {
-if (state->attrValueBuffers.empty()) {
+if (state->attrValueBuffers.empty() && !state->is_null_value) {
   char *str = (char *)malloc(1);
 
   str[0] = '\0';
@@ -1759,14 +1767,13 @@ void addObjectAttributeDefinition(
   SaImmAttrValuesT_2 attrValues;
   int i;
   size_t len;
+  bool null_value = attrValueBuffers->empty();
+
   TRACE_ENTER2("attrValueBuffers size:%u",
(unsigned int)attrValueBuffers->size());
   /* The attrName must be set */
   assert(attrName);
 
-  /* The value array can not be empty */
-  assert(!attrValueBuffers->empty());
-
   /* The object class must be set */
   assert(objectClass);
 
@@ -1778,15 +1785,15 @@ void addObjectAttributeDefinition(
 
   /* For each value, convert from char* to SaImmAttrValuesT_2 and
  store an array pointing to all in attrValues */
-  attrValues.attrValuesNumber = attrValueBuffers->size();
-  

[devel] [PATCH 0/1] Review Request for imm: allow empty-value attribute with default-tag persisted [#2985]

2018-12-19 Thread Vu Minh Nguyen
Summary: imm: allow empty-value attribute with default-tag persisted [#2985]
Review request for Ticket(s): 2985
Peer Reviewer(s): Lennart, Hans, Gary
Pull request to: *** LIST THE PERSON WITH PUSH ACCESS HERE ***
Affected branch(es): develop
Development branch: ticket-2985
Base revision: 9ce47c5a79cc080d89d192bc1947ebd04aa0a122
Personal repository: git://git.code.sf.net/u/winhvu/review


Impacted area   Impact y/n

 Docsn
 Build systemn
 RPM/packaging   n
 Configuration files n
 Startup scripts n
 SAF servicesy
 OpenSAF servicesn
 Core libraries  n
 Samples n
 Tests   n
 Other   n

NOTE: Patch(es) contain lines longer than 80 characers

Comments (indicate scope for each "y" above):
-
*** EXPLAIN/COMMENT THE PATCH SERIES HERE ***

revision ae02c3dcafe8934eb73887ce8e1f02be83cd6942
Author: Vu Minh Nguyen 
Date:   Wed, 19 Dec 2018 16:13:47 +0700

imm: allow empty-value attribute with default-tag persisted [#2985]

When replacing value of an attribute which has default-value tag with NULL
during runtime, NULL value will be replaced with its default value after
cluster is rebooted; in other words, that value is not persisted.

This patch makes some changes in immdump/immloader/imm om library/immnd
to handle such requirement.



Complete diffstat:
--
 src/imm/README   | 10 +
 src/imm/agent/imma_om_api.cc |  7 ++-
 src/imm/immloadd/imm_loader.cc   | 23 ++
 src/imm/immloadd/imm_pbe_load.cc | 16 ---
 src/imm/immnd/ImmModel.cc|  9 +++-
 src/imm/tools/imm_xmlw_dump.cc   | 96 +---
 6 files changed, 100 insertions(+), 61 deletions(-)


Testing Commands:
-
1) Import TestClass.xml
immcfg -f TestClass.xml
2) Create an object of TestClass
immcfg -c TestClass testClass=0
3) Replace all attribute values of that object with empty
4) Dump whole IMM database, and overwrite existing imm.xml file
5) Restart cluster with new dump
6) Check the values of attributes that have been replaced with empty
6) Repeat the test with PBE enable.


Testing, Expected Results:
--
The values remains empty.


Conditions of Submission:
-
Ack from peer reviewers


Arch  Built StartedLinux distro
---
mipsn  n
mips64  n  n
x86 n  n
x86_64  n  n
powerpc n  n
powerpc64   n  n


Reviewer Checklist:
---
[Submitters: make sure that your review doesn't trigger any checkmarks!]


Your checkin has not passed review because (see checked entries):

___ Your RR template is generally incomplete; it has too many blank entries
that need proper data filled in.

___ You have failed to nominate the proper persons for review and push.

___ Your patches do not have proper short+long header

___ You have grammar/spelling in your header that is unacceptable.

___ You have exceeded a sensible line length in your headers/comments/text.

___ You have failed to put in a proper Trac Ticket # into your commits.

___ You have incorrectly put/left internal data in your comments/files
(i.e. internal bug tracking tool IDs, product names etc)

___ You have not given any evidence of testing beyond basic build tests.
Demonstrate some level of runtime or other sanity testing.

___ You have ^M present in some of your files. These have to be removed.

___ You have needlessly changed whitespace or added whitespace crimes
like trailing spaces, or spaces before tabs.

___ You have mixed real technical changes with whitespace and other
cosmetic code cleanup changes. These have to be separate commits.

___ You need to refactor your submission into logical chunks; there is
too much content into a single commit.

___ You have extraneous garbage in your review (merge commits etc)

___ You have giant attachments which should never have been sent;
Instead you should place your content in a public tree to be pulled.

___ You have too many commits attached to an e-mail; resend as threaded
commits, or place in a public tree for a pull.

___ You have resent this content multiple times without a clear indication
of what has changed between each re-send.

___ You have failed to adequately and individually address all of the
comments and change requests that were proposed in the initial review.

___ You have a misconfigured ~/.gitconfig file (i.e. user.name, user.email etc)

___ Your computer have a badly configured date and time; confusing the
the threaded patch review.

___ Your changes affect IPC mechanism, and you don't present any results
for in-service upgradability test.

___ Your changes affect user manual and