OFC 2021 demo: config generators and their output

The original topology (`original-gnpy.json`) comes from the past demos
we've done. What's new is all that YANG work.

Change-Id: I9940a6a620ae9c6f0948d5c5ff7d788f66277571
This commit is contained in:
Jan Kundrát
2021-06-06 12:00:45 +02:00
parent 183639ba07
commit d201ec26bf
10 changed files with 5472 additions and 1 deletions

View File

@@ -0,0 +1,87 @@
# The GNPy YANG demo at OFC 2021
The demo needs one piece of YANG-formatted data which includes all settings for GNPy as well as the ONOS topology.
This is generated via:
```console-session
$ python gnpy/example-data/2021-demo/generate-demo.py
```
...which puts files into `gnpy/example-data/2021-demo/`.
```console-session
$ FLASK_APP=gnpy.tools.rest_server.app flask run
$ curl -v -X POST -H "Content-Type: application/json" -d @gnpy/example-data/2021-demo/yang.json http://localhost:5000/gnpy-experimental/topology
```
ONOS-formatted `devices.json` and `links.json` are available from the topology:
- `http://localhost:5000/gnpy-experimental/onos/devices`
- `http://localhost:5000/gnpy-experimental/onos/links`
## Misc notes
The version of ONOS I used cannot configure the TX power on our transponders:
```
19:06:08.347 INFO [GnpyManager] Configuring egress with power 0.0 for DefaultDevice{id=netconf:10.0.254.103:830, type=TERMINAL_DEVICE, manufacturer=Infinera, hwVersion=Groove, swVersion=4.0.3, serialNumber=, driver=groove}
19:06:08.348 INFO [TerminalDevicePowerConfig] Setting power <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config><target><running/></target><config><components xmlns="http://openconfig.net/yang/platform"><component><name>OCH-1-1-L1</name><optical-channel xmlns="http://openconfig.net/yang/terminal-device"><config><target-output-power>0.0</target-output-power></config></optical-channel></component></components></config></edit-config></rpc>
19:06:08.349 DEBUG [TerminalDevicePowerConfig] Request <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<components xmlns="http://openconfig.net/yang/platform">
<component>
<name>OCH-1-1-L1</name>
<optical-channel xmlns="http://openconfig.net/yang/terminal-device">
<config>
<target-output-power>0.0</target-output-power>
</config>
</optical-channel>
</component>
</components>
</config>
</edit-config>
</rpc>
19:06:08.701 DEBUG [TerminalDevicePowerConfig] Response <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="18">
<ok/>
</rpc-reply>
19:06:08.705 WARN [NetconfSessionMinaImpl] Device netconf:administrator@10.0.254.103:830 has error in reply <?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="18">
<rpc-error>
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag>
<error-severity>error</error-severity>
<error-message>Request could not be completed because the requested operation is not supported by this implementation.</error-message>
</rpc-error>
</rpc-reply>
19:06:08.706 ERROR [TerminalDevicePowerConfig] error committing channel power
org.onosproject.netconf.NetconfException: Request not successful with device netconf:administrator@10.0.254.103:830 with reply <?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="18">
<rpc-error>
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag>
<error-severity>error</error-severity>
<error-message>Request could not be completed because the requested operation is not supported by this implementation.</error-message>
</rpc-error>
</rpc-reply>
at org.onosproject.netconf.ctl.impl.NetconfSessionMinaImpl.requestSync(NetconfSessionMinaImpl.java:516) ~[?:?]
at org.onosproject.netconf.ctl.impl.NetconfSessionMinaImpl.requestSync(NetconfSessionMinaImpl.java:509) ~[?:?]
at org.onosproject.netconf.AbstractNetconfSession.commit(AbstractNetconfSession.java:336) ~[?:?]
at org.onosproject.drivers.odtn.openconfig.TerminalDevicePowerConfig$ComponentType.setTargetPower(TerminalDevicePowerConfig.java:401) ~[?:?]
at org.onosproject.drivers.odtn.openconfig.TerminalDevicePowerConfig$ComponentType$1.setTargetPower(TerminalDevicePowerConfig.java:315) ~[?:?]
at org.onosproject.drivers.odtn.openconfig.TerminalDevicePowerConfig.setTargetPower(TerminalDevicePowerConfig.java:222) ~[?:?]
at org.onosproject.odtn.impl.GnpyManager.setPathPower(GnpyManager.java:562) ~[?:?]
at org.onosproject.odtn.impl.GnpyManager$InternalIntentListener.lambda$event$0(GnpyManager.java:509) ~[?:?]
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:834) [?:?]
```
Filter out launch power settings.
It's not needed anyway, the very first node after a transponder is a ROADM.

