diff --git a/PVE/API2/HAConfig.pm b/PVE/API2/HAConfig.pm index ea485c3f..871022bf 100644 --- a/PVE/API2/HAConfig.pm +++ b/PVE/API2/HAConfig.pm @@ -175,17 +175,34 @@ __PACKAGE__->register_method({ additionalProperties => 0, properties => {}, }, - returns => { - type => "object", - properties => {}, - }, + returns => { type => "null" }, code => sub { my ($param) = @_; - my $rpcenv = PVE::RPCEnvironment::get(); + my $cmd = ['ccs_config_validate', '-l', '/etc/pve/cluster.conf.new']; + my $out = ''; + eval { + # first line on stderr contains error message + PVE::Tools::run_command($cmd, errfunc => sub { $out .= shift if !$out; }); + }; + if (my $err = $@) { + chomp $out; + $out = "unknown error" if !$out; + die "config validation failed: $out\n"; + } - die "not implemented"; + PVE::Cluster::check_cfs_quorum(); + my $code = sub { + if (!rename('/etc/pve/cluster.conf.new', '/etc/pve/cluster.conf')) { + die "commit failed - $!\n"; + } + }; + + cfs_lock_file('cluster.conf', undef, $code); + die $@ if $@; + + return; }}); my $read_cluster_conf_new = sub { @@ -332,6 +349,8 @@ __PACKAGE__->register_method({ my $vmlist = PVE::Cluster::get_vmlist(); raise_param_exc({ id => "no such vmid '$param->{vmid}'"}) if !($vmlist && $vmlist->{ids} && $vmlist->{ids}->{$param->{vmid}}); + + PVE::Cluster::check_cfs_quorum(); my $code = sub { @@ -386,6 +405,8 @@ __PACKAGE__->register_method({ raise_param_exc({ id => "unsupported group type '$param->{id}'"}); } + PVE::Cluster::check_cfs_quorum(); + my $code = sub { my $conf = &$read_cluster_conf_new(); @@ -475,6 +496,8 @@ __PACKAGE__->register_method({ code => sub { my ($param) = @_; + PVE::Cluster::check_cfs_quorum(); + my $code = sub { my $conf = &$read_cluster_conf_new(); diff --git a/www/manager/dc/HAConfig.js b/www/manager/dc/HAConfig.js index f07c7160..b7e65764 100644 --- a/www/manager/dc/HAConfig.js +++ b/www/manager/dc/HAConfig.js @@ -170,7 +170,7 @@ Ext.define('PVE.dc.HAConfig', { { text: gettext('HA managed VM/CT'), handler: function() { - if (!me.clusterInfo.fenceDevices) { + if (false && !me.clusterInfo.fenceDevices) { Ext.Msg.alert(gettext('Error'), gettext("Please configure fencing first!")); return; }