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 torture_assert_werr_ok(tctx,
951 "OnlineResource failed");
956 static bool test_OnlineResource(struct torture_context *tctx,
959 struct torture_clusapi_context *t =
960 talloc_get_type_abort(data, struct torture_clusapi_context);
961 struct policy_handle hResource;
964 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
968 ret = test_OnlineResource_int(tctx, t->p, &hResource);
970 test_CloseResource_int(tctx, t->p, &hResource);
975 bool test_OfflineResource_int(struct torture_context *tctx,
976 struct dcerpc_pipe *p,
977 struct policy_handle *hResource)
979 struct dcerpc_binding_handle *b = p->binding_handle;
980 struct clusapi_OfflineResource r;
983 r.in.hResource = *hResource;
984 r.out.rpc_status = &rpc_status;
986 torture_assert_ntstatus_ok(tctx,
987 dcerpc_clusapi_OfflineResource_r(b, tctx, &r),
988 "OfflineResource failed");
989 torture_assert_werr_ok(tctx,
991 "OfflineResource failed");
996 static bool test_OfflineResource(struct torture_context *tctx,
999 struct torture_clusapi_context *t =
1000 talloc_get_type_abort(data, struct torture_clusapi_context);
1001 struct policy_handle hResource;
1004 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
1008 ret = test_OfflineResource_int(tctx, t->p, &hResource);
1010 test_CloseResource_int(tctx, t->p, &hResource);
1015 static bool test_CreateResEnum_int(struct torture_context *tctx,
1016 struct dcerpc_pipe *p,
1017 struct policy_handle *hResource)
1019 struct dcerpc_binding_handle *b = p->binding_handle;
1020 struct clusapi_CreateResEnum r;
1021 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
1022 struct ENUM_LIST *ReturnEnum;
1025 r.in.hResource = *hResource;
1026 r.in.dwType = dwType;
1027 r.out.ReturnEnum = &ReturnEnum;
1028 r.out.rpc_status = &rpc_status;
1030 torture_assert_ntstatus_ok(tctx,
1031 dcerpc_clusapi_CreateResEnum_r(b, tctx, &r),
1032 "CreateResEnum failed");
1033 torture_assert_werr_ok(tctx,
1035 "CreateResEnum failed");
1040 static bool test_CreateResEnum(struct torture_context *tctx,
1043 struct torture_clusapi_context *t =
1044 talloc_get_type_abort(data, struct torture_clusapi_context);
1045 struct policy_handle hResource;
1048 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
1052 ret = test_CreateResEnum_int(tctx, t->p, &hResource);
1054 test_CloseResource_int(tctx, t->p, &hResource);
1059 static bool test_GetResourceDependencyExpression_int(struct torture_context *tctx,
1060 struct dcerpc_pipe *p,
1061 struct policy_handle *hResource)
1063 struct dcerpc_binding_handle *b = p->binding_handle;
1064 struct clusapi_GetResourceDependencyExpression r;
1065 const char *lpszDependencyExpression;
1068 r.in.hResource = *hResource;
1069 r.out.lpszDependencyExpression = &lpszDependencyExpression;
1070 r.out.rpc_status = &rpc_status;
1072 torture_assert_ntstatus_ok(tctx,
1073 dcerpc_clusapi_GetResourceDependencyExpression_r(b, tctx, &r),
1074 "GetResourceDependencyExpression failed");
1075 torture_assert_werr_ok(tctx,
1077 "GetResourceDependencyExpression failed");
1082 static bool test_GetResourceDependencyExpression(struct torture_context *tctx,
1085 struct torture_clusapi_context *t =
1086 talloc_get_type_abort(data, struct torture_clusapi_context);
1087 struct policy_handle hResource;
1090 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
1094 ret = test_GetResourceDependencyExpression_int(tctx, t->p, &hResource);
1096 test_CloseResource_int(tctx, t->p, &hResource);
1101 static bool test_GetResourceNetworkName_int(struct torture_context *tctx,
1102 struct dcerpc_pipe *p,
1103 struct policy_handle *hResource)
1105 struct dcerpc_binding_handle *b = p->binding_handle;
1106 struct clusapi_GetResourceNetworkName r;
1107 const char *lpszName;
1110 r.in.hResource = *hResource;
1111 r.out.lpszName = &lpszName;
1112 r.out.rpc_status = &rpc_status;
1114 torture_assert_ntstatus_ok(tctx,
1115 dcerpc_clusapi_GetResourceNetworkName_r(b, tctx, &r),
1116 "GetResourceNetworkName failed");
1117 torture_assert_werr_ok(tctx,
1119 "GetResourceNetworkName failed");
1124 static bool test_GetResourceNetworkName(struct torture_context *tctx,
1127 struct torture_clusapi_context *t =
1128 talloc_get_type_abort(data, struct torture_clusapi_context);
1129 struct policy_handle hResource;
1132 if (!test_OpenResource_int(tctx, t->p, "Network Name", &hResource)) {
1136 ret = test_GetResourceNetworkName_int(tctx, t->p, &hResource);
1138 test_CloseResource_int(tctx, t->p, &hResource);
1143 static bool test_one_resource(struct torture_context *tctx,
1144 struct dcerpc_pipe *p,
1145 const char *resource_name)
1147 struct policy_handle hResource;
1149 torture_assert(tctx,
1150 test_OpenResource_int(tctx, p, resource_name, &hResource),
1151 "failed to open resource");
1152 test_CloseResource_int(tctx, p, &hResource);
1154 torture_assert(tctx,
1155 test_OpenResourceEx_int(tctx, p, resource_name, &hResource),
1156 "failed to openex resource");
1158 torture_assert(tctx,
1159 test_GetResourceType_int(tctx, p, &hResource),
1160 "failed to query resource type");
1161 torture_assert(tctx,
1162 test_GetResourceId_int(tctx, p, &hResource),
1163 "failed to query resource id");
1164 torture_assert(tctx,
1165 test_GetResourceState_int(tctx, p, &hResource),
1166 "failed to query resource state");
1167 torture_assert(tctx,
1168 test_CreateResEnum_int(tctx, p, &hResource),
1169 "failed to query resource enum");
1170 torture_assert(tctx,
1171 test_GetResourceDependencyExpression_int(tctx, p, &hResource),
1172 "failed to query resource dependency expression");
1173 torture_assert(tctx,
1174 test_GetResourceNetworkName_int(tctx, p, &hResource),
1175 "failed to query resource network name");
1177 test_CloseResource_int(tctx, p, &hResource);
1182 static bool test_all_resources(struct torture_context *tctx,
1185 struct torture_clusapi_context *t =
1186 talloc_get_type_abort(data, struct torture_clusapi_context);
1187 struct dcerpc_binding_handle *b = t->p->binding_handle;
1188 struct clusapi_CreateEnum r;
1189 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
1190 struct ENUM_LIST *ReturnEnum;
1194 r.in.dwType = dwType;
1195 r.out.ReturnEnum = &ReturnEnum;
1196 r.out.rpc_status = &rpc_status;
1198 torture_assert_ntstatus_ok(tctx,
1199 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1200 "CreateEnum failed");
1201 torture_assert_werr_ok(tctx,
1203 "CreateEnum failed");
1205 for (i=0; i < ReturnEnum->EntryCount; i++) {
1207 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1209 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESOURCE, "type mismatch");
1211 torture_assert(tctx,
1212 test_one_resource(tctx, t->p, e.Name),
1213 "failed to test one resource");
1219 static bool test_OpenNode_int(struct torture_context *tctx,
1220 struct dcerpc_pipe *p,
1221 const char *lpszNodeName,
1222 struct policy_handle *hNode)
1224 struct dcerpc_binding_handle *b = p->binding_handle;
1225 struct clusapi_OpenNode r;
1229 r.in.lpszNodeName = lpszNodeName;
1230 r.out.rpc_status = &rpc_status;
1231 r.out.Status = &Status;
1234 torture_assert_ntstatus_ok(tctx,
1235 dcerpc_clusapi_OpenNode_r(b, tctx, &r),
1237 torture_assert_werr_ok(tctx,
1244 static bool test_OpenNodeEx_int(struct torture_context *tctx,
1245 struct dcerpc_pipe *p,
1246 const char *lpszNodeName,
1247 struct policy_handle *hNode)
1249 struct dcerpc_binding_handle *b = p->binding_handle;
1250 struct clusapi_OpenNodeEx r;
1251 uint32_t lpdwGrantedAccess;
1255 r.in.lpszNodeName = lpszNodeName;
1256 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1257 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1258 r.out.rpc_status = &rpc_status;
1259 r.out.Status = &Status;
1262 torture_assert_ntstatus_ok(tctx,
1263 dcerpc_clusapi_OpenNodeEx_r(b, tctx, &r),
1264 "OpenNodeEx failed");
1265 torture_assert_werr_ok(tctx,
1267 "OpenNodeEx failed");
1273 static bool test_CloseNode_int(struct torture_context *tctx,
1274 struct dcerpc_pipe *p,
1275 struct policy_handle *Node)
1277 struct dcerpc_binding_handle *b = p->binding_handle;
1278 struct clusapi_CloseNode r;
1283 torture_assert_ntstatus_ok(tctx,
1284 dcerpc_clusapi_CloseNode_r(b, tctx, &r),
1285 "CloseNode failed");
1286 torture_assert_werr_ok(tctx,
1288 "CloseNode failed");
1289 torture_assert(tctx,
1290 ndr_policy_handle_empty(Node),
1291 "policy_handle non empty after CloseNode");
1296 static bool test_OpenNode(struct torture_context *tctx,
1299 struct torture_clusapi_context *t =
1300 talloc_get_type_abort(data, struct torture_clusapi_context);
1301 struct policy_handle hNode;
1303 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1307 test_CloseNode_int(tctx, t->p, &hNode);
1312 static bool test_OpenNodeEx(struct torture_context *tctx,
1315 struct torture_clusapi_context *t =
1316 talloc_get_type_abort(data, struct torture_clusapi_context);
1317 struct policy_handle hNode;
1319 if (!test_OpenNodeEx_int(tctx, t->p, t->NodeName, &hNode)) {
1323 test_CloseNode_int(tctx, t->p, &hNode);
1328 static bool test_CloseNode(struct torture_context *tctx,
1331 struct torture_clusapi_context *t =
1332 talloc_get_type_abort(data, struct torture_clusapi_context);
1333 struct policy_handle hNode;
1335 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1339 return test_CloseNode_int(tctx, t->p, &hNode);
1342 static bool test_GetNodeState_int(struct torture_context *tctx,
1343 struct dcerpc_pipe *p,
1344 struct policy_handle *hNode)
1346 struct dcerpc_binding_handle *b = p->binding_handle;
1347 struct clusapi_GetNodeState r;
1348 enum clusapi_ClusterNodeState State;
1351 r.in.hNode = *hNode;
1352 r.out.State = &State;
1353 r.out.rpc_status = &rpc_status;
1355 torture_assert_ntstatus_ok(tctx,
1356 dcerpc_clusapi_GetNodeState_r(b, tctx, &r),
1357 "GetNodeState failed");
1358 torture_assert_werr_ok(tctx,
1360 "GetNodeState failed");
1365 static bool test_GetNodeState(struct torture_context *tctx,
1368 struct torture_clusapi_context *t =
1369 talloc_get_type_abort(data, struct torture_clusapi_context);
1370 struct policy_handle hNode;
1373 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1377 ret = test_GetNodeState_int(tctx, t->p, &hNode);
1379 test_CloseNode_int(tctx, t->p, &hNode);
1384 static bool test_GetNodeId_int(struct torture_context *tctx,
1385 struct dcerpc_pipe *p,
1386 struct policy_handle *hNode)
1388 struct dcerpc_binding_handle *b = p->binding_handle;
1389 struct clusapi_GetNodeId r;
1393 r.in.hNode = *hNode;
1394 r.out.pGuid = &pGuid;
1395 r.out.rpc_status = &rpc_status;
1397 torture_assert_ntstatus_ok(tctx,
1398 dcerpc_clusapi_GetNodeId_r(b, tctx, &r),
1399 "GetNodeId failed");
1400 torture_assert_werr_ok(tctx,
1402 "GetNodeId failed");
1407 static bool test_GetNodeId(struct torture_context *tctx,
1410 struct torture_clusapi_context *t =
1411 talloc_get_type_abort(data, struct torture_clusapi_context);
1412 struct policy_handle hNode;
1415 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1419 ret = test_GetNodeId_int(tctx, t->p, &hNode);
1421 test_CloseNode_int(tctx, t->p, &hNode);
1426 static bool test_NodeControl_int(struct torture_context *tctx,
1427 struct dcerpc_pipe *p,
1428 struct policy_handle *hNode)
1430 struct dcerpc_binding_handle *b = p->binding_handle;
1431 struct clusapi_NodeControl r;
1432 uint32_t lpBytesReturned;
1433 uint32_t lpcbRequired;
1436 r.in.hNode = *hNode;
1437 r.in.dwControlCode = 0;
1438 r.in.lpInBuffer = NULL;
1439 r.in.nInBufferSize = 0;
1440 r.in.nOutBufferSize = 0;
1441 r.out.lpOutBuffer = NULL;
1442 r.out.lpBytesReturned = &lpBytesReturned;
1443 r.out.lpcbRequired = &lpcbRequired;
1444 r.out.rpc_status = &rpc_status;
1446 torture_assert_ntstatus_ok(tctx,
1447 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
1448 "NodeControl failed");
1449 torture_assert_werr_equal(tctx,
1451 WERR_INVALID_FUNCTION,
1452 "NodeControl failed");
1454 r.in.dwControlCode = CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES;
1456 torture_assert_ntstatus_ok(tctx,
1457 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
1458 "NodeControl failed");
1460 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
1461 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
1462 r.in.nOutBufferSize = *r.out.lpcbRequired;
1463 torture_assert_ntstatus_ok(tctx,
1464 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
1465 "NodeControl failed");
1467 torture_assert_werr_ok(tctx,
1469 "NodeControl failed");
1471 /* now try what happens when we query with a buffer large enough to hold
1472 * the entire packet */
1474 r.in.nOutBufferSize = 0x400;
1475 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
1477 torture_assert_ntstatus_ok(tctx,
1478 dcerpc_clusapi_NodeControl_r(b, tctx, &r),
1479 "NodeControl failed");
1480 torture_assert_werr_ok(tctx,
1482 "NodeControl failed");
1483 torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
1484 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
1489 static bool test_NodeControl(struct torture_context *tctx,
1492 struct torture_clusapi_context *t =
1493 talloc_get_type_abort(data, struct torture_clusapi_context);
1494 struct policy_handle hNode;
1497 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1501 ret = test_NodeControl_int(tctx, t->p, &hNode);
1503 test_CloseNode_int(tctx, t->p, &hNode);
1508 static bool test_PauseNode_int(struct torture_context *tctx,
1509 struct dcerpc_pipe *p,
1510 struct policy_handle *hNode)
1512 struct dcerpc_binding_handle *b = p->binding_handle;
1513 struct clusapi_PauseNode r;
1516 r.in.hNode = *hNode;
1517 r.out.rpc_status = &rpc_status;
1519 torture_assert_ntstatus_ok(tctx,
1520 dcerpc_clusapi_PauseNode_r(b, tctx, &r),
1521 "PauseNode failed");
1522 torture_assert_werr_ok(tctx,
1524 "PauseNode failed");
1529 static bool test_PauseNode(struct torture_context *tctx,
1532 struct torture_clusapi_context *t =
1533 talloc_get_type_abort(data, struct torture_clusapi_context);
1534 struct policy_handle hNode;
1537 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1541 ret = test_PauseNode_int(tctx, t->p, &hNode);
1543 test_CloseNode_int(tctx, t->p, &hNode);
1548 static bool test_ResumeNode_int(struct torture_context *tctx,
1549 struct dcerpc_pipe *p,
1550 struct policy_handle *hNode)
1552 struct dcerpc_binding_handle *b = p->binding_handle;
1553 struct clusapi_ResumeNode r;
1556 r.in.hNode = *hNode;
1557 r.out.rpc_status = &rpc_status;
1559 torture_assert_ntstatus_ok(tctx,
1560 dcerpc_clusapi_ResumeNode_r(b, tctx, &r),
1561 "ResumeNode failed");
1562 torture_assert_werr_equal(tctx,
1564 WERR_CLUSTER_NODE_NOT_PAUSED,
1565 "ResumeNode gave unexpected result");
1570 static bool test_ResumeNode(struct torture_context *tctx,
1573 struct torture_clusapi_context *t =
1574 talloc_get_type_abort(data, struct torture_clusapi_context);
1575 struct policy_handle hNode;
1578 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1582 ret = test_ResumeNode_int(tctx, t->p, &hNode);
1584 test_CloseNode_int(tctx, t->p, &hNode);
1589 static bool test_EvictNode_int(struct torture_context *tctx,
1590 struct dcerpc_pipe *p,
1591 struct policy_handle *hNode)
1593 struct dcerpc_binding_handle *b = p->binding_handle;
1594 struct clusapi_EvictNode r;
1597 r.in.hNode = *hNode;
1598 r.out.rpc_status = &rpc_status;
1600 torture_assert_ntstatus_ok(tctx,
1601 dcerpc_clusapi_EvictNode_r(b, tctx, &r),
1602 "EvictNode failed");
1603 torture_assert_werr_ok(tctx,
1605 "EvictNode failed");
1610 static bool test_EvictNode(struct torture_context *tctx,
1613 struct torture_clusapi_context *t =
1614 talloc_get_type_abort(data, struct torture_clusapi_context);
1615 struct policy_handle hNode;
1618 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1622 ret = test_EvictNode_int(tctx, t->p, &hNode);
1624 test_CloseNode_int(tctx, t->p, &hNode);
1629 static bool test_one_node(struct torture_context *tctx,
1630 struct dcerpc_pipe *p,
1631 const char *node_name)
1633 struct policy_handle hNode;
1635 torture_assert(tctx,
1636 test_OpenNode_int(tctx, p, node_name, &hNode),
1637 "failed to open node");
1638 test_CloseNode_int(tctx, p, &hNode);
1640 torture_assert(tctx,
1641 test_OpenNodeEx_int(tctx, p, node_name, &hNode),
1642 "failed to openex node");
1644 torture_assert(tctx,
1645 test_GetNodeId_int(tctx, p, &hNode),
1646 "failed to query node id");
1647 torture_assert(tctx,
1648 test_GetNodeState_int(tctx, p, &hNode),
1649 "failed to query node id");
1651 test_CloseNode_int(tctx, p, &hNode);
1656 static bool test_all_nodes(struct torture_context *tctx,
1659 struct torture_clusapi_context *t =
1660 talloc_get_type_abort(data, struct torture_clusapi_context);
1661 struct dcerpc_binding_handle *b = t->p->binding_handle;
1662 struct clusapi_CreateEnum r;
1663 uint32_t dwType = CLUSTER_ENUM_NODE;
1664 struct ENUM_LIST *ReturnEnum;
1668 r.in.dwType = dwType;
1669 r.out.ReturnEnum = &ReturnEnum;
1670 r.out.rpc_status = &rpc_status;
1672 torture_assert_ntstatus_ok(tctx,
1673 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1674 "CreateEnum failed");
1675 torture_assert_werr_ok(tctx,
1677 "CreateEnum failed");
1679 for (i=0; i < ReturnEnum->EntryCount; i++) {
1681 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1683 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NODE, "type mismatch");
1685 torture_assert(tctx,
1686 test_one_node(tctx, t->p, e.Name),
1687 "failed to test one node");
1693 static bool test_OpenGroup_int(struct torture_context *tctx,
1694 struct dcerpc_pipe *p,
1695 const char *lpszGroupName,
1696 struct policy_handle *hGroup)
1698 struct dcerpc_binding_handle *b = p->binding_handle;
1699 struct clusapi_OpenGroup r;
1703 r.in.lpszGroupName = lpszGroupName;
1704 r.out.rpc_status = &rpc_status;
1705 r.out.Status = &Status;
1706 r.out.hGroup= hGroup;
1708 torture_assert_ntstatus_ok(tctx,
1709 dcerpc_clusapi_OpenGroup_r(b, tctx, &r),
1710 "OpenGroup failed");
1711 torture_assert_werr_ok(tctx,
1713 "OpenGroup failed");
1718 static bool test_OpenGroupEx_int(struct torture_context *tctx,
1719 struct dcerpc_pipe *p,
1720 const char *lpszGroupName,
1721 struct policy_handle *hGroup)
1723 struct dcerpc_binding_handle *b = p->binding_handle;
1724 struct clusapi_OpenGroupEx r;
1725 uint32_t lpdwGrantedAccess;
1729 r.in.lpszGroupName = lpszGroupName;
1730 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1731 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1732 r.out.rpc_status = &rpc_status;
1733 r.out.Status = &Status;
1734 r.out.hGroup= hGroup;
1736 torture_assert_ntstatus_ok(tctx,
1737 dcerpc_clusapi_OpenGroupEx_r(b, tctx, &r),
1738 "OpenGroupEx failed");
1739 torture_assert_werr_ok(tctx,
1741 "OpenGroupEx failed");
1746 static bool test_CloseGroup_int(struct torture_context *tctx,
1747 struct dcerpc_pipe *p,
1748 struct policy_handle *Group)
1750 struct dcerpc_binding_handle *b = p->binding_handle;
1751 struct clusapi_CloseGroup r;
1754 r.out.Group = Group;
1756 torture_assert_ntstatus_ok(tctx,
1757 dcerpc_clusapi_CloseGroup_r(b, tctx, &r),
1758 "CloseGroup failed");
1759 torture_assert_werr_ok(tctx,
1761 "CloseGroup failed");
1762 torture_assert(tctx,
1763 ndr_policy_handle_empty(Group),
1764 "policy_handle non empty after CloseGroup");
1769 static bool test_OpenGroup(struct torture_context *tctx,
1772 struct torture_clusapi_context *t =
1773 talloc_get_type_abort(data, struct torture_clusapi_context);
1774 struct policy_handle hGroup;
1776 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1780 test_CloseGroup_int(tctx, t->p, &hGroup);
1785 static bool test_OpenGroupEx(struct torture_context *tctx,
1788 struct torture_clusapi_context *t =
1789 talloc_get_type_abort(data, struct torture_clusapi_context);
1790 struct policy_handle hGroup;
1792 if (!test_OpenGroupEx_int(tctx, t->p, "Cluster Group", &hGroup)) {
1796 test_CloseGroup_int(tctx, t->p, &hGroup);
1801 static bool test_CloseGroup(struct torture_context *tctx,
1804 struct torture_clusapi_context *t =
1805 talloc_get_type_abort(data, struct torture_clusapi_context);
1806 struct policy_handle hGroup;
1808 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1812 return test_CloseGroup_int(tctx, t->p, &hGroup);
1815 static bool test_GetGroupState_int(struct torture_context *tctx,
1816 struct dcerpc_pipe *p,
1817 struct policy_handle *hGroup)
1819 struct dcerpc_binding_handle *b = p->binding_handle;
1820 struct clusapi_GetGroupState r;
1821 enum clusapi_ClusterGroupState State;
1822 const char *NodeName;
1825 r.in.hGroup = *hGroup;
1826 r.out.State = &State;
1827 r.out.NodeName = &NodeName;
1828 r.out.rpc_status = &rpc_status;
1830 torture_assert_ntstatus_ok(tctx,
1831 dcerpc_clusapi_GetGroupState_r(b, tctx, &r),
1832 "GetGroupState failed");
1833 torture_assert_werr_ok(tctx,
1835 "GetGroupState failed");
1840 static bool test_GetGroupState(struct torture_context *tctx,
1843 struct torture_clusapi_context *t =
1844 talloc_get_type_abort(data, struct torture_clusapi_context);
1845 struct policy_handle hGroup;
1848 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1852 ret = test_GetGroupState_int(tctx, t->p, &hGroup);
1854 test_CloseGroup_int(tctx, t->p, &hGroup);
1859 static bool test_GetGroupId_int(struct torture_context *tctx,
1860 struct dcerpc_pipe *p,
1861 struct policy_handle *hGroup)
1863 struct dcerpc_binding_handle *b = p->binding_handle;
1864 struct clusapi_GetGroupId r;
1868 r.in.hGroup = *hGroup;
1869 r.out.pGuid = &pGuid;
1870 r.out.rpc_status = &rpc_status;
1872 torture_assert_ntstatus_ok(tctx,
1873 dcerpc_clusapi_GetGroupId_r(b, tctx, &r),
1874 "GetGroupId failed");
1875 torture_assert_werr_ok(tctx,
1877 "GetGroupId failed");
1882 static bool test_GetGroupId(struct torture_context *tctx,
1885 struct torture_clusapi_context *t =
1886 talloc_get_type_abort(data, struct torture_clusapi_context);
1887 struct policy_handle hGroup;
1890 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1894 ret = test_GetGroupId_int(tctx, t->p, &hGroup);
1896 test_CloseGroup_int(tctx, t->p, &hGroup);
1901 static bool test_GroupControl_int(struct torture_context *tctx,
1902 struct dcerpc_pipe *p,
1903 struct policy_handle *hGroup,
1904 enum clusapi_GroupControlCode dwControlCode)
1906 struct dcerpc_binding_handle *b = p->binding_handle;
1907 struct clusapi_GroupControl r;
1908 uint32_t lpBytesReturned;
1909 uint32_t lpcbRequired;
1912 r.in.hGroup = *hGroup;
1913 r.in.dwControlCode = 0;
1914 r.in.lpInBuffer = NULL;
1915 r.in.nInBufferSize = 0;
1916 r.in.nOutBufferSize = 0;
1917 r.out.lpOutBuffer = NULL;
1918 r.out.lpBytesReturned = &lpBytesReturned;
1919 r.out.lpcbRequired = &lpcbRequired;
1920 r.out.rpc_status = &rpc_status;
1922 torture_assert_ntstatus_ok(tctx,
1923 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
1924 "GroupControl failed");
1925 torture_assert_werr_equal(tctx,
1927 WERR_INVALID_FUNCTION,
1928 "GroupControl failed");
1930 r.in.dwControlCode = dwControlCode;
1932 torture_assert_ntstatus_ok(tctx,
1933 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
1934 "GroupControl failed");
1936 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
1937 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
1938 r.in.nOutBufferSize = *r.out.lpcbRequired;
1939 torture_assert_ntstatus_ok(tctx,
1940 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
1941 "GroupControl failed");
1943 torture_assert_werr_ok(tctx,
1945 "GroupControl failed");
1947 /* now try what happens when we query with a buffer large enough to hold
1948 * the entire packet */
1950 r.in.nOutBufferSize = 0x400;
1951 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
1953 torture_assert_ntstatus_ok(tctx,
1954 dcerpc_clusapi_GroupControl_r(b, tctx, &r),
1955 "GroupControl failed");
1956 torture_assert_werr_ok(tctx,
1958 "GroupControl failed");
1959 torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
1960 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
1965 static bool test_GroupControl(struct torture_context *tctx,
1968 struct torture_clusapi_context *t =
1969 talloc_get_type_abort(data, struct torture_clusapi_context);
1970 struct policy_handle hGroup;
1973 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1977 ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_CHARACTERISTICS);
1982 ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES);
1987 test_CloseGroup_int(tctx, t->p, &hGroup);
1992 static bool test_OnlineGroup_int(struct torture_context *tctx,
1993 struct dcerpc_pipe *p,
1994 struct policy_handle *hGroup)
1996 struct dcerpc_binding_handle *b = p->binding_handle;
1997 struct clusapi_OnlineGroup r;
2000 r.in.hGroup = *hGroup;
2001 r.out.rpc_status = &rpc_status;
2003 torture_assert_ntstatus_ok(tctx,
2004 dcerpc_clusapi_OnlineGroup_r(b, tctx, &r),
2005 "OnlineGroup failed");
2006 torture_assert_werr_ok(tctx,
2008 "OnlineGroup failed");
2013 static bool test_OnlineGroup(struct torture_context *tctx,
2016 struct torture_clusapi_context *t =
2017 talloc_get_type_abort(data, struct torture_clusapi_context);
2018 struct policy_handle hGroup;
2021 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
2025 ret = test_OnlineGroup_int(tctx, t->p, &hGroup);
2027 test_CloseGroup_int(tctx, t->p, &hGroup);
2032 static bool test_OfflineGroup_int(struct torture_context *tctx,
2033 struct dcerpc_pipe *p,
2034 struct policy_handle *hGroup)
2036 struct dcerpc_binding_handle *b = p->binding_handle;
2037 struct clusapi_OfflineGroup r;
2040 r.in.hGroup = *hGroup;
2041 r.out.rpc_status = &rpc_status;
2043 torture_assert_ntstatus_ok(tctx,
2044 dcerpc_clusapi_OfflineGroup_r(b, tctx, &r),
2045 "OfflineGroup failed");
2046 torture_assert_werr_ok(tctx,
2048 "OfflineGroup failed");
2053 static bool test_OfflineGroup(struct torture_context *tctx,
2056 struct torture_clusapi_context *t =
2057 talloc_get_type_abort(data, struct torture_clusapi_context);
2058 struct policy_handle hGroup;
2061 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
2065 ret = test_OfflineGroup_int(tctx, t->p, &hGroup);
2067 test_CloseGroup_int(tctx, t->p, &hGroup);
2072 static bool test_one_group(struct torture_context *tctx,
2073 struct dcerpc_pipe *p,
2074 const char *node_name)
2076 struct policy_handle hGroup;
2078 torture_assert(tctx,
2079 test_OpenGroup_int(tctx, p, node_name, &hGroup),
2080 "failed to open group");
2081 test_CloseGroup_int(tctx, p, &hGroup);
2083 torture_assert(tctx,
2084 test_OpenGroupEx_int(tctx, p, node_name, &hGroup),
2085 "failed to openex group");
2087 torture_assert(tctx,
2088 test_GetGroupId_int(tctx, p, &hGroup),
2089 "failed to query group id");
2090 torture_assert(tctx,
2091 test_GetGroupState_int(tctx, p, &hGroup),
2092 "failed to query group id");
2094 test_CloseGroup_int(tctx, p, &hGroup);
2099 static bool test_all_groups(struct torture_context *tctx,
2102 struct torture_clusapi_context *t =
2103 talloc_get_type_abort(data, struct torture_clusapi_context);
2104 struct dcerpc_binding_handle *b = t->p->binding_handle;
2105 struct clusapi_CreateEnum r;
2106 uint32_t dwType = CLUSTER_ENUM_GROUP;
2107 struct ENUM_LIST *ReturnEnum;
2111 r.in.dwType = dwType;
2112 r.out.ReturnEnum = &ReturnEnum;
2113 r.out.rpc_status = &rpc_status;
2115 torture_assert_ntstatus_ok(tctx,
2116 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2117 "CreateEnum failed");
2118 torture_assert_werr_ok(tctx,
2120 "CreateEnum failed");
2122 for (i=0; i < ReturnEnum->EntryCount; i++) {
2124 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2126 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_GROUP, "type mismatch");
2128 torture_assert(tctx,
2129 test_one_group(tctx, t->p, e.Name),
2130 "failed to test one group");
2136 static bool test_BackupClusterDatabase(struct torture_context *tctx,
2139 struct torture_clusapi_context *t =
2140 talloc_get_type_abort(data, struct torture_clusapi_context);
2141 struct dcerpc_binding_handle *b = t->p->binding_handle;
2142 struct clusapi_BackupClusterDatabase r;
2145 r.in.lpszPathName = "c:\\cluster_backup";
2146 r.out.rpc_status = &rpc_status;
2148 torture_assert_ntstatus_ok(tctx,
2149 dcerpc_clusapi_BackupClusterDatabase_r(b, tctx, &r),
2150 "BackupClusterDatabase failed");
2151 torture_assert_werr_equal(tctx,
2153 WERR_CALL_NOT_IMPLEMENTED,
2154 "BackupClusterDatabase failed");
2159 static bool test_SetServiceAccountPassword(struct torture_context *tctx,
2162 struct torture_clusapi_context *t =
2163 talloc_get_type_abort(data, struct torture_clusapi_context);
2164 struct dcerpc_binding_handle *b = t->p->binding_handle;
2165 struct clusapi_SetServiceAccountPassword r;
2166 uint32_t SizeReturned;
2167 uint32_t ExpectedBufferSize;
2169 r.in.lpszNewPassword = "P@ssw0rd!";
2170 r.in.dwFlags = IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES;
2171 r.in.ReturnStatusBufferSize = 1024;
2172 r.out.ReturnStatusBufferPtr = NULL;
2173 r.out.SizeReturned = &SizeReturned;
2174 r.out.ExpectedBufferSize = &ExpectedBufferSize;
2176 torture_assert_ntstatus_ok(tctx,
2177 dcerpc_clusapi_SetServiceAccountPassword_r(b, tctx, &r),
2178 "SetServiceAccountPassword failed");
2179 torture_assert_werr_equal(tctx,
2181 WERR_CALL_NOT_IMPLEMENTED,
2182 "SetServiceAccountPassword failed");
2187 static bool test_ClusterControl_int(struct torture_context *tctx,
2188 struct dcerpc_pipe *p,
2189 struct policy_handle *Cluster)
2191 struct dcerpc_binding_handle *b = p->binding_handle;
2192 struct clusapi_ClusterControl r;
2193 uint32_t lpBytesReturned;
2194 uint32_t lpcbRequired;
2197 r.in.hCluster = *Cluster;
2198 r.in.dwControlCode = 0;
2199 r.in.lpInBuffer = NULL;
2200 r.in.nInBufferSize = 0;
2201 r.in.nOutBufferSize = 0;
2202 r.out.lpOutBuffer = NULL;
2203 r.out.lpBytesReturned = &lpBytesReturned;
2204 r.out.lpcbRequired = &lpcbRequired;
2205 r.out.rpc_status = &rpc_status;
2207 torture_assert_ntstatus_ok(tctx,
2208 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
2209 "ClusterControl failed");
2210 torture_assert_werr_equal(tctx,
2212 WERR_INVALID_FUNCTION,
2213 "ClusterControl failed");
2215 r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES;
2217 torture_assert_ntstatus_ok(tctx,
2218 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
2219 "ClusterControl failed");
2221 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
2222 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
2223 r.in.nOutBufferSize = *r.out.lpcbRequired;
2224 torture_assert_ntstatus_ok(tctx,
2225 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
2226 "ClusterControl failed");
2228 torture_assert_werr_ok(tctx,
2230 "ClusterControl failed");
2232 /* now try what happens when we query with a buffer large enough to hold
2233 * the entire packet */
2235 r.in.nOutBufferSize = 0x400;
2236 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
2238 torture_assert_ntstatus_ok(tctx,
2239 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
2240 "ClusterControl failed");
2241 torture_assert_werr_ok(tctx,
2243 "ClusterControl failed");
2244 torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
2245 "lpBytesReturned expected to be smaller than input size nOutBufferSize");
2250 static bool test_ClusterControl(struct torture_context *tctx,
2253 struct torture_clusapi_context *t =
2254 talloc_get_type_abort(data, struct torture_clusapi_context);
2255 struct policy_handle Cluster;
2258 if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
2262 ret = test_ClusterControl_int(tctx, t->p, &Cluster);
2264 test_CloseCluster_int(tctx, t->p, &Cluster);
2269 static bool test_OpenNetwork_int(struct torture_context *tctx,
2270 struct dcerpc_pipe *p,
2271 const char *lpszNetworkName,
2272 struct policy_handle *hNetwork)
2274 struct dcerpc_binding_handle *b = p->binding_handle;
2275 struct clusapi_OpenNetwork r;
2279 r.in.lpszNetworkName = lpszNetworkName;
2280 r.out.rpc_status = &rpc_status;
2281 r.out.Status = &Status;
2282 r.out.hNetwork = hNetwork ;
2284 torture_assert_ntstatus_ok(tctx,
2285 dcerpc_clusapi_OpenNetwork_r(b, tctx, &r),
2286 "OpenNetwork failed");
2287 torture_assert_werr_ok(tctx,
2289 "OpenNetwork failed");
2294 static bool test_OpenNetworkEx_int(struct torture_context *tctx,
2295 struct dcerpc_pipe *p,
2296 const char *lpszNetworkName,
2297 struct policy_handle *hNetwork)
2299 struct dcerpc_binding_handle *b = p->binding_handle;
2300 struct clusapi_OpenNetworkEx r;
2301 uint32_t lpdwGrantedAccess;
2305 r.in.lpszNetworkName = lpszNetworkName;
2306 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
2307 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
2308 r.out.rpc_status = &rpc_status;
2309 r.out.Status = &Status;
2310 r.out.hNetwork = hNetwork ;
2312 torture_assert_ntstatus_ok(tctx,
2313 dcerpc_clusapi_OpenNetworkEx_r(b, tctx, &r),
2314 "OpenNetworkEx failed");
2315 torture_assert_werr_ok(tctx,
2317 "OpenNetworkEx failed");
2322 static bool test_CloseNetwork_int(struct torture_context *tctx,
2323 struct dcerpc_pipe *p,
2324 struct policy_handle *Network)
2326 struct dcerpc_binding_handle *b = p->binding_handle;
2327 struct clusapi_CloseNetwork r;
2329 r.in.Network = Network;
2330 r.out.Network = Network;
2332 torture_assert_ntstatus_ok(tctx,
2333 dcerpc_clusapi_CloseNetwork_r(b, tctx, &r),
2334 "CloseNetwork failed");
2335 torture_assert_werr_ok(tctx,
2337 "CloseNetwork failed");
2338 torture_assert(tctx,
2339 ndr_policy_handle_empty(Network),
2340 "policy_handle non empty after CloseNetwork");
2345 static bool test_OpenNetwork(struct torture_context *tctx,
2348 struct torture_clusapi_context *t =
2349 talloc_get_type_abort(data, struct torture_clusapi_context);
2350 struct policy_handle hNetwork;
2352 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2356 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2361 static bool test_OpenNetworkEx(struct torture_context *tctx,
2364 struct torture_clusapi_context *t =
2365 talloc_get_type_abort(data, struct torture_clusapi_context);
2366 struct policy_handle hNetwork;
2368 if (!test_OpenNetworkEx_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2372 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2377 static bool test_CloseNetwork(struct torture_context *tctx,
2380 struct torture_clusapi_context *t =
2381 talloc_get_type_abort(data, struct torture_clusapi_context);
2382 struct policy_handle hNetwork;
2384 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2388 return test_CloseNetwork_int(tctx, t->p, &hNetwork);
2391 static bool test_GetNetworkState_int(struct torture_context *tctx,
2392 struct dcerpc_pipe *p,
2393 struct policy_handle *hNetwork)
2395 struct dcerpc_binding_handle *b = p->binding_handle;
2396 struct clusapi_GetNetworkState r;
2397 enum clusapi_ClusterNetworkState State;
2400 r.in.hNetwork = *hNetwork;
2401 r.out.State = &State;
2402 r.out.rpc_status = &rpc_status;
2404 torture_assert_ntstatus_ok(tctx,
2405 dcerpc_clusapi_GetNetworkState_r(b, tctx, &r),
2406 "GetNetworkState failed");
2407 torture_assert_werr_ok(tctx,
2409 "GetNetworkState failed");
2414 static bool test_GetNetworkState(struct torture_context *tctx,
2417 struct torture_clusapi_context *t =
2418 talloc_get_type_abort(data, struct torture_clusapi_context);
2419 struct policy_handle hNetwork;
2422 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2426 ret = test_GetNetworkState_int(tctx, t->p, &hNetwork);
2428 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2433 static bool test_GetNetworkId_int(struct torture_context *tctx,
2434 struct dcerpc_pipe *p,
2435 struct policy_handle *hNetwork)
2437 struct dcerpc_binding_handle *b = p->binding_handle;
2438 struct clusapi_GetNetworkId r;
2442 r.in.hNetwork = *hNetwork;
2443 r.out.pGuid = &pGuid;
2444 r.out.rpc_status = &rpc_status;
2446 torture_assert_ntstatus_ok(tctx,
2447 dcerpc_clusapi_GetNetworkId_r(b, tctx, &r),
2448 "GetNetworkId failed");
2449 torture_assert_werr_ok(tctx,
2451 "GetNetworkId failed");
2456 static bool test_GetNetworkId(struct torture_context *tctx,
2459 struct torture_clusapi_context *t =
2460 talloc_get_type_abort(data, struct torture_clusapi_context);
2461 struct policy_handle hNetwork;
2464 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2468 ret = test_GetNetworkId_int(tctx, t->p, &hNetwork);
2470 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2475 static bool test_one_network(struct torture_context *tctx,
2476 struct dcerpc_pipe *p,
2477 const char *network_name)
2479 struct policy_handle hNetwork;
2481 torture_assert(tctx,
2482 test_OpenNetwork_int(tctx, p, network_name, &hNetwork),
2483 "failed to open network");
2484 test_CloseNetwork_int(tctx, p, &hNetwork);
2486 torture_assert(tctx,
2487 test_OpenNetworkEx_int(tctx, p, network_name, &hNetwork),
2488 "failed to openex network");
2490 torture_assert(tctx,
2491 test_GetNetworkId_int(tctx, p, &hNetwork),
2492 "failed to query network id");
2493 torture_assert(tctx,
2494 test_GetNetworkState_int(tctx, p, &hNetwork),
2495 "failed to query network id");
2497 test_CloseNetwork_int(tctx, p, &hNetwork);
2502 static bool test_all_networks(struct torture_context *tctx,
2505 struct torture_clusapi_context *t =
2506 talloc_get_type_abort(data, struct torture_clusapi_context);
2507 struct dcerpc_binding_handle *b = t->p->binding_handle;
2508 struct clusapi_CreateEnum r;
2509 uint32_t dwType = CLUSTER_ENUM_NETWORK;
2510 struct ENUM_LIST *ReturnEnum;
2514 r.in.dwType = dwType;
2515 r.out.ReturnEnum = &ReturnEnum;
2516 r.out.rpc_status = &rpc_status;
2518 torture_assert_ntstatus_ok(tctx,
2519 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2520 "CreateEnum failed");
2521 torture_assert_werr_ok(tctx,
2523 "CreateEnum failed");
2525 for (i=0; i < ReturnEnum->EntryCount; i++) {
2527 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2529 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETWORK, "type mismatch");
2531 torture_assert(tctx,
2532 test_one_network(tctx, t->p, e.Name),
2533 "failed to test one network");
2539 static bool test_OpenNetInterface_int(struct torture_context *tctx,
2540 struct dcerpc_pipe *p,
2541 const char *lpszNetInterfaceName,
2542 struct policy_handle *hNetInterface)
2544 struct dcerpc_binding_handle *b = p->binding_handle;
2545 struct clusapi_OpenNetInterface r;
2549 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2550 r.out.rpc_status = &rpc_status;
2551 r.out.Status = &Status;
2552 r.out.hNetInterface = hNetInterface;
2554 torture_assert_ntstatus_ok(tctx,
2555 dcerpc_clusapi_OpenNetInterface_r(b, tctx, &r),
2556 "OpenNetInterface failed");
2557 torture_assert_werr_ok(tctx,
2559 "OpenNetInterface failed");
2564 static bool test_OpenNetInterfaceEx_int(struct torture_context *tctx,
2565 struct dcerpc_pipe *p,
2566 const char *lpszNetInterfaceName,
2567 struct policy_handle *hNetInterface)
2569 struct dcerpc_binding_handle *b = p->binding_handle;
2570 struct clusapi_OpenNetInterfaceEx r;
2571 uint32_t lpdwGrantedAccess;
2575 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2576 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
2577 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
2578 r.out.rpc_status = &rpc_status;
2579 r.out.Status = &Status;
2580 r.out.hNetInterface = hNetInterface;
2582 torture_assert_ntstatus_ok(tctx,
2583 dcerpc_clusapi_OpenNetInterfaceEx_r(b, tctx, &r),
2584 "OpenNetInterfaceEx failed");
2585 torture_assert_werr_ok(tctx,
2587 "OpenNetInterfaceEx failed");
2592 static bool test_CloseNetInterface_int(struct torture_context *tctx,
2593 struct dcerpc_pipe *p,
2594 struct policy_handle *NetInterface)
2596 struct dcerpc_binding_handle *b = p->binding_handle;
2597 struct clusapi_CloseNetInterface r;
2599 r.in.NetInterface = NetInterface;
2600 r.out.NetInterface = NetInterface;
2602 torture_assert_ntstatus_ok(tctx,
2603 dcerpc_clusapi_CloseNetInterface_r(b, tctx, &r),
2604 "CloseNetInterface failed");
2605 torture_assert_werr_ok(tctx,
2607 "CloseNetInterface failed");
2608 torture_assert(tctx,
2609 ndr_policy_handle_empty(NetInterface),
2610 "policy_handle non empty after CloseNetInterface");
2615 static bool test_OpenNetInterface(struct torture_context *tctx,
2618 struct torture_clusapi_context *t =
2619 talloc_get_type_abort(data, struct torture_clusapi_context);
2620 struct policy_handle hNetInterface;
2622 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2626 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2631 static bool test_OpenNetInterfaceEx(struct torture_context *tctx,
2634 struct torture_clusapi_context *t =
2635 talloc_get_type_abort(data, struct torture_clusapi_context);
2636 struct policy_handle hNetInterface;
2638 if (!test_OpenNetInterfaceEx_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2642 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2647 static bool test_CloseNetInterface(struct torture_context *tctx,
2650 struct torture_clusapi_context *t =
2651 talloc_get_type_abort(data, struct torture_clusapi_context);
2652 struct policy_handle hNetInterface;
2654 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2658 return test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2661 static bool test_GetNetInterfaceState_int(struct torture_context *tctx,
2662 struct dcerpc_pipe *p,
2663 struct policy_handle *hNetInterface)
2665 struct dcerpc_binding_handle *b = p->binding_handle;
2666 struct clusapi_GetNetInterfaceState r;
2667 enum clusapi_ClusterNetInterfaceState State;
2670 r.in.hNetInterface = *hNetInterface;
2671 r.out.State = &State;
2672 r.out.rpc_status = &rpc_status;
2674 torture_assert_ntstatus_ok(tctx,
2675 dcerpc_clusapi_GetNetInterfaceState_r(b, tctx, &r),
2676 "GetNetInterfaceState failed");
2677 torture_assert_werr_ok(tctx,
2679 "GetNetInterfaceState failed");
2684 static bool test_GetNetInterfaceState(struct torture_context *tctx,
2687 struct torture_clusapi_context *t =
2688 talloc_get_type_abort(data, struct torture_clusapi_context);
2689 struct policy_handle hNetInterface;
2692 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2696 ret = test_GetNetInterfaceState_int(tctx, t->p, &hNetInterface);
2698 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2703 static bool test_GetNetInterfaceId_int(struct torture_context *tctx,
2704 struct dcerpc_pipe *p,
2705 struct policy_handle *hNetInterface)
2707 struct dcerpc_binding_handle *b = p->binding_handle;
2708 struct clusapi_GetNetInterfaceId r;
2712 r.in.hNetInterface = *hNetInterface;
2713 r.out.pGuid = &pGuid;
2714 r.out.rpc_status = &rpc_status;
2716 torture_assert_ntstatus_ok(tctx,
2717 dcerpc_clusapi_GetNetInterfaceId_r(b, tctx, &r),
2718 "GetNetInterfaceId failed");
2719 torture_assert_werr_ok(tctx,
2721 "GetNetInterfaceId failed");
2726 static bool test_GetNetInterfaceId(struct torture_context *tctx,
2729 struct torture_clusapi_context *t =
2730 talloc_get_type_abort(data, struct torture_clusapi_context);
2731 struct policy_handle hNetInterface;
2734 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2738 ret = test_GetNetInterfaceId_int(tctx, t->p, &hNetInterface);
2740 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2745 static bool test_one_netinterface(struct torture_context *tctx,
2746 struct dcerpc_pipe *p,
2747 const char *netinterface_name)
2749 struct policy_handle hNetInterface;
2751 torture_assert(tctx,
2752 test_OpenNetInterface_int(tctx, p, netinterface_name, &hNetInterface),
2753 "failed to open netinterface");
2754 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2756 torture_assert(tctx,
2757 test_OpenNetInterfaceEx_int(tctx, p, netinterface_name, &hNetInterface),
2758 "failed to openex netinterface");
2760 torture_assert(tctx,
2761 test_GetNetInterfaceId_int(tctx, p, &hNetInterface),
2762 "failed to query netinterface id");
2763 torture_assert(tctx,
2764 test_GetNetInterfaceState_int(tctx, p, &hNetInterface),
2765 "failed to query netinterface id");
2767 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2772 static bool test_all_netinterfaces(struct torture_context *tctx,
2775 struct torture_clusapi_context *t =
2776 talloc_get_type_abort(data, struct torture_clusapi_context);
2777 struct dcerpc_binding_handle *b = t->p->binding_handle;
2778 struct clusapi_CreateEnum r;
2779 uint32_t dwType = CLUSTER_ENUM_NETINTERFACE;
2780 struct ENUM_LIST *ReturnEnum;
2784 r.in.dwType = dwType;
2785 r.out.ReturnEnum = &ReturnEnum;
2786 r.out.rpc_status = &rpc_status;
2788 torture_assert_ntstatus_ok(tctx,
2789 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2790 "CreateEnum failed");
2791 torture_assert_werr_ok(tctx,
2793 "CreateEnum failed");
2795 for (i=0; i < ReturnEnum->EntryCount; i++) {
2797 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2799 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETINTERFACE, "type mismatch");
2801 torture_assert(tctx,
2802 test_one_netinterface(tctx, t->p, e.Name),
2803 "failed to test one netinterface");
2809 static bool test_CloseKey_int(struct torture_context *tctx,
2810 struct dcerpc_pipe *p,
2811 struct policy_handle *pKey)
2813 struct dcerpc_binding_handle *b = p->binding_handle;
2814 struct clusapi_CloseKey r;
2819 torture_assert_ntstatus_ok(tctx,
2820 dcerpc_clusapi_CloseKey_r(b, tctx, &r),
2822 torture_assert_werr_ok(tctx,
2825 torture_assert(tctx,
2826 ndr_policy_handle_empty(pKey),
2827 "policy_handle non empty after CloseKey");
2832 static bool test_GetRootKey_int(struct torture_context *tctx,
2833 struct dcerpc_pipe *p,
2834 struct policy_handle *phKey)
2836 struct dcerpc_binding_handle *b = p->binding_handle;
2837 struct clusapi_GetRootKey r;
2841 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2842 r.out.Status = &Status;
2843 r.out.rpc_status = &rpc_status;
2844 r.out.phKey = phKey;
2846 torture_assert_ntstatus_ok(tctx,
2847 dcerpc_clusapi_GetRootKey_r(b, tctx, &r),
2848 "GetRootKey failed");
2849 torture_assert_werr_ok(tctx,
2851 "GetRootKey failed");
2856 static bool test_EnumKey_int(struct torture_context *tctx,
2857 struct dcerpc_pipe *p,
2858 struct policy_handle *hKey)
2860 struct dcerpc_binding_handle *b = p->binding_handle;
2861 struct clusapi_EnumKey r;
2862 const char *KeyName;
2863 NTTIME lpftLastWriteTime;
2868 r.out.KeyName = &KeyName;
2869 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2870 r.out.rpc_status = &rpc_status;
2872 torture_assert_ntstatus_ok(tctx,
2873 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
2875 torture_assert_werr_ok(tctx,
2882 static bool test_OpenKey_int(struct torture_context *tctx,
2883 struct dcerpc_pipe *p,
2884 struct policy_handle *hKey,
2885 const char *lpSubKey,
2886 struct policy_handle *phKey)
2888 struct dcerpc_binding_handle *b = p->binding_handle;
2889 struct clusapi_OpenKey r;
2894 r.in.lpSubKey = lpSubKey;
2895 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2896 r.out.Status = &Status;
2897 r.out.rpc_status = &rpc_status;
2898 r.out.phKey = phKey;
2900 torture_assert_ntstatus_ok(tctx,
2901 dcerpc_clusapi_OpenKey_r(b, tctx, &r),
2903 torture_assert_werr_ok(tctx,
2910 static bool test_EnumValue_int(struct torture_context *tctx,
2911 struct dcerpc_pipe *p,
2912 struct policy_handle *hKey)
2914 struct dcerpc_binding_handle *b = p->binding_handle;
2915 struct clusapi_EnumValue r;
2916 const char *lpValueName;
2923 uint32_t lpcbData = 1024;
2927 r.in.lpcbData = &lpcbData;
2928 r.out.lpValueName = &lpValueName;
2929 r.out.lpType = &lpType;
2930 r.out.lpData = talloc_array(tctx, uint8_t, lpcbData);
2931 r.out.TotalSize = &TotalSize;
2932 r.out.rpc_status = &rpc_status;
2933 r.out.lpcbData = &lpcbData;
2935 torture_assert_ntstatus_ok(tctx,
2936 dcerpc_clusapi_EnumValue_r(b, tctx, &r),
2937 "EnumValue failed");
2939 } while (W_ERROR_IS_OK(r.out.result));
2941 torture_assert_werr_equal(tctx,
2944 "EnumValue failed");
2949 static bool test_QueryInfoKey_int(struct torture_context *tctx,
2950 struct dcerpc_pipe *p,
2951 struct policy_handle *hKey)
2953 struct dcerpc_binding_handle *b = p->binding_handle;
2954 struct clusapi_QueryInfoKey r;
2955 uint32_t lpcSubKeys;
2956 uint32_t lpcbMaxSubKeyLen;
2958 uint32_t lpcbMaxValueNameLen;
2959 uint32_t lpcbMaxValueLen;
2960 uint32_t lpcbSecurityDescriptor;
2961 NTTIME lpftLastWriteTime;
2965 r.out.lpcSubKeys = &lpcSubKeys;
2966 r.out.lpcbMaxSubKeyLen = &lpcbMaxSubKeyLen;
2967 r.out.lpcValues = &lpcValues;
2968 r.out.lpcbMaxValueNameLen = &lpcbMaxValueNameLen;
2969 r.out.lpcbMaxValueLen = &lpcbMaxValueLen;
2970 r.out.lpcbSecurityDescriptor = &lpcbSecurityDescriptor;
2971 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2972 r.out.rpc_status = &rpc_status;
2974 torture_assert_ntstatus_ok(tctx,
2975 dcerpc_clusapi_QueryInfoKey_r(b, tctx, &r),
2976 "QueryInfoKey failed");
2977 torture_assert_werr_ok(tctx,
2979 "QueryInfoKey failed");
2984 static bool test_GetKeySecurity_int(struct torture_context *tctx,
2985 struct dcerpc_pipe *p,
2986 struct policy_handle *hKey)
2988 struct dcerpc_binding_handle *b = p->binding_handle;
2989 struct clusapi_GetKeySecurity r;
2990 uint32_t SecurityInformation = SECINFO_DACL | SECINFO_OWNER | SECINFO_GROUP;
2991 struct RPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor;
2994 ZERO_STRUCT(pRpcSecurityDescriptor);
2997 r.in.SecurityInformation = SecurityInformation;
2998 r.in.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
2999 r.out.rpc_status = &rpc_status;
3000 r.out.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
3002 torture_assert_ntstatus_ok(tctx,
3003 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
3004 "GetKeySecurity failed");
3006 if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
3007 pRpcSecurityDescriptor.lpSecurityDescriptor = talloc_array(tctx,
3008 uint8_t, pRpcSecurityDescriptor.cbInSecurityDescriptor);
3010 torture_assert_ntstatus_ok(tctx,
3011 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
3012 "GetKeySecurity failed");
3015 torture_assert_werr_ok(tctx,
3017 "GetKeySecurity failed");
3022 static bool test_GetRootKey(struct torture_context *tctx,
3025 struct torture_clusapi_context *t =
3026 talloc_get_type_abort(data, struct torture_clusapi_context);
3027 struct policy_handle hKey;
3029 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
3033 test_CloseKey_int(tctx, t->p, &hKey);
3038 static bool test_CloseKey(struct torture_context *tctx,
3041 struct torture_clusapi_context *t =
3042 talloc_get_type_abort(data, struct torture_clusapi_context);
3043 struct policy_handle hKey;
3045 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
3049 return test_CloseKey_int(tctx, t->p, &hKey);
3052 static bool test_EnumKey(struct torture_context *tctx,
3055 struct torture_clusapi_context *t =
3056 talloc_get_type_abort(data, struct torture_clusapi_context);
3057 struct policy_handle hKey;
3060 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
3064 ret = test_EnumKey_int(tctx, t->p, &hKey);
3066 test_CloseKey_int(tctx, t->p, &hKey);
3071 static bool test_QueryValue_int(struct torture_context *tctx,
3072 struct dcerpc_pipe *p,
3073 struct policy_handle *hKey,
3074 const char *ValueName)
3076 struct dcerpc_binding_handle *b = p->binding_handle;
3077 struct clusapi_QueryValue r;
3078 uint32_t lpValueType;
3079 uint32_t lpcbRequired;
3083 r.in.lpValueName = ValueName;
3085 r.out.lpValueType = &lpValueType;
3086 r.out.lpData = NULL;
3087 r.out.lpcbRequired = &lpcbRequired;
3088 r.out.rpc_status = &rpc_status;
3090 torture_assert_ntstatus_ok(tctx,
3091 dcerpc_clusapi_QueryValue_r(b, tctx, &r),
3092 "QueryValue failed");
3094 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
3096 r.in.cbData = lpcbRequired;
3097 r.out.lpData = talloc_zero_array(tctx, uint8_t, r.in.cbData);
3099 torture_assert_ntstatus_ok(tctx,
3100 dcerpc_clusapi_QueryValue_r(b, tctx, &r),
3101 "QueryValue failed");
3104 torture_assert_werr_ok(tctx,
3106 "QueryValue failed");
3108 if (lpValueType == REG_SZ) {
3110 DATA_BLOB blob = data_blob_const(r.out.lpData, lpcbRequired);
3111 pull_reg_sz(tctx, &blob, &s);
3112 torture_comment(tctx, "got: %s\n", s);
3118 static bool test_QueryValue(struct torture_context *tctx,
3121 struct torture_clusapi_context *t =
3122 talloc_get_type_abort(data, struct torture_clusapi_context);
3123 struct policy_handle hKey;
3126 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
3130 ret = test_QueryValue_int(tctx, t->p, &hKey, "ClusterInstanceID");
3132 test_CloseKey_int(tctx, t->p, &hKey);
3138 static bool test_one_key(struct torture_context *tctx,
3139 struct dcerpc_pipe *p,
3140 struct policy_handle *hKey,
3141 const char *KeyName)
3143 struct policy_handle phKey;
3145 torture_assert(tctx,
3146 test_OpenKey_int(tctx, p, hKey, KeyName, &phKey),
3147 "failed to open key");
3149 torture_assert(tctx,
3150 test_QueryInfoKey_int(tctx, p, &phKey),
3151 "failed to enum values");
3152 torture_assert(tctx,
3153 test_GetKeySecurity_int(tctx, p, &phKey),
3154 "failed to get key security");
3156 torture_assert(tctx,
3157 test_EnumValue_int(tctx, p, &phKey),
3158 "failed to enum values");
3160 torture_assert(tctx,
3161 test_CloseKey_int(tctx, p, &phKey),
3162 "failed to close key");
3167 static bool test_all_keys(struct torture_context *tctx,
3170 struct torture_clusapi_context *t =
3171 talloc_get_type_abort(data, struct torture_clusapi_context);
3172 struct dcerpc_binding_handle *b = t->p->binding_handle;
3173 struct policy_handle hKey;
3174 struct clusapi_EnumKey r;
3175 const char *KeyName;
3176 NTTIME lpftLastWriteTime;
3180 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
3187 r.out.KeyName = &KeyName;
3188 r.out.lpftLastWriteTime = &lpftLastWriteTime;
3189 r.out.rpc_status = &rpc_status;
3191 torture_assert_ntstatus_ok(tctx,
3192 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
3195 if (W_ERROR_IS_OK(r.out.result)) {
3196 torture_assert(tctx,
3197 test_one_key(tctx, t->p, &hKey, KeyName),
3198 "failed to test one key");
3201 } while (W_ERROR_IS_OK(r.out.result));
3203 torture_assert_werr_equal(tctx,
3208 test_CloseKey_int(tctx, t->p, &hKey);
3213 static bool torture_rpc_clusapi_setup_common(struct torture_context *tctx,
3214 struct torture_clusapi_context *t)
3216 struct dcerpc_binding_handle *b;
3218 torture_assert_ntstatus_ok(tctx,
3219 torture_rpc_connection(tctx, &t->p, &ndr_table_clusapi),
3220 "Error connecting to server");
3223 struct clusapi_GetClusterName r;
3225 b = t->p->binding_handle;
3227 r.out.ClusterName = &t->ClusterName;
3228 r.out.NodeName = &t->NodeName;
3230 torture_assert_ntstatus_ok(tctx,
3231 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
3232 "GetClusterName failed");
3233 torture_assert_werr_ok(tctx,
3235 "GetClusterName failed");
3241 static bool torture_rpc_clusapi_setup(struct torture_context *tctx,
3244 struct torture_clusapi_context *t;
3246 *data = t = talloc_zero(tctx, struct torture_clusapi_context);
3248 return torture_rpc_clusapi_setup_common(tctx, t);
3251 static bool torture_rpc_clusapi_teardown(struct torture_context *tctx,
3259 void torture_tcase_cluster(struct torture_tcase *tcase)
3261 torture_tcase_add_simple_test(tcase, "OpenCluster",
3263 torture_tcase_add_simple_test(tcase, "OpenClusterEx",
3264 test_OpenClusterEx);
3265 torture_tcase_add_simple_test(tcase, "CloseCluster",
3267 torture_tcase_add_simple_test(tcase, "SetClusterName",
3268 test_SetClusterName);
3269 torture_tcase_add_simple_test(tcase, "GetClusterName",
3270 test_GetClusterName);
3271 torture_tcase_add_simple_test(tcase, "GetClusterVersion",
3272 test_GetClusterVersion);
3273 torture_tcase_add_simple_test(tcase, "CreateEnum",
3275 torture_tcase_add_simple_test(tcase, "CreateEnumEx",
3277 torture_tcase_add_simple_test(tcase, "GetClusterVersion2",
3278 test_GetClusterVersion2);
3279 torture_tcase_add_simple_test(tcase, "BackupClusterDatabase",
3280 test_BackupClusterDatabase);
3281 torture_tcase_add_simple_test(tcase, "SetServiceAccountPassword",
3282 test_SetServiceAccountPassword);
3283 torture_tcase_add_simple_test(tcase, "ClusterControl",
3284 test_ClusterControl);
3288 void torture_tcase_resource(struct torture_tcase *tcase)
3290 struct torture_test *test;
3292 torture_tcase_add_simple_test(tcase, "GetQuorumResource",
3293 test_GetQuorumResource);
3294 torture_tcase_add_simple_test(tcase, "SetQuorumResource",
3295 test_SetQuorumResource);
3296 torture_tcase_add_simple_test(tcase, "OpenResource",
3298 torture_tcase_add_simple_test(tcase, "OpenResourceEx",
3299 test_OpenResourceEx);
3300 torture_tcase_add_simple_test(tcase, "CloseResource",
3301 test_CloseResource);
3302 torture_tcase_add_simple_test(tcase, "CreateResource",
3303 test_CreateResource);
3304 torture_tcase_add_simple_test(tcase, "DeleteResource",
3305 test_DeleteResource);
3306 torture_tcase_add_simple_test(tcase, "SetResourceName",
3307 test_SetResourceName);
3308 torture_tcase_add_simple_test(tcase, "GetResourceState",
3309 test_GetResourceState);
3310 torture_tcase_add_simple_test(tcase, "GetResourceId",
3311 test_GetResourceId);
3312 torture_tcase_add_simple_test(tcase, "GetResourceType",
3313 test_GetResourceType);
3314 torture_tcase_add_simple_test(tcase, "CreateResEnum",
3315 test_CreateResEnum);
3316 test = torture_tcase_add_simple_test(tcase, "FailResource",
3318 test->dangerous = true;
3319 torture_tcase_add_simple_test(tcase, "OnlineResource",
3320 test_OnlineResource);
3321 test = torture_tcase_add_simple_test(tcase, "OfflineResource",
3322 test_OfflineResource);
3323 test->dangerous = true;
3324 torture_tcase_add_simple_test(tcase, "GetResourceDependencyExpression",
3325 test_GetResourceDependencyExpression);
3326 torture_tcase_add_simple_test(tcase, "GetResourceNetworkName",
3327 test_GetResourceNetworkName);
3328 torture_tcase_add_simple_test(tcase, "all_resources",
3329 test_all_resources);
3332 void torture_tcase_node(struct torture_tcase *tcase)
3334 struct torture_test *test;
3336 torture_tcase_add_simple_test(tcase, "OpenNode",
3338 torture_tcase_add_simple_test(tcase, "OpenNodeEx",
3340 torture_tcase_add_simple_test(tcase, "CloseNode",
3342 torture_tcase_add_simple_test(tcase, "GetNodeState",
3344 torture_tcase_add_simple_test(tcase, "GetNodeId",
3346 torture_tcase_add_simple_test(tcase, "NodeControl",
3348 test = torture_tcase_add_simple_test(tcase, "PauseNode",
3350 test->dangerous = true;
3351 torture_tcase_add_simple_test(tcase, "ResumeNode",
3353 test = torture_tcase_add_simple_test(tcase, "EvictNode",
3355 test->dangerous = true;
3356 torture_tcase_add_simple_test(tcase, "all_nodes",
3360 void torture_tcase_group(struct torture_tcase *tcase)
3362 struct torture_test *test;
3364 torture_tcase_add_simple_test(tcase, "OpenGroup",
3366 torture_tcase_add_simple_test(tcase, "OpenGroupEx",
3368 torture_tcase_add_simple_test(tcase, "CloseGroup",
3370 torture_tcase_add_simple_test(tcase, "GetGroupState",
3371 test_GetGroupState);
3372 torture_tcase_add_simple_test(tcase, "GetGroupId",
3374 torture_tcase_add_simple_test(tcase, "GroupControl",
3376 torture_tcase_add_simple_test(tcase, "OnlineGroup",
3378 test = torture_tcase_add_simple_test(tcase, "OfflineGroup",
3380 test->dangerous = true;
3381 torture_tcase_add_simple_test(tcase, "all_groups",
3385 void torture_tcase_network(struct torture_tcase *tcase)
3387 torture_tcase_add_simple_test(tcase, "OpenNetwork",
3389 torture_tcase_add_simple_test(tcase, "OpenNetworkEx",
3390 test_OpenNetworkEx);
3391 torture_tcase_add_simple_test(tcase, "CloseNetwork",
3393 torture_tcase_add_simple_test(tcase, "GetNetworkState",
3394 test_GetNetworkState);
3395 torture_tcase_add_simple_test(tcase, "GetNetworkId",
3397 torture_tcase_add_simple_test(tcase, "all_networks",
3401 void torture_tcase_netinterface(struct torture_tcase *tcase)
3403 torture_tcase_add_simple_test(tcase, "OpenNetInterface",
3404 test_OpenNetInterface);
3405 torture_tcase_add_simple_test(tcase, "OpenNetInterfaceEx",
3406 test_OpenNetInterfaceEx);
3407 torture_tcase_add_simple_test(tcase, "CloseNetInterface",
3408 test_CloseNetInterface);
3409 torture_tcase_add_simple_test(tcase, "GetNetInterfaceState",
3410 test_GetNetInterfaceState);
3411 torture_tcase_add_simple_test(tcase, "GetNetInterfaceId",
3412 test_GetNetInterfaceId);
3413 torture_tcase_add_simple_test(tcase, "all_netinterfaces",
3414 test_all_netinterfaces);
3417 void torture_tcase_registry(struct torture_tcase *tcase)
3419 torture_tcase_add_simple_test(tcase, "GetRootKey",
3421 torture_tcase_add_simple_test(tcase, "CloseKey",
3423 torture_tcase_add_simple_test(tcase, "EnumKey",
3425 torture_tcase_add_simple_test(tcase, "QueryValue",
3427 torture_tcase_add_simple_test(tcase, "all_keys",
3431 struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
3433 struct torture_tcase *tcase;
3434 struct torture_suite *suite = torture_suite_create(mem_ctx, "clusapi");
3436 tcase = torture_suite_add_tcase(suite, "cluster");
3438 torture_tcase_set_fixture(tcase,
3439 torture_rpc_clusapi_setup,
3440 torture_rpc_clusapi_teardown);
3442 torture_tcase_cluster(tcase);
3444 tcase = torture_suite_add_tcase(suite, "resource");
3446 torture_tcase_set_fixture(tcase,
3447 torture_rpc_clusapi_setup,
3448 torture_rpc_clusapi_teardown);
3450 torture_tcase_resource(tcase);
3452 tcase = torture_suite_add_tcase(suite, "node");
3454 torture_tcase_set_fixture(tcase,
3455 torture_rpc_clusapi_setup,
3456 torture_rpc_clusapi_teardown);
3458 torture_tcase_node(tcase);
3460 tcase = torture_suite_add_tcase(suite, "group");
3462 torture_tcase_set_fixture(tcase,
3463 torture_rpc_clusapi_setup,
3464 torture_rpc_clusapi_teardown);
3466 torture_tcase_group(tcase);
3468 tcase = torture_suite_add_tcase(suite, "network");
3470 torture_tcase_set_fixture(tcase,
3471 torture_rpc_clusapi_setup,
3472 torture_rpc_clusapi_teardown);
3474 torture_tcase_network(tcase);
3476 tcase = torture_suite_add_tcase(suite, "netinterface");
3478 torture_tcase_set_fixture(tcase,
3479 torture_rpc_clusapi_setup,
3480 torture_rpc_clusapi_teardown);
3482 torture_tcase_netinterface(tcase);
3484 tcase = torture_suite_add_tcase(suite, "registry");
3486 torture_tcase_set_fixture(tcase,
3487 torture_rpc_clusapi_setup,
3488 torture_rpc_clusapi_teardown);
3490 torture_tcase_registry(tcase);