Skip to content

Commit

Permalink
T5261: Add AWS load-balancing tunnel handler
Browse files Browse the repository at this point in the history
Add AWS load-balancing tunnel handler
https://aws.amazon.com/blogs/networking-and-content-delivery/how-to-integrate-linux-instances-with-aws-gateway-load-balancer/

set service aws glb script on-create '/config/scripts/tmp.sh'
set service aws glb script on-destroy '/config/scripts/tmp.sh'
set service aws glb status format 'simple'
set service aws glb status port '8282'
set service aws glb threads tunnel '4'
set service aws glb threads tunnel-affinity '1-2'
set service aws glb threads udp '4'
set service aws glb threads udp-affinity '0-3'
  • Loading branch information
sever-sever committed Sep 1, 2023
1 parent ed5d11a commit 1c49d3e
Show file tree
Hide file tree
Showing 5 changed files with 251 additions and 0 deletions.
36 changes: 36 additions & 0 deletions data/templates/aws/override_aws_gwlbtun.conf.j2
@@ -0,0 +1,36 @@
{% set args = [] %}
{% if script.on_create is vyos_defined %}
{% set _ = args.append("-c " + script.on_create) %}
{% endif %}
{% if script.on_destroy is vyos_defined %}
{% set _ = args.append("-r " + script.on_destroy) %}
{% endif %}

{% if status.port is vyos_defined %}
{% set _ = args.append("-p " + status.port) %}
{% endif %}

{% if threads.tunnel is vyos_defined %}
{% set _ = args.append("--tunthreads " + threads.tunnel) %}
{% endif %}
{% if threads.tunnel_affinity is vyos_defined %}
{% set _ = args.append("--tunaffinity " + threads.tunnel_affinity) %}
{% endif %}

{% if threads.udp is vyos_defined %}
{% set _ = args.append("--udpthreads " + threads.udp) %}
{% endif %}
{% if threads.udp_affinity is vyos_defined %}
{% set _ = args.append("--udpaffinity " + threads.udp_affinity) %}
{% endif %}

[Unit]
StartLimitIntervalSec=0
After=vyos-router.service

[Service]
EnvironmentFile=
ExecStart=/usr/bin/gwlbtun {{ args | join(' ') }}
CapabilityBoundingSet=CAP_NET_ADMIN
Restart=always
RestartSec=10
1 change: 1 addition & 0 deletions debian/control
Expand Up @@ -36,6 +36,7 @@ Depends:
accel-ppp,
auditd,
avahi-daemon,
aws-gwlbtun,
beep,
bmon,
bsdmainutils,
Expand Down
127 changes: 127 additions & 0 deletions interface-definitions/service-aws-glb.xml.in
@@ -0,0 +1,127 @@
<?xml version="1.0"?>
<interfaceDefinition>
<node name="service">
<children>
<node name="aws">
<properties>
<help>Amazon Web Service</help>
<priority>1280</priority>
</properties>
<children>
<node name="glb" owner="${vyos_conf_scripts_dir}/service_aws_glb.py">
<properties>
<help>Gateway load-balancer tunnel handler</help>
</properties>
<children>
<node name="script">
<properties>
<help>Script executed on create or destroy tunnel</help>
</properties>
<children>
<leafNode name="on-create">
<properties>
<help>Script to run when interface is created</help>
<constraint>
<validator name="script"/>
</constraint>
</properties>
</leafNode>
<leafNode name="on-destroy">
<properties>
<help>Script to run when interface is destroyed</help>
<constraint>
<validator name="script"/>
</constraint>
</properties>
</leafNode>
</children>
</node>
<node name="status">
<properties>
<help>Status</help>
</properties>
<children>
<leafNode name="format">
<properties>
<help>Statistic format</help>
<completionHelp>
<list>simple full</list>
</completionHelp>
<valueHelp>
<format>simple</format>
<description>Simple format</description>
</valueHelp>
<valueHelp>
<format>full</format>
<description>Full format</description>
</valueHelp>
<constraint>
<regex>(simple|full)</regex>
</constraint>
</properties>
</leafNode>
#include <include/port-number.xml.i>
</children>
</node>
<node name="threads">
<properties>
<help>Threads settings</help>
</properties>
<children>
<leafNode name="tunnel">
<properties>
<help>Number of threads for each tunnel processor</help>
<valueHelp>
<format>u32:1-256</format>
<description>Number of threads</description>
</valueHelp>
<constraint>
<validator name="numeric" argument="--range 1-256"/>
</constraint>
</properties>
</leafNode>
<leafNode name="tunnel-affinity">
<properties>
<help>List of cores worker threads</help>
<valueHelp>
<format>&lt;idN&gt;-&lt;idM&gt;</format>
<description>CPU core id range (use '-' as delimiter)</description>
</valueHelp>
<constraint>
<validator name="numeric" argument="--allow-range --range 0-255"/>
</constraint>
</properties>
</leafNode>
<leafNode name="udp">
<properties>
<help>Number of threads for UDP receiver</help>
<valueHelp>
<format>u32:1-256</format>
<description>Number of threads</description>
</valueHelp>
<constraint>
<validator name="numeric" argument="--range 1-256"/>
</constraint>
</properties>
</leafNode>
<leafNode name="udp-affinity">
<properties>
<help>List of cores worker threads</help>
<valueHelp>
<format>&lt;idN&gt;-&lt;idM&gt;</format>
<description>CPU core id range (use '-' as delimiter)</description>
</valueHelp>
<constraint>
<validator name="numeric" argument="--allow-range --range 0-255"/>
</constraint>
</properties>
</leafNode>
</children>
</node>
</children>
</node>
</children>
</node>
</children>
</node>
</interfaceDefinition>
76 changes: 76 additions & 0 deletions src/conf_mode/service_aws_glb.py
@@ -0,0 +1,76 @@
#!/usr/bin/env python3
#
# Copyright (C) 2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

from sys import exit

from vyos.config import Config
from vyos.template import render
from vyos.utils.process import call
from vyos import ConfigError
from vyos import airbag
airbag.enable()

systemd_service = 'aws-gwlbtun.service'
systemd_override = '/run/systemd/system/aws-gwlbtun.service.d/10-override.conf'


def get_config(config=None):
if config:
conf = config
else:
conf = Config()
base = ['service', 'aws', 'glb']
if not conf.exists(base):
return None

glb = conf.get_config_dict(base, key_mangling=('-', '_'),
get_first_key=True,
no_tag_node_value_mangle=True)

return glb


def verify(glb):
# bail out early - looks like removal from running config
if not glb:
return None


def generate(glb):
if not glb:
return None

render(systemd_override, 'aws/override_aws_gwlbtun.conf.j2', glb)


def apply(glb):
call('systemctl daemon-reload')
if not glb:
call(f'systemctl stop {systemd_service}')
else:
call(f'systemctl restart {systemd_service}')
return None


if __name__ == '__main__':
try:
c = get_config()
verify(c)
generate(c)
apply(c)
except ConfigError as e:
print(e)
exit(1)
11 changes: 11 additions & 0 deletions src/systemd/aws-gwlbtun.service
@@ -0,0 +1,11 @@
[Unit]
Description=Description=AWS Gateway Load Balancer Tunnel Handler
Documentation=https://github.com/aws-samples/aws-gateway-load-balancer-tunnel-handler
After=network.target

[Service]
ExecStart=
Restart=on-failure

[Install]
WantedBy=multi-user.target

0 comments on commit 1c49d3e

Please sign in to comment.