s4-torture: make some clusapi torture tests public.
[Samba.git] / source4 / torture / rpc / clusapi.c
blob8d4dbecdaa29c8989f42b7c7b887eafd54cb454c
1 /*
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/>.
21 #include "includes.h"
22 #include "librpc/gen_ndr/ndr_clusapi_c.h"
23 #include "torture/rpc/torture_rpc.h"
24 #include "param/param.h"
26 struct torture_clusapi_context {
27 struct dcerpc_pipe *p;
28 const char *NodeName;
29 const char *ClusterName;
32 static bool test_OpenCluster_int(struct torture_context *tctx,
33 struct dcerpc_pipe *p,
34 struct policy_handle *Cluster)
36 struct dcerpc_binding_handle *b = p->binding_handle;
37 struct clusapi_OpenCluster r;
38 WERROR Status;
40 r.out.Status = &Status;
41 r.out.Cluster = Cluster;
43 torture_assert_ntstatus_ok(tctx,
44 dcerpc_clusapi_OpenCluster_r(b, tctx, &r),
45 "OpenCluster failed");
46 torture_assert_werr_ok(tctx,
47 *r.out.Status,
48 "OpenCluster failed");
50 return true;
53 static bool test_OpenClusterEx_int(struct torture_context *tctx,
54 struct dcerpc_pipe *p,
55 struct policy_handle *Cluster)
57 struct dcerpc_binding_handle *b = p->binding_handle;
58 struct clusapi_OpenClusterEx r;
59 uint32_t lpdwGrantedAccess;
60 WERROR Status;
62 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
63 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
64 r.out.Status = &Status;
65 r.out.hCluster = Cluster;
67 torture_assert_ntstatus_ok(tctx,
68 dcerpc_clusapi_OpenClusterEx_r(b, tctx, &r),
69 "OpenClusterEx failed");
70 torture_assert_werr_ok(tctx,
71 *r.out.Status,
72 "OpenClusterEx failed");
74 return true;
77 static bool test_CloseCluster_int(struct torture_context *tctx,
78 struct dcerpc_pipe *p,
79 struct policy_handle *Cluster)
81 struct dcerpc_binding_handle *b = p->binding_handle;
82 struct clusapi_CloseCluster r;
84 r.in.Cluster = Cluster;
85 r.out.Cluster = Cluster;
87 torture_assert_ntstatus_ok(tctx,
88 dcerpc_clusapi_CloseCluster_r(b, tctx, &r),
89 "CloseCluster failed");
90 torture_assert_werr_ok(tctx,
91 r.out.result,
92 "CloseCluster failed");
94 torture_assert(tctx,
95 ndr_policy_handle_empty(Cluster),
96 "policy_handle non empty after CloseCluster");
98 return true;
101 static bool test_OpenCluster(struct torture_context *tctx,
102 void *data)
104 struct torture_clusapi_context *t =
105 talloc_get_type_abort(data, struct torture_clusapi_context);
106 struct policy_handle Cluster;
108 if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
109 return false;
112 test_CloseCluster_int(tctx, t->p, &Cluster);
114 return true;
117 static bool test_OpenClusterEx(struct torture_context *tctx,
118 void *data)
120 struct torture_clusapi_context *t =
121 talloc_get_type_abort(data, struct torture_clusapi_context);
122 struct policy_handle Cluster;
124 if (!test_OpenClusterEx_int(tctx, t->p, &Cluster)) {
125 return false;
128 test_CloseCluster_int(tctx, t->p, &Cluster);
130 return true;
133 static bool test_CloseCluster(struct torture_context *tctx,
134 void *data)
136 struct torture_clusapi_context *t =
137 talloc_get_type_abort(data, struct torture_clusapi_context);
138 struct policy_handle Cluster;
140 if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
141 return false;
144 return test_CloseCluster_int(tctx, t->p, &Cluster);
147 static bool test_GetClusterName_int(struct torture_context *tctx,
148 struct dcerpc_pipe *p,
149 const char **ClusterName)
151 struct dcerpc_binding_handle *b = p->binding_handle;
152 struct clusapi_GetClusterName r;
153 const char *NodeName;
155 r.out.ClusterName = ClusterName;
156 r.out.NodeName = &NodeName;
158 torture_assert_ntstatus_ok(tctx,
159 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
160 "GetClusterName failed");
161 torture_assert_werr_ok(tctx,
162 r.out.result,
163 "GetClusterName failed");
165 return true;
168 static bool test_SetClusterName(struct torture_context *tctx,
169 void *data)
171 struct torture_clusapi_context *t =
172 talloc_get_type_abort(data, struct torture_clusapi_context);
173 struct dcerpc_binding_handle *b = t->p->binding_handle;
174 struct clusapi_SetClusterName r;
175 const char *NewClusterName;
176 WERROR rpc_status;
178 torture_assert(tctx,
179 test_GetClusterName_int(tctx, t->p, &NewClusterName),
180 "failed to query old ClusterName");
182 r.in.NewClusterName = NewClusterName;
183 r.out.rpc_status = &rpc_status;
185 torture_assert_ntstatus_ok(tctx,
186 dcerpc_clusapi_SetClusterName_r(b, tctx, &r),
187 "SetClusterName failed");
188 torture_assert_werr_equal(tctx,
189 r.out.result,
190 WERR_RESOURCE_PROPERTIES_STORED,
191 "SetClusterName failed");
193 return true;
196 static bool test_GetClusterName(struct torture_context *tctx,
197 void *data)
199 struct torture_clusapi_context *t =
200 talloc_get_type_abort(data, struct torture_clusapi_context);
201 const char *ClusterName;
203 return test_GetClusterName_int(tctx, t->p, &ClusterName);
206 static bool test_GetClusterVersion(struct torture_context *tctx,
207 void *data)
209 struct torture_clusapi_context *t =
210 talloc_get_type_abort(data, struct torture_clusapi_context);
211 struct dcerpc_binding_handle *b = t->p->binding_handle;
212 struct clusapi_GetClusterVersion r;
213 uint16_t lpwMajorVersion;
214 uint16_t lpwMinorVersion;
215 uint16_t lpwBuildNumber;
216 const char *lpszVendorId;
217 const char *lpszCSDVersion;
219 r.out.lpwMajorVersion = &lpwMajorVersion;
220 r.out.lpwMinorVersion = &lpwMinorVersion;
221 r.out.lpwBuildNumber = &lpwBuildNumber;
222 r.out.lpszVendorId = &lpszVendorId;
223 r.out.lpszCSDVersion = &lpszCSDVersion;
225 torture_assert_ntstatus_ok(tctx,
226 dcerpc_clusapi_GetClusterVersion_r(b, tctx, &r),
227 "GetClusterVersion failed");
228 torture_assert_werr_equal(tctx,
229 r.out.result,
230 WERR_CALL_NOT_IMPLEMENTED,
231 "GetClusterVersion failed");
233 return true;
236 static bool test_GetClusterVersion2(struct torture_context *tctx,
237 void *data)
239 struct torture_clusapi_context *t =
240 talloc_get_type_abort(data, struct torture_clusapi_context);
241 struct dcerpc_binding_handle *b = t->p->binding_handle;
242 struct clusapi_GetClusterVersion2 r;
243 uint16_t lpwMajorVersion;
244 uint16_t lpwMinorVersion;
245 uint16_t lpwBuildNumber;
246 const char *lpszVendorId;
247 const char *lpszCSDVersion;
248 struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
249 WERROR rpc_status;
251 r.out.lpwMajorVersion = &lpwMajorVersion;
252 r.out.lpwMinorVersion = &lpwMinorVersion;
253 r.out.lpwBuildNumber = &lpwBuildNumber;
254 r.out.lpszVendorId = &lpszVendorId;
255 r.out.lpszCSDVersion = &lpszCSDVersion;
256 r.out.ppClusterOpVerInfo = &ppClusterOpVerInfo;
257 r.out.rpc_status = &rpc_status;
259 torture_assert_ntstatus_ok(tctx,
260 dcerpc_clusapi_GetClusterVersion2_r(b, tctx, &r),
261 "GetClusterVersion2 failed");
262 torture_assert_werr_ok(tctx,
263 r.out.result,
264 "GetClusterVersion2 failed");
266 return true;
269 static bool test_CreateEnum(struct torture_context *tctx,
270 void *data)
272 struct torture_clusapi_context *t =
273 talloc_get_type_abort(data, struct torture_clusapi_context);
274 struct dcerpc_binding_handle *b = t->p->binding_handle;
275 struct clusapi_CreateEnum r;
276 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
277 struct ENUM_LIST *ReturnEnum;
278 WERROR rpc_status;
280 r.in.dwType = dwType;
281 r.out.ReturnEnum = &ReturnEnum;
282 r.out.rpc_status = &rpc_status;
284 torture_assert_ntstatus_ok(tctx,
285 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
286 "CreateEnum failed");
287 torture_assert_werr_ok(tctx,
288 r.out.result,
289 "CreateEnum failed");
291 return true;
294 static bool test_GetQuorumResource(struct torture_context *tctx,
295 void *data)
297 struct torture_clusapi_context *t =
298 talloc_get_type_abort(data, struct torture_clusapi_context);
299 struct dcerpc_binding_handle *b = t->p->binding_handle;
300 struct clusapi_GetQuorumResource r;
301 const char *lpszResourceName;
302 const char *lpszDeviceName;
303 uint32_t pdwMaxQuorumLogSize;
304 WERROR rpc_status;
306 r.out.lpszResourceName = &lpszResourceName;
307 r.out.lpszDeviceName = &lpszDeviceName;
308 r.out.pdwMaxQuorumLogSize = &pdwMaxQuorumLogSize;
309 r.out.rpc_status = &rpc_status;
311 torture_assert_ntstatus_ok(tctx,
312 dcerpc_clusapi_GetQuorumResource_r(b, tctx, &r),
313 "GetQuorumResource failed");
314 torture_assert_werr_ok(tctx,
315 r.out.result,
316 "GetQuorumResource failed");
318 return true;
321 static bool test_SetQuorumResource(struct torture_context *tctx,
322 void *data)
324 struct torture_clusapi_context *t =
325 talloc_get_type_abort(data, struct torture_clusapi_context);
326 struct dcerpc_binding_handle *b = t->p->binding_handle;
327 struct clusapi_SetQuorumResource r;
328 const char *lpszDeviceName = "";
329 uint32_t dwMaxQuorumLogSize = 0;
330 WERROR rpc_status;
331 struct policy_handle hResource;
333 /* we need to figure out how this call works and what we provide as
334 devicename and resource handle - gd
337 torture_skip(tctx, "skipping SetQuorumResource test");
339 ZERO_STRUCT(hResource);
341 r.in.hResource = hResource;
342 r.in.lpszDeviceName = lpszDeviceName;
343 r.in.dwMaxQuorumLogSize = dwMaxQuorumLogSize;
344 r.out.rpc_status = &rpc_status;
346 torture_assert_ntstatus_ok(tctx,
347 dcerpc_clusapi_SetQuorumResource_r(b, tctx, &r),
348 "SetQuorumResource failed");
349 torture_assert_werr_ok(tctx,
350 r.out.result,
351 "SetQuorumResource failed");
353 return true;
356 bool test_OpenResource_int(struct torture_context *tctx,
357 struct dcerpc_pipe *p,
358 const char *lpszResourceName,
359 struct policy_handle *hResource)
361 struct dcerpc_binding_handle *b = p->binding_handle;
362 struct clusapi_OpenResource r;
363 WERROR Status;
364 WERROR rpc_status;
366 r.in.lpszResourceName = lpszResourceName;
367 r.out.rpc_status = &rpc_status;
368 r.out.Status = &Status;
369 r.out.hResource = hResource;
371 torture_assert_ntstatus_ok(tctx,
372 dcerpc_clusapi_OpenResource_r(b, tctx, &r),
373 "OpenResource failed");
374 torture_assert_werr_ok(tctx,
375 *r.out.Status,
376 "OpenResource failed");
378 return true;
381 static bool test_OpenResourceEx_int(struct torture_context *tctx,
382 struct dcerpc_pipe *p,
383 const char *lpszResourceName,
384 struct policy_handle *hResource)
386 struct dcerpc_binding_handle *b = p->binding_handle;
387 struct clusapi_OpenResourceEx r;
388 uint32_t lpdwGrantedAccess;
389 WERROR Status;
390 WERROR rpc_status;
392 r.in.lpszResourceName = lpszResourceName;
393 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
394 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
395 r.out.rpc_status = &rpc_status;
396 r.out.Status = &Status;
397 r.out.hResource = hResource;
399 torture_assert_ntstatus_ok(tctx,
400 dcerpc_clusapi_OpenResourceEx_r(b, tctx, &r),
401 "OpenResourceEx failed");
402 torture_assert_werr_ok(tctx,
403 *r.out.Status,
404 "OpenResourceEx failed");
406 return true;
409 bool test_CloseResource_int(struct torture_context *tctx,
410 struct dcerpc_pipe *p,
411 struct policy_handle *hResource)
413 struct dcerpc_binding_handle *b = p->binding_handle;
414 struct clusapi_CloseResource r;
416 r.in.Resource = hResource;
417 r.out.Resource = hResource;
419 torture_assert_ntstatus_ok(tctx,
420 dcerpc_clusapi_CloseResource_r(b, tctx, &r),
421 "CloseResource failed");
422 torture_assert_werr_ok(tctx,
423 r.out.result,
424 "CloseResource failed");
425 torture_assert(tctx,
426 ndr_policy_handle_empty(hResource),
427 "policy_handle non empty after CloseResource");
429 return true;
432 static bool test_OpenResource(struct torture_context *tctx,
433 void *data)
435 struct torture_clusapi_context *t =
436 talloc_get_type_abort(data, struct torture_clusapi_context);
437 struct policy_handle hResource;
439 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
440 return false;
443 test_CloseResource_int(tctx, t->p, &hResource);
445 return true;
448 static bool test_OpenResourceEx(struct torture_context *tctx,
449 void *data)
451 struct torture_clusapi_context *t =
452 talloc_get_type_abort(data, struct torture_clusapi_context);
453 struct policy_handle hResource;
455 if (!test_OpenResourceEx_int(tctx, t->p, "Cluster Name", &hResource)) {
456 return false;
459 test_CloseResource_int(tctx, t->p, &hResource);
461 return true;
465 static bool test_CloseResource(struct torture_context *tctx,
466 void *data)
468 struct torture_clusapi_context *t =
469 talloc_get_type_abort(data, struct torture_clusapi_context);
470 struct policy_handle hResource;
472 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
473 return false;
476 return test_CloseResource_int(tctx, t->p, &hResource);
479 static bool test_OpenGroup_int(struct torture_context *tctx,
480 struct dcerpc_pipe *p,
481 const char *lpszGroupName,
482 struct policy_handle *hGroup);
483 static bool test_CloseGroup_int(struct torture_context *tctx,
484 struct dcerpc_pipe *p,
485 struct policy_handle *Group);
487 static bool test_CreateResource_int(struct torture_context *tctx,
488 struct dcerpc_pipe *p,
489 struct policy_handle *hResource)
491 struct dcerpc_binding_handle *b = p->binding_handle;
492 struct clusapi_CreateResource r;
493 const char *lpszResourceName = "wurst";
494 const char *lpszResourceType = "Generic Service";
495 WERROR Status;
496 WERROR rpc_status;
497 struct policy_handle hGroup;
499 torture_assert(tctx,
500 test_OpenGroup_int(tctx, p, "Cluster Group", &hGroup),
501 "failed to open group");
503 r.in.hGroup = hGroup;
504 r.in.lpszResourceName = lpszResourceName;
505 r.in.lpszResourceType = lpszResourceType;
506 r.in.dwFlags = CLUSTER_RESOURCE_DEFAULT_MONITOR;
507 r.out.rpc_status = &rpc_status;
508 r.out.Status = &Status;
509 r.out.hResource = hResource;
511 torture_assert_ntstatus_ok(tctx,
512 dcerpc_clusapi_CreateResource_r(b, tctx, &r),
513 "CreateResource failed");
514 torture_assert_werr_ok(tctx,
515 *r.out.Status,
516 "CreateResource failed");
518 test_CloseGroup_int(tctx, p, &hGroup);
520 return true;
523 static bool test_DeleteResource_int(struct torture_context *tctx,
524 struct dcerpc_pipe *p,
525 struct policy_handle *hResource)
527 struct dcerpc_binding_handle *b = p->binding_handle;
528 struct clusapi_DeleteResource r;
529 WERROR rpc_status;
531 r.in.hResource = *hResource;
532 r.out.rpc_status = &rpc_status;
534 torture_assert_ntstatus_ok(tctx,
535 dcerpc_clusapi_DeleteResource_r(b, tctx, &r),
536 "DeleteResource failed");
537 torture_assert_werr_ok(tctx,
538 r.out.result,
539 "DeleteResource failed");
541 return true;
544 static bool test_CreateResource(struct torture_context *tctx,
545 void *data)
547 struct torture_clusapi_context *t =
548 talloc_get_type_abort(data, struct torture_clusapi_context);
549 struct policy_handle hResource;
551 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
552 return false;
555 test_DeleteResource_int(tctx, t->p, &hResource);
557 return true;
560 static bool test_DeleteResource(struct torture_context *tctx,
561 void *data)
563 struct torture_clusapi_context *t =
564 talloc_get_type_abort(data, struct torture_clusapi_context);
565 struct policy_handle hResource;
567 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
568 return false;
571 return test_DeleteResource_int(tctx, t->p, &hResource);
574 static bool test_SetResourceName_int(struct torture_context *tctx,
575 struct dcerpc_pipe *p,
576 struct policy_handle *hResource)
578 struct dcerpc_binding_handle *b = p->binding_handle;
579 struct clusapi_SetResourceName r;
580 WERROR rpc_status;
582 r.in.hResource = *hResource;
583 r.in.lpszResourceName = "wurst";
584 r.out.rpc_status = &rpc_status;
586 torture_assert_ntstatus_ok(tctx,
587 dcerpc_clusapi_SetResourceName_r(b, tctx, &r),
588 "SetResourceName failed");
589 torture_assert_werr_ok(tctx,
590 r.out.result,
591 "SetResourceName failed");
593 return true;
596 static bool test_SetResourceName(struct torture_context *tctx,
597 void *data)
599 struct torture_clusapi_context *t =
600 talloc_get_type_abort(data, struct torture_clusapi_context);
601 struct policy_handle hResource;
602 bool ret = true;
604 if (!test_CreateResource_int(tctx, t->p, &hResource)) {
605 return false;
608 ret = test_SetResourceName_int(tctx, t->p, &hResource);
610 test_DeleteResource_int(tctx, t->p, &hResource);
612 return ret;
615 static bool test_GetResourceState_int(struct torture_context *tctx,
616 struct dcerpc_pipe *p,
617 struct policy_handle *hResource)
619 struct dcerpc_binding_handle *b = p->binding_handle;
620 struct clusapi_GetResourceState r;
621 enum clusapi_ClusterResourceState State;
622 const char *NodeName;
623 const char *GroupName;
624 WERROR rpc_status;
626 r.in.hResource = *hResource;
627 r.out.State = &State;
628 r.out.NodeName = &NodeName;
629 r.out.GroupName = &GroupName;
630 r.out.rpc_status = &rpc_status;
632 torture_assert_ntstatus_ok(tctx,
633 dcerpc_clusapi_GetResourceState_r(b, tctx, &r),
634 "GetResourceState failed");
635 torture_assert_werr_ok(tctx,
636 r.out.result,
637 "GetResourceState failed");
639 return true;
642 static bool test_GetResourceState(struct torture_context *tctx,
643 void *data)
645 struct torture_clusapi_context *t =
646 talloc_get_type_abort(data, struct torture_clusapi_context);
647 struct policy_handle hResource;
648 bool ret = true;
650 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
651 return false;
654 ret = test_GetResourceState_int(tctx, t->p, &hResource);
656 test_CloseResource_int(tctx, t->p, &hResource);
658 return ret;
661 static bool test_GetResourceId_int(struct torture_context *tctx,
662 struct dcerpc_pipe *p,
663 struct policy_handle *hResource)
665 struct dcerpc_binding_handle *b = p->binding_handle;
666 struct clusapi_GetResourceId r;
667 const char *pGuid;
668 WERROR rpc_status;
670 r.in.hResource = *hResource;
671 r.out.pGuid = &pGuid;
672 r.out.rpc_status = &rpc_status;
674 torture_assert_ntstatus_ok(tctx,
675 dcerpc_clusapi_GetResourceId_r(b, tctx, &r),
676 "GetResourceId failed");
677 torture_assert_werr_ok(tctx,
678 r.out.result,
679 "GetResourceId failed");
681 return true;
684 static bool test_GetResourceId(struct torture_context *tctx,
685 void *data)
687 struct torture_clusapi_context *t =
688 talloc_get_type_abort(data, struct torture_clusapi_context);
689 struct policy_handle hResource;
690 bool ret = true;
692 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
693 return false;
696 ret = test_GetResourceId_int(tctx, t->p, &hResource);
698 test_CloseResource_int(tctx, t->p, &hResource);
700 return ret;
703 static bool test_GetResourceType_int(struct torture_context *tctx,
704 struct dcerpc_pipe *p,
705 struct policy_handle *hResource)
707 struct dcerpc_binding_handle *b = p->binding_handle;
708 struct clusapi_GetResourceType r;
709 const char *lpszResourceType;
710 WERROR rpc_status;
712 r.in.hResource = *hResource;
713 r.out.lpszResourceType = &lpszResourceType;
714 r.out.rpc_status = &rpc_status;
716 torture_assert_ntstatus_ok(tctx,
717 dcerpc_clusapi_GetResourceType_r(b, tctx, &r),
718 "GetResourceType failed");
719 torture_assert_werr_ok(tctx,
720 r.out.result,
721 "GetResourceType failed");
723 return true;
726 static bool test_GetResourceType(struct torture_context *tctx,
727 void *data)
729 struct torture_clusapi_context *t =
730 talloc_get_type_abort(data, struct torture_clusapi_context);
731 struct policy_handle hResource;
732 bool ret = true;
734 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
735 return false;
738 ret = test_GetResourceType_int(tctx, t->p, &hResource);
740 test_CloseResource_int(tctx, t->p, &hResource);
742 return ret;
745 static bool test_FailResource_int(struct torture_context *tctx,
746 struct dcerpc_pipe *p,
747 struct policy_handle *hResource)
749 struct dcerpc_binding_handle *b = p->binding_handle;
750 struct clusapi_FailResource r;
751 WERROR rpc_status;
753 r.in.hResource = *hResource;
754 r.out.rpc_status = &rpc_status;
756 torture_assert_ntstatus_ok(tctx,
757 dcerpc_clusapi_FailResource_r(b, tctx, &r),
758 "FailResource failed");
759 torture_assert_werr_ok(tctx,
760 r.out.result,
761 "FailResource failed");
763 return true;
766 static bool test_FailResource(struct torture_context *tctx,
767 void *data)
769 struct torture_clusapi_context *t =
770 talloc_get_type_abort(data, struct torture_clusapi_context);
771 struct policy_handle hResource;
772 bool ret = true;
774 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
775 return false;
778 ret = test_FailResource_int(tctx, t->p, &hResource);
780 test_CloseResource_int(tctx, t->p, &hResource);
782 return ret;
785 bool test_OnlineResource_int(struct torture_context *tctx,
786 struct dcerpc_pipe *p,
787 struct policy_handle *hResource)
789 struct dcerpc_binding_handle *b = p->binding_handle;
790 struct clusapi_OnlineResource r;
791 WERROR rpc_status;
793 r.in.hResource = *hResource;
794 r.out.rpc_status = &rpc_status;
796 torture_assert_ntstatus_ok(tctx,
797 dcerpc_clusapi_OnlineResource_r(b, tctx, &r),
798 "OnlineResource failed");
799 torture_assert_werr_ok(tctx,
800 r.out.result,
801 "OnlineResource failed");
803 return true;
806 static bool test_OnlineResource(struct torture_context *tctx,
807 void *data)
809 struct torture_clusapi_context *t =
810 talloc_get_type_abort(data, struct torture_clusapi_context);
811 struct policy_handle hResource;
812 bool ret = true;
814 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
815 return false;
818 ret = test_OnlineResource_int(tctx, t->p, &hResource);
820 test_CloseResource_int(tctx, t->p, &hResource);
822 return ret;
825 bool test_OfflineResource_int(struct torture_context *tctx,
826 struct dcerpc_pipe *p,
827 struct policy_handle *hResource)
829 struct dcerpc_binding_handle *b = p->binding_handle;
830 struct clusapi_OfflineResource r;
831 WERROR rpc_status;
833 r.in.hResource = *hResource;
834 r.out.rpc_status = &rpc_status;
836 torture_assert_ntstatus_ok(tctx,
837 dcerpc_clusapi_OfflineResource_r(b, tctx, &r),
838 "OfflineResource failed");
839 torture_assert_werr_ok(tctx,
840 r.out.result,
841 "OfflineResource failed");
843 return true;
846 static bool test_OfflineResource(struct torture_context *tctx,
847 void *data)
849 struct torture_clusapi_context *t =
850 talloc_get_type_abort(data, struct torture_clusapi_context);
851 struct policy_handle hResource;
852 bool ret = true;
854 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
855 return false;
858 ret = test_OfflineResource_int(tctx, t->p, &hResource);
860 test_CloseResource_int(tctx, t->p, &hResource);
862 return ret;
865 static bool test_CreateResEnum_int(struct torture_context *tctx,
866 struct dcerpc_pipe *p,
867 struct policy_handle *hResource)
869 struct dcerpc_binding_handle *b = p->binding_handle;
870 struct clusapi_CreateResEnum r;
871 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
872 struct ENUM_LIST *ReturnEnum;
873 WERROR rpc_status;
875 r.in.hResource = *hResource;
876 r.in.dwType = dwType;
877 r.out.ReturnEnum = &ReturnEnum;
878 r.out.rpc_status = &rpc_status;
880 torture_assert_ntstatus_ok(tctx,
881 dcerpc_clusapi_CreateResEnum_r(b, tctx, &r),
882 "CreateResEnum failed");
883 torture_assert_werr_ok(tctx,
884 r.out.result,
885 "CreateResEnum failed");
887 return true;
890 static bool test_CreateResEnum(struct torture_context *tctx,
891 void *data)
893 struct torture_clusapi_context *t =
894 talloc_get_type_abort(data, struct torture_clusapi_context);
895 struct policy_handle hResource;
896 bool ret = true;
898 if (!test_OpenResource_int(tctx, t->p, "Cluster Name", &hResource)) {
899 return false;
902 ret = test_CreateResEnum_int(tctx, t->p, &hResource);
904 test_CloseResource_int(tctx, t->p, &hResource);
906 return ret;
909 static bool test_one_resource(struct torture_context *tctx,
910 struct dcerpc_pipe *p,
911 const char *resource_name)
913 struct policy_handle hResource;
915 torture_assert(tctx,
916 test_OpenResource_int(tctx, p, resource_name, &hResource),
917 "failed to open resource");
918 test_CloseResource_int(tctx, p, &hResource);
920 torture_assert(tctx,
921 test_OpenResourceEx_int(tctx, p, resource_name, &hResource),
922 "failed to openex resource");
924 torture_assert(tctx,
925 test_GetResourceType_int(tctx, p, &hResource),
926 "failed to query resource type");
927 torture_assert(tctx,
928 test_GetResourceId_int(tctx, p, &hResource),
929 "failed to query resource id");
930 torture_assert(tctx,
931 test_GetResourceState_int(tctx, p, &hResource),
932 "failed to query resource state");
933 torture_assert(tctx,
934 test_CreateResEnum_int(tctx, p, &hResource),
935 "failed to query resource enum");
937 test_CloseResource_int(tctx, p, &hResource);
939 return true;
942 static bool test_all_resources(struct torture_context *tctx,
943 void *data)
945 struct torture_clusapi_context *t =
946 talloc_get_type_abort(data, struct torture_clusapi_context);
947 struct dcerpc_binding_handle *b = t->p->binding_handle;
948 struct clusapi_CreateEnum r;
949 uint32_t dwType = CLUSTER_ENUM_RESOURCE;
950 struct ENUM_LIST *ReturnEnum;
951 WERROR rpc_status;
952 int i;
954 r.in.dwType = dwType;
955 r.out.ReturnEnum = &ReturnEnum;
956 r.out.rpc_status = &rpc_status;
958 torture_assert_ntstatus_ok(tctx,
959 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
960 "CreateEnum failed");
961 torture_assert_werr_ok(tctx,
962 r.out.result,
963 "CreateEnum failed");
965 for (i=0; i < ReturnEnum->EntryCount; i++) {
967 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
969 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESOURCE, "type mismatch");
971 torture_assert(tctx,
972 test_one_resource(tctx, t->p, e.Name),
973 "failed to test one resource");
976 return true;
979 static bool test_OpenNode_int(struct torture_context *tctx,
980 struct dcerpc_pipe *p,
981 const char *lpszNodeName,
982 struct policy_handle *hNode)
984 struct dcerpc_binding_handle *b = p->binding_handle;
985 struct clusapi_OpenNode r;
986 WERROR Status;
987 WERROR rpc_status;
989 r.in.lpszNodeName = lpszNodeName;
990 r.out.rpc_status = &rpc_status;
991 r.out.Status = &Status;
992 r.out.hNode= hNode;
994 torture_assert_ntstatus_ok(tctx,
995 dcerpc_clusapi_OpenNode_r(b, tctx, &r),
996 "OpenNode failed");
997 torture_assert_werr_ok(tctx,
998 *r.out.Status,
999 "OpenNode failed");
1001 return true;
1004 static bool test_OpenNodeEx_int(struct torture_context *tctx,
1005 struct dcerpc_pipe *p,
1006 const char *lpszNodeName,
1007 struct policy_handle *hNode)
1009 struct dcerpc_binding_handle *b = p->binding_handle;
1010 struct clusapi_OpenNodeEx r;
1011 uint32_t lpdwGrantedAccess;
1012 WERROR Status;
1013 WERROR rpc_status;
1015 r.in.lpszNodeName = lpszNodeName;
1016 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1017 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1018 r.out.rpc_status = &rpc_status;
1019 r.out.Status = &Status;
1020 r.out.hNode= hNode;
1022 torture_assert_ntstatus_ok(tctx,
1023 dcerpc_clusapi_OpenNodeEx_r(b, tctx, &r),
1024 "OpenNodeEx failed");
1025 torture_assert_werr_ok(tctx,
1026 *r.out.Status,
1027 "OpenNodeEx failed");
1029 return true;
1033 static bool test_CloseNode_int(struct torture_context *tctx,
1034 struct dcerpc_pipe *p,
1035 struct policy_handle *Node)
1037 struct dcerpc_binding_handle *b = p->binding_handle;
1038 struct clusapi_CloseNode r;
1040 r.in.Node = Node;
1041 r.out.Node = Node;
1043 torture_assert_ntstatus_ok(tctx,
1044 dcerpc_clusapi_CloseNode_r(b, tctx, &r),
1045 "CloseNode failed");
1046 torture_assert_werr_ok(tctx,
1047 r.out.result,
1048 "CloseNode failed");
1049 torture_assert(tctx,
1050 ndr_policy_handle_empty(Node),
1051 "policy_handle non empty after CloseNode");
1053 return true;
1056 static bool test_OpenNode(struct torture_context *tctx,
1057 void *data)
1059 struct torture_clusapi_context *t =
1060 talloc_get_type_abort(data, struct torture_clusapi_context);
1061 struct policy_handle hNode;
1063 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1064 return false;
1067 test_CloseNode_int(tctx, t->p, &hNode);
1069 return true;
1072 static bool test_OpenNodeEx(struct torture_context *tctx,
1073 void *data)
1075 struct torture_clusapi_context *t =
1076 talloc_get_type_abort(data, struct torture_clusapi_context);
1077 struct policy_handle hNode;
1079 if (!test_OpenNodeEx_int(tctx, t->p, t->NodeName, &hNode)) {
1080 return false;
1083 test_CloseNode_int(tctx, t->p, &hNode);
1085 return true;
1088 static bool test_CloseNode(struct torture_context *tctx,
1089 void *data)
1091 struct torture_clusapi_context *t =
1092 talloc_get_type_abort(data, struct torture_clusapi_context);
1093 struct policy_handle hNode;
1095 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1096 return false;
1099 return test_CloseNode_int(tctx, t->p, &hNode);
1102 static bool test_GetNodeState_int(struct torture_context *tctx,
1103 struct dcerpc_pipe *p,
1104 struct policy_handle *hNode)
1106 struct dcerpc_binding_handle *b = p->binding_handle;
1107 struct clusapi_GetNodeState r;
1108 enum clusapi_ClusterNodeState State;
1109 WERROR rpc_status;
1111 r.in.hNode = *hNode;
1112 r.out.State = &State;
1113 r.out.rpc_status = &rpc_status;
1115 torture_assert_ntstatus_ok(tctx,
1116 dcerpc_clusapi_GetNodeState_r(b, tctx, &r),
1117 "GetNodeState failed");
1118 torture_assert_werr_ok(tctx,
1119 r.out.result,
1120 "GetNodeState failed");
1122 return true;
1125 static bool test_GetNodeState(struct torture_context *tctx,
1126 void *data)
1128 struct torture_clusapi_context *t =
1129 talloc_get_type_abort(data, struct torture_clusapi_context);
1130 struct policy_handle hNode;
1131 bool ret = true;
1133 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1134 return false;
1137 ret = test_GetNodeState_int(tctx, t->p, &hNode);
1139 test_CloseNode_int(tctx, t->p, &hNode);
1141 return ret;
1144 static bool test_GetNodeId_int(struct torture_context *tctx,
1145 struct dcerpc_pipe *p,
1146 struct policy_handle *hNode)
1148 struct dcerpc_binding_handle *b = p->binding_handle;
1149 struct clusapi_GetNodeId r;
1150 const char *pGuid;
1151 WERROR rpc_status;
1153 r.in.hNode = *hNode;
1154 r.out.pGuid = &pGuid;
1155 r.out.rpc_status = &rpc_status;
1157 torture_assert_ntstatus_ok(tctx,
1158 dcerpc_clusapi_GetNodeId_r(b, tctx, &r),
1159 "GetNodeId failed");
1160 torture_assert_werr_ok(tctx,
1161 r.out.result,
1162 "GetNodeId failed");
1164 return true;
1167 static bool test_GetNodeId(struct torture_context *tctx,
1168 void *data)
1170 struct torture_clusapi_context *t =
1171 talloc_get_type_abort(data, struct torture_clusapi_context);
1172 struct policy_handle hNode;
1173 bool ret = true;
1175 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1176 return false;
1179 ret = test_GetNodeId_int(tctx, t->p, &hNode);
1181 test_CloseNode_int(tctx, t->p, &hNode);
1183 return ret;
1186 static bool test_PauseNode_int(struct torture_context *tctx,
1187 struct dcerpc_pipe *p,
1188 struct policy_handle *hNode)
1190 struct dcerpc_binding_handle *b = p->binding_handle;
1191 struct clusapi_PauseNode r;
1192 WERROR rpc_status;
1194 r.in.hNode = *hNode;
1195 r.out.rpc_status = &rpc_status;
1197 torture_assert_ntstatus_ok(tctx,
1198 dcerpc_clusapi_PauseNode_r(b, tctx, &r),
1199 "PauseNode failed");
1200 torture_assert_werr_ok(tctx,
1201 r.out.result,
1202 "PauseNode failed");
1204 return true;
1207 static bool test_PauseNode(struct torture_context *tctx,
1208 void *data)
1210 struct torture_clusapi_context *t =
1211 talloc_get_type_abort(data, struct torture_clusapi_context);
1212 struct policy_handle hNode;
1213 bool ret = true;
1215 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1216 return false;
1219 ret = test_PauseNode_int(tctx, t->p, &hNode);
1221 test_CloseNode_int(tctx, t->p, &hNode);
1223 return ret;
1226 static bool test_ResumeNode_int(struct torture_context *tctx,
1227 struct dcerpc_pipe *p,
1228 struct policy_handle *hNode)
1230 struct dcerpc_binding_handle *b = p->binding_handle;
1231 struct clusapi_ResumeNode r;
1232 WERROR rpc_status;
1234 r.in.hNode = *hNode;
1235 r.out.rpc_status = &rpc_status;
1237 torture_assert_ntstatus_ok(tctx,
1238 dcerpc_clusapi_ResumeNode_r(b, tctx, &r),
1239 "ResumeNode failed");
1240 torture_assert_werr_equal(tctx,
1241 r.out.result,
1242 WERR_CLUSTER_NODE_NOT_PAUSED,
1243 "ResumeNode gave unexpected result");
1245 return true;
1248 static bool test_ResumeNode(struct torture_context *tctx,
1249 void *data)
1251 struct torture_clusapi_context *t =
1252 talloc_get_type_abort(data, struct torture_clusapi_context);
1253 struct policy_handle hNode;
1254 bool ret = true;
1256 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1257 return false;
1260 ret = test_ResumeNode_int(tctx, t->p, &hNode);
1262 test_CloseNode_int(tctx, t->p, &hNode);
1264 return ret;
1267 static bool test_EvictNode_int(struct torture_context *tctx,
1268 struct dcerpc_pipe *p,
1269 struct policy_handle *hNode)
1271 struct dcerpc_binding_handle *b = p->binding_handle;
1272 struct clusapi_EvictNode r;
1273 WERROR rpc_status;
1275 r.in.hNode = *hNode;
1276 r.out.rpc_status = &rpc_status;
1278 torture_assert_ntstatus_ok(tctx,
1279 dcerpc_clusapi_EvictNode_r(b, tctx, &r),
1280 "EvictNode failed");
1281 torture_assert_werr_ok(tctx,
1282 r.out.result,
1283 "EvictNode failed");
1285 return true;
1288 static bool test_EvictNode(struct torture_context *tctx,
1289 void *data)
1291 struct torture_clusapi_context *t =
1292 talloc_get_type_abort(data, struct torture_clusapi_context);
1293 struct policy_handle hNode;
1294 bool ret = true;
1296 if (!test_OpenNode_int(tctx, t->p, t->NodeName, &hNode)) {
1297 return false;
1300 ret = test_EvictNode_int(tctx, t->p, &hNode);
1302 test_CloseNode_int(tctx, t->p, &hNode);
1304 return ret;
1307 static bool test_one_node(struct torture_context *tctx,
1308 struct dcerpc_pipe *p,
1309 const char *node_name)
1311 struct policy_handle hNode;
1313 torture_assert(tctx,
1314 test_OpenNode_int(tctx, p, node_name, &hNode),
1315 "failed to open node");
1316 test_CloseNode_int(tctx, p, &hNode);
1318 torture_assert(tctx,
1319 test_OpenNodeEx_int(tctx, p, node_name, &hNode),
1320 "failed to openex node");
1322 torture_assert(tctx,
1323 test_GetNodeId_int(tctx, p, &hNode),
1324 "failed to query node id");
1325 torture_assert(tctx,
1326 test_GetNodeState_int(tctx, p, &hNode),
1327 "failed to query node id");
1329 test_CloseNode_int(tctx, p, &hNode);
1331 return true;
1334 static bool test_all_nodes(struct torture_context *tctx,
1335 void *data)
1337 struct torture_clusapi_context *t =
1338 talloc_get_type_abort(data, struct torture_clusapi_context);
1339 struct dcerpc_binding_handle *b = t->p->binding_handle;
1340 struct clusapi_CreateEnum r;
1341 uint32_t dwType = CLUSTER_ENUM_NODE;
1342 struct ENUM_LIST *ReturnEnum;
1343 WERROR rpc_status;
1344 int i;
1346 r.in.dwType = dwType;
1347 r.out.ReturnEnum = &ReturnEnum;
1348 r.out.rpc_status = &rpc_status;
1350 torture_assert_ntstatus_ok(tctx,
1351 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1352 "CreateEnum failed");
1353 torture_assert_werr_ok(tctx,
1354 r.out.result,
1355 "CreateEnum failed");
1357 for (i=0; i < ReturnEnum->EntryCount; i++) {
1359 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1361 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NODE, "type mismatch");
1363 torture_assert(tctx,
1364 test_one_node(tctx, t->p, e.Name),
1365 "failed to test one node");
1368 return true;
1371 static bool test_OpenGroup_int(struct torture_context *tctx,
1372 struct dcerpc_pipe *p,
1373 const char *lpszGroupName,
1374 struct policy_handle *hGroup)
1376 struct dcerpc_binding_handle *b = p->binding_handle;
1377 struct clusapi_OpenGroup r;
1378 WERROR Status;
1379 WERROR rpc_status;
1381 r.in.lpszGroupName = lpszGroupName;
1382 r.out.rpc_status = &rpc_status;
1383 r.out.Status = &Status;
1384 r.out.hGroup= hGroup;
1386 torture_assert_ntstatus_ok(tctx,
1387 dcerpc_clusapi_OpenGroup_r(b, tctx, &r),
1388 "OpenGroup failed");
1389 torture_assert_werr_ok(tctx,
1390 *r.out.Status,
1391 "OpenGroup failed");
1393 return true;
1396 static bool test_OpenGroupEx_int(struct torture_context *tctx,
1397 struct dcerpc_pipe *p,
1398 const char *lpszGroupName,
1399 struct policy_handle *hGroup)
1401 struct dcerpc_binding_handle *b = p->binding_handle;
1402 struct clusapi_OpenGroupEx r;
1403 uint32_t lpdwGrantedAccess;
1404 WERROR Status;
1405 WERROR rpc_status;
1407 r.in.lpszGroupName = lpszGroupName;
1408 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1409 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1410 r.out.rpc_status = &rpc_status;
1411 r.out.Status = &Status;
1412 r.out.hGroup= hGroup;
1414 torture_assert_ntstatus_ok(tctx,
1415 dcerpc_clusapi_OpenGroupEx_r(b, tctx, &r),
1416 "OpenGroupEx failed");
1417 torture_assert_werr_ok(tctx,
1418 *r.out.Status,
1419 "OpenGroupEx failed");
1421 return true;
1424 static bool test_CloseGroup_int(struct torture_context *tctx,
1425 struct dcerpc_pipe *p,
1426 struct policy_handle *Group)
1428 struct dcerpc_binding_handle *b = p->binding_handle;
1429 struct clusapi_CloseGroup r;
1431 r.in.Group = Group;
1432 r.out.Group = Group;
1434 torture_assert_ntstatus_ok(tctx,
1435 dcerpc_clusapi_CloseGroup_r(b, tctx, &r),
1436 "CloseGroup failed");
1437 torture_assert_werr_ok(tctx,
1438 r.out.result,
1439 "CloseGroup failed");
1440 torture_assert(tctx,
1441 ndr_policy_handle_empty(Group),
1442 "policy_handle non empty after CloseGroup");
1444 return true;
1447 static bool test_OpenGroup(struct torture_context *tctx,
1448 void *data)
1450 struct torture_clusapi_context *t =
1451 talloc_get_type_abort(data, struct torture_clusapi_context);
1452 struct policy_handle hGroup;
1454 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1455 return false;
1458 test_CloseGroup_int(tctx, t->p, &hGroup);
1460 return true;
1463 static bool test_OpenGroupEx(struct torture_context *tctx,
1464 void *data)
1466 struct torture_clusapi_context *t =
1467 talloc_get_type_abort(data, struct torture_clusapi_context);
1468 struct policy_handle hGroup;
1470 if (!test_OpenGroupEx_int(tctx, t->p, "Cluster Group", &hGroup)) {
1471 return false;
1474 test_CloseGroup_int(tctx, t->p, &hGroup);
1476 return true;
1479 static bool test_CloseGroup(struct torture_context *tctx,
1480 void *data)
1482 struct torture_clusapi_context *t =
1483 talloc_get_type_abort(data, struct torture_clusapi_context);
1484 struct policy_handle hGroup;
1486 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1487 return false;
1490 return test_CloseGroup_int(tctx, t->p, &hGroup);
1493 static bool test_GetGroupState_int(struct torture_context *tctx,
1494 struct dcerpc_pipe *p,
1495 struct policy_handle *hGroup)
1497 struct dcerpc_binding_handle *b = p->binding_handle;
1498 struct clusapi_GetGroupState r;
1499 enum clusapi_ClusterGroupState State;
1500 const char *NodeName;
1501 WERROR rpc_status;
1503 r.in.hGroup = *hGroup;
1504 r.out.State = &State;
1505 r.out.NodeName = &NodeName;
1506 r.out.rpc_status = &rpc_status;
1508 torture_assert_ntstatus_ok(tctx,
1509 dcerpc_clusapi_GetGroupState_r(b, tctx, &r),
1510 "GetGroupState failed");
1511 torture_assert_werr_ok(tctx,
1512 r.out.result,
1513 "GetGroupState failed");
1515 return true;
1518 static bool test_GetGroupState(struct torture_context *tctx,
1519 void *data)
1521 struct torture_clusapi_context *t =
1522 talloc_get_type_abort(data, struct torture_clusapi_context);
1523 struct policy_handle hGroup;
1524 bool ret = true;
1526 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1527 return false;
1530 ret = test_GetGroupState_int(tctx, t->p, &hGroup);
1532 test_CloseGroup_int(tctx, t->p, &hGroup);
1534 return ret;
1537 static bool test_GetGroupId_int(struct torture_context *tctx,
1538 struct dcerpc_pipe *p,
1539 struct policy_handle *hGroup)
1541 struct dcerpc_binding_handle *b = p->binding_handle;
1542 struct clusapi_GetGroupId r;
1543 const char *pGuid;
1544 WERROR rpc_status;
1546 r.in.hGroup = *hGroup;
1547 r.out.pGuid = &pGuid;
1548 r.out.rpc_status = &rpc_status;
1550 torture_assert_ntstatus_ok(tctx,
1551 dcerpc_clusapi_GetGroupId_r(b, tctx, &r),
1552 "GetGroupId failed");
1553 torture_assert_werr_ok(tctx,
1554 r.out.result,
1555 "GetGroupId failed");
1557 return true;
1560 static bool test_GetGroupId(struct torture_context *tctx,
1561 void *data)
1563 struct torture_clusapi_context *t =
1564 talloc_get_type_abort(data, struct torture_clusapi_context);
1565 struct policy_handle hGroup;
1566 bool ret = true;
1568 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1569 return false;
1572 ret = test_GetGroupId_int(tctx, t->p, &hGroup);
1574 test_CloseGroup_int(tctx, t->p, &hGroup);
1576 return ret;
1579 static bool test_OnlineGroup_int(struct torture_context *tctx,
1580 struct dcerpc_pipe *p,
1581 struct policy_handle *hGroup)
1583 struct dcerpc_binding_handle *b = p->binding_handle;
1584 struct clusapi_OnlineGroup r;
1585 WERROR rpc_status;
1587 r.in.hGroup = *hGroup;
1588 r.out.rpc_status = &rpc_status;
1590 torture_assert_ntstatus_ok(tctx,
1591 dcerpc_clusapi_OnlineGroup_r(b, tctx, &r),
1592 "OnlineGroup failed");
1593 torture_assert_werr_ok(tctx,
1594 r.out.result,
1595 "OnlineGroup failed");
1597 return true;
1600 static bool test_OnlineGroup(struct torture_context *tctx,
1601 void *data)
1603 struct torture_clusapi_context *t =
1604 talloc_get_type_abort(data, struct torture_clusapi_context);
1605 struct policy_handle hGroup;
1606 bool ret = true;
1608 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1609 return false;
1612 ret = test_OnlineGroup_int(tctx, t->p, &hGroup);
1614 test_CloseGroup_int(tctx, t->p, &hGroup);
1616 return ret;
1619 static bool test_OfflineGroup_int(struct torture_context *tctx,
1620 struct dcerpc_pipe *p,
1621 struct policy_handle *hGroup)
1623 struct dcerpc_binding_handle *b = p->binding_handle;
1624 struct clusapi_OfflineGroup r;
1625 WERROR rpc_status;
1627 r.in.hGroup = *hGroup;
1628 r.out.rpc_status = &rpc_status;
1630 torture_assert_ntstatus_ok(tctx,
1631 dcerpc_clusapi_OfflineGroup_r(b, tctx, &r),
1632 "OfflineGroup failed");
1633 torture_assert_werr_ok(tctx,
1634 r.out.result,
1635 "OfflineGroup failed");
1637 return true;
1640 static bool test_OfflineGroup(struct torture_context *tctx,
1641 void *data)
1643 struct torture_clusapi_context *t =
1644 talloc_get_type_abort(data, struct torture_clusapi_context);
1645 struct policy_handle hGroup;
1646 bool ret = true;
1648 if (!test_OpenGroup_int(tctx, t->p, "Cluster Group", &hGroup)) {
1649 return false;
1652 ret = test_OfflineGroup_int(tctx, t->p, &hGroup);
1654 test_CloseGroup_int(tctx, t->p, &hGroup);
1656 return ret;
1659 static bool test_one_group(struct torture_context *tctx,
1660 struct dcerpc_pipe *p,
1661 const char *node_name)
1663 struct policy_handle hGroup;
1665 torture_assert(tctx,
1666 test_OpenGroup_int(tctx, p, node_name, &hGroup),
1667 "failed to open group");
1668 test_CloseGroup_int(tctx, p, &hGroup);
1670 torture_assert(tctx,
1671 test_OpenGroupEx_int(tctx, p, node_name, &hGroup),
1672 "failed to openex group");
1674 torture_assert(tctx,
1675 test_GetGroupId_int(tctx, p, &hGroup),
1676 "failed to query group id");
1677 torture_assert(tctx,
1678 test_GetGroupState_int(tctx, p, &hGroup),
1679 "failed to query group id");
1681 test_CloseGroup_int(tctx, p, &hGroup);
1683 return true;
1686 static bool test_all_groups(struct torture_context *tctx,
1687 void *data)
1689 struct torture_clusapi_context *t =
1690 talloc_get_type_abort(data, struct torture_clusapi_context);
1691 struct dcerpc_binding_handle *b = t->p->binding_handle;
1692 struct clusapi_CreateEnum r;
1693 uint32_t dwType = CLUSTER_ENUM_GROUP;
1694 struct ENUM_LIST *ReturnEnum;
1695 WERROR rpc_status;
1696 int i;
1698 r.in.dwType = dwType;
1699 r.out.ReturnEnum = &ReturnEnum;
1700 r.out.rpc_status = &rpc_status;
1702 torture_assert_ntstatus_ok(tctx,
1703 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
1704 "CreateEnum failed");
1705 torture_assert_werr_ok(tctx,
1706 r.out.result,
1707 "CreateEnum failed");
1709 for (i=0; i < ReturnEnum->EntryCount; i++) {
1711 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
1713 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_GROUP, "type mismatch");
1715 torture_assert(tctx,
1716 test_one_group(tctx, t->p, e.Name),
1717 "failed to test one group");
1720 return true;
1723 static bool test_BackupClusterDatabase(struct torture_context *tctx,
1724 void *data)
1726 struct torture_clusapi_context *t =
1727 talloc_get_type_abort(data, struct torture_clusapi_context);
1728 struct dcerpc_binding_handle *b = t->p->binding_handle;
1729 struct clusapi_BackupClusterDatabase r;
1730 WERROR rpc_status;
1732 r.in.lpszPathName = "c:\\cluster_backup";
1733 r.out.rpc_status = &rpc_status;
1735 torture_assert_ntstatus_ok(tctx,
1736 dcerpc_clusapi_BackupClusterDatabase_r(b, tctx, &r),
1737 "BackupClusterDatabase failed");
1738 torture_assert_werr_equal(tctx,
1739 r.out.result,
1740 WERR_CALL_NOT_IMPLEMENTED,
1741 "BackupClusterDatabase failed");
1743 return true;
1746 static bool test_SetServiceAccountPassword(struct torture_context *tctx,
1747 void *data)
1749 struct torture_clusapi_context *t =
1750 talloc_get_type_abort(data, struct torture_clusapi_context);
1751 struct dcerpc_binding_handle *b = t->p->binding_handle;
1752 struct clusapi_SetServiceAccountPassword r;
1753 uint32_t SizeReturned;
1754 uint32_t ExpectedBufferSize;
1756 r.in.lpszNewPassword = "P@ssw0rd!";
1757 r.in.dwFlags = IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES;
1758 r.in.ReturnStatusBufferSize = 1024;
1759 r.out.ReturnStatusBufferPtr = NULL;
1760 r.out.SizeReturned = &SizeReturned;
1761 r.out.ExpectedBufferSize = &ExpectedBufferSize;
1763 torture_assert_ntstatus_ok(tctx,
1764 dcerpc_clusapi_SetServiceAccountPassword_r(b, tctx, &r),
1765 "SetServiceAccountPassword failed");
1766 torture_assert_werr_equal(tctx,
1767 r.out.result,
1768 WERR_CALL_NOT_IMPLEMENTED,
1769 "SetServiceAccountPassword failed");
1771 return true;
1774 static bool test_OpenNetwork_int(struct torture_context *tctx,
1775 struct dcerpc_pipe *p,
1776 const char *lpszNetworkName,
1777 struct policy_handle *hNetwork)
1779 struct dcerpc_binding_handle *b = p->binding_handle;
1780 struct clusapi_OpenNetwork r;
1781 WERROR Status;
1782 WERROR rpc_status;
1784 r.in.lpszNetworkName = lpszNetworkName;
1785 r.out.rpc_status = &rpc_status;
1786 r.out.Status = &Status;
1787 r.out.hNetwork = hNetwork ;
1789 torture_assert_ntstatus_ok(tctx,
1790 dcerpc_clusapi_OpenNetwork_r(b, tctx, &r),
1791 "OpenNetwork failed");
1792 torture_assert_werr_ok(tctx,
1793 *r.out.Status,
1794 "OpenNetwork failed");
1796 return true;
1799 static bool test_OpenNetworkEx_int(struct torture_context *tctx,
1800 struct dcerpc_pipe *p,
1801 const char *lpszNetworkName,
1802 struct policy_handle *hNetwork)
1804 struct dcerpc_binding_handle *b = p->binding_handle;
1805 struct clusapi_OpenNetworkEx r;
1806 uint32_t lpdwGrantedAccess;
1807 WERROR Status;
1808 WERROR rpc_status;
1810 r.in.lpszNetworkName = lpszNetworkName;
1811 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
1812 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
1813 r.out.rpc_status = &rpc_status;
1814 r.out.Status = &Status;
1815 r.out.hNetwork = hNetwork ;
1817 torture_assert_ntstatus_ok(tctx,
1818 dcerpc_clusapi_OpenNetworkEx_r(b, tctx, &r),
1819 "OpenNetworkEx failed");
1820 torture_assert_werr_ok(tctx,
1821 *r.out.Status,
1822 "OpenNetworkEx failed");
1824 return true;
1827 static bool test_CloseNetwork_int(struct torture_context *tctx,
1828 struct dcerpc_pipe *p,
1829 struct policy_handle *Network)
1831 struct dcerpc_binding_handle *b = p->binding_handle;
1832 struct clusapi_CloseNetwork r;
1834 r.in.Network = Network;
1835 r.out.Network = Network;
1837 torture_assert_ntstatus_ok(tctx,
1838 dcerpc_clusapi_CloseNetwork_r(b, tctx, &r),
1839 "CloseNetwork failed");
1840 torture_assert_werr_ok(tctx,
1841 r.out.result,
1842 "CloseNetwork failed");
1843 torture_assert(tctx,
1844 ndr_policy_handle_empty(Network),
1845 "policy_handle non empty after CloseNetwork");
1847 return true;
1850 static bool test_OpenNetwork(struct torture_context *tctx,
1851 void *data)
1853 struct torture_clusapi_context *t =
1854 talloc_get_type_abort(data, struct torture_clusapi_context);
1855 struct policy_handle hNetwork;
1857 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
1858 return false;
1861 test_CloseNetwork_int(tctx, t->p, &hNetwork);
1863 return true;
1866 static bool test_OpenNetworkEx(struct torture_context *tctx,
1867 void *data)
1869 struct torture_clusapi_context *t =
1870 talloc_get_type_abort(data, struct torture_clusapi_context);
1871 struct policy_handle hNetwork;
1873 if (!test_OpenNetworkEx_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
1874 return false;
1877 test_CloseNetwork_int(tctx, t->p, &hNetwork);
1879 return true;
1882 static bool test_CloseNetwork(struct torture_context *tctx,
1883 void *data)
1885 struct torture_clusapi_context *t =
1886 talloc_get_type_abort(data, struct torture_clusapi_context);
1887 struct policy_handle hNetwork;
1889 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
1890 return false;
1893 return test_CloseNetwork_int(tctx, t->p, &hNetwork);
1896 static bool test_GetNetworkState_int(struct torture_context *tctx,
1897 struct dcerpc_pipe *p,
1898 struct policy_handle *hNetwork)
1900 struct dcerpc_binding_handle *b = p->binding_handle;
1901 struct clusapi_GetNetworkState r;
1902 enum clusapi_ClusterNetworkState State;
1903 WERROR rpc_status;
1905 r.in.hNetwork = *hNetwork;
1906 r.out.State = &State;
1907 r.out.rpc_status = &rpc_status;
1909 torture_assert_ntstatus_ok(tctx,
1910 dcerpc_clusapi_GetNetworkState_r(b, tctx, &r),
1911 "GetNetworkState failed");
1912 torture_assert_werr_ok(tctx,
1913 r.out.result,
1914 "GetNetworkState failed");
1916 return true;
1919 static bool test_GetNetworkState(struct torture_context *tctx,
1920 void *data)
1922 struct torture_clusapi_context *t =
1923 talloc_get_type_abort(data, struct torture_clusapi_context);
1924 struct policy_handle hNetwork;
1925 bool ret = true;
1927 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
1928 return false;
1931 ret = test_GetNetworkState_int(tctx, t->p, &hNetwork);
1933 test_CloseNetwork_int(tctx, t->p, &hNetwork);
1935 return ret;
1938 static bool test_GetNetworkId_int(struct torture_context *tctx,
1939 struct dcerpc_pipe *p,
1940 struct policy_handle *hNetwork)
1942 struct dcerpc_binding_handle *b = p->binding_handle;
1943 struct clusapi_GetNetworkId r;
1944 const char *pGuid;
1945 WERROR rpc_status;
1947 r.in.hNetwork = *hNetwork;
1948 r.out.pGuid = &pGuid;
1949 r.out.rpc_status = &rpc_status;
1951 torture_assert_ntstatus_ok(tctx,
1952 dcerpc_clusapi_GetNetworkId_r(b, tctx, &r),
1953 "GetNetworkId failed");
1954 torture_assert_werr_ok(tctx,
1955 r.out.result,
1956 "GetNetworkId failed");
1958 return true;
1961 static bool test_GetNetworkId(struct torture_context *tctx,
1962 void *data)
1964 struct torture_clusapi_context *t =
1965 talloc_get_type_abort(data, struct torture_clusapi_context);
1966 struct policy_handle hNetwork;
1967 bool ret = true;
1969 if (!test_OpenNetwork_int(tctx, t->p, "Cluster Network 1", &hNetwork)) {
1970 return false;
1973 ret = test_GetNetworkId_int(tctx, t->p, &hNetwork);
1975 test_CloseNetwork_int(tctx, t->p, &hNetwork);
1977 return ret;
1980 static bool test_one_network(struct torture_context *tctx,
1981 struct dcerpc_pipe *p,
1982 const char *network_name)
1984 struct policy_handle hNetwork;
1986 torture_assert(tctx,
1987 test_OpenNetwork_int(tctx, p, network_name, &hNetwork),
1988 "failed to open network");
1989 test_CloseNetwork_int(tctx, p, &hNetwork);
1991 torture_assert(tctx,
1992 test_OpenNetworkEx_int(tctx, p, network_name, &hNetwork),
1993 "failed to openex network");
1995 torture_assert(tctx,
1996 test_GetNetworkId_int(tctx, p, &hNetwork),
1997 "failed to query network id");
1998 torture_assert(tctx,
1999 test_GetNetworkState_int(tctx, p, &hNetwork),
2000 "failed to query network id");
2002 test_CloseNetwork_int(tctx, p, &hNetwork);
2004 return true;
2007 static bool test_all_networks(struct torture_context *tctx,
2008 void *data)
2010 struct torture_clusapi_context *t =
2011 talloc_get_type_abort(data, struct torture_clusapi_context);
2012 struct dcerpc_binding_handle *b = t->p->binding_handle;
2013 struct clusapi_CreateEnum r;
2014 uint32_t dwType = CLUSTER_ENUM_NETWORK;
2015 struct ENUM_LIST *ReturnEnum;
2016 WERROR rpc_status;
2017 int i;
2019 r.in.dwType = dwType;
2020 r.out.ReturnEnum = &ReturnEnum;
2021 r.out.rpc_status = &rpc_status;
2023 torture_assert_ntstatus_ok(tctx,
2024 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2025 "CreateEnum failed");
2026 torture_assert_werr_ok(tctx,
2027 r.out.result,
2028 "CreateEnum failed");
2030 for (i=0; i < ReturnEnum->EntryCount; i++) {
2032 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2034 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETWORK, "type mismatch");
2036 torture_assert(tctx,
2037 test_one_network(tctx, t->p, e.Name),
2038 "failed to test one network");
2041 return true;
2044 static bool test_OpenNetInterface_int(struct torture_context *tctx,
2045 struct dcerpc_pipe *p,
2046 const char *lpszNetInterfaceName,
2047 struct policy_handle *hNetInterface)
2049 struct dcerpc_binding_handle *b = p->binding_handle;
2050 struct clusapi_OpenNetInterface r;
2051 WERROR Status;
2052 WERROR rpc_status;
2054 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2055 r.out.rpc_status = &rpc_status;
2056 r.out.Status = &Status;
2057 r.out.hNetInterface = hNetInterface;
2059 torture_assert_ntstatus_ok(tctx,
2060 dcerpc_clusapi_OpenNetInterface_r(b, tctx, &r),
2061 "OpenNetInterface failed");
2062 torture_assert_werr_ok(tctx,
2063 *r.out.Status,
2064 "OpenNetInterface failed");
2066 return true;
2069 static bool test_OpenNetInterfaceEx_int(struct torture_context *tctx,
2070 struct dcerpc_pipe *p,
2071 const char *lpszNetInterfaceName,
2072 struct policy_handle *hNetInterface)
2074 struct dcerpc_binding_handle *b = p->binding_handle;
2075 struct clusapi_OpenNetInterfaceEx r;
2076 uint32_t lpdwGrantedAccess;
2077 WERROR Status;
2078 WERROR rpc_status;
2080 r.in.lpszNetInterfaceName = lpszNetInterfaceName;
2081 r.in.dwDesiredAccess = SEC_FLAG_MAXIMUM_ALLOWED;
2082 r.out.lpdwGrantedAccess = &lpdwGrantedAccess;
2083 r.out.rpc_status = &rpc_status;
2084 r.out.Status = &Status;
2085 r.out.hNetInterface = hNetInterface;
2087 torture_assert_ntstatus_ok(tctx,
2088 dcerpc_clusapi_OpenNetInterfaceEx_r(b, tctx, &r),
2089 "OpenNetInterfaceEx failed");
2090 torture_assert_werr_ok(tctx,
2091 *r.out.Status,
2092 "OpenNetInterfaceEx failed");
2094 return true;
2097 static bool test_CloseNetInterface_int(struct torture_context *tctx,
2098 struct dcerpc_pipe *p,
2099 struct policy_handle *NetInterface)
2101 struct dcerpc_binding_handle *b = p->binding_handle;
2102 struct clusapi_CloseNetInterface r;
2104 r.in.NetInterface = NetInterface;
2105 r.out.NetInterface = NetInterface;
2107 torture_assert_ntstatus_ok(tctx,
2108 dcerpc_clusapi_CloseNetInterface_r(b, tctx, &r),
2109 "CloseNetInterface failed");
2110 torture_assert_werr_ok(tctx,
2111 r.out.result,
2112 "CloseNetInterface failed");
2113 torture_assert(tctx,
2114 ndr_policy_handle_empty(NetInterface),
2115 "policy_handle non empty after CloseNetInterface");
2117 return true;
2120 static bool test_OpenNetInterface(struct torture_context *tctx,
2121 void *data)
2123 struct torture_clusapi_context *t =
2124 talloc_get_type_abort(data, struct torture_clusapi_context);
2125 struct policy_handle hNetInterface;
2127 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2128 return false;
2131 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2133 return true;
2136 static bool test_OpenNetInterfaceEx(struct torture_context *tctx,
2137 void *data)
2139 struct torture_clusapi_context *t =
2140 talloc_get_type_abort(data, struct torture_clusapi_context);
2141 struct policy_handle hNetInterface;
2143 if (!test_OpenNetInterfaceEx_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2144 return false;
2147 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2149 return true;
2152 static bool test_CloseNetInterface(struct torture_context *tctx,
2153 void *data)
2155 struct torture_clusapi_context *t =
2156 talloc_get_type_abort(data, struct torture_clusapi_context);
2157 struct policy_handle hNetInterface;
2159 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2160 return false;
2163 return test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2166 static bool test_GetNetInterfaceState_int(struct torture_context *tctx,
2167 struct dcerpc_pipe *p,
2168 struct policy_handle *hNetInterface)
2170 struct dcerpc_binding_handle *b = p->binding_handle;
2171 struct clusapi_GetNetInterfaceState r;
2172 enum clusapi_ClusterNetInterfaceState State;
2173 WERROR rpc_status;
2175 r.in.hNetInterface = *hNetInterface;
2176 r.out.State = &State;
2177 r.out.rpc_status = &rpc_status;
2179 torture_assert_ntstatus_ok(tctx,
2180 dcerpc_clusapi_GetNetInterfaceState_r(b, tctx, &r),
2181 "GetNetInterfaceState failed");
2182 torture_assert_werr_ok(tctx,
2183 r.out.result,
2184 "GetNetInterfaceState failed");
2186 return true;
2189 static bool test_GetNetInterfaceState(struct torture_context *tctx,
2190 void *data)
2192 struct torture_clusapi_context *t =
2193 talloc_get_type_abort(data, struct torture_clusapi_context);
2194 struct policy_handle hNetInterface;
2195 bool ret = true;
2197 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2198 return false;
2201 ret = test_GetNetInterfaceState_int(tctx, t->p, &hNetInterface);
2203 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2205 return ret;
2208 static bool test_GetNetInterfaceId_int(struct torture_context *tctx,
2209 struct dcerpc_pipe *p,
2210 struct policy_handle *hNetInterface)
2212 struct dcerpc_binding_handle *b = p->binding_handle;
2213 struct clusapi_GetNetInterfaceId r;
2214 const char *pGuid;
2215 WERROR rpc_status;
2217 r.in.hNetInterface = *hNetInterface;
2218 r.out.pGuid = &pGuid;
2219 r.out.rpc_status = &rpc_status;
2221 torture_assert_ntstatus_ok(tctx,
2222 dcerpc_clusapi_GetNetInterfaceId_r(b, tctx, &r),
2223 "GetNetInterfaceId failed");
2224 torture_assert_werr_ok(tctx,
2225 r.out.result,
2226 "GetNetInterfaceId failed");
2228 return true;
2231 static bool test_GetNetInterfaceId(struct torture_context *tctx,
2232 void *data)
2234 struct torture_clusapi_context *t =
2235 talloc_get_type_abort(data, struct torture_clusapi_context);
2236 struct policy_handle hNetInterface;
2237 bool ret = true;
2239 if (!test_OpenNetInterface_int(tctx, t->p, "node1 - Ethernet", &hNetInterface)) {
2240 return false;
2243 ret = test_GetNetInterfaceId_int(tctx, t->p, &hNetInterface);
2245 test_CloseNetInterface_int(tctx, t->p, &hNetInterface);
2247 return ret;
2250 static bool test_one_netinterface(struct torture_context *tctx,
2251 struct dcerpc_pipe *p,
2252 const char *netinterface_name)
2254 struct policy_handle hNetInterface;
2256 torture_assert(tctx,
2257 test_OpenNetInterface_int(tctx, p, netinterface_name, &hNetInterface),
2258 "failed to open netinterface");
2259 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2261 torture_assert(tctx,
2262 test_OpenNetInterfaceEx_int(tctx, p, netinterface_name, &hNetInterface),
2263 "failed to openex netinterface");
2265 torture_assert(tctx,
2266 test_GetNetInterfaceId_int(tctx, p, &hNetInterface),
2267 "failed to query netinterface id");
2268 torture_assert(tctx,
2269 test_GetNetInterfaceState_int(tctx, p, &hNetInterface),
2270 "failed to query netinterface id");
2272 test_CloseNetInterface_int(tctx, p, &hNetInterface);
2274 return true;
2277 static bool test_all_netinterfaces(struct torture_context *tctx,
2278 void *data)
2280 struct torture_clusapi_context *t =
2281 talloc_get_type_abort(data, struct torture_clusapi_context);
2282 struct dcerpc_binding_handle *b = t->p->binding_handle;
2283 struct clusapi_CreateEnum r;
2284 uint32_t dwType = CLUSTER_ENUM_NETINTERFACE;
2285 struct ENUM_LIST *ReturnEnum;
2286 WERROR rpc_status;
2287 int i;
2289 r.in.dwType = dwType;
2290 r.out.ReturnEnum = &ReturnEnum;
2291 r.out.rpc_status = &rpc_status;
2293 torture_assert_ntstatus_ok(tctx,
2294 dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
2295 "CreateEnum failed");
2296 torture_assert_werr_ok(tctx,
2297 r.out.result,
2298 "CreateEnum failed");
2300 for (i=0; i < ReturnEnum->EntryCount; i++) {
2302 struct ENUM_ENTRY e = ReturnEnum->Entry[i];
2304 torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_NETINTERFACE, "type mismatch");
2306 torture_assert(tctx,
2307 test_one_netinterface(tctx, t->p, e.Name),
2308 "failed to test one netinterface");
2311 return true;
2314 static bool test_CloseKey_int(struct torture_context *tctx,
2315 struct dcerpc_pipe *p,
2316 struct policy_handle *pKey)
2318 struct dcerpc_binding_handle *b = p->binding_handle;
2319 struct clusapi_CloseKey r;
2321 r.in.pKey = pKey;
2322 r.out.pKey = pKey;
2324 torture_assert_ntstatus_ok(tctx,
2325 dcerpc_clusapi_CloseKey_r(b, tctx, &r),
2326 "CloseKey failed");
2327 torture_assert_werr_ok(tctx,
2328 r.out.result,
2329 "CloseKey failed");
2330 torture_assert(tctx,
2331 ndr_policy_handle_empty(pKey),
2332 "policy_handle non empty after CloseKey");
2334 return true;
2337 static bool test_GetRootKey_int(struct torture_context *tctx,
2338 struct dcerpc_pipe *p,
2339 struct policy_handle *phKey)
2341 struct dcerpc_binding_handle *b = p->binding_handle;
2342 struct clusapi_GetRootKey r;
2343 WERROR Status;
2344 WERROR rpc_status;
2346 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2347 r.out.Status = &Status;
2348 r.out.rpc_status = &rpc_status;
2349 r.out.phKey = phKey;
2351 torture_assert_ntstatus_ok(tctx,
2352 dcerpc_clusapi_GetRootKey_r(b, tctx, &r),
2353 "GetRootKey failed");
2354 torture_assert_werr_ok(tctx,
2355 *r.out.Status,
2356 "GetRootKey failed");
2358 return true;
2361 static bool test_EnumKey_int(struct torture_context *tctx,
2362 struct dcerpc_pipe *p,
2363 struct policy_handle *hKey)
2365 struct dcerpc_binding_handle *b = p->binding_handle;
2366 struct clusapi_EnumKey r;
2367 const char *KeyName;
2368 NTTIME lpftLastWriteTime;
2369 WERROR rpc_status;
2371 r.in.hKey = *hKey;
2372 r.in.dwIndex = 0;
2373 r.out.KeyName = &KeyName;
2374 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2375 r.out.rpc_status = &rpc_status;
2377 torture_assert_ntstatus_ok(tctx,
2378 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
2379 "EnumKey failed");
2380 torture_assert_werr_ok(tctx,
2381 r.out.result,
2382 "EnumKey failed");
2384 return true;
2387 static bool test_OpenKey_int(struct torture_context *tctx,
2388 struct dcerpc_pipe *p,
2389 struct policy_handle *hKey,
2390 const char *lpSubKey,
2391 struct policy_handle *phKey)
2393 struct dcerpc_binding_handle *b = p->binding_handle;
2394 struct clusapi_OpenKey r;
2395 WERROR Status;
2396 WERROR rpc_status;
2398 r.in.hKey = *hKey;
2399 r.in.lpSubKey = lpSubKey;
2400 r.in.samDesired = SEC_FLAG_MAXIMUM_ALLOWED;
2401 r.out.Status = &Status;
2402 r.out.rpc_status = &rpc_status;
2403 r.out.phKey = phKey;
2405 torture_assert_ntstatus_ok(tctx,
2406 dcerpc_clusapi_OpenKey_r(b, tctx, &r),
2407 "OpenKey failed");
2408 torture_assert_werr_ok(tctx,
2409 *r.out.Status,
2410 "OpenKey failed");
2412 return true;
2415 static bool test_EnumValue_int(struct torture_context *tctx,
2416 struct dcerpc_pipe *p,
2417 struct policy_handle *hKey)
2419 struct dcerpc_binding_handle *b = p->binding_handle;
2420 struct clusapi_EnumValue r;
2421 const char *lpValueName;
2422 uint32_t lpType;
2423 uint32_t TotalSize;
2424 WERROR rpc_status;
2425 int i = 0;
2427 do {
2428 uint32_t lpcbData = 1024;
2430 r.in.hKey = *hKey;
2431 r.in.dwIndex = i++;
2432 r.in.lpcbData = &lpcbData;
2433 r.out.lpValueName = &lpValueName;
2434 r.out.lpType = &lpType;
2435 r.out.lpData = talloc_array(tctx, uint8_t, lpcbData);
2436 r.out.TotalSize = &TotalSize;
2437 r.out.rpc_status = &rpc_status;
2438 r.out.lpcbData = &lpcbData;
2440 torture_assert_ntstatus_ok(tctx,
2441 dcerpc_clusapi_EnumValue_r(b, tctx, &r),
2442 "EnumValue failed");
2444 } while (W_ERROR_IS_OK(r.out.result));
2446 torture_assert_werr_equal(tctx,
2447 r.out.result,
2448 WERR_NO_MORE_ITEMS,
2449 "EnumValue failed");
2451 return true;
2454 static bool test_QueryInfoKey_int(struct torture_context *tctx,
2455 struct dcerpc_pipe *p,
2456 struct policy_handle *hKey)
2458 struct dcerpc_binding_handle *b = p->binding_handle;
2459 struct clusapi_QueryInfoKey r;
2460 uint32_t lpcSubKeys;
2461 uint32_t lpcbMaxSubKeyLen;
2462 uint32_t lpcValues;
2463 uint32_t lpcbMaxValueNameLen;
2464 uint32_t lpcbMaxValueLen;
2465 uint32_t lpcbSecurityDescriptor;
2466 NTTIME lpftLastWriteTime;
2467 WERROR rpc_status;
2469 r.in.hKey = *hKey;
2470 r.out.lpcSubKeys = &lpcSubKeys;
2471 r.out.lpcbMaxSubKeyLen = &lpcbMaxSubKeyLen;
2472 r.out.lpcValues = &lpcValues;
2473 r.out.lpcbMaxValueNameLen = &lpcbMaxValueNameLen;
2474 r.out.lpcbMaxValueLen = &lpcbMaxValueLen;
2475 r.out.lpcbSecurityDescriptor = &lpcbSecurityDescriptor;
2476 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2477 r.out.rpc_status = &rpc_status;
2479 torture_assert_ntstatus_ok(tctx,
2480 dcerpc_clusapi_QueryInfoKey_r(b, tctx, &r),
2481 "QueryInfoKey failed");
2482 torture_assert_werr_ok(tctx,
2483 r.out.result,
2484 "QueryInfoKey failed");
2486 return true;
2489 static bool test_GetKeySecurity_int(struct torture_context *tctx,
2490 struct dcerpc_pipe *p,
2491 struct policy_handle *hKey)
2493 struct dcerpc_binding_handle *b = p->binding_handle;
2494 struct clusapi_GetKeySecurity r;
2495 uint32_t SecurityInformation = SECINFO_DACL | SECINFO_OWNER | SECINFO_GROUP;
2496 struct RPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor;
2497 WERROR rpc_status;
2499 ZERO_STRUCT(pRpcSecurityDescriptor);
2501 r.in.hKey = *hKey;
2502 r.in.SecurityInformation = SecurityInformation;
2503 r.in.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
2504 r.out.rpc_status = &rpc_status;
2505 r.out.pRpcSecurityDescriptor = &pRpcSecurityDescriptor;
2507 torture_assert_ntstatus_ok(tctx,
2508 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
2509 "GetKeySecurity failed");
2511 if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
2512 pRpcSecurityDescriptor.lpSecurityDescriptor = talloc_array(tctx,
2513 uint8_t, pRpcSecurityDescriptor.cbInSecurityDescriptor);
2515 torture_assert_ntstatus_ok(tctx,
2516 dcerpc_clusapi_GetKeySecurity_r(b, tctx, &r),
2517 "GetKeySecurity failed");
2520 torture_assert_werr_ok(tctx,
2521 r.out.result,
2522 "GetKeySecurity failed");
2524 return true;
2527 static bool test_GetRootKey(struct torture_context *tctx,
2528 void *data)
2530 struct torture_clusapi_context *t =
2531 talloc_get_type_abort(data, struct torture_clusapi_context);
2532 struct policy_handle hKey;
2534 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2535 return false;
2538 test_CloseKey_int(tctx, t->p, &hKey);
2540 return true;
2543 static bool test_CloseKey(struct torture_context *tctx,
2544 void *data)
2546 struct torture_clusapi_context *t =
2547 talloc_get_type_abort(data, struct torture_clusapi_context);
2548 struct policy_handle hKey;
2550 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2551 return false;
2554 return test_CloseKey_int(tctx, t->p, &hKey);
2557 static bool test_EnumKey(struct torture_context *tctx,
2558 void *data)
2560 struct torture_clusapi_context *t =
2561 talloc_get_type_abort(data, struct torture_clusapi_context);
2562 struct policy_handle hKey;
2563 bool ret = true;
2565 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2566 return false;
2569 ret = test_EnumKey_int(tctx, t->p, &hKey);
2571 test_CloseKey_int(tctx, t->p, &hKey);
2573 return ret;
2576 static bool test_one_key(struct torture_context *tctx,
2577 struct dcerpc_pipe *p,
2578 struct policy_handle *hKey,
2579 const char *KeyName)
2581 struct policy_handle phKey;
2583 torture_assert(tctx,
2584 test_OpenKey_int(tctx, p, hKey, KeyName, &phKey),
2585 "failed to open key");
2587 torture_assert(tctx,
2588 test_QueryInfoKey_int(tctx, p, &phKey),
2589 "failed to enum values");
2590 torture_assert(tctx,
2591 test_GetKeySecurity_int(tctx, p, &phKey),
2592 "failed to get key security");
2594 torture_assert(tctx,
2595 test_EnumValue_int(tctx, p, &phKey),
2596 "failed to enum values");
2598 torture_assert(tctx,
2599 test_CloseKey_int(tctx, p, &phKey),
2600 "failed to close key");
2602 return true;
2605 static bool test_all_keys(struct torture_context *tctx,
2606 void *data)
2608 struct torture_clusapi_context *t =
2609 talloc_get_type_abort(data, struct torture_clusapi_context);
2610 struct dcerpc_binding_handle *b = t->p->binding_handle;
2611 struct policy_handle hKey;
2612 struct clusapi_EnumKey r;
2613 const char *KeyName;
2614 NTTIME lpftLastWriteTime;
2615 WERROR rpc_status;
2616 int i = 0;
2618 if (!test_GetRootKey_int(tctx, t->p, &hKey)) {
2619 return false;
2622 do {
2623 r.in.hKey = hKey;
2624 r.in.dwIndex = i++;
2625 r.out.KeyName = &KeyName;
2626 r.out.lpftLastWriteTime = &lpftLastWriteTime;
2627 r.out.rpc_status = &rpc_status;
2629 torture_assert_ntstatus_ok(tctx,
2630 dcerpc_clusapi_EnumKey_r(b, tctx, &r),
2631 "EnumKey failed");
2633 if (W_ERROR_IS_OK(r.out.result)) {
2634 torture_assert(tctx,
2635 test_one_key(tctx, t->p, &hKey, KeyName),
2636 "failed to test one key");
2639 } while (W_ERROR_IS_OK(r.out.result));
2641 torture_assert_werr_equal(tctx,
2642 r.out.result,
2643 WERR_NO_MORE_ITEMS,
2644 "EnumKey failed");
2646 test_CloseKey_int(tctx, t->p, &hKey);
2648 return true;
2651 static bool torture_rpc_clusapi_setup_common(struct torture_context *tctx,
2652 struct torture_clusapi_context *t)
2654 struct dcerpc_binding_handle *b;
2656 torture_assert_ntstatus_ok(tctx,
2657 torture_rpc_connection(tctx, &t->p, &ndr_table_clusapi),
2658 "Error connecting to server");
2661 struct clusapi_GetClusterName r;
2663 b = t->p->binding_handle;
2665 r.out.ClusterName = &t->ClusterName;
2666 r.out.NodeName = &t->NodeName;
2668 torture_assert_ntstatus_ok(tctx,
2669 dcerpc_clusapi_GetClusterName_r(b, tctx, &r),
2670 "GetClusterName failed");
2671 torture_assert_werr_ok(tctx,
2672 r.out.result,
2673 "GetClusterName failed");
2676 return true;
2679 static bool torture_rpc_clusapi_setup(struct torture_context *tctx,
2680 void **data)
2682 struct torture_clusapi_context *t;
2684 *data = t = talloc_zero(tctx, struct torture_clusapi_context);
2686 return torture_rpc_clusapi_setup_common(tctx, t);
2689 static bool torture_rpc_clusapi_teardown(struct torture_context *tctx,
2690 void *data)
2692 talloc_free(data);
2694 return true;
2697 void torture_tcase_cluster(struct torture_tcase *tcase)
2699 torture_tcase_add_simple_test(tcase, "OpenCluster",
2700 test_OpenCluster);
2701 torture_tcase_add_simple_test(tcase, "OpenClusterEx",
2702 test_OpenClusterEx);
2703 torture_tcase_add_simple_test(tcase, "CloseCluster",
2704 test_CloseCluster);
2705 torture_tcase_add_simple_test(tcase, "SetClusterName",
2706 test_SetClusterName);
2707 torture_tcase_add_simple_test(tcase, "GetClusterName",
2708 test_GetClusterName);
2709 torture_tcase_add_simple_test(tcase, "GetClusterVersion",
2710 test_GetClusterVersion);
2711 torture_tcase_add_simple_test(tcase, "CreateEnum",
2712 test_CreateEnum);
2713 torture_tcase_add_simple_test(tcase, "GetClusterVersion2",
2714 test_GetClusterVersion2);
2715 torture_tcase_add_simple_test(tcase, "BackupClusterDatabase",
2716 test_BackupClusterDatabase);
2717 torture_tcase_add_simple_test(tcase, "SetServiceAccountPassword",
2718 test_SetServiceAccountPassword);
2721 void torture_tcase_resource(struct torture_tcase *tcase)
2723 struct torture_test *test;
2725 torture_tcase_add_simple_test(tcase, "GetQuorumResource",
2726 test_GetQuorumResource);
2727 torture_tcase_add_simple_test(tcase, "SetQuorumResource",
2728 test_SetQuorumResource);
2729 torture_tcase_add_simple_test(tcase, "OpenResource",
2730 test_OpenResource);
2731 torture_tcase_add_simple_test(tcase, "OpenResourceEx",
2732 test_OpenResourceEx);
2733 torture_tcase_add_simple_test(tcase, "CloseResource",
2734 test_CloseResource);
2735 torture_tcase_add_simple_test(tcase, "CreateResource",
2736 test_CreateResource);
2737 torture_tcase_add_simple_test(tcase, "DeleteResource",
2738 test_DeleteResource);
2739 torture_tcase_add_simple_test(tcase, "SetResourceName",
2740 test_SetResourceName);
2741 torture_tcase_add_simple_test(tcase, "GetResourceState",
2742 test_GetResourceState);
2743 torture_tcase_add_simple_test(tcase, "GetResourceId",
2744 test_GetResourceId);
2745 torture_tcase_add_simple_test(tcase, "GetResourceType",
2746 test_GetResourceType);
2747 torture_tcase_add_simple_test(tcase, "CreateResEnum",
2748 test_CreateResEnum);
2749 test = torture_tcase_add_simple_test(tcase, "FailResource",
2750 test_FailResource);
2751 test->dangerous = true;
2752 torture_tcase_add_simple_test(tcase, "OnlineResource",
2753 test_OnlineResource);
2754 test = torture_tcase_add_simple_test(tcase, "OfflineResource",
2755 test_OfflineResource);
2756 test->dangerous = true;
2757 torture_tcase_add_simple_test(tcase, "all_resources",
2758 test_all_resources);
2761 void torture_tcase_node(struct torture_tcase *tcase)
2763 struct torture_test *test;
2765 torture_tcase_add_simple_test(tcase, "OpenNode",
2766 test_OpenNode);
2767 torture_tcase_add_simple_test(tcase, "OpenNodeEx",
2768 test_OpenNodeEx);
2769 torture_tcase_add_simple_test(tcase, "CloseNode",
2770 test_CloseNode);
2771 torture_tcase_add_simple_test(tcase, "GetNodeState",
2772 test_GetNodeState);
2773 torture_tcase_add_simple_test(tcase, "GetNodeId",
2774 test_GetNodeId);
2775 test = torture_tcase_add_simple_test(tcase, "PauseNode",
2776 test_PauseNode);
2777 test->dangerous = true;
2778 torture_tcase_add_simple_test(tcase, "ResumeNode",
2779 test_ResumeNode);
2780 test = torture_tcase_add_simple_test(tcase, "EvictNode",
2781 test_EvictNode);
2782 test->dangerous = true;
2783 torture_tcase_add_simple_test(tcase, "all_nodes",
2784 test_all_nodes);
2787 void torture_tcase_group(struct torture_tcase *tcase)
2789 struct torture_test *test;
2791 torture_tcase_add_simple_test(tcase, "OpenGroup",
2792 test_OpenGroup);
2793 torture_tcase_add_simple_test(tcase, "OpenGroupEx",
2794 test_OpenGroupEx);
2795 torture_tcase_add_simple_test(tcase, "CloseGroup",
2796 test_CloseGroup);
2797 torture_tcase_add_simple_test(tcase, "GetGroupState",
2798 test_GetGroupState);
2799 torture_tcase_add_simple_test(tcase, "GetGroupId",
2800 test_GetGroupId);
2801 torture_tcase_add_simple_test(tcase, "OnlineGroup",
2802 test_OnlineGroup);
2803 test = torture_tcase_add_simple_test(tcase, "OfflineGroup",
2804 test_OfflineGroup);
2805 test->dangerous = true;
2806 torture_tcase_add_simple_test(tcase, "all_groups",
2807 test_all_groups);
2810 void torture_tcase_network(struct torture_tcase *tcase)
2812 torture_tcase_add_simple_test(tcase, "OpenNetwork",
2813 test_OpenNetwork);
2814 torture_tcase_add_simple_test(tcase, "OpenNetworkEx",
2815 test_OpenNetworkEx);
2816 torture_tcase_add_simple_test(tcase, "CloseNetwork",
2817 test_CloseNetwork);
2818 torture_tcase_add_simple_test(tcase, "GetNetworkState",
2819 test_GetNetworkState);
2820 torture_tcase_add_simple_test(tcase, "GetNetworkId",
2821 test_GetNetworkId);
2822 torture_tcase_add_simple_test(tcase, "all_networks",
2823 test_all_networks);
2826 void torture_tcase_netinterface(struct torture_tcase *tcase)
2828 torture_tcase_add_simple_test(tcase, "OpenNetInterface",
2829 test_OpenNetInterface);
2830 torture_tcase_add_simple_test(tcase, "OpenNetInterfaceEx",
2831 test_OpenNetInterfaceEx);
2832 torture_tcase_add_simple_test(tcase, "CloseNetInterface",
2833 test_CloseNetInterface);
2834 torture_tcase_add_simple_test(tcase, "GetNetInterfaceState",
2835 test_GetNetInterfaceState);
2836 torture_tcase_add_simple_test(tcase, "GetNetInterfaceId",
2837 test_GetNetInterfaceId);
2838 torture_tcase_add_simple_test(tcase, "all_netinterfaces",
2839 test_all_netinterfaces);
2842 void torture_tcase_registry(struct torture_tcase *tcase)
2844 torture_tcase_add_simple_test(tcase, "GetRootKey",
2845 test_GetRootKey);
2846 torture_tcase_add_simple_test(tcase, "CloseKey",
2847 test_CloseKey);
2848 torture_tcase_add_simple_test(tcase, "EnumKey",
2849 test_EnumKey);
2850 torture_tcase_add_simple_test(tcase, "all_keys",
2851 test_all_keys);
2854 struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
2856 struct torture_tcase *tcase;
2857 struct torture_suite *suite = torture_suite_create(mem_ctx, "clusapi");
2859 tcase = torture_suite_add_tcase(suite, "cluster");
2861 torture_tcase_set_fixture(tcase,
2862 torture_rpc_clusapi_setup,
2863 torture_rpc_clusapi_teardown);
2865 torture_tcase_cluster(tcase);
2867 tcase = torture_suite_add_tcase(suite, "resource");
2869 torture_tcase_set_fixture(tcase,
2870 torture_rpc_clusapi_setup,
2871 torture_rpc_clusapi_teardown);
2873 torture_tcase_resource(tcase);
2875 tcase = torture_suite_add_tcase(suite, "node");
2877 torture_tcase_set_fixture(tcase,
2878 torture_rpc_clusapi_setup,
2879 torture_rpc_clusapi_teardown);
2881 torture_tcase_node(tcase);
2883 tcase = torture_suite_add_tcase(suite, "group");
2885 torture_tcase_set_fixture(tcase,
2886 torture_rpc_clusapi_setup,
2887 torture_rpc_clusapi_teardown);
2889 torture_tcase_group(tcase);
2891 tcase = torture_suite_add_tcase(suite, "network");
2893 torture_tcase_set_fixture(tcase,
2894 torture_rpc_clusapi_setup,
2895 torture_rpc_clusapi_teardown);
2897 torture_tcase_network(tcase);
2899 tcase = torture_suite_add_tcase(suite, "netinterface");
2901 torture_tcase_set_fixture(tcase,
2902 torture_rpc_clusapi_setup,
2903 torture_rpc_clusapi_teardown);
2905 torture_tcase_netinterface(tcase);
2907 tcase = torture_suite_add_tcase(suite, "registry");
2909 torture_tcase_set_fixture(tcase,
2910 torture_rpc_clusapi_setup,
2911 torture_rpc_clusapi_teardown);
2913 torture_tcase_registry(tcase);
2915 return suite;