2 Unix SMB/CIFS implementation.
3 test suite for clusapi rpc operations
5 Copyright (C) Günther Deschner 2015
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "librpc/gen_ndr/ndr_clusapi_c.h"
23 #include "torture/rpc/torture_rpc.h"
24 #include "param/param.h"
25 #include "libcli/registry/util_reg.h"
27 struct torture_clusapi_context
{
28 struct dcerpc_pipe
*p
;
30 const char *ClusterName
;
33 static bool test_OpenCluster_int(struct torture_context
*tctx
,
34 struct dcerpc_pipe
*p
,
35 struct policy_handle
*Cluster
)
37 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
38 struct clusapi_OpenCluster r
;
41 r
.out
.Status
= &Status
;
42 r
.out
.Cluster
= Cluster
;
44 torture_assert_ntstatus_ok(tctx
,
45 dcerpc_clusapi_OpenCluster_r(b
, tctx
, &r
),
46 "OpenCluster failed");
47 torture_assert_werr_ok(tctx
,
49 "OpenCluster failed");
54 static bool test_OpenClusterEx_int(struct torture_context
*tctx
,
55 struct dcerpc_pipe
*p
,
56 struct policy_handle
*Cluster
)
58 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
59 struct clusapi_OpenClusterEx r
;
60 uint32_t lpdwGrantedAccess
;
63 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
64 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
65 r
.out
.Status
= &Status
;
66 r
.out
.hCluster
= Cluster
;
68 torture_assert_ntstatus_ok(tctx
,
69 dcerpc_clusapi_OpenClusterEx_r(b
, tctx
, &r
),
70 "OpenClusterEx failed");
71 torture_assert_werr_ok(tctx
,
73 "OpenClusterEx failed");
78 static bool test_CloseCluster_int(struct torture_context
*tctx
,
79 struct dcerpc_pipe
*p
,
80 struct policy_handle
*Cluster
)
82 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
83 struct clusapi_CloseCluster r
;
85 r
.in
.Cluster
= Cluster
;
86 r
.out
.Cluster
= Cluster
;
88 torture_assert_ntstatus_ok(tctx
,
89 dcerpc_clusapi_CloseCluster_r(b
, tctx
, &r
),
90 "CloseCluster failed");
91 torture_assert_werr_ok(tctx
,
93 "CloseCluster failed");
96 ndr_policy_handle_empty(Cluster
),
97 "policy_handle non empty after CloseCluster");
102 static bool test_OpenCluster(struct torture_context
*tctx
,
105 struct torture_clusapi_context
*t
=
106 talloc_get_type_abort(data
, struct torture_clusapi_context
);
107 struct policy_handle Cluster
;
109 if (!test_OpenCluster_int(tctx
, t
->p
, &Cluster
)) {
113 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
118 static bool test_OpenClusterEx(struct torture_context
*tctx
,
121 struct torture_clusapi_context
*t
=
122 talloc_get_type_abort(data
, struct torture_clusapi_context
);
123 struct policy_handle Cluster
;
125 if (!test_OpenClusterEx_int(tctx
, t
->p
, &Cluster
)) {
129 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
134 static bool test_CloseCluster(struct torture_context
*tctx
,
137 struct torture_clusapi_context
*t
=
138 talloc_get_type_abort(data
, struct torture_clusapi_context
);
139 struct policy_handle Cluster
;
141 if (!test_OpenCluster_int(tctx
, t
->p
, &Cluster
)) {
145 return test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
148 static bool test_GetClusterName_int(struct torture_context
*tctx
,
149 struct dcerpc_pipe
*p
,
150 const char **ClusterName
)
152 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
153 struct clusapi_GetClusterName r
;
154 const char *NodeName
;
156 r
.out
.ClusterName
= ClusterName
;
157 r
.out
.NodeName
= &NodeName
;
159 torture_assert_ntstatus_ok(tctx
,
160 dcerpc_clusapi_GetClusterName_r(b
, tctx
, &r
),
161 "GetClusterName failed");
162 torture_assert_werr_ok(tctx
,
164 "GetClusterName failed");
169 static bool test_SetClusterName(struct torture_context
*tctx
,
172 struct torture_clusapi_context
*t
=
173 talloc_get_type_abort(data
, struct torture_clusapi_context
);
174 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
175 struct clusapi_SetClusterName r
;
176 const char *NewClusterName
;
180 test_GetClusterName_int(tctx
, t
->p
, &NewClusterName
),
181 "failed to query old ClusterName");
183 r
.in
.NewClusterName
= NewClusterName
;
184 r
.out
.rpc_status
= &rpc_status
;
186 torture_assert_ntstatus_ok(tctx
,
187 dcerpc_clusapi_SetClusterName_r(b
, tctx
, &r
),
188 "SetClusterName failed");
189 torture_assert_werr_equal(tctx
,
191 WERR_RESOURCE_PROPERTIES_STORED
,
192 "SetClusterName failed");
197 static bool test_GetClusterName(struct torture_context
*tctx
,
200 struct torture_clusapi_context
*t
=
201 talloc_get_type_abort(data
, struct torture_clusapi_context
);
202 const char *ClusterName
;
204 return test_GetClusterName_int(tctx
, t
->p
, &ClusterName
);
207 static bool test_GetClusterVersion(struct torture_context
*tctx
,
210 struct torture_clusapi_context
*t
=
211 talloc_get_type_abort(data
, struct torture_clusapi_context
);
212 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
213 struct clusapi_GetClusterVersion r
;
214 uint16_t lpwMajorVersion
;
215 uint16_t lpwMinorVersion
;
216 uint16_t lpwBuildNumber
;
217 const char *lpszVendorId
;
218 const char *lpszCSDVersion
;
220 r
.out
.lpwMajorVersion
= &lpwMajorVersion
;
221 r
.out
.lpwMinorVersion
= &lpwMinorVersion
;
222 r
.out
.lpwBuildNumber
= &lpwBuildNumber
;
223 r
.out
.lpszVendorId
= &lpszVendorId
;
224 r
.out
.lpszCSDVersion
= &lpszCSDVersion
;
226 torture_assert_ntstatus_ok(tctx
,
227 dcerpc_clusapi_GetClusterVersion_r(b
, tctx
, &r
),
228 "GetClusterVersion failed");
229 torture_assert_werr_equal(tctx
,
231 WERR_CALL_NOT_IMPLEMENTED
,
232 "GetClusterVersion failed");
237 static bool test_GetClusterVersion2(struct torture_context
*tctx
,
240 struct torture_clusapi_context
*t
=
241 talloc_get_type_abort(data
, struct torture_clusapi_context
);
242 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
243 struct clusapi_GetClusterVersion2 r
;
244 uint16_t lpwMajorVersion
;
245 uint16_t lpwMinorVersion
;
246 uint16_t lpwBuildNumber
;
247 const char *lpszVendorId
;
248 const char *lpszCSDVersion
;
249 struct CLUSTER_OPERATIONAL_VERSION_INFO
*ppClusterOpVerInfo
;
252 r
.out
.lpwMajorVersion
= &lpwMajorVersion
;
253 r
.out
.lpwMinorVersion
= &lpwMinorVersion
;
254 r
.out
.lpwBuildNumber
= &lpwBuildNumber
;
255 r
.out
.lpszVendorId
= &lpszVendorId
;
256 r
.out
.lpszCSDVersion
= &lpszCSDVersion
;
257 r
.out
.ppClusterOpVerInfo
= &ppClusterOpVerInfo
;
258 r
.out
.rpc_status
= &rpc_status
;
260 torture_assert_ntstatus_ok(tctx
,
261 dcerpc_clusapi_GetClusterVersion2_r(b
, tctx
, &r
),
262 "GetClusterVersion2 failed");
263 torture_assert_werr_ok(tctx
,
265 "GetClusterVersion2 failed");
270 static bool test_CreateEnum(struct torture_context
*tctx
,
273 struct torture_clusapi_context
*t
=
274 talloc_get_type_abort(data
, struct torture_clusapi_context
);
275 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
276 struct clusapi_CreateEnum r
;
277 uint32_t dwType
[] = {
279 CLUSTER_ENUM_RESTYPE
,
280 CLUSTER_ENUM_RESOURCE
,
282 CLUSTER_ENUM_NETWORK
,
283 CLUSTER_ENUM_NETINTERFACE
,
284 CLUSTER_ENUM_INTERNAL_NETWORK
,
285 CLUSTER_ENUM_SHARED_VOLUME_RESOURCE
287 uint32_t dwType_invalid
[] = {
290 0x00000100 /* and many more ... */
292 struct ENUM_LIST
*ReturnEnum
;
296 for (i
=0; i
< ARRAY_SIZE(dwType
); i
++) {
298 r
.in
.dwType
= dwType
[i
];
299 r
.out
.ReturnEnum
= &ReturnEnum
;
300 r
.out
.rpc_status
= &rpc_status
;
302 torture_assert_ntstatus_ok(tctx
,
303 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
304 "CreateEnum failed");
305 torture_assert_werr_ok(tctx
,
307 "CreateEnum failed");
310 for (i
=0; i
< ARRAY_SIZE(dwType_invalid
); i
++) {
312 r
.in
.dwType
= dwType_invalid
[i
];
313 r
.out
.ReturnEnum
= &ReturnEnum
;
314 r
.out
.rpc_status
= &rpc_status
;
316 torture_assert_ntstatus_ok(tctx
,
317 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
318 "CreateEnum failed");
319 torture_assert_werr_equal(tctx
,
321 WERR_INVALID_PARAMETER
,
322 "CreateEnum failed");
328 static bool test_CreateEnumEx_int(struct torture_context
*tctx
,
329 struct dcerpc_pipe
*p
,
330 struct policy_handle
*Cluster
)
332 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
333 struct clusapi_CreateEnumEx r
;
334 uint32_t dwType
[] = {
336 CLUSTER_ENUM_RESTYPE
,
337 CLUSTER_ENUM_RESOURCE
,
339 CLUSTER_ENUM_NETWORK
,
340 CLUSTER_ENUM_NETINTERFACE
,
341 CLUSTER_ENUM_INTERNAL_NETWORK
,
342 CLUSTER_ENUM_SHARED_VOLUME_RESOURCE
344 uint32_t dwType_invalid
[] = {
347 0x00000100 /* and many more ... */
349 struct ENUM_LIST
*ReturnIdEnum
;
350 struct ENUM_LIST
*ReturnNameEnum
;
354 for (i
=0; i
< ARRAY_SIZE(dwType
); i
++) {
356 r
.in
.hCluster
= *Cluster
;
357 r
.in
.dwType
= dwType
[i
];
359 r
.out
.ReturnIdEnum
= &ReturnIdEnum
;
360 r
.out
.ReturnNameEnum
= &ReturnNameEnum
;
361 r
.out
.rpc_status
= &rpc_status
;
363 torture_assert_ntstatus_ok(tctx
,
364 dcerpc_clusapi_CreateEnumEx_r(b
, tctx
, &r
),
365 "CreateEnumEx failed");
366 torture_assert_werr_ok(tctx
,
368 "CreateEnumEx failed");
371 for (i
=0; i
< ARRAY_SIZE(dwType_invalid
); i
++) {
373 r
.in
.hCluster
= *Cluster
;
374 r
.in
.dwType
= dwType_invalid
[i
];
376 r
.out
.ReturnIdEnum
= &ReturnIdEnum
;
377 r
.out
.ReturnNameEnum
= &ReturnNameEnum
;
378 r
.out
.rpc_status
= &rpc_status
;
380 torture_assert_ntstatus_ok(tctx
,
381 dcerpc_clusapi_CreateEnumEx_r(b
, tctx
, &r
),
382 "CreateEnumEx failed");
383 torture_assert_werr_equal(tctx
,
385 WERR_INVALID_PARAMETER
,
386 "CreateEnumEx failed");
392 static bool test_CreateEnumEx(struct torture_context
*tctx
,
395 struct torture_clusapi_context
*t
=
396 talloc_get_type_abort(data
, struct torture_clusapi_context
);
397 struct policy_handle Cluster
;
400 if (!test_OpenCluster_int(tctx
, t
->p
, &Cluster
)) {
404 ret
= test_CreateEnumEx_int(tctx
, t
->p
, &Cluster
);
406 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
412 static bool test_GetQuorumResource(struct torture_context
*tctx
,
415 struct torture_clusapi_context
*t
=
416 talloc_get_type_abort(data
, struct torture_clusapi_context
);
417 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
418 struct clusapi_GetQuorumResource r
;
419 const char *lpszResourceName
;
420 const char *lpszDeviceName
;
421 uint32_t pdwMaxQuorumLogSize
;
424 r
.out
.lpszResourceName
= &lpszResourceName
;
425 r
.out
.lpszDeviceName
= &lpszDeviceName
;
426 r
.out
.pdwMaxQuorumLogSize
= &pdwMaxQuorumLogSize
;
427 r
.out
.rpc_status
= &rpc_status
;
429 torture_assert_ntstatus_ok(tctx
,
430 dcerpc_clusapi_GetQuorumResource_r(b
, tctx
, &r
),
431 "GetQuorumResource failed");
432 torture_assert_werr_ok(tctx
,
434 "GetQuorumResource failed");
439 static bool test_SetQuorumResource(struct torture_context
*tctx
,
442 struct torture_clusapi_context
*t
=
443 talloc_get_type_abort(data
, struct torture_clusapi_context
);
444 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
445 struct clusapi_SetQuorumResource r
;
446 const char *lpszDeviceName
= "";
447 uint32_t dwMaxQuorumLogSize
= 0;
449 struct policy_handle hResource
;
451 /* we need to figure out how this call works and what we provide as
452 devicename and resource handle - gd
455 torture_skip(tctx
, "skipping SetQuorumResource test");
457 ZERO_STRUCT(hResource
);
459 r
.in
.hResource
= hResource
;
460 r
.in
.lpszDeviceName
= lpszDeviceName
;
461 r
.in
.dwMaxQuorumLogSize
= dwMaxQuorumLogSize
;
462 r
.out
.rpc_status
= &rpc_status
;
464 torture_assert_ntstatus_ok(tctx
,
465 dcerpc_clusapi_SetQuorumResource_r(b
, tctx
, &r
),
466 "SetQuorumResource failed");
467 torture_assert_werr_ok(tctx
,
469 "SetQuorumResource failed");
474 static bool test_OpenResource_int_exp(struct torture_context
*tctx
,
475 struct dcerpc_pipe
*p
,
476 const char *lpszResourceName
,
477 struct policy_handle
*hResource
,
478 WERROR expected_Status
,
479 WERROR expected_rpc_status
)
481 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
482 struct clusapi_OpenResource r
;
486 r
.in
.lpszResourceName
= lpszResourceName
;
487 r
.out
.rpc_status
= &rpc_status
;
488 r
.out
.Status
= &Status
;
489 r
.out
.hResource
= hResource
;
491 torture_assert_ntstatus_ok(tctx
,
492 dcerpc_clusapi_OpenResource_r(b
, tctx
, &r
),
493 "OpenResource failed");
494 torture_assert_werr_equal(tctx
,
495 *r
.out
.Status
, expected_Status
,
496 "OpenResource failed");
497 torture_assert_werr_equal(tctx
,
498 *r
.out
.rpc_status
, expected_rpc_status
,
499 "OpenResource failed");
504 bool test_OpenResource_int(struct torture_context
*tctx
,
505 struct dcerpc_pipe
*p
,
506 const char *lpszResourceName
,
507 struct policy_handle
*hResource
)
509 return test_OpenResource_int_exp(tctx
, p
,
515 static bool test_OpenResourceEx_int(struct torture_context
*tctx
,
516 struct dcerpc_pipe
*p
,
517 const char *lpszResourceName
,
518 struct policy_handle
*hResource
)
520 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
521 struct clusapi_OpenResourceEx r
;
522 uint32_t lpdwGrantedAccess
;
526 r
.in
.lpszResourceName
= lpszResourceName
;
527 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
528 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
529 r
.out
.rpc_status
= &rpc_status
;
530 r
.out
.Status
= &Status
;
531 r
.out
.hResource
= hResource
;
533 torture_assert_ntstatus_ok(tctx
,
534 dcerpc_clusapi_OpenResourceEx_r(b
, tctx
, &r
),
535 "OpenResourceEx failed");
536 torture_assert_werr_ok(tctx
,
538 "OpenResourceEx failed");
543 bool test_CloseResource_int(struct torture_context
*tctx
,
544 struct dcerpc_pipe
*p
,
545 struct policy_handle
*hResource
)
547 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
548 struct clusapi_CloseResource r
;
550 r
.in
.Resource
= hResource
;
551 r
.out
.Resource
= hResource
;
553 torture_assert_ntstatus_ok(tctx
,
554 dcerpc_clusapi_CloseResource_r(b
, tctx
, &r
),
555 "CloseResource failed");
556 torture_assert_werr_ok(tctx
,
558 "CloseResource failed");
560 ndr_policy_handle_empty(hResource
),
561 "policy_handle non empty after CloseResource");
566 static bool test_OpenResource(struct torture_context
*tctx
,
569 struct torture_clusapi_context
*t
=
570 talloc_get_type_abort(data
, struct torture_clusapi_context
);
571 struct policy_handle hResource
;
573 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
577 test_CloseResource_int(tctx
, t
->p
, &hResource
);
579 if (!test_OpenResource_int_exp(tctx
, t
->p
, "", &hResource
, WERR_RESOURCE_NOT_FOUND
, WERR_OK
)) {
584 ndr_policy_handle_empty(&hResource
),
585 "expected empty policy handle");
587 if (!test_OpenResource_int_exp(tctx
, t
->p
, "jfUF38fjSNcfn", &hResource
, WERR_RESOURCE_NOT_FOUND
, WERR_OK
)) {
592 ndr_policy_handle_empty(&hResource
),
593 "expected empty policy handle");
598 static bool test_OpenResourceEx(struct torture_context
*tctx
,
601 struct torture_clusapi_context
*t
=
602 talloc_get_type_abort(data
, struct torture_clusapi_context
);
603 struct policy_handle hResource
;
605 if (!test_OpenResourceEx_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
609 test_CloseResource_int(tctx
, t
->p
, &hResource
);
615 static bool test_CloseResource(struct torture_context
*tctx
,
618 struct torture_clusapi_context
*t
=
619 talloc_get_type_abort(data
, struct torture_clusapi_context
);
620 struct policy_handle hResource
;
622 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
626 return test_CloseResource_int(tctx
, t
->p
, &hResource
);
629 static bool test_OpenGroup_int(struct torture_context
*tctx
,
630 struct dcerpc_pipe
*p
,
631 const char *lpszGroupName
,
632 struct policy_handle
*hGroup
);
633 static bool test_CloseGroup_int(struct torture_context
*tctx
,
634 struct dcerpc_pipe
*p
,
635 struct policy_handle
*Group
);
637 static bool test_CreateResource_int(struct torture_context
*tctx
,
638 struct dcerpc_pipe
*p
,
639 struct policy_handle
*hResource
)
641 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
642 struct clusapi_CreateResource r
;
643 const char *lpszResourceName
= "wurst";
644 const char *lpszResourceType
= "Generic Service";
647 struct policy_handle hGroup
;
650 test_OpenGroup_int(tctx
, p
, "Cluster Group", &hGroup
),
651 "failed to open group");
653 r
.in
.hGroup
= hGroup
;
654 r
.in
.lpszResourceName
= lpszResourceName
;
655 r
.in
.lpszResourceType
= lpszResourceType
;
656 r
.in
.dwFlags
= CLUSTER_RESOURCE_DEFAULT_MONITOR
;
657 r
.out
.rpc_status
= &rpc_status
;
658 r
.out
.Status
= &Status
;
659 r
.out
.hResource
= hResource
;
661 torture_assert_ntstatus_ok(tctx
,
662 dcerpc_clusapi_CreateResource_r(b
, tctx
, &r
),
663 "CreateResource failed");
664 torture_assert_werr_ok(tctx
,
666 "CreateResource failed");
668 test_CloseGroup_int(tctx
, p
, &hGroup
);
673 static bool test_DeleteResource_int(struct torture_context
*tctx
,
674 struct dcerpc_pipe
*p
,
675 struct policy_handle
*hResource
)
677 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
678 struct clusapi_DeleteResource r
;
681 r
.in
.hResource
= *hResource
;
682 r
.out
.rpc_status
= &rpc_status
;
684 torture_assert_ntstatus_ok(tctx
,
685 dcerpc_clusapi_DeleteResource_r(b
, tctx
, &r
),
686 "DeleteResource failed");
687 torture_assert_werr_ok(tctx
,
689 "DeleteResource failed");
694 static bool test_CreateResource(struct torture_context
*tctx
,
697 struct torture_clusapi_context
*t
=
698 talloc_get_type_abort(data
, struct torture_clusapi_context
);
699 struct policy_handle hResource
;
701 if (!test_CreateResource_int(tctx
, t
->p
, &hResource
)) {
705 test_DeleteResource_int(tctx
, t
->p
, &hResource
);
710 static bool test_DeleteResource(struct torture_context
*tctx
,
713 struct torture_clusapi_context
*t
=
714 talloc_get_type_abort(data
, struct torture_clusapi_context
);
715 struct policy_handle hResource
;
717 if (!test_CreateResource_int(tctx
, t
->p
, &hResource
)) {
721 return test_DeleteResource_int(tctx
, t
->p
, &hResource
);
724 static bool test_SetResourceName_int(struct torture_context
*tctx
,
725 struct dcerpc_pipe
*p
,
726 struct policy_handle
*hResource
)
728 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
729 struct clusapi_SetResourceName r
;
732 r
.in
.hResource
= *hResource
;
733 r
.in
.lpszResourceName
= "wurst";
734 r
.out
.rpc_status
= &rpc_status
;
736 torture_assert_ntstatus_ok(tctx
,
737 dcerpc_clusapi_SetResourceName_r(b
, tctx
, &r
),
738 "SetResourceName failed");
739 torture_assert_werr_ok(tctx
,
741 "SetResourceName failed");
746 static bool test_SetResourceName(struct torture_context
*tctx
,
749 struct torture_clusapi_context
*t
=
750 talloc_get_type_abort(data
, struct torture_clusapi_context
);
751 struct policy_handle hResource
;
754 if (!test_CreateResource_int(tctx
, t
->p
, &hResource
)) {
758 ret
= test_SetResourceName_int(tctx
, t
->p
, &hResource
);
760 test_DeleteResource_int(tctx
, t
->p
, &hResource
);
765 static bool test_GetResourceState_int(struct torture_context
*tctx
,
766 struct dcerpc_pipe
*p
,
767 struct policy_handle
*hResource
)
769 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
770 struct clusapi_GetResourceState r
;
771 enum clusapi_ClusterResourceState State
;
772 const char *NodeName
;
773 const char *GroupName
;
776 r
.in
.hResource
= *hResource
;
777 r
.out
.State
= &State
;
778 r
.out
.NodeName
= &NodeName
;
779 r
.out
.GroupName
= &GroupName
;
780 r
.out
.rpc_status
= &rpc_status
;
782 torture_assert_ntstatus_ok(tctx
,
783 dcerpc_clusapi_GetResourceState_r(b
, tctx
, &r
),
784 "GetResourceState failed");
785 torture_assert_werr_ok(tctx
,
787 "GetResourceState failed");
792 static bool test_GetResourceState(struct torture_context
*tctx
,
795 struct torture_clusapi_context
*t
=
796 talloc_get_type_abort(data
, struct torture_clusapi_context
);
797 struct policy_handle hResource
;
800 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
804 ret
= test_GetResourceState_int(tctx
, t
->p
, &hResource
);
806 test_CloseResource_int(tctx
, t
->p
, &hResource
);
811 static bool test_GetResourceId_int(struct torture_context
*tctx
,
812 struct dcerpc_pipe
*p
,
813 struct policy_handle
*hResource
)
815 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
816 struct clusapi_GetResourceId r
;
820 r
.in
.hResource
= *hResource
;
821 r
.out
.pGuid
= &pGuid
;
822 r
.out
.rpc_status
= &rpc_status
;
824 torture_assert_ntstatus_ok(tctx
,
825 dcerpc_clusapi_GetResourceId_r(b
, tctx
, &r
),
826 "GetResourceId failed");
827 torture_assert_werr_ok(tctx
,
829 "GetResourceId failed");
834 static bool test_GetResourceId(struct torture_context
*tctx
,
837 struct torture_clusapi_context
*t
=
838 talloc_get_type_abort(data
, struct torture_clusapi_context
);
839 struct policy_handle hResource
;
842 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
846 ret
= test_GetResourceId_int(tctx
, t
->p
, &hResource
);
848 test_CloseResource_int(tctx
, t
->p
, &hResource
);
853 static bool test_GetResourceType_int(struct torture_context
*tctx
,
854 struct dcerpc_pipe
*p
,
855 struct policy_handle
*hResource
)
857 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
858 struct clusapi_GetResourceType r
;
859 const char *lpszResourceType
;
862 r
.in
.hResource
= *hResource
;
863 r
.out
.lpszResourceType
= &lpszResourceType
;
864 r
.out
.rpc_status
= &rpc_status
;
866 torture_assert_ntstatus_ok(tctx
,
867 dcerpc_clusapi_GetResourceType_r(b
, tctx
, &r
),
868 "GetResourceType failed");
869 torture_assert_werr_ok(tctx
,
871 "GetResourceType failed");
876 static bool test_GetResourceType(struct torture_context
*tctx
,
879 struct torture_clusapi_context
*t
=
880 talloc_get_type_abort(data
, struct torture_clusapi_context
);
881 struct policy_handle hResource
;
884 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
888 ret
= test_GetResourceType_int(tctx
, t
->p
, &hResource
);
890 test_CloseResource_int(tctx
, t
->p
, &hResource
);
895 static bool test_FailResource_int(struct torture_context
*tctx
,
896 struct dcerpc_pipe
*p
,
897 struct policy_handle
*hResource
)
899 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
900 struct clusapi_FailResource r
;
903 r
.in
.hResource
= *hResource
;
904 r
.out
.rpc_status
= &rpc_status
;
906 torture_assert_ntstatus_ok(tctx
,
907 dcerpc_clusapi_FailResource_r(b
, tctx
, &r
),
908 "FailResource failed");
909 torture_assert_werr_ok(tctx
,
911 "FailResource failed");
916 static bool test_FailResource(struct torture_context
*tctx
,
919 struct torture_clusapi_context
*t
=
920 talloc_get_type_abort(data
, struct torture_clusapi_context
);
921 struct policy_handle hResource
;
924 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
928 ret
= test_FailResource_int(tctx
, t
->p
, &hResource
);
930 test_CloseResource_int(tctx
, t
->p
, &hResource
);
935 bool test_OnlineResource_int(struct torture_context
*tctx
,
936 struct dcerpc_pipe
*p
,
937 struct policy_handle
*hResource
)
939 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
940 struct clusapi_OnlineResource r
;
943 r
.in
.hResource
= *hResource
;
944 r
.out
.rpc_status
= &rpc_status
;
946 torture_assert_ntstatus_ok(tctx
,
947 dcerpc_clusapi_OnlineResource_r(b
, tctx
, &r
),
948 "OnlineResource failed");
949 if (!W_ERROR_IS_OK(r
.out
.result
) &&
950 !W_ERROR_EQUAL(r
.out
.result
, WERR_IO_PENDING
)) {
951 torture_result(tctx
, TORTURE_FAIL
,
952 "OnlineResource failed with %s",
953 win_errstr(r
.out
.result
));
960 static bool test_OnlineResource(struct torture_context
*tctx
,
963 struct torture_clusapi_context
*t
=
964 talloc_get_type_abort(data
, struct torture_clusapi_context
);
965 struct policy_handle hResource
;
968 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
972 ret
= test_OnlineResource_int(tctx
, t
->p
, &hResource
);
974 test_CloseResource_int(tctx
, t
->p
, &hResource
);
979 bool test_OfflineResource_int(struct torture_context
*tctx
,
980 struct dcerpc_pipe
*p
,
981 struct policy_handle
*hResource
)
983 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
984 struct clusapi_OfflineResource r
;
987 r
.in
.hResource
= *hResource
;
988 r
.out
.rpc_status
= &rpc_status
;
990 torture_assert_ntstatus_ok(tctx
,
991 dcerpc_clusapi_OfflineResource_r(b
, tctx
, &r
),
992 "OfflineResource failed");
993 if (!W_ERROR_IS_OK(r
.out
.result
) &&
994 !W_ERROR_EQUAL(r
.out
.result
, WERR_IO_PENDING
)) {
995 torture_result(tctx
, TORTURE_FAIL
,
996 "OfflineResource failed with %s",
997 win_errstr(r
.out
.result
));
1004 static bool test_OfflineResource(struct torture_context
*tctx
,
1007 struct torture_clusapi_context
*t
=
1008 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1009 struct policy_handle hResource
;
1012 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
1016 ret
= test_OfflineResource_int(tctx
, t
->p
, &hResource
);
1018 test_CloseResource_int(tctx
, t
->p
, &hResource
);
1023 static bool test_CreateResEnum_int(struct torture_context
*tctx
,
1024 struct dcerpc_pipe
*p
,
1025 struct policy_handle
*hResource
)
1027 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1028 struct clusapi_CreateResEnum r
;
1029 uint32_t dwType
= CLUSTER_ENUM_RESOURCE
;
1030 struct ENUM_LIST
*ReturnEnum
;
1033 r
.in
.hResource
= *hResource
;
1034 r
.in
.dwType
= dwType
;
1035 r
.out
.ReturnEnum
= &ReturnEnum
;
1036 r
.out
.rpc_status
= &rpc_status
;
1038 torture_assert_ntstatus_ok(tctx
,
1039 dcerpc_clusapi_CreateResEnum_r(b
, tctx
, &r
),
1040 "CreateResEnum failed");
1041 torture_assert_werr_ok(tctx
,
1043 "CreateResEnum failed");
1048 static bool test_CreateResEnum(struct torture_context
*tctx
,
1051 struct torture_clusapi_context
*t
=
1052 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1053 struct policy_handle hResource
;
1056 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
1060 ret
= test_CreateResEnum_int(tctx
, t
->p
, &hResource
);
1062 test_CloseResource_int(tctx
, t
->p
, &hResource
);
1067 static bool test_GetResourceDependencyExpression_int(struct torture_context
*tctx
,
1068 struct dcerpc_pipe
*p
,
1069 struct policy_handle
*hResource
)
1071 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1072 struct clusapi_GetResourceDependencyExpression r
;
1073 const char *lpszDependencyExpression
;
1076 r
.in
.hResource
= *hResource
;
1077 r
.out
.lpszDependencyExpression
= &lpszDependencyExpression
;
1078 r
.out
.rpc_status
= &rpc_status
;
1080 torture_assert_ntstatus_ok(tctx
,
1081 dcerpc_clusapi_GetResourceDependencyExpression_r(b
, tctx
, &r
),
1082 "GetResourceDependencyExpression failed");
1083 torture_assert_werr_ok(tctx
,
1085 "GetResourceDependencyExpression failed");
1090 static bool test_GetResourceDependencyExpression(struct torture_context
*tctx
,
1093 struct torture_clusapi_context
*t
=
1094 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1095 struct policy_handle hResource
;
1098 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
1102 ret
= test_GetResourceDependencyExpression_int(tctx
, t
->p
, &hResource
);
1104 test_CloseResource_int(tctx
, t
->p
, &hResource
);
1109 static bool test_GetResourceNetworkName_int(struct torture_context
*tctx
,
1110 struct dcerpc_pipe
*p
,
1111 struct policy_handle
*hResource
)
1113 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1114 struct clusapi_GetResourceNetworkName r
;
1115 const char *lpszName
;
1118 r
.in
.hResource
= *hResource
;
1119 r
.out
.lpszName
= &lpszName
;
1120 r
.out
.rpc_status
= &rpc_status
;
1122 torture_assert_ntstatus_ok(tctx
,
1123 dcerpc_clusapi_GetResourceNetworkName_r(b
, tctx
, &r
),
1124 "GetResourceNetworkName failed");
1125 torture_assert_werr_ok(tctx
,
1127 "GetResourceNetworkName failed");
1132 static bool test_GetResourceNetworkName(struct torture_context
*tctx
,
1135 struct torture_clusapi_context
*t
=
1136 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1137 struct policy_handle hResource
;
1140 if (!test_OpenResource_int(tctx
, t
->p
, "Network Name", &hResource
)) {
1144 ret
= test_GetResourceNetworkName_int(tctx
, t
->p
, &hResource
);
1146 test_CloseResource_int(tctx
, t
->p
, &hResource
);
1151 static bool test_one_resource(struct torture_context
*tctx
,
1152 struct dcerpc_pipe
*p
,
1153 const char *resource_name
)
1155 struct policy_handle hResource
;
1157 torture_assert(tctx
,
1158 test_OpenResource_int(tctx
, p
, resource_name
, &hResource
),
1159 "failed to open resource");
1160 test_CloseResource_int(tctx
, p
, &hResource
);
1162 torture_assert(tctx
,
1163 test_OpenResourceEx_int(tctx
, p
, resource_name
, &hResource
),
1164 "failed to openex resource");
1166 torture_assert(tctx
,
1167 test_GetResourceType_int(tctx
, p
, &hResource
),
1168 "failed to query resource type");
1169 torture_assert(tctx
,
1170 test_GetResourceId_int(tctx
, p
, &hResource
),
1171 "failed to query resource id");
1172 torture_assert(tctx
,
1173 test_GetResourceState_int(tctx
, p
, &hResource
),
1174 "failed to query resource state");
1175 torture_assert(tctx
,
1176 test_CreateResEnum_int(tctx
, p
, &hResource
),
1177 "failed to query resource enum");
1178 torture_assert(tctx
,
1179 test_GetResourceDependencyExpression_int(tctx
, p
, &hResource
),
1180 "failed to query resource dependency expression");
1181 torture_assert(tctx
,
1182 test_GetResourceNetworkName_int(tctx
, p
, &hResource
),
1183 "failed to query resource network name");
1185 test_CloseResource_int(tctx
, p
, &hResource
);
1190 static bool test_all_resources(struct torture_context
*tctx
,
1193 struct torture_clusapi_context
*t
=
1194 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1195 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
1196 struct clusapi_CreateEnum r
;
1197 uint32_t dwType
= CLUSTER_ENUM_RESOURCE
;
1198 struct ENUM_LIST
*ReturnEnum
;
1202 r
.in
.dwType
= dwType
;
1203 r
.out
.ReturnEnum
= &ReturnEnum
;
1204 r
.out
.rpc_status
= &rpc_status
;
1206 torture_assert_ntstatus_ok(tctx
,
1207 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
1208 "CreateEnum failed");
1209 torture_assert_werr_ok(tctx
,
1211 "CreateEnum failed");
1213 for (i
=0; i
< ReturnEnum
->EntryCount
; i
++) {
1215 struct ENUM_ENTRY e
= ReturnEnum
->Entry
[i
];
1217 torture_assert_int_equal(tctx
, e
.Type
, CLUSTER_ENUM_RESOURCE
, "type mismatch");
1219 torture_assert(tctx
,
1220 test_one_resource(tctx
, t
->p
, e
.Name
),
1221 "failed to test one resource");
1227 static bool test_OpenNode_int(struct torture_context
*tctx
,
1228 struct dcerpc_pipe
*p
,
1229 const char *lpszNodeName
,
1230 struct policy_handle
*hNode
)
1232 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1233 struct clusapi_OpenNode r
;
1237 r
.in
.lpszNodeName
= lpszNodeName
;
1238 r
.out
.rpc_status
= &rpc_status
;
1239 r
.out
.Status
= &Status
;
1242 torture_assert_ntstatus_ok(tctx
,
1243 dcerpc_clusapi_OpenNode_r(b
, tctx
, &r
),
1245 torture_assert_werr_ok(tctx
,
1252 static bool test_OpenNodeEx_int(struct torture_context
*tctx
,
1253 struct dcerpc_pipe
*p
,
1254 const char *lpszNodeName
,
1255 struct policy_handle
*hNode
)
1257 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1258 struct clusapi_OpenNodeEx r
;
1259 uint32_t lpdwGrantedAccess
;
1263 r
.in
.lpszNodeName
= lpszNodeName
;
1264 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
1265 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
1266 r
.out
.rpc_status
= &rpc_status
;
1267 r
.out
.Status
= &Status
;
1270 torture_assert_ntstatus_ok(tctx
,
1271 dcerpc_clusapi_OpenNodeEx_r(b
, tctx
, &r
),
1272 "OpenNodeEx failed");
1273 torture_assert_werr_ok(tctx
,
1275 "OpenNodeEx failed");
1281 static bool test_CloseNode_int(struct torture_context
*tctx
,
1282 struct dcerpc_pipe
*p
,
1283 struct policy_handle
*Node
)
1285 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1286 struct clusapi_CloseNode r
;
1291 torture_assert_ntstatus_ok(tctx
,
1292 dcerpc_clusapi_CloseNode_r(b
, tctx
, &r
),
1293 "CloseNode failed");
1294 torture_assert_werr_ok(tctx
,
1296 "CloseNode failed");
1297 torture_assert(tctx
,
1298 ndr_policy_handle_empty(Node
),
1299 "policy_handle non empty after CloseNode");
1304 static bool test_OpenNode(struct torture_context
*tctx
,
1307 struct torture_clusapi_context
*t
=
1308 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1309 struct policy_handle hNode
;
1311 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1315 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1320 static bool test_OpenNodeEx(struct torture_context
*tctx
,
1323 struct torture_clusapi_context
*t
=
1324 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1325 struct policy_handle hNode
;
1327 if (!test_OpenNodeEx_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1331 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1336 static bool test_CloseNode(struct torture_context
*tctx
,
1339 struct torture_clusapi_context
*t
=
1340 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1341 struct policy_handle hNode
;
1343 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1347 return test_CloseNode_int(tctx
, t
->p
, &hNode
);
1350 static bool test_GetNodeState_int(struct torture_context
*tctx
,
1351 struct dcerpc_pipe
*p
,
1352 struct policy_handle
*hNode
)
1354 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1355 struct clusapi_GetNodeState r
;
1356 enum clusapi_ClusterNodeState State
;
1359 r
.in
.hNode
= *hNode
;
1360 r
.out
.State
= &State
;
1361 r
.out
.rpc_status
= &rpc_status
;
1363 torture_assert_ntstatus_ok(tctx
,
1364 dcerpc_clusapi_GetNodeState_r(b
, tctx
, &r
),
1365 "GetNodeState failed");
1366 torture_assert_werr_ok(tctx
,
1368 "GetNodeState failed");
1373 static bool test_GetNodeState(struct torture_context
*tctx
,
1376 struct torture_clusapi_context
*t
=
1377 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1378 struct policy_handle hNode
;
1381 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1385 ret
= test_GetNodeState_int(tctx
, t
->p
, &hNode
);
1387 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1392 static bool test_GetNodeId_int(struct torture_context
*tctx
,
1393 struct dcerpc_pipe
*p
,
1394 struct policy_handle
*hNode
)
1396 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1397 struct clusapi_GetNodeId r
;
1401 r
.in
.hNode
= *hNode
;
1402 r
.out
.pGuid
= &pGuid
;
1403 r
.out
.rpc_status
= &rpc_status
;
1405 torture_assert_ntstatus_ok(tctx
,
1406 dcerpc_clusapi_GetNodeId_r(b
, tctx
, &r
),
1407 "GetNodeId failed");
1408 torture_assert_werr_ok(tctx
,
1410 "GetNodeId failed");
1415 static bool test_GetNodeId(struct torture_context
*tctx
,
1418 struct torture_clusapi_context
*t
=
1419 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1420 struct policy_handle hNode
;
1423 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1427 ret
= test_GetNodeId_int(tctx
, t
->p
, &hNode
);
1429 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1434 static bool test_NodeControl_int(struct torture_context
*tctx
,
1435 struct dcerpc_pipe
*p
,
1436 struct policy_handle
*hNode
,
1437 enum clusapi_NodeControlCode dwControlCode
)
1439 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1440 struct clusapi_NodeControl r
;
1441 uint32_t lpBytesReturned
;
1442 uint32_t lpcbRequired
;
1445 r
.in
.hNode
= *hNode
;
1446 r
.in
.dwControlCode
= 0;
1447 r
.in
.lpInBuffer
= NULL
;
1448 r
.in
.nInBufferSize
= 0;
1449 r
.in
.nOutBufferSize
= 0;
1450 r
.out
.lpOutBuffer
= NULL
;
1451 r
.out
.lpBytesReturned
= &lpBytesReturned
;
1452 r
.out
.lpcbRequired
= &lpcbRequired
;
1453 r
.out
.rpc_status
= &rpc_status
;
1455 torture_assert_ntstatus_ok(tctx
,
1456 dcerpc_clusapi_NodeControl_r(b
, tctx
, &r
),
1457 "NodeControl failed");
1458 torture_assert_werr_equal(tctx
,
1460 WERR_INVALID_FUNCTION
,
1461 "NodeControl failed");
1463 r
.in
.dwControlCode
= dwControlCode
;
1465 torture_assert_ntstatus_ok(tctx
,
1466 dcerpc_clusapi_NodeControl_r(b
, tctx
, &r
),
1467 "NodeControl failed");
1469 if (W_ERROR_EQUAL(r
.out
.result
, WERR_MORE_DATA
)) {
1470 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, *r
.out
.lpcbRequired
);
1471 r
.in
.nOutBufferSize
= *r
.out
.lpcbRequired
;
1472 torture_assert_ntstatus_ok(tctx
,
1473 dcerpc_clusapi_NodeControl_r(b
, tctx
, &r
),
1474 "NodeControl failed");
1476 torture_assert_werr_ok(tctx
,
1478 "NodeControl failed");
1480 /* now try what happens when we query with a buffer large enough to hold
1481 * the entire packet */
1483 r
.in
.nOutBufferSize
= 0x400;
1484 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, r
.in
.nOutBufferSize
);
1486 torture_assert_ntstatus_ok(tctx
,
1487 dcerpc_clusapi_NodeControl_r(b
, tctx
, &r
),
1488 "NodeControl failed");
1489 torture_assert_werr_ok(tctx
,
1491 "NodeControl failed");
1492 torture_assert(tctx
, *r
.out
.lpBytesReturned
< r
.in
.nOutBufferSize
,
1493 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
1495 if (dwControlCode
== CLUSCTL_NODE_GET_ID
) {
1497 DATA_BLOB blob
= data_blob_const(r
.out
.lpOutBuffer
, *r
.out
.lpBytesReturned
);
1499 torture_assert(tctx
, *r
.out
.lpBytesReturned
< 4, "unexpected size");
1500 torture_assert(tctx
, *r
.out
.lpBytesReturned
% 2, "must be a multiple of 2");
1502 torture_assert(tctx
,
1503 pull_reg_sz(tctx
, &blob
, &str
),
1504 "failed to pull unicode string");
1506 torture_comment(tctx
, "got this node id: '%s'", str
);
1512 static bool test_NodeControl(struct torture_context
*tctx
,
1515 struct torture_clusapi_context
*t
=
1516 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1517 struct policy_handle hNode
;
1520 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1524 ret
= test_NodeControl_int(tctx
, t
->p
, &hNode
, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES
);
1529 ret
= test_NodeControl_int(tctx
, t
->p
, &hNode
, CLUSCTL_NODE_GET_ID
);
1534 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1539 static bool test_PauseNode_int(struct torture_context
*tctx
,
1540 struct dcerpc_pipe
*p
,
1541 struct policy_handle
*hNode
)
1543 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1544 struct clusapi_PauseNode r
;
1547 r
.in
.hNode
= *hNode
;
1548 r
.out
.rpc_status
= &rpc_status
;
1550 torture_assert_ntstatus_ok(tctx
,
1551 dcerpc_clusapi_PauseNode_r(b
, tctx
, &r
),
1552 "PauseNode failed");
1553 torture_assert_werr_ok(tctx
,
1555 "PauseNode failed");
1560 static bool test_PauseNode(struct torture_context
*tctx
,
1563 struct torture_clusapi_context
*t
=
1564 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1565 struct policy_handle hNode
;
1568 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1572 ret
= test_PauseNode_int(tctx
, t
->p
, &hNode
);
1574 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1579 static bool test_ResumeNode_int(struct torture_context
*tctx
,
1580 struct dcerpc_pipe
*p
,
1581 struct policy_handle
*hNode
)
1583 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1584 struct clusapi_ResumeNode r
;
1587 r
.in
.hNode
= *hNode
;
1588 r
.out
.rpc_status
= &rpc_status
;
1590 torture_assert_ntstatus_ok(tctx
,
1591 dcerpc_clusapi_ResumeNode_r(b
, tctx
, &r
),
1592 "ResumeNode failed");
1593 torture_assert_werr_equal(tctx
,
1595 WERR_CLUSTER_NODE_NOT_PAUSED
,
1596 "ResumeNode gave unexpected result");
1601 static bool test_ResumeNode(struct torture_context
*tctx
,
1604 struct torture_clusapi_context
*t
=
1605 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1606 struct policy_handle hNode
;
1609 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1613 ret
= test_ResumeNode_int(tctx
, t
->p
, &hNode
);
1615 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1620 static bool test_EvictNode_int(struct torture_context
*tctx
,
1621 struct dcerpc_pipe
*p
,
1622 struct policy_handle
*hNode
)
1624 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1625 struct clusapi_EvictNode r
;
1628 r
.in
.hNode
= *hNode
;
1629 r
.out
.rpc_status
= &rpc_status
;
1631 torture_assert_ntstatus_ok(tctx
,
1632 dcerpc_clusapi_EvictNode_r(b
, tctx
, &r
),
1633 "EvictNode failed");
1634 torture_assert_werr_ok(tctx
,
1636 "EvictNode failed");
1641 static bool test_EvictNode(struct torture_context
*tctx
,
1644 struct torture_clusapi_context
*t
=
1645 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1646 struct policy_handle hNode
;
1649 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1653 ret
= test_EvictNode_int(tctx
, t
->p
, &hNode
);
1655 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1660 static bool test_one_node(struct torture_context
*tctx
,
1661 struct dcerpc_pipe
*p
,
1662 const char *node_name
)
1664 struct policy_handle hNode
;
1666 torture_assert(tctx
,
1667 test_OpenNode_int(tctx
, p
, node_name
, &hNode
),
1668 "failed to open node");
1669 test_CloseNode_int(tctx
, p
, &hNode
);
1671 torture_assert(tctx
,
1672 test_OpenNodeEx_int(tctx
, p
, node_name
, &hNode
),
1673 "failed to openex node");
1675 torture_assert(tctx
,
1676 test_GetNodeId_int(tctx
, p
, &hNode
),
1677 "failed to query node id");
1678 torture_assert(tctx
,
1679 test_GetNodeState_int(tctx
, p
, &hNode
),
1680 "failed to query node id");
1682 test_CloseNode_int(tctx
, p
, &hNode
);
1687 static bool test_all_nodes(struct torture_context
*tctx
,
1690 struct torture_clusapi_context
*t
=
1691 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1692 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
1693 struct clusapi_CreateEnum r
;
1694 uint32_t dwType
= CLUSTER_ENUM_NODE
;
1695 struct ENUM_LIST
*ReturnEnum
;
1699 r
.in
.dwType
= dwType
;
1700 r
.out
.ReturnEnum
= &ReturnEnum
;
1701 r
.out
.rpc_status
= &rpc_status
;
1703 torture_assert_ntstatus_ok(tctx
,
1704 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
1705 "CreateEnum failed");
1706 torture_assert_werr_ok(tctx
,
1708 "CreateEnum failed");
1710 for (i
=0; i
< ReturnEnum
->EntryCount
; i
++) {
1712 struct ENUM_ENTRY e
= ReturnEnum
->Entry
[i
];
1714 torture_assert_int_equal(tctx
, e
.Type
, CLUSTER_ENUM_NODE
, "type mismatch");
1716 torture_assert(tctx
,
1717 test_one_node(tctx
, t
->p
, e
.Name
),
1718 "failed to test one node");
1724 static bool test_OpenGroup_int(struct torture_context
*tctx
,
1725 struct dcerpc_pipe
*p
,
1726 const char *lpszGroupName
,
1727 struct policy_handle
*hGroup
)
1729 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1730 struct clusapi_OpenGroup r
;
1734 r
.in
.lpszGroupName
= lpszGroupName
;
1735 r
.out
.rpc_status
= &rpc_status
;
1736 r
.out
.Status
= &Status
;
1737 r
.out
.hGroup
= hGroup
;
1739 torture_assert_ntstatus_ok(tctx
,
1740 dcerpc_clusapi_OpenGroup_r(b
, tctx
, &r
),
1741 "OpenGroup failed");
1742 torture_assert_werr_ok(tctx
,
1744 "OpenGroup failed");
1749 static bool test_OpenGroupEx_int(struct torture_context
*tctx
,
1750 struct dcerpc_pipe
*p
,
1751 const char *lpszGroupName
,
1752 struct policy_handle
*hGroup
)
1754 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1755 struct clusapi_OpenGroupEx r
;
1756 uint32_t lpdwGrantedAccess
;
1760 r
.in
.lpszGroupName
= lpszGroupName
;
1761 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
1762 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
1763 r
.out
.rpc_status
= &rpc_status
;
1764 r
.out
.Status
= &Status
;
1765 r
.out
.hGroup
= hGroup
;
1767 torture_assert_ntstatus_ok(tctx
,
1768 dcerpc_clusapi_OpenGroupEx_r(b
, tctx
, &r
),
1769 "OpenGroupEx failed");
1770 torture_assert_werr_ok(tctx
,
1772 "OpenGroupEx failed");
1777 static bool test_CloseGroup_int(struct torture_context
*tctx
,
1778 struct dcerpc_pipe
*p
,
1779 struct policy_handle
*Group
)
1781 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1782 struct clusapi_CloseGroup r
;
1785 r
.out
.Group
= Group
;
1787 torture_assert_ntstatus_ok(tctx
,
1788 dcerpc_clusapi_CloseGroup_r(b
, tctx
, &r
),
1789 "CloseGroup failed");
1790 torture_assert_werr_ok(tctx
,
1792 "CloseGroup failed");
1793 torture_assert(tctx
,
1794 ndr_policy_handle_empty(Group
),
1795 "policy_handle non empty after CloseGroup");
1800 static bool test_OpenGroup(struct torture_context
*tctx
,
1803 struct torture_clusapi_context
*t
=
1804 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1805 struct policy_handle hGroup
;
1807 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1811 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1816 static bool test_OpenGroupEx(struct torture_context
*tctx
,
1819 struct torture_clusapi_context
*t
=
1820 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1821 struct policy_handle hGroup
;
1823 if (!test_OpenGroupEx_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1827 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1832 static bool test_CloseGroup(struct torture_context
*tctx
,
1835 struct torture_clusapi_context
*t
=
1836 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1837 struct policy_handle hGroup
;
1839 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1843 return test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1846 static bool test_GetGroupState_int(struct torture_context
*tctx
,
1847 struct dcerpc_pipe
*p
,
1848 struct policy_handle
*hGroup
)
1850 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1851 struct clusapi_GetGroupState r
;
1852 enum clusapi_ClusterGroupState State
;
1853 const char *NodeName
;
1856 r
.in
.hGroup
= *hGroup
;
1857 r
.out
.State
= &State
;
1858 r
.out
.NodeName
= &NodeName
;
1859 r
.out
.rpc_status
= &rpc_status
;
1861 torture_assert_ntstatus_ok(tctx
,
1862 dcerpc_clusapi_GetGroupState_r(b
, tctx
, &r
),
1863 "GetGroupState failed");
1864 torture_assert_werr_ok(tctx
,
1866 "GetGroupState failed");
1871 static bool test_GetGroupState(struct torture_context
*tctx
,
1874 struct torture_clusapi_context
*t
=
1875 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1876 struct policy_handle hGroup
;
1879 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1883 ret
= test_GetGroupState_int(tctx
, t
->p
, &hGroup
);
1885 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1890 static bool test_GetGroupId_int(struct torture_context
*tctx
,
1891 struct dcerpc_pipe
*p
,
1892 struct policy_handle
*hGroup
)
1894 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1895 struct clusapi_GetGroupId r
;
1899 r
.in
.hGroup
= *hGroup
;
1900 r
.out
.pGuid
= &pGuid
;
1901 r
.out
.rpc_status
= &rpc_status
;
1903 torture_assert_ntstatus_ok(tctx
,
1904 dcerpc_clusapi_GetGroupId_r(b
, tctx
, &r
),
1905 "GetGroupId failed");
1906 torture_assert_werr_ok(tctx
,
1908 "GetGroupId failed");
1913 static bool test_GetGroupId(struct torture_context
*tctx
,
1916 struct torture_clusapi_context
*t
=
1917 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1918 struct policy_handle hGroup
;
1921 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1925 ret
= test_GetGroupId_int(tctx
, t
->p
, &hGroup
);
1927 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1932 static bool test_GroupControl_int(struct torture_context
*tctx
,
1933 struct dcerpc_pipe
*p
,
1934 struct policy_handle
*hGroup
,
1935 enum clusapi_GroupControlCode dwControlCode
)
1937 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
1938 struct clusapi_GroupControl r
;
1939 uint32_t lpBytesReturned
;
1940 uint32_t lpcbRequired
;
1943 r
.in
.hGroup
= *hGroup
;
1944 r
.in
.dwControlCode
= 0;
1945 r
.in
.lpInBuffer
= NULL
;
1946 r
.in
.nInBufferSize
= 0;
1947 r
.in
.nOutBufferSize
= 0;
1948 r
.out
.lpOutBuffer
= NULL
;
1949 r
.out
.lpBytesReturned
= &lpBytesReturned
;
1950 r
.out
.lpcbRequired
= &lpcbRequired
;
1951 r
.out
.rpc_status
= &rpc_status
;
1953 torture_assert_ntstatus_ok(tctx
,
1954 dcerpc_clusapi_GroupControl_r(b
, tctx
, &r
),
1955 "GroupControl failed");
1956 torture_assert_werr_equal(tctx
,
1958 WERR_INVALID_FUNCTION
,
1959 "GroupControl failed");
1961 r
.in
.dwControlCode
= dwControlCode
;
1963 torture_assert_ntstatus_ok(tctx
,
1964 dcerpc_clusapi_GroupControl_r(b
, tctx
, &r
),
1965 "GroupControl failed");
1967 if (W_ERROR_EQUAL(r
.out
.result
, WERR_MORE_DATA
)) {
1968 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, *r
.out
.lpcbRequired
);
1969 r
.in
.nOutBufferSize
= *r
.out
.lpcbRequired
;
1970 torture_assert_ntstatus_ok(tctx
,
1971 dcerpc_clusapi_GroupControl_r(b
, tctx
, &r
),
1972 "GroupControl failed");
1974 torture_assert_werr_ok(tctx
,
1976 "GroupControl failed");
1978 /* now try what happens when we query with a buffer large enough to hold
1979 * the entire packet */
1981 r
.in
.nOutBufferSize
= 0x400;
1982 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, r
.in
.nOutBufferSize
);
1984 torture_assert_ntstatus_ok(tctx
,
1985 dcerpc_clusapi_GroupControl_r(b
, tctx
, &r
),
1986 "GroupControl failed");
1987 torture_assert_werr_ok(tctx
,
1989 "GroupControl failed");
1990 torture_assert(tctx
, *r
.out
.lpBytesReturned
< r
.in
.nOutBufferSize
,
1991 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
1996 static bool test_GroupControl(struct torture_context
*tctx
,
1999 struct torture_clusapi_context
*t
=
2000 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2001 struct policy_handle hGroup
;
2004 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
2008 ret
= test_GroupControl_int(tctx
, t
->p
, &hGroup
, CLUSCTL_GROUP_GET_CHARACTERISTICS
);
2013 ret
= test_GroupControl_int(tctx
, t
->p
, &hGroup
, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES
);
2018 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
2023 static bool test_OnlineGroup_int(struct torture_context
*tctx
,
2024 struct dcerpc_pipe
*p
,
2025 struct policy_handle
*hGroup
)
2027 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2028 struct clusapi_OnlineGroup r
;
2031 r
.in
.hGroup
= *hGroup
;
2032 r
.out
.rpc_status
= &rpc_status
;
2034 torture_assert_ntstatus_ok(tctx
,
2035 dcerpc_clusapi_OnlineGroup_r(b
, tctx
, &r
),
2036 "OnlineGroup failed");
2037 torture_assert_werr_ok(tctx
,
2039 "OnlineGroup failed");
2044 static bool test_OnlineGroup(struct torture_context
*tctx
,
2047 struct torture_clusapi_context
*t
=
2048 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2049 struct policy_handle hGroup
;
2052 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
2056 ret
= test_OnlineGroup_int(tctx
, t
->p
, &hGroup
);
2058 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
2063 static bool test_OfflineGroup_int(struct torture_context
*tctx
,
2064 struct dcerpc_pipe
*p
,
2065 struct policy_handle
*hGroup
)
2067 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2068 struct clusapi_OfflineGroup r
;
2071 r
.in
.hGroup
= *hGroup
;
2072 r
.out
.rpc_status
= &rpc_status
;
2074 torture_assert_ntstatus_ok(tctx
,
2075 dcerpc_clusapi_OfflineGroup_r(b
, tctx
, &r
),
2076 "OfflineGroup failed");
2077 torture_assert_werr_ok(tctx
,
2079 "OfflineGroup failed");
2084 static bool test_OfflineGroup(struct torture_context
*tctx
,
2087 struct torture_clusapi_context
*t
=
2088 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2089 struct policy_handle hGroup
;
2092 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
2096 ret
= test_OfflineGroup_int(tctx
, t
->p
, &hGroup
);
2098 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
2103 static bool test_one_group(struct torture_context
*tctx
,
2104 struct dcerpc_pipe
*p
,
2105 const char *node_name
)
2107 struct policy_handle hGroup
;
2109 torture_assert(tctx
,
2110 test_OpenGroup_int(tctx
, p
, node_name
, &hGroup
),
2111 "failed to open group");
2112 test_CloseGroup_int(tctx
, p
, &hGroup
);
2114 torture_assert(tctx
,
2115 test_OpenGroupEx_int(tctx
, p
, node_name
, &hGroup
),
2116 "failed to openex group");
2118 torture_assert(tctx
,
2119 test_GetGroupId_int(tctx
, p
, &hGroup
),
2120 "failed to query group id");
2121 torture_assert(tctx
,
2122 test_GetGroupState_int(tctx
, p
, &hGroup
),
2123 "failed to query group id");
2125 test_CloseGroup_int(tctx
, p
, &hGroup
);
2130 static bool test_all_groups(struct torture_context
*tctx
,
2133 struct torture_clusapi_context
*t
=
2134 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2135 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
2136 struct clusapi_CreateEnum r
;
2137 uint32_t dwType
= CLUSTER_ENUM_GROUP
;
2138 struct ENUM_LIST
*ReturnEnum
;
2142 r
.in
.dwType
= dwType
;
2143 r
.out
.ReturnEnum
= &ReturnEnum
;
2144 r
.out
.rpc_status
= &rpc_status
;
2146 torture_assert_ntstatus_ok(tctx
,
2147 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
2148 "CreateEnum failed");
2149 torture_assert_werr_ok(tctx
,
2151 "CreateEnum failed");
2153 for (i
=0; i
< ReturnEnum
->EntryCount
; i
++) {
2155 struct ENUM_ENTRY e
= ReturnEnum
->Entry
[i
];
2157 torture_assert_int_equal(tctx
, e
.Type
, CLUSTER_ENUM_GROUP
, "type mismatch");
2159 torture_assert(tctx
,
2160 test_one_group(tctx
, t
->p
, e
.Name
),
2161 "failed to test one group");
2167 static bool test_BackupClusterDatabase(struct torture_context
*tctx
,
2170 struct torture_clusapi_context
*t
=
2171 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2172 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
2173 struct clusapi_BackupClusterDatabase r
;
2176 r
.in
.lpszPathName
= "c:\\cluster_backup";
2177 r
.out
.rpc_status
= &rpc_status
;
2179 torture_assert_ntstatus_ok(tctx
,
2180 dcerpc_clusapi_BackupClusterDatabase_r(b
, tctx
, &r
),
2181 "BackupClusterDatabase failed");
2182 torture_assert_werr_equal(tctx
,
2184 WERR_CALL_NOT_IMPLEMENTED
,
2185 "BackupClusterDatabase failed");
2190 static bool test_SetServiceAccountPassword(struct torture_context
*tctx
,
2193 struct torture_clusapi_context
*t
=
2194 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2195 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
2196 struct clusapi_SetServiceAccountPassword r
;
2197 uint32_t SizeReturned
;
2198 uint32_t ExpectedBufferSize
;
2200 r
.in
.lpszNewPassword
= "P@ssw0rd!";
2201 r
.in
.dwFlags
= IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES
;
2202 r
.in
.ReturnStatusBufferSize
= 1024;
2203 r
.out
.ReturnStatusBufferPtr
= NULL
;
2204 r
.out
.SizeReturned
= &SizeReturned
;
2205 r
.out
.ExpectedBufferSize
= &ExpectedBufferSize
;
2207 torture_assert_ntstatus_ok(tctx
,
2208 dcerpc_clusapi_SetServiceAccountPassword_r(b
, tctx
, &r
),
2209 "SetServiceAccountPassword failed");
2210 torture_assert_werr_equal(tctx
,
2212 WERR_CALL_NOT_IMPLEMENTED
,
2213 "SetServiceAccountPassword failed");
2218 static bool test_ClusterControl_int(struct torture_context
*tctx
,
2219 struct dcerpc_pipe
*p
,
2220 struct policy_handle
*Cluster
)
2222 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2223 struct clusapi_ClusterControl r
;
2224 uint32_t lpBytesReturned
;
2225 uint32_t lpcbRequired
;
2228 r
.in
.hCluster
= *Cluster
;
2229 r
.in
.dwControlCode
= 0;
2230 r
.in
.lpInBuffer
= NULL
;
2231 r
.in
.nInBufferSize
= 0;
2232 r
.in
.nOutBufferSize
= 0;
2233 r
.out
.lpOutBuffer
= NULL
;
2234 r
.out
.lpBytesReturned
= &lpBytesReturned
;
2235 r
.out
.lpcbRequired
= &lpcbRequired
;
2236 r
.out
.rpc_status
= &rpc_status
;
2238 torture_assert_ntstatus_ok(tctx
,
2239 dcerpc_clusapi_ClusterControl_r(b
, tctx
, &r
),
2240 "ClusterControl failed");
2241 torture_assert_werr_equal(tctx
,
2243 WERR_INVALID_FUNCTION
,
2244 "ClusterControl failed");
2246 r
.in
.dwControlCode
= CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES
;
2248 torture_assert_ntstatus_ok(tctx
,
2249 dcerpc_clusapi_ClusterControl_r(b
, tctx
, &r
),
2250 "ClusterControl failed");
2252 if (W_ERROR_EQUAL(r
.out
.result
, WERR_MORE_DATA
)) {
2253 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, *r
.out
.lpcbRequired
);
2254 r
.in
.nOutBufferSize
= *r
.out
.lpcbRequired
;
2255 torture_assert_ntstatus_ok(tctx
,
2256 dcerpc_clusapi_ClusterControl_r(b
, tctx
, &r
),
2257 "ClusterControl failed");
2259 torture_assert_werr_ok(tctx
,
2261 "ClusterControl failed");
2263 /* now try what happens when we query with a buffer large enough to hold
2264 * the entire packet */
2266 r
.in
.nOutBufferSize
= 0x400;
2267 r
.out
.lpOutBuffer
= talloc_zero_array(tctx
, uint8_t, r
.in
.nOutBufferSize
);
2269 torture_assert_ntstatus_ok(tctx
,
2270 dcerpc_clusapi_ClusterControl_r(b
, tctx
, &r
),
2271 "ClusterControl failed");
2272 torture_assert_werr_ok(tctx
,
2274 "ClusterControl failed");
2275 torture_assert(tctx
, *r
.out
.lpBytesReturned
< r
.in
.nOutBufferSize
,
2276 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
2281 static bool test_ClusterControl(struct torture_context
*tctx
,
2284 struct torture_clusapi_context
*t
=
2285 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2286 struct policy_handle Cluster
;
2289 if (!test_OpenCluster_int(tctx
, t
->p
, &Cluster
)) {
2293 ret
= test_ClusterControl_int(tctx
, t
->p
, &Cluster
);
2295 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
2300 static bool test_OpenNetwork_int(struct torture_context
*tctx
,
2301 struct dcerpc_pipe
*p
,
2302 const char *lpszNetworkName
,
2303 struct policy_handle
*hNetwork
)
2305 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2306 struct clusapi_OpenNetwork r
;
2310 r
.in
.lpszNetworkName
= lpszNetworkName
;
2311 r
.out
.rpc_status
= &rpc_status
;
2312 r
.out
.Status
= &Status
;
2313 r
.out
.hNetwork
= hNetwork
;
2315 torture_assert_ntstatus_ok(tctx
,
2316 dcerpc_clusapi_OpenNetwork_r(b
, tctx
, &r
),
2317 "OpenNetwork failed");
2318 torture_assert_werr_ok(tctx
,
2320 "OpenNetwork failed");
2325 static bool test_OpenNetworkEx_int(struct torture_context
*tctx
,
2326 struct dcerpc_pipe
*p
,
2327 const char *lpszNetworkName
,
2328 struct policy_handle
*hNetwork
)
2330 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2331 struct clusapi_OpenNetworkEx r
;
2332 uint32_t lpdwGrantedAccess
;
2336 r
.in
.lpszNetworkName
= lpszNetworkName
;
2337 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
2338 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
2339 r
.out
.rpc_status
= &rpc_status
;
2340 r
.out
.Status
= &Status
;
2341 r
.out
.hNetwork
= hNetwork
;
2343 torture_assert_ntstatus_ok(tctx
,
2344 dcerpc_clusapi_OpenNetworkEx_r(b
, tctx
, &r
),
2345 "OpenNetworkEx failed");
2346 torture_assert_werr_ok(tctx
,
2348 "OpenNetworkEx failed");
2353 static bool test_CloseNetwork_int(struct torture_context
*tctx
,
2354 struct dcerpc_pipe
*p
,
2355 struct policy_handle
*Network
)
2357 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2358 struct clusapi_CloseNetwork r
;
2360 r
.in
.Network
= Network
;
2361 r
.out
.Network
= Network
;
2363 torture_assert_ntstatus_ok(tctx
,
2364 dcerpc_clusapi_CloseNetwork_r(b
, tctx
, &r
),
2365 "CloseNetwork failed");
2366 torture_assert_werr_ok(tctx
,
2368 "CloseNetwork failed");
2369 torture_assert(tctx
,
2370 ndr_policy_handle_empty(Network
),
2371 "policy_handle non empty after CloseNetwork");
2376 static bool test_OpenNetwork(struct torture_context
*tctx
,
2379 struct torture_clusapi_context
*t
=
2380 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2381 struct policy_handle hNetwork
;
2383 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
2387 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
2392 static bool test_OpenNetworkEx(struct torture_context
*tctx
,
2395 struct torture_clusapi_context
*t
=
2396 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2397 struct policy_handle hNetwork
;
2399 if (!test_OpenNetworkEx_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
2403 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
2408 static bool test_CloseNetwork(struct torture_context
*tctx
,
2411 struct torture_clusapi_context
*t
=
2412 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2413 struct policy_handle hNetwork
;
2415 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
2419 return test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
2422 static bool test_GetNetworkState_int(struct torture_context
*tctx
,
2423 struct dcerpc_pipe
*p
,
2424 struct policy_handle
*hNetwork
)
2426 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2427 struct clusapi_GetNetworkState r
;
2428 enum clusapi_ClusterNetworkState State
;
2431 r
.in
.hNetwork
= *hNetwork
;
2432 r
.out
.State
= &State
;
2433 r
.out
.rpc_status
= &rpc_status
;
2435 torture_assert_ntstatus_ok(tctx
,
2436 dcerpc_clusapi_GetNetworkState_r(b
, tctx
, &r
),
2437 "GetNetworkState failed");
2438 torture_assert_werr_ok(tctx
,
2440 "GetNetworkState failed");
2445 static bool test_GetNetworkState(struct torture_context
*tctx
,
2448 struct torture_clusapi_context
*t
=
2449 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2450 struct policy_handle hNetwork
;
2453 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
2457 ret
= test_GetNetworkState_int(tctx
, t
->p
, &hNetwork
);
2459 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
2464 static bool test_GetNetworkId_int(struct torture_context
*tctx
,
2465 struct dcerpc_pipe
*p
,
2466 struct policy_handle
*hNetwork
)
2468 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2469 struct clusapi_GetNetworkId r
;
2473 r
.in
.hNetwork
= *hNetwork
;
2474 r
.out
.pGuid
= &pGuid
;
2475 r
.out
.rpc_status
= &rpc_status
;
2477 torture_assert_ntstatus_ok(tctx
,
2478 dcerpc_clusapi_GetNetworkId_r(b
, tctx
, &r
),
2479 "GetNetworkId failed");
2480 torture_assert_werr_ok(tctx
,
2482 "GetNetworkId failed");
2487 static bool test_GetNetworkId(struct torture_context
*tctx
,
2490 struct torture_clusapi_context
*t
=
2491 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2492 struct policy_handle hNetwork
;
2495 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
2499 ret
= test_GetNetworkId_int(tctx
, t
->p
, &hNetwork
);
2501 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
2506 static bool test_one_network(struct torture_context
*tctx
,
2507 struct dcerpc_pipe
*p
,
2508 const char *network_name
)
2510 struct policy_handle hNetwork
;
2512 torture_assert(tctx
,
2513 test_OpenNetwork_int(tctx
, p
, network_name
, &hNetwork
),
2514 "failed to open network");
2515 test_CloseNetwork_int(tctx
, p
, &hNetwork
);
2517 torture_assert(tctx
,
2518 test_OpenNetworkEx_int(tctx
, p
, network_name
, &hNetwork
),
2519 "failed to openex network");
2521 torture_assert(tctx
,
2522 test_GetNetworkId_int(tctx
, p
, &hNetwork
),
2523 "failed to query network id");
2524 torture_assert(tctx
,
2525 test_GetNetworkState_int(tctx
, p
, &hNetwork
),
2526 "failed to query network id");
2528 test_CloseNetwork_int(tctx
, p
, &hNetwork
);
2533 static bool test_all_networks(struct torture_context
*tctx
,
2536 struct torture_clusapi_context
*t
=
2537 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2538 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
2539 struct clusapi_CreateEnum r
;
2540 uint32_t dwType
= CLUSTER_ENUM_NETWORK
;
2541 struct ENUM_LIST
*ReturnEnum
;
2545 r
.in
.dwType
= dwType
;
2546 r
.out
.ReturnEnum
= &ReturnEnum
;
2547 r
.out
.rpc_status
= &rpc_status
;
2549 torture_assert_ntstatus_ok(tctx
,
2550 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
2551 "CreateEnum failed");
2552 torture_assert_werr_ok(tctx
,
2554 "CreateEnum failed");
2556 for (i
=0; i
< ReturnEnum
->EntryCount
; i
++) {
2558 struct ENUM_ENTRY e
= ReturnEnum
->Entry
[i
];
2560 torture_assert_int_equal(tctx
, e
.Type
, CLUSTER_ENUM_NETWORK
, "type mismatch");
2562 torture_assert(tctx
,
2563 test_one_network(tctx
, t
->p
, e
.Name
),
2564 "failed to test one network");
2570 static bool test_OpenNetInterface_int(struct torture_context
*tctx
,
2571 struct dcerpc_pipe
*p
,
2572 const char *lpszNetInterfaceName
,
2573 struct policy_handle
*hNetInterface
)
2575 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2576 struct clusapi_OpenNetInterface r
;
2580 r
.in
.lpszNetInterfaceName
= lpszNetInterfaceName
;
2581 r
.out
.rpc_status
= &rpc_status
;
2582 r
.out
.Status
= &Status
;
2583 r
.out
.hNetInterface
= hNetInterface
;
2585 torture_assert_ntstatus_ok(tctx
,
2586 dcerpc_clusapi_OpenNetInterface_r(b
, tctx
, &r
),
2587 "OpenNetInterface failed");
2588 torture_assert_werr_ok(tctx
,
2590 "OpenNetInterface failed");
2595 static bool test_OpenNetInterfaceEx_int(struct torture_context
*tctx
,
2596 struct dcerpc_pipe
*p
,
2597 const char *lpszNetInterfaceName
,
2598 struct policy_handle
*hNetInterface
)
2600 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2601 struct clusapi_OpenNetInterfaceEx r
;
2602 uint32_t lpdwGrantedAccess
;
2606 r
.in
.lpszNetInterfaceName
= lpszNetInterfaceName
;
2607 r
.in
.dwDesiredAccess
= SEC_FLAG_MAXIMUM_ALLOWED
;
2608 r
.out
.lpdwGrantedAccess
= &lpdwGrantedAccess
;
2609 r
.out
.rpc_status
= &rpc_status
;
2610 r
.out
.Status
= &Status
;
2611 r
.out
.hNetInterface
= hNetInterface
;
2613 torture_assert_ntstatus_ok(tctx
,
2614 dcerpc_clusapi_OpenNetInterfaceEx_r(b
, tctx
, &r
),
2615 "OpenNetInterfaceEx failed");
2616 torture_assert_werr_ok(tctx
,
2618 "OpenNetInterfaceEx failed");
2623 static bool test_CloseNetInterface_int(struct torture_context
*tctx
,
2624 struct dcerpc_pipe
*p
,
2625 struct policy_handle
*NetInterface
)
2627 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2628 struct clusapi_CloseNetInterface r
;
2630 r
.in
.NetInterface
= NetInterface
;
2631 r
.out
.NetInterface
= NetInterface
;
2633 torture_assert_ntstatus_ok(tctx
,
2634 dcerpc_clusapi_CloseNetInterface_r(b
, tctx
, &r
),
2635 "CloseNetInterface failed");
2636 torture_assert_werr_ok(tctx
,
2638 "CloseNetInterface failed");
2639 torture_assert(tctx
,
2640 ndr_policy_handle_empty(NetInterface
),
2641 "policy_handle non empty after CloseNetInterface");
2646 static bool test_OpenNetInterface(struct torture_context
*tctx
,
2649 struct torture_clusapi_context
*t
=
2650 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2651 struct policy_handle hNetInterface
;
2653 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2657 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2662 static bool test_OpenNetInterfaceEx(struct torture_context
*tctx
,
2665 struct torture_clusapi_context
*t
=
2666 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2667 struct policy_handle hNetInterface
;
2669 if (!test_OpenNetInterfaceEx_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2673 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2678 static bool test_CloseNetInterface(struct torture_context
*tctx
,
2681 struct torture_clusapi_context
*t
=
2682 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2683 struct policy_handle hNetInterface
;
2685 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2689 return test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2692 static bool test_GetNetInterfaceState_int(struct torture_context
*tctx
,
2693 struct dcerpc_pipe
*p
,
2694 struct policy_handle
*hNetInterface
)
2696 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2697 struct clusapi_GetNetInterfaceState r
;
2698 enum clusapi_ClusterNetInterfaceState State
;
2701 r
.in
.hNetInterface
= *hNetInterface
;
2702 r
.out
.State
= &State
;
2703 r
.out
.rpc_status
= &rpc_status
;
2705 torture_assert_ntstatus_ok(tctx
,
2706 dcerpc_clusapi_GetNetInterfaceState_r(b
, tctx
, &r
),
2707 "GetNetInterfaceState failed");
2708 torture_assert_werr_ok(tctx
,
2710 "GetNetInterfaceState failed");
2715 static bool test_GetNetInterfaceState(struct torture_context
*tctx
,
2718 struct torture_clusapi_context
*t
=
2719 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2720 struct policy_handle hNetInterface
;
2723 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2727 ret
= test_GetNetInterfaceState_int(tctx
, t
->p
, &hNetInterface
);
2729 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2734 static bool test_GetNetInterfaceId_int(struct torture_context
*tctx
,
2735 struct dcerpc_pipe
*p
,
2736 struct policy_handle
*hNetInterface
)
2738 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2739 struct clusapi_GetNetInterfaceId r
;
2743 r
.in
.hNetInterface
= *hNetInterface
;
2744 r
.out
.pGuid
= &pGuid
;
2745 r
.out
.rpc_status
= &rpc_status
;
2747 torture_assert_ntstatus_ok(tctx
,
2748 dcerpc_clusapi_GetNetInterfaceId_r(b
, tctx
, &r
),
2749 "GetNetInterfaceId failed");
2750 torture_assert_werr_ok(tctx
,
2752 "GetNetInterfaceId failed");
2757 static bool test_GetNetInterfaceId(struct torture_context
*tctx
,
2760 struct torture_clusapi_context
*t
=
2761 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2762 struct policy_handle hNetInterface
;
2765 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2769 ret
= test_GetNetInterfaceId_int(tctx
, t
->p
, &hNetInterface
);
2771 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2776 static bool test_one_netinterface(struct torture_context
*tctx
,
2777 struct dcerpc_pipe
*p
,
2778 const char *netinterface_name
)
2780 struct policy_handle hNetInterface
;
2782 torture_assert(tctx
,
2783 test_OpenNetInterface_int(tctx
, p
, netinterface_name
, &hNetInterface
),
2784 "failed to open netinterface");
2785 test_CloseNetInterface_int(tctx
, p
, &hNetInterface
);
2787 torture_assert(tctx
,
2788 test_OpenNetInterfaceEx_int(tctx
, p
, netinterface_name
, &hNetInterface
),
2789 "failed to openex netinterface");
2791 torture_assert(tctx
,
2792 test_GetNetInterfaceId_int(tctx
, p
, &hNetInterface
),
2793 "failed to query netinterface id");
2794 torture_assert(tctx
,
2795 test_GetNetInterfaceState_int(tctx
, p
, &hNetInterface
),
2796 "failed to query netinterface id");
2798 test_CloseNetInterface_int(tctx
, p
, &hNetInterface
);
2803 static bool test_all_netinterfaces(struct torture_context
*tctx
,
2806 struct torture_clusapi_context
*t
=
2807 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2808 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
2809 struct clusapi_CreateEnum r
;
2810 uint32_t dwType
= CLUSTER_ENUM_NETINTERFACE
;
2811 struct ENUM_LIST
*ReturnEnum
;
2815 r
.in
.dwType
= dwType
;
2816 r
.out
.ReturnEnum
= &ReturnEnum
;
2817 r
.out
.rpc_status
= &rpc_status
;
2819 torture_assert_ntstatus_ok(tctx
,
2820 dcerpc_clusapi_CreateEnum_r(b
, tctx
, &r
),
2821 "CreateEnum failed");
2822 torture_assert_werr_ok(tctx
,
2824 "CreateEnum failed");
2826 for (i
=0; i
< ReturnEnum
->EntryCount
; i
++) {
2828 struct ENUM_ENTRY e
= ReturnEnum
->Entry
[i
];
2830 torture_assert_int_equal(tctx
, e
.Type
, CLUSTER_ENUM_NETINTERFACE
, "type mismatch");
2832 torture_assert(tctx
,
2833 test_one_netinterface(tctx
, t
->p
, e
.Name
),
2834 "failed to test one netinterface");
2840 static bool test_CloseKey_int(struct torture_context
*tctx
,
2841 struct dcerpc_pipe
*p
,
2842 struct policy_handle
*pKey
)
2844 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2845 struct clusapi_CloseKey r
;
2850 torture_assert_ntstatus_ok(tctx
,
2851 dcerpc_clusapi_CloseKey_r(b
, tctx
, &r
),
2853 torture_assert_werr_ok(tctx
,
2856 torture_assert(tctx
,
2857 ndr_policy_handle_empty(pKey
),
2858 "policy_handle non empty after CloseKey");
2863 static bool test_GetRootKey_int(struct torture_context
*tctx
,
2864 struct dcerpc_pipe
*p
,
2865 struct policy_handle
*phKey
)
2867 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2868 struct clusapi_GetRootKey r
;
2872 r
.in
.samDesired
= SEC_FLAG_MAXIMUM_ALLOWED
;
2873 r
.out
.Status
= &Status
;
2874 r
.out
.rpc_status
= &rpc_status
;
2875 r
.out
.phKey
= phKey
;
2877 torture_assert_ntstatus_ok(tctx
,
2878 dcerpc_clusapi_GetRootKey_r(b
, tctx
, &r
),
2879 "GetRootKey failed");
2880 torture_assert_werr_ok(tctx
,
2882 "GetRootKey failed");
2887 static bool test_EnumKey_int(struct torture_context
*tctx
,
2888 struct dcerpc_pipe
*p
,
2889 struct policy_handle
*hKey
)
2891 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2892 struct clusapi_EnumKey r
;
2893 const char *KeyName
;
2894 NTTIME lpftLastWriteTime
;
2899 r
.out
.KeyName
= &KeyName
;
2900 r
.out
.lpftLastWriteTime
= &lpftLastWriteTime
;
2901 r
.out
.rpc_status
= &rpc_status
;
2903 torture_assert_ntstatus_ok(tctx
,
2904 dcerpc_clusapi_EnumKey_r(b
, tctx
, &r
),
2906 torture_assert_werr_ok(tctx
,
2913 static bool test_OpenKey_int(struct torture_context
*tctx
,
2914 struct dcerpc_pipe
*p
,
2915 struct policy_handle
*hKey
,
2916 const char *lpSubKey
,
2917 struct policy_handle
*phKey
)
2919 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2920 struct clusapi_OpenKey r
;
2925 r
.in
.lpSubKey
= lpSubKey
;
2926 r
.in
.samDesired
= SEC_FLAG_MAXIMUM_ALLOWED
;
2927 r
.out
.Status
= &Status
;
2928 r
.out
.rpc_status
= &rpc_status
;
2929 r
.out
.phKey
= phKey
;
2931 torture_assert_ntstatus_ok(tctx
,
2932 dcerpc_clusapi_OpenKey_r(b
, tctx
, &r
),
2934 torture_assert_werr_ok(tctx
,
2941 static bool test_EnumValue_int(struct torture_context
*tctx
,
2942 struct dcerpc_pipe
*p
,
2943 struct policy_handle
*hKey
)
2945 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2946 struct clusapi_EnumValue r
;
2947 const char *lpValueName
;
2954 uint32_t lpcbData
= 1024;
2958 r
.in
.lpcbData
= &lpcbData
;
2959 r
.out
.lpValueName
= &lpValueName
;
2960 r
.out
.lpType
= &lpType
;
2961 r
.out
.lpData
= talloc_array(tctx
, uint8_t, lpcbData
);
2962 r
.out
.TotalSize
= &TotalSize
;
2963 r
.out
.rpc_status
= &rpc_status
;
2964 r
.out
.lpcbData
= &lpcbData
;
2966 torture_assert_ntstatus_ok(tctx
,
2967 dcerpc_clusapi_EnumValue_r(b
, tctx
, &r
),
2968 "EnumValue failed");
2970 } while (W_ERROR_IS_OK(r
.out
.result
));
2972 torture_assert_werr_equal(tctx
,
2975 "EnumValue failed");
2980 static bool test_QueryInfoKey_int(struct torture_context
*tctx
,
2981 struct dcerpc_pipe
*p
,
2982 struct policy_handle
*hKey
)
2984 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
2985 struct clusapi_QueryInfoKey r
;
2986 uint32_t lpcSubKeys
;
2987 uint32_t lpcbMaxSubKeyLen
;
2989 uint32_t lpcbMaxValueNameLen
;
2990 uint32_t lpcbMaxValueLen
;
2991 uint32_t lpcbSecurityDescriptor
;
2992 NTTIME lpftLastWriteTime
;
2996 r
.out
.lpcSubKeys
= &lpcSubKeys
;
2997 r
.out
.lpcbMaxSubKeyLen
= &lpcbMaxSubKeyLen
;
2998 r
.out
.lpcValues
= &lpcValues
;
2999 r
.out
.lpcbMaxValueNameLen
= &lpcbMaxValueNameLen
;
3000 r
.out
.lpcbMaxValueLen
= &lpcbMaxValueLen
;
3001 r
.out
.lpcbSecurityDescriptor
= &lpcbSecurityDescriptor
;
3002 r
.out
.lpftLastWriteTime
= &lpftLastWriteTime
;
3003 r
.out
.rpc_status
= &rpc_status
;
3005 torture_assert_ntstatus_ok(tctx
,
3006 dcerpc_clusapi_QueryInfoKey_r(b
, tctx
, &r
),
3007 "QueryInfoKey failed");
3008 torture_assert_werr_ok(tctx
,
3010 "QueryInfoKey failed");
3015 static bool test_GetKeySecurity_int(struct torture_context
*tctx
,
3016 struct dcerpc_pipe
*p
,
3017 struct policy_handle
*hKey
)
3019 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
3020 struct clusapi_GetKeySecurity r
;
3021 uint32_t SecurityInformation
= SECINFO_DACL
| SECINFO_OWNER
| SECINFO_GROUP
;
3022 struct RPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
;
3025 ZERO_STRUCT(pRpcSecurityDescriptor
);
3028 r
.in
.SecurityInformation
= SecurityInformation
;
3029 r
.in
.pRpcSecurityDescriptor
= &pRpcSecurityDescriptor
;
3030 r
.out
.rpc_status
= &rpc_status
;
3031 r
.out
.pRpcSecurityDescriptor
= &pRpcSecurityDescriptor
;
3033 torture_assert_ntstatus_ok(tctx
,
3034 dcerpc_clusapi_GetKeySecurity_r(b
, tctx
, &r
),
3035 "GetKeySecurity failed");
3037 if (W_ERROR_EQUAL(r
.out
.result
, WERR_INSUFFICIENT_BUFFER
)) {
3038 pRpcSecurityDescriptor
.lpSecurityDescriptor
= talloc_array(tctx
,
3039 uint8_t, pRpcSecurityDescriptor
.cbInSecurityDescriptor
);
3041 torture_assert_ntstatus_ok(tctx
,
3042 dcerpc_clusapi_GetKeySecurity_r(b
, tctx
, &r
),
3043 "GetKeySecurity failed");
3046 torture_assert_werr_ok(tctx
,
3048 "GetKeySecurity failed");
3053 static bool test_GetRootKey(struct torture_context
*tctx
,
3056 struct torture_clusapi_context
*t
=
3057 talloc_get_type_abort(data
, struct torture_clusapi_context
);
3058 struct policy_handle hKey
;
3060 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
3064 test_CloseKey_int(tctx
, t
->p
, &hKey
);
3069 static bool test_CloseKey(struct torture_context
*tctx
,
3072 struct torture_clusapi_context
*t
=
3073 talloc_get_type_abort(data
, struct torture_clusapi_context
);
3074 struct policy_handle hKey
;
3076 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
3080 return test_CloseKey_int(tctx
, t
->p
, &hKey
);
3083 static bool test_EnumKey(struct torture_context
*tctx
,
3086 struct torture_clusapi_context
*t
=
3087 talloc_get_type_abort(data
, struct torture_clusapi_context
);
3088 struct policy_handle hKey
;
3091 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
3095 ret
= test_EnumKey_int(tctx
, t
->p
, &hKey
);
3097 test_CloseKey_int(tctx
, t
->p
, &hKey
);
3102 static bool test_QueryValue_int(struct torture_context
*tctx
,
3103 struct dcerpc_pipe
*p
,
3104 struct policy_handle
*hKey
,
3105 const char *ValueName
)
3107 struct dcerpc_binding_handle
*b
= p
->binding_handle
;
3108 struct clusapi_QueryValue r
;
3109 uint32_t lpValueType
;
3110 uint32_t lpcbRequired
;
3114 r
.in
.lpValueName
= ValueName
;
3116 r
.out
.lpValueType
= &lpValueType
;
3117 r
.out
.lpData
= NULL
;
3118 r
.out
.lpcbRequired
= &lpcbRequired
;
3119 r
.out
.rpc_status
= &rpc_status
;
3121 torture_assert_ntstatus_ok(tctx
,
3122 dcerpc_clusapi_QueryValue_r(b
, tctx
, &r
),
3123 "QueryValue failed");
3125 if (W_ERROR_EQUAL(r
.out
.result
, WERR_MORE_DATA
)) {
3127 r
.in
.cbData
= lpcbRequired
;
3128 r
.out
.lpData
= talloc_zero_array(tctx
, uint8_t, r
.in
.cbData
);
3130 torture_assert_ntstatus_ok(tctx
,
3131 dcerpc_clusapi_QueryValue_r(b
, tctx
, &r
),
3132 "QueryValue failed");
3135 torture_assert_werr_ok(tctx
,
3137 "QueryValue failed");
3139 if (lpValueType
== REG_SZ
) {
3141 DATA_BLOB blob
= data_blob_const(r
.out
.lpData
, lpcbRequired
);
3142 pull_reg_sz(tctx
, &blob
, &s
);
3143 torture_comment(tctx
, "got: %s\n", s
);
3149 static bool test_QueryValue(struct torture_context
*tctx
,
3152 struct torture_clusapi_context
*t
=
3153 talloc_get_type_abort(data
, struct torture_clusapi_context
);
3154 struct policy_handle hKey
;
3157 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
3161 ret
= test_QueryValue_int(tctx
, t
->p
, &hKey
, "ClusterInstanceID");
3163 test_CloseKey_int(tctx
, t
->p
, &hKey
);
3169 static bool test_one_key(struct torture_context
*tctx
,
3170 struct dcerpc_pipe
*p
,
3171 struct policy_handle
*hKey
,
3172 const char *KeyName
)
3174 struct policy_handle phKey
;
3176 torture_assert(tctx
,
3177 test_OpenKey_int(tctx
, p
, hKey
, KeyName
, &phKey
),
3178 "failed to open key");
3180 torture_assert(tctx
,
3181 test_QueryInfoKey_int(tctx
, p
, &phKey
),
3182 "failed to enum values");
3183 torture_assert(tctx
,
3184 test_GetKeySecurity_int(tctx
, p
, &phKey
),
3185 "failed to get key security");
3187 torture_assert(tctx
,
3188 test_EnumValue_int(tctx
, p
, &phKey
),
3189 "failed to enum values");
3191 torture_assert(tctx
,
3192 test_CloseKey_int(tctx
, p
, &phKey
),
3193 "failed to close key");
3198 static bool test_all_keys(struct torture_context
*tctx
,
3201 struct torture_clusapi_context
*t
=
3202 talloc_get_type_abort(data
, struct torture_clusapi_context
);
3203 struct dcerpc_binding_handle
*b
= t
->p
->binding_handle
;
3204 struct policy_handle hKey
;
3205 struct clusapi_EnumKey r
;
3206 const char *KeyName
;
3207 NTTIME lpftLastWriteTime
;
3211 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
3218 r
.out
.KeyName
= &KeyName
;
3219 r
.out
.lpftLastWriteTime
= &lpftLastWriteTime
;
3220 r
.out
.rpc_status
= &rpc_status
;
3222 torture_assert_ntstatus_ok(tctx
,
3223 dcerpc_clusapi_EnumKey_r(b
, tctx
, &r
),
3226 if (W_ERROR_IS_OK(r
.out
.result
)) {
3227 torture_assert(tctx
,
3228 test_one_key(tctx
, t
->p
, &hKey
, KeyName
),
3229 "failed to test one key");
3232 } while (W_ERROR_IS_OK(r
.out
.result
));
3234 torture_assert_werr_equal(tctx
,
3239 test_CloseKey_int(tctx
, t
->p
, &hKey
);
3244 static bool torture_rpc_clusapi_setup_common(struct torture_context
*tctx
,
3245 struct torture_clusapi_context
*t
)
3247 struct dcerpc_binding_handle
*b
;
3249 torture_assert_ntstatus_ok(tctx
,
3250 torture_rpc_connection(tctx
, &t
->p
, &ndr_table_clusapi
),
3251 "Error connecting to server");
3254 struct clusapi_GetClusterName r
;
3256 b
= t
->p
->binding_handle
;
3258 r
.out
.ClusterName
= &t
->ClusterName
;
3259 r
.out
.NodeName
= &t
->NodeName
;
3261 torture_assert_ntstatus_ok(tctx
,
3262 dcerpc_clusapi_GetClusterName_r(b
, tctx
, &r
),
3263 "GetClusterName failed");
3264 torture_assert_werr_ok(tctx
,
3266 "GetClusterName failed");
3272 static bool torture_rpc_clusapi_setup(struct torture_context
*tctx
,
3275 struct torture_clusapi_context
*t
;
3277 *data
= t
= talloc_zero(tctx
, struct torture_clusapi_context
);
3279 return torture_rpc_clusapi_setup_common(tctx
, t
);
3282 static bool torture_rpc_clusapi_teardown(struct torture_context
*tctx
,
3290 void torture_tcase_cluster(struct torture_tcase
*tcase
)
3292 torture_tcase_add_simple_test(tcase
, "OpenCluster",
3294 torture_tcase_add_simple_test(tcase
, "OpenClusterEx",
3295 test_OpenClusterEx
);
3296 torture_tcase_add_simple_test(tcase
, "CloseCluster",
3298 torture_tcase_add_simple_test(tcase
, "SetClusterName",
3299 test_SetClusterName
);
3300 torture_tcase_add_simple_test(tcase
, "GetClusterName",
3301 test_GetClusterName
);
3302 torture_tcase_add_simple_test(tcase
, "GetClusterVersion",
3303 test_GetClusterVersion
);
3304 torture_tcase_add_simple_test(tcase
, "CreateEnum",
3306 torture_tcase_add_simple_test(tcase
, "CreateEnumEx",
3308 torture_tcase_add_simple_test(tcase
, "GetClusterVersion2",
3309 test_GetClusterVersion2
);
3310 torture_tcase_add_simple_test(tcase
, "BackupClusterDatabase",
3311 test_BackupClusterDatabase
);
3312 torture_tcase_add_simple_test(tcase
, "SetServiceAccountPassword",
3313 test_SetServiceAccountPassword
);
3314 torture_tcase_add_simple_test(tcase
, "ClusterControl",
3315 test_ClusterControl
);
3319 void torture_tcase_resource(struct torture_tcase
*tcase
)
3321 struct torture_test
*test
;
3323 torture_tcase_add_simple_test(tcase
, "GetQuorumResource",
3324 test_GetQuorumResource
);
3325 torture_tcase_add_simple_test(tcase
, "SetQuorumResource",
3326 test_SetQuorumResource
);
3327 torture_tcase_add_simple_test(tcase
, "OpenResource",
3329 torture_tcase_add_simple_test(tcase
, "OpenResourceEx",
3330 test_OpenResourceEx
);
3331 torture_tcase_add_simple_test(tcase
, "CloseResource",
3332 test_CloseResource
);
3333 torture_tcase_add_simple_test(tcase
, "CreateResource",
3334 test_CreateResource
);
3335 torture_tcase_add_simple_test(tcase
, "DeleteResource",
3336 test_DeleteResource
);
3337 torture_tcase_add_simple_test(tcase
, "SetResourceName",
3338 test_SetResourceName
);
3339 torture_tcase_add_simple_test(tcase
, "GetResourceState",
3340 test_GetResourceState
);
3341 torture_tcase_add_simple_test(tcase
, "GetResourceId",
3342 test_GetResourceId
);
3343 torture_tcase_add_simple_test(tcase
, "GetResourceType",
3344 test_GetResourceType
);
3345 torture_tcase_add_simple_test(tcase
, "CreateResEnum",
3346 test_CreateResEnum
);
3347 test
= torture_tcase_add_simple_test(tcase
, "FailResource",
3349 test
->dangerous
= true;
3350 torture_tcase_add_simple_test(tcase
, "OnlineResource",
3351 test_OnlineResource
);
3352 test
= torture_tcase_add_simple_test(tcase
, "OfflineResource",
3353 test_OfflineResource
);
3354 test
->dangerous
= true;
3355 torture_tcase_add_simple_test(tcase
, "GetResourceDependencyExpression",
3356 test_GetResourceDependencyExpression
);
3357 torture_tcase_add_simple_test(tcase
, "GetResourceNetworkName",
3358 test_GetResourceNetworkName
);
3359 torture_tcase_add_simple_test(tcase
, "all_resources",
3360 test_all_resources
);
3363 void torture_tcase_node(struct torture_tcase
*tcase
)
3365 struct torture_test
*test
;
3367 torture_tcase_add_simple_test(tcase
, "OpenNode",
3369 torture_tcase_add_simple_test(tcase
, "OpenNodeEx",
3371 torture_tcase_add_simple_test(tcase
, "CloseNode",
3373 torture_tcase_add_simple_test(tcase
, "GetNodeState",
3375 torture_tcase_add_simple_test(tcase
, "GetNodeId",
3377 torture_tcase_add_simple_test(tcase
, "NodeControl",
3379 test
= torture_tcase_add_simple_test(tcase
, "PauseNode",
3381 test
->dangerous
= true;
3382 torture_tcase_add_simple_test(tcase
, "ResumeNode",
3384 test
= torture_tcase_add_simple_test(tcase
, "EvictNode",
3386 test
->dangerous
= true;
3387 torture_tcase_add_simple_test(tcase
, "all_nodes",
3391 void torture_tcase_group(struct torture_tcase
*tcase
)
3393 struct torture_test
*test
;
3395 torture_tcase_add_simple_test(tcase
, "OpenGroup",
3397 torture_tcase_add_simple_test(tcase
, "OpenGroupEx",
3399 torture_tcase_add_simple_test(tcase
, "CloseGroup",
3401 torture_tcase_add_simple_test(tcase
, "GetGroupState",
3402 test_GetGroupState
);
3403 torture_tcase_add_simple_test(tcase
, "GetGroupId",
3405 torture_tcase_add_simple_test(tcase
, "GroupControl",
3407 torture_tcase_add_simple_test(tcase
, "OnlineGroup",
3409 test
= torture_tcase_add_simple_test(tcase
, "OfflineGroup",
3411 test
->dangerous
= true;
3412 torture_tcase_add_simple_test(tcase
, "all_groups",
3416 void torture_tcase_network(struct torture_tcase
*tcase
)
3418 torture_tcase_add_simple_test(tcase
, "OpenNetwork",
3420 torture_tcase_add_simple_test(tcase
, "OpenNetworkEx",
3421 test_OpenNetworkEx
);
3422 torture_tcase_add_simple_test(tcase
, "CloseNetwork",
3424 torture_tcase_add_simple_test(tcase
, "GetNetworkState",
3425 test_GetNetworkState
);
3426 torture_tcase_add_simple_test(tcase
, "GetNetworkId",
3428 torture_tcase_add_simple_test(tcase
, "all_networks",
3432 void torture_tcase_netinterface(struct torture_tcase
*tcase
)
3434 torture_tcase_add_simple_test(tcase
, "OpenNetInterface",
3435 test_OpenNetInterface
);
3436 torture_tcase_add_simple_test(tcase
, "OpenNetInterfaceEx",
3437 test_OpenNetInterfaceEx
);
3438 torture_tcase_add_simple_test(tcase
, "CloseNetInterface",
3439 test_CloseNetInterface
);
3440 torture_tcase_add_simple_test(tcase
, "GetNetInterfaceState",
3441 test_GetNetInterfaceState
);
3442 torture_tcase_add_simple_test(tcase
, "GetNetInterfaceId",
3443 test_GetNetInterfaceId
);
3444 torture_tcase_add_simple_test(tcase
, "all_netinterfaces",
3445 test_all_netinterfaces
);
3448 void torture_tcase_registry(struct torture_tcase
*tcase
)
3450 torture_tcase_add_simple_test(tcase
, "GetRootKey",
3452 torture_tcase_add_simple_test(tcase
, "CloseKey",
3454 torture_tcase_add_simple_test(tcase
, "EnumKey",
3456 torture_tcase_add_simple_test(tcase
, "QueryValue",
3458 torture_tcase_add_simple_test(tcase
, "all_keys",
3462 struct torture_suite
*torture_rpc_clusapi(TALLOC_CTX
*mem_ctx
)
3464 struct torture_tcase
*tcase
;
3465 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "clusapi");
3467 tcase
= torture_suite_add_tcase(suite
, "cluster");
3469 torture_tcase_set_fixture(tcase
,
3470 torture_rpc_clusapi_setup
,
3471 torture_rpc_clusapi_teardown
);
3473 torture_tcase_cluster(tcase
);
3475 tcase
= torture_suite_add_tcase(suite
, "resource");
3477 torture_tcase_set_fixture(tcase
,
3478 torture_rpc_clusapi_setup
,
3479 torture_rpc_clusapi_teardown
);
3481 torture_tcase_resource(tcase
);
3483 tcase
= torture_suite_add_tcase(suite
, "node");
3485 torture_tcase_set_fixture(tcase
,
3486 torture_rpc_clusapi_setup
,
3487 torture_rpc_clusapi_teardown
);
3489 torture_tcase_node(tcase
);
3491 tcase
= torture_suite_add_tcase(suite
, "group");
3493 torture_tcase_set_fixture(tcase
,
3494 torture_rpc_clusapi_setup
,
3495 torture_rpc_clusapi_teardown
);
3497 torture_tcase_group(tcase
);
3499 tcase
= torture_suite_add_tcase(suite
, "network");
3501 torture_tcase_set_fixture(tcase
,
3502 torture_rpc_clusapi_setup
,
3503 torture_rpc_clusapi_teardown
);
3505 torture_tcase_network(tcase
);
3507 tcase
= torture_suite_add_tcase(suite
, "netinterface");
3509 torture_tcase_set_fixture(tcase
,
3510 torture_rpc_clusapi_setup
,
3511 torture_rpc_clusapi_teardown
);
3513 torture_tcase_netinterface(tcase
);
3515 tcase
= torture_suite_add_tcase(suite
, "registry");
3517 torture_tcase_set_fixture(tcase
,
3518 torture_rpc_clusapi_setup
,
3519 torture_rpc_clusapi_teardown
);
3521 torture_tcase_registry(tcase
);