Adaptation in Edge Computing: A review on design principles and research challenges