@@ -41,7 +41,7 @@ Y_UNIT_TEST_SUITE(TMaintenanceApiTest) {
4141 MakeLockAction (env.GetNodeId (0 ), TDuration::Minutes (10 ))
4242 )
4343 );
44-
44+
4545 auto response = env.CheckMaintenanceTaskCreate (" task-2" , Ydb::StatusIds::SUCCESS,
4646 MakeActionGroup (
4747 MakeLockAction (env.GetNodeId (1 ), TDuration::Minutes (10 )),
@@ -116,6 +116,94 @@ Y_UNIT_TEST_SUITE(TMaintenanceApiTest) {
116116 const auto &a = response.action_group_states (0 ).action_states (0 );
117117 UNIT_ASSERT_VALUES_EQUAL (a.status (), ActionState::ACTION_STATUS_PERFORMED);
118118 }
119+
120+ Y_UNIT_TEST (RequestReplaceDevicePDisk) {
121+ std::function<void (NCms::TPDiskID&, Ydb::Maintenance::ActionScope_PDisk*)> serializeIdFn = [](NCms::TPDiskID& pdiskId, Ydb::Maintenance::ActionScope_PDisk* pdisk) {
122+ auto * id = pdisk->mutable_pdisk_id ();
123+ id->set_node_id (pdiskId.NodeId );
124+ id->set_pdisk_id (pdiskId.DiskId );
125+ };
126+
127+ std::function<void (const Ydb::Maintenance::ActionScope_PDisk&, NCms::TPDiskID&)> deserializeIdFn = [](const Ydb::Maintenance::ActionScope_PDisk& pdisk, NCms::TPDiskID& pdiskId) {
128+ auto & id = pdisk.Getpdisk_id ();
129+ pdiskId.NodeId = id.node_id ();
130+ pdiskId.DiskId = id.pdisk_id ();
131+ };
132+
133+ std::function<void (NCms::TPDiskID&, Ydb::Maintenance::ActionScope_PDisk*)> serializeLocationFn = [](NCms::TPDiskID& pdiskId, Ydb::Maintenance::ActionScope_PDisk* pdisk) {
134+ auto * location = pdisk->mutable_pdisk_location ();
135+ location->set_host (" ::1" ); // All nodes live on this host.
136+ location->set_path (" /" + std::to_string (pdiskId.NodeId ) + " /pdisk-" + std::to_string (pdiskId.DiskId ) + " .data" );
137+ };
138+
139+ std::function<void (const Ydb::Maintenance::ActionScope_PDisk&, NCms::TPDiskID&)> deserializeLocationFn = [](const Ydb::Maintenance::ActionScope_PDisk& pdisk, NCms::TPDiskID& pdiskId) {
140+ auto & location = pdisk.Getpdisk_location ();
141+ sscanf (location.path ().c_str (), " /%d/pdisk-%d.data" , &pdiskId.NodeId , &pdiskId.DiskId );
142+ };
143+
144+ std::vector<std::function<void (NCms::TPDiskID&, Ydb::Maintenance::ActionScope_PDisk*)>> serializeFns = {serializeIdFn, serializeLocationFn};
145+
146+ std::vector<std::function<void (const Ydb::Maintenance::ActionScope_PDisk&, NCms::TPDiskID&)>> deserializeFns = {deserializeIdFn, deserializeLocationFn};
147+
148+ for (size_t i = 0 ; i < serializeFns.size (); i++) {
149+ auto serializeFn = serializeFns[i];
150+ auto deserializeFn = deserializeFns[i];
151+
152+ TTestEnvOpts envOpts (8 );
153+ envOpts.WithSentinel ();
154+
155+ TCmsTestEnv env (envOpts);
156+
157+ auto req = std::make_unique<NKikimr::NCms::TEvCms::TEvCreateMaintenanceTaskRequest>();
158+
159+ Ydb::Maintenance::CreateMaintenanceTaskRequest* rec = req->Record .MutableRequest ();
160+
161+ req->Record .SetUserSID (" user" );
162+
163+ auto * options = rec->mutable_task_options ();
164+ options->set_availability_mode (::Ydb::Maintenance::AVAILABILITY_MODE_STRONG);
165+
166+ auto * actionGroup = rec->add_action_groups ();
167+ auto * action = actionGroup->Addactions ();
168+ auto * lockAction = action->mutable_lock_action ();
169+
170+ auto * scope = lockAction->mutable_scope ();
171+
172+ auto * pdisk = scope->mutable_pdisk ();
173+ NCms::TPDiskID disk = env.PDiskId (0 );
174+ serializeFn (disk, pdisk);
175+ lockAction->mutable_duration ()->set_seconds (60 );
176+
177+ env.SendToCms (req.release ());
178+
179+ auto response = env.GrabEdgeEvent <NCms::TEvCms::TEvMaintenanceTaskResponse>();
180+
181+ UNIT_ASSERT_VALUES_EQUAL (response->Record .GetStatus (), Ydb::StatusIds_StatusCode_SUCCESS);
182+
183+ {
184+ auto & result = response->Record .GetResult ();
185+ UNIT_ASSERT_VALUES_EQUAL (result.action_group_states ().size (), 1 );
186+ UNIT_ASSERT_VALUES_EQUAL (result.action_group_states (0 ).action_states ().size (), 1 );
187+ const auto &actionState = result.action_group_states (0 ).action_states (0 );
188+
189+ UNIT_ASSERT (actionState.has_action ());
190+ const auto & action = actionState.action ();
191+ UNIT_ASSERT (action.has_lock_action ());
192+ const auto & lockAction = action.lock_action ();
193+
194+ UNIT_ASSERT (lockAction.has_scope ());
195+ const auto & scope = lockAction.scope ();
196+ UNIT_ASSERT (scope.has_pdisk ());
197+ const auto & pdisk = scope.pdisk ();
198+
199+ NCms::TPDiskID resultDisk;
200+ deserializeFn (pdisk, resultDisk);
201+ UNIT_ASSERT_VALUES_EQUAL (resultDisk, disk);
202+ }
203+
204+ env.CheckRequest (" user" , " user-r-1" , false , NKikimrCms::TStatus::TStatus::WRONG_REQUEST);
205+ }
206+ }
119207}
120208
121- } // namespace NKikimr::NCmsTest
209+ } // namespace NKikimr::NCmsTest
0 commit comments