applied

> On June 15, 2018 at 12:29 PM Dietmar Maurer <diet...@proxmox.com> wrote:
> 
> 
> Signed-off-by: Dietmar Maurer <diet...@proxmox.com>
> ---
>  PVE/APIClient/Commands/config.pm | 57 +++++++++++++++--------------
>  PVE/APIClient/Commands/remote.pm | 78
> ++++++++++++++++++++++++----------------
>  PVE/APIClient/Config.pm          | 12 +++++++
>  3 files changed, 90 insertions(+), 57 deletions(-)
> 
> diff --git a/PVE/APIClient/Commands/config.pm
> b/PVE/APIClient/Commands/config.pm
> index d467b4c..3b208a0 100644
> --- a/PVE/APIClient/Commands/config.pm
> +++ b/PVE/APIClient/Commands/config.pm
> @@ -43,35 +44,37 @@ __PACKAGE__->register_method ({
>      code => sub {
>       my ($param) = @_;
>  
> -     # fixme: lock config file
> -
>       my $digest = extract_param($param, 'digest');
>       my $delete = extract_param($param, 'delete');
>  
> -     my $config = PVE::APIClient::Config->load();
> -     my $defaults = PVE::APIClient::Config->get_defaults($config);
> -     
> -     my $plugin = PVE::APIClient::Config->lookup('defaults');
> -     my $opts = $plugin->check_config('defaults', $param, 0, 1);
> -
> -     foreach my $k (%$opts) {
> -         $defaults->{$k} = $opts->{$k};
> -     }
> -
> -     if ($delete) {
> -         my $options = $plugin->private()->{options}->{'defaults'};
> -         foreach my $k (PVE::APIClient::Tools::split_list($delete)) {
> -             my $d = $options->{$k} ||
> -                 die "no such option '$k'\n";
> -             die "unable to delete required option '$k'\n"
> -                 if !$d->{optional};
> -             die "unable to delete fixed option '$k'\n"
> -                 if $d->{fixed};
> -             delete $defaults->{$k};
> +     my $code = sub {
> +         my $config = PVE::APIClient::Config->load();
> +         my $defaults = PVE::APIClient::Config->get_defaults($config);
> +
> +         my $plugin = PVE::APIClient::Config->lookup('defaults');
> +         my $opts = $plugin->check_config('defaults', $param, 0, 1);
> +
> +         foreach my $k (%$opts) {
> +             $defaults->{$k} = $opts->{$k};
>           }
> -     }
>  
> -     PVE::APIClient::Config->save($config);
> +         if ($delete) {
> +             my $options = $plugin->private()->{options}->{'defaults'};
> +             foreach my $k (PVE::APIClient::Tools::split_list($delete)) {
> +                 my $d = $options->{$k} ||
> +                     die "no such option '$k'\n";
> +                 die "unable to delete required option '$k'\n"
> +                     if !$d->{optional};
> +                 die "unable to delete fixed option '$k'\n"
> +                     if $d->{fixed};
> +                 delete $defaults->{$k};
> +             }
> +         }
> +
> +         PVE::APIClient::Config->save($config);
> +     };
> +
> +     PVE::APIClient::Config->lock_config(undef, $code);
>  
>       return undef;
>      }});
> diff --git a/PVE/APIClient/Commands/remote.pm
> b/PVE/APIClient/Commands/remote.pm
> index 090672e..03960af 100644
> --- a/PVE/APIClient/Commands/remote.pm
> +++ b/PVE/APIClient/Commands/remote.pm
> @@ -3,6 +3,7 @@ package PVE::APIClient::Commands::remote;
>  use strict;
>  use warnings;
>  
> +use PVE::APIClient::Helpers;
>  use PVE::APIClient::JSONSchema qw(get_standard_option);
>  use PVE::APIClient::Tools qw(extract_param);
>  use PVE::APIClient::Config;
> @@ -51,10 +52,9 @@ __PACKAGE__->register_method ({
>      code => sub {
>       my ($param) = @_;
>  
> -     # fixme: lock config file
> -
>       my $remote = $param->{name};
>  
> +     # Note: we try to keep lock time sort, and lock later when we have all 
> info
>       my $config = PVE::APIClient::Config->load();
>  
>       die "Remote '$remote' already exists\n"
> @@ -90,11 +90,25 @@ __PACKAGE__->register_method ({
>       $api->login();
>  
>       $param->{fingerprint} = $last_fp if !defined($param->{fingerprint});
> +
>       my $plugin = PVE::APIClient::Config->lookup('remote');
> -     my $opts = $plugin->check_config($remote, $param, 1, 1);
> -     $config->{ids}->{$remote} = $opts;
>  
> -     PVE::APIClient::Config->save($config);
> +     my $code = sub {
> +
> +         $config = PVE::APIClient::Config->load(); # reload
> +
> +         # check again (file is locked now)
> +         die "Remote '$remote' already exists\n"
> +             if $config->{ids}->{$remote};
> +
> +         my $opts = $plugin->check_config($remote, $param, 1, 1);
> +
> +         $config->{ids}->{$remote} = $opts;
> +
> +         PVE::APIClient::Config->save($config);
> +     };
> +
> +     PVE::APIClient::Config->lock_config(undef, $code);
>  
>       return undef;
>      }});
> @@ -109,36 +123,38 @@ __PACKAGE__->register_method ({
>      code => sub {
>       my ($param) = @_;
>  
> -     # fixme: lock config file
> -
>       my $name = extract_param($param, 'name');
>       my $digest = extract_param($param, 'digest');
>       my $delete = extract_param($param, 'delete');
>  
> -     my $config = PVE::APIClient::Config->load();
> -     my $remote = PVE::APIClient::Config->lookup_remote($config, $name);
> +     my $code = sub {
> +         my $config = PVE::APIClient::Config->load();
> +         my $remote = PVE::APIClient::Config->lookup_remote($config, $name);
>  
> -     my $plugin = PVE::APIClient::Config->lookup('remote');
> -     my $opts = $plugin->check_config($name, $param, 0, 1);
> +         my $plugin = PVE::APIClient::Config->lookup('remote');
> +         my $opts = $plugin->check_config($name, $param, 0, 1);
>  
> -     foreach my $k (%$opts) {
> -         $remote->{$k} = $opts->{$k};
> -     }
> +         foreach my $k (%$opts) {
> +             $remote->{$k} = $opts->{$k};
> +         }
>  
> -     if ($delete) {
> -         my $options = $plugin->private()->{options}->{'remote'};
> -         foreach my $k 
> (PVE::APIClient::Tools::APIClient::split_list($delete)) {
> -             my $d = $options->{$k} ||
> -                 die "no such option '$k'\n";
> -             die "unable to delete required option '$k'\n"
> -                 if !$d->{optional};
> -             die "unable to delete fixed option '$k'\n"
> -                 if $d->{fixed};
> -             delete $remote->{$k};
> +         if ($delete) {
> +             my $options = $plugin->private()->{options}->{'remote'};
> +             foreach my $k 
> (PVE::APIClient::Tools::APIClient::split_list($delete)) {
> +                 my $d = $options->{$k} ||
> +                     die "no such option '$k'\n";
> +                 die "unable to delete required option '$k'\n"
> +                     if !$d->{optional};
> +                 die "unable to delete fixed option '$k'\n"
> +                     if $d->{fixed};
> +                 delete $remote->{$k};
> +             }
>           }
> -     }
>  
> -     PVE::APIClient::Config->save($config);
> +         PVE::APIClient::Config->save($config);
> +     };
> +
> +     PVE::APIClient::Config->lock_config(undef, $code);
>  
>       return undef;
>      }});
> @@ -158,11 +174,13 @@ __PACKAGE__->register_method ({
>      code => sub {
>       my ($param) = @_;
>  
> -     # fixme: lock config
> +     my $code = sub {
> +         my $config = PVE::APIClient::Config->load();
> +         delete $config->{ids}->{$param->{name}};
> +         PVE::APIClient::Config->save($config);
> +     };
>  
> -     my $config = PVE::APIClient::Config->load();
> -     delete $config->{ids}->{$param->{name}};
> -     PVE::APIClient::Config->save($config);
> +     PVE::APIClient::Config->lock_config(undef, $code);
>  
>       return undef;
>      }});
> diff --git a/PVE/APIClient/Config.pm b/PVE/APIClient/Config.pm
> index 3878425..a4aa4c6 100644
> --- a/PVE/APIClient/Config.pm
> +++ b/PVE/APIClient/Config.pm
> @@ -64,6 +64,18 @@ sub config_filename {
>      return "$dir/config";
>  }
>  
> +sub lock_config {
> +    my ($class, $timeout, $code, @param) = @_;
> +
> +    my $filename = $class->config_filename();
> +
> +    my $res = PVE::APIClient::Tools::lock_file($filename, $timeout, $code,
> @param);
> +
> +    die $@ if $@;
> +
> +    return $res;
> +}
> +
>  sub format_section_header {
>      my ($class, $type, $sectionId, $scfg, $done_hash) = @_;
>  
> -- 
> 2.11.0
> 
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to