EUNKNOWN_SERVICE_TYPE => 4, # no plugin for this type service found
EUNKNOWN_COMMAND => 5,
EINVALID_PARAMETER => 6,
+ EUNKNOWN_SERVICE => 7, # service not found
};
# get constants out of package in a somewhat easy way
use base 'Exporter';
our @EXPORT_OK = qw(SUCCESS ERROR EWRONG_NODE EUNKNOWN_SERVICE_TYPE
- EUNKNOWN_COMMAND EINVALID_PARAMETER ETRY_AGAIN);
+ EUNKNOWN_COMMAND EINVALID_PARAMETER ETRY_AGAIN EUNKNOWN_SERVICE);
our %EXPORT_TAGS = ( 'exit_codes' => [@EXPORT_OK] );
PVE::JSONSchema::register_format('pve-ha-resource-id', \&pve_verify_ha_resource_id);
}
PVE::JSONSchema::register_standard_option('pve-ha-group-node-list', {
- description => "List of cluster node names with optional priority. We use priority '0' as default. The CRM tries to run services on the node with highest priority (also see option 'nofailback').",
+ description => "List of cluster node names with optional priority.",
+ verbose_description => "List of cluster node members, where a priority can be given to each node. A resource bound to a group will run on the available nodes with the highest priority. If there are more nodes in the highest priority class, the services will get distributed to those nodes. The priorities have a relative meaning only.",
type => 'string', format => 'pve-ha-group-node-list',
typetext => '<node>[:<pri>]{,<node>[:<pri>]}*',
});
if (defined($default) && (! -f $filename)) {
$data = $default;
} else {
- my $raw;
- # workaround for bug #775
- if ($filename =~ m|^/etc/pve/|) {
- $filename =~ s|^/etc/pve/+||;
- $raw = PVE::Cluster::get_config($filename);
- die "unable to read file '/etc/pve/$filename'\n"
- if !defined($raw);
- } else {
- $raw = PVE::Tools::file_get_contents($filename);
- }
+ my $raw = PVE::Tools::file_get_contents($filename);
$data = decode_json($raw);
}
return $count;
}
+sub get_verbose_service_state {
+ my ($service_state, $service_conf) = @_;
+
+ my $req = $service_conf->{state} // 'ignored';
+ return 'ignored' if $req eq 'ignored';
+
+ # service not yet processed by manager
+ return 'queued' if !defined($service_state);
+ my $cur = $service_state->{state};
+
+ # give fast feedback to the user
+ my $state = $cur;
+ if (!defined($cur)) {
+ $state = 'queued';
+ } elsif ($cur eq 'stopped') {
+ if ($req eq 'started') {
+ $state = 'starting';
+ } elsif ($req eq 'disabled') {
+ $state = 'disabled';
+ }
+ } elsif ($cur eq 'started') {
+ if ($req eq 'stopped' || $req eq 'disabled') {
+ $state = 'stopping';
+ }
+ $state = 'starting' if !$service_state->{running};
+ } elsif ($cur eq 'error') {
+ if ($req eq 'disabled') {
+ $state = 'clearing error flag';
+ }
+ }
+
+ return $state;
+}
+
sub upid_wait {
my ($upid, $haenv) = @_;
my $res = [];
foreach my $sid (keys %{$cfg->{ids}}) {
- my $state = $cfg->{ids}->{$sid}->{state} // 'enabled';
- next if $state ne 'enabled';
+ my $state = $cfg->{ids}->{$sid}->{state} // 'started';
+ next if $state ne 'started';
push @$res, $sid;
}
my $res = [];
foreach my $sid (keys %{$cfg->{ids}}) {
- my $state = $cfg->{ids}->{$sid}->{state} // 'enabled';
- next if $state eq 'enabled';
+ my $state = $cfg->{ids}->{$sid}->{state} // 'started';
+ next if $state eq 'started';
push @$res, $sid;
}