The game finished goalless after 120 minutes, but the home side held their nerve in the shootout to emerge victorious on a very rainy night.
Lefa Tsutsulupa went close in the opening minute with a shot towards the near post, but Shu-Aib Walters did enough to save the danger.
Peter Petersen almost scored an own-goal on 15 minutes, and the home side can thank Walters for a very good save in the 21st minute when he stopped Katlego Mashego from scoring an excellent goal.
In the 37th minute Cuthbert Malajila got his head onto a cross, but could not get direction or power on his header.
Swallows came close in the 62nd minute when Lerato Chabangu and Mashego combined, but the ball slipped away from Mashego just when it mattered most.
A minute later Mashego got into space down the left channel and on the edge of the danger area he pulled the trigger, only to mis-time his shot.
In the 73rd minute the impressive Philani Zulu picked up a loose ball outside the area and fired in a shot, but it was partially blocked and deflected out for a corner.
The game needed penalties to decide a winner after the teams ran out of ideas in the final third of the field, and Luvengo Mngomeni missed the decisive spot-kick.