View File

@@ -0,0 +1,11 @@
{
"nf_ripple": [
0.0
],
"gain_ripple": [
0.0
],
"dgt": [
1.0
]
}

View File

@@ -0,0 +1,116 @@
{ "Edfa":[
{
"type_variety": "fixed27",
"type_def": "fixed_gain",
"gain_flatmax": 27,
"gain_min": 27,
"p_max": 21,
"nf0": 5.5,
"allowed_for_design": false
},
{
"type_variety": "fixed22",
"type_def": "fixed_gain",
"gain_flatmax": 22,
"gain_min": 22,
"p_max": 21,
"nf0": 5.5,
"allowed_for_design": false
}
],
"Fiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"pmd_coef": 1.265e-15
}
],
"Span":[{
"power_mode": false,
"delta_power_range_db": [-2,3,0.5],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 2.5,
"max_length": 150,
"length_units": "km",
"max_loss": 28,
"padding": 10,
"EOL": 0,
"con_in": 0,
"con_out": 0
}
],
"Roadm":[{
"target_pch_out_db": -25,
"add_drop_osnr": 30.00,
"pmd": 0,
"restrictions": {
"preamp_variety_list":[],
"booster_variety_list":[]
}
}],
"SI":[{
"f_min": 191.6e12,
"baud_rate": 32e9,
"f_max":195.1e12,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [0,0,1],
"roll_off": 0.15,
"tx_osnr": 40,
"sys_margins": 2
}],
"Transceiver":[
{
"type_variety": "Cassini",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "dp-qpsk",
"baud_rate": 32e9,
"OSNR": 11,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 37.5e9,
"cost":1
},
{
"format": "16-qam",
"baud_rate": 66e9,
"OSNR": 15,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 75e9,
"cost":1
}
]
},
{
"type_variety": "Voyager",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 37.5e9,
"cost":1
}
]
}
]
}

View File

@@ -0,0 +1,291 @@
{
"result": {
"response": [
{
"path-properties": {
"path-metric": [
{
"accumulative-value": 19.38,
"metric-type": "SNR-bandwidth"
},
{
"accumulative-value": 23.46,
"metric-type": "SNR-0.1nm"
},
{
"accumulative-value": 19.38,
"metric-type": "OSNR-bandwidth"
},
{
"accumulative-value": 23.47,
"metric-type": "OSNR-0.1nm"
},
{
"accumulative-value": 100000000000,
"metric-type": "path_bandwidth"
}
],
"path-route-objects": [
{
"path-route-object": {
"index": 0,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "transceiver",
"gnpy-nodes": [
"trx-Bremen"
],
"link-tp-id": "netconf:10.0.254.103:830",
"node-id": "netconf:10.0.254.103:830",
"transponder": {
"transponder-mode": "dp-qpsk",
"transponder-type": "Cassini"
}
}
}
},
{
"path-route-object": {
"index": 1,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Bremen-AD"
],
"link-tp-id": "netconf:10.0.254.225:830",
"node-id": "netconf:10.0.254.225:830",
"target-channel-power": -12
}
}
},
{
"path-route-object": {
"index": 5,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Bremen-L2"
],
"link-tp-id": "netconf:10.0.254.102:830",
"node-id": "netconf:10.0.254.102:830",
"target-channel-power": -23
}
}
},
{
"path-route-object": {
"index": 9,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Amsterdam-L1"
],
"link-tp-id": "netconf:10.0.254.78:830",
"node-id": "netconf:10.0.254.78:830",
"target-channel-power": -12
}
}
},
{
"path-route-object": {
"index": 13,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Amsterdam-AD"
],
"link-tp-id": "netconf:10.0.254.107:830",
"node-id": "netconf:10.0.254.107:830",
"target-channel-power": -13
}
}
},
{
"path-route-object": {
"index": 14,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "transceiver",
"gnpy-nodes": [
"trx-Amsterdam"
],
"link-tp-id": "netconf:10.0.254.105:830",
"node-id": "netconf:10.0.254.105:830",
"transponder": {
"transponder-mode": "dp-qpsk",
"transponder-type": "Cassini"
}
}
}
}
],
"reversed-path-route-objects": [
{
"path-route-object": {
"index": 0,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "transceiver",
"gnpy-nodes": [
"trx-Amsterdam"
],
"link-tp-id": "netconf:10.0.254.105:830",
"node-id": "netconf:10.0.254.105:830",
"transponder": {
"transponder-mode": "dp-qpsk",
"transponder-type": "Cassini"
}
}
}
},
{
"path-route-object": {
"index": 1,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Amsterdam-AD"
],
"link-tp-id": "netconf:10.0.254.107:830",
"node-id": "netconf:10.0.254.107:830",
"target-channel-power": -12
}
}
},
{
"path-route-object": {
"index": 6,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "EDFA",
"gnpy-nodes": [
"roadm-Amsterdam-L1-booster"
],
"link-tp-id": "netconf:10.0.254.78:830",
"node-id": "netconf:10.0.254.78:830",
"target-channel-power": -1
}
}
},
{
"path-route-object": {
"index": 9,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Bremen-L2"
],
"link-tp-id": "netconf:10.0.254.102:830",
"node-id": "netconf:10.0.254.102:830",
"target-channel-power": -12
}
}
},
{
"path-route-object": {
"index": 13,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "ROADM",
"gnpy-nodes": [
"roadm-Bremen-AD"
],
"link-tp-id": "netconf:10.0.254.225:830",
"node-id": "netconf:10.0.254.225:830",
"target-channel-power": -13
}
}
},
{
"path-route-object": {
"index": 14,
"label-hop": {
"M": 4,
"N": -236
},
"num-unnum-hop": {
"gnpy-node-type": "transceiver",
"gnpy-nodes": [
"trx-Bremen"
],
"link-tp-id": "netconf:10.0.254.103:830",
"node-id": "netconf:10.0.254.103:830",
"transponder": {
"transponder-mode": "dp-qpsk",
"transponder-type": "Cassini"
}
}
}
}
],
"z-a-path-metric": [
{
"accumulative-value": 19.38,
"metric-type": "SNR-bandwidth"
},
{
"accumulative-value": 23.46,
"metric-type": "SNR-0.1nm"
},
{
"accumulative-value": 19.38,
"metric-type": "OSNR-bandwidth"
},
{
"accumulative-value": 23.47,
"metric-type": "OSNR-0.1nm"
},
{
"accumulative-value": 0.001,
"metric-type": "reference_power"
},
{
"accumulative-value": 100000000000,
"metric-type": "path_bandwidth"
}
]
},
"response-id": "onos-3"
}
]
}
}

