def test_module_bootstrap_node_no_wait(self, mock_bootstrap_init, mock_post): def mock_post_v1_bootstrap(): return { 'id': 0, 'status': 'IN_PROGRESS' } node_config = {} node_config['1'] = '10.255.1.10' set_module_args({ 'cluster_name': 'cluster_name', 'admin_email': '*****@*****.**', 'admin_password': '******', 'node_ip': 'rubrikbootstrap.local', 'node_config': node_config, 'management_gateway': '10.255.1.1', 'management_subnet_mask': '255.255.255.0', 'username': '******', 'api_token': 'vkys219gn2jziReqdPJH0asGM3PKEQHP', 'wait_for_completion': False }) mock_bootstrap_init.return_value = None mock_bootstrap_init.ipv6_addr = 'ffd2::1' mock_bootstrap_init.ipv6_scope = '0' mock_bootstrap_init.node_ip = 'ffd2::1%0' mock_post.return_value = mock_post_v1_bootstrap() with self.assertRaises(AnsibleExitJson) as result: rubrik_bootstrap.main() self.assertEqual(result.exception.args[0]['changed'], False) self.assertEqual(result.exception.args[0]['response']['status'], 'IN_PROGRESS')
def test_module_bootstrap_idempotency(self, mock_bootstrap_init, mock_post): def mock_post_v1_exception(): return APICallException('Cannot bootstrap from an already bootstrapped node') node_config = {} node_config['1'] = '10.255.1.10' set_module_args({ 'cluster_name': 'cluster_name', 'admin_email': '*****@*****.**', 'admin_password': '******', 'node_ip': 'rubrikbootstrap.local', 'node_config': node_config, 'management_gateway': '10.255.1.1', 'management_subnet_mask': '255.255.255.0', 'username': '******', 'api_token': 'vkys219gn2jziReqdPJH0asGM3PKEQHP', 'wait_for_completion': False }) mock_bootstrap_init.return_value = None mock_bootstrap_init.ipv6_addr = 'ffd2::1' mock_bootstrap_init.ipv6_scope = '0' mock_bootstrap_init.node_ip = 'ffd2::1%0' mock_post.side_effect = mock_post_v1_exception() with self.assertRaises(AnsibleExitJson) as result: rubrik_bootstrap.main() self.assertEqual(result.exception.args[0]['changed'], False) self.assertEqual(result.exception.args[0]['response'], 'No change required. The Rubrik cluster is already bootstrapped.')
def test_module_fail_resolution_failure(self, mock_post, mock_getaddrinfo): def mock_getaddrinfo_failure(): return gaierror('Could not resolve link-local IPv6 address for cluster.') node_config = {} node_config['1'] = 'badhost.local' set_module_args({ 'cluster_name': 'cluster_name', 'admin_email': '*****@*****.**', 'admin_password': '******', 'node_ip': 'rubrikbootstrap.local', 'node_config': node_config, 'management_gateway': '10.255.1.1', 'management_subnet_mask': '255.255.255.0', 'username': '******', 'api_token': 'vkys219gn2jziReqdPJH0asGM3PKEQHP', }) mock_getaddrinfo.side_effect = mock_getaddrinfo_failure() with self.assertRaises(AnsibleFailJson) as result: rubrik_bootstrap.main() self.assertEqual(result.exception.args[0]['failed'], True) self.assertEqual(result.exception.args[0]['msg'], 'Error: Could not resolve addrsss for cluster, or invalid IP/address supplied')
def test_module_fail_with_malformed_node_config(self): set_module_args({ 'cluster_name': 'cluster_name', 'admin_email': '*****@*****.**', 'admin_password': '******', 'node_ip': 'rubrikbootstrap.local', 'node_config': 'foo', 'management_gateway': '10.255.1.1', 'management_subnet_mask': '255.255.255.0', 'username': '******', 'api_token': 'vkys219gn2jziReqdPJH0asGM3PKEQHP' }) with self.assertRaises(AnsibleFailJson) as result: rubrik_bootstrap.main() self.assertEqual(result.exception.args[0]['failed'], True) self.assertEqual(result.exception.args[0]['msg'], "argument node_config is of type <class 'str'> and we were unable to convert to dict: dictionary requested, could not parse JSON or key=value")
def test_module_fail_when_required_args_missing(self): with self.assertRaises(AnsibleFailJson): set_module_args({}) rubrik_bootstrap.main()
def test_module_bootstrap_node_wait_for_completion(self, mock_bootstrap_init, mock_post, mock_get, mock_sleep): def mock_post_v1_bootstrap(): return { 'id': 0, 'status': 'IN_PROGRESS' } def mock_get_v1_bootstrap_status_1(): return { 'status': 'IN_PROGRESS', 'message': '', 'ipConfig': 'SUCCESS', 'cassandraSetup': 'SUCCESS', 'installSchema': 'SUCCESS', 'startServices': 'SUCCESS', 'ipmiConfig': 'SUCCESS', 'configAdminUser': '******', 'resetNodes': 'IN_PROGRESS', 'setupDisks': 'SUCCESS', 'setupEncryptionAtRest': 'SUCCESS', 'setupOsAndMetadataPartitions': 'SUCCESS', 'createTopLevelFilesystemDirs': 'SUCCESS', 'setupLoopDevices': 'SUCCESS', 'cockroachDbSetup': 'SUCCESS' } def mock_get_v1_bootstrap_status_2(): return { 'status': 'SUCCESS', 'message': '', 'ipConfig': 'SUCCESS', 'cassandraSetup': 'SUCCESS', 'installSchema': 'SUCCESS', 'startServices': 'SUCCESS', 'ipmiConfig': 'SUCCESS', 'configAdminUser': '******', 'resetNodes': 'SUCCESS', 'setupDisks': 'SUCCESS', 'setupEncryptionAtRest': 'SUCCESS', 'setupOsAndMetadataPartitions': 'SUCCESS', 'createTopLevelFilesystemDirs': 'SUCCESS', 'setupLoopDevices': 'SUCCESS', 'cockroachDbSetup': 'SUCCESS' } node_config = {} node_config['1'] = '10.255.1.10' set_module_args({ 'cluster_name': 'cluster_name', 'admin_email': '*****@*****.**', 'admin_password': '******', 'node_ip': 'rubrikbootstrap.local', 'node_config': node_config, 'management_gateway': '10.255.1.1', 'management_subnet_mask': '255.255.255.0', 'username': '******', 'api_token': 'vkys219gn2jziReqdPJH0asGM3PKEQHP', 'timeout': 1, 'wait_for_completion': True }) # Mock sleep function so test does not take 30 seconds to run mock_sleep.return_value = None mock_bootstrap_init.return_value = None mock_bootstrap_init.ipv6_addr = 'ffd2::1' mock_bootstrap_init.ipv6_scope = '0' mock_bootstrap_init.node_ip = 'ffd2::1%0' mock_post.return_value = mock_post_v1_bootstrap() mock_get.side_effect = [mock_get_v1_bootstrap_status_1(), mock_get_v1_bootstrap_status_2()] with self.assertRaises(AnsibleExitJson) as result: rubrik_bootstrap.main() self.assertEqual(result.exception.args[0]['changed'], False) self.assertEqual(result.exception.args[0]['response']['status'], 'SUCCESS')