24
24
25
25
from neutron .agent .l3 import agent as l3_agent
26
26
from neutron .agent .l3 import router_info
27
+ from neutron .agent .linux import ip_lib
27
28
from neutron .agent .linux import iptables_manager
28
29
from neutron .agent .linux import utils as linux_utils
29
30
from neutron .agent .metadata import driver as metadata_driver
@@ -74,6 +75,7 @@ class TestMetadataDriverProcess(base.BaseTestCase):
74
75
EUNAME = 'neutron'
75
76
EGNAME = 'neutron'
76
77
METADATA_DEFAULT_IP = '169.254.169.254'
78
+ METADATA_DEFAULT_IPV6 = 'fe80::a9fe:a9fe'
77
79
METADATA_PORT = 8080
78
80
METADATA_SOCKET = '/socket/path'
79
81
PIDFILE = 'pidfile'
@@ -138,7 +140,7 @@ def test_after_router_updated_should_not_call_add_metadata_rules(self):
138
140
agent ._process_updated_router (router )
139
141
f .assert_not_called ()
140
142
141
- def test_spawn_metadata_proxy (self ):
143
+ def _test_spawn_metadata_proxy (self , dad_failed = False ):
142
144
router_id = _uuid ()
143
145
router_ns = 'qrouter-%s' % router_id
144
146
ip_class_path = 'neutron.agent.linux.ip_lib.IPWrapper'
@@ -162,29 +164,41 @@ def test_spawn_metadata_proxy(self):
162
164
'NamespaceManager.list_all' , return_value = {}),\
163
165
mock .patch (
164
166
'neutron.agent.linux.ip_lib.'
165
- 'IpAddrCommand.wait_until_address_ready' ) as mock_wait :
167
+ 'IpAddrCommand.wait_until_address_ready' ) as mock_wait ,\
168
+ mock .patch (
169
+ 'neutron.agent.linux.ip_lib.'
170
+ 'delete_ip_address' ) as mock_del :
166
171
agent = l3_agent .L3NATAgent ('localhost' )
172
+ agent .process_monitor = mock .Mock ()
167
173
cfg_file = os .path .join (
168
174
metadata_driver .HaproxyConfigurator .get_config_path (
169
175
agent .conf .state_path ),
170
176
"%s.conf" % router_id )
171
177
mock_open = self .useFixture (
172
178
lib_fixtures .OpenFixture (cfg_file )).mock_open
173
- mock_wait .return_value = True
179
+ if dad_failed :
180
+ mock_wait .side_effect = ip_lib .DADFailed (
181
+ address = self .METADATA_DEFAULT_IP , reason = 'DAD failed' )
182
+ else :
183
+ mock_wait .return_value = True
174
184
agent .metadata_driver .spawn_monitored_metadata_proxy (
175
185
agent .process_monitor ,
176
186
router_ns ,
177
187
self .METADATA_PORT ,
178
188
agent .conf ,
179
189
bind_address = self .METADATA_DEFAULT_IP ,
180
- router_id = router_id )
190
+ router_id = router_id ,
191
+ bind_address_v6 = self .METADATA_DEFAULT_IPV6 ,
192
+ bind_interface = 'fake-if' )
181
193
182
194
netns_execute_args = [
183
195
'haproxy' ,
184
196
'-f' , cfg_file ]
185
197
186
198
log_tag = ("haproxy-" + metadata_driver .METADATA_SERVICE_NAME +
187
199
"-" + router_id )
200
+ bind_v6_line = 'bind %s:%s interface %s' % (
201
+ self .METADATA_DEFAULT_IPV6 , self .METADATA_PORT , 'fake-if' )
188
202
cfg_contents = metadata_driver ._HAPROXY_CONFIG_TEMPLATE % {
189
203
'user' : self .EUNAME ,
190
204
'group' : self .EGNAME ,
@@ -197,18 +211,34 @@ def test_spawn_metadata_proxy(self):
197
211
'pidfile' : self .PIDFILE ,
198
212
'log_level' : 'debug' ,
199
213
'log_tag' : log_tag ,
200
- 'bind_v6_line' : '' }
201
-
202
- mock_open .assert_has_calls ([
203
- mock .call (cfg_file , 'w' ),
204
- mock .call ().write (cfg_contents )],
205
- any_order = True )
206
-
207
- ip_mock .assert_has_calls ([
208
- mock .call (namespace = router_ns ),
209
- mock .call ().netns .execute (netns_execute_args , addl_env = None ,
210
- run_as_root = True )
211
- ])
214
+ 'bind_v6_line' : bind_v6_line }
215
+
216
+ if dad_failed :
217
+ agent .process_monitor .register .assert_not_called ()
218
+ mock_del .assert_called_once_with (self .METADATA_DEFAULT_IPV6 ,
219
+ 'fake-if' ,
220
+ namespace = router_ns )
221
+ else :
222
+ mock_open .assert_has_calls ([
223
+ mock .call (cfg_file , 'w' ),
224
+ mock .call ().write (cfg_contents )], any_order = True )
225
+
226
+ ip_mock .assert_has_calls ([
227
+ mock .call (namespace = router_ns ),
228
+ mock .call ().netns .execute (netns_execute_args ,
229
+ addl_env = None , run_as_root = True )
230
+ ])
231
+
232
+ agent .process_monitor .register .assert_called_once_with (
233
+ router_id , metadata_driver .METADATA_SERVICE_NAME ,
234
+ mock .ANY )
235
+ mock_del .assert_not_called ()
236
+
237
+ def test_spawn_metadata_proxy (self ):
238
+ self ._test_spawn_metadata_proxy ()
239
+
240
+ def test_spawn_metadata_proxy_dad_failed (self ):
241
+ self ._test_spawn_metadata_proxy (dad_failed = True )
212
242
213
243
def test_create_config_file_wrong_user (self ):
214
244
with mock .patch ('pwd.getpwnam' , side_effect = KeyError ):
0 commit comments