Hi Alex,
Change in comp.cc looks fine.
I guess other changes are related to the node reboot case in the context
of a campaign which performs upgrade by rebooting the node. In this case
since amfnd is freshly coming up, SUs on this node will not have their
sumaintenance attribute set (amfnd does not read su config from IMM)
which was set before SMF orders node reboot. If this is the case then I
think this can still be achieved without updating AMFD and AMFND MDS
versions and without including it in SU_REG message.
How to do it: AMFD still can send campaign name by calling
su->set_su_maintenance_campaign() for each SU when it gets response from
amfnd for SU_REG successful and before it sends instantiation message
for any SU. By this time AMFND has already all the information of SU
hosted on it, so it will update the su_db with campaign name. Attached
is the patch based on this idea (2144_update.patch).
Thanks,
Praveen
On 01-Mar-17 3:01 AM, Alex Jones wrote:
src/amf/amfd/mds.cc | 2 +-
src/amf/amfd/mds.h | 4 ++--
src/amf/amfd/util.cc | 5 +++++
src/amf/amfnd/avnd_mds.h | 4 ++--
src/amf/amfnd/comp.cc | 2 +-
src/amf/amfnd/mds.cc | 4 ++--
src/amf/amfnd/sudb.cc | 2 ++
src/amf/common/amf_d2nmsg.h | 2 ++
src/amf/common/d2nedu.c | 6 ++++++
src/amf/common/d2nmsg.c | 2 ++
10 files changed, 25 insertions(+), 8 deletions(-)
This patch adds support for Section 3.11.1.4.2 of AMF B.04.01 spec: Restrictions
to Auto-Repair.
diff --git a/src/amf/amfd/mds.cc b/src/amf/amfd/mds.cc
--- a/src/amf/amfd/mds.cc
+++ b/src/amf/amfd/mds.cc
@@ -47,7 +47,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avd_avnd
AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
AVSV_AVD_AVND_MSG_FMT_VER_5, AVSV_AVD_AVND_MSG_FMT_VER_6,
- AVSV_AVD_AVND_MSG_FMT_VER_7
+ AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8
};
const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[] = {
diff --git a/src/amf/amfd/mds.h b/src/amf/amfd/mds.h
--- a/src/amf/amfd/mds.h
+++ b/src/amf/amfd/mds.h
@@ -33,10 +33,10 @@
/* In Service upgrade support */
#define AVD_MDS_SUB_PART_VERSION_4 4
-#define AVD_MDS_SUB_PART_VERSION 7
+#define AVD_MDS_SUB_PART_VERSION 8
#define AVD_AVND_SUBPART_VER_MIN 1
-#define AVD_AVND_SUBPART_VER_MAX 7
+#define AVD_AVND_SUBPART_VER_MAX 8
#define AVD_AVD_SUBPART_VER_MIN 1
#define AVD_AVD_SUBPART_VER_MAX 6
diff --git a/src/amf/amfd/util.cc b/src/amf/amfd/util.cc
--- a/src/amf/amfd/util.cc
+++ b/src/amf/amfd/util.cc
@@ -483,6 +483,10 @@ static void reg_su_msg_init_su_info(AVD_
su_info->su_is_external = su->su_is_external;
su_info->su_failover = su->saAmfSUFailover;
+ SaNameT suCampaign;
+ osaf_extended_name_alloc(su->saAmfSUMaintenanceCampaign.c_str(),
&suCampaign);
+ su_info->suMaintenanceCampaign = suCampaign;
+
su_info->next = su_msg->msg_info.d2n_reg_su.su_list;
su_msg->msg_info.d2n_reg_su.su_list = su_info;
su_msg->msg_info.d2n_reg_su.num_su++;
@@ -1671,6 +1675,7 @@ static void free_d2n_su_msg_info(AVSV_DN
su_info = su_msg->msg_info.d2n_reg_su.su_list;
su_msg->msg_info.d2n_reg_su.su_list = su_info->next;
osaf_extended_name_free(&su_info->name);
+ osaf_extended_name_free(&su_info->suMaintenanceCampaign);
delete su_info;
}
}
diff --git a/src/amf/amfnd/avnd_mds.h b/src/amf/amfnd/avnd_mds.h
--- a/src/amf/amfnd/avnd_mds.h
+++ b/src/amf/amfnd/avnd_mds.h
@@ -31,10 +31,10 @@
#define AMF_AMFND_AVND_MDS_H_
/* In Service upgrade support */
-#define AVND_MDS_SUB_PART_VERSION 7
+#define AVND_MDS_SUB_PART_VERSION 8
#define AVND_AVD_SUBPART_VER_MIN 1
-#define AVND_AVD_SUBPART_VER_MAX 7
+#define AVND_AVD_SUBPART_VER_MAX 8
#define AVND_AVND_SUBPART_VER_MIN 1
#define AVND_AVND_SUBPART_VER_MAX 1
diff --git a/src/amf/amfnd/comp.cc b/src/amf/amfnd/comp.cc
--- a/src/amf/amfnd/comp.cc
+++ b/src/amf/amfnd/comp.cc
@@ -2675,7 +2675,7 @@ uint32_t comp_restart_initiate(AVND_COMP
if (NCSCC_RC_SUCCESS != rc)
goto done;
- if (!comp->su->suMaintenanceCampaign.empty()) {
+ if (!comp->su->suMaintenanceCampaign.empty() && !comp->admin_oper) {
LOG_NO("not restarting comp because maintenance campaign is set: %s",
comp->su->suMaintenanceCampaign.c_str());
diff --git a/src/amf/amfnd/mds.cc b/src/amf/amfnd/mds.cc
--- a/src/amf/amfnd/mds.cc
+++ b/src/amf/amfnd/mds.cc
@@ -43,7 +43,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avnd_avd
AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
AVSV_AVD_AVND_MSG_FMT_VER_4, AVSV_AVD_AVND_MSG_FMT_VER_6,
- AVSV_AVD_AVND_MSG_FMT_VER_7
+ AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8
};
/* messages from director */
@@ -51,7 +51,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avd_avnd
AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
AVSV_AVD_AVND_MSG_FMT_VER_5, AVSV_AVD_AVND_MSG_FMT_VER_6,
- AVSV_AVD_AVND_MSG_FMT_VER_7
+ AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8
};
const MDS_CLIENT_MSG_FORMAT_VER avnd_avnd_msg_fmt_map_table[] = {
diff --git a/src/amf/amfnd/sudb.cc b/src/amf/amfnd/sudb.cc
--- a/src/amf/amfnd/sudb.cc
+++ b/src/amf/amfnd/sudb.cc
@@ -52,6 +52,7 @@ AVND_SU *avnd_sudb_rec_add(AVND_CB *cb,
{
AVND_SU *su = 0;
const std::string info_name = Amf::to_string(&info->name);
+ const std::string info_campaign =
Amf::to_string(&info->suMaintenanceCampaign);
TRACE_ENTER2("SU'%s'", info_name.c_str());
/* verify if this su is already present in the db */
@@ -80,6 +81,7 @@ AVND_SU *avnd_sudb_rec_add(AVND_CB *cb,
su->is_ncs = info->is_ncs;
su->su_is_external = info->su_is_external;
su->sufailover = info->su_failover;
+ su->suMaintenanceCampaign = info_campaign;
/*
* Update the rest of the parameters with default values.
diff --git a/src/amf/common/amf_d2nmsg.h b/src/amf/common/amf_d2nmsg.h
--- a/src/amf/common/amf_d2nmsg.h
+++ b/src/amf/common/amf_d2nmsg.h
@@ -51,6 +51,7 @@ extern "C" {
#define AVSV_AVD_AVND_MSG_FMT_VER_5 5
#define AVSV_AVD_AVND_MSG_FMT_VER_6 6
#define AVSV_AVD_AVND_MSG_FMT_VER_7 7
+#define AVSV_AVD_AVND_MSG_FMT_VER_8 8
/* Internode/External Components Validation result */
typedef enum {
@@ -137,6 +138,7 @@ typedef struct avsv_su_info_msg {
bool is_ncs;
bool su_is_external; /*indicates if this SU is external */
bool su_failover;
+ SaNameT suMaintenanceCampaign;
struct avsv_su_info_msg *next;
} AVSV_SU_INFO_MSG;
diff --git a/src/amf/common/d2nedu.c b/src/amf/common/d2nedu.c
--- a/src/amf/common/d2nedu.c
+++ b/src/amf/common/d2nedu.c
@@ -635,6 +635,7 @@ uint32_t avsv_edp_su_info_msg(EDU_HDL *h
AVSV_SU_INFO_MSG *struct_ptr = NULL, **d_ptr = NULL;
uint16_t ver2 = AVSV_AVD_AVND_MSG_FMT_VER_2;
uint16_t ver5 = AVSV_AVD_AVND_MSG_FMT_VER_5;
+ uint16_t ver8 = AVSV_AVD_AVND_MSG_FMT_VER_8;
EDU_INST_SET avsv_su_info_msg_rules[] = {
{EDU_START, avsv_edp_su_info_msg, EDQ_LNKLIST, 0, 0,
@@ -665,6 +666,11 @@ uint32_t avsv_edp_su_info_msg(EDU_HDL *h
{EDU_EXEC, ncs_edp_ncs_bool, 0, 0, 0,
(long)&((AVSV_SU_INFO_MSG *)0)->su_failover, 0, NULL},
+ /* Include suMaintenanceCampaign in version 8 and higher */
+ {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t
*)(&(ver8)))},
+ {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+ (long)&((AVSV_SU_INFO_MSG *)0)->suMaintenanceCampaign, 0,
NULL},
+
{EDU_TEST_LL_PTR, avsv_edp_su_info_msg, 0, 0, 0,
(long)&((AVSV_SU_INFO_MSG *)0)->next, 0, NULL},
{EDU_END, 0, 0, 0, 0, 0, 0, NULL},
diff --git a/src/amf/common/d2nmsg.c b/src/amf/common/d2nmsg.c
--- a/src/amf/common/d2nmsg.c
+++ b/src/amf/common/d2nmsg.c
@@ -49,6 +49,7 @@ static void free_d2n_su_msg_info(AVSV_DN
su_info = su_msg->msg_info.d2n_reg_su.su_list;
su_msg->msg_info.d2n_reg_su.su_list = su_info->next;
osaf_extended_name_free(&su_info->name);
+ osaf_extended_name_free(&su_info->suMaintenanceCampaign);
free(su_info);
}
}
@@ -85,6 +86,7 @@ static uint32_t cpy_d2n_su_msg(AVSV_DND_
memcpy(d_su_info, s_su_info, sizeof(AVSV_SU_INFO_MSG));
osaf_extended_name_alloc(osaf_extended_name_borrow(&s_su_info->name),
&d_su_info->name);
+
osaf_extended_name_alloc(osaf_extended_name_borrow(&s_su_info->suMaintenanceCampaign),
&d_su_info->suMaintenanceCampaign);
d_su_info->next = d_su_msg->msg_info.d2n_reg_su.su_list;
d_su_msg->msg_info.d2n_reg_su.su_list = d_su_info;
diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc
--- a/src/amf/amfd/ndproc.cc
+++ b/src/amf/amfd/ndproc.cc
@@ -152,6 +152,20 @@ void avd_reg_su_evh(AVD_CL_CB *cb, AVD_E
/* the node has been successfully updated with SU information */
avd_node_state_set(node, AVD_AVND_STATE_NCS_INIT);
+ //Before any SU gets instantiated, send Maintenance campaign
update.
+ for (const auto& su : node->list_of_ncs_su) {
+ if (su->saAmfSUMaintenanceCampaign.empty() == false) {
+ TRACE("Sending Maintenance campaign info for
'%s'",su->name.c_str());
+ su->set_su_maintenance_campaign();
+ }
+ }
+ for (const auto& su : node->list_of_su) {
+ if (su->saAmfSUMaintenanceCampaign.empty() == false) {
+ TRACE("Sending Maintenance campaign info for
'%s'",su->name.c_str());
+ su->set_su_maintenance_campaign();
+ }
+ }
+
/* Instantiate all OpenSAF SUs on this node */
for (const auto& su : node->list_of_ncs_su) {
if ((su->saAmfSUAdminState == SA_AMF_ADMIN_UNLOCKED) ||
diff --git a/src/amf/amfnd/sudb.cc b/src/amf/amfnd/sudb.cc
--- a/src/amf/amfnd/sudb.cc
+++ b/src/amf/amfnd/sudb.cc
@@ -228,6 +228,9 @@ uint32_t avnd_su_oper_req(AVND_CB *cb, A
break;
case saAmfSUMaintenanceCampaign_ID:
su->suMaintenanceCampaign = std::string(param->value,
param->value_len);
+ if (su->suMaintenanceCampaign.length() > 0)
+ TRACE("suMaintenanceCampaign for '%s' changed
to '%s'",
+ su->name.c_str(),
su->suMaintenanceCampaign.c_str());
break;
default:
LOG_NO("%s: Unsupported attribute %u", __FUNCTION__,
param->attr_id);
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel