Add vSphere support

This method is huge and hard to maintain. It does many things and can't manage all possible errors properly. Refactor it in small (and ideally reusable) pieces that do concrete work.