View File

@@ -0,0 +1,447 @@
import json
from pathlib import Path
from gnpy.tools.json_io import load_equipment, load_network
from gnpy.yang.io import save_to_json
# How many nodes in the ring topology? Up to eight is supported, then I ran out of cities..
HOW_MANY = 3
# city names
ALL_CITIES = [
'Amsterdam',
'Bremen',
'Cologne',
'Dueseldorf',
'Eindhoven',
'Frankfurt',
'Ghent',
'Hague',
]
# end of configurable parameters
J = {
"elements": [],
"connections": [],
}
def unidir_join(a, b):
global J
J["connections"].append(
{"from_node": a, "to_node": b}
)
def mk_edfa(name, gain, voa=0.0):
global J
J["elements"].append(
{"uid": name, "type": "Edfa", "type_variety": f"fixed{gain}", "operational": {"gain_target": gain, "out_voa": voa}}
)
def add_att(a, b, att):
global J
if att > 0:
uid = f"att-({a})-({b})"
else:
uid = f"splice-({a})-({b})"
J["elements"].append(
{"uid": uid, "type": "Fused", "params": {"loss": att}},
)
unidir_join(a, uid)
unidir_join(uid, b)
return uid
def build_fiber(city1, city2):
global J
J["elements"].append(
{
"uid": f"fiber-{city1}-{city2}",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 50,
"length_units": "km",
"loss_coef": 0.2,
"con_in": 1.5,
"con_out": 1.5,
}
}
)
def unidir_patch(a, b):
global J
uid = f"patch-({a})-({b})"
J["elements"].append(
{
"uid": uid,
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 0,
"length_units": "km",
"loss_coef": 0.2,
"con_in": 0.5,
"con_out": 0.5,
}
}
)
add_att(a, uid, 0.0)
add_att(uid, b, 0.0)
for CITY in (ALL_CITIES[x] for x in range(0, HOW_MANY)):
J["elements"].append(
{"uid": f"trx-{CITY}", "type_variety": "Cassini", "type": "Transceiver"}
)
target_pwr = {
f"trx-{CITY}": -8,
f"splice-(roadm-{CITY}-AD)-(patch-(roadm-{CITY}-AD)-(roadm-{CITY}-L1))": -12,
f"splice-(roadm-{CITY}-AD)-(patch-(roadm-{CITY}-AD)-(roadm-{CITY}-L2))": -12,
}
J["elements"].append(
{"uid": f"roadm-{CITY}-AD", "type": "Roadm", "params": {"target_pch_out_db": -2.0, "per_degree_pch_out_db": target_pwr}}
)
unidir_join(f"trx-{CITY}", f"roadm-{CITY}-AD")
unidir_join(f"roadm-{CITY}-AD", f"trx-{CITY}")
for n in (1,2):
target_pwr = {
f"roadm-{CITY}-L{n}-booster": -23,
f"splice-(roadm-{CITY}-L{n})-(patch-(roadm-{CITY}-L{n})-(roadm-{CITY}-AD))": -12,
}
for m in (1,2):
if m == n:
continue
target_pwr[f"splice-(roadm-{CITY}-L{n})-(patch-(roadm-{CITY}-L{n})-(roadm-{CITY}-L{m}))"] = -12
J["elements"].append(
{"uid": f"roadm-{CITY}-L{n}", "type": "Roadm", "params": {"target_pch_out_db": -23.0, "per_degree_pch_out_db": target_pwr}}
)
mk_edfa(f"roadm-{CITY}-L{n}-booster", 22)
mk_edfa(f"roadm-{CITY}-L{n}-preamp", 27)
unidir_join(f"roadm-{CITY}-L{n}", f"roadm-{CITY}-L{n}-booster")
unidir_join(f"roadm-{CITY}-L{n}-preamp", f"roadm-{CITY}-L{n}")
unidir_patch(f"roadm-{CITY}-AD", f"roadm-{CITY}-L{n}")
unidir_patch(f"roadm-{CITY}-L{n}", f"roadm-{CITY}-AD")
for m in (1,2):
if m == n:
continue
unidir_patch(f"roadm-{CITY}-L{n}", f"roadm-{CITY}-L{m}")
for city1, city2 in ((ALL_CITIES[i], ALL_CITIES[i + 1] if i < HOW_MANY - 1 else ALL_CITIES[0]) for i in range(0, HOW_MANY)):
build_fiber(city1, city2)
unidir_join(f"roadm-{city1}-L1-booster", f"fiber-{city1}-{city2}")
unidir_join(f"fiber-{city1}-{city2}", f"roadm-{city2}-L2-preamp")
build_fiber(city2, city1)
unidir_join(f"roadm-{city2}-L2-booster", f"fiber-{city2}-{city1}")
unidir_join(f"fiber-{city2}-{city1}", f"roadm-{city1}-L1-preamp")
for _, E in enumerate(J["elements"]):
uid = E["uid"]
if uid.startswith("roadm-") and (uid.endswith("-L1-booster") or uid.endswith("-L2-booster")):
E["operational"]["out_voa"] = 12.0
with open('gnpy/example-data/2021-demo/original-gnpy.json', 'w') as f:
json.dump(J, f, indent=2)
equipment = load_equipment('gnpy/example-data/2021-demo/equipment.json')
network = load_network(Path('gnpy/example-data/2021-demo/original-gnpy.json'), equipment)
yang_bundle = save_to_json(equipment, network)
with open('gnpy/example-data/2021-demo/yang-without-onos.json', 'w') as f:
json.dump(yang_bundle, f, indent=2)
yang_bundle['ietf-network:networks']['network'].append({
"network-id": "ONOS",
"network-types": {
"tip-onos-topology:onos-topology": {
}
},
"node": [
{
"node-id": "netconf:10.0.254.105:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "trx-Amsterdam"
}
],
"tip-onos-topology:device": {
"name": "Amsterdam TXP (g30-horni)",
"driver": "groove",
"grid-x": -150,
"grid-y": 350,
"netconf": {
"username": "administrator",
"password": "e2e!Net4u#"
}
}
},
{
"node-id": "netconf:10.0.254.78:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L1"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L1-preamp"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L1-booster"
}
],
"tip-onos-topology:device": {
"name": "Amsterdam L1 to Bremen (line-QR79)",
"driver": "czechlight-roadm",
"grid-x": 225,
"grid-y": 320,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.79:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L2"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L2-boster"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-L2-preamp"
}
],
"tip-onos-topology:device": {
"name": "Amsterdam L2 to Cologne (line-Q7JS)",
"driver": "czechlight-roadm",
"grid-x": 225,
"grid-y": 380,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.107:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Amsterdam-AD"
}
],
"tip-onos-topology:device": {
"name": "Amsterdam Add/Drop (coh-a-d-v9u)",
"driver": "czechlight-roadm",
"grid-x": 175,
"grid-y": 350,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.99:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L1"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L1-preamp"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L1-booster"
}
],
"tip-onos-topology:device": {
"name": "Cologne L1 to Amsterdam (line-TQQ)",
"driver": "czechlight-roadm",
"grid-x": 420,
"grid-y": 550,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.104:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L2"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L2-boster"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Cologne-L2-preamp"
}
],
"tip-onos-topology:device": {
"name": "Cologne L2 to Bremen (line-QLK6)",
"driver": "czechlight-roadm",
"grid-x": 480,
"grid-y": 550,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.100:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L1"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L1-preamp"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L1-booster"
}
],
"tip-onos-topology:device": {
"name": "Bremen L1 to Cologne (line-WKP)",
"driver": "czechlight-roadm",
"grid-x": 700,
"grid-y": 380,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.102:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L2"
},
# try removing the following section to see how a wrong power config affects the results
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L2-booster"
},
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-L2-preamp"
}
],
"tip-onos-topology:device": {
"name": "Bremen L2 to Amsterdam (line-QCP9)",
"driver": "czechlight-roadm",
"grid-x": 700,
"grid-y": 320,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.225:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "roadm-Bremen-AD"
}
],
"tip-onos-topology:device": {
"name": "Bremen Add/Drop (add-drop-SPI)",
"driver": "czechlight-roadm",
"grid-x": 750,
"grid-y": 350,
"netconf": {
"idle-timeout": 0,
"username": "dwdm",
"password": "dwdm"
}
}
},
{
"node-id": "netconf:10.0.254.103:830",
"supporting-node": [
{
"network-ref": "GNPy",
"node-ref": "trx-Bremen"
}
],
"tip-onos-topology:device": {
"name": "Amsterdam TXP (g30-spodni)",
"driver": "groove",
"grid-x": 1050,
"grid-y": 350,
"netconf": {
"username": "administrator",
"password": "e2e!Net4u#"
}
}
}
],
"ietf-network-topology:link": [
{
"link-id": "netconf:10.0.254.105:830/10101-netconf:10.0.254.107:830/1"
},
{
"link-id": "netconf:10.0.254.107:830/100-netconf:10.0.254.78:830/1"
},
{
"link-id": "netconf:10.0.254.107:830/100-netconf:10.0.254.79:830/2"
},
{
"link-id": "netconf:10.0.254.79:830/1-netconf:10.0.254.78:830/2"
},
{
"link-id": "netconf:10.0.254.99:830/1-netconf:10.0.254.104:830/1"
},
{
"link-id": "netconf:10.0.254.79:830/100-netconf:10.0.254.99:830/100"
},
{
"link-id": "netconf:10.0.254.104:830/100-netconf:10.0.254.100:830/100"
},
{
"link-id": "netconf:10.0.254.102:830/100-netconf:10.0.254.78:830/100"
},
{
"link-id": "netconf:10.0.254.100:830/1-netconf:10.0.254.225:830/100"
},
{
"link-id": "netconf:10.0.254.102:830/2-netconf:10.0.254.225:830/100"
},
{
"link-id": "netconf:10.0.254.102:830/1-netconf:10.0.254.100:830/2"
},
{
"link-id": "netconf:10.0.254.103:830/10101-netconf:10.0.254.225:830/1"
}
]
}
)
with open('gnpy/example-data/2021-demo/yang.json', 'w') as f:
json.dump(yang_bundle, f, indent=2)

