diff --git a/.classpath b/.classpath
index 1f10fe78..0748fad6 100755
--- a/.classpath
+++ b/.classpath
@@ -10,6 +10,7 @@
+
@@ -89,5 +90,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
index 458b59af..97239c4e 100755
--- a/.project
+++ b/.project
@@ -41,12 +41,12 @@
- 1607762605873
+ 171525020541730org.eclipse.core.resources.regexFilterMatcher
- node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+ node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 00000000..bcde92ef
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,14 @@
+
+Copyright 2017-2024 Politecnico di Torino and others.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
index e8847898..c2c81662 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,35 @@
![](./resources/verefoo_icon.png)
-
+
+
+## VEREFOO Architecture
+### High Level Overview
+VEREFOO (VErified REFinement and Optimized Orchestrator) is a framework designed to automatically allocate and configure packet filtering firewalls in a service graph defined by the network administrator, so as to fulfill the user-specified security connectivity requirements. VEREFOO combines automation, formal verification and optimization by formulating the firewall configuration problem with constraint programming, as a Maximum Satisfiability Modulo Theories (MaxSMT) problem.
+
+### Input and Output
+
+The VEREFOO framework takes as inputs a Service Graph (SG) and a list of Network Security Requirements (NSR) that a SG should satisfy, like data reachability and isolation (data protection requirements are planned to be supported in future versions of VEREFOO). The input is in the form of a single XML file which contains both the SG and the NSRs. After receiving the SG and the NSRs, the
+automatic security enforcement problem is solved, which leads to two possible outcomes:
+* A positive output, provided as an XML configuration file, easily deployable into the virtual network, composed by:
+ * the allocation scheme of the distributed firewall
+instances in the SG, which specifies where a firewall instance has to be allocated;
+ * the Filtering Policy (FP) for each allocated firewall, which is a set of filtering rules that make up its configuration, expressed in a user-friendly abstract language.
+* A negative output in the form of a non-enforceability report, which you can use to guess why it has not been possible to enforce the NSRs.
+
+### Algorithms: AP & MF
+
+This version of VEREFOO is equipped with two algorithms: Maximal Flows (MF) and Atomic Predicates (AP), each of which is suitable for distinct use cases.
+
+The algorithm for the computation of Atomic Flows expresses each complex network predicate (e.g., a predicate
+representing a firewall rule, a NAT input packet class, or a
+security policy) as a subset of atomic predicates, which are disjoint to each other. The Atomic flows are thus computed so that each transmitted packet class is represented by an atomic predicate, representable by an integer number. This algorithm is suitable for scenarios where the automatic firewall configuration must be as fast as possible, even at the expense of a larger number of rules created.
+
+The algorithm for the computation of Maximal Flows maximizes the aggregation of flows. It groups all traffic flows that behave in the same way into a single Maximal Flow, so that it is sufficient to consider the Maximal Flow for solving the security configuration problem instead of all separate flows. This algorithm is suitable for scenarios where the minimum possible number of firewall rules must be computed, even if the MaxSMT problem resolution may take longer w.r.t using the AP algorithm, since each packet class cannot be associated with an integer value. It is also suitables for formally verifying the compliance of an already existing configuration with a set of user-specified secuirity requirements.
+
+### REACT Version
+REACT VEREFOO is a custom version of VEREFOO with additional support for the reconfiguration of packet filtering firewalls, so as to fulfill the user-specified security connectivity requirements. REACT VEREFOO maintains the core principles of VEREFOO (i.e., automation, formal correctness assurance, optimization) and adds the capability of reusing any previously computed configuration instead of forcing the reconfiguration of the whole network from scratch.
+
## VEREFOO Dependencies
@@ -10,6 +39,14 @@ The VEREFOO framework requires the following dependencies to correctly work:
* Apache Ant 1.10 (https://ant.apache.org/bindownload.cgi)
* Apache Maven 3.6 (https://maven.apache.org/download.cgi)
* Neo4j Community 3.5.25 (https://neo4j.com/download-center/)
+ * For Debian-based Linux distributions: [cypher-shell 1.1.15](https://github.com/neo4j/cypher-shell/releases/download/1.1.15/cypher-shell_1.1.15_all.deb)
+and [neo4j 3.5.25](https://go.neo4j.com/download-thanks.html?edition=community&release=3.5.25&flavour=deb) , followed by typing these two commands to install them on your machine
+ ```
+ sudo apt install ./cypher-shell_1.1.15_all.deb
+ sudo apt install ./neo4j_3.5.25_all.deb
+ ```
+
+
* Z3 4.8.8 (https://github.com/Z3Prover/z3/releases)
### Z3 library support
@@ -40,7 +77,6 @@ The VEREFOO framework can be installed in two alternative ways:
* `mvn clean package`
* `java -jar target/verifoo-0.0.1-SNAPSHOT.jar`
-The Swagger documentation can be accessed at [localhost:8085/VEREFOO](localhost:8085/VEREFOO).
### Installing VEREFOO via Ant (Apache Tomcat required) [Solution 2]
@@ -57,6 +93,26 @@ The Swagger documentation can be accessed at [localhost:8085/VEREFOO](localhost:
* (optional) if you previously configured Tomcat Manager you can open a browser and navigate to `this link ` and login using the proper username and password (e.g., ``admin/admin`` in the previous example);
* (optional) you can `deploy/undeploy/redeploy` the downloaded WARs through the web interface.
+## VEREFOO Directory Organizazion
+
+The source code of the framework is organized in a clear way through the following folders:
+* Allocation → files regarding the generation and management of Allocation Graphs/Nodes;
+* Extra → files containing auxiliary classes useful for testing, managing errors and wildcards;
+* Firewall → files regarding the actual application and deployment of produced configuration on the different types of firewalls (e.g., IPTables, OVS, etc...)
+* Functions → files regarding the representation of the different Network Functions, ranging from the EndHost, to the LoadBalancer, to the PacketFilter itself, and many other NF;
+* Graph → files regarding the management of the flows, addresses, ports, traffic and security requirements;
+* Rest → files for building and managing the REST service using Spring;
+* Solver → files regarding the model and constraints checking for both algorithms (AP and MF);
+* Translator → files regarding the translation of Verefoo output into the correct XML through the use of parser and pattern matchers;
+* Utils → files regarding general utils, e.g. Atomic Predicates utils, IP address comparator, abstraction of a firewall rule, etc...
+
+Additional files still inside the source folder are:
+* Main → used only for testing the Verefoo execution without relying on the REST API;
+* VerefooNormalizer → hides some limitation of z3 to the final user;
+* VerefooProxy → interface with the Verefoo classes;
+* VerefooSerializer → separates the Verefoo classes implementation from the actual input;
+
+
## REST APIs
In order to access the VEREFOO framework, some REST APIs are available when VEREFOO is deployed.
@@ -65,21 +121,18 @@ In order to access the VEREFOO framework, some REST APIs are available when VERE
Follow these steps to boot the environment, deploy VEREFOO and use the APIs (these instructions refer to the version with embedded Tomcat):
-* Run the Neo4j server: open a shell in the folder */neo4j-server/neo4j-community-3.5.25/bin* and type ```./neo4j console```;
+* Run the Neo4j server:
+ * On Windows → open a shell in the folder */neo4j-server/neo4j-community-3.5.25/bin* and type ```./neo4j console```;
+ * On Linux → type ```sudo /usr/bin/neo4j console``` ;
+ * Visit http://localhost:7474/ and log in with username `neo4j` and password `neo4j`, then, when prompted, set your new password to `costLess`;
* Run Tomcat: open another shell in the project root folder and type the following two commands: ```mvn clean package``` and ```java -jar target/verifoo-0.0.1-SNAPSHOT.jar```;
-* Interact with the REST APIs: any RESTful client can be used to interact with the VEREFOO APIs; the APIs home URI is [localhost:8085/VEREFOO](localhost:8085/VEREFOO). For any doubt about the REST APIs, their documentation can be found at [localhost:8085/VEREFOO](localhost:8085/VEREFOO).
+* Interact with the REST APIs: any RESTful client can be used to interact with the VEREFOO APIs; the APIs home URI is [localhost:8085/VEREFOO](localhost:8085/VEREFOO). For any doubt about the REST APIs, their documentation can be found at [localhost:8085/VEREFOO](localhost:8085/VEREFOO) , or by visiting the [Swagger UI Editor Online](https://editor.swagger.io/) and uploading the following [JSON file](/resources/api-docs.json).
### VEREFOO Interaction
-In order to interact with VEREFOO, it is necessary to specify the algorithm used. This version of VEREFOO is equipped with two algorithms: Maximal Flows (MF) and Atomic Predicates (AP), each of which is suitable for distinct use cases.
+#### Select algorithm
-The algorithm for the computation of Atomic Flows express each complex network predicate (e.g., a predicate
-representing a firewall rule, a NAT input packet class, or a
-security policy) as a subset of atomic predicates, which are disjoint to each other. Th Atomic flows are thus computed so that each tansmitted packet class is represented by an atomic predicate, and it can be represented by an integer number. This algorithm is suitable for scenarios where the automatic firewall configuration must be very fast, even at the expense of a larger number of rules that are created with this algoritm.
-
-The algorithm for the computation of Maximal Flows maximizing their aggregation. It groups all traffic flows that behave in the same way when crossing the network into a single Maximal Flow, so that
-it is sufficient to consider the Maximal Flow for solving the
-security configuration problem instead of all separate flows. This algorithm is suitable for scenarios where the minimum possible number of firewall rules must be computed, even if the MaxSMT problem resolution may take longer as each packet class cannot be associated with an integer value. It is also suitables for formally verifying the compliance of an already existing configuration with a set of user-specified secuirity requirements.
+In order to interact with VEREFOO, it is necessary to specify the algorithm used.
To select the algorithm utilized, the query parameter that specifies the algorithm should be included in the REST API request, subsequent to the framework's launch.
@@ -89,6 +142,15 @@ To select the algorithm utilized, the query parameter that specifies the algorit
The primary API is `/adp/simulations` as it serves as the API where the algorithm is executed. The Service Graph written in XML must be incorporated in the body of a POST request. It should be noted that the specification of the algorithm, as shown above, is mandatory, otherwise, the framework will return an error.
+#### Select version
+
+To interact with REACT VEREFOO, it is necessary to express the request with an additional query parameter. For the moment the implementation supports only the AP algorithm.
+
+> Example:
+> * `http://localhost:8085/VEREFOO/adp/simulations?Algorithm=AP&REACT=true`
+
+It should be noted that this parameter is optional, to maintain full compatibility with the previous version and APIs.
+
### Neo4j compatibility recommendations
The framework was tested with the the Neo4j server version 3.5.25 (Community Edition): it is compatible with the Neo4j Spring Data dependency in use. It is advisable to avoid employing newer versions of the server or Spring Data, despite available, for three main reasons:
@@ -111,35 +173,45 @@ In case of failure, the detailed report can be found at */target/failsafe-report
All the regression tests performed on the framework have been executed using the Z3 library version 4.8.8.
-## REACT VEREFOO
-
-REACT VEREFOO is a custom version of VEREFOO with additional support for the reconfiguration of packet filtering firewalls, so as to fulfill the user-specified security connectivity requirements. REACT VEREFOO maintains the core principles of VEREFOO (i.e., automation, formal correctness assurance, optimization) and adds the capability of reusing any previously computed configuration instead of forcing the reconfiguration of the whole network from scratch.
-
-To interact with REACT VEREFOO, it is necessary to express this with an additional query parameter. For the moment the implementation supports only the AP algorithm.
-
-> Example:
-> * `http://localhost:8085/VEREFOO/adp/simulations?Algorithm=AP&REACT=true`
-
-It should be noted that this parameter is optional, to maintain full compatibility with the previous version and APIs.
## Demo
-You can find a full demonstration of the VEREFOO framework at the following link: https://youtu.be/QCFNLE2gHgE
+You can find a full demonstration of the VEREFOO framework at the following link: https://youtu.be/QCFNLE2gHgE . If you prefer, the following paper will guide you through the demonstration in a written-fashion: https://ieeexplore.ieee.org/abstract/document/10175442 .
In this demo, VEREFOO has been used to automatically compute the firewall allocation scheme and configuration in a virtual network that is devoid of firewalling functionalities.
+#### NOTE: the Verefoo version used in this demo is "Budapest", in which the choice between the AP and MF algorithm was not implemented yet.
+
The input Service Graph represents a ramified network, where multiple different function types are included, e.g., a load balancer, a web cache, a traffic monitor, a network address translators. Some end points are single hosts, whereas other ones are subnetworks representing the office networks of some companies.
![Service Graph](./resources/images-demo/SG.png)
![Service Graph functions](./resources/images-demo/SGfunctions.png)
-
-The input Network Security Requirements establish which traffic flows must be blocked because potentially malicioucs, and which other must be able tor each their destination to ansure network connectivity.
+
+The input Network Security Requirements establish which traffic flows must be blocked because potentially malicioucs, and which other must be able tor each their destination to ansure network connectivity.
![Network Security Requirements](./resources/images-demo/NSRs.png)
+As explained in the [VEREFOO Interaction](#verefoo-interaction) section, you can interact with the framework through REST API; for this demo, the command sent is the following:
+> curl -X POST 'http://localhost:8085/verefoo/adp/simulations' -H 'accept: application/xml' -H 'Content-type: application/xml; -d @./testfiles/DemoTopology_budapest.xml > ./testfiles/fas_budapest.xml
+
+where
+* the input file containing both the SG and NSR is specified with `-d @ path/to/input_file.xml`; [this](./resources/demo_files/demo_input.xml) is the XML file given as input during the demo demonstration.
+* the Firewall Allocation Schema (FAS) will be saved at the location specified after the > simbol, `> path/to/output_file.xml`; [this](./resources/demo_files/demo_output.xml) is the XML file produced by the framework.
+
After running the framework, VEREFOO produces two outputs. On the one hand, it establishes the optimal firewall allocation scheme, composed of the minimum number of firewall instances to be placed in the input Allocation Places. On the other hand, for each allocated instance, it computes the optimal configuration, composed of a default action and the smallest set of filtering rules.
![Firewall Allocation Scheme](./resources/images-demo/FAS.png)
![Firewall Configuration](./resources/images-demo/FwRules.png)
+
+## VEREFOO Main Papers
+
+If you are interested in deepen your knowledge on the subject, the following links will guide you through the four Verefoo versions which followed one another:
+* [Amsterdam](https://ieeexplore.ieee.org/abstract/document/9110402) : D. Bringhenti, G. Marchetto, R. Sisto, F. Valenza, J. Yusupov, "_Automated optimal firewall orchestration and configuration in virtualized networks_", in Proc. of IEEE/IFIP Network Operations and Management Symposium, Budapest, Hungary, June 2020.
+* [Budapest](https://ieeexplore.ieee.org/abstract/document/9737389) : D. Bringhenti, G. Marchetto, R. Sisto, F. Valenza, J. Yusupov, "_Automated Firewall Configuration in Virtual Networks_", IEEE Transactions on Dependable and Secure Computing ( Volume: 20, Issue: 2, 01 March-April 2023, Pages: 1559 - 1576) , March 2022.
+* [Copenhagen](https://ieeexplore.ieee.org/document/10542398) : D. Bringhenti, S. Bussa, R. Sisto, F. Valenza, "_A two-fold traffic flow model for network security management_", IEEE Transactions on Network and Service Management, in press.
+* [Dublin](https://ieeexplore.ieee.org/document/10575212) : F. Pizzato, D. Bringhenti, R. Sisto, and F. Valenza, “_Automatic and optimized firewall reconfiguration_” in Proc. of IEEE/IFIP Network Operations and Management Symposium, Seoul, South Korea, May 2024.
+
+## Support
+If you need any kind of clarification, or you want to report a bug found in the code, you can contact us at: __.
diff --git a/WebContent/META-INF/MANIFEST.MF b/WebContent/META-INF/MANIFEST.MF
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/cdi-api-1.1.jar b/WebContent/WEB-INF/lib/cdi-api-1.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/com.microsoft.z3.jar b/WebContent/WEB-INF/lib/com.microsoft.z3.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/el-api-2.2.jar b/WebContent/WEB-INF/lib/el-api-2.2.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/javax.inject-1.jar b/WebContent/WEB-INF/lib/javax.inject-1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/javax.json-1.1.jar b/WebContent/WEB-INF/lib/javax.json-1.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/javax.json-api-1.1.jar b/WebContent/WEB-INF/lib/javax.json-api-1.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/javax.json.bind-api-1.0.jar b/WebContent/WEB-INF/lib/javax.json.bind-api-1.0.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/javax.servlet-api-3.0.1.jar b/WebContent/WEB-INF/lib/javax.servlet-api-3.0.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar b/WebContent/WEB-INF/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jersey-hk2.jar b/WebContent/WEB-INF/lib/jersey-hk2.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jersey-media-json-binding.jar b/WebContent/WEB-INF/lib/jersey-media-json-binding.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jersey-media-sse-2.25.1.jar b/WebContent/WEB-INF/lib/jersey-media-sse-2.25.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jni/Microsoft.Z3.xml b/WebContent/WEB-INF/lib/jni/Microsoft.Z3.xml
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jni/debian64.tar.gz b/WebContent/WEB-INF/lib/jni/debian64.tar.gz
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jni/ubuntu32.tar.gz b/WebContent/WEB-INF/lib/jni/ubuntu32.tar.gz
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jni/ubuntu64.tar.gz b/WebContent/WEB-INF/lib/jni/ubuntu64.tar.gz
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/jsr250-api-1.0.jar b/WebContent/WEB-INF/lib/jsr250-api-1.0.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/org.osgi.core-4.2.0.jar b/WebContent/WEB-INF/lib/org.osgi.core-4.2.0.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/osgi-resource-locator-1.0.1.jar b/WebContent/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/persistence-api-1.0.jar b/WebContent/WEB-INF/lib/persistence-api-1.0.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/slf4j-api-1.7.25.jar b/WebContent/WEB-INF/lib/slf4j-api-1.7.25.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/validation-api-1.1.0.Final.jar b/WebContent/WEB-INF/lib/validation-api-1.1.0.Final.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/lib/yasson-1.0.jar b/WebContent/WEB-INF/lib/yasson-1.0.jar
old mode 100644
new mode 100755
diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/favicon-16x16.png b/WebContent/_swagger-ui/favicon-16x16.png
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/favicon-32x32.png b/WebContent/_swagger-ui/favicon-32x32.png
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/index.html b/WebContent/_swagger-ui/index.html
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/oauth2-redirect.html b/WebContent/_swagger-ui/oauth2-redirect.html
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui-bundle.js b/WebContent/_swagger-ui/swagger-ui-bundle.js
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui-bundle.js.map b/WebContent/_swagger-ui/swagger-ui-bundle.js.map
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui-standalone-preset.js b/WebContent/_swagger-ui/swagger-ui-standalone-preset.js
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui-standalone-preset.js.map b/WebContent/_swagger-ui/swagger-ui-standalone-preset.js.map
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui.css b/WebContent/_swagger-ui/swagger-ui.css
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui.css.map b/WebContent/_swagger-ui/swagger-ui.css.map
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui.js b/WebContent/_swagger-ui/swagger-ui.js
old mode 100644
new mode 100755
diff --git a/WebContent/_swagger-ui/swagger-ui.js.map b/WebContent/_swagger-ui/swagger-ui.js.map
old mode 100644
new mode 100755
diff --git a/WebContent/index.html b/WebContent/index.html
old mode 100644
new mode 100755
diff --git a/gen-src/META-INF/sun-jaxb.episode b/gen-src/META-INF/sun-jaxb.episode
index 03698196..82189c77 100644
--- a/gen-src/META-INF/sun-jaxb.episode
+++ b/gen-src/META-INF/sun-jaxb.episode
@@ -6,7 +6,7 @@
This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0
See https://javaee.github.io/jaxb-v2/
Any modifications to this file will be lost upon recompilation of the source schema.
-Generated on: 2022.01.28 at 08:19:58 PM CET
+Generated on: 2024.06.10 at 05:45:07 PM CEST
-->
@@ -252,6 +252,12 @@ Generated on: 2022.01.28 at 08:19:58 PM CET
+
+
+
+
+
+
diff --git a/resources/api-docs.json b/resources/api-docs.json
new file mode 100644
index 00000000..2070dfd2
--- /dev/null
+++ b/resources/api-docs.json
@@ -0,0 +1 @@
+{"openapi":"3.0.1","info":{"title":"Verefoo REST API Online Swagger documentation","description":"This is the automatically-generated documentation of the Verefoo's REST APIs, in the format of an openapi file, compliant with Swagger version 3, here shown in a user-friendly interface.","version":"Dublin"},"servers":[{"url":"http://localhost:8085/verefoo","description":"ADP module server"}],"tags":[{"name":"graphs"},{"name":"requirements"},{"name":"simulations"},{"name":"substrates"}],"paths":{"/adp/requirements":{"get":{"tags":["requirements"],"summary":"Get all the requirement sets","operationId":"getRequirementsSets","responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}}}},"404":{"description":"No requirement set has been found in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListPropertyDefinition"}}}}}},"post":{"tags":["requirements"],"summary":"Create a requirement set","operationId":"createRequirementsSet","requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/PropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDefinition"}}}},"responses":{"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"424":{"description":"The referenced graph doesn't exist.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}},"delete":{"tags":["requirements"],"summary":"Delete all the requirement sets","description":"Be careful before cleaning the whole workbench of requirements.","operationId":"deleteRequirementsSets","responses":{"200":{"description":"default response"},"304":{"description":"No requirement set has been found."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/requirements/{rid}":{"get":{"tags":["requirements"],"summary":"Get a requirement set","operationId":"getRequirementsSet","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}}}},"404":{"description":"The requirement doesn't exist at all in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesPropertyDefinition"}}}}}},"put":{"tags":["requirements"],"summary":"Update a requirement set","operationId":"updateRequirementsSet","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/PropertyDefinition"}},"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDefinition"}}}},"responses":{"404":{"description":"The requirement set has not been found."},"400":{"description":"The provided resource is not compliant with the data model."},"200":{"description":"OK"},"424":{"description":"The referenced graph doesn't exist."}}},"delete":{"tags":["requirements"],"summary":"Delete a requirement set","operationId":"deleteRequirementsSet","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The requirement doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/requirements/{rid}/properties":{"post":{"tags":["requirements"],"summary":"Create another property in a requirement set","operationId":"createProperty","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Property"}},"application/json":{"schema":{"$ref":"#/components/schemas/Property"}}}},"responses":{"404":{"description":"The requirements set has not been found.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"424":{"description":"The referred graph doesn't exist.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}}},"/adp/requirements/{rid}/properties/{pid}":{"get":{"tags":["requirements"],"summary":"Get a property from a requirement set","operationId":"getProperty","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"pid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}}}},"404":{"description":"The property doesn't exist at all in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesProperty"}}}}}},"put":{"tags":["requirements"],"summary":"Update a property in a requirement set","operationId":"updateProperty","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"pid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Property"}},"application/json":{"schema":{"$ref":"#/components/schemas/Property"}}}},"responses":{"200":{"description":"default response"},"424":{"description":"The referred graph has not been found."},"404":{"description":"The property has not been found."},"400":{"description":"The provided resource is not compliant with the data model."}}},"delete":{"tags":["requirements"],"summary":"Delete a property from a requirement set","operationId":"deleteProperty","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"pid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The property doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/simulations":{"get":{"tags":["simulations"],"summary":"Get the result of a past simulation","description":"This API is not intended to run a new simulation.","operationId":"getSimulationResults","responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}}}},"404":{"description":"No simulation results currently exist in the workspace. You can start by performing a new simulation.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListNFV"}}}}}},"post":{"tags":["simulations"],"summary":"Run a simulation by passing the actual NFV","description":"This is an all-in-one service, since the relative data structures (like graphs) are created automatically and they will be retrievable with the pertinent APIs separately.","operationId":"runSimulationByNFV","parameters":[{"name":"fid","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["FIREWALL","ENDHOST","ENDPOINT","ANTISPAM","CACHE","DPI","DPI_S","MAILCLIENT","MAILSERVER","NAT","VPNACCESS","VPNEXIT","WEBCLIENT","WEBSERVER","FIELDMODIFIER","FORWARDER","LOADBALANCER","STATEFUL_FIREWALL","PRIORITY_FIREWALL","WEB_APPLICATION_FIREWALL","TRAFFIC_MONITOR"]}}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/NFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/NFV"}}}},"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}}}}}},"delete":{"tags":["simulations"],"summary":"Delete all the results of past simulations","operationId":"deleteSimulationResults","responses":{"200":{"description":"default response"},"400":{"description":"The provided resource is not compliant with the data model."},"304":{"description":"No simulation results are in the workspace at all."}}}},"/adp/simulations/byParams":{"post":{"tags":["simulations"],"summary":"Run a simulation by passing references to data structures","description":"At the moment, neither network forwarding paths nor the parsing string can be passed; use the other simulation API instead.","operationId":"runSimulationByParams","parameters":[{"name":"gid","in":"query","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"rid","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"sid","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"fid","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["FIREWALL","ENDHOST","ENDPOINT","ANTISPAM","CACHE","DPI","DPI_S","MAILCLIENT","MAILSERVER","NAT","VPNACCESS","VPNEXIT","WEBCLIENT","WEBSERVER","FIELDMODIFIER","FORWARDER","LOADBALANCER","STATEFUL_FIREWALL","PRIORITY_FIREWALL","WEB_APPLICATION_FIREWALL","TRAFFIC_MONITOR"]}}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"404":{"description":"At least one resource referenced by some parameter doesn't exist in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}}},"/adp/simulations/{smid}":{"get":{"tags":["simulations"],"summary":"Get the result of a past simulation","description":"This API is not intended to run a new simulation.","operationId":"getSimulationResult","parameters":[{"name":"smid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}}}},"404":{"description":"The requested simulation doesn't exist in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNFV"}}}}}},"delete":{"tags":["simulations"],"summary":"Delete the result of a past simulation","operationId":"deleteSimulationResult","parameters":[{"name":"smid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The requested simulation doesn't exist in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/substrates/{sid}/hosts":{"get":{"tags":["substrates"],"summary":"Get the collection of hosts in the substrate","operationId":"getHosts","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}}}},"404":{"description":"The substrate doesn't exist at all in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHosts"}}}}}},"post":{"tags":["substrates"],"summary":"Add a collection of hosts in the substrate","operationId":"createHosts","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Hosts"}},"application/json":{"schema":{"$ref":"#/components/schemas/Hosts"}}}},"responses":{"404":{"description":"The substrate doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."},"201":{"description":"Created"}}},"delete":{"tags":["substrates"],"summary":"Delete the list of hosts in the substrate","description":"The list is deleted only if no connections exists.","operationId":"deleteHosts","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The substrate doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/substrates":{"get":{"tags":["substrates"],"summary":"Get all substrates ids","operationId":"getSubstrates","responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}}}},"404":{"description":"No substrates have been found.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}}}}}},"post":{"tags":["substrates"],"summary":"Create an empty substrate","description":"Create a new physical network","operationId":"createSubstrate","responses":{"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}},"delete":{"tags":["substrates"],"summary":"Delete all the substrates","description":"Be careful before cleaning the whole substrate workbench.","operationId":"deleteSubstrates","responses":{"200":{"description":"default response"},"400":{"description":"The provided resource is not compliant with the data model."},"304":{"description":"No substrate exists at all in the workspace."}}}},"/adp/substrates/{sid}":{"delete":{"tags":["substrates"],"summary":"Delete a substrate","description":"The operation deletes all the hosts and connections of the substrate accordingly.","operationId":"deleteSubstrate","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The selected substrate doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/substrates/{sid}/hosts/{hid}":{"get":{"tags":["substrates"],"summary":"Get a host in a substrate","operationId":"getHost","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"hid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}}}},"404":{"description":"The host doesn't exist at all in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesHost"}}}}}},"put":{"tags":["substrates"],"summary":"Update a host in a substrate","operationId":"updateHost","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"hid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Host"}},"application/json":{"schema":{"$ref":"#/components/schemas/Host"}}}},"responses":{"200":{"description":"default response"},"404":{"description":"The host doesn't exist at all in the workspace."},"424":{"description":"One referred node doesn't exist."},"400":{"description":"The provided resource is not compliant with the data model."}}},"delete":{"tags":["substrates"],"summary":"Delete a host","description":"The host is deleted only if it is not implied in any connection.","operationId":"deleteHost","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"hid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The host doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/substrates/{sid}/connections":{"get":{"tags":["substrates"],"summary":"Get all the connections of a substrate","operationId":"getConnections","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}}}},"404":{"description":"The substrate doesn't exist at all in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConnections"}}}}}},"put":{"tags":["substrates"],"summary":"Change all the connections between hosts in a substrate.","description":"The old connections will be lost.","operationId":"updateConnections","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Connections"}},"application/json":{"schema":{"$ref":"#/components/schemas/Connections"}}}},"responses":{"404":{"description":"The substrate doesn't exist. You can create a new substrate or refer to another one."},"400":{"description":"The provided resource is not compliant with the data model."},"200":{"description":"OK"},"424":{"description":"The connections cannot be established between the hosts because at least one of them doesn't exist in the workspace."}}},"post":{"tags":["substrates"],"summary":"Create a list of connections between hosts in the substrate","description":"The hosts must already exist. If some connections already exist, the new connections are just added; the duplicates are discarded.","operationId":"createConnections","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Connections"}},"application/json":{"schema":{"$ref":"#/components/schemas/Connections"}}}},"responses":{"400":{"description":"The provided resource is not compliant with the data model."},"201":{"description":"Created"},"424":{"description":"The connections cannot be established between the hosts because at least one of them doesn't exist in the workspace."}}},"delete":{"tags":["substrates"],"summary":"Delete all the connections of a substrate","operationId":"deleteConnections","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The substrate doesn't exist at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/fwd/nodes/{nid}/configuration/firewall/{eid}":{"get":{"tags":["nodes-controller"],"operationId":"getPolicy","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Elements"}}}}}},"put":{"tags":["nodes-controller"],"operationId":"updatePolicy","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Elements"}}}},"responses":{"204":{"description":"default response"}}},"delete":{"tags":["nodes-controller"],"operationId":"deletePolicy","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"default response"}}}},"/fwd/nodes":{"get":{"tags":["nodes-controller"],"operationId":"getNodes","parameters":[{"name":"beforeInclusive","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"afterInclusive","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"default response","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Node"}}}}}}},"delete":{"tags":["nodes-controller"],"operationId":"deleteNodes","responses":{"204":{"description":"default response"}}}},"/fwd/nodes/{nid}":{"get":{"tags":["nodes-controller"],"operationId":"getNode","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Node"}}}}}},"put":{"tags":["nodes-controller"],"operationId":"updateNode","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Node"}}}},"responses":{"204":{"description":"default response"}}},"delete":{"tags":["nodes-controller"],"operationId":"deleteNode","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"default response"}}}},"/fwd/nodes/{nid}/configuration":{"put":{"tags":["nodes-controller"],"operationId":"updateConfiguration","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Configuration"}}}},"responses":{"204":{"description":"default response"}}}},"/adp/venvironment/generateFiles":{"post":{"tags":["vnetworkTranslator"],"summary":"Generate virtual network files from the provided FAS","operationId":"generateFiles","parameters":[{"name":"firewallType","in":"query","required":true,"schema":{"type":"string","enum":["IPTABLES","ALL"]}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/NFV"}}}},"responses":{"200":{"description":"default response"},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/graphs/{gid}/nodes/{nid}/configuration":{"get":{"tags":["graphs"],"summary":"Get the configuration of a node","operationId":"getConfiguration","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}}}},"404":{"description":"The graph or the node doesn't exist at all.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConfiguration"}}}}}}},"/adp/graphs/{gid}/constraints":{"get":{"tags":["graphs"],"summary":"Get the constraints of a graph","operationId":"getConstraints","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}}}},"404":{"description":"The graph doesn't exist at all.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesConstraints"}}}}}},"put":{"tags":["graphs"],"summary":"Update constraints of a graph","description":"update the constraints of a graph","operationId":"updateConstraints","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Constraints"}},"application/json":{"schema":{"$ref":"#/components/schemas/Constraints"}}}},"responses":{"200":{"description":"default response"},"404":{"description":"The graph doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}},"post":{"tags":["graphs"],"summary":"Create a set of constraints in a graph","description":"If the constraints already exists, the new ones replace them in a shallow way.","operationId":"createConstraints","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Constraints"}},"application/json":{"schema":{"$ref":"#/components/schemas/Constraints"}}}},"responses":{"404":{"description":"The graph doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."},"201":{"description":"Created"}}},"delete":{"tags":["graphs"],"summary":"Delete all the constraints of a graph","operationId":"deleteConstraints","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The graph doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/graphs":{"get":{"tags":["graphs"],"summary":"Get all the graphs","operationId":"getGraphs","responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}}}},"404":{"description":"No graphs currently exist in the workspace. You can start by creating a new graph","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraphs"}}}}}},"post":{"tags":["graphs"],"summary":"Create a graph","description":"The graph's id in the request, if provided, is neglected; instead, the system automatically generates, stores the id for all the graphs and puts them in the response.","operationId":"createGraphs","requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Graphs"}},"application/json":{"schema":{"$ref":"#/components/schemas/Graphs"}}}},"responses":{"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesListLong"}}}}}},"delete":{"tags":["graphs"],"summary":"Delete all the graphs","description":"Be careful before cleaning the whole workbench of graphs.","operationId":"deleteGraphs","responses":{"424":{"description":"No graph has been deleted because at least one of them is referred by other resources; you must first delete the interested resources."},"200":{"description":"default response"},"304":{"description":"No graph exists at all in the workspace."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/graphs/{gid}":{"get":{"tags":["graphs"],"summary":"Get a graph","operationId":"getGraph","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"404":{"description":"The graph doesn't exist in the workspace.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}}}},"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesGraph"}}}}}},"put":{"tags":["graphs"],"summary":"Update a graph","description":"It's advisable to explicitly perform a get of the modified resource through the pertinent API, since some ids may have been changed.","operationId":"updateGraph","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Graph"}},"application/json":{"schema":{"$ref":"#/components/schemas/Graph"}}}},"responses":{"200":{"description":"default response"},"400":{"description":"The provided resource is not compliant with the data model."},"404":{"description":"The graph or one of its sub-resources doesn't exist. Check the ids of the submitted resources."}}},"delete":{"tags":["graphs"],"summary":"Delete a graph","description":"All the nested resources are deleted accordingly. In case the graph is referred by other resources, the operation is not performed and the workspace is not modified.","operationId":"deleteGraph","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"409":{"description":"The graph could not be deleted because it is referenced by other resources; you must first delete the interested resources."},"400":{"description":"The provided resource is not compliant with the data model."},"404":{"description":"The graph doesn't exist at all in the workspace."}}}},"/adp/graphs/{gid}/nodes/{nid}/neighbours":{"post":{"tags":["graphs"],"summary":"Add a neighbour to a node","description":"add a new neighbour","operationId":"createNeighbour","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Neighbour"}},"application/json":{"schema":{"$ref":"#/components/schemas/Neighbour"}}}},"responses":{"404":{"description":"The graph or the node doesn't exist at all.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}}},"/adp/graphs/{gid}/nodes/{noid}/neighbours/{neid}":{"delete":{"tags":["graphs"],"summary":"Delete a neighbour of a node","description":"delete a neighbour","operationId":"deleteNeighbour","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"noid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"neid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The graph, the node or its neighbour doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/graphs/{gid}/nodes":{"post":{"tags":["graphs"],"summary":"Create a node in a graph","description":"The neighbours and the configuration are considered too eventually.","operationId":"createNode","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Node"}},"application/json":{"schema":{"$ref":"#/components/schemas/Node"}}}},"responses":{"404":{"description":"The graph doesn't exist at all.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}},"201":{"description":"Created","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesLong"}}}}}}},"/adp/graphs/{gid}/nodes/{nid}":{"get":{"tags":["graphs"],"summary":"Get a node","operationId":"getNode_1","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}}}},"404":{"description":"The graph or the node doesn't exist at all.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}}}},"400":{"description":"The provided resource is not compliant with the data model.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}},"application/json":{"schema":{"$ref":"#/components/schemas/ResourcesNode"}}}}}},"put":{"tags":["graphs"],"summary":"Update a node in a graph","description":"All the nested resources are replaced in a shallow way, besides the neighbours; that field is totally neglected.","operationId":"updateNode_1","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Node"}},"application/json":{"schema":{"$ref":"#/components/schemas/Node"}}}},"responses":{"200":{"description":"default response"},"404":{"description":"The graph or the node doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}},"delete":{"tags":["graphs"],"summary":"Delete a node","operationId":"deleteNode_1","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"},"404":{"description":"The graph or the node doesn't exist at all."},"409":{"description":"The node could not have been deleted, because it is referred by other resources; first delete the interested resources."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/adp/graphs/{gid}/nodes/{nid}/configuration/{cid}":{"put":{"tags":["graphs"],"summary":"Update the configuration of a node","operationId":"updateConfiguration_1","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"cid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Configuration"}},"application/json":{"schema":{"$ref":"#/components/schemas/Configuration"}}}},"responses":{"200":{"description":"default response"},"404":{"description":"The graph or the node doesn't exist at all."},"400":{"description":"The provided resource is not compliant with the data model."}}}},"/fwd/deploy/getOpenVswitch/{nid}":{"get":{"tags":["deployer-controller"],"operationId":"getOpenvswitch","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"}}}},"/fwd/deploy/getIptables/{nid}":{"get":{"tags":["deployer-controller"],"operationId":"getIptables","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"}}}},"/fwd/deploy/getFortinet/{nid}":{"get":{"tags":["deployer-controller"],"operationId":"getFortinet","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"}}}},"/fwd/deploy/getIpfw/{nid}":{"get":{"tags":["deployer-controller"],"operationId":"getIpfw","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"default response"}}}}},"components":{"schemas":{"AllocationConstraint":{"type":"object","properties":{"type":{"type":"string","xml":{"attribute":true},"enum":["FORBIDDEN","FORCED"]},"nodeA":{"type":"string","xml":{"attribute":true}},"nodeB":{"type":"string","xml":{"attribute":true}}}},"AllocationConstraints":{"type":"object","properties":{"allocationConstraint":{"type":"array","xml":{"name":"AllocationConstraint"},"items":{"$ref":"#/components/schemas/AllocationConstraint"}}},"xml":{"name":"AllocationConstraints"}},"Antispam":{"type":"object","properties":{"source":{"type":"array","items":{"type":"string"}}},"xml":{"name":"antispam"}},"Cache":{"required":["resource"],"type":"object","properties":{"resource":{"type":"array","items":{"type":"string"}}},"xml":{"name":"cache"}},"Configuration":{"type":"object","properties":{"firewall":{"$ref":"#/components/schemas/Firewall"},"endhost":{"$ref":"#/components/schemas/Endhost"},"endpoint":{"$ref":"#/components/schemas/Endpoint"},"antispam":{"$ref":"#/components/schemas/Antispam"},"cache":{"$ref":"#/components/schemas/Cache"},"dpi":{"$ref":"#/components/schemas/Dpi"},"mailclient":{"$ref":"#/components/schemas/Mailclient"},"mailserver":{"$ref":"#/components/schemas/Mailserver"},"nat":{"$ref":"#/components/schemas/Nat"},"vpnaccess":{"$ref":"#/components/schemas/Vpnaccess"},"vpnexit":{"$ref":"#/components/schemas/Vpnexit"},"webclient":{"$ref":"#/components/schemas/Webclient"},"webserver":{"$ref":"#/components/schemas/Webserver"},"fieldmodifier":{"$ref":"#/components/schemas/Fieldmodifier"},"forwarder":{"$ref":"#/components/schemas/Forwarder"},"loadbalancer":{"$ref":"#/components/schemas/Loadbalancer"},"statefulFirewall":{"$ref":"#/components/schemas/StatefulFirewall"},"webApplicationFirewall":{"$ref":"#/components/schemas/WebApplicationFirewall"},"trafficMonitor":{"$ref":"#/components/schemas/TrafficMonitor"},"id":{"type":"integer","format":"int64","xml":{"attribute":true}},"name":{"type":"string","xml":{"attribute":true}},"description":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"configuration"}},"Connection":{"type":"object","properties":{"sourceHost":{"type":"string","xml":{"attribute":true}},"destHost":{"type":"string","xml":{"attribute":true}},"avgLatency":{"type":"integer","format":"int32","xml":{"attribute":true}}},"xml":{"name":"Connection"}},"Connections":{"type":"object","properties":{"connection":{"type":"array","xml":{"name":"Connection"},"items":{"$ref":"#/components/schemas/Connection"}}},"xml":{"name":"Connections"}},"Constraints":{"type":"object","properties":{"nodeConstraints":{"$ref":"#/components/schemas/NodeConstraints"},"linkConstraints":{"$ref":"#/components/schemas/LinkConstraints"},"allocationConstraints":{"$ref":"#/components/schemas/AllocationConstraints"}},"xml":{"name":"Constraints"}},"Dpi":{"type":"object","properties":{"dpiElements":{"type":"array","xml":{"name":"dpi_elements"},"items":{"$ref":"#/components/schemas/DpiElements"}},"defaultAction":{"type":"string","xml":{"attribute":true},"enum":["ALLOW","DENY"]}},"xml":{"name":"dpi"}},"DpiElements":{"required":["condition"],"type":"object","properties":{"action":{"type":"string","enum":["ALLOW","DENY"],"default":"DENY"},"condition":{"type":"string"}},"xml":{"name":"dpi_elements"}},"Elements":{"required":["destination","source"],"type":"object","properties":{"id":{"type":"integer","format":"int64"},"action":{"type":"string","enum":["ALLOW","DENY"],"default":"DENY"},"source":{"type":"string"},"destination":{"type":"string"},"protocol":{"type":"string","enum":["ANY","TCP","UDP","OTHER"],"default":"ANY"},"srcPort":{"type":"string","xml":{"name":"src_port"}},"dstPort":{"type":"string","xml":{"name":"dst_port"}},"priority":{"type":"string","default":"*"},"directional":{"type":"boolean","default":true}},"xml":{"name":"elements"}},"Endhost":{"type":"object","properties":{"body":{"type":"string","xml":{"attribute":true}},"sequence":{"type":"integer","xml":{"attribute":true}},"protocol":{"type":"string","xml":{"attribute":true},"enum":["HTTP_REQUEST","HTTP_RESPONSE","POP_3_REQUEST","POP_3_RESPONSE"]},"emailFrom":{"type":"string","xml":{"name":"email_from","attribute":true}},"url":{"type":"string","xml":{"attribute":true}},"options":{"type":"string","xml":{"attribute":true}},"destination":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"endhost"}},"Endpoint":{"required":["name"],"type":"object","properties":{"name":{"type":"string"}},"xml":{"name":"endpoint"}},"Fieldmodifier":{"required":["name"],"type":"object","properties":{"name":{"type":"string"}},"xml":{"name":"fieldmodifier"}},"Firewall":{"type":"object","properties":{"elements":{"type":"array","items":{"$ref":"#/components/schemas/Elements"}},"defaultAction":{"type":"string","xml":{"attribute":true},"enum":["ALLOW","DENY"]}},"xml":{"name":"firewall"}},"Forwarder":{"required":["name"],"type":"object","properties":{"name":{"type":"string","default":"Forwarder"}},"xml":{"name":"forwarder"}},"Graph":{"required":["node"],"type":"object","properties":{"node":{"type":"array","items":{"$ref":"#/components/schemas/Node"}},"id":{"type":"integer","format":"int64","xml":{"attribute":true}},"serviceGraph":{"type":"boolean","xml":{"attribute":true}}},"xml":{"name":"graph"}},"Graphs":{"type":"object","properties":{"graph":{"type":"array","items":{"$ref":"#/components/schemas/Graph"}}},"xml":{"name":"graphs"}},"HTTPDefinition":{"type":"object","properties":{"url":{"type":"string","xml":{"attribute":true}},"domain":{"type":"string","xml":{"attribute":true}},"options":{"type":"string","xml":{"attribute":true}}}},"Host":{"type":"object","properties":{"supportedVNF":{"type":"array","xml":{"name":"SupportedVNF"},"items":{"$ref":"#/components/schemas/SupportedVNFType"}},"nodeRef":{"type":"array","xml":{"name":"NodeRef"},"items":{"$ref":"#/components/schemas/NodeRefType"}},"name":{"type":"string","xml":{"attribute":true}},"cpu":{"type":"integer","format":"int32","xml":{"attribute":true}},"cores":{"type":"integer","format":"int32","xml":{"attribute":true}},"diskStorage":{"type":"integer","format":"int32","xml":{"attribute":true}},"memory":{"type":"integer","format":"int32","xml":{"attribute":true}},"maxVNF":{"type":"integer","format":"int32","xml":{"attribute":true}},"type":{"type":"string","xml":{"attribute":true},"enum":["CLIENT","SERVER","MIDDLEBOX"]},"fixedEndpoint":{"type":"string","xml":{"attribute":true}},"active":{"type":"boolean","xml":{"attribute":true}}},"xml":{"name":"Host"}},"Hosts":{"type":"object","properties":{"host":{"type":"array","xml":{"name":"Host"},"items":{"$ref":"#/components/schemas/Host"}}},"xml":{"name":"Hosts"}},"Link":{"type":"object","properties":{"rel":{"type":"string","xml":{"attribute":true}},"href":{"type":"string","xml":{"attribute":true}},"hreflang":{"type":"string","xml":{"attribute":true}},"media":{"type":"string","xml":{"attribute":true}},"title":{"type":"string","xml":{"attribute":true}},"type":{"type":"string","xml":{"attribute":true}},"deprecation":{"type":"string","xml":{"attribute":true}}}},"LinkConstraints":{"type":"object","properties":{"linkMetrics":{"type":"array","xml":{"name":"LinkMetrics"},"items":{"$ref":"#/components/schemas/LinkMetrics"}}},"xml":{"name":"LinkConstraints"}},"LinkMetrics":{"type":"object","properties":{"src":{"type":"string","xml":{"attribute":true}},"dst":{"type":"string","xml":{"attribute":true}},"reqLatency":{"type":"integer","format":"int32","xml":{"attribute":true}}}},"Loadbalancer":{"required":["pool"],"type":"object","properties":{"pool":{"type":"array","items":{"type":"string"}}},"xml":{"name":"loadbalancer"}},"Mailclient":{"type":"object","properties":{"mailserver":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"mailclient"}},"Mailserver":{"required":["name"],"type":"object","properties":{"name":{"type":"string"}},"xml":{"name":"mailserver"}},"NFV":{"type":"object","properties":{"graphs":{"$ref":"#/components/schemas/Graphs"},"constraints":{"$ref":"#/components/schemas/Constraints"},"propertyDefinition":{"$ref":"#/components/schemas/PropertyDefinition"},"hosts":{"$ref":"#/components/schemas/Hosts"},"connections":{"$ref":"#/components/schemas/Connections"},"networkForwardingPaths":{"$ref":"#/components/schemas/NetworkForwardingPaths"},"parsingString":{"type":"string","xml":{"name":"ParsingString"}}},"xml":{"name":"NFV"}},"Nat":{"required":["source"],"type":"object","properties":{"source":{"type":"array","items":{"type":"string"}}},"xml":{"name":"nat"}},"Neighbour":{"type":"object","properties":{"id":{"type":"integer","format":"int64","xml":{"attribute":true}},"name":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"neighbour"}},"NetworkForwardingPaths":{"type":"object","properties":{"path":{"type":"array","xml":{"name":"Path"},"items":{"$ref":"#/components/schemas/Path"}}},"xml":{"name":"NetworkForwardingPaths"}},"Node":{"type":"object","properties":{"neighbour":{"type":"array","items":{"$ref":"#/components/schemas/Neighbour"}},"configuration":{"$ref":"#/components/schemas/Configuration"},"id":{"type":"integer","format":"int64","xml":{"attribute":true}},"name":{"type":"string","xml":{"attribute":true}},"functionalType":{"type":"string","xml":{"name":"functional_type","attribute":true},"enum":["FIREWALL","ENDHOST","ENDPOINT","ANTISPAM","CACHE","DPI","DPI_S","MAILCLIENT","MAILSERVER","NAT","VPNACCESS","VPNEXIT","WEBCLIENT","WEBSERVER","FIELDMODIFIER","FORWARDER","LOADBALANCER","STATEFUL_FIREWALL","PRIORITY_FIREWALL","WEB_APPLICATION_FIREWALL","TRAFFIC_MONITOR"]}},"xml":{"name":"node"}},"NodeConstraints":{"type":"object","properties":{"nodeMetrics":{"type":"array","xml":{"name":"NodeMetrics"},"items":{"$ref":"#/components/schemas/NodeMetrics"}}},"xml":{"name":"NodeConstraints"}},"NodeMetrics":{"type":"object","properties":{"node":{"type":"string","xml":{"attribute":true}},"nrOfOperations":{"type":"integer","format":"int64","xml":{"attribute":true}},"maxNodeLatency":{"type":"integer","format":"int32","xml":{"attribute":true}},"reqStorage":{"type":"integer","format":"int32","xml":{"attribute":true}},"cores":{"type":"integer","format":"int32","xml":{"attribute":true}},"memory":{"type":"integer","format":"int32","xml":{"attribute":true}},"optional":{"type":"boolean","xml":{"attribute":true}}}},"NodeRefType":{"type":"object","properties":{"node":{"type":"string","xml":{"attribute":true}}}},"POP3Definition":{"type":"object","properties":{"from":{"type":"string","xml":{"attribute":true}},"sender":{"type":"string","xml":{"attribute":true}},"to":{"type":"string","xml":{"attribute":true}},"subject":{"type":"string","xml":{"attribute":true}},"contentType":{"type":"string","xml":{"name":"content-type","attribute":true}}}},"Path":{"required":["pathNode"],"type":"object","properties":{"pathNode":{"type":"array","items":{"$ref":"#/components/schemas/PathNode"}},"id":{"type":"integer","format":"int32","xml":{"attribute":true}}},"xml":{"name":"Path"}},"PathNode":{"type":"object","properties":{"name":{"type":"string","xml":{"attribute":true}}}},"Property":{"type":"object","properties":{"pop3Definition":{"$ref":"#/components/schemas/POP3Definition"},"name":{"type":"string","xml":{"attribute":true},"enum":["ISOLATION_PROPERTY","REACHABILITY_PROPERTY"]},"graph":{"type":"integer","format":"int64","xml":{"attribute":true}},"src":{"type":"string","xml":{"attribute":true}},"dst":{"type":"string","xml":{"attribute":true}},"lv4Proto":{"type":"string","xml":{"name":"lv4proto","attribute":true},"enum":["ANY","TCP","UDP","OTHER"]},"srcPort":{"type":"string","xml":{"name":"src_port","attribute":true}},"dstPort":{"type":"string","xml":{"name":"dst_port","attribute":true}},"isSat":{"type":"boolean","xml":{"attribute":true}},"body":{"type":"string","xml":{"attribute":true}},"httpdefinition":{"$ref":"#/components/schemas/HTTPDefinition"}}},"PropertyDefinition":{"required":["property"],"type":"object","properties":{"property":{"type":"array","xml":{"name":"Property"},"items":{"$ref":"#/components/schemas/Property"}}},"xml":{"name":"PropertyDefinition"}},"ResourcesConfiguration":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Configuration"}}},"xml":{"name":"entities"}},"ResourcesConnections":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Connections"}}},"xml":{"name":"entities"}},"ResourcesConstraints":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Constraints"}}},"xml":{"name":"entities"}},"ResourcesGraph":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Graph"}}},"xml":{"name":"entities"}},"ResourcesGraphs":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Graphs"}}},"xml":{"name":"entities"}},"ResourcesHost":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Host"}}},"xml":{"name":"entities"}},"ResourcesHosts":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Hosts"}}},"xml":{"name":"entities"}},"ResourcesListLong":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"type":"array","items":{"type":"integer","format":"int64"}}}},"xml":{"name":"entities"}},"ResourcesListNFV":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/NFV"}}}},"xml":{"name":"entities"}},"ResourcesListPropertyDefinition":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/PropertyDefinition"}}}},"xml":{"name":"entities"}},"ResourcesLong":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"type":"integer","format":"int64"}}},"xml":{"name":"entities"}},"ResourcesNFV":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/NFV"}}},"xml":{"name":"entities"}},"ResourcesNode":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Node"}}},"xml":{"name":"entities"}},"ResourcesProperty":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Property"}}},"xml":{"name":"entities"}},"ResourcesPropertyDefinition":{"type":"object","properties":{"links":{"type":"array","xml":{"name":"link","namespace":"http://www.w3.org/2005/Atom"},"items":{"$ref":"#/components/schemas/Link"}},"content":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/PropertyDefinition"}}},"xml":{"name":"entities"}},"StatefulFirewall":{"type":"object","properties":{"elements":{"type":"array","items":{"$ref":"#/components/schemas/Elements"}},"defaultAction":{"type":"string","xml":{"attribute":true},"enum":["ALLOW","DENY"]}},"xml":{"name":"stateful_firewall"}},"SupportedVNFType":{"type":"object","properties":{"functionalType":{"type":"string","xml":{"name":"functional_type","attribute":true},"enum":["FIREWALL","ENDHOST","ENDPOINT","ANTISPAM","CACHE","DPI","DPI_S","MAILCLIENT","MAILSERVER","NAT","VPNACCESS","VPNEXIT","WEBCLIENT","WEBSERVER","FIELDMODIFIER","FORWARDER","LOADBALANCER","STATEFUL_FIREWALL","PRIORITY_FIREWALL","WEB_APPLICATION_FIREWALL","TRAFFIC_MONITOR"]}}},"TrafficMonitor":{"required":["name"],"type":"object","properties":{"name":{"type":"string","default":"TrafficMonitor"}},"xml":{"name":"traffic_monitor"}},"Vpnaccess":{"type":"object","properties":{"vpnexit":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"vpnaccess"}},"Vpnexit":{"type":"object","properties":{"vpnaccess":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"vpnexit"}},"WafElements":{"type":"object","properties":{"action":{"type":"string","enum":["ALLOW","DENY"],"default":"DENY"},"url":{"type":"string"},"domain":{"type":"string"}},"xml":{"name":"waf_elements"}},"WebApplicationFirewall":{"type":"object","properties":{"wafElements":{"type":"array","xml":{"name":"waf_elements"},"items":{"$ref":"#/components/schemas/WafElements"}},"defaultAction":{"type":"string","xml":{"attribute":true},"enum":["ALLOW","DENY"]}},"xml":{"name":"web_application_firewall"}},"Webclient":{"type":"object","properties":{"nameWebServer":{"type":"string","xml":{"attribute":true}}},"xml":{"name":"webclient"}},"Webserver":{"required":["name"],"type":"object","properties":{"name":{"type":"string"}},"xml":{"name":"webserver"}}}}}
\ No newline at end of file
diff --git a/resources/demo_files/demo_input.xml b/resources/demo_files/demo_input.xml
new file mode 100644
index 00000000..5e70aaac
--- /dev/null
+++ b/resources/demo_files/demo_input.xml
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
+
+
+ 130.10.0.1
+
+
+
+
+
+
+
+
+ 130.10.0.2
+
+
+
+
+
+
+
+
+ 130.10.0.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 130.10.0.1
+ 130.10.0.2
+ 130.10.0.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/demo_files/demo_output.xml b/resources/demo_files/demo_output.xml
new file mode 100644
index 00000000..19c0f94b
--- /dev/null
+++ b/resources/demo_files/demo_output.xml
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+ 130.10.0.1
+
+
+
+
+
+
+
+ 130.10.0.2
+
+
+
+
+
+
+
+ 130.10.0.3
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+
+ 130.10.0.1
+ 130.10.0.2
+ 130.10.0.3
+
+
+
+
+
+
+
+
+
+ ALLOW
+
+ 130.10.0.4
+ TCP
+ *
+ 80
+
+
+ ALLOW
+
+ 130.10.0.4
+ TCP
+ *
+ 80
+
+
+ ALLOW
+
+ -1.-1.-1.-1
+ ANY
+ *
+ *
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+ ALLOW
+
+ 40.40.41.-1
+ ANY
+ *
+ *
+
+
+ ALLOW
+
+ 40.40.42.-1
+ ANY
+ *
+ *
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarder
+
+
+
+
+
+
+
+
+
+ ALLOW
+
+ 192.168.-1.-1
+ ANY
+ *
+ *
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/it/polito/verefoo/solver/Checker.java b/src/it/polito/verefoo/solver/Checker.java
index ced5bc7d..ffdcf6c3 100644
--- a/src/it/polito/verefoo/solver/Checker.java
+++ b/src/it/polito/verefoo/solver/Checker.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017 Politecnico di Torino and others.
+ * Copyright (c) 2017-2024 Politecnico di Torino and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License, Version 2.0
diff --git a/src/it/polito/verefoo/solver/NetContext.java b/src/it/polito/verefoo/solver/NetContext.java
index 06277f2c..8db81798 100644
--- a/src/it/polito/verefoo/solver/NetContext.java
+++ b/src/it/polito/verefoo/solver/NetContext.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017 Politecnico di Torino and others.
+ * Copyright (c) 2017-2024 Politecnico di Torino and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License, Version 2.0
diff --git a/src/it/polito/verefoo/solver/NetContextAP.java b/src/it/polito/verefoo/solver/NetContextAP.java
index e01788d3..f3ad2a38 100644
--- a/src/it/polito/verefoo/solver/NetContextAP.java
+++ b/src/it/polito/verefoo/solver/NetContextAP.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017 Politecnico di Torino and others.
+ * Copyright (c) 2017-2024 Politecnico di Torino and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License, Version 2.0
diff --git a/src/it/polito/verefoo/solver/NetContextMF.java b/src/it/polito/verefoo/solver/NetContextMF.java
index 801c31d9..efab6be4 100644
--- a/src/it/polito/verefoo/solver/NetContextMF.java
+++ b/src/it/polito/verefoo/solver/NetContextMF.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017 Politecnico di Torino and others.
+ * Copyright (c) 2017-2024 Politecnico di Torino and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License, Version 2.0
diff --git a/src/it/polito/verefoo/utils/Quadruple.java b/src/it/polito/verefoo/utils/Quadruple.java
index 20457395..e1f2502d 100644
--- a/src/it/polito/verefoo/utils/Quadruple.java
+++ b/src/it/polito/verefoo/utils/Quadruple.java
@@ -1,24 +1,4 @@
-/*
- * Copyright 2016 Politecnico di Torino
- * Authors:
- * Project Supervisor and Contact: Riccardo Sisto (riccardo.sisto@polito.it)
- *
- * This file is part of Verigraph.
- *
- * Verigraph is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of
- * the License, or (at your option) any later version.
- *
- * Verigraph is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with Verigraph. If not, see
- * .
- */
+
package it.polito.verefoo.utils;
/** A data structure which is an utility to make a generic couple of objects with different types in Java
diff --git a/src/it/polito/verefoo/utils/Tuple.java b/src/it/polito/verefoo/utils/Tuple.java
index 1d4705bb..902eee84 100644
--- a/src/it/polito/verefoo/utils/Tuple.java
+++ b/src/it/polito/verefoo/utils/Tuple.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017 Politecnico di Torino and others.
+ * Copyright (c) 2017-2024 Politecnico di Torino and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License, Version 2.0