]> git.proxmox.com Git - pve-ha-manager.git/commitdiff
Status: factor out new service state calculation
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 12 Jan 2017 14:51:59 +0000 (15:51 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 13 Jan 2017 11:27:24 +0000 (12:27 +0100)
Factor out the new "fast feedback for user" service state calculation
and use it also in the HA Simulator to provide the same feedback as
in the real world.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/API2/HA/Status.pm
src/PVE/HA/Sim/RTHardware.pm
src/PVE/HA/Tools.pm

index dbf23d567f586f526d72431ce0fb9d8580e48e3e..d21c174db92696a04eb377801edd2229aca20b0d 100644 (file)
@@ -152,38 +152,15 @@ __PACKAGE__->register_method ({
            my $data = { id => "service:$sid", type => 'service', sid => $sid };
 
            if ($ss) {
-               my $req = $sc->{state} || 'ignore';
-               my $cur = $ss->{state};
-               my $state = $cur;
-
-               # give fast feedback to the user
-               if ($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 !$ss->{running};
-               } elsif ($cur eq 'error') {
-                   if ($req eq 'disabled') {
-                       $state = 'clearing error flag';
-                   }
-               }
-
                $data->{node} = $ss->{node};
-               $data->{status} =  "$sid ($ss->{node}, $state)"; # backward compatibility
-               $data->{state} = $state;
                $data->{crm_state} = $ss->{state};
            } else {
                $data->{node} = $sc->{node};
-               $data->{state} = 'queued';
-               $data->{status} = "$sid ($sc->{node}, queued)"; # backward compatibility
            }
 
+           $data->{state} = PVE::HA::Tools::get_verbose_service_state($ss, $sc);
+           $data->{status} = "$sid ($data->{node}, $data->{state})"; # backward compatibility
+
            # also return common resource attributes
            if (defined($sc)) {
                $data->{request_state} = $sc->{state};
index b3e80d68d6d67e46b8f7aafb52272793d506760f..0b29340d2b7360f80f94214bd222a58dc96a6f44 100644 (file)
@@ -608,6 +608,7 @@ sub run {
        foreach my $sid (@services) {
            my $sc = $self->{service_config}->{$sid};
            my $ss = $service_status->{$sid};
+
            my $sgui = $self->{service_gui}->{$sid};
            next if !$sgui;
            my $nl = $sgui->{node_label};
@@ -615,9 +616,9 @@ sub run {
 
            my $sl = $sgui->{status_label};
            next if !$sl;
-               
-           my $text = ($ss && $ss->{state}) ? $ss->{state} : '-';
-           $sl->set_text($text);
+
+           my $service_state = PVE::HA::Tools::get_verbose_service_state($ss, $sc);
+           $sl->set_text($service_state);
        }
 
        if (my $sv = $self->{gui}->{stat_view}) {
index dca7dafb31c73a40e6e06cd7ca3008d71eb1116a..565c2753d532a0a003c8126c8f1bec6e7271883b 100644 (file)
@@ -183,6 +183,40 @@ sub count_fenced_services {
     return $count;
 }
 
+sub get_verbose_service_state {
+    my ($service_state, $service_conf) = @_;
+
+    # service not yet processed by manager
+    return 'queued' if !defined($service_state);
+    my $cur = $service_state->{state};
+
+    return 'ignore' if !defined($service_conf) || !defined($service_conf->{state});
+    my $req = $service_conf->{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) = @_;