View File

@@ -0,0 +1 @@
{"path-request":[{"request-id":"onos-3","source":"netconf:10.0.254.103:830","destination":"netconf:10.0.254.105:830","src-tp-id":"netconf:10.0.254.103:830","dst-tp-id":"netconf:10.0.254.105:830","bidirectional":true,"path-constraints":{"te-bandwidth":{"technology":"flexi-grid","trx_type":"Cassini","trx_mode":null,"effective-freq-slot":[{"N":"null","M":"null"}],"spacing":5.0E10,"max-nb-of-channel":null,"output-power":null,"path_bandwidth":1.0E11}}}]}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -57,7 +57,12 @@ def _yangson_datamodel():
return create_datamodel
@pytest.mark.parametrize("filename", (Path(__file__).parent / 'yang').glob('*.json'), ids=_get_basename)
@pytest.mark.parametrize("filename",
list((Path(__file__).parent / 'yang').glob('*.json')) + [
SRC_ROOT / 'gnpy' / 'example-data' / '2021-demo' / 'yang-without-onos.json',
SRC_ROOT / 'gnpy' / 'example-data' / '2021-demo' / 'yang.json',
],
ids=_get_basename)
def test_validate_yang_data(_yangson_datamodel, filename: Path):
'''Validate a JSON file against our YANG models'''
dm = _yangson_datamodel()