## 1 Introduction
### Background  
Network Function Virtualization [5] is one of the most innovative manifestations of virtualization in networking enabling network functions and capabilities to be implemented as software components and executed in virtual machines or containers provisioned in general-purpose hardware systems, _i.e._, VNFs. Thanks to a more agile lifecycle management of virtual machines, VNFs can be instantiated, updated, deleted when and where needed, as well as dynamically combined to provide more complex capabilities on demand. This allows for a strong reduction of capacity over-provisioning and for an opportunistic deployment and/or re-arrangement of VNFs to be performed, thus optimizing the usage of the underlying resource infrastructure toward different management targets (e.g., consolidated or balanced usage of physical servers, proximity to users).  
Software-Defined Networking [4] is a new approach to the design, building, and management of networks. Basically, SDN decouples the software-based control plane (e.g., routing decision functions) from the hardware-based data plane (_i.e._, packet forwarding engine) while abstracting the underlying network infrastructure and moving the network intelligence to a centralized software-based controller where network services, such as traffic engineering and path provisioning, are deployed. Such separation allows for a more agile and cost-effective network operation thanks to full programmability of forwarding capabilities and enhanced decision-making capabilities based on a global view of the network status. As a result, SDN opens the way toward a more effective interaction between applications and networks for the establishment of data delivery paths while addressing resource usage optimization and reducing the complexity of the network operation [4].  
Service Oriented Architecture [8] is an architectural paradigm for the interoperability of heterogeneous systems from different administrative domains. Basically, service orientation principles define how resources and capabilities can be handled as independent services that can be flexibly and dynamically composed to provide more complex functionalities and address dynamic requirements. A service can be defined as a component that performs a simple, granular, and self-contained function that can be invoked by external clients through well-defined interfaces.  
[PERSON] [8] proposed the following main principles for service oriented design: service contract, loose coupling, service abstraction, service reusability, and service composability. The service contract expresses the capabilities offered by services and their technical interface details. The loose coupling principle emphasizes the need for reducing dependencies among the service implementation, its published contract, and service consumers. Service abstraction is a cross-cutting aspect of service-orientation that consists in hiding as much as possible the low-level details of a service interface and implementation. Service Reusability implies that services should be designed for serving more than one consumer. The Service Composability principle expresses the need for services that can be used as building blocks of more complex services (_i.e._, composite services).  
A SOA is typically characterized by three main roles: (i) the Service Provider makes the service available and publishes its description profile (contract) in a service registry handled by a Service Broker; (ii) the Service Consumer uses the service; and (iii) the Service Broker mediates the interactions between Service Providers and Consumers by offering discovery, matchmaking, and composition capabilities.