def test_update_required(self): self.f.insert_into_change_example(['do_syncs', '5'], [42, 'four'], [8, 16, 'bar']) set_module_args(login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='change_example', identifiers=dict(setting_name='do_syncs', setting_group_id='5'), values=dict(value1='43', value2='five'), defaults=dict(default1=9, default2='miow', bogus='foo')) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertRegexpMatches(result['msg'], 'Successfully updated') self.assertEquals(self.f.count_change_example(), 1, 'no additional row has been inserted') row = self.f.query_change_example('do_syncs', '5') self.assertItemsEqual((43, 'five'), row[3:5], 'values have been updated') self.assertItemsEqual((8, 16, 'bar'), row[5:8], 'defaults have not been changed')
def test_main_failure_exhaust_retries_traits_not_matched(self): resources = get_dummy_resources(traits=["WE_NEED_THIS"]) dummy_module_arguments = get_dummy_module_args(resources=resources) set_module_args(dummy_module_arguments) expected_msg = wait_for._RETRY_LIMIT_FAILURE_TEMPLATE.format( max_retries=dummy_module_arguments["maximum_retries"]) self.assertRaisesRegex(AnsibleFailJson, expected_msg, wait_for.main)
def test_insert_required(self): set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='change_example', identifiers=dict(setting_name='do_backups', setting_group_id='4', ), values=dict(value1=8, value2='fifteen'), defaults=dict(default1=16, default3='thirty-two'), ) self.assertEquals(self.f.count_change_example(), 0, 'no row in table before running the module') with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertTrue(result['changed'], 'the database has been changed') self.assertEquals(self.f.count_change_example(), 1, 'a row has been inserted') row = self.f.query_change_example('do_backups', 4) six.assertCountEqual(self, (8, 'fifteen'), row[3:5], 'values were inserted') six.assertCountEqual(self, (16, 42, 'thirty-two'), row[5:8], 'row has been inserted with default values')
def test_validation_amount_not_int(self): dummy_module_arguments = get_dummy_module_args( # amount should be an int resources=get_dummy_resources(amount="not_a_number")) set_module_args(dummy_module_arguments) expected_msg = "amount, should be type int" self.assertRaisesRegex(AnsibleFailJson, expected_msg, wait_for.main)
def test_main_failure_provider_does_not_provide_all_traits(self): expected_traits = list(resource_provider_traits) resources = get_dummy_resources(traits=expected_traits) dummy_module_arguments = get_dummy_module_args(resources=resources, ) set_module_args(dummy_module_arguments) expected_msg = wait_for._RETRY_LIMIT_FAILURE_TEMPLATE.format( max_retries=dummy_module_arguments["maximum_retries"]) self.assertRaisesRegex(AnsibleFailJson, expected_msg, wait_for.main)
def test_venv_path(self): dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) set_module_args(dummy_module_arguments) module = wait_for.get_module() openstack_binary_path = get_openstack_binary_path(module) venv = dummy_module_arguments["venv"] expected = os.path.join(venv, "bin", "openstack") self.assertEqual(expected, openstack_binary_path)
def test_main_failure_request_subset_of_traits(self): # pick an arbitrary sub range of traits expected_traits = list(resource_provider_traits)[3:6] resources = get_dummy_resources(traits=expected_traits) dummy_module_arguments = get_dummy_module_args(resources=resources, ) set_module_args(dummy_module_arguments) expected_msg = wait_for._RETRY_LIMIT_FAILURE_TEMPLATE.format( max_retries=dummy_module_arguments["maximum_retries"]) self.assertRaisesRegex(AnsibleFailJson, expected_msg, wait_for.main)
def test_validation_amount_missing(self): resources = get_dummy_resources() for resource in resources: del resource["amount"] dummy_module_arguments = get_dummy_module_args(resources=resources) set_module_args(dummy_module_arguments) expected_msg = ( "One of your resources does not have the field, amount, set") self.assertRaisesRegex(AnsibleFailJson, expected_msg, wait_for.main)
def test_main_success_one_iteration(self): dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) set_module_args(dummy_module_arguments) with self.assertRaises(AnsibleExitJson) as cm: wait_for.main() exception = cm.exception self.assertFalse(exception.args[0]['changed']) self.assertEqual(1, exception.args[0]["iterations"])
def test_venv_path_unset(self): dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) args = copy.copy(dummy_module_arguments) del args["venv"] set_module_args(args) module = wait_for.get_module() openstack_binary_path = get_openstack_binary_path(module) expected = "openstack" self.assertEqual(expected, openstack_binary_path)
def test_fail_for_empty_values(self): set_module_args( login_user='******', name='ansible-mysql-query-test', table='key_value_example', ) with self.assertRaises(AnsibleFailJson) as e: self.module.main() result = e.exception.args[0] self.assertTrue(result['failed']) self.assertEqual(result['msg'], 'missing required arguments: identifiers')
def test_validation_amount_is_str_repr_of_int(self): dummy_module_arguments = get_dummy_module_args( # amount should be an int resources=get_dummy_resources(amount="3")) set_module_args(dummy_module_arguments) try: wait_for.main() except AnsibleExitJson as result: self.assertFalse(result.args[0]['changed']) self.assertEqual(1, result.args[0]["iterations"]) else: self.fail("Should have thrown AnsibleExitJson")
def test_success_resource_class_reserved(self): # resource class is reserved on the first iteration dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) set_module_args(dummy_module_arguments) try: wait_for.main() except AnsibleExitJson as result: self.assertFalse(result.args[0]['changed']) self.assertEqual(2, result.args[0]["iterations"]) else: self.fail("Should have thrown AnsibleExitJson")
def test_main_success_no_traits(self): # if the resource provider doesn't have any traits and no traits # were requested, this should still pass dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) set_module_args(dummy_module_arguments) try: wait_for.main() except AnsibleExitJson as result: self.assertFalse(result.args[0]['changed']) self.assertEqual(1, result.args[0]["iterations"]) else: self.fail("Should have thrown AnsibleExitJson")
def test_success_first_iteration_wrong_resource_class(self): # different resource class to the one we are looking for on first # iteration dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) set_module_args(dummy_module_arguments) try: wait_for.main() except AnsibleExitJson as result: self.assertFalse(result.args[0]['changed']) self.assertEqual(2, result.args[0]["iterations"]) else: self.fail("Should have thrown AnsibleExitJson")
def test_resource_provider_list(self, run_command): dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) run_command.return_value = 0, resource_provider_list_out, '' set_module_args(dummy_module_arguments) module = wait_for.get_module() providers = get_providers(module) calls = [ call for call in run_command.call_args_list if "openstack resource provider list" in call[0][0] ] self.assertGreater(len(calls), 0) self.assertListEqual(resource_provider_list, providers)
def test_traits(self, run_command): dummy_module_arguments = get_dummy_module_args( resources=dummy_resources) run_command.return_value = 0, resource_provider_traits_out, '' set_module_args(dummy_module_arguments) module = wait_for.get_module() expected = get_traits(module, "provider-uuid") calls = [ call for call in run_command.call_args_list if "openstack resource provider trait list" in call[0][0] ] self.assertGreater(len(calls), 0) self.assertSetEqual(expected, resource_provider_traits)
def test_main_success_same_resource_class_different_traits(self): resource_a = get_dummy_resources( traits=list(resource_provider_traits_subset), amount=1) resource_b = get_dummy_resources(traits=list(resource_provider_traits), amount=1) dummy_module_arguments = get_dummy_module_args(resources=resource_a + resource_b, ) set_module_args(dummy_module_arguments) try: wait_for.main() except AnsibleExitJson as result: self.assertFalse(result.args[0]['changed']) self.assertEqual(1, result.args[0]["iterations"]) else: self.fail("Should have thrown AnsibleExitJson")
def test_fail_for_table_missing(self): set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='does_not_exist_table', identifiers=dict(not_relevant='bogus'), values=dict(not_relevant2='bogus'), ) with self.assertRaises(AnsibleFailJson) as e: self.module.main() result = e.exception.args[0] self.assertTrue(result['failed']) self.assertEqual(result['msg'], 'No such table `does_not_exist_table`')
def test_insert_required(self): set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='multicolumn_example', identifiers=dict(identifier1='*****@*****.**', identifier2='4', identifier3='testInsert'), values=dict(value1='8', value2='admin', value3="made up"), _ansible_check_mode=True, ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertTrue(result['changed'], 'a required change is detected') self.assertRegexpMatches(result['msg'], 'insert') self.assertEquals(self.f.count_multicolumn_example(), 0, 'no row has been inserted in check-mode')
def test_insert_required(self): set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='key_value_example', identifiers=dict(name='testInsertRequired_myKey'), values=dict(value='42'), _ansible_check_mode=True, ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertTrue(result['changed'], 'a required change is detected') self.assertRegexpMatches(result['msg'], 'insert') self.assertEquals(self.f.count_key_value_example(), 0, 'no row has been inserted in check-mode')
def test_delete_required(self): self.f.insert_into_change_example(['do_syncs', '5'], [42, 'four'], [8, 16, 'bar']) set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='change_example', identifiers=dict(setting_name='do_syncs', setting_group_id='5'), state='absent' ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertRegexpMatches(result['msg'], 'Successfully deleted') self.assertEquals(self.f.count_change_example(), 0, 'all rows have been deleted')
def test_no_change_required(self): # insert a row that does not need to be updated self.f.insert_into_key_value_example('testNoChangeRequired_myKey', 42) set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='key_value_example', identifiers=dict(name='testNoChangeRequired_myKey'), values=dict(value='42'), ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertFalse(result['changed'], 'no changed required is detected') self.assertEquals(self.f.count_key_value_example(), 1, 'no additional row has been inserted in check-mode')
def test_change_detection_for_digits_in_strings(self): # insert a row that does not need to be updated self.f.insert_into_multicolumn_example(['*****@*****.**', 4, '5'], [8, '15', '16']) set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='multicolumn_example', identifiers=dict(identifier1='*****@*****.**', identifier2='4', identifier3='5'), values={'value1': '8', 'value2': '15', 'value3': "16"}, ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertFalse(result['changed'], 'no changed required is detected') self.assertEquals(self.f.count_multicolumn_example(), 1, 'no additional row has been inserted in check-mode')
def test_delete_required(self): # insert a row that need to deleted. self.f.insert_into_key_value_example('testDeleteRequired_myKey', 6) set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='key_value_example', identifiers=dict(name='testDeleteRequired_myKey'), state='absent', _ansible_check_mode=True, ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertTrue(result['changed'], 'a required change is detected') self.assertRegexpMatches(result['msg'], 'delete') self.assertEquals(self.f.count_key_value_example(), 1, 'no row has been deleted in check-mode')
def test_no_change_required_in_no_check_mode(self): """ this is the case if no change is required, but we're not in check mode. :return: """ self.f.insert_into_change_example(['no change required', 3], [1, 'one'], [1, 2, 'three']) set_module_args( login_user=MYSQL_CONNECTION_PARAMS['user'], name=MYSQL_CONNECTION_PARAMS['db'], login_password=MYSQL_CONNECTION_PARAMS['passwd'], login_host=MYSQL_CONNECTION_PARAMS['host'], table='change_example', identifiers=dict(setting_name='no change required', setting_group_id=3), values=dict(value1=1, value2='one') ) with self.assertRaises(AnsibleExitJson) as e: self.module.main() result = e.exception.args[0] self.assertIn('changed', result) self.assertFalse(result['changed'])