lighty.io initializer 36/82436/2
authorJuraj Veverka <juraj.veverka@pantheon.tech>
Fri, 7 Jun 2019 07:22:49 +0000 (09:22 +0200)
committerguillaume.lambert <guillaume.lambert@orange.com>
Fri, 7 Jun 2019 09:21:04 +0000 (11:21 +0200)
JIRA: TRNSPRTPCE-126
Change-Id: I3169c24220fe64221b2633a2cb9a9e71134b0b2e
Signed-off-by: Juraj Veverka <juraj.veverka@pantheon.tech>
lighty/.gitignore [new file with mode: 0644]
lighty/README.md [new file with mode: 0644]
lighty/docs/TransportPCE.postman_collection.json [new file with mode: 0644]
lighty/pom.xml [new file with mode: 0644]
lighty/src/main/assembly/resources/start-controller.sh [new file with mode: 0755]
lighty/src/main/java/io/lighty/controllers/tpce/Main.java [new file with mode: 0644]
lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCE.java [new file with mode: 0644]
lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java [new file with mode: 0644]
lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java [new file with mode: 0644]
lighty/src/main/resources/log4j.properties [new file with mode: 0644]

diff --git a/lighty/.gitignore b/lighty/.gitignore
new file mode 100644 (file)
index 0000000..5e373f1
--- /dev/null
@@ -0,0 +1,6 @@
+.idea
+*.iml
+cache
+journal
+snapshots
+target
diff --git a/lighty/README.md b/lighty/README.md
new file mode 100644 (file)
index 0000000..e1c5d47
--- /dev/null
@@ -0,0 +1,103 @@
+# Lighty-TransportPCE Controller
+
+This project starts [TransportPCE](https://git.opendaylight.org/gerrit/#/admin/projects/transportpce) without karaf framework.
+
+## Build & Run
+* Make sure you have JDK8 or later installed
+* Make sure you have [maven 3.5.0](https://maven.apache.org/download.cgi) or later installed.
+* Make sure you have proper [settings.xml](https://github.com/opendaylight/odlparent/blob/master/settings.xml)  in your ``~/.m2`` directory.
+
+#### Before compiling Lighty-TransportPCE
+Make sure upstream projects are compiled locally and stored in local ``~/.m2/repository``:
+1. compile __transportpce/master__
+```
+git clone https://git.opendaylight.org/gerrit/transportpce && (cd transportpce && curl -kLo `git rev-parse --git-dir`/hooks/commit-msg https://git.opendaylight.org/gerrit/tools/hooks/commit-msg; chmod +x `git rev-parse --git-dir`/hooks/commit-msg)
+cd transportpce
+```
+Before compilation, make sure that deviations are not present in models:
+```
+transportpce/ordmodels/network/src/main/yang/org-openroadm-otn-network-topology@2018-11-30.yang
+transportpce/ordmodels/network/src/main/yang/org-openroadm-network-topology@2018-11-30.yang
+transportpce/ordmodels/network/src/main/yang/org-openroadm-network@2018-11-30.yang
+```
+After deviations are removed from models, compile the project.
+```
+mvn clean install -DskipTests
+```
+2. compile __lighty-core/10.0.x__
+```
+git clone https://github.com/PantheonTechnologies/lighty-core.git
+cd lighty-core
+git checkout 10.0.x
+mvn clean install -DskipTests
+```
+#### Compile Lighty-TransportPCE
+* Project is build using maven command:
+```
+cd ../lighty
+mvn clean install
+```
+* After project build is done, use binary package to run the TransportPCE controller.
+```
+cd  target
+unzip lighty-transportpce-10.0.1-SNAPSHOT-bin.zip
+cd lighty-transportpce-10.0.1-SNAPSHOT
+./start-controller.sh
+```
+
+## TransportPCE lighty.io - karaf comparison
+
+### Application Boot test
+This test compares TransportPCE application on lighty.io and karaf.
+After TransportPCE is started, performance is measured using [visualvm](https://visualvm.github.io/) tool.
+
+| Property Name                     | ODL/Karaf *    | lighty.io ** |
+|-----------------------------------|----------------|--------------|
+| Build size                        | 225M           | 64M          |
+| Startup Time                      | ~15s           | ~6s          |
+| Shutdown Time                     | ~5s            | ~100ms       |
+| Process memory allocated (RSS)*** | 1236 MB        | 353 MB       |
+| HEAP memory (used/allocated)      | 135 / 1008 MB  | 58 / 128 MB  |
+| Metaspace (used/allocated)        | 115 / 132 MB   | 62 /  65 MB  |
+| Threads (live/daemon)             | 111 / 48       | 70 /  11     |
+| Classes loaded                    | 22027          | 12019        |
+| No. of jars                       | 680            | 244          |
+
+### test_end2end_lighty.py
+This test compares TransportPCE application on lighty.io and karaf while running __test_end2end_lighty.py__ (4 connected netconf devices).
+
+| Property Name                     | ODL/Karaf *    | lighty.io ** |
+|-----------------------------------|----------------|--------------|
+| Build size                        | 225M           | 64M          |
+| Startup Time                      | ~15s           | ~6s          |
+| Shutdown Time                     | ~5s            | ~100ms       |
+| Process memory allocated (RSS)*** | 1185 MB        | 440 MB       |
+| HEAP memory (used/allocated)      | 158 / 960 MB   | 85 / 128 MB  |
+| Metaspace (used/allocated)        | 128 / 146 MB   | 83 /  87 MB  |
+| Threads (live/daemon)             | 148 / 60       | 129 / 26     |
+| Classes loaded                    | 24326          | 16155        |
+| No. of jars                       | 680            | 244          |
+
+`* JVM parameters: -Xms128M -Xmx2048m ...`
+`** JVM parameters: -Xms128m -Xmx128m -XX:MaxMetaspaceSize=128m`
+`*** sudo ps -o pid,rss,user,command ax | grep java | grep transportpce`
+
+### Integration Test results
+| Test Name                             | Failed | All | Comment                    |
+|---------------------------------------|--------|-----|----------------------------|
+| test_portmapping.py                   | 0      |  18 |                            |
+| test_topoPortMapping.py               | 1      |   6 | (same results with karaf)  |
+| test_topology.py                      | 0      |  33 |                            |
+| test_renderer_service_path_nominal.py | 0      |  24 |                            |
+| test_pce.py                           | 0      |  22 |                            |
+| test_olm.py                           | 1      |  40 | (same results with karaf)  |
+| test_end2end_lighty.py                | 18     |  52 | (same as karaf, need check)|
+
+`karaf: executable = "../karaf/target/assembly/bin/karaf"`
+`lighty.io executable = "../lighty/target/lighty-transportpce-10.0.1-SNAPSHOT/start-controller.sh": `
+
+* __Total Success: 175__
+* __Total Failed: 20__
+
+### Postman collection
+Check this [postman collection](docs/TransportPCE.postman_collection.json) for RESTCONF examples.
diff --git a/lighty/docs/TransportPCE.postman_collection.json b/lighty/docs/TransportPCE.postman_collection.json
new file mode 100644 (file)
index 0000000..7e4effd
--- /dev/null
@@ -0,0 +1,467 @@
+{
+       "variables": [],
+       "info": {
+               "name": "TransportPCE",
+               "_postman_id": "2a8c7902-5793-e48c-ebab-72256fcac793",
+               "description": "",
+               "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
+       },
+       "item": [
+               {
+                       "name": "test_portmapping",
+                       "description": "",
+                       "item": [
+                               {
+                                       "name": "test_01_rdm_device_connected",
+                                       "request": {
+                                               "auth": {
+                                                       "type": "basic",
+                                                       "basic": {
+                                                               "username": "admin",
+                                                               "password": "admin",
+                                                               "saveHelperData": true,
+                                                               "showPassword": false
+                                                       }
+                                               },
+                                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                                               "method": "PUT",
+                                               "header": [
+                                                       {
+                                                               "key": "Content-Type",
+                                                               "value": "application/json",
+                                                               "description": ""
+                                                       },
+                                                       {
+                                                               "key": "Authorization",
+                                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                                               "description": ""
+                                                       }
+                                               ],
+                                               "body": {
+                                                       "mode": "raw",
+                                                       "raw": "{\n  \"node\" : {\n    \"node-id\": \"ROADMA\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 17830,\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"tcp-only\": false,\n    \"keepalive-delay\": 0,\n    \"pass-through\": {}\n  }\n}\n"
+                                               },
+                                               "description": "connect device 01"
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_02_rdm_device_connected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_03_rdm_portmapping_DEG1_TTP_TXRX",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/ROADMA/mapping/DEG1-TTP-TXRX",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_04_rdm_portmapping_SRG1_PP7_TXRX",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/ROADMA/mapping/SRG1-PP7-TXRX",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_05_rdm_portmapping_SRG3_PP1_TXRX",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/ROADMA/mapping/SRG3-PP1-TXRX",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_06_xpdr_device_connected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/XPDRA",
+                                               "method": "PUT",
+                                               "header": [
+                                                       {
+                                                               "key": "Content-Type",
+                                                               "value": "application/json",
+                                                               "description": ""
+                                                       }
+                                               ],
+                                               "body": {
+                                                       "mode": "raw",
+                                                       "raw": "{\n  \"node\" : {\n    \"node-id\": \"XPDRA\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 17831,\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"tcp-only\": false,\n    \"keepalive-delay\": 0,\n    \"pass-through\": {}\n  }\n}"
+                                               },
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_07_xpdr_device_connected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/node/XPDRA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_08_xpdr_portmapping_NETWORK1",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA/mapping/XPDR1-NETWORK1",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_09_xpdr_portmapping_NETWORK2",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA/mapping/XPDR1-NETWORK2",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_10_xpdr_portmapping_CLIENT1",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA/mapping/XPDR1-CLIENT1",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_11_xpdr_portmapping_CLIENT2",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA/mapping/XPDR1-CLIENT2",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_12_xpdr_portmapping_CLIENT4",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA/mapping/XPDR1-CLIENT4",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_13_xpdr_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/XPDRA",
+                                               "method": "DELETE",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_14_xpdr_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/node/XPDRA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_15_xpdr_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/XPDRA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_16_rdm_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                                               "method": "DELETE",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_17_rdm_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               },
+                               {
+                                       "name": "test_18_rdm_device_disconnected",
+                                       "request": {
+                                               "url": "http://localhost:8181/restconf/config/transportpce-portmapping:network/nodes/ROADMA",
+                                               "method": "GET",
+                                               "header": [],
+                                               "body": {},
+                                               "description": ""
+                                       },
+                                       "response": []
+                               }
+                       ]
+               },
+               {
+                       "name": "Get Modules",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/modules",
+                               "method": "GET",
+                               "header": [
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {
+                                       "mode": "raw",
+                                       "raw": ""
+                               },
+                               "description": "Get installed yang models "
+                       },
+                       "response": []
+               },
+               {
+                       "name": "Get List Of Network Topologies",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology",
+                               "method": "GET",
+                               "header": [
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {},
+                               "description": "Get List Of Network Topologies"
+                       },
+                       "response": []
+               },
+               {
+                       "name": "Create NetConf device ",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/new-netconf-device",
+                               "method": "PUT",
+                               "header": [
+                                       {
+                                               "key": "Content-Type",
+                                               "value": "application/json",
+                                               "description": ""
+                                       },
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {
+                                       "mode": "raw",
+                                       "raw": "{\n  \"node\" : {\n    \"node-id\": \"new-netconf-device\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 17830,\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"tcp-only\": false,\n    \"keepalive-delay\": 0\n  }\n}\n"
+                               },
+                               "description": "Create NetConf device "
+                       },
+                       "response": []
+               },
+               {
+                       "name": "disconnect device 01",
+                       "request": {
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                               "method": "DELETE",
+                               "header": [],
+                               "body": {},
+                               "description": "Delete NetConf device"
+                       },
+                       "response": []
+               },
+               {
+                       "name": "disconnect device 02",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/XPDRA",
+                               "method": "DELETE",
+                               "header": [
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {},
+                               "description": "Delete NetConf device"
+                       },
+                       "response": []
+               },
+               {
+                       "name": "Get Topologies Operational",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/operational/network-topology:network-topology",
+                               "method": "GET",
+                               "header": [
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {},
+                               "description": "Get Topologies Operational"
+                       },
+                       "response": []
+               },
+               {
+                       "name": "connect device 01",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                               "method": "PUT",
+                               "header": [
+                                       {
+                                               "key": "Content-Type",
+                                               "value": "application/json",
+                                               "description": ""
+                                       },
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {
+                                       "mode": "raw",
+                                       "raw": "{\n  \"node\" : {\n    \"node-id\": \"ROADMA\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 17830,\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"tcp-only\": false,\n    \"keepalive-delay\": 0,\n    \"pass-through\": {}\n  }\n}\n"
+                               },
+                               "description": "connect device 01"
+                       },
+                       "response": []
+               },
+               {
+                       "name": "connect device 02",
+                       "request": {
+                               "auth": {
+                                       "type": "basic",
+                                       "basic": {
+                                               "username": "admin",
+                                               "password": "admin",
+                                               "saveHelperData": true,
+                                               "showPassword": false
+                                       }
+                               },
+                               "url": "http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/ROADMA",
+                               "method": "PUT",
+                               "header": [
+                                       {
+                                               "key": "Content-Type",
+                                               "value": "application/json",
+                                               "description": ""
+                                       },
+                                       {
+                                               "key": "Authorization",
+                                               "value": "Basic YWRtaW46YWRtaW4=",
+                                               "description": ""
+                                       }
+                               ],
+                               "body": {
+                                       "mode": "raw",
+                                       "raw": "{\n  \"node\" : {\n    \"node-id\": \"XPDRA\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 17831,\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"tcp-only\": false,\n    \"keepalive-delay\": 0,\n    \"pass-through\": {}\n  }\n}\n"
+                               },
+                               "description": "connect device 02"
+                       },
+                       "response": []
+               }
+       ]
+}
\ No newline at end of file
diff --git a/lighty/pom.xml b/lighty/pom.xml
new file mode 100644 (file)
index 0000000..b9d04e1
--- /dev/null
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
+
+  This program and the accompanying materials are made available under the
+  terms of the Eclipse Public License v1.0 which accompanies this distribution,
+  and is available at https://www.eclipse.org/legal/epl-v10.html
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>io.lighty.core</groupId>
+        <artifactId>lighty-app-parent</artifactId>
+        <version>10.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>io.lighty.examples.controllers</groupId>
+    <artifactId>lighty-transportpce</artifactId>
+    <version>10.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <application.main.class>io.lighty.controllers.tpce.Main</application.main.class>
+        <application.attach.zip>true</application.attach.zip>
+        <maven.deploy.skip>true</maven.deploy.skip>
+    </properties>
+
+    <dependencies>
+
+        <!-- TPCE Models - BEGIN -->
+        <dependency>
+            <groupId>org.opendaylight.transportpce</groupId>
+            <artifactId>transportpce-api</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce.ordmodels</groupId>
+            <artifactId>transportpce-ordmodels-common</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce.ordmodels</groupId>
+            <artifactId>transportpce-ordmodels-device</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce.ordmodels</groupId>
+            <artifactId>transportpce-ordmodels-network</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce.ordmodels</groupId>
+            <artifactId>transportpce-ordmodels-service</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <!-- TPCE Models -   END -->
+
+        <!-- TPCE bundles - BEGIN -->
+        <dependency>
+            <groupId>org.opendaylight.transportpce</groupId>
+            <artifactId>transportpce-pce</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce</groupId>
+            <artifactId>transportpce-olm</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.transportpce</groupId>
+            <artifactId>transportpce-servicehandler</artifactId>
+            <version>0.4.0-SNAPSHOT</version>
+        </dependency>
+        <!-- TPCE bundles -   END -->
+
+        <dependency>
+            <groupId> org.opendaylight.mdsal</groupId>
+            <artifactId>yang-binding</artifactId>
+            <version>1.0.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.lighty.modules</groupId>
+            <artifactId>lighty-netconf-sb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.lighty.modules</groupId>
+            <artifactId>lighty-restconf-nb-community</artifactId>
+            <exclusions>
+                <!-- FIXME: why is this exclusion needed? can we move it somewhere else? -->
+                <exclusion>
+                    <groupId>javax.ws.rs</groupId>
+                    <artifactId>javax.ws.rs-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>io.lighty.resources</groupId>
+            <artifactId>singlenode-configuration</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.lighty.resources</groupId>
+            <artifactId>log4j-properties</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlets</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-jetty-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.inject</groupId>
+            <artifactId>jersey-hk2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>javax.ws.rs-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/lighty/src/main/assembly/resources/start-controller.sh b/lighty/src/main/assembly/resources/start-controller.sh
new file mode 100755 (executable)
index 0000000..146822e
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+#echo "${BASEDIR}"
+cd ${BASEDIR}
+
+#start controller
+java -ms128m -mx128m -XX:MaxMetaspaceSize=128m -jar lighty-transportpce-10.0.1-SNAPSHOT.jar
diff --git a/lighty/src/main/java/io/lighty/controllers/tpce/Main.java b/lighty/src/main/java/io/lighty/controllers/tpce/Main.java
new file mode 100644 (file)
index 0000000..1931678
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at https://www.eclipse.org/legal/epl-v10.html
+ */
+package io.lighty.controllers.tpce;
+
+import io.lighty.controllers.tpce.module.TransportPCE;
+import io.lighty.controllers.tpce.module.TransportPCEImpl;
+import io.lighty.controllers.tpce.utils.TPCEUtils;
+import io.lighty.core.controller.api.LightyController;
+import io.lighty.core.controller.api.LightyModule;
+import io.lighty.core.controller.impl.LightyControllerBuilder;
+import io.lighty.core.controller.impl.config.ConfigurationException;
+import io.lighty.core.controller.impl.config.ControllerConfiguration;
+import io.lighty.core.controller.impl.util.ControllerConfigUtils;
+import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConf;
+import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConfBuilder;
+import io.lighty.modules.northbound.restconf.community.impl.config.JsonRestConfServiceType;
+import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration;
+import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils;
+import io.lighty.modules.southbound.netconf.impl.NetconfSBPlugin;
+import io.lighty.modules.southbound.netconf.impl.NetconfTopologyPluginBuilder;
+import io.lighty.modules.southbound.netconf.impl.config.NetconfConfiguration;
+import io.lighty.modules.southbound.netconf.impl.util.NetconfConfigUtils;
+import io.lighty.server.LightyServerBuilder;
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Main {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Main.class);
+
+    private ShutdownHook shutdownHook;
+
+    public void start() {
+        start(new String[] {}, false);
+    }
+
+    public void start(String[] args, boolean registerShutdownHook) {
+        long startTime = System.nanoTime();
+        LOG.info(" ___________     ___________________ ___________");
+        LOG.info(" \\__    ___/     \\______   \\_   ___ \\\\_   _____/");
+        LOG.info("   |    |  ______ |     ___/    \\  \\/ |    __)_");
+        LOG.info("   |    | /_____/ |    |   \\     \\____|        \\");
+        LOG.info("   |____|         |____|    \\______  /_______  /");
+        LOG.info("                                   \\/        \\/");
+        LOG.info(".__  .__       .__     __              .__          ");
+        LOG.info("|  | |__| ____ |  |___/  |_ ___.__.    |__| ____    ");
+        LOG.info("|  | |  |/ ___\\|  |  \\   __<   |  |    |  |/  _ \\");
+        LOG.info("|  |_|  / /_/  >   Y  \\  |  \\___  |    |  (  <_> )");
+        LOG.info("|____/__\\___  /|___|  /__|  / ____| /\\ |__|\\____/");
+        LOG.info("        /_____/     \\/      \\/      \\/           ");
+        LOG.info("Starting lighty.io TransportPCE application ...");
+        LOG.info("https://lighty.io/");
+        LOG.info("https://github.com/PantheonTechnologies/lighty-core");
+        try {
+            LOG.info("using default configuration ...");
+            //1. get controller configuration
+            ControllerConfiguration defaultSingleNodeConfiguration =
+                    ControllerConfigUtils.getDefaultSingleNodeConfiguration(TPCEUtils.yangModels);
+            //2. get RESTCONF NBP configuration
+            RestConfConfiguration restConfConfig =
+                    RestConfConfigUtils.getDefaultRestConfConfiguration();
+            restConfConfig.setJsonRestconfServiceType(JsonRestConfServiceType.DRAFT_02);
+            restConfConfig.setHttpPort(8181);
+            //3. NETCONF SBP configuration
+            NetconfConfiguration netconfSBPConfig = NetconfConfigUtils.createDefaultNetconfConfiguration();
+            startLighty(defaultSingleNodeConfiguration, restConfConfig, netconfSBPConfig, registerShutdownHook);
+            float duration = (System.nanoTime() - startTime) / 1_000_000f;
+            LOG.info("lighty.io and RESTCONF-NETCONF started in {}ms", duration);
+        } catch (Exception e) {
+            LOG.error("Main RESTCONF-NETCONF application exception: ", e);
+        }
+    }
+
+    private void startLighty(ControllerConfiguration controllerConfiguration,
+                             RestConfConfiguration restConfConfiguration,
+                             NetconfConfiguration netconfSBPConfiguration, boolean registerShutdownHook)
+            throws ConfigurationException, ExecutionException, InterruptedException {
+
+        //1. initialize and start Lighty controller (MD-SAL, Controller, YangTools, Akka)
+        LightyControllerBuilder lightyControllerBuilder = new LightyControllerBuilder();
+        LightyController lightyController = lightyControllerBuilder.from(controllerConfiguration).build();
+        lightyController.start().get();
+
+        //2. start RestConf server
+        CommunityRestConfBuilder communityRestConfBuilder = new CommunityRestConfBuilder();
+        LightyServerBuilder jettyServerBuilder = new LightyServerBuilder(new InetSocketAddress(
+                restConfConfiguration.getInetAddress(), restConfConfiguration.getHttpPort()));
+        CommunityRestConf communityRestConf = communityRestConfBuilder.from(RestConfConfigUtils
+                .getRestConfConfiguration(restConfConfiguration, lightyController.getServices()))
+                .withLightyServer(jettyServerBuilder)
+                .build();
+        communityRestConf.start().get();
+        communityRestConf.startServer();
+
+        //3. start NetConf SBP
+        NetconfSBPlugin netconfSouthboundPlugin;
+        netconfSBPConfiguration = NetconfConfigUtils.injectServicesToTopologyConfig(
+                netconfSBPConfiguration, lightyController.getServices());
+        NetconfTopologyPluginBuilder netconfSBPBuilder = new NetconfTopologyPluginBuilder();
+        netconfSouthboundPlugin = netconfSBPBuilder
+                .from(netconfSBPConfiguration, lightyController.getServices())
+                .build();
+        netconfSouthboundPlugin.start().get();
+
+        //4. start TransportPCE beans
+        TransportPCE transportPCE = new TransportPCEImpl(lightyController.getServices());
+        transportPCE.start().get();
+
+        //5. Register shutdown hook for graceful shutdown.
+        shutdownHook = new ShutdownHook(lightyController, communityRestConf, netconfSouthboundPlugin, transportPCE);
+        if (registerShutdownHook) {
+            Runtime.getRuntime().addShutdownHook(shutdownHook);
+        }
+    }
+
+    public void shutdown() {
+        shutdownHook.run();
+    }
+
+    public static void main(String[] args) {
+        Main app = new Main();
+        app.start(args, true);
+    }
+
+    private static class ShutdownHook extends Thread {
+
+        private static final Logger LOG = LoggerFactory.getLogger(ShutdownHook.class);
+        private final LightyController lightyController;
+        private final CommunityRestConf communityRestConf;
+        private final LightyModule netconfSouthboundPlugin;
+        private final TransportPCE transportPCE;
+
+        ShutdownHook(LightyController lightyController, CommunityRestConf communityRestConf,
+                     LightyModule netconfSouthboundPlugin, TransportPCE transportPCE) {
+            this.lightyController = lightyController;
+            this.communityRestConf = communityRestConf;
+            this.netconfSouthboundPlugin = netconfSouthboundPlugin;
+            this.transportPCE = transportPCE;
+        }
+
+        @Override
+        public void run() {
+            LOG.info("lighty.io and RESTCONF-NETCONF shutting down ...");
+            long startTime = System.nanoTime();
+            try {
+                transportPCE.shutdown().get();
+            } catch (Exception e) {
+                LOG.error("Exception while shutting down TransportPCE: ", e);
+            }
+            try {
+                communityRestConf.shutdown().get();
+            } catch (Exception e) {
+                LOG.error("Exception while shutting down RESTCONF: ", e);
+            }
+            try {
+                netconfSouthboundPlugin.shutdown().get();
+            } catch (Exception e) {
+                LOG.error("Exception while shutting down NETCONF: ", e);
+            }
+            try {
+                lightyController.shutdown().get();
+            } catch (Exception e) {
+                LOG.error("Exception while shutting down lighty.io controller:", e);
+            }
+            float duration = (System.nanoTime() - startTime)/1_000_000f;
+            LOG.info("lighty.io and RESTCONF-NETCONF stopped in {}ms", duration);
+        }
+
+    }
+
+}
diff --git a/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCE.java b/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCE.java
new file mode 100644 (file)
index 0000000..e43041f
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at https://www.eclipse.org/legal/epl-v10.html
+ */
+
+package io.lighty.controllers.tpce.module;
+
+import io.lighty.core.controller.api.LightyModule;
+
+public interface TransportPCE extends LightyModule {
+}
diff --git a/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java b/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java
new file mode 100644 (file)
index 0000000..6431cb8
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at https://www.eclipse.org/legal/epl-v10.html
+ */
+
+package io.lighty.controllers.tpce.module;
+
+import io.lighty.core.controller.api.AbstractLightyModule;
+import io.lighty.core.controller.api.LightyServices;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
+import org.opendaylight.transportpce.common.fixedflex.FixedFlexImpl;
+import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
+import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
+import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
+import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.RequestProcessor;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
+import org.opendaylight.transportpce.networkmodel.NetConfTopologyListener;
+import org.opendaylight.transportpce.networkmodel.NetworkModelProvider;
+import org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl;
+import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
+import org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl;
+import org.opendaylight.transportpce.networkmodel.util.OpenRoadmFactory;
+import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology121;
+import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology22;
+import org.opendaylight.transportpce.olm.OlmPowerServiceRpcImpl;
+import org.opendaylight.transportpce.olm.OlmProvider;
+import org.opendaylight.transportpce.olm.power.PowerMgmt;
+import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
+import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl;
+import org.opendaylight.transportpce.pce.impl.PceProvider;
+import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
+import org.opendaylight.transportpce.renderer.NetworkModelWavelengthServiceImpl;
+import org.opendaylight.transportpce.renderer.RendererProvider;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
+import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl;
+import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperationsImpl;
+import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TransportPCEImpl extends AbstractLightyModule implements TransportPCE {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TransportPCEImpl.class);
+    private static final long MaxDurationToSubmitTransaction = 1500;
+
+    // common beans
+    private final DeviceTransactionManagerImpl deviceTransactionManager;
+    private final MappingUtilsImpl mappingUtils;
+    private final OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
+    private final OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221;
+    private final OpenRoadmInterfacesImpl openRoadmInterfaces;
+    private final PortMappingVersion221 portMappingVersion221;
+    private final RequestProcessor requestProcessor;
+    private final NetworkTransactionImpl networkTransaction;
+    private final PortMappingVersion121 portMappingVersion121;
+    private final PortMappingImpl portMapping;
+    private final CrossConnectImpl121 crossConnectImpl121;
+    private final CrossConnectImpl221 crossConnectImpl221;
+    private final CrossConnectImpl crossConnect;
+    private final FixedFlexImpl fixedFlex;
+
+    // pce beans
+    private final PathComputationServiceImpl pathComputationService;
+    private final PceProvider pceProvider;
+
+    // network model beans
+    private final OpenRoadmTopology121 openRoadmTopology121;
+    private final OpenRoadmTopology22 openRoadmTopology22;
+    private final OpenRoadmFactory openRoadmFactory;
+    private final R2RLinkDiscovery linkDiscoveryImpl;
+    private final NetworkUtilsImpl networkutilsServiceImpl;
+    private final NetworkModelServiceImpl networkModelService;
+    private final NetConfTopologyListener netConfTopologyListener;
+    private final NetworkModelProvider networkModelProvider;
+
+    // OLM beans
+    private final PowerMgmt powerMgmt;
+    private final OlmPowerServiceImpl olmPowerService;
+    private final OlmProvider olmProvider;
+    private final OlmPowerServiceRpcImpl olmPowerServiceRpc;
+
+    // renderer beans
+    private final OpenRoadmInterface121 openRoadmInterface121;
+    private final OpenRoadmInterface221 openRoadmInterface22;
+    private final OpenRoadmInterfaceFactory openRoadmInterfaceFactory;
+    private final DeviceRendererServiceImpl deviceRendererService;
+    private final DeviceRendererRPCImpl deviceRendererRPC;
+    private final NetworkModelWavelengthServiceImpl networkModelWavelengthService;
+    private final RendererServiceOperationsImpl rendererServiceOperations;
+    private final RendererProvider rendererProvider;
+
+    // service-handler beans
+    private final ServicehandlerProvider servicehandlerProvider;
+
+    public TransportPCEImpl(LightyServices lightyServices) {
+        LOG.info("Creating common beans ...");
+        deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getControllerBindingMountPointService(), MaxDurationToSubmitTransaction);
+        mappingUtils = new MappingUtilsImpl(lightyServices.getControllerBindingPingPongDataBroker());
+        openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
+        openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(deviceTransactionManager);
+        openRoadmInterfaces = new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121, openRoadmInterfacesImpl221);
+        portMappingVersion221 = new PortMappingVersion221(lightyServices.getControllerBindingPingPongDataBroker(), deviceTransactionManager, openRoadmInterfaces);
+        requestProcessor = new RequestProcessor(lightyServices.getControllerBindingPingPongDataBroker());
+        networkTransaction = new NetworkTransactionImpl(requestProcessor);
+        portMappingVersion121 = new PortMappingVersion121(lightyServices.getControllerBindingPingPongDataBroker(), deviceTransactionManager, openRoadmInterfaces);
+        portMapping = new PortMappingImpl(lightyServices.getControllerBindingPingPongDataBroker(), portMappingVersion221, mappingUtils, portMappingVersion121);
+        crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
+        crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
+        crossConnect = new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221);
+        fixedFlex = new FixedFlexImpl();
+
+        LOG.info("Creating PCE beans ...");
+        pathComputationService = new PathComputationServiceImpl(lightyServices.getControllerBindingPingPongDataBroker(), lightyServices.getControllerBindingNotificationPublishService());
+        pceProvider = new PceProvider(lightyServices.getControllerRpcProviderRegistry(), pathComputationService);
+
+        LOG.info("Creating network-model beans ...");
+        openRoadmTopology121 = new OpenRoadmTopology121(networkTransaction, deviceTransactionManager);
+        openRoadmTopology22 = new OpenRoadmTopology22(networkTransaction, deviceTransactionManager);
+        openRoadmFactory = new OpenRoadmFactory(mappingUtils, openRoadmTopology121, openRoadmTopology22);
+        linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getControllerBindingPingPongDataBroker(), deviceTransactionManager, openRoadmFactory, networkTransaction);
+        networkutilsServiceImpl = new NetworkUtilsImpl(lightyServices.getControllerBindingPingPongDataBroker(), openRoadmFactory);
+        networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl, deviceTransactionManager, openRoadmFactory, portMapping);
+        netConfTopologyListener = new NetConfTopologyListener(networkModelService, lightyServices.getControllerBindingPingPongDataBroker(), deviceTransactionManager);
+        networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getControllerBindingPingPongDataBroker(), lightyServices.getControllerRpcProviderRegistry(), networkutilsServiceImpl, netConfTopologyListener, openRoadmFactory);
+
+        LOG.info("Creating OLM beans ...");
+        powerMgmt = new PowerMgmtImpl(lightyServices.getControllerBindingPingPongDataBroker(), openRoadmInterfaces, crossConnect, deviceTransactionManager);
+        olmPowerService = new OlmPowerServiceImpl(lightyServices.getControllerBindingPingPongDataBroker(), powerMgmt, deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
+        olmProvider = new OlmProvider(lightyServices.getControllerRpcProviderRegistry(), olmPowerService);
+        olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
+
+        LOG.info("Creating renderer beans ...");
+        openRoadmInterface121 = new OpenRoadmInterface121(portMapping, openRoadmInterfaces);
+        openRoadmInterface22 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces, fixedFlex);
+        openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(mappingUtils, openRoadmInterface121, openRoadmInterface22);
+        deviceRendererService = new DeviceRendererServiceImpl(lightyServices.getControllerBindingPingPongDataBroker(), deviceTransactionManager, openRoadmInterfaceFactory, openRoadmInterfaces, crossConnect, portMapping);
+        deviceRendererRPC = new DeviceRendererRPCImpl(deviceRendererService);
+        networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(lightyServices.getControllerBindingPingPongDataBroker());
+        rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService, olmPowerServiceRpc, lightyServices.getControllerBindingPingPongDataBroker(), networkModelWavelengthService, lightyServices.getControllerBindingNotificationPublishService());
+        rendererProvider = new RendererProvider(lightyServices.getControllerRpcProviderRegistry(), deviceRendererRPC, rendererServiceOperations);
+
+        LOG.info("Creating service-handler beans ...");
+        servicehandlerProvider = new ServicehandlerProvider(lightyServices.getControllerBindingPingPongDataBroker(), lightyServices.getControllerRpcProviderRegistry(), lightyServices.getControllerBindingNotificationService(),
+                pathComputationService, rendererServiceOperations, networkModelWavelengthService, lightyServices.getControllerBindingNotificationPublishService());
+
+    }
+
+    @Override
+    protected boolean initProcedure() {
+        LOG.info("Initializing common beans ...");
+        LOG.info("Initializing PCE beans ...");
+        pathComputationService.init();
+        pceProvider.init();
+        LOG.info("Initializing network-model beans ...");
+        networkModelProvider.init();
+        LOG.info("Initializing OLM beans ...");
+        olmPowerService.init();
+        olmProvider.init();
+        LOG.info("Initializing renderer beans ...");
+        rendererProvider.init();
+        LOG.info("Initializing service-handler beans ...");
+        servicehandlerProvider.init();
+        LOG.info("Init done.");
+        return true;
+    }
+
+    @Override
+    protected boolean stopProcedure() {
+        LOG.info("Shutting down service-handler beans ...");
+        servicehandlerProvider.close();
+        LOG.info("Shutting down renderer beans ...");
+        rendererProvider.close();
+        LOG.info("Shutting down OLM beans ...");
+        olmProvider.close();
+        olmPowerService.close();
+        LOG.info("Shutting down network-model beans ...");
+        networkModelProvider.close();
+        LOG.info("Shutting down PCE beans ...");
+        pathComputationService.close();
+        pceProvider.close();
+        LOG.info("Shutting down common beans ...");
+        networkTransaction.close();
+        deviceTransactionManager.preDestroy();
+        LOG.info("Shutdown done.");
+        return true;
+    }
+
+}
diff --git a/lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java b/lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java
new file mode 100644 (file)
index 0000000..3ed61f9
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at https://www.eclipse.org/legal/epl-v10.html
+ */
+
+package io.lighty.controllers.tpce.utils;
+
+import com.google.common.collect.ImmutableSet;
+import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils;
+import io.lighty.modules.southbound.netconf.impl.util.NetconfConfigUtils;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public final class TPCEUtils {
+
+    public static final Set<YangModuleInfo> TPCE_MODELS = ImmutableSet.of(
+
+            // common models
+            org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.amplifier.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.equipment.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.layerrate.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev170929.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev170929.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.probablecause.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.probablecause.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.user.mgmt.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.user.mgmt.rev171215.$YangModuleInfoImpl.getInstance(),
+
+            // device models
+            org.opendaylight.yang.gen.v1.http.org.openroadm.database.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.database.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.de.device.resource.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.de.swdl.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.de.swdl.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.file.transfer.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.file.transfer.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.fwdl.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.fwdl.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev170626.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.loopback.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.loopback.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.testsignal.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.testsignal.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.multiplex.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.rev170626.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.physical.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.physical.types.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.pluggable.optics.holder.capability.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.prot.otn.linear.aps.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.rstp.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.rstp.rev181019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.syslog.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.syslog.rev171215.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.wavelength.map.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.wavelength.map.rev171215.$YangModuleInfoImpl.getInstance(),
+
+            // network models
+            org.opendaylight.yang.gen.v1.http.org.openroadm.amplifier.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.external.pluggable.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.roadm.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev181130.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.$YangModuleInfoImpl.getInstance(),
+
+            // service models
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.$YangModuleInfoImpl.getInstance(),
+
+            // API models / opendaylight
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev170426.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.device.rev170228.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev170930.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev171017.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.$YangModuleInfoImpl.getInstance(),
+
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev171016.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.$YangModuleInfoImpl.getInstance(),
+
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160621.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.$YangModuleInfoImpl.getInstance()
+
+    );
+
+    public static final Set<YangModuleInfo> yangModels = Stream.concat(
+            Stream.concat(
+                    RestConfConfigUtils.YANG_MODELS.stream(),
+                    NetconfConfigUtils.NETCONF_TOPOLOGY_MODELS.stream())
+                    .collect(Collectors.toSet()).stream(), TPCE_MODELS.stream())
+            .collect(Collectors.toSet());
+
+    private TPCEUtils() {
+        throw new UnsupportedOperationException("Please do not instantiate utility class.");
+    }
+
+}
diff --git a/lighty/src/main/resources/log4j.properties b/lighty/src/main/resources/log4j.properties
new file mode 100644 (file)
index 0000000..641aaf7
--- /dev/null
@@ -0,0 +1,4 @@
+log4j.rootLogger=INFO, STDOUT
+log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
+log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
+log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n