all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>,
	Alexandre Derumier <aderumier@odiso.com>
Subject: Re: [pve-devel] [PATCH qemu-server 1/4] cloudinit: add cloudinit section for current generated config.
Date: Wed, 24 Mar 2021 06:58:04 +0100	[thread overview]
Message-ID: <7f406812-b102-37ea-d967-1d43d4a759cf@proxmox.com> (raw)
In-Reply-To: <20210319120656.86740-2-aderumier@odiso.com>

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 {
> 





  reply	other threads:[~2021-03-24  5:58 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 [this message]
2021-03-25 16:29     ` aderumier
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=7f406812-b102-37ea-d967-1d43d4a759cf@proxmox.com \
    --to=t.lamprecht@proxmox.com \
    --cc=aderumier@odiso.com \
    --cc=pve-devel@lists.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