Exemple #1
0
    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)
Exemple #11
0
    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")
Exemple #19
0
    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`')
Exemple #20
0
    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')
Exemple #21
0
    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')
Exemple #23
0
    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')
Exemple #24
0
    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')
Exemple #25
0
    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'])