def test_with_authfile(self, mock_pull): mock_pull.return_value = { "config": { "name": "name.conf", "data": "config" }, "authfile": { "name": "name.key", "data": base64.b64encode("key".encode("utf-8")).decode("utf-8") } } commands.pull_config(self.mock_env, "node", "name") mock_pull.assert_called_once_with(self.mock_com, NodeAddresses("node"), "name") self.mock_env.booth.create_config.called_once_with("config", True) self.mock_env.booth.set_key_path.called_once_with( os.path.join(settings.booth_config_dir, "name.key")) self.mock_env.booth.create_key.called_once_with( "key".encode("utf-8"), True) assert_report_item_list_equal( self.mock_rep.report_item_list, [(Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" }), (Severities.INFO, report_codes.BOOTH_CONFIG_ACCEPTED_BY_NODE, { "node": None, "name_list": ["name"] })])
def test_success(self, pwd_mock, grp_mock): self._set_pwd_mock(pwd_mock) self._set_grp_mock(grp_mock) commands.pull_config(self.env_assist.get_env(), self.node_name) self.env_assist.assert_reports(self.report_list)
def test_success_config_and_authfile_exists(self, pwd_mock, grp_mock): self._set_pwd_mock(pwd_mock) self._set_grp_mock(grp_mock) (self.config .fs.exists(self.config_path, True, instead="fs.exists") .fs.exists( self.authfile_path, True, name="fs.exists.authfile", instead="fs.exists.authfile", ) ) commands.pull_config(self.env_assist.get_env(), self.node_name) self.env_assist.assert_reports( self.report_list + [ fixture.warn( report_codes.FILE_ALREADY_EXISTS, node=None, file_role=role, file_path=path, ) for role, path in [ (file_roles.BOOTH_CONFIG, self.config_path), (file_roles.BOOTH_KEY, self.authfile_path) ] ] )
def test_without_authfile(self, mock_pull): mock_pull.return_value = { "config": { "name": "name.conf", "data": "config" }, "authfile": { "name": None, "data": None } } commands.pull_config(self.mock_env, "node", "name") mock_pull.assert_called_once_with(self.mock_com, NodeAddresses("node"), "name") self.mock_env.booth.create_config.called_once_with("config", True) self.assertEqual(0, self.mock_env.booth.set_key_path.call_count) self.assertEqual(0, self.mock_env.booth.create_key.call_count) assert_report_item_list_equal( self.mock_rep.report_item_list, [(Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" }), (Severities.INFO, report_codes.BOOTH_CONFIG_ACCEPTED_BY_NODE, { "node": None, "name_list": ["name"] })])
def test_success_config_exists(self): self.config.fs.exists(self.config_path, True, instead="fs.exists") commands.pull_config(self.env_assist.get_env(), self.node_name) self.env_assist.assert_reports(self.report_list + [ fixture.warn( report_codes.FILE_ALREADY_EXISTS, node=None, file_role=file_roles.BOOTH_CONFIG, file_path=self.config_path, ), ])
def test_network_request_failure(self): self.config.http.booth.get_config( self.name, communication_list=[dict( label=self.node_name, response_code=400, output=self.reason, )] ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.NODE_COMMUNICATION_COMMAND_UNSUCCESSFUL, force_code=None, node=self.node_name, command="remote/booth_get_config", reason=self.reason, ), ])
def test_network_failure(self): self.config.http.booth.get_config( self.name, communication_list=[dict( label=self.node_name, was_connected=False, errno=1, error_msg=self.reason, )] ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.NODE_COMMUNICATION_ERROR_UNABLE_TO_CONNECT, force_code=None, node=self.node_name, command="remote/booth_get_config", reason=self.reason, ), ])
def test_write_failure(self): (self.config .http.booth.get_config( self.name, self.config_data, node_labels=[self.node_name] ) .fs.exists(self.config_path, False) .fs.open( self.config_path, mode="w", side_effect=EnvironmentError(0, self.reason, self.config_path), ) ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.config_path), file_role=file_roles.BOOTH_CONFIG, file_path=self.config_path, operation="write", ) ], expected_in_processor=False, ) self.env_assist.assert_reports(self.report_list[:1])
def test_unable_to_set_authfile_uid_gid(self, pwd_mock, grp_mock): self._set_pwd_mock(pwd_mock) self._set_grp_mock(grp_mock) (self.config .fs.open( self.authfile_path, self.booth_authfile_open_mock, mode="wb", name="fs.open.authfile.write" ) .fs.chown( self.authfile_path, self.pcmk_uid, self.pcmk_gid, side_effect=EnvironmentError(1, self.reason, self.authfile_path) ) ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.authfile_path), file_role=file_roles.BOOTH_KEY, file_path=self.authfile_path, operation="chown", ) ], expected_in_processor=False, ) self.assert_authfile_written() self.env_assist.assert_reports(self.report_list[:1])
def test_invalid_input(self, mock_pull): mock_pull.return_value = {} assert_raise_library_error( lambda: commands.pull_config(self.mock_env, "node", "name"), ( Severities.ERROR, report_codes.INVALID_RESPONSE_FORMAT, {"node": "node"} ) ) mock_pull.assert_called_once_with( self.mock_com, NodeAddresses("node"), "name" ) self.assertEqual(0, self.mock_env.booth.create_config.call_count) self.assertEqual(0, self.mock_env.booth.set_key_path.call_count) self.assertEqual(0, self.mock_env.booth.create_key.call_count) assert_report_item_list_equal( self.mock_rep.report_item_list, [( Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" } )] )
def test_unable_to_set_authfile_mode(self, pwd_mock, grp_mock): self._set_pwd_mock(pwd_mock) self._set_grp_mock(grp_mock) (self.config.fs.open(self.authfile_path, self.booth_authfile_open_mock, mode="wb", name="fs.open.authfile.write").fs.chown( self.authfile_path, self.pcmk_uid, self.pcmk_gid, ).fs.chmod(self.authfile_path, settings.booth_authkey_file_mode, side_effect=EnvironmentError( 1, self.reason, self.authfile_path))) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.authfile_path), file_role=file_roles.BOOTH_KEY, file_path=self.authfile_path, operation="chmod", ) ], expected_in_processor=False, ) self.assert_authfile_written() self.env_assist.assert_reports(self.report_list[:1])
def test_network_request_failure(self): self.config.http.booth.get_config(self.name, communication_list=[ dict( label=self.node_name, response_code=400, output=self.reason, ) ]) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.NODE_COMMUNICATION_COMMAND_UNSUCCESSFUL, force_code=None, node=self.node_name, command="remote/booth_get_config", reason=self.reason, ), ])
def test_write_failure(self): (self.config.http.booth.get_config( self.name, self.config_data, node_labels=[self.node_name]).fs.exists( self.config_path, False).fs.open( self.config_path, mode="w", side_effect=EnvironmentError(0, self.reason, self.config_path), )) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.config_path), file_role=file_roles.BOOTH_CONFIG, file_path=self.config_path, operation="write", ) ], expected_in_processor=False, ) self.env_assist.assert_reports(self.report_list[:1])
def test_network_failure(self): self.config.http.booth.get_config(self.name, communication_list=[ dict( label=self.node_name, was_connected=False, errno=1, error_msg=self.reason, ) ]) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.NODE_COMMUNICATION_ERROR_UNABLE_TO_CONNECT, force_code=None, node=self.node_name, command="remote/booth_get_config", reason=self.reason, ), ])
def test_unable_to_get_gid(self, pwd_mock, grp_mock): self._set_pwd_mock(pwd_mock) grp_mock.side_effect = KeyError() self.config.fs.open( self.authfile_path, self.booth_authfile_open_mock, mode="wb", name="fs.open.authfile.write" ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [ fixture.error( report_codes.UNABLE_TO_DETERMINE_GROUP_GID, group=settings.pacemaker_gname, ) ], expected_in_processor=False, ) self.assert_authfile_written() grp_mock.assert_called_once_with(settings.pacemaker_gname) self.env_assist.assert_reports(self.report_list[:1])
def test_success_config_exists(self): self.config.fs.exists(self.config_path, True, instead="fs.exists") commands.pull_config(self.env_assist.get_env(), self.node_name) self.env_assist.assert_reports( self.report_list + [ fixture.warn( report_codes.FILE_ALREADY_EXISTS, node=None, file_role=file_roles.BOOTH_CONFIG, file_path=self.config_path, ), ] )
def test_with_authfile(self, mock_pull): mock_pull.return_value = { "config": { "name": "name.conf", "data": "config" }, "authfile": { "name": "name.key", "data": base64.b64encode("key".encode("utf-8")).decode("utf-8") } } commands.pull_config(self.mock_env, "node", "name") mock_pull.assert_called_once_with( self.mock_com, NodeAddresses("node"), "name" ) self.mock_env.booth.create_config.called_once_with("config", True) self.mock_env.booth.set_key_path.called_once_with(os.path.join( settings.booth_config_dir, "name.key" )) self.mock_env.booth.create_key.called_once_with( "key".encode("utf-8"), True ) assert_report_item_list_equal( self.mock_rep.report_item_list, [ ( Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" } ), ( Severities.INFO, report_codes.BOOTH_CONFIG_ACCEPTED_BY_NODE, { "node": None, "name": "name", "name_list": ["name"] } ) ] )
def test_without_authfile(self, mock_pull): mock_pull.return_value = { "config": { "name": "name.conf", "data": "config" }, "authfile": { "name": None, "data": None } } commands.pull_config(self.mock_env, "node", "name") mock_pull.assert_called_once_with( self.mock_com, NodeAddresses("node"), "name" ) self.mock_env.booth.create_config.called_once_with("config", True) self.assertEqual(0, self.mock_env.booth.set_key_path.call_count) self.assertEqual(0, self.mock_env.booth.create_key.call_count) assert_report_item_list_equal( self.mock_rep.report_item_list, [ ( Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" } ), ( Severities.INFO, report_codes.BOOTH_CONFIG_ACCEPTED_BY_NODE, { "node": None, "name": "name", "name_list": ["name"] } ) ] )
def test_invalid_input(self, mock_pull): mock_pull.return_value = {} assert_raise_library_error( lambda: commands.pull_config(self.mock_env, "node", "name"), (Severities.ERROR, report_codes.INVALID_RESPONSE_FORMAT, { "node": "node" })) mock_pull.assert_called_once_with(self.mock_com, NodeAddresses("node"), "name") self.assertEqual(0, self.mock_env.booth.create_config.call_count) self.assertEqual(0, self.mock_env.booth.set_key_path.call_count) self.assertEqual(0, self.mock_env.booth.create_key.call_count) assert_report_item_list_equal( self.mock_rep.report_item_list, [(Severities.INFO, report_codes.BOOTH_FETCHING_CONFIG_FROM_NODE, { "node": "node", "config": "name" })])
def test_authfile_write_failure(self, pwd_mock, grp_mock): self.config.fs.open(self.authfile_path, mode="wb", name="fs.open.authfile.write", side_effect=EnvironmentError( 1, self.reason, self.authfile_path)) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.authfile_path), file_role=file_roles.BOOTH_KEY, file_path=self.authfile_path, operation="write", ) ], expected_in_processor=False, ) self.env_assist.assert_reports(self.report_list[:1])
def test_request_response_missing_keys(self): self.config.http.booth.get_config(self.name, communication_list=[ dict( label=self.node_name, output="{'config':{}}", ) ]) self.env_assist.assert_raise_library_error( lambda: commands.pull_config(self.env_assist.get_env(), self. node_name), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.INVALID_RESPONSE_FORMAT, node=self.node_name, ), ])
def test_request_response_missing_keys(self): self.config.http.booth.get_config( self.name, communication_list=[dict( label=self.node_name, output="{'config':{}}", )] ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [], ) self.env_assist.assert_reports([ self.report_list[0], fixture.error( report_codes.INVALID_RESPONSE_FORMAT, node=self.node_name, ), ])
def test_authfile_write_failure(self, pwd_mock, grp_mock): self.config.fs.open( self.authfile_path, mode="wb", name="fs.open.authfile.write", side_effect=EnvironmentError(1, self.reason, self.authfile_path) ) self.env_assist.assert_raise_library_error( lambda: commands.pull_config( self.env_assist.get_env(), self.node_name ), [ fixture.error( report_codes.FILE_IO_ERROR, reason="{}: '{}'".format(self.reason, self.authfile_path), file_role=file_roles.BOOTH_KEY, file_path=self.authfile_path, operation="write", ) ], expected_in_processor=False, ) self.env_assist.assert_reports(self.report_list[:1])
def test_success(self): commands.pull_config(self.env_assist.get_env(), self.node_name) self.env_assist.assert_reports(self.report_list)