Managing Distributed Cloud Applications and Infrastructure - A Self-Optimising Approach