[SCM] Samba Shared Repository - branch master updated
José A. Rivera
jarrpa at samba.org
Tue Jul 14 22:26:04 UTC 2015
The branch, master has been updated
via 7ce0b7c9 s4-torture: add test for ClusterControl to clusapi testsuite.
via db49f1f clusapi: add and use clusapi_ClusterControlCode to IDL.
via 6f08d8ab s3-rpcclient: add cmd_clusapi_get_cluster_version2.
via 0a95932 s4-torture: add test for clusapi_QueryValue.
via aa96377 clusapi: use winreg_AccessMask in clusapi.idl.
via 2ac148d s4-torture: add more tests for dcerpc_clusapi_CreateEnum.
via 97bef66 s4-torture: make sure to always seal the clusapi connection in witness test.
via d6a4a2d s4-torture: do some more inspection on expected witness_AsyncNotify replies.
via d270028 s4-torture: add test for ClusterControl to clusapi testsuite.
from ff3b446 s4-torture: use smb_krb5_principal_set_type() in lsa forest krb5 tests.
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 7ce0b7c95845ab001cf76bf5e9a0891ed601cc98
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 9 15:44:41 2015 +0200
s4-torture: add test for ClusterControl to clusapi testsuite.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
Autobuild-User(master): José A. Rivera <jarrpa at samba.org>
Autobuild-Date(master): Wed Jul 15 00:25:38 CEST 2015 on sn-devel-104
commit db49f1f014f2d76deddd7c86050f53c94494f712
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 9 15:12:58 2015 +0200
clusapi: add and use clusapi_ClusterControlCode to IDL.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit 6f08d8ab23c37f7511260c4a488e236263584b8b
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 9 15:56:44 2015 +0200
s3-rpcclient: add cmd_clusapi_get_cluster_version2.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit 0a95932aaded561ee88cee963e7ecaf77884fadf
Author: Günther Deschner <gd at samba.org>
Date: Mon Jul 6 13:59:27 2015 +0200
s4-torture: add test for clusapi_QueryValue.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit aa96377b27c5078b37cbc2167cadd61067411406
Author: Günther Deschner <gd at samba.org>
Date: Sat Jul 4 01:26:44 2015 +0200
clusapi: use winreg_AccessMask in clusapi.idl.
Make winreg_AccessMask public to access it outside winreg.idl.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit 2ac148d6a2e9010eb7dcd754122f64594b1aabcd
Author: Günther Deschner <gd at samba.org>
Date: Sat Jul 4 01:26:01 2015 +0200
s4-torture: add more tests for dcerpc_clusapi_CreateEnum.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit 97bef6613eb987a74b755c95340aea7149b3fe36
Author: Günther Deschner <gd at samba.org>
Date: Wed Jul 1 19:29:28 2015 +0200
s4-torture: make sure to always seal the clusapi connection in witness test.
clusapi only works via DCE/RPC sealed connections in Windows 2012R2.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit d6a4a2ddb3882179408359011363d4fd855a6ece
Author: Günther Deschner <gd at samba.org>
Date: Wed Jul 1 15:40:06 2015 +0200
s4-torture: do some more inspection on expected witness_AsyncNotify replies.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
commit d2700282ec4683710703c002552113aea6aee722
Author: Günther Deschner <gd at samba.org>
Date: Wed Jul 1 15:14:19 2015 +0200
s4-torture: add test for ClusterControl to clusapi testsuite.
Guenther
Signed-off-by: Günther Deschner <gd at samba.org>
Reviewed-by: Jose A. Rivera <jarrpa at samba.org>
-----------------------------------------------------------------------
Summary of changes:
librpc/idl/clusapi.idl | 39 ++++++--
librpc/idl/winreg.idl | 2 +-
source3/rpcclient/cmd_clusapi.c | 41 +++++++++
source4/torture/rpc/clusapi.c | 193 +++++++++++++++++++++++++++++++++++++---
source4/torture/rpc/witness.c | 66 ++++++++++++--
5 files changed, 314 insertions(+), 27 deletions(-)
Changeset truncated at 500 lines:
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 3e87114..5cb7610 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1,4 +1,4 @@
-import "security.idl";
+import "security.idl", "winreg.idl";
#include "idl_types.h"
@@ -464,14 +464,14 @@ import "security.idl";
#if 0
HKEY_RPC
clusapi_GetRootKey(
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ out ] WERROR *Status,
[ out ] WERROR *rpc_status
);
#else
void
clusapi_GetRootKey(
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ out ] WERROR *Status,
[ out ] WERROR *rpc_status,
[ out ] HKEY_RPC *phKey
@@ -485,7 +485,7 @@ import "security.idl";
[ in ] HKEY_RPC hKey,
[ in, string ] [charset(UTF16)] uint16 *lpSubKey,
[ in ] uint32 dwOptions,
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ in, unique ] RPC_SECURITY_ATTRIBUTES *lpSecurityAttributes,
[ out ] uint32 *lpdwDisposition,
[ out ] WERROR *Status,
@@ -497,7 +497,7 @@ import "security.idl";
[ in ] HKEY_RPC hKey,
[ in, string ] [charset(UTF16)] uint16 *lpSubKey,
[ in ] uint32 dwOptions,
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ in, unique ] RPC_SECURITY_ATTRIBUTES *lpSecurityAttributes,
[ out ] uint32 *lpdwDisposition,
[ out ] WERROR *Status,
@@ -512,7 +512,7 @@ import "security.idl";
clusapi_OpenKey(
[ in ] HKEY_RPC hKey,
[ in, string ] [charset(UTF16)] uint16 *lpSubKey,
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ out ] WERROR *Status,
[ out ] WERROR *rpc_status
);
@@ -521,7 +521,7 @@ import "security.idl";
clusapi_OpenKey(
[ in ] HKEY_RPC hKey,
[ in, string ] [charset(UTF16)] uint16 *lpSubKey,
- [ in ] uint32 samDesired,
+ [ in ] winreg_AccessMask samDesired,
[ out ] WERROR *Status,
[ out ] WERROR *rpc_status,
[ out ] HKEY_RPC *phKey
@@ -1507,10 +1507,33 @@ import "security.idl";
/*****************/
/* Function 0x6A */
+ typedef [v1_enum] enum {
+ CLUSCTL_CLUSTER_UNKNOWN = 0x07000000,
+ CLUSCTL_CLUSTER_GET_FQDN = 0x0700003D,
+ CLUSCTL_CLUSTER_CHECK_VOTER_EVICT = 0x07000045,
+ CLUSCTL_CLUSTER_CHECK_VOTER_DOWN = 0x07000049,
+ CLUSCTL_CLUSTER_SHUTDOWN = 0x0700004D,
+ CLUSCTL_CLUSTER_ENUM_COMMON_PROPERTIES = 0x07000051,
+ CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES = 0x07000055,
+ CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES = 0x07000059,
+ CLUSCTL_CLUSTER_SET_COMMON_PROPERTIES = 0x0740005E,
+ CLUSCTL_CLUSTER_VALIDATE_COMMON_PROPERTIES = 0x07000061,
+ CLUSCTL_CLUSTER_GET_COMMON_PROPERTY_FMTS = 0x07000065,
+ CLUSCTL_CLUSTER_ENUM_PRIVATE_PROPERTIES = 0x07000079,
+ CLUSCTL_CLUSTER_GET_RO_PRIVATE_PROPERTIES = 0x0700007D,
+ CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES = 0x07000081,
+ CLUSCTL_CLUSTER_SET_PRIVATE_PROPERTIES = 0x07400086,
+ CLUSCTL_CLUSTER_VALIDATE_PRIVATE_PROPERTIES = 0x07000089,
+ CLUSCTL_CLUSTER_GET_SHARED_VOLUME_ID = 0x07000291,
+ CLUSCTL_CLUSTER_UPGRADE_CLUSTER_VERSION = 0x074000ce,
+ CLUSCTL_CLUSTER_CLEAR_UPGRADE_IN_PROGRESS = 0x074000d2,
+ CLUSCTL_CLUSTER_IS_READY_FOR_UPGRADE = 0x070000d5
+ } clusapi_ClusterControlCode;
+
WERROR
clusapi_ClusterControl(
[ in ] HCLUSTER_RPC hCluster,
- [ in ] uint32 dwControlCode,
+ [ in ] clusapi_ClusterControlCode dwControlCode,
[ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer,
[ in ] uint32 nInBufferSize,
[ out, size_is(nOutBufferSize),
diff --git a/librpc/idl/winreg.idl b/librpc/idl/winreg.idl
index c5da328..fb70f7d 100644
--- a/librpc/idl/winreg.idl
+++ b/librpc/idl/winreg.idl
@@ -18,7 +18,7 @@ import "lsa.idl", "security.idl", "misc.idl";
* Access Bits for registry ACLS
*/
- typedef [bitmap32bit] bitmap {
+ typedef [public,bitmap32bit] bitmap {
KEY_QUERY_VALUE = 0x00001,
KEY_SET_VALUE = 0x00002,
KEY_CREATE_SUB_KEY = 0x00004,
diff --git a/source3/rpcclient/cmd_clusapi.c b/source3/rpcclient/cmd_clusapi.c
index 441a9d8..b7451dc 100644
--- a/source3/rpcclient/cmd_clusapi.c
+++ b/source3/rpcclient/cmd_clusapi.c
@@ -405,6 +405,46 @@ static WERROR cmd_clusapi_get_resource_state(struct rpc_pipe_client *cli,
return WERR_OK;
}
+static WERROR cmd_clusapi_get_cluster_version2(struct rpc_pipe_client *cli,
+ TALLOC_CTX *mem_ctx,
+ int argc,
+ const char **argv)
+{
+ struct dcerpc_binding_handle *b = cli->binding_handle;
+ NTSTATUS status;
+ uint16_t lpwMajorVersion;
+ uint16_t lpwMinorVersion;
+ uint16_t lpwBuildNumber;
+ const char *lpszVendorId;
+ const char *lpszCSDVersion;
+ struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
+ WERROR rpc_status;
+ WERROR result;
+
+ status = dcerpc_clusapi_GetClusterVersion2(b, mem_ctx,
+ &lpwMajorVersion,
+ &lpwMinorVersion,
+ &lpwBuildNumber,
+ &lpszVendorId,
+ &lpszCSDVersion,
+ &ppClusterOpVerInfo,
+ &rpc_status,
+ &result);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ntstatus_to_werror(status);
+ }
+
+ if (!W_ERROR_IS_OK(result)) {
+ printf("result: %s\n", win_errstr(result));
+ return result;
+ }
+
+ printf("rpc_status: %s\n", win_errstr(rpc_status));
+
+ return WERR_OK;
+}
+
+
struct cmd_set clusapi_commands[] = {
{ "CLUSAPI" },
@@ -417,5 +457,6 @@ struct cmd_set clusapi_commands[] = {
{ "clusapi_online_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_online_resource, &ndr_table_clusapi, NULL, "bla", "" },
{ "clusapi_offline_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_offline_resource, &ndr_table_clusapi, NULL, "bla", "" },
{ "clusapi_get_resource_state", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_resource_state, &ndr_table_clusapi, NULL, "bla", "" },
+ { "clusapi_get_cluster_version2", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_version2, &ndr_table_clusapi, NULL, "bla", "" },
{ NULL }
};
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 8d4dbec..f6f3ff5 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -22,6 +22,7 @@
#include "librpc/gen_ndr/ndr_clusapi_c.h"
#include "torture/rpc/torture_rpc.h"
#include "param/param.h"
+#include "libcli/registry/util_reg.h"
struct torture_clusapi_context {
struct dcerpc_pipe *p;
@@ -273,20 +274,53 @@ static bool test_CreateEnum(struct torture_context *tctx,
talloc_get_type_abort(data, struct torture_clusapi_context);
struct dcerpc_binding_handle *b = t->p->binding_handle;
struct clusapi_CreateEnum r;
- uint32_t dwType = CLUSTER_ENUM_RESOURCE;
+ uint32_t dwType[] = {
+ CLUSTER_ENUM_NODE,
+ CLUSTER_ENUM_RESTYPE,
+ CLUSTER_ENUM_RESOURCE,
+ CLUSTER_ENUM_GROUP,
+ CLUSTER_ENUM_NETWORK,
+ CLUSTER_ENUM_NETINTERFACE,
+ CLUSTER_ENUM_INTERNAL_NETWORK,
+ CLUSTER_ENUM_SHARED_VOLUME_RESOURCE
+ };
+ uint32_t dwType_invalid[] = {
+ 0x00000040,
+ 0x00000080,
+ 0x00000100 /* and many more ... */
+ };
struct ENUM_LIST *ReturnEnum;
WERROR rpc_status;
+ int i;
- r.in.dwType = dwType;
- r.out.ReturnEnum = &ReturnEnum;
- r.out.rpc_status = &rpc_status;
+ for (i=0; i < ARRAY_SIZE(dwType); i++) {
- torture_assert_ntstatus_ok(tctx,
- dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
- "CreateEnum failed");
- torture_assert_werr_ok(tctx,
- r.out.result,
- "CreateEnum failed");
+ r.in.dwType = dwType[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
+ "CreateEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateEnum failed");
+ }
+
+ for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+ r.in.dwType = dwType_invalid[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
+ "CreateEnum failed");
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_INVALID_PARAMETER,
+ "CreateEnum failed");
+ }
return true;
}
@@ -1771,6 +1805,73 @@ static bool test_SetServiceAccountPassword(struct torture_context *tctx,
return true;
}
+static bool test_ClusterControl_int(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *Cluster)
+{
+ struct dcerpc_binding_handle *b = p->binding_handle;
+ struct clusapi_ClusterControl r;
+ uint32_t lpBytesReturned;
+ uint32_t lpcbRequired;
+ WERROR rpc_status;
+
+ r.in.hCluster = *Cluster;
+ r.in.dwControlCode = 0;
+ r.in.lpInBuffer = NULL;
+ r.in.nInBufferSize = 0;
+ r.in.nOutBufferSize = 0;
+ r.out.lpOutBuffer = NULL;
+ r.out.lpBytesReturned = &lpBytesReturned;
+ r.out.lpcbRequired = &lpcbRequired;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
+ "ClusterControl failed");
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_INVALID_FUNCTION,
+ "ClusterControl failed");
+
+ r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
+ "ClusterControl failed");
+
+ if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+ r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
+ r.in.nOutBufferSize = *r.out.lpcbRequired;
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
+ "ClusterControl failed");
+ }
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "ClusterControl failed");
+
+ return true;
+}
+
+static bool test_ClusterControl(struct torture_context *tctx,
+ void *data)
+{
+ struct torture_clusapi_context *t =
+ talloc_get_type_abort(data, struct torture_clusapi_context);
+ struct policy_handle Cluster;
+ bool ret;
+
+ if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
+ return false;
+ }
+
+ ret = test_ClusterControl_int(tctx, t->p, &Cluster);
+
+ test_CloseCluster_int(tctx, t->p, &Cluster);
+
+ return ret;
+}
+
static bool test_OpenNetwork_int(struct torture_context *tctx,
struct dcerpc_pipe *p,
const char *lpszNetworkName,
@@ -2573,6 +2674,73 @@ static bool test_EnumKey(struct torture_context *tctx,
return ret;
}
+static bool test_QueryValue_int(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *hKey,
+ const char *ValueName)
+{
+ struct dcerpc_binding_handle *b = p->binding_handle;
+ struct clusapi_QueryValue r;
+ uint32_t lpValueType;
+ uint32_t lpcbRequired;
+ WERROR rpc_status;
+
+ r.in.hKey = *hKey;
+ r.in.lpValueName = ValueName;
+ r.in.cbData = 0;
+ r.out.lpValueType = &lpValueType;
+ r.out.lpData = NULL;
+ r.out.lpcbRequired = &lpcbRequired;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_QueryValue_r(b, tctx, &r),
+ "QueryValue failed");
+
+ if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+
+ r.in.cbData = lpcbRequired;
+ r.out.lpData = talloc_zero_array(tctx, uint8_t, r.in.cbData);
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_QueryValue_r(b, tctx, &r),
+ "QueryValue failed");
+ }
+
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "QueryValue failed");
+
+ if (lpValueType == REG_SZ) {
+ const char *s;
+ DATA_BLOB blob = data_blob_const(r.out.lpData, lpcbRequired);
+ pull_reg_sz(tctx, &blob, &s);
+ torture_comment(tctx, "got: %s\n", s);
+ }
+
+ return true;
+}
+
+static bool test_QueryValue(struct torture_context *tctx,
+ void *data)
+{
+ struct torture_clusapi_context *t =
+ talloc_get_type_abort(data, struct torture_clusapi_context);
+ struct policy_handle hKey;
+ bool ret = true;
+
+ if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
+ return false;
+ }
+
+ ret = test_QueryValue_int(tctx, t->p, &hKey, "ClusterInstanceID");
+
+ test_CloseKey_int(tctx, t->p, &hKey);
+
+ return ret;
+}
+
+
static bool test_one_key(struct torture_context *tctx,
struct dcerpc_pipe *p,
struct policy_handle *hKey,
@@ -2716,6 +2884,9 @@ void torture_tcase_cluster(struct torture_tcase *tcase)
test_BackupClusterDatabase);
torture_tcase_add_simple_test(tcase, "SetServiceAccountPassword",
test_SetServiceAccountPassword);
+ torture_tcase_add_simple_test(tcase, "ClusterControl",
+ test_ClusterControl);
+
}
void torture_tcase_resource(struct torture_tcase *tcase)
@@ -2847,6 +3018,8 @@ void torture_tcase_registry(struct torture_tcase *tcase)
test_CloseKey);
torture_tcase_add_simple_test(tcase, "EnumKey",
test_EnumKey);
+ torture_tcase_add_simple_test(tcase, "QueryValue",
+ test_QueryValue);
torture_tcase_add_simple_test(tcase, "all_keys",
test_all_keys);
}
diff --git a/source4/torture/rpc/witness.c b/source4/torture/rpc/witness.c
index f040e0b..6f50a63 100644
--- a/source4/torture/rpc/witness.c
+++ b/source4/torture/rpc/witness.c
@@ -26,6 +26,7 @@
#include "librpc/gen_ndr/ndr_clusapi_c.h"
#include "param/param.h"
#include <tevent.h>
+#include "lib/cmdline/popt_common.h"
struct torture_test_clusapi_state {
struct dcerpc_pipe *p;
@@ -516,17 +517,30 @@ static bool test_witness_RegisterEx(struct torture_context *tctx,
static bool setup_clusapi_connection(struct torture_context *tctx,
struct torture_test_witness_state *s)
{
- NTSTATUS status;
+ struct dcerpc_binding *binding;
if (s->clusapi.p) {
return true;
}
- status = torture_rpc_connection_transport(tctx, &s->clusapi.p, &ndr_table_clusapi, NCACN_IP_TCP, 0);
- if (!NT_STATUS_IS_OK(status)) {
- torture_comment(tctx, "clusapi interface not available\n");
- return true;
- }
+ torture_assert_ntstatus_ok(tctx,
+ torture_rpc_binding(tctx, &binding),
+ "failed to retrieve torture binding");
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_binding_set_transport(binding, NCACN_IP_TCP),
+ "failed to set transport");
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_binding_set_flags(binding, DCERPC_SEAL, 0),
+ "failed to set dcerpc flags");
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_pipe_connect_b(tctx, &s->clusapi.p, binding,
+ &ndr_table_clusapi,
+ cmdline_credentials,
+ tctx->ev, tctx->lp_ctx),
+ "failed to connect dcerpc pipe");
return true;
}
@@ -587,7 +601,9 @@ static bool test_GetResourceState_int(struct torture_context *tctx,
static bool toggle_cluster_resource_state(struct torture_context *tctx,
struct dcerpc_pipe *p,
- const char *resource_name)
+ const char *resource_name,
+ enum clusapi_ClusterResourceState *old_state,
+ enum clusapi_ClusterResourceState *new_state)
{
struct policy_handle hResource;
enum clusapi_ClusterResourceState State;
@@ -599,6 +615,10 @@ static bool toggle_cluster_resource_state(struct torture_context *tctx,
test_GetResourceState_int(tctx, p, &hResource, &State),
"failed to query resource state");
+ if (old_state) {
+ *old_state = State;
+ }
+
switch (State) {
case ClusterResourceOffline:
if (!test_OnlineResource_int(tctx, p, &hResource)) {
@@ -619,6 +639,14 @@ static bool toggle_cluster_resource_state(struct torture_context *tctx,
break;
}
+ torture_assert(tctx,
+ test_GetResourceState_int(tctx, p, &hResource, &State),
+ "failed to query resource state");
+
+ if (new_state) {
+ *new_state = State;
+ }
+
test_CloseResource_int(tctx, p, &hResource);
return true;
@@ -645,6 +673,7 @@ static bool test_witness_AsyncNotify(struct torture_context *tctx,
struct witness_interfaceInfo interface = state->list->interfaces[i];
--
Samba Shared Repository
More information about the samba-cvs
mailing list