From: aderumier@odiso.com
To: Thomas Lamprecht <t.lamprecht@proxmox.com>,
Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Subject: Re: [pve-devel] [PATCH qemu-server 1/4] cloudinit: add cloudinit section for current generated config.
Date: Thu, 25 Mar 2021 17:29:05 +0100 [thread overview]
Message-ID: <e270af1e0e5670adc2d53e683eb432cf3dc398dd.camel@odiso.com> (raw)
In-Reply-To: <7f406812-b102-37ea-d967-1d43d4a759cf@proxmox.com>
> But that collides with snapshots? E.g., if I make one named CLOUDINIT
> I get
> also a [CLOUDINIT] section in the config?
>
oh, you are right indeed. I have added a check for new snasphots, but
user could
have already a snapshot called CLOUDINIT.
> If we go that way you may want to use a unique identifier,
> [special:cloudinit]
> or the like (colons are not allowed for snapshot names, IIRC).
ok, I'll rework my patch .
Thanks for the review !
Le mercredi 24 mars 2021 à 06:58 +0100, Thomas Lamprecht a écrit :
> On 19.03.21 13:06, Alexandre Derumier wrote:
> > Instead using vm pending options for pending cloudinit generated
> > config,
> >
> > write current generated cloudinit config in a new [CLOUDINIT]
> > SECTION.
>
> But that collides with snapshots? E.g., if I make one named CLOUDINIT
> I get
> also a [CLOUDINIT] section in the config?
>
> If we go that way you may want to use a unique identifier,
> [special:cloudinit]
> or the like (colons are not allowed for snapshot names, IIRC).
>
> >
> > Currently, some options like vm name, nic mac address can be
> > hotplugged,
> > so they are not way to know if the cloud-init disk is already
> > updated.
> > ---
> > PVE/QemuServer.pm | 22 +++++++++++++++++-----
> > PVE/QemuServer/Cloudinit.pm | 32 ++++++++++++++++++++++++++++++++
> > 2 files changed, 49 insertions(+), 5 deletions(-)
> >
> > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> > index 57cfe62..f47ae87 100644
> > --- a/PVE/QemuServer.pm
> > +++ b/PVE/QemuServer.pm
> > @@ -2135,6 +2135,7 @@ sub parse_vm_config {
> > digest => Digest::SHA::sha1_hex($raw),
> > snapshots => {},
> > pending => {},
> > + cloudinit => {},
> > };
> >
> > $filename =~ m|/qemu-server/(\d+)\.conf$|
> > @@ -2159,6 +2160,11 @@ sub parse_vm_config {
> > $descr = undef;
> > $conf = $res->{$section} = {};
> > next;
> > + } elsif ($line =~ m/^\[CLOUDINIT\]\s*$/i) {
> > + $section = 'cloudinit';
> > + $descr = undef;
> > + $conf = $res->{$section} = {};
> > + next;
> >
> > } elsif ($line =~ m/^\[([a-z][a-z0-9_\-]+)\]\s*$/i) {
> > $section = $1;
> > @@ -2219,7 +2225,6 @@ sub parse_vm_config {
> > warn "vm $vmid - unable to parse config: $line\n";
> > }
> > }
> > -
> > if (defined($descr)) {
> > $descr =~ s/\s+$//;
> > $conf->{description} = $descr;
> > @@ -2256,7 +2261,7 @@ sub write_vm_config {
> >
> > foreach my $key (keys %$cref) {
> > next if $key eq 'digest' || $key eq 'description' ||
> > $key eq 'snapshots' ||
> > - $key eq 'snapstate' || $key eq 'pending';
> > + $key eq 'snapstate' || $key eq 'pending' || $key eq
> > 'cloudinit';
> > my $value = $cref->{$key};
> > if ($key eq 'delete') {
> > die "propertry 'delete' is only allowed in
> > [PENDING]\n"
> > @@ -2280,8 +2285,10 @@ sub write_vm_config {
> >
> > &$cleanup_config($conf->{pending}, 1);
> >
> > + &$cleanup_config($conf->{cloudinit}, 1);
> > +
> > foreach my $snapname (keys %{$conf->{snapshots}}) {
> > - die "internal error: snapshot name '$snapname' is
> > forbidden" if lc($snapname) eq 'pending';
> > + die "internal error: snapshot name '$snapname' is
> > forbidden" if lc($snapname) =~ m/^(pending|cloudinit)$/;
> > &$cleanup_config($conf->{snapshots}->{$snapname}, undef,
> > $snapname);
> > }
> >
> > @@ -2310,7 +2317,7 @@ sub write_vm_config {
> > }
> >
> > foreach my $key (sort keys %$conf) {
> > - next if $key =~
> > /^(digest|description|pending|snapshots)$/;
> > + next if $key =~
> > /^(digest|description|pending|cloudinit|snapshots)$/;
> > $raw .= "$key: $conf->{$key}\n";
> > }
> > return $raw;
> > @@ -2323,6 +2330,11 @@ sub write_vm_config {
> > $raw .= &$generate_raw_config($conf->{pending}, 1);
> > }
> >
> > + if (scalar(keys %{$conf->{cloudinit}})){
> > + $raw .= "\n[CLOUDINIT]\n";
> > + $raw .= &$generate_raw_config($conf->{cloudinit}, 1);
> > + }
> > +
> > foreach my $snapname (sort keys %{$conf->{snapshots}}) {
> > $raw .= "\n[$snapname]\n";
> > $raw .= &$generate_raw_config($conf->{snapshots}-
> > >{$snapname});
> > @@ -4702,9 +4714,9 @@ sub vmconfig_apply_pending {
> > $conf->{$opt} = delete $conf->{pending}->{$opt};
> > }
> > }
> > -
> > # write all changes at once to avoid unnecessary i/o
> > PVE::QemuConfig->write_config($vmid, $conf);
> > +
> > }
> >
> > sub vmconfig_update_net {
> > diff --git a/PVE/QemuServer/Cloudinit.pm
> > b/PVE/QemuServer/Cloudinit.pm
> > index c464bf3..f4bf925 100644
> > --- a/PVE/QemuServer/Cloudinit.pm
> > +++ b/PVE/QemuServer/Cloudinit.pm
> > @@ -570,6 +570,38 @@ sub generate_cloudinitconfig {
> >
> > $generator->($conf, $vmid, $drive, $volname, $storeid);
> > });
> > +
> > + my $cloudinitconf = delete $conf->{cloudinit};
> > + $cloudinitconf = {};
> > +
> > + my @cloudinit_opts = keys
> > %{PVE::QemuServer::cloudinit_config_properties()};
> > + push @cloudinit_opts, 'name';
> > +
> > + foreach my $opt (@cloudinit_opts) {
> > +
> > + if ($opt =~ m/^ipconfig(\d+)/) {
> > + my $netid = "net$1";
> > + next if !defined($conf->{$netid});
> > + $conf->{cloudinit}->{$netid} = $conf->{$netid};
> > + }
> > +
> > + $conf->{cloudinit}->{$opt} = $conf->{$opt} if $conf-
> > >{$opt};
> > + }
> > +
> > + $conf->{cloudinit}->{name} = "VM$vmid" if !$conf->{cloudinit}-
> > >{name};
> > +
> > + foreach my $opt (keys %{$conf}) {
> > + if (PVE::QemuServer::is_valid_drivename($opt)) {
> > + my $drive = PVE::QemuServer::parse_drive($opt, $conf-
> > >{$opt});
> > + if (PVE::QemuServer::drive_is_cloudinit($drive)) {
> > + $conf->{cloudinit}->{$opt} = $conf->{$opt};
> > +
> > + }
> > + }
> > + }
> > +
> > + PVE::QemuConfig->write_config($vmid, $conf);
> > +
> > }
> >
> > sub dump_cloudinit_config {
> >
>
>
next prev parent reply other threads:[~2021-03-25 16:29 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-19 12:06 [pve-devel] [PATCH qemu-server 0/4] RFC: cloudinit pending behaviour change Alexandre Derumier
2021-03-19 12:06 ` [pve-devel] [PATCH qemu-server 1/4] cloudinit: add cloudinit section for current generated config Alexandre Derumier
2021-03-24 5:58 ` Thomas Lamprecht
2021-03-25 16:29 ` aderumier [this message]
2021-03-19 12:06 ` [pve-devel] [PATCH qemu-server 2/4] generate cloudinit when vm is offline too Alexandre Derumier
2021-03-19 12:06 ` [pve-devel] [PATCH qemu-server 3/4] cloudinit: make cloudnit options fastplug Alexandre Derumier
2021-03-19 12:06 ` [pve-devel] [PATCH qemu-server 4/4] api2: add cloudinit config api Alexandre Derumier
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=e270af1e0e5670adc2d53e683eb432cf3dc398dd.camel@odiso.com \
--to=aderumier@odiso.com \
--cc=pve-devel@lists.proxmox.com \
--cc=t.lamprecht@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal