Holmes was sent off for a high tackle on Juan Imhoff midway through the first half with his side trailing 10-7, but tries from Maxime Medard and Antoine Dupont, his second of the game, gave Toulouse the upper hand.
Maxime Machenaud reduced the gap to three points with two penalties in the second half and although a penalty from Thomas Ramos gave Toulouse a 22-16 lead, the home side had a chance to snatch victory when Camille Chat went over in the corner.
However, Machenaud could not land the difficult conversion and the home side also had a try from Virimi Vakatawa disallowed in the closing minutes after he was penalised for an infringement at the lineout.
? YOUR SEMI-FINALISTS ?
Comment below what the final will be ??? pic.twitter.com/QJXoZTnniy
— Heineken Champions Cup (@ChampionsCup) March 31, 2019
Watch the Heineken Champions Cup Final live on RugbyPass throughout Asia and Australia.