From: Marius Schellenberger <proxmox@giftfish.de>
To: pve-devel@pve.proxmox.com
Cc: Marius Schellenberger <proxmox@giftfish.de>
Subject: [pve-devel] [PATCH qemu-server] api: cloud-init support for mtu and userdata
Date: Thu, 2 Jul 2020 18:08:37 +0200 [thread overview]
Message-ID: <20200702160838.36097-2-proxmox@giftfish.de> (raw)
In-Reply-To: <20200702160838.36097-1-proxmox@giftfish.de>
Extended the PVE API to configure cloud-init userdata and network
interface MTU.
Signed-off-by: Marius Schellenberger <proxmox@giftfish.de>
---
PVE/API2/Qemu.pm | 1 +
PVE/QemuServer.pm | 18 +++++++++++++++++-
PVE/QemuServer/Cloudinit.pm | 31 +++++++++++++++++++++++++++++--
3 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index b33359d..02507de 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -324,6 +324,7 @@ my $cloudinitoptions = {
cipassword => 1,
citype => 1,
ciuser => 1,
+ ciuserdata => 1,
nameserver => 1,
searchdomain => 1,
sshkeys => 1,
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 6872e06..ef4342d 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -727,6 +727,12 @@ my $confdesc_cloudinit = {
description => 'cloud-init: Specify custom files to replace the automatically generated ones at start.',
format => 'pve-qm-cicustom',
},
+ ciuserdata => {
+ optional => 1,
+ type => 'string',
+ format => 'urlencoded',
+ description => 'cloud-init: Specify custom user-data as urlencoded base64 string to replace the automatically generated one at start. When set, the following options have no effect: `ciuser`, `cipassword`, `sshkeys`',
+ },
searchdomain => {
optional => 1,
type => 'string',
@@ -932,6 +938,12 @@ my $ipconfig_fmt = {
optional => 1,
requires => 'ip6',
},
+ mtu => {
+ type => 'string',
+ format_description => 'MTU',
+ description => 'MTU value for interface.',
+ optional => 1,
+ },
};
PVE::JSONSchema::register_format('pve-qm-ipconfig', $ipconfig_fmt);
my $ipconfigdesc = {
@@ -1701,7 +1713,7 @@ sub parse_net {
return $res;
}
-# ipconfigX ip=cidr,gw=ip,ip6=cidr,gw6=ip
+# ipconfigX ip=cidr,gw=ip,ip6=cidr,gw6=ip,mtu=mtu
sub parse_ipconfig {
my ($data) = @_;
@@ -1711,6 +1723,10 @@ sub parse_ipconfig {
return undef;
}
+ if ($res->{mtu} && !$res->{ip} && !$res->{ip6}) {
+ warn 'mtu specified without specifying an IP or IPv6 address';
+ return undef;
+ }
if ($res->{gw} && !$res->{ip}) {
warn 'gateway specified without specifying an IP address';
return undef;
diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm
index 439de99..a47e0ce 100644
--- a/PVE/QemuServer/Cloudinit.pm
+++ b/PVE/QemuServer/Cloudinit.pm
@@ -6,6 +6,7 @@ use warnings;
use File::Path;
use Digest::SHA;
use URI::Escape;
+use MIME::Base64 qw(decode_base64);
use PVE::Tools qw(run_command file_set_contents);
use PVE::Storage;
@@ -111,6 +112,11 @@ sub get_dns_conf {
sub cloudinit_userdata {
my ($conf, $vmid) = @_;
+ my $userdata = $conf->{ciuserdata};
+ if (defined($userdata) && $userdata ne "") {
+ return decode_base64(uri_unescape($userdata));
+ }
+
my ($hostname, $fqdn) = get_hostname_fqdn($conf, $vmid);
my $content = "#cloud-config\n";
@@ -176,7 +182,9 @@ sub configdrive2_network {
(my $id = $iface) =~ s/^net//;
next if !$conf->{"ipconfig$id"};
my $net = PVE::QemuServer::parse_ipconfig($conf->{"ipconfig$id"});
+ next if !defined($net);
$id = "eth$id";
+ my $mtu = $net->{mtu};
$content .="auto $id\n";
if ($net->{ip}) {
@@ -189,6 +197,9 @@ sub configdrive2_network {
$content .= " netmask $mask\n";
$content .= " gateway $net->{gw}\n" if $net->{gw};
}
+ if (defined($mtu) && $mtu ne "") {
+ $content .= " mtu $mtu\n";
+ }
}
if ($net->{ip6}) {
if ($net->{ip6} =~ /^(auto|dhcp)$/) {
@@ -200,6 +211,9 @@ sub configdrive2_network {
$content .= " netmask $mask\n";
$content .= " gateway $net->{gw6}\n" if $net->{gw6};
}
+ if (defined($mtu) && $mtu ne "") {
+ $content .= " mtu $mtu\n";
+ }
}
}
@@ -261,6 +275,7 @@ sub nocloud_network_v2 {
my $net = PVE::QemuServer::parse_net($conf->{$iface});
my $ipconfig = PVE::QemuServer::parse_ipconfig($conf->{"ipconfig$id"});
+ next if !defined($ipconfig);
my $mac = $net->{macaddr}
or die "network interface '$iface' has no mac address\n";
@@ -295,6 +310,10 @@ sub nocloud_network_v2 {
if (defined(my $gw = $ipconfig->{gw6})) {
$content .= "${i}gateway6: '$gw'\n";
}
+ my $mtu = $ipconfig->{mtu};
+ if (defined($mtu) && $mtu ne "") {
+ $content .= "${i}mtu: $mtu\n";
+ }
next if $dns_done;
$dns_done = 1;
@@ -332,14 +351,22 @@ sub nocloud_network {
my $net = PVE::QemuServer::parse_net($conf->{$iface});
my $ipconfig = PVE::QemuServer::parse_ipconfig($conf->{"ipconfig$id"});
+ next if !defined($ipconfig);
my $mac = lc($net->{macaddr})
or die "network interface '$iface' has no mac address\n";
+ my $mtu = $ipconfig->{mtu};
+
$content .= "${i}- type: physical\n"
. "${i} name: eth$id\n"
- . "${i} mac_address: '$mac'\n"
- . "${i} subnets:\n";
+ . "${i} mac_address: '$mac'\n";
+
+ if (defined($mtu) && $mtu ne "") {
+ $content .= "${i} mtu: $mtu\n";
+ }
+
+ $content .= "${i} subnets:\n";
$i .= ' ';
if (defined(my $ip = $ipconfig->{ip})) {
if ($ip eq 'dhcp') {
--
2.27.0
next prev parent reply other threads:[~2020-07-02 14:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-02 16:08 [pve-devel] Extend cloud-init API with MTU " Marius Schellenberger
2020-07-02 16:08 ` Marius Schellenberger [this message]
2020-07-13 12:51 ` [pve-devel] [PATCH qemu-server] api: cloud-init support for mtu " Mira Limbeck
2020-07-02 16:08 ` [pve-devel] [PATCH manager] ui: added cloud-init mtu and userdata options Marius Schellenberger
2020-07-13 11:53 ` [pve-devel] Extend cloud-init API with MTU and userdata Mira Limbeck
2020-07-13 15:06 [pve-devel] [PATCH qemu-server] api: cloud-init support for mtu " Julien Escario
2020-09-04 15:21 proxmox
2020-09-07 7:33 ` Alexandre DERUMIER
2020-09-09 9:06 ` proxmox
2020-09-09 13:02 ` Alexandre DERUMIER
2020-09-09 13:46 ` Alexandre DERUMIER
2020-09-09 14:05 ` Mira Limbeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200702160838.36097-2-proxmox@giftfish.de \
--to=proxmox@giftfish.de \
--cc=pve-devel@pve.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox