congress/congress/tests/datasources/test_neutronv2_driver.py

545 lines
26 KiB
Python

# Copyright (c) 2013 VMware, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import mock
from congress.datasources import neutronv2_driver
from congress.tests import base
from congress.tests import helper
class TestNeutronV2Driver(base.TestCase):
def setUp(self):
super(TestNeutronV2Driver, self).setUp()
self.neutron_client_p = mock.patch(
"neutronclient.v2_0.client.Client")
self.neutron_client_p.start()
args = helper.datasource_openstack_args()
args['poll_time'] = 0
args['client'] = mock.MagicMock()
self.driver = neutronv2_driver.NeutronV2Driver(args=args)
self.mock_networks = {'networks': [
{u'admin_state_up': True,
u'id': u'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
u'name': u'private',
u'router:external': False,
u'shared': False,
u'status': u'ACTIVE',
u'subnets': [u'3c0eb3a3-4d16-4b1b-b327-44417182d0bb'],
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'admin_state_up': True,
u'id': u'ecdea1af-7197-43c8-b3b0-34d90f72a2a8',
u'name': u'public',
u'router:external': True,
u'shared': False,
u'status': u'ACTIVE',
u'subnets': [u'10d20df9-e8ba-4756-ba30-d573ceb2e99a'],
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'}]}
self.mock_floatingips = {'floatingips': [
{u"router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
u"tenant_id": "4969c491a3c74ee4af974e6d800c62de",
u"floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
u"fixed_ip_address": "10.0.0.3",
u"floating_ip_address": "172.24.4.228",
u"port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
u"id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7",
u"status": "ACTIVE"},
{u"router_id": None,
u"tenant_id": "4969c491a3c74ee4af974e6d800c62de",
u"floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
u"fixed_ip_address": None,
u"floating_ip_address": "172.24.4.227",
u"port_id": None,
u"id": "61cea855-49cb-4846-997d-801b70c71bdd",
u"status": "DOWN"}]}
self.mock_ports = {'ports': [
{u'admin_state_up': True,
u'allowed_address_pairs': [],
u'binding:host_id': None,
u'binding:vif_details': {u'port_filter': True},
u'binding:vif_type': u'ovs',
u'binding:vnic_type': u'normal',
u'device_id': u'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
u'device_owner': u'network:router_gateway',
u'fixed_ips': [
{u'ip_address': u'1.1.1.2',
u'subnet_id': u'10d20df9-e8ba-4756-ba30-d573ceb2e99a'}],
u'id': u'04627c85-3553-436c-a7c5-0a64f5b87bb9',
u'mac_address': u'fa:16:3e:f3:19:e5',
u'name': u'',
u'network_id': u'ecdea1af-7197-43c8-b3b0-34d90f72a2a8',
u'port_security_enabled': False,
u'security_groups': [],
u'status': u'DOWN',
u'tenant_id': u''},
{u'admin_state_up': True,
u'allowed_address_pairs': [],
u'binding:host_id': None,
u'binding:vif_details': {u'port_filter': True},
u'binding:vif_type': u'ovs',
u'binding:vnic_type': u'normal',
u'device_id': u'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
u'device_owner': u'network:router_interface',
u'fixed_ips': [
{u'ip_address': u'169.254.169.253',
u'subnet_id': u'aa9ad4f7-baf0-4a41-85c3-1cc8a3066db6'}],
u'id': u'87f8933a-9582-48d8-ad16-9abf6e545002',
u'mac_address': u'fa:16:3e:b7:78:e8',
u'name': u'',
u'network_id': u'6743ff85-2cfd-48a7-9d3f-472cd418783e',
u'port_security_enabled': False,
u'security_groups': [],
u'status': u'DOWN',
u'tenant_id': u''},
{u'admin_state_up': True,
u'allowed_address_pairs': [],
u'binding:host_id': None,
u'binding:vif_details': {u'port_filter': True},
u'binding:vif_type': u'ovs',
u'binding:vnic_type': u'normal',
u'device_id': u'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
u'device_owner': u'network:router_interface',
u'fixed_ips': [
{u'ip_address': u'10.0.0.1',
u'subnet_id': u'3c0eb3a3-4d16-4b1b-b327-44417182d0bb'}],
u'id': u'c58c3246-6c2e-490a-b4d9-3b8d5191b465',
u'mac_address': u'fa:16:3e:08:31:6e',
u'name': u'',
u'network_id': u'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
u'port_security_enabled': False,
u'security_groups': [],
u'status': u'DOWN',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'admin_state_up': True,
u'allowed_address_pairs': [],
u'binding:host_id': None,
u'binding:vif_details': {u'port_filter': True},
u'binding:vif_type': u'ovs',
u'binding:vnic_type': u'normal',
u'device_id': u'',
u'device_owner': u'',
u'fixed_ips': [
{u'ip_address': u'10.0.0.2',
u'subnet_id': u'3c0eb3a3-4d16-4b1b-b327-44417182d0bb'}],
u'id': u'eb50003b-a081-4533-92aa-1cbd97f526a8',
u'mac_address': u'fa:16:3e:af:56:fa',
u'name': u'',
u'network_id': u'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
u'port_security_enabled': True,
u'security_groups': [u'e0239062-4243-4798-865f-7055f03786d6'],
u'status': u'DOWN',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'}]}
self.mock_subnets = {'subnets': [
{u'allocation_pools': [{u'end': u'1.1.1.254',
u'start': u'1.1.1.2'}],
u'cidr': u'1.1.1.0/24',
u'dns_nameservers': [],
u'enable_dhcp': True,
u'gateway_ip': u'1.1.1.1',
u'host_routes': [],
u'id': u'10d20df9-e8ba-4756-ba30-d573ceb2e99a',
u'ip_version': 4,
u'ipv6_address_mode': None,
u'ipv6_ra_mode': None,
u'name': u'',
u'network_id': u'ecdea1af-7197-43c8-b3b0-34d90f72a2a8',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'allocation_pools': [{u'end': u'10.0.0.254',
u'start': u'10.0.0.2'}],
u'cidr': u'10.0.0.0/24',
u'dns_nameservers': [u'8.8.8.8'],
u'enable_dhcp': True,
u'gateway_ip': u'10.0.0.1',
u'host_routes': [{u'destination': u'10.10.0.2/32',
u'nexthop': u'10.0.0.1'}],
u'id': u'3c0eb3a3-4d16-4b1b-b327-44417182d0bb',
u'ip_version': 4,
u'ipv6_address_mode': None,
u'ipv6_ra_mode': None,
u'name': u'private-subnet',
u'network_id': u'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'allocation_pools': [{u'end': u'169.254.169.254',
u'start': u'169.254.169.254'}],
u'cidr': u'169.254.169.252/30',
u'dns_nameservers': [],
u'enable_dhcp': True,
u'gateway_ip': u'169.254.169.253',
u'host_routes': [],
u'id': u'aa9ad4f7-baf0-4a41-85c3-1cc8a3066db6',
u'ip_version': 4,
u'ipv6_address_mode': None,
u'ipv6_ra_mode': None,
u'name': u'meta-f42dc4f1-f371-48cc-95be-cf1b97112ab8',
u'network_id': u'6743ff85-2cfd-48a7-9d3f-472cd418783e',
u'tenant_id': u''}]}
self.mock_routers = {'routers': [
{u'admin_state_up': True,
u'distributed': False,
u'external_gateway_info': {
u'enable_snat': True,
u'external_fixed_ips': [
{u'ip_address': u'1.1.1.2',
u'subnet_id': u'10d20df9-e8ba-4756-ba30-d573ceb2e99a'}],
u'network_id': u'ecdea1af-7197-43c8-b3b0-34d90f72a2a8'},
u'id': u'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
u'name': u'myrouter',
u'routes': [],
u'status': u'DOWN',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'}]}
self.mock_security_groups = {'security_groups': [
{u'description': u'Default security group',
u'id': u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'name': u'default',
u'security_group_rules': [
{u'direction': u'egress',
u'ethertype': u'IPv4',
u'id': u'1d943e83-e4e6-472a-9655-f74eb22f3668',
u'port_range_max': 22,
u'port_range_min': 11,
u'protocol': None,
u'remote_group_id': None,
u'remote_ip_prefix': None,
u'security_group_id':
u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'tenant_id': u''},
{u'direction': u'ingress',
u'ethertype': u'IPv4',
u'id': u'30be5ee1-5b0a-4929-aca5-0c25f1c6b733',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'remote_ip_prefix': None,
u'security_group_id':
u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'tenant_id': u''},
{u'direction': u'ingress',
u'ethertype': u'IPv6',
u'id': u'639995b8-c3ac-44a3-a4f3-c74f9172ad54',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'remote_ip_prefix': None,
u'security_group_id':
u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'tenant_id': u''},
{u'direction': u'egress',
u'ethertype': u'IPv6',
u'id': u'ed7fd9f6-e390-448a-9f5f-8dd4659282f7',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': None,
u'remote_ip_prefix': None,
u'security_group_id':
u'a268fc32-1a59-4154-9a7c-f453ef92560c',
u'tenant_id': u''}],
u'tenant_id': u''},
{u'description': u'Default security group',
u'id': u'e0239062-4243-4798-865f-7055f03786d6',
u'name': u'default',
u'security_group_rules': [
{u'direction': u'ingress',
u'ethertype': u'IPv6',
u'id': u'8a81fecc-ecc7-48ca-bccc-195799667e23',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': u'e0239062-4243-4798-865f-7055f03786d6',
u'remote_ip_prefix': None,
u'security_group_id':
u'e0239062-4243-4798-865f-7055f03786d6',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'direction': u'ingress',
u'ethertype': u'IPv4',
u'id': u'8f4d9e99-1fe8-4816-9f07-c4ecddea9427',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': u'e0239062-4243-4798-865f-7055f03786d6',
u'remote_ip_prefix': None,
u'security_group_id':
u'e0239062-4243-4798-865f-7055f03786d6',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'direction': u'egress',
u'ethertype': u'IPv4',
u'id': u'e70cf243-3389-4f80-82dc-92a3ec1f2d2a',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': None,
u'remote_ip_prefix': None,
u'security_group_id':
u'e0239062-4243-4798-865f-7055f03786d6',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'},
{u'direction': u'egress',
u'ethertype': u'IPv6',
u'id': u'eca1df0f-b222-4208-8f96-8a8024fd6834',
u'port_range_max': None,
u'port_range_min': None,
u'protocol': None,
u'remote_group_id': None,
u'remote_ip_prefix': None,
u'security_group_id':
u'e0239062-4243-4798-865f-7055f03786d6',
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'}],
u'tenant_id': u'feee0a965cc34274917fb753623dd57d'}]}
self.expected_state = {
'subnets': set([
('3c0eb3a3-4d16-4b1b-b327-44417182d0bb',
'feee0a965cc34274917fb753623dd57d', 'private-subnet',
'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d', 4, '10.0.0.0/24',
'10.0.0.1', True, None, None),
('aa9ad4f7-baf0-4a41-85c3-1cc8a3066db6', '',
'meta-f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'6743ff85-2cfd-48a7-9d3f-472cd418783e', 4,
'169.254.169.252/30',
'169.254.169.253', True, None, None),
('10d20df9-e8ba-4756-ba30-d573ceb2e99a',
'feee0a965cc34274917fb753623dd57d', '',
'ecdea1af-7197-43c8-b3b0-34d90f72a2a8', 4, '1.1.1.0/24',
'1.1.1.1', True, None, None)]),
'floating_ips': set([
("2f245a7b-796b-4f26-9cf9-9e82d248fda7",
"d23abc8d-2991-4a55-ba98-2aaea84cc72f",
"4969c491a3c74ee4af974e6d800c62de",
"376da547-b977-4cfe-9cba-275c80debf57", "10.0.0.3",
"172.24.4.228", "ce705c24-c1ef-408a-bda3-7bbd946164ab",
"ACTIVE"),
("61cea855-49cb-4846-997d-801b70c71bdd", None,
"4969c491a3c74ee4af974e6d800c62de",
"376da547-b977-4cfe-9cba-275c80debf57", None,
"172.24.4.227", None, "DOWN")]),
'routers':
set([('f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'feee0a965cc34274917fb753623dd57d', 'DOWN', True,
'myrouter', False)]),
'dns_nameservers':
set([('3c0eb3a3-4d16-4b1b-b327-44417182d0bb', '8.8.8.8')]),
'security_group_rules':
set([('e0239062-4243-4798-865f-7055f03786d6',
'e70cf243-3389-4f80-82dc-92a3ec1f2d2a',
'feee0a965cc34274917fb753623dd57d', None, 'egress',
'IPv4', None, None, None, None),
('a268fc32-1a59-4154-9a7c-f453ef92560c',
'ed7fd9f6-e390-448a-9f5f-8dd4659282f7', '', None,
'egress', 'IPv6', None, None, None, None),
('a268fc32-1a59-4154-9a7c-f453ef92560c',
'1d943e83-e4e6-472a-9655-f74eb22f3668', '', None,
'egress', 'IPv4', None, 11, 22, None),
('a268fc32-1a59-4154-9a7c-f453ef92560c',
'30be5ee1-5b0a-4929-aca5-0c25f1c6b733', '',
'a268fc32-1a59-4154-9a7c-f453ef92560c', 'ingress',
'IPv4', None, None, None, None),
('e0239062-4243-4798-865f-7055f03786d6',
'8a81fecc-ecc7-48ca-bccc-195799667e23',
'feee0a965cc34274917fb753623dd57d',
'e0239062-4243-4798-865f-7055f03786d6', 'ingress',
'IPv6', None, None, None, None),
('a268fc32-1a59-4154-9a7c-f453ef92560c',
'639995b8-c3ac-44a3-a4f3-c74f9172ad54', '',
'a268fc32-1a59-4154-9a7c-f453ef92560c', 'ingress',
'IPv6', None, None, None, None),
('e0239062-4243-4798-865f-7055f03786d6',
'8f4d9e99-1fe8-4816-9f07-c4ecddea9427',
'feee0a965cc34274917fb753623dd57d',
'e0239062-4243-4798-865f-7055f03786d6',
'ingress', 'IPv4', None, None, None, None),
('e0239062-4243-4798-865f-7055f03786d6',
'eca1df0f-b222-4208-8f96-8a8024fd6834',
'feee0a965cc34274917fb753623dd57d', None, 'egress',
'IPv6', None, None, None, None)]),
'ports':
set([('c58c3246-6c2e-490a-b4d9-3b8d5191b465',
'feee0a965cc34274917fb753623dd57d', '',
'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
'fa:16:3e:08:31:6e', True, 'DOWN',
'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'network:router_interface'),
('87f8933a-9582-48d8-ad16-9abf6e545002', '', '',
'6743ff85-2cfd-48a7-9d3f-472cd418783e',
'fa:16:3e:b7:78:e8', True, 'DOWN',
'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'network:router_interface'),
('eb50003b-a081-4533-92aa-1cbd97f526a8',
'feee0a965cc34274917fb753623dd57d', '',
'63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
'fa:16:3e:af:56:fa', True, 'DOWN', '', ''),
('04627c85-3553-436c-a7c5-0a64f5b87bb9', '', '',
'ecdea1af-7197-43c8-b3b0-34d90f72a2a8',
'fa:16:3e:f3:19:e5', True, 'DOWN',
'f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'network:router_gateway')]),
'allocation_pools':
set([('10d20df9-e8ba-4756-ba30-d573ceb2e99a', '1.1.1.2',
'1.1.1.254'),
('3c0eb3a3-4d16-4b1b-b327-44417182d0bb', '10.0.0.2',
'10.0.0.254'),
('aa9ad4f7-baf0-4a41-85c3-1cc8a3066db6',
'169.254.169.254', '169.254.169.254')]),
'host_routes':
set([('3c0eb3a3-4d16-4b1b-b327-44417182d0bb',
'10.10.0.2/32', '10.0.0.1')]),
'security_group_port_bindings':
set([('eb50003b-a081-4533-92aa-1cbd97f526a8',
'e0239062-4243-4798-865f-7055f03786d6')]),
'external_gateway_infos':
set([('f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'ecdea1af-7197-43c8-b3b0-34d90f72a2a8', True)]),
'fixed_ips':
set([('c58c3246-6c2e-490a-b4d9-3b8d5191b465', '10.0.0.1',
'3c0eb3a3-4d16-4b1b-b327-44417182d0bb'),
('eb50003b-a081-4533-92aa-1cbd97f526a8', '10.0.0.2',
'3c0eb3a3-4d16-4b1b-b327-44417182d0bb'),
('87f8933a-9582-48d8-ad16-9abf6e545002',
'169.254.169.253',
'aa9ad4f7-baf0-4a41-85c3-1cc8a3066db6'),
('04627c85-3553-436c-a7c5-0a64f5b87bb9', '1.1.1.2',
'10d20df9-e8ba-4756-ba30-d573ceb2e99a')]),
'networks':
set([('ecdea1af-7197-43c8-b3b0-34d90f72a2a8',
'feee0a965cc34274917fb753623dd57d', 'public',
'ACTIVE', True, False),
('63ce8fbb-12e9-4ecd-9b56-1bbf8b51217d',
'feee0a965cc34274917fb753623dd57d', 'private',
'ACTIVE', True, False)]),
'security_groups':
set([('e0239062-4243-4798-865f-7055f03786d6',
'feee0a965cc34274917fb753623dd57d', 'default',
'Default security group'),
('a268fc32-1a59-4154-9a7c-f453ef92560c', '',
'default', 'Default security group')]),
'external_fixed_ips':
set([('f42dc4f1-f371-48cc-95be-cf1b97112ab8',
'10d20df9-e8ba-4756-ba30-d573ceb2e99a', '1.1.1.2')])}
def test_update_from_datasource(self):
with base.nested(
mock.patch.object(self.driver.neutron,
"list_networks",
return_value=self.mock_networks),
mock.patch.object(self.driver.neutron,
"list_ports",
return_value=self.mock_ports),
mock.patch.object(self.driver.neutron,
"list_subnets",
return_value=self.mock_subnets),
mock.patch.object(self.driver.neutron,
"list_routers",
return_value=self.mock_routers),
mock.patch.object(self.driver.neutron,
"list_security_groups",
return_value=self.mock_security_groups),
mock.patch.object(self.driver.neutron,
"list_floatingips",
return_value=self.mock_floatingips),
) as (list_networks, list_ports, list_subnets, list_routers,
list_security_groups, list_floatingips):
self.driver.update_from_datasource()
self.assertEqual(self.expected_state, self.driver.state)
def test_execute(self):
class NeutronClient(object):
def __init__(self):
self.testkey = None
def connectNetwork(self, arg1):
self.testkey = 'arg1=%s' % arg1
neutron_client = NeutronClient()
self.driver.neutron = neutron_client
api_args = {
'positional': ['1']
}
expected_ans = 'arg1=1'
self.driver.execute('connectNetwork', api_args)
self.assertEqual(expected_ans, neutron_client.testkey)
def test_update_resource_attrs(self):
args = {'positional': ['port', '1', 'key1', 'val1']}
action_args = {'named': {'port': '1',
'body': {'port': {'key1': 'val1'}}}}
with mock.patch.object(self.driver, '_execute_api') as mock_ea:
self.driver.update_resource_attrs(args)
mock_ea.assert_called_with(self.driver.neutron, 'update_port',
action_args)
def test_attach_new_port_security_group(self):
port_info = {u'port': self.mock_ports['ports'][3]}
port_id = u'eb50003b-a081-4533-92aa-1cbd97f526a8'
existing_sgroup_id = u'e0239062-4243-4798-865f-7055f03786d6'
new_sgroup_id = u'a268fc32-1a59-4154-9a7c-f453ef92560c'
new_sgroup_args = {'positional': [port_id, new_sgroup_id]}
self.driver.neutron.show_port.return_value = port_info
self.driver.attach_port_security_group(new_sgroup_args)
self.driver.neutron.show_port.assert_called_once_with(port_id)
self.driver.neutron.update_port.assert_called_once_with(
port_id,
{'port': {'security_groups': [existing_sgroup_id, new_sgroup_id]}})
def test_attach_existing_port_security_group(self):
port_info = {u'port': self.mock_ports['ports'][3]}
port_id = u'eb50003b-a081-4533-92aa-1cbd97f526a8'
existing_sgroup_id = u'e0239062-4243-4798-865f-7055f03786d6'
existing_sgroup_args = {
'positional': [port_id, existing_sgroup_id]}
self.driver.neutron.show_port.return_value = port_info
self.driver.attach_port_security_group(existing_sgroup_args)
self.driver.neutron.show_port.assert_called_once_with(port_id)
self.driver.neutron.update_port.assert_not_called()
def test_detach_new_port_security_group(self):
port_info = {u'port': self.mock_ports['ports'][3]}
port_id = u'eb50003b-a081-4533-92aa-1cbd97f526a8'
new_sgroup_id = u'a268fc32-1a59-4154-9a7c-f453ef92560c'
new_sgroup_args = {'positional': [port_id, new_sgroup_id]}
self.driver.neutron.show_port.return_value = port_info
self.driver.detach_port_security_group(new_sgroup_args)
self.driver.neutron.show_port.assert_called_once_with(port_id)
self.driver.neutron.update_port.assert_not_called()
def test_detach_existing_port_security_group(self):
port_info = {u'port': self.mock_ports['ports'][3]}
port_id = u'eb50003b-a081-4533-92aa-1cbd97f526a8'
existing_sgroup_id = u'e0239062-4243-4798-865f-7055f03786d6'
existing_sgroup_args = {
'positional': [port_id, existing_sgroup_id]}
self.driver.neutron.show_port.return_value = port_info
self.driver.detach_port_security_group(existing_sgroup_args)
self.driver.neutron.show_port.assert_called_once_with(port_id)
self.driver.neutron.update_port.assert_called_once_with(
port_id, {'port': {'security_groups': []}})