cake traffic shaping
This commit is contained in:
parent
9a519432b0
commit
3e5ed906bc
5 changed files with 57 additions and 1 deletions
16
bundles/network/items.py
Normal file
16
bundles/network/items.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
for network_name, network_conf in node.metadata.get('network').items():
|
||||
if 'qdisc' in network_conf:
|
||||
svc_systemd[f'qdisc-{network_name}.service'] = {
|
||||
'enabled': True,
|
||||
'running': None,
|
||||
}
|
||||
actions[f'qdisc-{network_name}.service_restart_workaround'] = {
|
||||
'command': 'true',
|
||||
'triggered': True,
|
||||
'triggered_by': {
|
||||
f'file:/usr/local/lib/systemd/system/qdisc-{network_name}.service',
|
||||
},
|
||||
'triggers': {
|
||||
f'svc_systemd:qdisc-{network_name}.service:restart',
|
||||
},
|
||||
}
|
|
@ -94,6 +94,11 @@ def units(metadata):
|
|||
}
|
||||
}
|
||||
|
||||
# cake WIP
|
||||
|
||||
# if 'cake' in network_conf:
|
||||
# units[f'{network_name}.network']['CAKE'] = network_conf['cake']
|
||||
|
||||
return {
|
||||
'systemd': {
|
||||
'units': units,
|
||||
|
@ -101,3 +106,35 @@ def units(metadata):
|
|||
}
|
||||
else:
|
||||
return {}
|
||||
|
||||
|
||||
@metadata_reactor.provides(
|
||||
'systemd/units',
|
||||
)
|
||||
def queuing_disciplines(metadata):
|
||||
if node.has_bundle('systemd-networkd'):
|
||||
return {
|
||||
'systemd': {
|
||||
'units': {
|
||||
f'qdisc-{network_name}.service': {
|
||||
'Unit': {
|
||||
'Description': f'setup queuing discipline for interface {network_name}',
|
||||
'Wants': 'network.target',
|
||||
'After': 'network.target',
|
||||
'BindsTo': 'network.target',
|
||||
},
|
||||
'Service': {
|
||||
'Type': 'oneshot',
|
||||
'ExecStart': f'/sbin/tc qdisc replace root dev {network_name} {network_conf["qdisc"]}',
|
||||
},
|
||||
'Install': {
|
||||
'WantedBy': 'network-online.target',
|
||||
},
|
||||
}
|
||||
for network_name, network_conf in metadata.get('network').items()
|
||||
if 'qdisc' in network_conf
|
||||
},
|
||||
},
|
||||
}
|
||||
else:
|
||||
return {}
|
||||
|
|
|
@ -8,4 +8,5 @@ examples
|
|||
|
||||
```sh
|
||||
nft add rule inet filter input tcp dport 5201 accept
|
||||
nft add rule inet filter input udp dport 5201 accept
|
||||
```
|
||||
|
|
|
@ -26,7 +26,8 @@ def units(metadata):
|
|||
type = name.split('.')[-1]
|
||||
|
||||
if type == 'service':
|
||||
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'})
|
||||
if not config.get('Install', {}).get('WantedBy', set()):
|
||||
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'})
|
||||
elif type == 'timer':
|
||||
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'})
|
||||
elif type == 'mount':
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
'id': 3,
|
||||
'ipv4': '10.0.99.126/24',
|
||||
'gateway4': '10.0.99.1',
|
||||
'qdisc': 'cake bandwidth 40Mbit diffserv4',
|
||||
},
|
||||
'proxmox': {
|
||||
'type': 'vlan',
|
||||
|
|
Loading…
Reference in a new issue