public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Mira Limbeck <m.limbeck@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: Re: [pve-devel] [PATCH qemu-server 4/6] api2: add cloudinit config api
Date: Wed, 31 Mar 2021 16:13:20 +0200	[thread overview]
Message-ID: <e31547cc-8135-a846-c78c-3484d5f4f164@proxmox.com> (raw)
In-Reply-To: <20210328151203.2063706-5-aderumier@odiso.com>

Why do you add the macaddress here? I couldn't find anything in this nor 
in the previous patch series explaining why this is done.

On 3/28/21 5:12 PM, Alexandre Derumier wrote:
> ---
>   PVE/API2/Qemu.pm            | 73 +++++++++++++++++++++++++++++++++++++
>   PVE/CLI/qm.pm               |  1 +
>   PVE/QemuServer/Cloudinit.pm | 70 +++++++++++++++++++++++++++++++++++
>   3 files changed, 144 insertions(+)
>
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index ea74c69..b6122fe 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -21,6 +21,7 @@ use PVE::ReplicationConfig;
>   use PVE::GuestHelpers;
>   use PVE::QemuConfig;
>   use PVE::QemuServer;
> +use PVE::QemuServer::Cloudinit;
>   use PVE::QemuServer::Drive;
>   use PVE::QemuServer::CPUConfig;
>   use PVE::QemuServer::Monitor qw(mon_cmd);
> @@ -1039,6 +1040,78 @@ __PACKAGE__->register_method({
>   	return PVE::GuestHelpers::config_with_pending_array($conf, $pending_delete_hash);
>      }});
>   
> +__PACKAGE__->register_method({
> +    name => 'cloudinit_pending',
> +    path => '{vmid}/cloudinit',
> +    method => 'GET',
> +    proxyto => 'node',
> +    description => "Get the cloudinit configuration with both current and pending values.",
> +    permissions => {
> +	check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
> +    },
> +    parameters => {
> +	additionalProperties => 0,
> +	properties => {
> +	    node => get_standard_option('pve-node'),
> +	    vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
> +	},
> +    },
> +    returns => {
> +	type => "array",
> +	items => {
> +	    type => "object",
> +	    properties => {
> +		key => {
> +		    description => "Configuration option name.",
> +		    type => 'string',
> +		},
> +		value => {
> +		    description => "Current value.",
> +		    type => 'string',
> +		    optional => 1,
> +		},
> +		pending => {
> +		    description => "Pending value.",
> +		    type => 'string',
> +		    optional => 1,
> +		},
> +		delete => {
> +		    description => "Indicates a pending delete request if present and not 0. " .
> +		                   "The value 2 indicates a force-delete request.",
> +		    type => 'integer',
> +		    minimum => 0,
> +		    maximum => 2,
> +		    optional => 1,
> +		},
> +	    },
> +	},
> +    },
> +    code => sub {
> +	my ($param) = @_;
> +
> +	my $vmid = $param->{vmid};
> +	my $conf = PVE::QemuConfig->load_config($vmid);
> +
> +	if( defined($conf->{cipassword}) &&
> +	    defined($conf->{cloudinit}->{cipassword}) &&
> +	    $conf->{cipassword} ne $conf->{cloudinit}->{cipassword}) {
> +	    $conf->{cipassword} = '********** ';
> +	} elsif (defined($conf->{cipassword})) {
> +	    $conf->{cipassword} = '**********';
> +	}
> +
> +	$conf->{cloudinit}->{cipassword} = '**********' if defined($conf->{cloudinit}->{cipassword});
> +
> +	my $res = [];
> +	my $pending = PVE::QemuServer::Cloudinit::get_pending_config($conf, $vmid);
> +
> +	foreach my $opt (keys %{$pending}) {
> +	    push @$res, $pending->{$opt};
> +	}
> +
> +	return $res;
> +   }});
> +
>   # POST/PUT {vmid}/config implementation
>   #
>   # The original API used PUT (idempotent) an we assumed that all operations
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index f8972bd..e24b832 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -996,6 +996,7 @@ our $cmddef = {
>   		my $data = shift;
>   		print "$data\n";
>   	    }],
> +	pending => [ "PVE::API2::Qemu", 'cloudinit_pending', ['vmid'], { node => $nodename }, \&PVE::GuestHelpers::format_pending ]
>       },
>   
>   };
> diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm
> index f4bf925..20cf583 100644
> --- a/PVE/QemuServer/Cloudinit.pm
> +++ b/PVE/QemuServer/Cloudinit.pm
> @@ -629,4 +629,74 @@ sub dump_cloudinit_config {
>       }
>   }
>   
> +sub get_pending_config {
> +    my ($conf, $vmid) = @_;
> +
> +    my $newconf = { %{$conf} };
> +    my $cloudinit_current = $newconf->{cloudinit};
> +    my @cloudinit_opts = keys %{PVE::QemuServer::cloudinit_config_properties()};
> +    push @cloudinit_opts, 'name';
> +
> +    #add cloud-init drive
> +    my $drives = {};
> +    PVE::QemuConfig->foreach_volume($newconf, sub {
> +	my ($ds, $drive) = @_;
> +	$drives->{$ds} = 1 if PVE::QemuServer::drive_is_cloudinit($drive);
> +    });
> +
> +    PVE::QemuConfig->foreach_volume($cloudinit_current, sub {
> +	my ($ds, $drive) = @_;
> +	$drives->{$ds} = 1 if PVE::QemuServer::drive_is_cloudinit($drive);
> +    });
> +    foreach my $ds (keys %{$drives}) {
> +	push @cloudinit_opts, $ds;
> +    }
> +
> +    $newconf->{name} = "VM$vmid" if !$newconf->{name};
> +
> +    my $print_net_addr = sub {
> +	my ($conf, $opt, $netid) = @_;
> +
> +	if (defined($conf->{$netid})) {
> +
> +	    my $net = PVE::QemuServer::parse_net($conf->{$netid});
> +	    if (defined($conf->{$opt})) {
> +		$conf->{$opt} .= ",macaddr=".$net->{macaddr} if $net->{macaddr};
> +	    } else {
> +		$conf->{$opt} = "";
> +	    }
> +	}
> +    };
> +
> +    my $res = {};
> +    foreach my $opt (@cloudinit_opts) {
> +
> +	#add macaddr to ipconfig
> +	if ($opt =~ m/^ipconfig(\d+)/) {
> +	    my $netid = "net$1";
> +	    next if !defined($newconf->{$netid}) && !defined($cloudinit_current->{$netid}) && !defined($newconf->{$opt}) && !defined($cloudinit_current->{$opt} );
> +
> +	    &$print_net_addr($newconf, $opt, $netid);
> +	    &$print_net_addr($cloudinit_current, $opt, $netid);
> +	}
> +
> +	my $item = {
> +	    key => $opt,
> +	};
> +	if ($cloudinit_current->{$opt}) {
> +	    $item->{value} = $cloudinit_current->{$opt};
> +	    if ($newconf->{$opt}) {
> +		$item->{pending} = $newconf->{$opt} if $newconf->{$opt} ne $cloudinit_current->{$opt};
> +	    } else {
> +		$item->{delete} = 1;
> +	    }
> +	} else {
> +	    $item->{pending} = $newconf->{$opt} if $newconf->{$opt}
> +	}
> +
> +	$res->{$opt} = $item;
> +   }
> +   return $res;
> +}
> +
>   1;




  reply	other threads:[~2021-03-31 14:13 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-28 15:11 [pve-devel] [PATCH qemu-server 0/6] cloudinit pending behaviour change Alexandre Derumier
2021-03-28 15:11 ` [pve-devel] [PATCH qemu-server 1/6] cloudinit: add cloudinit section for current generated config Alexandre Derumier
2021-03-31 14:10   ` Mira Limbeck
2021-04-01  8:54   ` Thomas Lamprecht
2021-04-01 10:22     ` aderumier
2021-04-02  9:22       ` aderumier
2021-04-04 12:12         ` alexandre derumier
2021-03-28 15:11 ` [pve-devel] [PATCH qemu-server 2/6] generate cloudinit drive on offline plug Alexandre Derumier
2021-03-28 15:12 ` [pve-devel] [PATCH qemu-server 3/6] cloudinit: make cloudnit options fastplug Alexandre Derumier
2021-03-28 15:12 ` [pve-devel] [PATCH qemu-server 4/6] api2: add cloudinit config api Alexandre Derumier
2021-03-31 14:13   ` Mira Limbeck [this message]
2021-03-31 17:32     ` aderumier
2021-04-01  0:16       ` aderumier
2021-03-28 15:12 ` [pve-devel] [PATCH qemu-server 5/6] api2: add cloudinit_update Alexandre Derumier
2021-03-28 15:12 ` [pve-devel] [PATCH qemu-server 6/6] add cloudinit hotplug 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=e31547cc-8135-a846-c78c-3484d5f4f164@proxmox.com \
    --to=m.limbeck@proxmox.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal