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_GetQuorumResource(struct torture_context *tctx,
331 struct torture_clusapi_context *t =
332 talloc_get_type_abort(data, struct torture_clusapi_context);
333 struct dcerpc_binding_handle *b = t->p->binding_handle;
334 struct clusapi_GetQuorumResource r;
335 const char *lpszResourceName;
336 const char *lpszDeviceName;
337 uint32_t pdwMaxQuorumLogSize;
340 r.out.lpszResourceName = &lpszResourceName;
341 r.out.lpszDeviceName = &lpszDeviceName;
342 r.out.pdwMaxQuorumLogSize = &pdwMaxQuorumLogSize;
343 r.out.rpc_status = &rpc_status;
345 torture_assert_ntstatus_ok(tctx,
346 dcerpc_clusapi_GetQuorumResource_r(b, tctx, &r),
347 "GetQuorumResource failed");
348 torture_assert_werr_ok(tctx,
350 "GetQuorumResource failed");
355 static bool test_SetQuorumResource(struct torture_context *tctx,
358 struct torture_clusapi_context *t =
359 talloc_get_type_abort(data, struct torture_clusapi_context);
360 struct dcerpc_binding_handle *b = t->p->binding_handle;
361 struct clusapi_SetQuorumResource r;
362 const char *lpszDeviceName = "";
363 uint32_t dwMaxQuorumLogSize = 0;
365 struct policy_handle hResource;
367 /* we need to figure out how this call works and what we provide as
368 devicename and resource handle - gd
371 torture_skip(tctx, "skipping SetQuorumResource test");
373 ZERO_STRUCT(hResource);
375 r.in.hResource = hResource;
376 r.in.lpszDeviceName = lpszDeviceName;
377 r.in.dwMaxQuorumLogSize = dwMaxQuorumLogSize;
378 r.out.rpc_status = &rpc_status;
380 torture_assert_ntstatus_ok(tctx,
381 dcerpc_clusapi_SetQuorumResource_r(b, tctx, &r),
382 "SetQuorumResource failed");
383 torture_assert_werr_ok(tctx,
385 "SetQuorumResource failed");
390 static bool test_OpenResource_int_exp(struct torture_context *tctx,
391 struct dcerpc_pipe *p,
392 const char *lpszResourceName,
393 struct policy_handle *hResource,
394 WERROR expected_Status,
395 WERROR expected_rpc_status)
397 struct dcerpc_binding_handle *b = p->binding_handle;
398 struct clusapi_OpenResource r;
402 r.in.lpszResourceName = lpszResourceName;
403 r.out.rpc_status = &rpc_status;
404 r.out.Status = &Status;
405 r.out.hResource = hResource;
407 torture_assert_ntstatus_ok(tctx,
408 dcerpc_clusapi_OpenResource_r(b, tctx, &r),
409 "OpenResource failed");
410 torture_assert_werr_equal(tctx,
411 *r.out.Status, expected_Status,
412 "OpenResource failed");
413 torture_assert_werr_equal(tctx,
414 *r.out.rpc_status, expected_rpc_status,
415 "OpenResource failed");
420 bool test_OpenResource_int(struct torture_context *tctx,
421 struct dcerpc_pipe *p,
422 const char *lpszResourceName,
423 struct policy_handle *hResource)
425 return test_OpenResource_int_exp(tctx, p,
431 static bool test_OpenResourceEx_int(struct torture_context *tctx,
432 struct dcerpc_pipe *p,
433 const char *lpszResourceName,
434 struct policy_handle *hResource)
436 struct dcerpc_binding_handle *b = p->binding_handle;
437 struct clusapi_OpenResourceEx r;
438 uint32_t lpdwGrantedAccess;
442 r.in.lpszResourceName = lpszResourceName;
443 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
444 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
445 r.out.rpc_status = &rpc_status;
446 r.out.Status = &Status;
447 r.out.hResource = hResource;
449 torture_assert_ntstatus_ok(tctx,
450 dcerpc_clusapi_OpenResourceEx_r(b, tctx, &r),
451 "OpenResourceEx failed");
452 torture_assert_werr_ok(tctx,
454 "OpenResourceEx failed");
459 bool test_CloseResource_int(struct torture_context *tctx,
460 struct dcerpc_pipe *p,
461 struct policy_handle *hResource)
463 struct dcerpc_binding_handle *b = p->binding_handle;
464 struct clusapi_CloseResource r;
466 r.in.Resource = hResource;
467 r.out.Resource = hResource;
469 torture_assert_ntstatus_ok(tctx,
470 dcerpc_clusapi_CloseResource_r(b, tctx, &r),
471 "CloseResource failed");
472 torture_assert_werr_ok(tctx,
474 "CloseResource failed");
476 ndr_policy_handle_empty(hResource),
477 "policy_handle non empty after CloseResource");
482 static bool test_OpenResource(struct torture_context *tctx,
485 struct torture_clusapi_context *t =
486 talloc_get_type_abort(data, struct torture_clusapi_context);
487 struct policy_handle hResource;
489 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
493 test_CloseResource_int(tctx, t->p, &hResource);
495 if (!test_OpenResource_int_exp(tctx, t->p, "", &hResource, WERR_RESOURCE_NOT_FOUND, WERR_OK)) {
500 ndr_policy_handle_empty(&hResource),
501 "expected empty policy handle");
503 if (!test_OpenResource_int_exp(tctx, t->p, "jfUF38fjSNcfn", &hResource, WERR_RESOURCE_NOT_FOUND, WERR_OK)) {
508 ndr_policy_handle_empty(&hResource),
509 "expected empty policy handle");
514 static bool test_OpenResourceEx(struct torture_context *tctx,
517 struct torture_clusapi_context *t =
518 talloc_get_type_abort(data, struct torture_clusapi_context);
519 struct policy_handle hResource;
521 if (!test_OpenResourceEx_int(tctx, t->p, "Cluster Name", &hResource)) {
525 test_CloseResource_int(tctx, t->p, &hResource);
531 static bool test_CloseResource(struct torture_context *tctx,
534 struct torture_clusapi_context *t =
535 talloc_get_type_abort(data, struct torture_clusapi_context);
536 struct policy_handle hResource;
538 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
542 return test_CloseResource_int(tctx, t->p, &hResource);
545 static bool test_OpenGroup_int(struct torture_context *tctx,
546 struct dcerpc_pipe *p,
547 const char *lpszGroupName,
548 struct policy_handle *hGroup);
549 static bool test_CloseGroup_int(struct torture_context *tctx,
550 struct dcerpc_pipe *p,
551 struct policy_handle *Group);
553 static bool test_CreateResource_int(struct torture_context *tctx,
554 struct dcerpc_pipe *p,
555 struct policy_handle *hResource)
557 struct dcerpc_binding_handle *b = p->binding_handle;
558 struct clusapi_CreateResource r;
559 const char *lpszResourceName = "wurst";
560 const char *lpszResourceType = "Generic Service";
563 struct policy_handle hGroup;
566 test_OpenGroup_int(tctx, p, "Cluster Group", &hGroup),
567 "failed to open group");
569 r.in.hGroup = hGroup;
570 r.in.lpszResourceName = lpszResourceName;
571 r.in.lpszResourceType = lpszResourceType;
572 r.in.dwFlags = CLUSTER_RESOURCE_DEFAULT_MONITOR;
573 r.out.rpc_status = &rpc_status;
574 r.out.Status = &Status;
575 r.out.hResource = hResource;
577 torture_assert_ntstatus_ok(tctx,
578 dcerpc_clusapi_CreateResource_r(b, tctx, &r),
579 "CreateResource failed");
580 torture_assert_werr_ok(tctx,
582 "CreateResource failed");
584 test_CloseGroup_int(tctx, p, &hGroup);
589 static bool test_DeleteResource_int(struct torture_context *tctx,
590 struct dcerpc_pipe *p,
591 struct policy_handle *hResource)
593 struct dcerpc_binding_handle *b = p->binding_handle;
594 struct clusapi_DeleteResource r;
597 r.in.hResource = *hResource;
598 r.out.rpc_status = &rpc_status;
600 torture_assert_ntstatus_ok(tctx,
601 dcerpc_clusapi_DeleteResource_r(b, tctx, &r),
602 "DeleteResource failed");
603 torture_assert_werr_ok(tctx,
605 "DeleteResource failed");
610 static bool test_CreateResource(struct torture_context *tctx,
613 struct torture_clusapi_context *t =
614 talloc_get_type_abort(data, struct torture_clusapi_context);
615 struct policy_handle hResource;
617 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
621 test_DeleteResource_int(tctx, t->p, &hResource);
626 static bool test_DeleteResource(struct torture_context *tctx,
629 struct torture_clusapi_context *t =
630 talloc_get_type_abort(data, struct torture_clusapi_context);
631 struct policy_handle hResource;
633 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
637 return test_DeleteResource_int(tctx, t->p, &hResource);
640 static bool test_SetResourceName_int(struct torture_context *tctx,
641 struct dcerpc_pipe *p,
642 struct policy_handle *hResource)
644 struct dcerpc_binding_handle *b = p->binding_handle;
645 struct clusapi_SetResourceName r;
648 r.in.hResource = *hResource;
649 r.in.lpszResourceName = "wurst";
650 r.out.rpc_status = &rpc_status;
652 torture_assert_ntstatus_ok(tctx,
653 dcerpc_clusapi_SetResourceName_r(b, tctx, &r),
654 "SetResourceName failed");
655 torture_assert_werr_ok(tctx,
657 "SetResourceName failed");
662 static bool test_SetResourceName(struct torture_context *tctx,
665 struct torture_clusapi_context *t =
666 talloc_get_type_abort(data, struct torture_clusapi_context);
667 struct policy_handle hResource;
670 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
674 ret = test_SetResourceName_int(tctx, t->p, &hResource);
676 test_DeleteResource_int(tctx, t->p, &hResource);
681 static bool test_GetResourceState_int(struct torture_context *tctx,
682 struct dcerpc_pipe *p,
683 struct policy_handle *hResource)
685 struct dcerpc_binding_handle *b = p->binding_handle;
686 struct clusapi_GetResourceState r;
687 enum clusapi_ClusterResourceState State;
688 const char *NodeName;
689 const char *GroupName;
692 r.in.hResource = *hResource;
693 r.out.State = &State;
694 r.out.NodeName = &NodeName;
695 r.out.GroupName = &GroupName;
696 r.out.rpc_status = &rpc_status;
698 torture_assert_ntstatus_ok(tctx,
699 dcerpc_clusapi_GetResourceState_r(b, tctx, &r),
700 "GetResourceState failed");
701 torture_assert_werr_ok(tctx,
703 "GetResourceState failed");
708 static bool test_GetResourceState(struct torture_context *tctx,
711 struct torture_clusapi_context *t =
712 talloc_get_type_abort(data, struct torture_clusapi_context);
713 struct policy_handle hResource;
716 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
720 ret = test_GetResourceState_int(tctx, t->p, &hResource);
722 test_CloseResource_int(tctx, t->p, &hResource);
727 static bool test_GetResourceId_int(struct torture_context *tctx,
728 struct dcerpc_pipe *p,
729 struct policy_handle *hResource)
731 struct dcerpc_binding_handle *b = p->binding_handle;
732 struct clusapi_GetResourceId r;
736 r.in.hResource = *hResource;
737 r.out.pGuid = &pGuid;
738 r.out.rpc_status = &rpc_status;
740 torture_assert_ntstatus_ok(tctx,
741 dcerpc_clusapi_GetResourceId_r(b, tctx, &r),
742 "GetResourceId failed");
743 torture_assert_werr_ok(tctx,
745 "GetResourceId failed");
750 static bool test_GetResourceId(struct torture_context *tctx,
753 struct torture_clusapi_context *t =
754 talloc_get_type_abort(data, struct torture_clusapi_context);
755 struct policy_handle hResource;
758 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
762 ret = test_GetResourceId_int(tctx, t->p, &hResource);
764 test_CloseResource_int(tctx, t->p, &hResource);
769 static bool test_GetResourceType_int(struct torture_context *tctx,
770 struct dcerpc_pipe *p,
771 struct policy_handle *hResource)
773 struct dcerpc_binding_handle *b = p->binding_handle;
774 struct clusapi_GetResourceType r;
775 const char *lpszResourceType;
778 r.in.hResource = *hResource;
779 r.out.lpszResourceType = &lpszResourceType;
780 r.out.rpc_status = &rpc_status;
782 torture_assert_ntstatus_ok(tctx,
783 dcerpc_clusapi_GetResourceType_r(b, tctx, &r),
784 "GetResourceType failed");
785 torture_assert_werr_ok(tctx,
787 "GetResourceType failed");
792 static bool test_GetResourceType(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_GetResourceType_int(tctx, t->p, &hResource);
806 test_CloseResource_int(tctx, t->p, &hResource);
811 static bool test_FailResource_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_FailResource r;
819 r.in.hResource = *hResource;
820 r.out.rpc_status = &rpc_status;
822 torture_assert_ntstatus_ok(tctx,
823 dcerpc_clusapi_FailResource_r(b, tctx, &r),
824 "FailResource failed");
825 torture_assert_werr_ok(tctx,
827 "FailResource failed");
832 static bool test_FailResource(struct torture_context *tctx,
835 struct torture_clusapi_context *t =
836 talloc_get_type_abort(data, struct torture_clusapi_context);
837 struct policy_handle hResource;
840 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
844 ret = test_FailResource_int(tctx, t->p, &hResource);
846 test_CloseResource_int(tctx, t->p, &hResource);
851 bool test_OnlineResource_int(struct torture_context *tctx,
852 struct dcerpc_pipe *p,
853 struct policy_handle *hResource)
855 struct dcerpc_binding_handle *b = p->binding_handle;
856 struct clusapi_OnlineResource r;
859 r.in.hResource = *hResource;
860 r.out.rpc_status = &rpc_status;
862 torture_assert_ntstatus_ok(tctx,
863 dcerpc_clusapi_OnlineResource_r(b, tctx, &r),
864 "OnlineResource failed");
865 torture_assert_werr_ok(tctx,
867 "OnlineResource failed");
872 static bool test_OnlineResource(struct torture_context *tctx,
875 struct torture_clusapi_context *t =
876 talloc_get_type_abort(data, struct torture_clusapi_context);
877 struct policy_handle hResource;
880 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
884 ret = test_OnlineResource_int(tctx, t->p, &hResource);
886 test_CloseResource_int(tctx, t->p, &hResource);
891 bool test_OfflineResource_int(struct torture_context *tctx,
892 struct dcerpc_pipe *p,
893 struct policy_handle *hResource)
895 struct dcerpc_binding_handle *b = p->binding_handle;
896 struct clusapi_OfflineResource r;
899 r.in.hResource = *hResource;
900 r.out.rpc_status = &rpc_status;
902 torture_assert_ntstatus_ok(tctx,
903 dcerpc_clusapi_OfflineResource_r(b, tctx, &r),
904 "OfflineResource failed");
905 torture_assert_werr_ok(tctx,
907 "OfflineResource failed");
912 static bool test_OfflineResource(struct torture_context *tctx,
915 struct torture_clusapi_context *t =
916 talloc_get_type_abort(data, struct torture_clusapi_context);
917 struct policy_handle hResource;
920 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
924 ret = test_OfflineResource_int(tctx, t->p, &hResource);
926 test_CloseResource_int(tctx, t->p, &hResource);
931 static bool test_CreateResEnum_int(struct torture_context *tctx,
932 struct dcerpc_pipe *p,
933 struct policy_handle *hResource)
935 struct dcerpc_binding_handle *b = p->binding_handle;
936 struct clusapi_CreateResEnum r;
937 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
938 struct ENUM_LIST *ReturnEnum;
941 r.in.hResource = *hResource;
942 r.in.dwType = dwType;
943 r.out.ReturnEnum = &ReturnEnum;
944 r.out.rpc_status = &rpc_status;
946 torture_assert_ntstatus_ok(tctx,
947 dcerpc_clusapi_CreateResEnum_r(b, tctx, &r),
948 "CreateResEnum failed");
949 torture_assert_werr_ok(tctx,
951 "CreateResEnum failed");
956 static bool test_CreateResEnum(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_CreateResEnum_int(tctx, t->p, &hResource);
970 test_CloseResource_int(tctx, t->p, &hResource);
975 static bool test_GetResourceDependencyExpression_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_GetResourceDependencyExpression r;
981 const char *lpszDependencyExpression;
984 r.in.hResource = *hResource;
985 r.out.lpszDependencyExpression = &lpszDependencyExpression;
986 r.out.rpc_status = &rpc_status;
988 torture_assert_ntstatus_ok(tctx,
989 dcerpc_clusapi_GetResourceDependencyExpression_r(b, tctx, &r),
990 "GetResourceDependencyExpression failed");
991 torture_assert_werr_ok(tctx,
993 "GetResourceDependencyExpression failed");
998 static bool test_GetResourceDependencyExpression(struct torture_context *tctx,
1001 struct torture_clusapi_context *t =
1002 talloc_get_type_abort(data, struct torture_clusapi_context);
1003 struct policy_handle hResource;
1006 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
1010 ret = test_GetResourceDependencyExpression_int(tctx, t->p, &hResource);
1012 test_CloseResource_int(tctx, t->p, &hResource);
1017 static bool test_GetResourceNetworkName_int(struct torture_context *tctx,
1018 struct dcerpc_pipe *p,
1019 struct policy_handle *hResource)
1021 struct dcerpc_binding_handle *b = p->binding_handle;
1022 struct clusapi_GetResourceNetworkName r;
1023 const char *lpszName;
1026 r.in.hResource = *hResource;
1027 r.out.lpszName = &lpszName;
1028 r.out.rpc_status = &rpc_status;
1030 torture_assert_ntstatus_ok(tctx,
1031 dcerpc_clusapi_GetResourceNetworkName_r(b, tctx, &r),
1032 "GetResourceNetworkName failed");
1033 torture_assert_werr_ok(tctx,
1035 "GetResourceNetworkName failed");
1040 static bool test_GetResourceNetworkName(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, "Network Name", &hResource)) {
1052 ret = test_GetResourceNetworkName_int(tctx, t->p, &hResource);
1054 test_CloseResource_int(tctx, t->p, &hResource);
1059 static bool test_one_resource(struct torture_context *tctx,
1060 struct dcerpc_pipe *p,
1061 const char *resource_name)
1063 struct policy_handle hResource;
1065 torture_assert(tctx,
1066 test_OpenResource_int(tctx, p, resource_name, &hResource),
1067 "failed to open resource");
1068 test_CloseResource_int(tctx, p, &hResource);
1070 torture_assert(tctx,
1071 test_OpenResourceEx_int(tctx, p, resource_name, &hResource),
1072 "failed to openex resource");
1074 torture_assert(tctx,
1075 test_GetResourceType_int(tctx, p, &hResource),
1076 "failed to query resource type");
1077 torture_assert(tctx,
1078 test_GetResourceId_int(tctx, p, &hResource),
1079 "failed to query resource id");
1080 torture_assert(tctx,
1081 test_GetResourceState_int(tctx, p, &hResource),
1082 "failed to query resource state");
1083 torture_assert(tctx,
1084 test_CreateResEnum_int(tctx, p, &hResource),
1085 "failed to query resource enum");
1086 torture_assert(tctx,
1087 test_GetResourceDependencyExpression_int(tctx, p, &hResource),
1088 "failed to query resource dependency expression");
1089 torture_assert(tctx,
1090 test_GetResourceNetworkName_int(tctx, p, &hResource),
1091 "failed to query resource network name");
1093 test_CloseResource_int(tctx, p, &hResource);
1098 static bool test_all_resources(struct torture_context *tctx,
1101 struct torture_clusapi_context *t =
1102 talloc_get_type_abort(data, struct torture_clusapi_context);
1103 struct dcerpc_binding_handle *b = t->p->binding_handle;
1104 struct clusapi_CreateEnum r;
1105 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
1106 struct ENUM_LIST *ReturnEnum;
1110 r.in.dwType = dwType;
1111 r.out.ReturnEnum = &ReturnEnum;
1112 r.out.rpc_status = &rpc_status;
1114 torture_assert_ntstatus_ok(tctx,
1115 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1116 "CreateEnum failed");
1117 torture_assert_werr_ok(tctx,
1119 "CreateEnum failed");
1121 for (i=0; i < ReturnEnum->EntryCount; i++) {
1123 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1125 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESOURCE, "type mismatch");
1127 torture_assert(tctx,
1128 test_one_resource(tctx, t->p, e.Name),
1129 "failed to test one resource");
1135 static bool test_OpenNode_int(struct torture_context *tctx,
1136 struct dcerpc_pipe *p,
1137 const char *lpszNodeName,
1138 struct policy_handle *hNode)
1140 struct dcerpc_binding_handle *b = p->binding_handle;
1141 struct clusapi_OpenNode r;
1145 r.in.lpszNodeName = lpszNodeName;
1146 r.out.rpc_status = &rpc_status;
1147 r.out.Status = &Status;
1150 torture_assert_ntstatus_ok(tctx,
1151 dcerpc_clusapi_OpenNode_r(b, tctx, &r),
1153 torture_assert_werr_ok(tctx,
1160 static bool test_OpenNodeEx_int(struct torture_context *tctx,
1161 struct dcerpc_pipe *p,
1162 const char *lpszNodeName,
1163 struct policy_handle *hNode)
1165 struct dcerpc_binding_handle *b = p->binding_handle;
1166 struct clusapi_OpenNodeEx r;
1167 uint32_t lpdwGrantedAccess;
1171 r.in.lpszNodeName = lpszNodeName;
1172 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1173 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1174 r.out.rpc_status = &rpc_status;
1175 r.out.Status = &Status;
1178 torture_assert_ntstatus_ok(tctx,
1179 dcerpc_clusapi_OpenNodeEx_r(b, tctx, &r),
1180 "OpenNodeEx failed");
1181 torture_assert_werr_ok(tctx,
1183 "OpenNodeEx failed");
1189 static bool test_CloseNode_int(struct torture_context *tctx,
1190 struct dcerpc_pipe *p,
1191 struct policy_handle *Node)
1193 struct dcerpc_binding_handle *b = p->binding_handle;
1194 struct clusapi_CloseNode r;
1199 torture_assert_ntstatus_ok(tctx,
1200 dcerpc_clusapi_CloseNode_r(b, tctx, &r),
1201 "CloseNode failed");
1202 torture_assert_werr_ok(tctx,
1204 "CloseNode failed");
1205 torture_assert(tctx,
1206 ndr_policy_handle_empty(Node),
1207 "policy_handle non empty after CloseNode");
1212 static bool test_OpenNode(struct torture_context *tctx,
1215 struct torture_clusapi_context *t =
1216 talloc_get_type_abort(data, struct torture_clusapi_context);
1217 struct policy_handle hNode;
1219 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1223 test_CloseNode_int(tctx, t->p, &hNode);
1228 static bool test_OpenNodeEx(struct torture_context *tctx,
1231 struct torture_clusapi_context *t =
1232 talloc_get_type_abort(data, struct torture_clusapi_context);
1233 struct policy_handle hNode;
1235 if (!test_OpenNodeEx_int(tctx, t->p, t->NodeName, &hNode)) {
1239 test_CloseNode_int(tctx, t->p, &hNode);
1244 static bool test_CloseNode(struct torture_context *tctx,
1247 struct torture_clusapi_context *t =
1248 talloc_get_type_abort(data, struct torture_clusapi_context);
1249 struct policy_handle hNode;
1251 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1255 return test_CloseNode_int(tctx, t->p, &hNode);
1258 static bool test_GetNodeState_int(struct torture_context *tctx,
1259 struct dcerpc_pipe *p,
1260 struct policy_handle *hNode)
1262 struct dcerpc_binding_handle *b = p->binding_handle;
1263 struct clusapi_GetNodeState r;
1264 enum clusapi_ClusterNodeState State;
1267 r.in.hNode = *hNode;
1268 r.out.State = &State;
1269 r.out.rpc_status = &rpc_status;
1271 torture_assert_ntstatus_ok(tctx,
1272 dcerpc_clusapi_GetNodeState_r(b, tctx, &r),
1273 "GetNodeState failed");
1274 torture_assert_werr_ok(tctx,
1276 "GetNodeState failed");
1281 static bool test_GetNodeState(struct torture_context *tctx,
1284 struct torture_clusapi_context *t =
1285 talloc_get_type_abort(data, struct torture_clusapi_context);
1286 struct policy_handle hNode;
1289 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1293 ret = test_GetNodeState_int(tctx, t->p, &hNode);
1295 test_CloseNode_int(tctx, t->p, &hNode);
1300 static bool test_GetNodeId_int(struct torture_context *tctx,
1301 struct dcerpc_pipe *p,
1302 struct policy_handle *hNode)
1304 struct dcerpc_binding_handle *b = p->binding_handle;
1305 struct clusapi_GetNodeId r;
1309 r.in.hNode = *hNode;
1310 r.out.pGuid = &pGuid;
1311 r.out.rpc_status = &rpc_status;
1313 torture_assert_ntstatus_ok(tctx,
1314 dcerpc_clusapi_GetNodeId_r(b, tctx, &r),
1315 "GetNodeId failed");
1316 torture_assert_werr_ok(tctx,
1318 "GetNodeId failed");
1323 static bool test_GetNodeId(struct torture_context *tctx,
1326 struct torture_clusapi_context *t =
1327 talloc_get_type_abort(data, struct torture_clusapi_context);
1328 struct policy_handle hNode;
1331 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1335 ret = test_GetNodeId_int(tctx, t->p, &hNode);
1337 test_CloseNode_int(tctx, t->p, &hNode);
1342 static bool test_PauseNode_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_PauseNode r;
1350 r.in.hNode = *hNode;
1351 r.out.rpc_status = &rpc_status;
1353 torture_assert_ntstatus_ok(tctx,
1354 dcerpc_clusapi_PauseNode_r(b, tctx, &r),
1355 "PauseNode failed");
1356 torture_assert_werr_ok(tctx,
1358 "PauseNode failed");
1363 static bool test_PauseNode(struct torture_context *tctx,
1366 struct torture_clusapi_context *t =
1367 talloc_get_type_abort(data, struct torture_clusapi_context);
1368 struct policy_handle hNode;
1371 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1375 ret = test_PauseNode_int(tctx, t->p, &hNode);
1377 test_CloseNode_int(tctx, t->p, &hNode);
1382 static bool test_ResumeNode_int(struct torture_context *tctx,
1383 struct dcerpc_pipe *p,
1384 struct policy_handle *hNode)
1386 struct dcerpc_binding_handle *b = p->binding_handle;
1387 struct clusapi_ResumeNode r;
1390 r.in.hNode = *hNode;
1391 r.out.rpc_status = &rpc_status;
1393 torture_assert_ntstatus_ok(tctx,
1394 dcerpc_clusapi_ResumeNode_r(b, tctx, &r),
1395 "ResumeNode failed");
1396 torture_assert_werr_equal(tctx,
1398 WERR_CLUSTER_NODE_NOT_PAUSED,
1399 "ResumeNode gave unexpected result");
1404 static bool test_ResumeNode(struct torture_context *tctx,
1407 struct torture_clusapi_context *t =
1408 talloc_get_type_abort(data, struct torture_clusapi_context);
1409 struct policy_handle hNode;
1412 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1416 ret = test_ResumeNode_int(tctx, t->p, &hNode);
1418 test_CloseNode_int(tctx, t->p, &hNode);
1423 static bool test_EvictNode_int(struct torture_context *tctx,
1424 struct dcerpc_pipe *p,
1425 struct policy_handle *hNode)
1427 struct dcerpc_binding_handle *b = p->binding_handle;
1428 struct clusapi_EvictNode r;
1431 r.in.hNode = *hNode;
1432 r.out.rpc_status = &rpc_status;
1434 torture_assert_ntstatus_ok(tctx,
1435 dcerpc_clusapi_EvictNode_r(b, tctx, &r),
1436 "EvictNode failed");
1437 torture_assert_werr_ok(tctx,
1439 "EvictNode failed");
1444 static bool test_EvictNode(struct torture_context *tctx,
1447 struct torture_clusapi_context *t =
1448 talloc_get_type_abort(data, struct torture_clusapi_context);
1449 struct policy_handle hNode;
1452 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1456 ret = test_EvictNode_int(tctx, t->p, &hNode);
1458 test_CloseNode_int(tctx, t->p, &hNode);
1463 static bool test_one_node(struct torture_context *tctx,
1464 struct dcerpc_pipe *p,
1465 const char *node_name)
1467 struct policy_handle hNode;
1469 torture_assert(tctx,
1470 test_OpenNode_int(tctx, p, node_name, &hNode),
1471 "failed to open node");
1472 test_CloseNode_int(tctx, p, &hNode);
1474 torture_assert(tctx,
1475 test_OpenNodeEx_int(tctx, p, node_name, &hNode),
1476 "failed to openex node");
1478 torture_assert(tctx,
1479 test_GetNodeId_int(tctx, p, &hNode),
1480 "failed to query node id");
1481 torture_assert(tctx,
1482 test_GetNodeState_int(tctx, p, &hNode),
1483 "failed to query node id");
1485 test_CloseNode_int(tctx, p, &hNode);
1490 static bool test_all_nodes(struct torture_context *tctx,
1493 struct torture_clusapi_context *t =
1494 talloc_get_type_abort(data, struct torture_clusapi_context);
1495 struct dcerpc_binding_handle *b = t->p->binding_handle;
1496 struct clusapi_CreateEnum r;
1497 uint32_t dwType = CLUSTER_ENUM_NODE;
1498 struct ENUM_LIST *ReturnEnum;
1502 r.in.dwType = dwType;
1503 r.out.ReturnEnum = &ReturnEnum;
1504 r.out.rpc_status = &rpc_status;
1506 torture_assert_ntstatus_ok(tctx,
1507 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1508 "CreateEnum failed");
1509 torture_assert_werr_ok(tctx,
1511 "CreateEnum failed");
1513 for (i=0; i < ReturnEnum->EntryCount; i++) {
1515 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1517 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NODE, "type mismatch");
1519 torture_assert(tctx,
1520 test_one_node(tctx, t->p, e.Name),
1521 "failed to test one node");
1527 static bool test_OpenGroup_int(struct torture_context *tctx,
1528 struct dcerpc_pipe *p,
1529 const char *lpszGroupName,
1530 struct policy_handle *hGroup)
1532 struct dcerpc_binding_handle *b = p->binding_handle;
1533 struct clusapi_OpenGroup r;
1537 r.in.lpszGroupName = lpszGroupName;
1538 r.out.rpc_status = &rpc_status;
1539 r.out.Status = &Status;
1540 r.out.hGroup= hGroup;
1542 torture_assert_ntstatus_ok(tctx,
1543 dcerpc_clusapi_OpenGroup_r(b, tctx, &r),
1544 "OpenGroup failed");
1545 torture_assert_werr_ok(tctx,
1547 "OpenGroup failed");
1552 static bool test_OpenGroupEx_int(struct torture_context *tctx,
1553 struct dcerpc_pipe *p,
1554 const char *lpszGroupName,
1555 struct policy_handle *hGroup)
1557 struct dcerpc_binding_handle *b = p->binding_handle;
1558 struct clusapi_OpenGroupEx r;
1559 uint32_t lpdwGrantedAccess;
1563 r.in.lpszGroupName = lpszGroupName;
1564 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1565 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1566 r.out.rpc_status = &rpc_status;
1567 r.out.Status = &Status;
1568 r.out.hGroup= hGroup;
1570 torture_assert_ntstatus_ok(tctx,
1571 dcerpc_clusapi_OpenGroupEx_r(b, tctx, &r),
1572 "OpenGroupEx failed");
1573 torture_assert_werr_ok(tctx,
1575 "OpenGroupEx failed");
1580 static bool test_CloseGroup_int(struct torture_context *tctx,
1581 struct dcerpc_pipe *p,
1582 struct policy_handle *Group)
1584 struct dcerpc_binding_handle *b = p->binding_handle;
1585 struct clusapi_CloseGroup r;
1588 r.out.Group = Group;
1590 torture_assert_ntstatus_ok(tctx,
1591 dcerpc_clusapi_CloseGroup_r(b, tctx, &r),
1592 "CloseGroup failed");
1593 torture_assert_werr_ok(tctx,
1595 "CloseGroup failed");
1596 torture_assert(tctx,
1597 ndr_policy_handle_empty(Group),
1598 "policy_handle non empty after CloseGroup");
1603 static bool test_OpenGroup(struct torture_context *tctx,
1606 struct torture_clusapi_context *t =
1607 talloc_get_type_abort(data, struct torture_clusapi_context);
1608 struct policy_handle hGroup;
1610 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1614 test_CloseGroup_int(tctx, t->p, &hGroup);
1619 static bool test_OpenGroupEx(struct torture_context *tctx,
1622 struct torture_clusapi_context *t =
1623 talloc_get_type_abort(data, struct torture_clusapi_context);
1624 struct policy_handle hGroup;
1626 if (!test_OpenGroupEx_int(tctx, t->p, "Cluster Group", &hGroup)) {
1630 test_CloseGroup_int(tctx, t->p, &hGroup);
1635 static bool test_CloseGroup(struct torture_context *tctx,
1638 struct torture_clusapi_context *t =
1639 talloc_get_type_abort(data, struct torture_clusapi_context);
1640 struct policy_handle hGroup;
1642 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1646 return test_CloseGroup_int(tctx, t->p, &hGroup);
1649 static bool test_GetGroupState_int(struct torture_context *tctx,
1650 struct dcerpc_pipe *p,
1651 struct policy_handle *hGroup)
1653 struct dcerpc_binding_handle *b = p->binding_handle;
1654 struct clusapi_GetGroupState r;
1655 enum clusapi_ClusterGroupState State;
1656 const char *NodeName;
1659 r.in.hGroup = *hGroup;
1660 r.out.State = &State;
1661 r.out.NodeName = &NodeName;
1662 r.out.rpc_status = &rpc_status;
1664 torture_assert_ntstatus_ok(tctx,
1665 dcerpc_clusapi_GetGroupState_r(b, tctx, &r),
1666 "GetGroupState failed");
1667 torture_assert_werr_ok(tctx,
1669 "GetGroupState failed");
1674 static bool test_GetGroupState(struct torture_context *tctx,
1677 struct torture_clusapi_context *t =
1678 talloc_get_type_abort(data, struct torture_clusapi_context);
1679 struct policy_handle hGroup;
1682 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1686 ret = test_GetGroupState_int(tctx, t->p, &hGroup);
1688 test_CloseGroup_int(tctx, t->p, &hGroup);
1693 static bool test_GetGroupId_int(struct torture_context *tctx,
1694 struct dcerpc_pipe *p,
1695 struct policy_handle *hGroup)
1697 struct dcerpc_binding_handle *b = p->binding_handle;
1698 struct clusapi_GetGroupId r;
1702 r.in.hGroup = *hGroup;
1703 r.out.pGuid = &pGuid;
1704 r.out.rpc_status = &rpc_status;
1706 torture_assert_ntstatus_ok(tctx,
1707 dcerpc_clusapi_GetGroupId_r(b, tctx, &r),
1708 "GetGroupId failed");
1709 torture_assert_werr_ok(tctx,
1711 "GetGroupId failed");
1716 static bool test_GetGroupId(struct torture_context *tctx,
1719 struct torture_clusapi_context *t =
1720 talloc_get_type_abort(data, struct torture_clusapi_context);
1721 struct policy_handle hGroup;
1724 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1728 ret = test_GetGroupId_int(tctx, t->p, &hGroup);
1730 test_CloseGroup_int(tctx, t->p, &hGroup);
1735 static bool test_OnlineGroup_int(struct torture_context *tctx,
1736 struct dcerpc_pipe *p,
1737 struct policy_handle *hGroup)
1739 struct dcerpc_binding_handle *b = p->binding_handle;
1740 struct clusapi_OnlineGroup r;
1743 r.in.hGroup = *hGroup;
1744 r.out.rpc_status = &rpc_status;
1746 torture_assert_ntstatus_ok(tctx,
1747 dcerpc_clusapi_OnlineGroup_r(b, tctx, &r),
1748 "OnlineGroup failed");
1749 torture_assert_werr_ok(tctx,
1751 "OnlineGroup failed");
1756 static bool test_OnlineGroup(struct torture_context *tctx,
1759 struct torture_clusapi_context *t =
1760 talloc_get_type_abort(data, struct torture_clusapi_context);
1761 struct policy_handle hGroup;
1764 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1768 ret = test_OnlineGroup_int(tctx, t->p, &hGroup);
1770 test_CloseGroup_int(tctx, t->p, &hGroup);
1775 static bool test_OfflineGroup_int(struct torture_context *tctx,
1776 struct dcerpc_pipe *p,
1777 struct policy_handle *hGroup)
1779 struct dcerpc_binding_handle *b = p->binding_handle;
1780 struct clusapi_OfflineGroup r;
1783 r.in.hGroup = *hGroup;
1784 r.out.rpc_status = &rpc_status;
1786 torture_assert_ntstatus_ok(tctx,
1787 dcerpc_clusapi_OfflineGroup_r(b, tctx, &r),
1788 "OfflineGroup failed");
1789 torture_assert_werr_ok(tctx,
1791 "OfflineGroup failed");
1796 static bool test_OfflineGroup(struct torture_context *tctx,
1799 struct torture_clusapi_context *t =
1800 talloc_get_type_abort(data, struct torture_clusapi_context);
1801 struct policy_handle hGroup;
1804 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1808 ret = test_OfflineGroup_int(tctx, t->p, &hGroup);
1810 test_CloseGroup_int(tctx, t->p, &hGroup);
1815 static bool test_one_group(struct torture_context *tctx,
1816 struct dcerpc_pipe *p,
1817 const char *node_name)
1819 struct policy_handle hGroup;
1821 torture_assert(tctx,
1822 test_OpenGroup_int(tctx, p, node_name, &hGroup),
1823 "failed to open group");
1824 test_CloseGroup_int(tctx, p, &hGroup);
1826 torture_assert(tctx,
1827 test_OpenGroupEx_int(tctx, p, node_name, &hGroup),
1828 "failed to openex group");
1830 torture_assert(tctx,
1831 test_GetGroupId_int(tctx, p, &hGroup),
1832 "failed to query group id");
1833 torture_assert(tctx,
1834 test_GetGroupState_int(tctx, p, &hGroup),
1835 "failed to query group id");
1837 test_CloseGroup_int(tctx, p, &hGroup);
1842 static bool test_all_groups(struct torture_context *tctx,
1845 struct torture_clusapi_context *t =
1846 talloc_get_type_abort(data, struct torture_clusapi_context);
1847 struct dcerpc_binding_handle *b = t->p->binding_handle;
1848 struct clusapi_CreateEnum r;
1849 uint32_t dwType = CLUSTER_ENUM_GROUP;
1850 struct ENUM_LIST *ReturnEnum;
1854 r.in.dwType = dwType;
1855 r.out.ReturnEnum = &ReturnEnum;
1856 r.out.rpc_status = &rpc_status;
1858 torture_assert_ntstatus_ok(tctx,
1859 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1860 "CreateEnum failed");
1861 torture_assert_werr_ok(tctx,
1863 "CreateEnum failed");
1865 for (i=0; i < ReturnEnum->EntryCount; i++) {
1867 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1869 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_GROUP, "type mismatch");
1871 torture_assert(tctx,
1872 test_one_group(tctx, t->p, e.Name),
1873 "failed to test one group");
1879 static bool test_BackupClusterDatabase(struct torture_context *tctx,
1882 struct torture_clusapi_context *t =
1883 talloc_get_type_abort(data, struct torture_clusapi_context);
1884 struct dcerpc_binding_handle *b = t->p->binding_handle;
1885 struct clusapi_BackupClusterDatabase r;
1888 r.in.lpszPathName = "c:\\cluster_backup";
1889 r.out.rpc_status = &rpc_status;
1891 torture_assert_ntstatus_ok(tctx,
1892 dcerpc_clusapi_BackupClusterDatabase_r(b, tctx, &r),
1893 "BackupClusterDatabase failed");
1894 torture_assert_werr_equal(tctx,
1896 WERR_CALL_NOT_IMPLEMENTED,
1897 "BackupClusterDatabase failed");
1902 static bool test_SetServiceAccountPassword(struct torture_context *tctx,
1905 struct torture_clusapi_context *t =
1906 talloc_get_type_abort(data, struct torture_clusapi_context);
1907 struct dcerpc_binding_handle *b = t->p->binding_handle;
1908 struct clusapi_SetServiceAccountPassword r;
1909 uint32_t SizeReturned;
1910 uint32_t ExpectedBufferSize;
1912 r.in.lpszNewPassword = "P@ssw0rd!";
1913 r.in.dwFlags = IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES;
1914 r.in.ReturnStatusBufferSize = 1024;
1915 r.out.ReturnStatusBufferPtr = NULL;
1916 r.out.SizeReturned = &SizeReturned;
1917 r.out.ExpectedBufferSize = &ExpectedBufferSize;
1919 torture_assert_ntstatus_ok(tctx,
1920 dcerpc_clusapi_SetServiceAccountPassword_r(b, tctx, &r),
1921 "SetServiceAccountPassword failed");
1922 torture_assert_werr_equal(tctx,
1924 WERR_CALL_NOT_IMPLEMENTED,
1925 "SetServiceAccountPassword failed");
1930 static bool test_ClusterControl_int(struct torture_context *tctx,
1931 struct dcerpc_pipe *p,
1932 struct policy_handle *Cluster)
1934 struct dcerpc_binding_handle *b = p->binding_handle;
1935 struct clusapi_ClusterControl r;
1936 uint32_t lpBytesReturned;
1937 uint32_t lpcbRequired;
1940 r.in.hCluster = *Cluster;
1941 r.in.dwControlCode = 0;
1942 r.in.lpInBuffer = NULL;
1943 r.in.nInBufferSize = 0;
1944 r.in.nOutBufferSize = 0;
1945 r.out.lpOutBuffer = NULL;
1946 r.out.lpBytesReturned = &lpBytesReturned;
1947 r.out.lpcbRequired = &lpcbRequired;
1948 r.out.rpc_status = &rpc_status;
1950 torture_assert_ntstatus_ok(tctx,
1951 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
1952 "ClusterControl failed");
1953 torture_assert_werr_equal(tctx,
1955 WERR_INVALID_FUNCTION,
1956 "ClusterControl failed");
1958 r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES;
1960 torture_assert_ntstatus_ok(tctx,
1961 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
1962 "ClusterControl failed");
1964 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
1965 r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
1966 r.in.nOutBufferSize = *r.out.lpcbRequired;
1967 torture_assert_ntstatus_ok(tctx,
1968 dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
1969 "ClusterControl failed");
1971 torture_assert_werr_ok(tctx,
1973 "ClusterControl failed");
1978 static bool test_ClusterControl(struct torture_context *tctx,
1981 struct torture_clusapi_context *t =
1982 talloc_get_type_abort(data, struct torture_clusapi_context);
1983 struct policy_handle Cluster;
1986 if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
1990 ret = test_ClusterControl_int(tctx, t->p, &Cluster);
1992 test_CloseCluster_int(tctx, t->p, &Cluster);
1997 static bool test_OpenNetwork_int(struct torture_context *tctx,
1998 struct dcerpc_pipe *p,
1999 const char *lpszNetworkName,
2000 struct policy_handle *hNetwork)
2002 struct dcerpc_binding_handle *b = p->binding_handle;
2003 struct clusapi_OpenNetwork r;
2007 r.in.lpszNetworkName = lpszNetworkName;
2008 r.out.rpc_status = &rpc_status;
2009 r.out.Status = &Status;
2010 r.out.hNetwork = hNetwork ;
2012 torture_assert_ntstatus_ok(tctx,
2013 dcerpc_clusapi_OpenNetwork_r(b, tctx, &r),
2014 "OpenNetwork failed");
2015 torture_assert_werr_ok(tctx,
2017 "OpenNetwork failed");
2022 static bool test_OpenNetworkEx_int(struct torture_context *tctx,
2023 struct dcerpc_pipe *p,
2024 const char *lpszNetworkName,
2025 struct policy_handle *hNetwork)
2027 struct dcerpc_binding_handle *b = p->binding_handle;
2028 struct clusapi_OpenNetworkEx r;
2029 uint32_t lpdwGrantedAccess;
2033 r.in.lpszNetworkName = lpszNetworkName;
2034 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
2035 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
2036 r.out.rpc_status = &rpc_status;
2037 r.out.Status = &Status;
2038 r.out.hNetwork = hNetwork ;
2040 torture_assert_ntstatus_ok(tctx,
2041 dcerpc_clusapi_OpenNetworkEx_r(b, tctx, &r),
2042 "OpenNetworkEx failed");
2043 torture_assert_werr_ok(tctx,
2045 "OpenNetworkEx failed");
2050 static bool test_CloseNetwork_int(struct torture_context *tctx,
2051 struct dcerpc_pipe *p,
2052 struct policy_handle *Network)
2054 struct dcerpc_binding_handle *b = p->binding_handle;
2055 struct clusapi_CloseNetwork r;
2057 r.in.Network = Network;
2058 r.out.Network = Network;
2060 torture_assert_ntstatus_ok(tctx,
2061 dcerpc_clusapi_CloseNetwork_r(b, tctx, &r),
2062 "CloseNetwork failed");
2063 torture_assert_werr_ok(tctx,
2065 "CloseNetwork failed");
2066 torture_assert(tctx,
2067 ndr_policy_handle_empty(Network),
2068 "policy_handle non empty after CloseNetwork");
2073 static bool test_OpenNetwork(struct torture_context *tctx,
2076 struct torture_clusapi_context *t =
2077 talloc_get_type_abort(data, struct torture_clusapi_context);
2078 struct policy_handle hNetwork;
2080 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2084 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2089 static bool test_OpenNetworkEx(struct torture_context *tctx,
2092 struct torture_clusapi_context *t =
2093 talloc_get_type_abort(data, struct torture_clusapi_context);
2094 struct policy_handle hNetwork;
2096 if (!test_OpenNetworkEx_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2100 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2105 static bool test_CloseNetwork(struct torture_context *tctx,
2108 struct torture_clusapi_context *t =
2109 talloc_get_type_abort(data, struct torture_clusapi_context);
2110 struct policy_handle hNetwork;
2112 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2116 return test_CloseNetwork_int(tctx, t->p, &hNetwork);
2119 static bool test_GetNetworkState_int(struct torture_context *tctx,
2120 struct dcerpc_pipe *p,
2121 struct policy_handle *hNetwork)
2123 struct dcerpc_binding_handle *b = p->binding_handle;
2124 struct clusapi_GetNetworkState r;
2125 enum clusapi_ClusterNetworkState State;
2128 r.in.hNetwork = *hNetwork;
2129 r.out.State = &State;
2130 r.out.rpc_status = &rpc_status;
2132 torture_assert_ntstatus_ok(tctx,
2133 dcerpc_clusapi_GetNetworkState_r(b, tctx, &r),
2134 "GetNetworkState failed");
2135 torture_assert_werr_ok(tctx,
2137 "GetNetworkState failed");
2142 static bool test_GetNetworkState(struct torture_context *tctx,
2145 struct torture_clusapi_context *t =
2146 talloc_get_type_abort(data, struct torture_clusapi_context);
2147 struct policy_handle hNetwork;
2150 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2154 ret = test_GetNetworkState_int(tctx, t->p, &hNetwork);
2156 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2161 static bool test_GetNetworkId_int(struct torture_context *tctx,
2162 struct dcerpc_pipe *p,
2163 struct policy_handle *hNetwork)
2165 struct dcerpc_binding_handle *b = p->binding_handle;
2166 struct clusapi_GetNetworkId r;
2170 r.in.hNetwork = *hNetwork;
2171 r.out.pGuid = &pGuid;
2172 r.out.rpc_status = &rpc_status;
2174 torture_assert_ntstatus_ok(tctx,
2175 dcerpc_clusapi_GetNetworkId_r(b, tctx, &r),
2176 "GetNetworkId failed");
2177 torture_assert_werr_ok(tctx,
2179 "GetNetworkId failed");
2184 static bool test_GetNetworkId(struct torture_context *tctx,
2187 struct torture_clusapi_context *t =
2188 talloc_get_type_abort(data, struct torture_clusapi_context);
2189 struct policy_handle hNetwork;
2192 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
2196 ret = test_GetNetworkId_int(tctx, t->p, &hNetwork);
2198 test_CloseNetwork_int(tctx, t->p, &hNetwork);
2203 static bool test_one_network(struct torture_context *tctx,
2204 struct dcerpc_pipe *p,
2205 const char *network_name)
2207 struct policy_handle hNetwork;
2209 torture_assert(tctx,
2210 test_OpenNetwork_int(tctx, p, network_name, &hNetwork),
2211 "failed to open network");
2212 test_CloseNetwork_int(tctx, p, &hNetwork);
2214 torture_assert(tctx,
2215 test_OpenNetworkEx_int(tctx, p, network_name, &hNetwork),
2216 "failed to openex network");
2218 torture_assert(tctx,
2219 test_GetNetworkId_int(tctx, p, &hNetwork),
2220 "failed to query network id");
2221 torture_assert(tctx,
2222 test_GetNetworkState_int(tctx, p, &hNetwork),
2223 "failed to query network id");
2225 test_CloseNetwork_int(tctx, p, &hNetwork);
2230 static bool test_all_networks(struct torture_context *tctx,
2233 struct torture_clusapi_context *t =
2234 talloc_get_type_abort(data, struct torture_clusapi_context);
2235 struct dcerpc_binding_handle *b = t->p->binding_handle;
2236 struct clusapi_CreateEnum r;
2237 uint32_t dwType = CLUSTER_ENUM_NETWORK;
2238 struct ENUM_LIST *ReturnEnum;
2242 r.in.dwType = dwType;
2243 r.out.ReturnEnum = &ReturnEnum;
2244 r.out.rpc_status = &rpc_status;
2246 torture_assert_ntstatus_ok(tctx,
2247 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2248 "CreateEnum failed");
2249 torture_assert_werr_ok(tctx,
2251 "CreateEnum failed");
2253 for (i=0; i < ReturnEnum->EntryCount; i++) {
2255 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2257 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETWORK, "type mismatch");
2259 torture_assert(tctx,
2260 test_one_network(tctx, t->p, e.Name),
2261 "failed to test one network");
2267 static bool test_OpenNetInterface_int(struct torture_context *tctx,
2268 struct dcerpc_pipe *p,
2269 const char *lpszNetInterfaceName,
2270 struct policy_handle *hNetInterface)
2272 struct dcerpc_binding_handle *b = p->binding_handle;
2273 struct clusapi_OpenNetInterface r;
2277 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2278 r.out.rpc_status = &rpc_status;
2279 r.out.Status = &Status;
2280 r.out.hNetInterface = hNetInterface;
2282 torture_assert_ntstatus_ok(tctx,
2283 dcerpc_clusapi_OpenNetInterface_r(b, tctx, &r),
2284 "OpenNetInterface failed");
2285 torture_assert_werr_ok(tctx,
2287 "OpenNetInterface failed");
2292 static bool test_OpenNetInterfaceEx_int(struct torture_context *tctx,
2293 struct dcerpc_pipe *p,
2294 const char *lpszNetInterfaceName,
2295 struct policy_handle *hNetInterface)
2297 struct dcerpc_binding_handle *b = p->binding_handle;
2298 struct clusapi_OpenNetInterfaceEx r;
2299 uint32_t lpdwGrantedAccess;
2303 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2304 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
2305 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
2306 r.out.rpc_status = &rpc_status;
2307 r.out.Status = &Status;
2308 r.out.hNetInterface = hNetInterface;
2310 torture_assert_ntstatus_ok(tctx,
2311 dcerpc_clusapi_OpenNetInterfaceEx_r(b, tctx, &r),
2312 "OpenNetInterfaceEx failed");
2313 torture_assert_werr_ok(tctx,
2315 "OpenNetInterfaceEx failed");
2320 static bool test_CloseNetInterface_int(struct torture_context *tctx,
2321 struct dcerpc_pipe *p,
2322 struct policy_handle *NetInterface)
2324 struct dcerpc_binding_handle *b = p->binding_handle;
2325 struct clusapi_CloseNetInterface r;
2327 r.in.NetInterface = NetInterface;
2328 r.out.NetInterface = NetInterface;
2330 torture_assert_ntstatus_ok(tctx,
2331 dcerpc_clusapi_CloseNetInterface_r(b, tctx, &r),
2332 "CloseNetInterface failed");
2333 torture_assert_werr_ok(tctx,
2335 "CloseNetInterface failed");
2336 torture_assert(tctx,
2337 ndr_policy_handle_empty(NetInterface),
2338 "policy_handle non empty after CloseNetInterface");
2343 static bool test_OpenNetInterface(struct torture_context *tctx,
2346 struct torture_clusapi_context *t =
2347 talloc_get_type_abort(data, struct torture_clusapi_context);
2348 struct policy_handle hNetInterface;
2350 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2354 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2359 static bool test_OpenNetInterfaceEx(struct torture_context *tctx,
2362 struct torture_clusapi_context *t =
2363 talloc_get_type_abort(data, struct torture_clusapi_context);
2364 struct policy_handle hNetInterface;
2366 if (!test_OpenNetInterfaceEx_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2370 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2375 static bool test_CloseNetInterface(struct torture_context *tctx,
2378 struct torture_clusapi_context *t =
2379 talloc_get_type_abort(data, struct torture_clusapi_context);
2380 struct policy_handle hNetInterface;
2382 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2386 return test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2389 static bool test_GetNetInterfaceState_int(struct torture_context *tctx,
2390 struct dcerpc_pipe *p,
2391 struct policy_handle *hNetInterface)
2393 struct dcerpc_binding_handle *b = p->binding_handle;
2394 struct clusapi_GetNetInterfaceState r;
2395 enum clusapi_ClusterNetInterfaceState State;
2398 r.in.hNetInterface = *hNetInterface;
2399 r.out.State = &State;
2400 r.out.rpc_status = &rpc_status;
2402 torture_assert_ntstatus_ok(tctx,
2403 dcerpc_clusapi_GetNetInterfaceState_r(b, tctx, &r),
2404 "GetNetInterfaceState failed");
2405 torture_assert_werr_ok(tctx,
2407 "GetNetInterfaceState failed");
2412 static bool test_GetNetInterfaceState(struct torture_context *tctx,
2415 struct torture_clusapi_context *t =
2416 talloc_get_type_abort(data, struct torture_clusapi_context);
2417 struct policy_handle hNetInterface;
2420 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2424 ret = test_GetNetInterfaceState_int(tctx, t->p, &hNetInterface);
2426 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2431 static bool test_GetNetInterfaceId_int(struct torture_context *tctx,
2432 struct dcerpc_pipe *p,
2433 struct policy_handle *hNetInterface)
2435 struct dcerpc_binding_handle *b = p->binding_handle;
2436 struct clusapi_GetNetInterfaceId r;
2440 r.in.hNetInterface = *hNetInterface;
2441 r.out.pGuid = &pGuid;
2442 r.out.rpc_status = &rpc_status;
2444 torture_assert_ntstatus_ok(tctx,
2445 dcerpc_clusapi_GetNetInterfaceId_r(b, tctx, &r),
2446 "GetNetInterfaceId failed");
2447 torture_assert_werr_ok(tctx,
2449 "GetNetInterfaceId failed");
2454 static bool test_GetNetInterfaceId(struct torture_context *tctx,
2457 struct torture_clusapi_context *t =
2458 talloc_get_type_abort(data, struct torture_clusapi_context);
2459 struct policy_handle hNetInterface;
2462 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2466 ret = test_GetNetInterfaceId_int(tctx, t->p, &hNetInterface);
2468 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2473 static bool test_one_netinterface(struct torture_context *tctx,
2474 struct dcerpc_pipe *p,
2475 const char *netinterface_name)
2477 struct policy_handle hNetInterface;
2479 torture_assert(tctx,
2480 test_OpenNetInterface_int(tctx, p, netinterface_name, &hNetInterface),
2481 "failed to open netinterface");
2482 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2484 torture_assert(tctx,
2485 test_OpenNetInterfaceEx_int(tctx, p, netinterface_name, &hNetInterface),
2486 "failed to openex netinterface");
2488 torture_assert(tctx,
2489 test_GetNetInterfaceId_int(tctx, p, &hNetInterface),
2490 "failed to query netinterface id");
2491 torture_assert(tctx,
2492 test_GetNetInterfaceState_int(tctx, p, &hNetInterface),
2493 "failed to query netinterface id");
2495 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2500 static bool test_all_netinterfaces(struct torture_context *tctx,
2503 struct torture_clusapi_context *t =
2504 talloc_get_type_abort(data, struct torture_clusapi_context);
2505 struct dcerpc_binding_handle *b = t->p->binding_handle;
2506 struct clusapi_CreateEnum r;
2507 uint32_t dwType = CLUSTER_ENUM_NETINTERFACE;
2508 struct ENUM_LIST *ReturnEnum;
2512 r.in.dwType = dwType;
2513 r.out.ReturnEnum = &ReturnEnum;
2514 r.out.rpc_status = &rpc_status;
2516 torture_assert_ntstatus_ok(tctx,
2517 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2518 "CreateEnum failed");
2519 torture_assert_werr_ok(tctx,
2521 "CreateEnum failed");
2523 for (i=0; i < ReturnEnum->EntryCount; i++) {
2525 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2527 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETINTERFACE, "type mismatch");
2529 torture_assert(tctx,
2530 test_one_netinterface(tctx, t->p, e.Name),
2531 "failed to test one netinterface");
2537 static bool test_CloseKey_int(struct torture_context *tctx,
2538 struct dcerpc_pipe *p,
2539 struct policy_handle *pKey)
2541 struct dcerpc_binding_handle *b = p->binding_handle;
2542 struct clusapi_CloseKey r;
2547 torture_assert_ntstatus_ok(tctx,
2548 dcerpc_clusapi_CloseKey_r(b, tctx, &r),
2550 torture_assert_werr_ok(tctx,
2553 torture_assert(tctx,
2554 ndr_policy_handle_empty(pKey),
2555 "policy_handle non empty after CloseKey");
2560 static bool test_GetRootKey_int(struct torture_context *tctx,
2561 struct dcerpc_pipe *p,
2562 struct policy_handle *phKey)
2564 struct dcerpc_binding_handle *b = p->binding_handle;
2565 struct clusapi_GetRootKey r;
2569 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2570 r.out.Status = &Status;
2571 r.out.rpc_status = &rpc_status;
2572 r.out.phKey = phKey;
2574 torture_assert_ntstatus_ok(tctx,
2575 dcerpc_clusapi_GetRootKey_r(b, tctx, &r),
2576 "GetRootKey failed");
2577 torture_assert_werr_ok(tctx,
2579 "GetRootKey failed");
2584 static bool test_EnumKey_int(struct torture_context *tctx,
2585 struct dcerpc_pipe *p,
2586 struct policy_handle *hKey)
2588 struct dcerpc_binding_handle *b = p->binding_handle;
2589 struct clusapi_EnumKey r;
2590 const char *KeyName;
2591 NTTIME lpftLastWriteTime;
2596 r.out.KeyName = &KeyName;
2597 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2598 r.out.rpc_status = &rpc_status;
2600 torture_assert_ntstatus_ok(tctx,
2601 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
2603 torture_assert_werr_ok(tctx,
2610 static bool test_OpenKey_int(struct torture_context *tctx,
2611 struct dcerpc_pipe *p,
2612 struct policy_handle *hKey,
2613 const char *lpSubKey,
2614 struct policy_handle *phKey)
2616 struct dcerpc_binding_handle *b = p->binding_handle;
2617 struct clusapi_OpenKey r;
2622 r.in.lpSubKey = lpSubKey;
2623 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2624 r.out.Status = &Status;
2625 r.out.rpc_status = &rpc_status;
2626 r.out.phKey = phKey;
2628 torture_assert_ntstatus_ok(tctx,
2629 dcerpc_clusapi_OpenKey_r(b, tctx, &r),
2631 torture_assert_werr_ok(tctx,
2638 static bool test_EnumValue_int(struct torture_context *tctx,
2639 struct dcerpc_pipe *p,
2640 struct policy_handle *hKey)
2642 struct dcerpc_binding_handle *b = p->binding_handle;
2643 struct clusapi_EnumValue r;
2644 const char *lpValueName;
2651 uint32_t lpcbData = 1024;
2655 r.in.lpcbData = &lpcbData;
2656 r.out.lpValueName = &lpValueName;
2657 r.out.lpType = &lpType;
2658 r.out.lpData = talloc_array(tctx, uint8_t, lpcbData);
2659 r.out.TotalSize = &TotalSize;
2660 r.out.rpc_status = &rpc_status;
2661 r.out.lpcbData = &lpcbData;
2663 torture_assert_ntstatus_ok(tctx,
2664 dcerpc_clusapi_EnumValue_r(b, tctx, &r),
2665 "EnumValue failed");
2667 } while (W_ERROR_IS_OK(r.out.result));
2669 torture_assert_werr_equal(tctx,
2672 "EnumValue failed");
2677 static bool test_QueryInfoKey_int(struct torture_context *tctx,
2678 struct dcerpc_pipe *p,
2679 struct policy_handle *hKey)
2681 struct dcerpc_binding_handle *b = p->binding_handle;
2682 struct clusapi_QueryInfoKey r;
2683 uint32_t lpcSubKeys;
2684 uint32_t lpcbMaxSubKeyLen;
2686 uint32_t lpcbMaxValueNameLen;
2687 uint32_t lpcbMaxValueLen;
2688 uint32_t lpcbSecurityDescriptor;
2689 NTTIME lpftLastWriteTime;
2693 r.out.lpcSubKeys = &lpcSubKeys;
2694 r.out.lpcbMaxSubKeyLen = &lpcbMaxSubKeyLen;
2695 r.out.lpcValues = &lpcValues;
2696 r.out.lpcbMaxValueNameLen = &lpcbMaxValueNameLen;
2697 r.out.lpcbMaxValueLen = &lpcbMaxValueLen;
2698 r.out.lpcbSecurityDescriptor = &lpcbSecurityDescriptor;
2699 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2700 r.out.rpc_status = &rpc_status;
2702 torture_assert_ntstatus_ok(tctx,
2703 dcerpc_clusapi_QueryInfoKey_r(b, tctx, &r),
2704 "QueryInfoKey failed");
2705 torture_assert_werr_ok(tctx,
2707 "QueryInfoKey failed");
2712 static bool test_GetKeySecurity_int(struct torture_context *tctx,
2713 struct dcerpc_pipe *p,
2714 struct policy_handle *hKey)
2716 struct dcerpc_binding_handle *b = p->binding_handle;
2717 struct clusapi_GetKeySecurity r;
2718 uint32_t SecurityInformation = SECINFO_DACL | SECINFO_OWNER | SECINFO_GROUP;
2719 struct RPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor;
2722 ZERO_STRUCT(pRpcSecurityDescriptor);
2725 r.in.SecurityInformation = SecurityInformation;
2726 r.in.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
2727 r.out.rpc_status = &rpc_status;
2728 r.out.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
2730 torture_assert_ntstatus_ok(tctx,
2731 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
2732 "GetKeySecurity failed");
2734 if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
2735 pRpcSecurityDescriptor.lpSecurityDescriptor = talloc_array(tctx,
2736 uint8_t, pRpcSecurityDescriptor.cbInSecurityDescriptor);
2738 torture_assert_ntstatus_ok(tctx,
2739 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
2740 "GetKeySecurity failed");
2743 torture_assert_werr_ok(tctx,
2745 "GetKeySecurity failed");
2750 static bool test_GetRootKey(struct torture_context *tctx,
2753 struct torture_clusapi_context *t =
2754 talloc_get_type_abort(data, struct torture_clusapi_context);
2755 struct policy_handle hKey;
2757 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2761 test_CloseKey_int(tctx, t->p, &hKey);
2766 static bool test_CloseKey(struct torture_context *tctx,
2769 struct torture_clusapi_context *t =
2770 talloc_get_type_abort(data, struct torture_clusapi_context);
2771 struct policy_handle hKey;
2773 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2777 return test_CloseKey_int(tctx, t->p, &hKey);
2780 static bool test_EnumKey(struct torture_context *tctx,
2783 struct torture_clusapi_context *t =
2784 talloc_get_type_abort(data, struct torture_clusapi_context);
2785 struct policy_handle hKey;
2788 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2792 ret = test_EnumKey_int(tctx, t->p, &hKey);
2794 test_CloseKey_int(tctx, t->p, &hKey);
2799 static bool test_QueryValue_int(struct torture_context *tctx,
2800 struct dcerpc_pipe *p,
2801 struct policy_handle *hKey,
2802 const char *ValueName)
2804 struct dcerpc_binding_handle *b = p->binding_handle;
2805 struct clusapi_QueryValue r;
2806 uint32_t lpValueType;
2807 uint32_t lpcbRequired;
2811 r.in.lpValueName = ValueName;
2813 r.out.lpValueType = &lpValueType;
2814 r.out.lpData = NULL;
2815 r.out.lpcbRequired = &lpcbRequired;
2816 r.out.rpc_status = &rpc_status;
2818 torture_assert_ntstatus_ok(tctx,
2819 dcerpc_clusapi_QueryValue_r(b, tctx, &r),
2820 "QueryValue failed");
2822 if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
2824 r.in.cbData = lpcbRequired;
2825 r.out.lpData = talloc_zero_array(tctx, uint8_t, r.in.cbData);
2827 torture_assert_ntstatus_ok(tctx,
2828 dcerpc_clusapi_QueryValue_r(b, tctx, &r),
2829 "QueryValue failed");
2832 torture_assert_werr_ok(tctx,
2834 "QueryValue failed");
2836 if (lpValueType == REG_SZ) {
2838 DATA_BLOB blob = data_blob_const(r.out.lpData, lpcbRequired);
2839 pull_reg_sz(tctx, &blob, &s);
2840 torture_comment(tctx, "got: %s\n", s);
2846 static bool test_QueryValue(struct torture_context *tctx,
2849 struct torture_clusapi_context *t =
2850 talloc_get_type_abort(data, struct torture_clusapi_context);
2851 struct policy_handle hKey;
2854 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2858 ret = test_QueryValue_int(tctx, t->p, &hKey, "ClusterInstanceID");
2860 test_CloseKey_int(tctx, t->p, &hKey);
2866 static bool test_one_key(struct torture_context *tctx,
2867 struct dcerpc_pipe *p,
2868 struct policy_handle *hKey,
2869 const char *KeyName)
2871 struct policy_handle phKey;
2873 torture_assert(tctx,
2874 test_OpenKey_int(tctx, p, hKey, KeyName, &phKey),
2875 "failed to open key");
2877 torture_assert(tctx,
2878 test_QueryInfoKey_int(tctx, p, &phKey),
2879 "failed to enum values");
2880 torture_assert(tctx,
2881 test_GetKeySecurity_int(tctx, p, &phKey),
2882 "failed to get key security");
2884 torture_assert(tctx,
2885 test_EnumValue_int(tctx, p, &phKey),
2886 "failed to enum values");
2888 torture_assert(tctx,
2889 test_CloseKey_int(tctx, p, &phKey),
2890 "failed to close key");
2895 static bool test_all_keys(struct torture_context *tctx,
2898 struct torture_clusapi_context *t =
2899 talloc_get_type_abort(data, struct torture_clusapi_context);
2900 struct dcerpc_binding_handle *b = t->p->binding_handle;
2901 struct policy_handle hKey;
2902 struct clusapi_EnumKey r;
2903 const char *KeyName;
2904 NTTIME lpftLastWriteTime;
2908 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2915 r.out.KeyName = &KeyName;
2916 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2917 r.out.rpc_status = &rpc_status;
2919 torture_assert_ntstatus_ok(tctx,
2920 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
2923 if (W_ERROR_IS_OK(r.out.result)) {
2924 torture_assert(tctx,
2925 test_one_key(tctx, t->p, &hKey, KeyName),
2926 "failed to test one key");
2929 } while (W_ERROR_IS_OK(r.out.result));
2931 torture_assert_werr_equal(tctx,
2936 test_CloseKey_int(tctx, t->p, &hKey);
2941 static bool torture_rpc_clusapi_setup_common(struct torture_context *tctx,
2942 struct torture_clusapi_context *t)
2944 struct dcerpc_binding_handle *b;
2946 torture_assert_ntstatus_ok(tctx,
2947 torture_rpc_connection(tctx, &t->p, &ndr_table_clusapi),
2948 "Error connecting to server");
2951 struct clusapi_GetClusterName r;
2953 b = t->p->binding_handle;
2955 r.out.ClusterName = &t->ClusterName;
2956 r.out.NodeName = &t->NodeName;
2958 torture_assert_ntstatus_ok(tctx,
2959 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
2960 "GetClusterName failed");
2961 torture_assert_werr_ok(tctx,
2963 "GetClusterName failed");
2969 static bool torture_rpc_clusapi_setup(struct torture_context *tctx,
2972 struct torture_clusapi_context *t;
2974 *data = t = talloc_zero(tctx, struct torture_clusapi_context);
2976 return torture_rpc_clusapi_setup_common(tctx, t);
2979 static bool torture_rpc_clusapi_teardown(struct torture_context *tctx,
2987 void torture_tcase_cluster(struct torture_tcase *tcase)
2989 torture_tcase_add_simple_test(tcase, "OpenCluster",
2991 torture_tcase_add_simple_test(tcase, "OpenClusterEx",
2992 test_OpenClusterEx);
2993 torture_tcase_add_simple_test(tcase, "CloseCluster",
2995 torture_tcase_add_simple_test(tcase, "SetClusterName",
2996 test_SetClusterName);
2997 torture_tcase_add_simple_test(tcase, "GetClusterName",
2998 test_GetClusterName);
2999 torture_tcase_add_simple_test(tcase, "GetClusterVersion",
3000 test_GetClusterVersion);
3001 torture_tcase_add_simple_test(tcase, "CreateEnum",
3003 torture_tcase_add_simple_test(tcase, "GetClusterVersion2",
3004 test_GetClusterVersion2);
3005 torture_tcase_add_simple_test(tcase, "BackupClusterDatabase",
3006 test_BackupClusterDatabase);
3007 torture_tcase_add_simple_test(tcase, "SetServiceAccountPassword",
3008 test_SetServiceAccountPassword);
3009 torture_tcase_add_simple_test(tcase, "ClusterControl",
3010 test_ClusterControl);
3014 void torture_tcase_resource(struct torture_tcase *tcase)
3016 struct torture_test *test;
3018 torture_tcase_add_simple_test(tcase, "GetQuorumResource",
3019 test_GetQuorumResource);
3020 torture_tcase_add_simple_test(tcase, "SetQuorumResource",
3021 test_SetQuorumResource);
3022 torture_tcase_add_simple_test(tcase, "OpenResource",
3024 torture_tcase_add_simple_test(tcase, "OpenResourceEx",
3025 test_OpenResourceEx);
3026 torture_tcase_add_simple_test(tcase, "CloseResource",
3027 test_CloseResource);
3028 torture_tcase_add_simple_test(tcase, "CreateResource",
3029 test_CreateResource);
3030 torture_tcase_add_simple_test(tcase, "DeleteResource",
3031 test_DeleteResource);
3032 torture_tcase_add_simple_test(tcase, "SetResourceName",
3033 test_SetResourceName);
3034 torture_tcase_add_simple_test(tcase, "GetResourceState",
3035 test_GetResourceState);
3036 torture_tcase_add_simple_test(tcase, "GetResourceId",
3037 test_GetResourceId);
3038 torture_tcase_add_simple_test(tcase, "GetResourceType",
3039 test_GetResourceType);
3040 torture_tcase_add_simple_test(tcase, "CreateResEnum",
3041 test_CreateResEnum);
3042 test = torture_tcase_add_simple_test(tcase, "FailResource",
3044 test->dangerous = true;
3045 torture_tcase_add_simple_test(tcase, "OnlineResource",
3046 test_OnlineResource);
3047 test = torture_tcase_add_simple_test(tcase, "OfflineResource",
3048 test_OfflineResource);
3049 test->dangerous = true;
3050 torture_tcase_add_simple_test(tcase, "GetResourceDependencyExpression",
3051 test_GetResourceDependencyExpression);
3052 torture_tcase_add_simple_test(tcase, "GetResourceNetworkName",
3053 test_GetResourceNetworkName);
3054 torture_tcase_add_simple_test(tcase, "all_resources",
3055 test_all_resources);
3058 void torture_tcase_node(struct torture_tcase *tcase)
3060 struct torture_test *test;
3062 torture_tcase_add_simple_test(tcase, "OpenNode",
3064 torture_tcase_add_simple_test(tcase, "OpenNodeEx",
3066 torture_tcase_add_simple_test(tcase, "CloseNode",
3068 torture_tcase_add_simple_test(tcase, "GetNodeState",
3070 torture_tcase_add_simple_test(tcase, "GetNodeId",
3072 test = torture_tcase_add_simple_test(tcase, "PauseNode",
3074 test->dangerous = true;
3075 torture_tcase_add_simple_test(tcase, "ResumeNode",
3077 test = torture_tcase_add_simple_test(tcase, "EvictNode",
3079 test->dangerous = true;
3080 torture_tcase_add_simple_test(tcase, "all_nodes",
3084 void torture_tcase_group(struct torture_tcase *tcase)
3086 struct torture_test *test;
3088 torture_tcase_add_simple_test(tcase, "OpenGroup",
3090 torture_tcase_add_simple_test(tcase, "OpenGroupEx",
3092 torture_tcase_add_simple_test(tcase, "CloseGroup",
3094 torture_tcase_add_simple_test(tcase, "GetGroupState",
3095 test_GetGroupState);
3096 torture_tcase_add_simple_test(tcase, "GetGroupId",
3098 torture_tcase_add_simple_test(tcase, "OnlineGroup",
3100 test = torture_tcase_add_simple_test(tcase, "OfflineGroup",
3102 test->dangerous = true;
3103 torture_tcase_add_simple_test(tcase, "all_groups",
3107 void torture_tcase_network(struct torture_tcase *tcase)
3109 torture_tcase_add_simple_test(tcase, "OpenNetwork",
3111 torture_tcase_add_simple_test(tcase, "OpenNetworkEx",
3112 test_OpenNetworkEx);
3113 torture_tcase_add_simple_test(tcase, "CloseNetwork",
3115 torture_tcase_add_simple_test(tcase, "GetNetworkState",
3116 test_GetNetworkState);
3117 torture_tcase_add_simple_test(tcase, "GetNetworkId",
3119 torture_tcase_add_simple_test(tcase, "all_networks",
3123 void torture_tcase_netinterface(struct torture_tcase *tcase)
3125 torture_tcase_add_simple_test(tcase, "OpenNetInterface",
3126 test_OpenNetInterface);
3127 torture_tcase_add_simple_test(tcase, "OpenNetInterfaceEx",
3128 test_OpenNetInterfaceEx);
3129 torture_tcase_add_simple_test(tcase, "CloseNetInterface",
3130 test_CloseNetInterface);
3131 torture_tcase_add_simple_test(tcase, "GetNetInterfaceState",
3132 test_GetNetInterfaceState);
3133 torture_tcase_add_simple_test(tcase, "GetNetInterfaceId",
3134 test_GetNetInterfaceId);
3135 torture_tcase_add_simple_test(tcase, "all_netinterfaces",
3136 test_all_netinterfaces);
3139 void torture_tcase_registry(struct torture_tcase *tcase)
3141 torture_tcase_add_simple_test(tcase, "GetRootKey",
3143 torture_tcase_add_simple_test(tcase, "CloseKey",
3145 torture_tcase_add_simple_test(tcase, "EnumKey",
3147 torture_tcase_add_simple_test(tcase, "QueryValue",
3149 torture_tcase_add_simple_test(tcase, "all_keys",
3153 struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
3155 struct torture_tcase *tcase;
3156 struct torture_suite *suite = torture_suite_create(mem_ctx, "clusapi");
3158 tcase = torture_suite_add_tcase(suite, "cluster");
3160 torture_tcase_set_fixture(tcase,
3161 torture_rpc_clusapi_setup,
3162 torture_rpc_clusapi_teardown);
3164 torture_tcase_cluster(tcase);
3166 tcase = torture_suite_add_tcase(suite, "resource");
3168 torture_tcase_set_fixture(tcase,
3169 torture_rpc_clusapi_setup,
3170 torture_rpc_clusapi_teardown);
3172 torture_tcase_resource(tcase);
3174 tcase = torture_suite_add_tcase(suite, "node");
3176 torture_tcase_set_fixture(tcase,
3177 torture_rpc_clusapi_setup,
3178 torture_rpc_clusapi_teardown);
3180 torture_tcase_node(tcase);
3182 tcase = torture_suite_add_tcase(suite, "group");
3184 torture_tcase_set_fixture(tcase,
3185 torture_rpc_clusapi_setup,
3186 torture_rpc_clusapi_teardown);
3188 torture_tcase_group(tcase);
3190 tcase = torture_suite_add_tcase(suite, "network");
3192 torture_tcase_set_fixture(tcase,
3193 torture_rpc_clusapi_setup,
3194 torture_rpc_clusapi_teardown);
3196 torture_tcase_network(tcase);
3198 tcase = torture_suite_add_tcase(suite, "netinterface");
3200 torture_tcase_set_fixture(tcase,
3201 torture_rpc_clusapi_setup,
3202 torture_rpc_clusapi_teardown);
3204 torture_tcase_netinterface(tcase);
3206 tcase = torture_suite_add_tcase(suite, "registry");
3208 torture_tcase_set_fixture(tcase,
3209 torture_rpc_clusapi_setup,
3210 torture_rpc_clusapi_teardown);
3212 torture_tcase_registry(tcase);