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"
26 struct torture_clusapi_context
{
27 struct dcerpc_pipe
*p
;
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
;
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
,
48 "OpenCluster failed");
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
;
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
,
72 "OpenClusterEx failed");
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
,
92 "CloseCluster failed");
95 ndr_policy_handle_empty(Cluster
),
96 "policy_handle non empty after CloseCluster");
101 static bool test_OpenCluster(struct torture_context
*tctx
,
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
)) {
112 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
117 static bool test_OpenClusterEx(struct torture_context
*tctx
,
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
)) {
128 test_CloseCluster_int(tctx
, t
->p
, &Cluster
);
133 static bool test_CloseCluster(struct torture_context
*tctx
,
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
)) {
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
,
163 "GetClusterName failed");
168 static bool test_SetClusterName(struct torture_context
*tctx
,
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
;
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
,
190 WERR_RESOURCE_PROPERTIES_STORED
,
191 "SetClusterName failed");
196 static bool test_GetClusterName(struct torture_context
*tctx
,
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
,
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
,
230 WERR_CALL_NOT_IMPLEMENTED
,
231 "GetClusterVersion failed");
236 static bool test_GetClusterVersion2(struct torture_context
*tctx
,
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
;
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
,
264 "GetClusterVersion2 failed");
269 static bool test_CreateEnum(struct torture_context
*tctx
,
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
;
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
,
289 "CreateEnum failed");
294 static bool test_GetQuorumResource(struct torture_context
*tctx
,
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
;
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
,
316 "GetQuorumResource failed");
321 static bool test_SetQuorumResource(struct torture_context
*tctx
,
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;
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
,
351 "SetQuorumResource failed");
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
;
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
,
376 "OpenResource failed");
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
;
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
,
404 "OpenResourceEx failed");
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
,
424 "CloseResource failed");
426 ndr_policy_handle_empty(hResource
),
427 "policy_handle non empty after CloseResource");
432 static bool test_OpenResource(struct torture_context
*tctx
,
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
)) {
443 test_CloseResource_int(tctx
, t
->p
, &hResource
);
448 static bool test_OpenResourceEx(struct torture_context
*tctx
,
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
)) {
459 test_CloseResource_int(tctx
, t
->p
, &hResource
);
465 static bool test_CloseResource(struct torture_context
*tctx
,
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
)) {
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";
497 struct policy_handle hGroup
;
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
,
516 "CreateResource failed");
518 test_CloseGroup_int(tctx
, p
, &hGroup
);
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
;
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
,
539 "DeleteResource failed");
544 static bool test_CreateResource(struct torture_context
*tctx
,
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
)) {
555 test_DeleteResource_int(tctx
, t
->p
, &hResource
);
560 static bool test_DeleteResource(struct torture_context
*tctx
,
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
)) {
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
;
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
,
591 "SetResourceName failed");
596 static bool test_SetResourceName(struct torture_context
*tctx
,
599 struct torture_clusapi_context
*t
=
600 talloc_get_type_abort(data
, struct torture_clusapi_context
);
601 struct policy_handle hResource
;
604 if (!test_CreateResource_int(tctx
, t
->p
, &hResource
)) {
608 ret
= test_SetResourceName_int(tctx
, t
->p
, &hResource
);
610 test_DeleteResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
637 "GetResourceState failed");
642 static bool test_GetResourceState(struct torture_context
*tctx
,
645 struct torture_clusapi_context
*t
=
646 talloc_get_type_abort(data
, struct torture_clusapi_context
);
647 struct policy_handle hResource
;
650 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
654 ret
= test_GetResourceState_int(tctx
, t
->p
, &hResource
);
656 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
679 "GetResourceId failed");
684 static bool test_GetResourceId(struct torture_context
*tctx
,
687 struct torture_clusapi_context
*t
=
688 talloc_get_type_abort(data
, struct torture_clusapi_context
);
689 struct policy_handle hResource
;
692 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
696 ret
= test_GetResourceId_int(tctx
, t
->p
, &hResource
);
698 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
721 "GetResourceType failed");
726 static bool test_GetResourceType(struct torture_context
*tctx
,
729 struct torture_clusapi_context
*t
=
730 talloc_get_type_abort(data
, struct torture_clusapi_context
);
731 struct policy_handle hResource
;
734 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
738 ret
= test_GetResourceType_int(tctx
, t
->p
, &hResource
);
740 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
761 "FailResource failed");
766 static bool test_FailResource(struct torture_context
*tctx
,
769 struct torture_clusapi_context
*t
=
770 talloc_get_type_abort(data
, struct torture_clusapi_context
);
771 struct policy_handle hResource
;
774 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
778 ret
= test_FailResource_int(tctx
, t
->p
, &hResource
);
780 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
801 "OnlineResource failed");
806 static bool test_OnlineResource(struct torture_context
*tctx
,
809 struct torture_clusapi_context
*t
=
810 talloc_get_type_abort(data
, struct torture_clusapi_context
);
811 struct policy_handle hResource
;
814 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
818 ret
= test_OnlineResource_int(tctx
, t
->p
, &hResource
);
820 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
841 "OfflineResource failed");
846 static bool test_OfflineResource(struct torture_context
*tctx
,
849 struct torture_clusapi_context
*t
=
850 talloc_get_type_abort(data
, struct torture_clusapi_context
);
851 struct policy_handle hResource
;
854 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
858 ret
= test_OfflineResource_int(tctx
, t
->p
, &hResource
);
860 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
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
,
885 "CreateResEnum failed");
890 static bool test_CreateResEnum(struct torture_context
*tctx
,
893 struct torture_clusapi_context
*t
=
894 talloc_get_type_abort(data
, struct torture_clusapi_context
);
895 struct policy_handle hResource
;
898 if (!test_OpenResource_int(tctx
, t
->p
, "Cluster Name", &hResource
)) {
902 ret
= test_CreateResEnum_int(tctx
, t
->p
, &hResource
);
904 test_CloseResource_int(tctx
, t
->p
, &hResource
);
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
;
916 test_OpenResource_int(tctx
, p
, resource_name
, &hResource
),
917 "failed to open resource");
918 test_CloseResource_int(tctx
, p
, &hResource
);
921 test_OpenResourceEx_int(tctx
, p
, resource_name
, &hResource
),
922 "failed to openex resource");
925 test_GetResourceType_int(tctx
, p
, &hResource
),
926 "failed to query resource type");
928 test_GetResourceId_int(tctx
, p
, &hResource
),
929 "failed to query resource id");
931 test_GetResourceState_int(tctx
, p
, &hResource
),
932 "failed to query resource state");
934 test_CreateResEnum_int(tctx
, p
, &hResource
),
935 "failed to query resource enum");
937 test_CloseResource_int(tctx
, p
, &hResource
);
942 static bool test_all_resources(struct torture_context
*tctx
,
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
;
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
,
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");
972 test_one_resource(tctx
, t
->p
, e
.Name
),
973 "failed to test one resource");
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
;
989 r
.in
.lpszNodeName
= lpszNodeName
;
990 r
.out
.rpc_status
= &rpc_status
;
991 r
.out
.Status
= &Status
;
994 torture_assert_ntstatus_ok(tctx
,
995 dcerpc_clusapi_OpenNode_r(b
, tctx
, &r
),
997 torture_assert_werr_ok(tctx
,
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
;
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
;
1022 torture_assert_ntstatus_ok(tctx
,
1023 dcerpc_clusapi_OpenNodeEx_r(b
, tctx
, &r
),
1024 "OpenNodeEx failed");
1025 torture_assert_werr_ok(tctx
,
1027 "OpenNodeEx failed");
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
;
1043 torture_assert_ntstatus_ok(tctx
,
1044 dcerpc_clusapi_CloseNode_r(b
, tctx
, &r
),
1045 "CloseNode failed");
1046 torture_assert_werr_ok(tctx
,
1048 "CloseNode failed");
1049 torture_assert(tctx
,
1050 ndr_policy_handle_empty(Node
),
1051 "policy_handle non empty after CloseNode");
1056 static bool test_OpenNode(struct torture_context
*tctx
,
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
)) {
1067 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1072 static bool test_OpenNodeEx(struct torture_context
*tctx
,
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
)) {
1083 test_CloseNode_int(tctx
, t
->p
, &hNode
);
1088 static bool test_CloseNode(struct torture_context
*tctx
,
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
)) {
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
;
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
,
1120 "GetNodeState failed");
1125 static bool test_GetNodeState(struct torture_context
*tctx
,
1128 struct torture_clusapi_context
*t
=
1129 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1130 struct policy_handle hNode
;
1133 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1137 ret
= test_GetNodeState_int(tctx
, t
->p
, &hNode
);
1139 test_CloseNode_int(tctx
, t
->p
, &hNode
);
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
;
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
,
1162 "GetNodeId failed");
1167 static bool test_GetNodeId(struct torture_context
*tctx
,
1170 struct torture_clusapi_context
*t
=
1171 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1172 struct policy_handle hNode
;
1175 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1179 ret
= test_GetNodeId_int(tctx
, t
->p
, &hNode
);
1181 test_CloseNode_int(tctx
, t
->p
, &hNode
);
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
;
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
,
1202 "PauseNode failed");
1207 static bool test_PauseNode(struct torture_context
*tctx
,
1210 struct torture_clusapi_context
*t
=
1211 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1212 struct policy_handle hNode
;
1215 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1219 ret
= test_PauseNode_int(tctx
, t
->p
, &hNode
);
1221 test_CloseNode_int(tctx
, t
->p
, &hNode
);
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
;
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
,
1242 WERR_CLUSTER_NODE_NOT_PAUSED
,
1243 "ResumeNode gave unexpected result");
1248 static bool test_ResumeNode(struct torture_context
*tctx
,
1251 struct torture_clusapi_context
*t
=
1252 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1253 struct policy_handle hNode
;
1256 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1260 ret
= test_ResumeNode_int(tctx
, t
->p
, &hNode
);
1262 test_CloseNode_int(tctx
, t
->p
, &hNode
);
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
;
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
,
1283 "EvictNode failed");
1288 static bool test_EvictNode(struct torture_context
*tctx
,
1291 struct torture_clusapi_context
*t
=
1292 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1293 struct policy_handle hNode
;
1296 if (!test_OpenNode_int(tctx
, t
->p
, t
->NodeName
, &hNode
)) {
1300 ret
= test_EvictNode_int(tctx
, t
->p
, &hNode
);
1302 test_CloseNode_int(tctx
, t
->p
, &hNode
);
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
);
1334 static bool test_all_nodes(struct torture_context
*tctx
,
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
;
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
,
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");
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
;
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
,
1391 "OpenGroup failed");
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
;
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
,
1419 "OpenGroupEx failed");
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
;
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
,
1439 "CloseGroup failed");
1440 torture_assert(tctx
,
1441 ndr_policy_handle_empty(Group
),
1442 "policy_handle non empty after CloseGroup");
1447 static bool test_OpenGroup(struct torture_context
*tctx
,
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
)) {
1458 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1463 static bool test_OpenGroupEx(struct torture_context
*tctx
,
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
)) {
1474 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
1479 static bool test_CloseGroup(struct torture_context
*tctx
,
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
)) {
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
;
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
,
1513 "GetGroupState failed");
1518 static bool test_GetGroupState(struct torture_context
*tctx
,
1521 struct torture_clusapi_context
*t
=
1522 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1523 struct policy_handle hGroup
;
1526 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1530 ret
= test_GetGroupState_int(tctx
, t
->p
, &hGroup
);
1532 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
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
;
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
,
1555 "GetGroupId failed");
1560 static bool test_GetGroupId(struct torture_context
*tctx
,
1563 struct torture_clusapi_context
*t
=
1564 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1565 struct policy_handle hGroup
;
1568 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1572 ret
= test_GetGroupId_int(tctx
, t
->p
, &hGroup
);
1574 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
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
;
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
,
1595 "OnlineGroup failed");
1600 static bool test_OnlineGroup(struct torture_context
*tctx
,
1603 struct torture_clusapi_context
*t
=
1604 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1605 struct policy_handle hGroup
;
1608 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1612 ret
= test_OnlineGroup_int(tctx
, t
->p
, &hGroup
);
1614 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
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
;
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
,
1635 "OfflineGroup failed");
1640 static bool test_OfflineGroup(struct torture_context
*tctx
,
1643 struct torture_clusapi_context
*t
=
1644 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1645 struct policy_handle hGroup
;
1648 if (!test_OpenGroup_int(tctx
, t
->p
, "Cluster Group", &hGroup
)) {
1652 ret
= test_OfflineGroup_int(tctx
, t
->p
, &hGroup
);
1654 test_CloseGroup_int(tctx
, t
->p
, &hGroup
);
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
);
1686 static bool test_all_groups(struct torture_context
*tctx
,
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
;
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
,
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");
1723 static bool test_BackupClusterDatabase(struct torture_context
*tctx
,
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
;
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
,
1740 WERR_CALL_NOT_IMPLEMENTED
,
1741 "BackupClusterDatabase failed");
1746 static bool test_SetServiceAccountPassword(struct torture_context
*tctx
,
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
,
1768 WERR_CALL_NOT_IMPLEMENTED
,
1769 "SetServiceAccountPassword failed");
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
;
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
,
1794 "OpenNetwork failed");
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
;
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
,
1822 "OpenNetworkEx failed");
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
,
1842 "CloseNetwork failed");
1843 torture_assert(tctx
,
1844 ndr_policy_handle_empty(Network
),
1845 "policy_handle non empty after CloseNetwork");
1850 static bool test_OpenNetwork(struct torture_context
*tctx
,
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
)) {
1861 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
1866 static bool test_OpenNetworkEx(struct torture_context
*tctx
,
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
)) {
1877 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
1882 static bool test_CloseNetwork(struct torture_context
*tctx
,
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
)) {
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
;
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
,
1914 "GetNetworkState failed");
1919 static bool test_GetNetworkState(struct torture_context
*tctx
,
1922 struct torture_clusapi_context
*t
=
1923 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1924 struct policy_handle hNetwork
;
1927 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
1931 ret
= test_GetNetworkState_int(tctx
, t
->p
, &hNetwork
);
1933 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
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
;
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
,
1956 "GetNetworkId failed");
1961 static bool test_GetNetworkId(struct torture_context
*tctx
,
1964 struct torture_clusapi_context
*t
=
1965 talloc_get_type_abort(data
, struct torture_clusapi_context
);
1966 struct policy_handle hNetwork
;
1969 if (!test_OpenNetwork_int(tctx
, t
->p
, "Cluster Network 1", &hNetwork
)) {
1973 ret
= test_GetNetworkId_int(tctx
, t
->p
, &hNetwork
);
1975 test_CloseNetwork_int(tctx
, t
->p
, &hNetwork
);
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
);
2007 static bool test_all_networks(struct torture_context
*tctx
,
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
;
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
,
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");
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
;
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
,
2064 "OpenNetInterface failed");
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
;
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
,
2092 "OpenNetInterfaceEx failed");
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
,
2112 "CloseNetInterface failed");
2113 torture_assert(tctx
,
2114 ndr_policy_handle_empty(NetInterface
),
2115 "policy_handle non empty after CloseNetInterface");
2120 static bool test_OpenNetInterface(struct torture_context
*tctx
,
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
)) {
2131 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2136 static bool test_OpenNetInterfaceEx(struct torture_context
*tctx
,
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
)) {
2147 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
2152 static bool test_CloseNetInterface(struct torture_context
*tctx
,
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
)) {
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
;
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
,
2184 "GetNetInterfaceState failed");
2189 static bool test_GetNetInterfaceState(struct torture_context
*tctx
,
2192 struct torture_clusapi_context
*t
=
2193 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2194 struct policy_handle hNetInterface
;
2197 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2201 ret
= test_GetNetInterfaceState_int(tctx
, t
->p
, &hNetInterface
);
2203 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
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
;
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
,
2226 "GetNetInterfaceId failed");
2231 static bool test_GetNetInterfaceId(struct torture_context
*tctx
,
2234 struct torture_clusapi_context
*t
=
2235 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2236 struct policy_handle hNetInterface
;
2239 if (!test_OpenNetInterface_int(tctx
, t
->p
, "node1 - Ethernet", &hNetInterface
)) {
2243 ret
= test_GetNetInterfaceId_int(tctx
, t
->p
, &hNetInterface
);
2245 test_CloseNetInterface_int(tctx
, t
->p
, &hNetInterface
);
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
);
2277 static bool test_all_netinterfaces(struct torture_context
*tctx
,
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
;
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
,
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");
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
;
2324 torture_assert_ntstatus_ok(tctx
,
2325 dcerpc_clusapi_CloseKey_r(b
, tctx
, &r
),
2327 torture_assert_werr_ok(tctx
,
2330 torture_assert(tctx
,
2331 ndr_policy_handle_empty(pKey
),
2332 "policy_handle non empty after CloseKey");
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
;
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
,
2356 "GetRootKey failed");
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
;
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
),
2380 torture_assert_werr_ok(tctx
,
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
;
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
),
2408 torture_assert_werr_ok(tctx
,
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
;
2428 uint32_t lpcbData
= 1024;
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
,
2449 "EnumValue failed");
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
;
2463 uint32_t lpcbMaxValueNameLen
;
2464 uint32_t lpcbMaxValueLen
;
2465 uint32_t lpcbSecurityDescriptor
;
2466 NTTIME lpftLastWriteTime
;
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
,
2484 "QueryInfoKey failed");
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
;
2499 ZERO_STRUCT(pRpcSecurityDescriptor
);
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
,
2522 "GetKeySecurity failed");
2527 static bool test_GetRootKey(struct torture_context
*tctx
,
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
)) {
2538 test_CloseKey_int(tctx
, t
->p
, &hKey
);
2543 static bool test_CloseKey(struct torture_context
*tctx
,
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
)) {
2554 return test_CloseKey_int(tctx
, t
->p
, &hKey
);
2557 static bool test_EnumKey(struct torture_context
*tctx
,
2560 struct torture_clusapi_context
*t
=
2561 talloc_get_type_abort(data
, struct torture_clusapi_context
);
2562 struct policy_handle hKey
;
2565 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
2569 ret
= test_EnumKey_int(tctx
, t
->p
, &hKey
);
2571 test_CloseKey_int(tctx
, t
->p
, &hKey
);
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");
2605 static bool test_all_keys(struct torture_context
*tctx
,
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
;
2618 if (!test_GetRootKey_int(tctx
, t
->p
, &hKey
)) {
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
),
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
,
2646 test_CloseKey_int(tctx
, t
->p
, &hKey
);
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
,
2673 "GetClusterName failed");
2679 static bool torture_rpc_clusapi_setup(struct torture_context
*tctx
,
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
,
2697 void torture_tcase_cluster(struct torture_tcase
*tcase
)
2699 torture_tcase_add_simple_test(tcase
, "OpenCluster",
2701 torture_tcase_add_simple_test(tcase
, "OpenClusterEx",
2702 test_OpenClusterEx
);
2703 torture_tcase_add_simple_test(tcase
, "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",
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",
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",
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",
2767 torture_tcase_add_simple_test(tcase
, "OpenNodeEx",
2769 torture_tcase_add_simple_test(tcase
, "CloseNode",
2771 torture_tcase_add_simple_test(tcase
, "GetNodeState",
2773 torture_tcase_add_simple_test(tcase
, "GetNodeId",
2775 test
= torture_tcase_add_simple_test(tcase
, "PauseNode",
2777 test
->dangerous
= true;
2778 torture_tcase_add_simple_test(tcase
, "ResumeNode",
2780 test
= torture_tcase_add_simple_test(tcase
, "EvictNode",
2782 test
->dangerous
= true;
2783 torture_tcase_add_simple_test(tcase
, "all_nodes",
2787 void torture_tcase_group(struct torture_tcase
*tcase
)
2789 struct torture_test
*test
;
2791 torture_tcase_add_simple_test(tcase
, "OpenGroup",
2793 torture_tcase_add_simple_test(tcase
, "OpenGroupEx",
2795 torture_tcase_add_simple_test(tcase
, "CloseGroup",
2797 torture_tcase_add_simple_test(tcase
, "GetGroupState",
2798 test_GetGroupState
);
2799 torture_tcase_add_simple_test(tcase
, "GetGroupId",
2801 torture_tcase_add_simple_test(tcase
, "OnlineGroup",
2803 test
= torture_tcase_add_simple_test(tcase
, "OfflineGroup",
2805 test
->dangerous
= true;
2806 torture_tcase_add_simple_test(tcase
, "all_groups",
2810 void torture_tcase_network(struct torture_tcase
*tcase
)
2812 torture_tcase_add_simple_test(tcase
, "OpenNetwork",
2814 torture_tcase_add_simple_test(tcase
, "OpenNetworkEx",
2815 test_OpenNetworkEx
);
2816 torture_tcase_add_simple_test(tcase
, "CloseNetwork",
2818 torture_tcase_add_simple_test(tcase
, "GetNetworkState",
2819 test_GetNetworkState
);
2820 torture_tcase_add_simple_test(tcase
, "GetNetworkId",
2822 torture_tcase_add_simple_test(tcase
, "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",
2846 torture_tcase_add_simple_test(tcase
, "CloseKey",
2848 torture_tcase_add_simple_test(tcase
, "EnumKey",
2850 torture_tcase_add_simple_test(tcase
, "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
);