This slide deck contains extensive docs about our�OFC 2024 demo
It’s intended�for offline reading.�Feel free to reach us at:
Demo
Demo topology
Topology: a triangle in the lab
Lab setup
With a production fiber�carrying live traffic
…with a sensing setup
built on open hardware
Czech Light ™ SDN ROADM
Scalable,
Modular,
Open
Flexgrid, Colorless, Directionless, Contentionless
SDN Spectrum Control and Monitoring
Information & Documentation
more HW & SW details
at the end
of the deck
optics tends to be complex
Is Optics Complex?
It does not have to be.
standard IETF YANG models�for standard functionality
YANG Models
YANG model for ROADMs
YANG: API Which Fits on One Slide
module: czechlight-roadm-device
+--rw channel-plan
| +--rw channel* [name]
| +--rw name string
| +--rw lower-frequency opendevice-t:dwdm-frequency-mhz
| +--rw upper-frequency opendevice-t:dwdm-frequency-mhz
+--rw media-channels* [channel]
| +--rw channel -> /channel-plan/channel/name
| +--rw description? string
| +--rw add!
| | +--rw port device-dependent-port-type
| | +--rw (mode)
| | +--:(attenuation)
| | | +--rw attenuation attenuation-type
| | +--:(power)
| | +--rw power opendevice-t:optical-power-dBm
| +--rw drop!
| | ...
| +--ro power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
| +--ro leaf-in opendevice-t:optical-power-dBm
| +--ro leaf-out opendevice-t:optical-power-dBm
+--ro aggregate-power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
+--rw leaf-ports* [port]
| +--rw port device-dependent-port-type
| +--rw description? string
+--rw line {hw-line-9}?
| +--rw output-voa? attenuation-type <0.0>
| +--ro osc
| +--ro tx-power? opendevice-t:optical-power-dBm
| +--ro rx-power? opendevice-t:optical-power-dBm
+--rw spectrum-scan!
+--rw period union
+--rw pin-source? union {pre-wss-ocm}?
+--ro common-in
| +--ro lowest-frequency frequency-ghz
| +--ro step frequency-ghz
| +--ro p? anydata
+--ro common-out
+--ro lowest-frequency frequency-ghz
+--ro step frequency-ghz
+--ro p? anydata
#1: define the channel plan�(because this is flexgrid)
#1: Define Spectrum
module: czechlight-roadm-device
+--rw channel-plan
| +--rw channel* [name]
| +--rw name string
| +--rw lower-frequency opendevice-t:dwdm-frequency-mhz
| +--rw upper-frequency opendevice-t:dwdm-frequency-mhz
+--rw media-channels* [channel]
| +--rw channel -> /channel-plan/channel/name
| +--rw description? string
| +--rw add!
| | +--rw port device-dependent-port-type
| | +--rw (mode)
| | +--:(attenuation)
| | | +--rw attenuation attenuation-type
| | +--:(power)
| | +--rw power opendevice-t:optical-power-dBm
| +--rw drop!
| | ...
| +--ro power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
| +--ro leaf-in opendevice-t:optical-power-dBm
| +--ro leaf-out opendevice-t:optical-power-dBm
+--ro aggregate-power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
+--rw leaf-ports* [port]
| +--rw port device-dependent-port-type
| +--rw description? string
+--rw line {hw-line-9}?
| +--rw output-voa? attenuation-type <0.0>
| +--ro osc
| +--ro tx-power? opendevice-t:optical-power-dBm
| +--ro rx-power? opendevice-t:optical-power-dBm
+--rw spectrum-scan!
+--rw period union
+--rw pin-source? union {pre-wss-ocm}?
+--ro common-in
| +--ro lowest-frequency frequency-ghz
| +--ro step frequency-ghz
| +--ro p? anydata
+--ro common-out
+--ro lowest-frequency frequency-ghz
+--ro step frequency-ghz
+--ro p? anydata
#2: activate these channels�(they become monitored)
#2: Activate Channels
module: czechlight-roadm-device
+--rw channel-plan
| +--rw channel* [name]
| +--rw name string
| +--rw lower-frequency opendevice-t:dwdm-frequency-mhz
| +--rw upper-frequency opendevice-t:dwdm-frequency-mhz
+--rw media-channels* [channel]
| +--rw channel -> /channel-plan/channel/name
| +--rw description? string
| +--rw add!
| | +--rw port device-dependent-port-type
| | +--rw (mode)
| | +--:(attenuation)
| | | +--rw attenuation attenuation-type
| | +--:(power)
| | +--rw power opendevice-t:optical-power-dBm
| +--rw drop!
| | ...
| +--ro power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
| +--ro leaf-in opendevice-t:optical-power-dBm
| +--ro leaf-out opendevice-t:optical-power-dBm
+--ro aggregate-power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
+--rw leaf-ports* [port]
| +--rw port device-dependent-port-type
| +--rw description? string
+--rw line {hw-line-9}?
| +--rw output-voa? attenuation-type <0.0>
| +--ro osc
| +--ro tx-power? opendevice-t:optical-power-dBm
| +--ro rx-power? opendevice-t:optical-power-dBm
+--rw spectrum-scan!
+--rw period union
+--rw pin-source? union {pre-wss-ocm}?
+--ro common-in
| +--ro lowest-frequency frequency-ghz
| +--ro step frequency-ghz
| +--ro p? anydata
+--ro common-out
+--ro lowest-frequency frequency-ghz
+--ro step frequency-ghz
+--ro p? anydata
#3: setup routing�(might be asymmetrical, attenuation vs. power level,...)
#3: Routing
module: czechlight-roadm-device
+--rw channel-plan
| +--rw channel* [name]
| +--rw name string
| +--rw lower-frequency opendevice-t:dwdm-frequency-mhz
| +--rw upper-frequency opendevice-t:dwdm-frequency-mhz
+--rw media-channels* [channel]
| +--rw channel -> /channel-plan/channel/name
| +--rw description? string
| +--rw add!
| | +--rw port device-dependent-port-type
| | +--rw (mode)
| | +--:(attenuation)
| | | +--rw attenuation attenuation-type
| | +--:(power)
| | +--rw power opendevice-t:optical-power-dBm
| +--rw drop!
| | ...
| +--ro power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
| +--ro leaf-in opendevice-t:optical-power-dBm
| +--ro leaf-out opendevice-t:optical-power-dBm
+--ro aggregate-power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
+--rw leaf-ports* [port]
| +--rw port device-dependent-port-type
| +--rw description? string
+--rw line {hw-line-9}?
| +--rw output-voa? attenuation-type <0.0>
| +--ro osc
| +--ro tx-power? opendevice-t:optical-power-dBm
| +--ro rx-power? opendevice-t:optical-power-dBm
+--rw spectrum-scan!
+--rw period union
+--rw pin-source? union {pre-wss-ocm}?
+--ro common-in
| +--ro lowest-frequency frequency-ghz
| +--ro step frequency-ghz
| +--ro p? anydata
+--ro common-out
+--ro lowest-frequency frequency-ghz
+--ro step frequency-ghz
+--ro p? anydata
#4: fancy monitoring options
#4: Monitoring
module: czechlight-roadm-device
+--rw channel-plan
| +--rw channel* [name]
| +--rw name string
| +--rw lower-frequency opendevice-t:dwdm-frequency-mhz
| +--rw upper-frequency opendevice-t:dwdm-frequency-mhz
+--rw media-channels* [channel]
| +--rw channel -> /channel-plan/channel/name
| +--rw description? string
| +--rw add!
| | +--rw port device-dependent-port-type
| | +--rw (mode)
| | +--:(attenuation)
| | | +--rw attenuation attenuation-type
| | +--:(power)
| | +--rw power opendevice-t:optical-power-dBm
| +--rw drop!
| | ...
| +--ro power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
| +--ro leaf-in opendevice-t:optical-power-dBm
| +--ro leaf-out opendevice-t:optical-power-dBm
+--ro aggregate-power
| +--ro common-in opendevice-t:optical-power-dBm
| +--ro common-out opendevice-t:optical-power-dBm
+--rw leaf-ports* [port]
| +--rw port device-dependent-port-type
| +--rw description? string
+--rw line {hw-line-9}?
| +--rw output-voa? attenuation-type <0.0>
| +--ro osc
| +--ro tx-power? opendevice-t:optical-power-dBm
| +--ro rx-power? opendevice-t:optical-power-dBm
+--rw spectrum-scan!
+--rw period union
+--rw pin-source? union {pre-wss-ocm}?
+--ro common-in
| +--ro lowest-frequency frequency-ghz
| +--ro step frequency-ghz
| +--ro p? anydata
+--ro common-out
+--ro lowest-frequency frequency-ghz
+--ro step frequency-ghz
+--ro p? anydata
live spectrum scans, 2.5pm resolution, 1Hz refresh rate
Monitoring & Telemetry
Time-Series Database
Grafana: On-Device Channel Details
But Grafana can do more:
Physical topology with live per-channel power metering
Grafana: Topology
Can we deploy this
without an NMS?
Store complete config of all channels of all devices in Ansible
Configuration via Ansible
- hosts: roadm-c0
# Ansible’s built-in NETCONF support
connection: ansible.netcommon.netconf
tasks:
# Spectrum Definition
- CzL_channel_plan:
name: ciena
state: present
lower_frequency: '193950000'
upper_frequency: '194150000'
# Spectrum Routing
- CzL_media_channel:
name: ciena
state: present
leaf_port: 1
attenuation_add: 0
attenuation_drop: 10
description: Ciena
(this is how it’s implemented behind the scenes)
Ansible’s NETCONF
def config_string(CHname, min_f, max_f, state) -> str:
'''Turn spectrum channel definition to an XML string'''
root = ET.Element('{urn:ietf:params:xml:ns:netconf:base:1.0}config')
cl = '{http://czechlight.cesnet.cz/yang/czechlight-roadm-device}'
ET.register_namespace('cl', cl[1:-1])
channel_plan = ET.SubElement(root, f'{cl}channel-plan')
channel = ET.SubElement(channel_plan, f'{cl}channel')
if (state == 'absent'):
channel.attrib['ns0:operation'] = 'delete'
ET.SubElement(channel, f'{cl}name').text = CHname
else:
ET.SubElement(channel, f'{cl}name').text = CHname
ET.SubElement(channel, f'{cl}lower-frequency').text = min_f
ET.SubElement(channel, f'{cl}upper-frequency').text = max_f
return ET.tostring(root, encoding='unicode', xml_declaration=True)
demo: re-route a channel
&
watch it in Grafana
Demo recording
sensing setup
Sensing
the motor induces�vibrations to the fiber
Real-time Data
“it shakes before it breaks”
Also, it’s just telemetry.
What’s Next?
Some details
about the ROADMs
Modular system
Czech Light ™ SDN ROADM
Line Degree
Add/Drop Options
Add/Drop Options
Add/Drop Options
Add/Drop Options
In-Line Amplifiers
BiDi EDFAs
SDN at L0
SDN
Operating System
Image source: © Enrico Jörns, Pengutronix.
Open Source
Source Code + CI/CD
Example Integration:
TIP Summit 2019
ONOS + GNPy + OLS
Questions, comments?