[pve-devel] [PATCH qemu-server 1/3] add function to dump cloudinit config

Thomas Lamprecht t.lamprecht at proxmox.com
Tue Jun 4 14:22:37 CEST 2019


On 6/4/19 11:31 AM, Mira Limbeck wrote:
> This adds a function to dump the generated cloudinit config. Only one
> can be dumped at a time, either 'user', 'network' or 'meta'.
> 
> The logic to get user, network and metadata is copied from the other
> path that also creates the ISO image to keep it simple and not
> complicate the other code path further.
> 
> The hash generation for the metadata config is unified between nocloud
> and configdrive2 formats. We need it a 3rd time with the new dump
> functions so it makes sense to combine it and the metadata config
> generation in a single function. The <format>_gen_metadata functions are
> each used twice.
> 
> Signed-off-by: Mira Limbeck <m.limbeck at proxmox.com>
> ---
> The 'get_meta_config' sub is only used once, could also be merged into
> 'dump_generated_meta_config'.

I'd either drop all dump_generated* methods and do it all in the if branches
of dump_cloudinit_config or remove the latter and handle the different formats
directly in the API call in 2/3... As of now this adds quite a bit of only
once used methods, which highly probably won't get much re-use in the future,
IMO this is already big enough and a bit of a rabbit hole as is, so I'd like
to keep addition as simple as possible, and not add to many layers of
abstraction

> 
>  PVE/QemuServer/Cloudinit.pm | 78 ++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 70 insertions(+), 8 deletions(-)
> 
> diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm
> index 45176ea..78f907b 100644
> --- a/PVE/QemuServer/Cloudinit.pm
> +++ b/PVE/QemuServer/Cloudinit.pm
> @@ -207,6 +207,13 @@ sub configdrive2_network {
>      return $content;
>  }
>  
> +sub configdrive2_gen_metadata {
> +    my ($user, $network) = @_;
> +
> +    my $uuid_str = Digest::SHA::sha1_hex($user.$network);
> +    return configdrive2_metadata($uuid_str);
> +}
> +
>  sub configdrive2_metadata {
>      my ($uuid) = @_;
>      return <<"EOF";
> @@ -225,10 +232,7 @@ sub generate_configdrive2 {
>      $network_data = configdrive2_network($conf) if !defined($network_data);
>  
>      if (!defined($meta_data)) {
> -	my $digest_data = $user_data . $network_data;
> -	my $uuid_str = Digest::SHA::sha1_hex($digest_data);
> -
> -	$meta_data = configdrive2_metadata($uuid_str);
> +	$meta_data = configdrive2_gen_metadata($user_data, $network_data);
>      }
>      my $files = {
>  	'/openstack/latest/user_data' => $user_data,
> @@ -389,6 +393,13 @@ sub nocloud_metadata {
>      return "instance-id: $uuid\n";
>  }
>  
> +sub nocloud_gen_metadata {
> +    my ($user, $network) = @_;
> +
> +    my $uuid_str = Digest::SHA::sha1_hex($user.$network);
> +    return nocloud_metadata($uuid_str);
> +}
> +
>  sub generate_nocloud {
>      my ($conf, $vmid, $drive, $volname, $storeid) = @_;
>  
> @@ -397,10 +408,7 @@ sub generate_nocloud {
>      $network_data = nocloud_network($conf) if !defined($network_data);
>  
>      if (!defined($meta_data)) {
> -	my $digest_data = $user_data . $network_data;
> -	my $uuid_str = Digest::SHA::sha1_hex($digest_data);
> -
> -	$meta_data = nocloud_metadata($uuid_str);
> +	$meta_data = nocloud_gen_metadata($user_data, $network_data);
>      }
>  
>      my $files = {
> @@ -473,4 +481,58 @@ sub generate_cloudinitconfig {
>      });
>  }
>  
> +sub dump_generated_user_config {
> +    my ($conf, $vmid, $format) = @_;
> +
> +    return cloudinit_userdata($conf, $vmid);
> +}
> +
> +sub get_network_config {
> +    my ($conf, $format) = @_;
> +
> +    if ($format eq 'nocloud') {
> +	return nocloud_network($conf);
> +    } else {
> +	return configdrive2_network($conf);
> +    }
> +}
> +
> +sub dump_generated_network_config {
> +    my ($conf, $format) = @_;
> +
> +    return get_network_config($conf, $format);
> +}
> +
> +sub get_meta_config {
> +    my ($format, $user, $network) = @_;
> +
> +    if ($format eq 'nocloud') {
> +	return nocloud_gen_metadata($user, $network);
> +    } else {
> +	return configdrive2_gen_metadata($user, $network);
> +    }
> +}
> +
> +sub dump_generated_meta_config {
> +    my ($conf, $vmid, $format) = @_;
> +
> +    my $user = cloudinit_userdata($conf, $vmid);
> +    my $network = get_network_config($conf, $format);
> +    return get_meta_config($format, $user, $network);
> +}
> +
> +sub dump_cloudinit_config {
> +    my ($conf, $vmid, $type) = @_;
> +
> +    my $format = get_cloudinit_format($conf);
> +
> +    if ($type eq 'user') {
> +	return dump_generated_user_config($conf, $vmid, $format);
> +    } elsif ($type eq 'network') {
> +	return dump_generated_network_config($conf, $format);
> +    } else { # metadata config
> +	return dump_generated_meta_config($conf, $vmid, $format);
> +    }
> +}
> +
>  1;
> 





More information about the pve-devel mailing list