Skip to content

Commit 1c410f5

Browse files
committed
[hyperv-hcs] replace add/remove_network_adapter with modify_cs
modify_compute_system is the generic function for doing runtime CS modification.
1 parent a196e9c commit 1c410f5

File tree

5 files changed

+76
-108
lines changed

5 files changed

+76
-108
lines changed

src/platform/backends/hyperv_api/hcs/hyperv_hcs_api_wrapper.cpp

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -310,50 +310,6 @@ OperationResult HCSWrapper::resume_compute_system(const std::string& compute_sys
310310

311311
// ---------------------------------------------------------
312312

313-
OperationResult HCSWrapper::add_network_adapter(const std::string& compute_system_name,
314-
const HcsNetworkAdapter& params) const
315-
{
316-
mpl::debug(kLogCategory, "add_network_adapter(...) > params: {}", params);
317-
constexpr auto settings_template = LR"(
318-
{{
319-
"ResourcePath": "VirtualMachine/Devices/NetworkAdapters/{{{0}}}",
320-
"RequestType": "Add",
321-
"Settings": {{
322-
"EndpointId": "{0}",
323-
"MacAddress": "{1}",
324-
"InstanceId": "{0}"
325-
}}
326-
}})";
327-
328-
const auto settings =
329-
fmt::format(settings_template, maybe_widen{params.endpoint_guid}, maybe_widen{params.mac_address});
330-
331-
return perform_hcs_operation(api, api.ModifyComputeSystem, compute_system_name, settings.c_str(), nullptr);
332-
}
333-
334-
// ---------------------------------------------------------
335-
336-
OperationResult HCSWrapper::remove_network_adapter(const std::string& compute_system_name,
337-
const std::string& endpoint_guid) const
338-
{
339-
mpl::debug(kLogCategory,
340-
"remove_network_adapter(...) > name: ({}), endpoint_guid: ({})",
341-
compute_system_name,
342-
endpoint_guid);
343-
344-
constexpr auto settings_template = LR"(
345-
{{
346-
"ResourcePath": "VirtualMachine/Devices/NetworkAdapters/{{{0}}}",
347-
"RequestType": "Remove"
348-
}})";
349-
350-
const auto settings = fmt::format(settings_template, maybe_widen{endpoint_guid});
351-
352-
return perform_hcs_operation(api, api.ModifyComputeSystem, compute_system_name, settings.c_str(), nullptr);
353-
}
354-
355-
// ---------------------------------------------------------
356-
357313
OperationResult HCSWrapper::resize_memory(const std::string& compute_system_name, std::uint32_t new_size_mib) const
358314
{
359315
// Machine must be booted up.
@@ -544,7 +500,8 @@ OperationResult HCSWrapper::remove_plan9_share(const std::string& compute_system
544500

545501
// ---------------------------------------------------------
546502

547-
OperationResult HCSWrapper::modify_compute_system(const std::string& compute_system_name, const HcsRequest& params) const
503+
OperationResult HCSWrapper::modify_compute_system(const std::string& compute_system_name,
504+
const HcsRequest& params) const
548505
{
549506
mpl::debug(kLogCategory, "modify_compute_system(...) > params: {}", params);
550507

src/platform/backends/hyperv_api/hcs/hyperv_hcs_api_wrapper.h

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -160,38 +160,6 @@ struct HCSWrapper : public HCSWrapperInterface
160160

161161
// ---------------------------------------------------------
162162

163-
/**
164-
* Add a network adapter to the host compute system.
165-
*
166-
* A new network interface card will be automatically created for
167-
* the endpoint. The network interface card's name will be the
168-
* endpoint's GUID for convenience.
169-
*
170-
* @param [in] compute_system_name Target compute system's name
171-
* @param [in] params Network adapter parameters
172-
*
173-
* @return An object that evaluates to true on success, false otherwise.
174-
* message() may contain details of failure when result is false.
175-
*/
176-
[[nodiscard]] OperationResult add_network_adapter(const std::string& compute_system_name,
177-
const HcsNetworkAdapter& params) const override;
178-
179-
// ---------------------------------------------------------
180-
181-
/**
182-
* Remove a network adapter from the host compute system.
183-
*
184-
* @param [in] name Target compute system's name
185-
* @param [in] endpoint_guid GUID of the endpoint to remove
186-
*
187-
* @return An object that evaluates to true on success, false otherwise.
188-
* message() may contain details of failure when result is false.
189-
*/
190-
[[nodiscard]] OperationResult remove_network_adapter(const std::string& compute_system_name,
191-
const std::string& endpoint_guid) const override;
192-
193-
// ---------------------------------------------------------
194-
195163
/**
196164
* Resize the amount of memory the compute system has.
197165
*

src/platform/backends/hyperv_api/hcs/hyperv_hcs_wrapper_interface.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ struct HCSWrapperInterface
4747
const std::filesystem::path& file_path) const = 0;
4848
virtual OperationResult revoke_vm_access(const std::string& compute_system_name,
4949
const std::filesystem::path& file_path) const = 0;
50-
virtual OperationResult add_network_adapter(const std::string& compute_system_name,
51-
const HcsNetworkAdapter& params) const = 0;
52-
virtual OperationResult remove_network_adapter(const std::string& compute_system_name,
53-
const std::string& endpoint_guid) const = 0;
5450
virtual OperationResult resize_memory(const std::string& compute_system_name,
5551
const std::uint32_t new_size_mib) const = 0;
5652
virtual OperationResult update_cpu_count(const std::string& compute_system_name,

tests/hyperv_api/test_bb_cit_hyperv.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ using hcn_wrapper_t = hyperv::hcn::HCNWrapper;
3333
using hcs_wrapper_t = hyperv::hcs::HCSWrapper;
3434
using virtdisk_wrapper_t = multipass::hyperv::virtdisk::VirtDiskWrapper;
3535

36+
using multipass::hyperv::hcs::HcsNetworkAdapter;
37+
using multipass::hyperv::hcs::HcsRequest;
38+
using multipass::hyperv::hcs::HcsRequestType;
39+
using multipass::hyperv::hcs::HcsResourcePath;
40+
3641
// Component level big bang integration tests for Hyper-V HCN/HCS + virtdisk API's.
3742
// These tests ensure that the API's working together as expected.
3843
struct HyperV_ComponentIntegrationTests : public ::testing::Test
@@ -225,9 +230,13 @@ TEST_F(HyperV_ComponentIntegrationTests, spawn_empty_test_vm_attach_nic_after_bo
225230
ASSERT_TRUE(status_msg.empty());
226231
}
227232

228-
// Add endpoint
233+
// Add network adapter
229234
{
230-
const auto& [status, status_msg] = hcs.add_network_adapter(create_vm_parameters.name, network_adapter);
235+
const HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(network_adapter.endpoint_guid),
236+
HcsRequestType::Add(),
237+
network_adapter};
238+
const auto& [status, status_msg] =
239+
hcs.modify_compute_system(create_vm_parameters.name, add_network_adapter_req);
231240
ASSERT_TRUE(status);
232241
ASSERT_TRUE(status_msg.empty());
233242
}

tests/hyperv_api/test_ut_hyperv_hcs_api.cpp

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ namespace multipass::test
3737
{
3838
using uut_t = hyperv::hcs::HCSWrapper;
3939

40+
using hyperv::hcs::HcsNetworkAdapter;
41+
using hyperv::hcs::HcsRequest;
42+
using hyperv::hcs::HcsRequestType;
43+
using hyperv::hcs::HcsResourcePath;
44+
4045
struct HyperVHCSAPI_UnitTests : public ::testing::Test
4146
{
4247
mpt::MockLogger::Scope logger_scope = mpt::MockLogger::inject();
@@ -2257,11 +2262,15 @@ TEST_F(HyperVHCSAPI_UnitTests, add_network_adapter_to_compute_system_happy_path)
22572262
generic_operation_happy_path<decltype(HcsModifyComputeSystem)>(
22582263
mock_api_table.ModifyComputeSystem,
22592264
[&](hyperv::hcs::HCSWrapper& wrapper) {
2260-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "add_network_adapter(...) > params:");
2265+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
22612266
hyperv::hcs::HcsNetworkAdapter params{};
22622267
params.endpoint_guid = "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca";
22632268
params.mac_address = "00:00:00:00:00:00";
2264-
return wrapper.add_network_adapter("test_vm", params);
2269+
2270+
HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(params.endpoint_guid),
2271+
HcsRequestType::Add(),
2272+
params};
2273+
return wrapper.modify_compute_system("test_vm", add_network_adapter_req);
22652274
},
22662275
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
22672276
ASSERT_EQ(mock_compute_system_object, computeSystem);
@@ -2279,9 +2288,12 @@ TEST_F(HyperVHCSAPI_UnitTests, add_network_adapter_to_compute_system_hcs_open_fa
22792288
generic_operation_hcs_open_fail<decltype(HcsModifyComputeSystem)>(
22802289
mock_api_table.ModifyComputeSystem,
22812290
[&](hyperv::hcs::HCSWrapper& wrapper) {
2282-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "add_network_adapter(...)");
2291+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...)");
22832292
hyperv::hcs::HcsNetworkAdapter params{};
2284-
return wrapper.add_network_adapter("test_vm", params);
2293+
HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(params.endpoint_guid),
2294+
HcsRequestType::Add(),
2295+
params};
2296+
return wrapper.modify_compute_system("test_vm", add_network_adapter_req);
22852297
});
22862298
}
22872299

@@ -2292,9 +2304,12 @@ TEST_F(HyperVHCSAPI_UnitTests, add_network_adapter_to_compute_system_create_oper
22922304
generic_operation_create_operation_fail<decltype(HcsModifyComputeSystem)>(
22932305
mock_api_table.ModifyComputeSystem,
22942306
[&](hyperv::hcs::HCSWrapper& wrapper) {
2295-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "add_network_adapter(...)");
2307+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...)");
22962308
hyperv::hcs::HcsNetworkAdapter params{};
2297-
return wrapper.add_network_adapter("test_vm", params);
2309+
HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(params.endpoint_guid),
2310+
HcsRequestType::Add(),
2311+
params};
2312+
return wrapper.modify_compute_system("test_vm", add_network_adapter_req);
22982313
});
22992314
}
23002315

@@ -2316,11 +2331,14 @@ TEST_F(HyperVHCSAPI_UnitTests, add_network_adapter_to_compute_system_fail)
23162331
generic_operation_fail<decltype(HcsModifyComputeSystem)>(
23172332
mock_api_table.ModifyComputeSystem,
23182333
[&](hyperv::hcs::HCSWrapper& wrapper) {
2319-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "add_network_adapter(...)");
2334+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...)");
23202335
hyperv::hcs::HcsNetworkAdapter params{};
23212336
params.endpoint_guid = "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca";
23222337
params.mac_address = "00:00:00:00:00:00";
2323-
return wrapper.add_network_adapter("test_vm", params);
2338+
HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(params.endpoint_guid),
2339+
HcsRequestType::Add(),
2340+
params};
2341+
return wrapper.modify_compute_system("test_vm", add_network_adapter_req);
23242342
},
23252343
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
23262344
ASSERT_EQ(mock_compute_system_object, computeSystem);
@@ -2349,11 +2367,14 @@ TEST_F(HyperVHCSAPI_UnitTests, add_network_adapter_to_compute_system_wait_for_op
23492367
generic_operation_wait_for_operation_fail<decltype(HcsModifyComputeSystem)>(
23502368
mock_api_table.ModifyComputeSystem,
23512369
[&](hyperv::hcs::HCSWrapper& wrapper) {
2352-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "add_network_adapter(...)");
2370+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...)");
23532371
hyperv::hcs::HcsNetworkAdapter params{};
23542372
params.endpoint_guid = "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca";
23552373
params.mac_address = "00:00:00:00:00:00";
2356-
return wrapper.add_network_adapter("test_vm", params);
2374+
HcsRequest add_network_adapter_req{HcsResourcePath::NetworkAdapters(params.endpoint_guid),
2375+
HcsRequestType::Add(),
2376+
params};
2377+
return wrapper.modify_compute_system("test_vm", add_network_adapter_req);
23572378
},
23582379
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
23592380
ASSERT_EQ(mock_compute_system_object, computeSystem);
@@ -2371,16 +2392,19 @@ TEST_F(HyperVHCSAPI_UnitTests, remove_network_adapter_from_compute_system_happy_
23712392
constexpr auto expected_modify_compute_system_configuration = LR"(
23722393
{
23732394
"ResourcePath": "VirtualMachine/Devices/NetworkAdapters/{288cc1ac-8f31-4a09-9e90-30ad0bcfdbca}",
2374-
"RequestType": "Remove"
2395+
"RequestType": "Remove",
2396+
"Settings": null
23752397
})";
23762398

23772399
generic_operation_happy_path<decltype(HcsModifyComputeSystem)>(
23782400
mock_api_table.ModifyComputeSystem,
23792401
[&](hyperv::hcs::HCSWrapper& wrapper) {
2380-
logger_scope.mock_logger->expect_log(
2381-
mpl::Level::debug,
2382-
"remove_network_adapter(...) > name: (test_vm), endpoint_guid: (288cc1ac-8f31-4a09-9e90-30ad0bcfdbca)");
2383-
return wrapper.remove_network_adapter("test_vm", "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca");
2402+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
2403+
2404+
HcsRequest remove_network_adapter_req{
2405+
HcsResourcePath::NetworkAdapters("288cc1ac-8f31-4a09-9e90-30ad0bcfdbca"),
2406+
HcsRequestType::Remove()};
2407+
return wrapper.modify_compute_system("test_vm", remove_network_adapter_req);
23842408
},
23852409
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
23862410
ASSERT_EQ(mock_compute_system_object, computeSystem);
@@ -2398,8 +2422,11 @@ TEST_F(HyperVHCSAPI_UnitTests, remove_network_adapter_from_compute_system_hcs_op
23982422
generic_operation_hcs_open_fail<decltype(HcsModifyComputeSystem)>(
23992423
mock_api_table.ModifyComputeSystem,
24002424
[&](hyperv::hcs::HCSWrapper& wrapper) {
2401-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "remove_network_adapter(...)");
2402-
return wrapper.remove_network_adapter("test_vm", "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca");
2425+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
2426+
HcsRequest remove_network_adapter_req{
2427+
HcsResourcePath::NetworkAdapters("288cc1ac-8f31-4a09-9e90-30ad0bcfdbca"),
2428+
HcsRequestType::Remove()};
2429+
return wrapper.modify_compute_system("test_vm", remove_network_adapter_req);
24032430
});
24042431
}
24052432

@@ -2410,8 +2437,11 @@ TEST_F(HyperVHCSAPI_UnitTests, remove_network_adapter_from_compute_system_create
24102437
generic_operation_create_operation_fail<decltype(HcsModifyComputeSystem)>(
24112438
mock_api_table.ModifyComputeSystem,
24122439
[&](hyperv::hcs::HCSWrapper& wrapper) {
2413-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "remove_network_adapter(...)");
2414-
return wrapper.remove_network_adapter("test_vm", "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca");
2440+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
2441+
HcsRequest remove_network_adapter_req{
2442+
HcsResourcePath::NetworkAdapters("288cc1ac-8f31-4a09-9e90-30ad0bcfdbca"),
2443+
HcsRequestType::Remove()};
2444+
return wrapper.modify_compute_system("test_vm", remove_network_adapter_req);
24152445
});
24162446
}
24172447

@@ -2422,14 +2452,18 @@ TEST_F(HyperVHCSAPI_UnitTests, remove_network_adapter_from_compute_system_fail)
24222452
constexpr auto expected_modify_compute_system_configuration = LR"(
24232453
{
24242454
"ResourcePath": "VirtualMachine/Devices/NetworkAdapters/{288cc1ac-8f31-4a09-9e90-30ad0bcfdbca}",
2425-
"RequestType": "Remove"
2455+
"RequestType": "Remove",
2456+
"Settings": null
24262457
})";
24272458

24282459
generic_operation_fail<decltype(HcsModifyComputeSystem)>(
24292460
mock_api_table.ModifyComputeSystem,
24302461
[&](hyperv::hcs::HCSWrapper& wrapper) {
2431-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "remove_network_adapter(...)");
2432-
return wrapper.remove_network_adapter("test_vm", "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca");
2462+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
2463+
HcsRequest remove_network_adapter_req{
2464+
HcsResourcePath::NetworkAdapters("288cc1ac-8f31-4a09-9e90-30ad0bcfdbca"),
2465+
HcsRequestType::Remove()};
2466+
return wrapper.modify_compute_system("test_vm", remove_network_adapter_req);
24332467
},
24342468
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
24352469
ASSERT_EQ(mock_compute_system_object, computeSystem);
@@ -2447,14 +2481,18 @@ TEST_F(HyperVHCSAPI_UnitTests, remove_network_adapter_from_compute_system_wait_f
24472481
constexpr auto expected_modify_compute_system_configuration = LR"(
24482482
{
24492483
"ResourcePath": "VirtualMachine/Devices/NetworkAdapters/{288cc1ac-8f31-4a09-9e90-30ad0bcfdbca}",
2450-
"RequestType": "Remove"
2484+
"RequestType": "Remove",
2485+
"Settings": null
24512486
})";
24522487

24532488
generic_operation_wait_for_operation_fail<decltype(HcsModifyComputeSystem)>(
24542489
mock_api_table.ModifyComputeSystem,
24552490
[&](hyperv::hcs::HCSWrapper& wrapper) {
2456-
logger_scope.mock_logger->expect_log(mpl::Level::debug, "remove_network_adapter(...)");
2457-
return wrapper.remove_network_adapter("test_vm", "288cc1ac-8f31-4a09-9e90-30ad0bcfdbca");
2491+
logger_scope.mock_logger->expect_log(mpl::Level::debug, "modify_compute_system(...) > params:");
2492+
HcsRequest remove_network_adapter_req{
2493+
HcsResourcePath::NetworkAdapters("288cc1ac-8f31-4a09-9e90-30ad0bcfdbca"),
2494+
HcsRequestType::Remove()};
2495+
return wrapper.modify_compute_system("test_vm", remove_network_adapter_req);
24582496
},
24592497
[](HCS_SYSTEM computeSystem, HCS_OPERATION operation, PCWSTR configuration, HANDLE identity) {
24602498
ASSERT_EQ(mock_compute_system_object, computeSystem);

0 commit comments

Comments
 (0)