Skip to content

Commit 8093558

Browse files
Hongbin Luhongbin
authored andcommitted
Add RemoveNetwork command to server
This command will detach a server from a network. All server's neutron ports that belongs to the specified networks will be removed. Change-Id: I83a064ed62ab00c6f1016900b9cf30f1c15b8382
1 parent 4742d4d commit 8093558

4 files changed

Lines changed: 92 additions & 0 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,41 @@ def take_action(self, parsed_args):
15421542
server.interface_detach(port_id)
15431543

15441544

1545+
class RemoveNetwork(command.Command):
1546+
_description = _("Remove all ports of a network from server")
1547+
1548+
def get_parser(self, prog_name):
1549+
parser = super(RemoveNetwork, self).get_parser(prog_name)
1550+
parser.add_argument(
1551+
"server",
1552+
metavar="<server>",
1553+
help=_("Server to remove the port from (name or ID)"),
1554+
)
1555+
parser.add_argument(
1556+
"network",
1557+
metavar="<network>",
1558+
help=_("Network to remove from the server (name or ID)"),
1559+
)
1560+
return parser
1561+
1562+
def take_action(self, parsed_args):
1563+
compute_client = self.app.client_manager.compute
1564+
1565+
server = utils.find_resource(
1566+
compute_client.servers, parsed_args.server)
1567+
1568+
if self.app.client_manager.is_network_endpoint_enabled():
1569+
network_client = self.app.client_manager.network
1570+
net_id = network_client.find_network(
1571+
parsed_args.network, ignore_missing=False).id
1572+
else:
1573+
net_id = parsed_args.network
1574+
1575+
for inf in server.interface_list():
1576+
if inf.net_id == net_id:
1577+
server.interface_detach(inf.port_id)
1578+
1579+
15451580
class RemoveServerSecurityGroup(command.Command):
15461581
_description = _("Remove security group from server")
15471582

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,6 +2380,57 @@ def test_server_remove_port_no_neutron(self):
23802380
self.find_port.assert_not_called()
23812381

23822382

2383+
class TestServerRemoveNetwork(TestServer):
2384+
2385+
def setUp(self):
2386+
super(TestServerRemoveNetwork, self).setUp()
2387+
2388+
# Get the command object to test
2389+
self.cmd = server.RemoveNetwork(self.app, None)
2390+
2391+
# Set method to be tested.
2392+
self.fake_inf = mock.Mock()
2393+
self.methods = {
2394+
'interface_list': [self.fake_inf],
2395+
'interface_detach': None,
2396+
}
2397+
2398+
self.find_network = mock.Mock()
2399+
self.app.client_manager.network.find_network = self.find_network
2400+
2401+
def _test_server_remove_network(self, network_id):
2402+
self.fake_inf.net_id = network_id
2403+
self.fake_inf.port_id = 'fake-port'
2404+
servers = self.setup_servers_mock(count=1)
2405+
network = 'fake-network'
2406+
2407+
arglist = [
2408+
servers[0].id,
2409+
network,
2410+
]
2411+
verifylist = [
2412+
('server', servers[0].id),
2413+
('network', network),
2414+
]
2415+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2416+
2417+
result = self.cmd.take_action(parsed_args)
2418+
2419+
servers[0].interface_list.assert_called_once_with()
2420+
servers[0].interface_detach.assert_called_once_with('fake-port')
2421+
self.assertIsNone(result)
2422+
2423+
def test_server_remove_network(self):
2424+
self._test_server_remove_network(self.find_network.return_value.id)
2425+
self.find_network.assert_called_once_with(
2426+
'fake-network', ignore_missing=False)
2427+
2428+
def test_server_remove_network_no_neutron(self):
2429+
self.app.client_manager.network_endpoint_enabled = False
2430+
self._test_server_remove_network('fake-network')
2431+
self.find_network.assert_not_called()
2432+
2433+
23832434
@mock.patch(
23842435
'openstackclient.api.compute_v2.APIv2.security_group_find'
23852436
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add ``server remove network`` command. This command will remove all
5+
network ports from the specified network and instance.

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ openstack.compute.v2 =
118118
server_remove_fixed_ip = openstackclient.compute.v2.server:RemoveFixedIP
119119
server_remove_floating_ip = openstackclient.compute.v2.server:RemoveFloatingIP
120120
server_remove_port = openstackclient.compute.v2.server:RemovePort
121+
server_remove_network = openstackclient.compute.v2.server:RemoveNetwork
121122
server_remove_security_group = openstackclient.compute.v2.server:RemoveServerSecurityGroup
122123
server_remove_volume = openstackclient.compute.v2.server:RemoveServerVolume
123124
server_rescue = openstackclient.compute.v2.server:RescueServer

0 commit comments

Comments
 (0)