return $self->{hardware};
}
+my $assert_cfs_can_rw = sub {
+ my ($self, $emsg) = @_;
+
+ $emsg //= 'cfs connection refused - not mounted?';
+
+ die "$emsg\n"
+ if !$self->{hardware}->get_cfs_state($self->{nodename}, 'rw');
+};
+
sub sim_get_lock {
my ($self, $lock_name, $unlock) = @_;
sub read_manager_status {
my ($self) = @_;
+ $assert_cfs_can_rw->($self);
+
my $filename = "$self->{statusdir}/manager_status";
return PVE::HA::Tools::read_json_from_file($filename, {});
sub write_manager_status {
my ($self, $status_obj) = @_;
+ $assert_cfs_can_rw->($self);
+
my $filename = "$self->{statusdir}/manager_status";
PVE::HA::Tools::write_json_to_file($filename, $status_obj);
$node = $self->{nodename} if !defined($node);
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->read_lrm_status($node);
}
my $node = $self->{nodename};
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->write_lrm_status($node, $status_obj);
}
sub read_service_config {
my ($self) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->read_service_config();
}
sub read_fence_config {
my ($self) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->read_fence_config();
}
sub read_group_config {
my ($self) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->read_group_config();
}
sub steal_service {
my ($self, $sid, $current_node, $new_node) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->change_service_location($sid, $current_node, $new_node);
}
sub queue_crm_commands {
my ($self, $cmd) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->queue_crm_commands($cmd);
}
sub read_crm_commands {
my ($self) = @_;
+ $assert_cfs_can_rw->($self);
+
return $self->{hardware}->read_crm_commands();
}
return ($node_info, $quorate);
}
+# helper for Sim/ only
+sub get_cfs_state {
+ my ($self, $node, $state) = @_;
+
+ # TODO: ensure nolock is OK when adding this to RTSim
+ my $cstatus = $self->read_hardware_status_nolock();
+ my $res = $cstatus->{$node}->{cfs}->{$state};
+
+ # we assume default true if not defined
+ return !defined($res) || $res;
+}
+
# simulate hardware commands
# power <node> <on|off>
# network <node> <on|off>
+# cfs <node> <rw|update> <work|fail>
# reboot <node>
# shutdown <node>
# restart-lrm <node>
$d->{crm} = $self->crm_control('start', $d, $lock_fh) if !defined($d->{crm});
$d->{lrm} = $self->lrm_control('start', $d, $lock_fh) if !defined($d->{lrm});
$d->{lrm_restart} = undef;
+ $cstatus->{$node}->{cfs} = {};
} else {
$self->write_hardware_status_nolock($cstatus);
+ } elsif ($cmd eq 'cfs') {
+ die "sim_hardware_cmd: unknown cfs action '$action' for node '$node'"
+ if $action !~ m/^(rw|update)$/;
+ die "sim_hardware_cmd: unknown cfs command '$target' for '$action' on node '$node'"
+ if $target !~ m/^(work|fail)$/;
+
+ $cstatus->{$node}->{cfs}->{$action} = $target eq 'work';
+ $self->write_hardware_status_nolock($cstatus);
+
} elsif ($cmd eq 'reboot' || $cmd eq 'shutdown') {
$cstatus->{$node}->{shutdown} = $cmd;