@@ -260,6 +260,32 @@ def test_list_command_results(self):
260260 ],
261261 }, response .json )
262262
263+ def test_list_commands_with_token (self ):
264+ agent_token = str ('0123456789' * 10 )
265+ cmd_result = base .SyncCommandResult ('do_things' ,
266+ {'key' : 'value' },
267+ True ,
268+ {'test' : 'result' })
269+ self .mock_agent .list_command_results .return_value = [cmd_result ]
270+ self .mock_agent .validate_agent_token .return_value = True
271+
272+ response = self .get_json ('/commands?agent_token=%s' % agent_token )
273+
274+ self .assertEqual (200 , response .status_code )
275+ self .assertEqual (1 , self .mock_agent .validate_agent_token .call_count )
276+ self .assertEqual (1 , self .mock_agent .list_command_results .call_count )
277+
278+ def test_list_commands_with_token_invalid (self ):
279+ agent_token = str ('0123456789' * 10 )
280+ self .mock_agent .validate_agent_token .return_value = False
281+
282+ response = self .get_json ('/commands?agent_token=%s' % agent_token ,
283+ expect_errors = True )
284+
285+ self .assertEqual (401 , response .status_code )
286+ self .assertEqual (1 , self .mock_agent .validate_agent_token .call_count )
287+ self .assertEqual (0 , self .mock_agent .list_command_results .call_count )
288+
263289 def test_get_command_result (self ):
264290 cmd_result = base .SyncCommandResult ('do_things' ,
265291 {'key' : 'value' },
@@ -274,6 +300,76 @@ def test_get_command_result(self):
274300 data = response .json
275301 self .assertEqual (serialized_cmd_result , data )
276302
303+ def test_get_command_with_token (self ):
304+ agent_token = str ('0123456789' * 10 )
305+ cmd_result = base .SyncCommandResult ('do_things' ,
306+ {'key' : 'value' },
307+ True ,
308+ {'test' : 'result' })
309+ self .mock_agent .get_command_result .return_value = cmd_result
310+ self .mock_agent .validate_agent_token .return_value = True
311+
312+ response = self .get_json (
313+ '/commands/abc123?agent_token=%s' % agent_token )
314+
315+ self .assertEqual (200 , response .status_code )
316+ self .assertEqual (cmd_result .serialize (), response .json )
317+ self .assertEqual (1 , self .mock_agent .validate_agent_token .call_count )
318+ self .assertEqual (1 , self .mock_agent .get_command_result .call_count )
319+
320+ def test_get_command_with_token_invalid (self ):
321+ agent_token = str ('0123456789' * 10 )
322+ self .mock_agent .validate_agent_token .return_value = False
323+
324+ response = self .get_json (
325+ '/commands/abc123?agent_token=%s' % agent_token ,
326+ expect_errors = True )
327+
328+ self .assertEqual (401 , response .status_code )
329+ self .assertEqual (1 , self .mock_agent .validate_agent_token .call_count )
330+ self .assertEqual (0 , self .mock_agent .get_command_result .call_count )
331+
332+ def test_get_command_locks_out_with_token (self ):
333+ """Tests agent backwards compatibility and verifies upgrade lockout."""
334+ cmd_result = base .SyncCommandResult ('do_things' ,
335+ {'key' : 'value' },
336+ True ,
337+ {'test' : 'result' })
338+ cmd_result .serialize ()
339+ self .mock_agent .get_command_result .return_value = cmd_result
340+ agent_token = str ('0123456789' * 10 )
341+ self .mock_agent .validate_agent_token .return_value = False
342+
343+ # Backwards compatible operation check.
344+ response = self .get_json (
345+ '/commands/abc123' )
346+ self .assertEqual (200 , response .status_code )
347+ self .assertFalse (self .app .security_get_token_support )
348+ self .assertEqual (1 , self .mock_agent .get_command_result .call_count )
349+ self .mock_agent .reset_mock ()
350+
351+ # Check with a newer ironic sending an agent_token upon the command.
352+ # For context, in this case the token is wrong intentionally.
353+ # It doesn't have to be right, but what we're testing is the
354+ # submission of any value triggers the lockout
355+ response = self .get_json (
356+ '/commands/abc123?agent_token=%s' % agent_token ,
357+ expect_errors = True )
358+ self .assertTrue (self .app .security_get_token_support )
359+ self .assertEqual (401 , response .status_code )
360+ self .assertEqual (1 , self .mock_agent .validate_agent_token .call_count )
361+ self .assertEqual (0 , self .mock_agent .get_command_result .call_count )
362+
363+ # Verifying the lockout is now being enforced and that agent token
364+ # is now required by the agent.
365+ response = self .get_json (
366+ '/commands/abc123' , expect_errors = True )
367+ self .assertTrue (self .app .security_get_token_support )
368+ self .assertEqual (401 , response .status_code )
369+ self .assertEqual (0 , self .mock_agent .get_command_result .call_count )
370+ # Verify we still called validate_agent_token
371+ self .assertEqual (2 , self .mock_agent .validate_agent_token .call_count )
372+
277373 def test_execute_agent_command_with_token (self ):
278374 agent_token = str ('0123456789' * 10 )
279375 command = {
0 commit comments