Chennai Super Kings set up an all-Indian Premier League semi-final against Royal Challengers Bangalore in the Champions League Twenty20 after a tense 10-run victory over the Warriors.
The Warriors, the South African Pro20 champions, also qualified for the final four but will be disappointed not to have won a low-scoring encounter in Port Elizabeth.
After losing the toss and being sent in to field, the Warriors managed to restrict the visitors to 136 for six, thanks largely to Justin Kreusch (three for 19). Michael Hussey (50) top-scored for Chennai.
But the Warriors failed to close out the victory on a sluggish pitch where captain Davey Jacobs top-scored in a losing cause.
Batting first, the IPL champions made a promising start with Murali Vijay and Hussey putting on 63 for the first wicket inside nine overs.
The breakthrough came when Kreusch went straight through the defences of the India opener for 35.
Another promising Indian batsman, the in-form Suresh Raina (six), seemed to be struggling and Colin Ingram put him out of his misery with a spectacular forward diving catch on the boundary.
Two more quick wickets then fell, including that of Hussey shortly after he brought up his 50 from 38 balls, as the Super Kings stuttered to 99 for four with five overs remaining.
Thanks largely to the batting of captain Mahendra Singh Dhoni (31 not out), Chennai went on to set a victory target of 137.
Ashwell Prince (nine) fell early in the Warriors' run chase thanks to Justin Kemp's good reflexes at slip.
Jacobs and Ingram kept the hosts in the hunt until the skipper went for 32, while Ingram (17) quickly followed as the Warriors slipped to 63 for three.
Kreusch and Mark Boucher ensured the Warriors would safely pass the 109-run mark that guaranteed qualification for the semi-final by putting on a 44-run stand.
They each fell on 25 in the 18th over bowled by Ravichandran Ashwin (three for 24) as the hosts came up short, but did at least claim the consolation of a clash with South Australia in the next stage.