Tony Asleson
2014-07-17 18:35:32 UTC
To be consistent we will return an updated access group
when we add or remove an initiator from it. This makes
it consistent with other methods, like re-sizing a volume.
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/include/libstoragemgmt/libstoragemgmt.h | 15 +++++---
.../libstoragemgmt/libstoragemgmt_plug_interface.h | 33 +++++++++--------
c_binding/lsm_mgmt.cpp | 39 +++++++++++++++-----
c_binding/lsm_plugin_ipc.cpp | 15 ++++++++
plugin/simc/simc_lsmplugin.c | 17 +++++++++
test/tester.c | 41 +++++++++++-----------
6 files changed, 111 insertions(+), 49 deletions(-)
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt.h b/c_binding/include/libstoragemgmt/libstoragemgmt.h
index 4569cdb..a49aafd 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt.h
@@ -545,26 +545,31 @@ extern "C" {
* @param[in] access_group Group to modify
* @param[in] init_id Initiator to add to group
* @param[in] init_type Type of initiator
+ * @param[out] updated_access_group Updated access group
* @param[in] flags Reserved for future use, must be zero.
* @return LSM_ERR_OK on success, else error reason.
*/
int LSM_DLL_EXPORT lsm_access_group_initiator_add(lsm_connect *conn,
lsm_access_group *access_group,
const char *init_id,
- lsm_initiator_type init_type, lsm_flag flags);
+ lsm_initiator_type init_type,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Removes an initiator from an access group.
* @param[in] conn Valid connection @see lsm_connect_password
- * @param[in] group Group to modify
+ * @param[in] access_group Group to modify
* @param[in] initiator_id Initiator to delete from group
+ * @param[out] updated_access_group Updated access group
* @param[in] flags Reserved for future use, must be zero.
* @return[in] LSM_ERR_OK on success, else error reason.
*/
int LSM_DLL_EXPORT lsm_access_group_initiator_delete(lsm_connect *conn,
- lsm_access_group *group,
- const char *initiator_id,
- lsm_flag flags);
+ lsm_access_group *access_group,
+ const char *initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Grants access to a volume for the specified group
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
index 9c206ee..789d89a 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
@@ -498,30 +498,35 @@ typedef int (*lsm_plug_access_group_delete)(lsm_plugin_ptr c,
/**
* Add an initiator to an access group, callback function signature
- * @param[in] c Valid lsm plug-in pointer
- * @param[in] group Group to add initiator to
- * @param[in] initiator_id Initiator to add to group
- * @param[in] id_type Initiator type
- * @param[in] flags Reserved
+ * @param[in] c Valid lsm plug-in pointer
+ * @param[in] access_group Group to add initiator to
+ * @param[in] initiator_id Initiator to add to group
+ * @param[in] id_type Initiator type
+ * @param[out] updated_access_group Updated access group
+ * @param[in] flags Reserved
* @return LSM_ERR_OK, else error reason
*/
typedef int (*lsm_plug_access_group_initiator_add)(lsm_plugin_ptr c,
- lsm_access_group *group,
+ lsm_access_group *access_group,
const char *initiator_id,
- lsm_initiator_type id_type, lsm_flag flags);
+ lsm_initiator_type id_type,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Remove an initiator from an access group, callback function signature
- * @param[in] c Valid lsm plug-in pointer
- * @param[in] group Group to remove initiator from
- * @param[in] initiator_id Initiator to remove
- * @param[in] flags Reserved
+ * @param[in] c Valid lsm plug-in pointer
+ * @param[in] access_group Group to remove initiator from
+ * @param[in] initiator_id Initiator to remove
+ * @param[out] updated_access_group Updated access group
+ * @param[in] flags Reserved
* @return LSM_ERR_OK, else error reason
*/
typedef int (*lsm_plug_access_group_initiator_delete)(lsm_plugin_ptr c,
- lsm_access_group *group,
- const char *initiator_id,
- lsm_flag flags);
+ lsm_access_group *access_group,
+ const char *initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Grants access to a volume for the specified access group, callback function signature
diff --git a/c_binding/lsm_mgmt.cpp b/c_binding/lsm_mgmt.cpp
index af20a02..86f9789 100644
--- a/c_binding/lsm_mgmt.cpp
+++ b/c_binding/lsm_mgmt.cpp
@@ -1496,6 +1496,7 @@ int lsm_access_group_initiator_add(lsm_connect *c,
lsm_access_group *access_group,
const char *init_id,
lsm_initiator_type init_type,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
CONN_SETUP(c);
@@ -1504,8 +1505,8 @@ int lsm_access_group_initiator_add(lsm_connect *c,
return LSM_ERR_INVALID_ACCESS_GROUP;
}
- if( CHECK_STR(init_id) ||
- LSM_FLAG_UNUSED_CHECK(flags) ) {
+ if( CHECK_STR(init_id) || LSM_FLAG_UNUSED_CHECK(flags) ||
+ CHECK_RP(updated_access_group)) {
return LSM_ERR_INVALID_ARGUMENT;
}
@@ -1518,31 +1519,51 @@ int lsm_access_group_initiator_add(lsm_connect *c,
Value parameters(p);
Value response;
- return rpc(c, "access_group_initiator_add", parameters, response);
+ int rc = rpc(c, "access_group_initiator_add", parameters, response);
+ if( LSM_ERR_OK == rc ) {
+ //We should be getting a value back.
+ if( Value::object_t == response.valueType() ) {
+ *updated_access_group = value_to_access_group(response);
+ }
+ }
+
+ return rc;
}
-int lsm_access_group_initiator_delete(lsm_connect *c, lsm_access_group *group,
- const char* initiator_id, lsm_flag flags)
+int lsm_access_group_initiator_delete(lsm_connect *c,
+ lsm_access_group *access_group,
+ const char* initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags)
{
CONN_SETUP(c);
- if( !LSM_IS_ACCESS_GROUP(group)) {
+ if( !LSM_IS_ACCESS_GROUP(access_group)) {
return LSM_ERR_INVALID_ACCESS_GROUP;
}
- if( CHECK_STR(initiator_id) || LSM_FLAG_UNUSED_CHECK(flags) ) {
+ if( CHECK_STR(initiator_id) || LSM_FLAG_UNUSED_CHECK(flags) ||
+ CHECK_RP(updated_access_group)) {
return LSM_ERR_INVALID_ARGUMENT;
}
std::map<std::string, Value> p;
- p["access_group"] = access_group_to_value(group);
+ p["access_group"] = access_group_to_value(access_group);
p["init_id"] = Value(initiator_id);
p["flags"] = Value(flags);
Value parameters(p);
Value response;
- return rpc(c, "access_group_initiator_delete", parameters, response);
+ int rc = rpc(c, "access_group_initiator_delete", parameters, response);
+ if( LSM_ERR_OK == rc ) {
+ //We should be getting a value back.
+ if( Value::object_t == response.valueType() ) {
+ *updated_access_group = value_to_access_group(response);
+ }
+ }
+
+ return rc;
}
int lsm_volume_mask(lsm_connect *c, lsm_access_group *access_group,
diff --git a/c_binding/lsm_plugin_ipc.cpp b/c_binding/lsm_plugin_ipc.cpp
index 5e10647..983648e 100644
--- a/c_binding/lsm_plugin_ipc.cpp
+++ b/c_binding/lsm_plugin_ipc.cpp
@@ -1227,13 +1227,20 @@ static int ag_initiator_add(lsm_plugin_ptr p, Value ¶ms, Value &response)
lsm_access_group *ag = value_to_access_group(v_group);
if( ag ) {
+ lsm_access_group *updated_access_group = NULL;
const char *id = v_init_id.asC_str();
lsm_initiator_type id_type = (lsm_initiator_type)
v_init_type.asInt32_t();
rc = p->san_ops->ag_add_initiator(p, ag, id, id_type,
+ &updated_access_group,
LSM_FLAG_GET_VALUE(params));
+ if( LSM_ERR_OK == rc ) {
+ response = access_group_to_value(updated_access_group);
+ lsm_access_group_record_free(updated_access_group);
+ }
+
lsm_access_group_record_free(ag);
} else {
rc = LSM_ERR_NO_MEMORY;
@@ -1263,9 +1270,17 @@ static int ag_initiator_del(lsm_plugin_ptr p, Value ¶ms, Value &response)
lsm_access_group *ag = value_to_access_group(v_group);
if( ag ) {
+ lsm_access_group *updated_access_group = NULL;
const char *init = v_init_id.asC_str();
rc = p->san_ops->ag_del_initiator(p, ag, init,
+ &updated_access_group,
LSM_FLAG_GET_VALUE(params));
+
+ if( LSM_ERR_OK == rc ) {
+ response = access_group_to_value(updated_access_group);
+ lsm_access_group_record_free(updated_access_group);
+ }
+
lsm_access_group_record_free(ag);
} else {
rc = LSM_ERR_NO_MEMORY;
diff --git a/plugin/simc/simc_lsmplugin.c b/plugin/simc/simc_lsmplugin.c
index 08c5c54..f19708b 100644
--- a/plugin/simc/simc_lsmplugin.c
+++ b/plugin/simc/simc_lsmplugin.c
@@ -1229,6 +1229,7 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
lsm_access_group *group,
const char *initiator_id,
lsm_initiator_type id_type,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
int rc = LSM_ERR_OK;
@@ -1241,6 +1242,13 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
if( find ) {
lsm_string_list *inits = lsm_access_group_initiator_id_get(find->ag);
rc = lsm_string_list_append(inits, initiator_id);
+
+ if( LSM_ERR_OK == rc ) {
+ *updated_access_group = lsm_access_group_record_copy(find->ag);
+ if( !*updated_access_group ) {
+ rc = LSM_ERR_NO_MEMORY;
+ }
+ }
} else {
rc = lsm_log_error_basic(c, LSM_ERR_NOT_FOUND_ACCESS_GROUP,
"access group not found");
@@ -1251,6 +1259,7 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
static int access_group_initiator_delete( lsm_plugin_ptr c,
lsm_access_group *group,
const char *init,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
int rc = LSM_ERR_INITIATOR_NOT_IN_ACCESS_GROUP;
@@ -1271,6 +1280,14 @@ static int access_group_initiator_delete( lsm_plugin_ptr c,
break;
}
}
+
+ if( LSM_ERR_OK == rc ) {
+ *updated_access_group = lsm_access_group_record_copy(find->ag);
+ if( !*updated_access_group ) {
+ rc = LSM_ERR_NO_MEMORY;
+ }
+ }
+
} else {
rc = lsm_log_error_basic(c, LSM_ERR_NOT_FOUND_ACCESS_GROUP,
"access group not found");
diff --git a/test/tester.c b/test/tester.c
index 526279c..59a2829 100644
--- a/test/tester.c
+++ b/test/tester.c
@@ -648,38 +648,37 @@ START_TEST(test_access_groups)
G(rc, lsm_access_group_record_array_free, groups, count);
groups = NULL;
count = 0;
-
char *job = NULL;
+ lsm_access_group *updated = NULL;
- rc = lsm_access_group_initiator_add(c, group, "iqn.1994-05.com.domain:01.89bd02", LSM_INITIATOR_ISCSI, LSM_FLAG_RSVD);
-
- if( LSM_ERR_JOB_STARTED == rc ) {
- wait_for_job(c, &job);
- } else {
- fail_unless(LSM_ERR_OK == rc, "Expected success on lsmAccessGroupInitiatorAdd %d %d", rc, which_plugin);
- }
+ rc = lsm_access_group_initiator_add(c, group, "iqn.1994-05.com.domain:01.89bd02", LSM_INITIATOR_ISCSI, &updated, LSM_FLAG_RSVD);
+ fail_unless(LSM_ERR_OK == rc, "Expected success on lsmAccessGroupInitiatorAdd %d %d", rc, which_plugin);
G(rc, lsm_access_group_list, c, NULL, NULL, &groups, &count, LSM_FLAG_RSVD);
fail_unless( 1 == count );
+ fail_unless( updated != NULL );
+ lsm_access_group_record_free(updated);
+ updated = NULL;
+
if( count ) {
init_list = lsm_access_group_initiator_id_get(groups[0]);
- fail_unless( lsm_string_list_size(init_list) == 2, "Expecting 2 initiators, current num = %d\n", lsm_string_list_size(init_list) );
+ fail_unless( lsm_string_list_size(init_list) == 2,
+ "Expecting 2 initiators, current num = %d\n",
+ lsm_string_list_size(init_list) );
for( i = 0; i < lsm_string_list_size(init_list); ++i) {
printf("%d = %s\n", i, lsm_string_list_elem_get(init_list, i));
-
printf("Deleting initiator %s from group!\n",
lsm_string_list_elem_get(init_list, i));
- rc = lsm_access_group_initiator_delete(
- c, groups[0], lsm_string_list_elem_get(init_list, i),
- LSM_FLAG_RSVD);
- if( LSM_ERR_JOB_STARTED == rc ) {
- wait_for_job_fs(c, &job);
- } else {
- fail_unless(LSM_ERR_OK == rc);
- }
+ G(rc, lsm_access_group_initiator_delete, c, groups[0],
+ lsm_string_list_elem_get(init_list, i), &updated,
+ LSM_FLAG_RSVD)
+
+ fail_unless(updated != NULL);
+ lsm_access_group_record_free(updated);
+ updated = NULL;
}
init_list = NULL;
}
@@ -1531,14 +1530,14 @@ START_TEST(test_invalid_input)
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
/* lsmAccessGroupInitiatorAdd */
- rc = lsm_access_group_initiator_add(c, NULL, NULL, 0, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_add(c, NULL, NULL, 0, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
- rc = lsm_access_group_initiator_delete(c, NULL, NULL, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_delete(c, NULL, NULL, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
- rc = lsm_access_group_initiator_delete(c, ag, NULL, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_delete(c, ag, NULL, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ARGUMENT, "rc = %d", rc);
when we add or remove an initiator from it. This makes
it consistent with other methods, like re-sizing a volume.
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/include/libstoragemgmt/libstoragemgmt.h | 15 +++++---
.../libstoragemgmt/libstoragemgmt_plug_interface.h | 33 +++++++++--------
c_binding/lsm_mgmt.cpp | 39 +++++++++++++++-----
c_binding/lsm_plugin_ipc.cpp | 15 ++++++++
plugin/simc/simc_lsmplugin.c | 17 +++++++++
test/tester.c | 41 +++++++++++-----------
6 files changed, 111 insertions(+), 49 deletions(-)
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt.h b/c_binding/include/libstoragemgmt/libstoragemgmt.h
index 4569cdb..a49aafd 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt.h
@@ -545,26 +545,31 @@ extern "C" {
* @param[in] access_group Group to modify
* @param[in] init_id Initiator to add to group
* @param[in] init_type Type of initiator
+ * @param[out] updated_access_group Updated access group
* @param[in] flags Reserved for future use, must be zero.
* @return LSM_ERR_OK on success, else error reason.
*/
int LSM_DLL_EXPORT lsm_access_group_initiator_add(lsm_connect *conn,
lsm_access_group *access_group,
const char *init_id,
- lsm_initiator_type init_type, lsm_flag flags);
+ lsm_initiator_type init_type,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Removes an initiator from an access group.
* @param[in] conn Valid connection @see lsm_connect_password
- * @param[in] group Group to modify
+ * @param[in] access_group Group to modify
* @param[in] initiator_id Initiator to delete from group
+ * @param[out] updated_access_group Updated access group
* @param[in] flags Reserved for future use, must be zero.
* @return[in] LSM_ERR_OK on success, else error reason.
*/
int LSM_DLL_EXPORT lsm_access_group_initiator_delete(lsm_connect *conn,
- lsm_access_group *group,
- const char *initiator_id,
- lsm_flag flags);
+ lsm_access_group *access_group,
+ const char *initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Grants access to a volume for the specified group
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
index 9c206ee..789d89a 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
@@ -498,30 +498,35 @@ typedef int (*lsm_plug_access_group_delete)(lsm_plugin_ptr c,
/**
* Add an initiator to an access group, callback function signature
- * @param[in] c Valid lsm plug-in pointer
- * @param[in] group Group to add initiator to
- * @param[in] initiator_id Initiator to add to group
- * @param[in] id_type Initiator type
- * @param[in] flags Reserved
+ * @param[in] c Valid lsm plug-in pointer
+ * @param[in] access_group Group to add initiator to
+ * @param[in] initiator_id Initiator to add to group
+ * @param[in] id_type Initiator type
+ * @param[out] updated_access_group Updated access group
+ * @param[in] flags Reserved
* @return LSM_ERR_OK, else error reason
*/
typedef int (*lsm_plug_access_group_initiator_add)(lsm_plugin_ptr c,
- lsm_access_group *group,
+ lsm_access_group *access_group,
const char *initiator_id,
- lsm_initiator_type id_type, lsm_flag flags);
+ lsm_initiator_type id_type,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Remove an initiator from an access group, callback function signature
- * @param[in] c Valid lsm plug-in pointer
- * @param[in] group Group to remove initiator from
- * @param[in] initiator_id Initiator to remove
- * @param[in] flags Reserved
+ * @param[in] c Valid lsm plug-in pointer
+ * @param[in] access_group Group to remove initiator from
+ * @param[in] initiator_id Initiator to remove
+ * @param[out] updated_access_group Updated access group
+ * @param[in] flags Reserved
* @return LSM_ERR_OK, else error reason
*/
typedef int (*lsm_plug_access_group_initiator_delete)(lsm_plugin_ptr c,
- lsm_access_group *group,
- const char *initiator_id,
- lsm_flag flags);
+ lsm_access_group *access_group,
+ const char *initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags);
/**
* Grants access to a volume for the specified access group, callback function signature
diff --git a/c_binding/lsm_mgmt.cpp b/c_binding/lsm_mgmt.cpp
index af20a02..86f9789 100644
--- a/c_binding/lsm_mgmt.cpp
+++ b/c_binding/lsm_mgmt.cpp
@@ -1496,6 +1496,7 @@ int lsm_access_group_initiator_add(lsm_connect *c,
lsm_access_group *access_group,
const char *init_id,
lsm_initiator_type init_type,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
CONN_SETUP(c);
@@ -1504,8 +1505,8 @@ int lsm_access_group_initiator_add(lsm_connect *c,
return LSM_ERR_INVALID_ACCESS_GROUP;
}
- if( CHECK_STR(init_id) ||
- LSM_FLAG_UNUSED_CHECK(flags) ) {
+ if( CHECK_STR(init_id) || LSM_FLAG_UNUSED_CHECK(flags) ||
+ CHECK_RP(updated_access_group)) {
return LSM_ERR_INVALID_ARGUMENT;
}
@@ -1518,31 +1519,51 @@ int lsm_access_group_initiator_add(lsm_connect *c,
Value parameters(p);
Value response;
- return rpc(c, "access_group_initiator_add", parameters, response);
+ int rc = rpc(c, "access_group_initiator_add", parameters, response);
+ if( LSM_ERR_OK == rc ) {
+ //We should be getting a value back.
+ if( Value::object_t == response.valueType() ) {
+ *updated_access_group = value_to_access_group(response);
+ }
+ }
+
+ return rc;
}
-int lsm_access_group_initiator_delete(lsm_connect *c, lsm_access_group *group,
- const char* initiator_id, lsm_flag flags)
+int lsm_access_group_initiator_delete(lsm_connect *c,
+ lsm_access_group *access_group,
+ const char* initiator_id,
+ lsm_access_group **updated_access_group,
+ lsm_flag flags)
{
CONN_SETUP(c);
- if( !LSM_IS_ACCESS_GROUP(group)) {
+ if( !LSM_IS_ACCESS_GROUP(access_group)) {
return LSM_ERR_INVALID_ACCESS_GROUP;
}
- if( CHECK_STR(initiator_id) || LSM_FLAG_UNUSED_CHECK(flags) ) {
+ if( CHECK_STR(initiator_id) || LSM_FLAG_UNUSED_CHECK(flags) ||
+ CHECK_RP(updated_access_group)) {
return LSM_ERR_INVALID_ARGUMENT;
}
std::map<std::string, Value> p;
- p["access_group"] = access_group_to_value(group);
+ p["access_group"] = access_group_to_value(access_group);
p["init_id"] = Value(initiator_id);
p["flags"] = Value(flags);
Value parameters(p);
Value response;
- return rpc(c, "access_group_initiator_delete", parameters, response);
+ int rc = rpc(c, "access_group_initiator_delete", parameters, response);
+ if( LSM_ERR_OK == rc ) {
+ //We should be getting a value back.
+ if( Value::object_t == response.valueType() ) {
+ *updated_access_group = value_to_access_group(response);
+ }
+ }
+
+ return rc;
}
int lsm_volume_mask(lsm_connect *c, lsm_access_group *access_group,
diff --git a/c_binding/lsm_plugin_ipc.cpp b/c_binding/lsm_plugin_ipc.cpp
index 5e10647..983648e 100644
--- a/c_binding/lsm_plugin_ipc.cpp
+++ b/c_binding/lsm_plugin_ipc.cpp
@@ -1227,13 +1227,20 @@ static int ag_initiator_add(lsm_plugin_ptr p, Value ¶ms, Value &response)
lsm_access_group *ag = value_to_access_group(v_group);
if( ag ) {
+ lsm_access_group *updated_access_group = NULL;
const char *id = v_init_id.asC_str();
lsm_initiator_type id_type = (lsm_initiator_type)
v_init_type.asInt32_t();
rc = p->san_ops->ag_add_initiator(p, ag, id, id_type,
+ &updated_access_group,
LSM_FLAG_GET_VALUE(params));
+ if( LSM_ERR_OK == rc ) {
+ response = access_group_to_value(updated_access_group);
+ lsm_access_group_record_free(updated_access_group);
+ }
+
lsm_access_group_record_free(ag);
} else {
rc = LSM_ERR_NO_MEMORY;
@@ -1263,9 +1270,17 @@ static int ag_initiator_del(lsm_plugin_ptr p, Value ¶ms, Value &response)
lsm_access_group *ag = value_to_access_group(v_group);
if( ag ) {
+ lsm_access_group *updated_access_group = NULL;
const char *init = v_init_id.asC_str();
rc = p->san_ops->ag_del_initiator(p, ag, init,
+ &updated_access_group,
LSM_FLAG_GET_VALUE(params));
+
+ if( LSM_ERR_OK == rc ) {
+ response = access_group_to_value(updated_access_group);
+ lsm_access_group_record_free(updated_access_group);
+ }
+
lsm_access_group_record_free(ag);
} else {
rc = LSM_ERR_NO_MEMORY;
diff --git a/plugin/simc/simc_lsmplugin.c b/plugin/simc/simc_lsmplugin.c
index 08c5c54..f19708b 100644
--- a/plugin/simc/simc_lsmplugin.c
+++ b/plugin/simc/simc_lsmplugin.c
@@ -1229,6 +1229,7 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
lsm_access_group *group,
const char *initiator_id,
lsm_initiator_type id_type,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
int rc = LSM_ERR_OK;
@@ -1241,6 +1242,13 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
if( find ) {
lsm_string_list *inits = lsm_access_group_initiator_id_get(find->ag);
rc = lsm_string_list_append(inits, initiator_id);
+
+ if( LSM_ERR_OK == rc ) {
+ *updated_access_group = lsm_access_group_record_copy(find->ag);
+ if( !*updated_access_group ) {
+ rc = LSM_ERR_NO_MEMORY;
+ }
+ }
} else {
rc = lsm_log_error_basic(c, LSM_ERR_NOT_FOUND_ACCESS_GROUP,
"access group not found");
@@ -1251,6 +1259,7 @@ static int access_group_initiator_add( lsm_plugin_ptr c,
static int access_group_initiator_delete( lsm_plugin_ptr c,
lsm_access_group *group,
const char *init,
+ lsm_access_group **updated_access_group,
lsm_flag flags)
{
int rc = LSM_ERR_INITIATOR_NOT_IN_ACCESS_GROUP;
@@ -1271,6 +1280,14 @@ static int access_group_initiator_delete( lsm_plugin_ptr c,
break;
}
}
+
+ if( LSM_ERR_OK == rc ) {
+ *updated_access_group = lsm_access_group_record_copy(find->ag);
+ if( !*updated_access_group ) {
+ rc = LSM_ERR_NO_MEMORY;
+ }
+ }
+
} else {
rc = lsm_log_error_basic(c, LSM_ERR_NOT_FOUND_ACCESS_GROUP,
"access group not found");
diff --git a/test/tester.c b/test/tester.c
index 526279c..59a2829 100644
--- a/test/tester.c
+++ b/test/tester.c
@@ -648,38 +648,37 @@ START_TEST(test_access_groups)
G(rc, lsm_access_group_record_array_free, groups, count);
groups = NULL;
count = 0;
-
char *job = NULL;
+ lsm_access_group *updated = NULL;
- rc = lsm_access_group_initiator_add(c, group, "iqn.1994-05.com.domain:01.89bd02", LSM_INITIATOR_ISCSI, LSM_FLAG_RSVD);
-
- if( LSM_ERR_JOB_STARTED == rc ) {
- wait_for_job(c, &job);
- } else {
- fail_unless(LSM_ERR_OK == rc, "Expected success on lsmAccessGroupInitiatorAdd %d %d", rc, which_plugin);
- }
+ rc = lsm_access_group_initiator_add(c, group, "iqn.1994-05.com.domain:01.89bd02", LSM_INITIATOR_ISCSI, &updated, LSM_FLAG_RSVD);
+ fail_unless(LSM_ERR_OK == rc, "Expected success on lsmAccessGroupInitiatorAdd %d %d", rc, which_plugin);
G(rc, lsm_access_group_list, c, NULL, NULL, &groups, &count, LSM_FLAG_RSVD);
fail_unless( 1 == count );
+ fail_unless( updated != NULL );
+ lsm_access_group_record_free(updated);
+ updated = NULL;
+
if( count ) {
init_list = lsm_access_group_initiator_id_get(groups[0]);
- fail_unless( lsm_string_list_size(init_list) == 2, "Expecting 2 initiators, current num = %d\n", lsm_string_list_size(init_list) );
+ fail_unless( lsm_string_list_size(init_list) == 2,
+ "Expecting 2 initiators, current num = %d\n",
+ lsm_string_list_size(init_list) );
for( i = 0; i < lsm_string_list_size(init_list); ++i) {
printf("%d = %s\n", i, lsm_string_list_elem_get(init_list, i));
-
printf("Deleting initiator %s from group!\n",
lsm_string_list_elem_get(init_list, i));
- rc = lsm_access_group_initiator_delete(
- c, groups[0], lsm_string_list_elem_get(init_list, i),
- LSM_FLAG_RSVD);
- if( LSM_ERR_JOB_STARTED == rc ) {
- wait_for_job_fs(c, &job);
- } else {
- fail_unless(LSM_ERR_OK == rc);
- }
+ G(rc, lsm_access_group_initiator_delete, c, groups[0],
+ lsm_string_list_elem_get(init_list, i), &updated,
+ LSM_FLAG_RSVD)
+
+ fail_unless(updated != NULL);
+ lsm_access_group_record_free(updated);
+ updated = NULL;
}
init_list = NULL;
}
@@ -1531,14 +1530,14 @@ START_TEST(test_invalid_input)
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
/* lsmAccessGroupInitiatorAdd */
- rc = lsm_access_group_initiator_add(c, NULL, NULL, 0, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_add(c, NULL, NULL, 0, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
- rc = lsm_access_group_initiator_delete(c, NULL, NULL, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_delete(c, NULL, NULL, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ACCESS_GROUP, "rc = %d", rc);
- rc = lsm_access_group_initiator_delete(c, ag, NULL, LSM_FLAG_RSVD);
+ rc = lsm_access_group_initiator_delete(c, ag, NULL, NULL, LSM_FLAG_RSVD);
fail_unless(rc == LSM_ERR_INVALID_ARGUMENT, "rc = %d", rc);
--
1.8.2.1
1.8.2.1