[pve-devel] [PATCH pve-ha-manager 1/3] move ha-manager to separate CLIHandler class
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon Sep 14 17:21:54 CEST 2015
Move ha-manager to separate CLIHandler class and add basic auto
completion support.
Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
src/Makefile | 17 +++--
src/PVE/CLI/Makefile | 6 ++
src/PVE/CLI/ha_manager.pm | 175 +++++++++++++++++++++++++++++++++++++++++++
src/PVE/Makefile | 1 +
src/ha-manager | 185 +---------------------------------------------
5 files changed, 196 insertions(+), 188 deletions(-)
create mode 100644 src/PVE/CLI/Makefile
create mode 100644 src/PVE/CLI/ha_manager.pm
diff --git a/src/Makefile b/src/Makefile
index dd96b55..d2cdd8e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -9,6 +9,7 @@ DOCDIR=${PREFIX}/share/doc/${PACKAGE}
SIMDOCDIR=${PREFIX}/share/doc/${SIMPACKAGE}
PODDIR=${DOCDIR}/pod
MAN1DIR=${MANDIR}/man1/
+BASHCOMPLDIR=${PREFIX}/share/bash-completion/completions/
export PERLDIR=${PREFIX}/share/perl5
all: watchdog-mux
@@ -23,22 +24,28 @@ pve-ha-crm.1.pod: pve-ha-crm
pve-ha-lrm.1.pod: pve-ha-lrm
perl -I. ./pve-ha-lrm printmanpod >$@
-ha-manager.1.pod: ha-manager
- perl -I. ./ha-manager printmanpod >$@
+ha-manager.1.pod:
+ perl -I. -T -e "use PVE::CLI::ha_manager; PVE::CLI::ha_manager->generate_pod_manpage();" >$@.tmp
+ mv $@.tmp $@
+
+ha-manager.bash-completion:
+ perl -I. -T -e "use PVE::CLI::ha_manager; PVE::CLI::ha_manager->generate_bash_completions();" >$@
+
watchdog-mux: watchdog-mux.c
gcc watchdog-mux.c -o watchdog-mux -Wall -Wl,-z,relro $$(pkg-config --libs --cflags libsystemd-daemon)
.PHONY: install
-install: watchdog-mux pve-ha-crm pve-ha-lrm ha-manager.1.pod ha-manager.1.gz pve-ha-crm.1.pod pve-ha-crm.1.gz pve-ha-lrm.1.pod pve-ha-lrm.1.gz
+install: watchdog-mux pve-ha-crm pve-ha-lrm ha-manager.1.pod ha-manager.1.gz pve-ha-crm.1.pod pve-ha-crm.1.gz pve-ha-lrm.1.pod pve-ha-lrm.1.gz ha-manager.bash-completion
perl -I. ./pve-ha-crm verifyapi
perl -I. ./pve-ha-lrm verifyapi
- perl -I. ./ha-manager verifyapi
+ perl -I. -T -e "use PVE::CLI::ha_manager; PVE::CLI::ha_manager->verify_api();"
install -d ${DESTDIR}${SBINDIR}
install -m 0755 pve-ha-crm ${DESTDIR}${SBINDIR}
install -m 0755 pve-ha-lrm ${DESTDIR}${SBINDIR}
install -m 0755 ha-manager ${DESTDIR}${SBINDIR}
install -m 0755 watchdog-mux ${DESTDIR}${SBINDIR}
+ install -m 0644 -D ha-manager.bash-completion ${DESTDIR}${BASHCOMPLDIR}/ha-manager
make -C PVE install
install -d ${DESTDIR}/usr/share/man/man1
install -d ${DESTDIR}${PODDIR}
@@ -62,7 +69,7 @@ test:
.PHONY: clean
clean:
make -C test clean
- rm -rf watchdog-mux *.1.pod *.1.gz
+ rm -rf watchdog-mux *.1.pod *.1.gz *.bash-completion
find . -name '*~' -exec rm {} ';'
.PHONY: distclean
diff --git a/src/PVE/CLI/Makefile b/src/PVE/CLI/Makefile
new file mode 100644
index 0000000..d1f170f
--- /dev/null
+++ b/src/PVE/CLI/Makefile
@@ -0,0 +1,6 @@
+SOURCES=ha_manager.pm
+
+.PHONY: install
+install: ${SOURCES}
+ install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE/CLI
+ for i in ${SOURCES}; do install -D -m 0644 $$i ${DESTDIR}${PERLDIR}/PVE/CLI/$$i; done
diff --git a/src/PVE/CLI/ha_manager.pm b/src/PVE/CLI/ha_manager.pm
new file mode 100644
index 0000000..8c7b17a
--- /dev/null
+++ b/src/PVE/CLI/ha_manager.pm
@@ -0,0 +1,175 @@
+package PVE::CLI::ha_manager;
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+use PVE::INotify;
+use JSON;
+
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::CLIHandler;
+use PVE::Cluster;
+
+use PVE::HA::Tools;
+use PVE::API2::HA::Resources;
+use PVE::API2::HA::Groups;
+use PVE::API2::HA::Status;
+use PVE::HA::Env::PVE2;
+
+use base qw(PVE::CLIHandler);
+
+our $exename = 'ha-manager';
+
+my $nodename = PVE::INotify::nodename();
+
+__PACKAGE__->register_method ({
+ name => 'enable',
+ path => 'enable',
+ method => 'POST',
+ description => "Enable a HA resource.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ sid => get_standard_option('pve-ha-resource-or-vm-id'),
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
+
+ my $sid = PVE::HA::Tools::parse_sid($param->{sid});
+
+ # delete state (default is 'enabled')
+ PVE::API2::HA::Resources->update({ sid => $sid, delete => 'state' });
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'disable',
+ path => 'disable',
+ method => 'POST',
+ description => "Disable a HA resource.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ sid => get_standard_option('pve-ha-resource-or-vm-id'),
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
+
+ my $sid = PVE::HA::Tools::parse_sid($param->{sid});
+
+ PVE::API2::HA::Resources->update({ sid => $sid, state => 'disabled' });
+
+ return undef;
+ }});
+
+my $timestamp_to_status = sub {
+ my ($ctime, $timestamp) = @_;
+
+ my $tdiff = $ctime - $timestamp;
+ if ($tdiff > 30) {
+ return "old timestamp - dead?";
+ } elsif ($tdiff < -2) {
+ return "detected time drift!";
+ } else {
+ return "active";
+ }
+};
+
+__PACKAGE__->register_method ({
+ name => 'status',
+ path => 'status',
+ method => 'GET',
+ description => "Display HA manger status.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ verbose => {
+ description => "Verbose output. Include complete CRM and LRM status (JSON).",
+ type => 'boolean',
+ default => 0,
+ optional => 1,
+ }
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
+
+ my $res = PVE::API2::HA::Status->status({});
+ foreach my $e (@$res) {
+ print "$e->{type} $e->{status}\n";
+ }
+
+ if ($param->{verbose}) {
+ print "full cluster state:\n";
+ my $data = PVE::API2::HA::Status->manager_status({});
+ print to_json($data, { pretty => 1, canonical => 1} );
+ }
+
+ return undef;
+ }});
+
+our $cmddef = {
+ enable => [ __PACKAGE__, 'enable', ['sid']],
+ disable => [ __PACKAGE__, 'disable', ['sid']],
+ status => [ __PACKAGE__, 'status'],
+ config => [ 'PVE::API2::HA::Resources', 'index', [], {}, sub {
+ my $res = shift;
+ foreach my $rec (sort { $a->{sid} cmp $b->{sid} } @$res) {
+ my ($type, $name) = split(':', $rec->{sid}, 2);
+ print "$type:$name\n";
+ foreach my $k (sort keys %$rec) {
+ next if $k eq 'digest' || $k eq 'sid' ||
+ $k eq 'type' || $k eq 'errors';
+ print "\t$k $rec->{$k}\n";
+ }
+ if (my $errors = $rec->{errors}) {
+ foreach my $p (keys %$errors) {
+ warn "error: property '$p' - $errors->{$p}\n";
+ }
+ }
+ print "\n";
+ }}],
+ groups => [ 'PVE::API2::HA::Groups', 'index', [], {}, sub {
+ my $res = shift;
+ foreach my $rec (sort { $a->{group} cmp $b->{group} } @$res) {
+ print "group: $rec->{group}\n";
+ foreach my $k (sort keys %$rec) {
+ next if $k eq 'digest' || $k eq 'group' ||
+ $k eq 'type';
+ print "\t$k $rec->{$k}\n";
+ }
+ print "\n";
+ }}],
+ add => [ "PVE::API2::HA::Resources", 'create', ['sid'] ],
+ remove => [ "PVE::API2::HA::Resources", 'delete', ['sid'] ],
+ set => [ "PVE::API2::HA::Resources", 'update', ['sid'] ],
+
+ migrate => [ "PVE::API2::HA::Resources", 'migrate', ['sid', 'node'] ],
+ relocate => [ "PVE::API2::HA::Resources", 'relocate', ['sid', 'node'] ],
+
+};
+
+1;
+
+__END__
+
+=head1 NAME
+
+pvecm - Proxmox VE HA Command Line Interface
+
+=head1 SYNOPSIS
+
+=include synopsis
+
+=head1 DESCRIPTION
+
+ha-manager is a program to manage the HA configuration.
+
+=include pve_copyright
diff --git a/src/PVE/Makefile b/src/PVE/Makefile
index b238452..6012c2c 100644
--- a/src/PVE/Makefile
+++ b/src/PVE/Makefile
@@ -4,6 +4,7 @@ install:
install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE
make -C HA install
make -C API2 install
+ make -C CLI install
.PHONY: installsim
installsim:
diff --git a/src/ha-manager b/src/ha-manager
index e3e0348..a989f70 100755
--- a/src/ha-manager
+++ b/src/ha-manager
@@ -2,188 +2,7 @@
use strict;
use warnings;
-use Data::Dumper;
-
-use PVE::INotify;
-use JSON;
-
-use PVE::JSONSchema qw(get_standard_option);
-use PVE::CLIHandler;
-use PVE::Cluster;
-
-use PVE::HA::Tools;
-use PVE::API2::HA::Resources;
-use PVE::API2::HA::Groups;
-use PVE::API2::HA::Status;
-use PVE::HA::Env::PVE2;
-
-use base qw(PVE::CLIHandler);
-
-$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
-$ENV{LC_ALL} = 'C';
-
-die "please run as root\n" if $> != 0;
-
-my $nodename = PVE::INotify::nodename();
-
-__PACKAGE__->register_method ({
- name => 'enable',
- path => 'enable',
- method => 'POST',
- description => "Enable a HA resource.",
- parameters => {
- additionalProperties => 0,
- properties => {
- sid => get_standard_option('pve-ha-resource-or-vm-id'),
- },
- },
- returns => { type => 'null' },
- code => sub {
- my ($param) = @_;
-
- my $sid = PVE::HA::Tools::parse_sid($param->{sid});
-
- # delete state (default is 'enabled')
- PVE::API2::HA::Resources->update({ sid => $sid, delete => 'state' });
-
- return undef;
- }});
-
-__PACKAGE__->register_method ({
- name => 'disable',
- path => 'disable',
- method => 'POST',
- description => "Disable a HA resource.",
- parameters => {
- additionalProperties => 0,
- properties => {
- sid => get_standard_option('pve-ha-resource-or-vm-id'),
- },
- },
- returns => { type => 'null' },
- code => sub {
- my ($param) = @_;
-
- my $sid = PVE::HA::Tools::parse_sid($param->{sid});
-
- PVE::API2::HA::Resources->update({ sid => $sid, state => 'disabled' });
-
- return undef;
- }});
-
-my $timestamp_to_status = sub {
- my ($ctime, $timestamp) = @_;
-
- my $tdiff = $ctime - $timestamp;
- if ($tdiff > 30) {
- return "old timestamp - dead?";
- } elsif ($tdiff < -2) {
- return "detected time drift!";
- } else {
- return "active";
- }
-};
-
-__PACKAGE__->register_method ({
- name => 'status',
- path => 'status',
- method => 'GET',
- description => "Display HA manger status.",
- parameters => {
- additionalProperties => 0,
- properties => {
- verbose => {
- description => "Verbose output. Include complete CRM and LRM status (JSON).",
- type => 'boolean',
- default => 0,
- optional => 1,
- }
- },
- },
- returns => { type => 'null' },
- code => sub {
- my ($param) = @_;
-
- my $res = PVE::API2::HA::Status->status({});
- foreach my $e (@$res) {
- print "$e->{type} $e->{status}\n";
- }
-
- if ($param->{verbose}) {
- print "full cluster state:\n";
- my $data = PVE::API2::HA::Status->manager_status({});
- print to_json($data, { pretty => 1, canonical => 1} );
- }
-
- return undef;
- }});
-
-my $cmddef = {
- enable => [ __PACKAGE__, 'enable', ['sid']],
- disable => [ __PACKAGE__, 'disable', ['sid']],
- status => [ __PACKAGE__, 'status'],
- config => [ 'PVE::API2::HA::Resources', 'index', [], {}, sub {
- my $res = shift;
- foreach my $rec (sort { $a->{sid} cmp $b->{sid} } @$res) {
- my ($type, $name) = split(':', $rec->{sid}, 2);
- print "$type:$name\n";
- foreach my $k (sort keys %$rec) {
- next if $k eq 'digest' || $k eq 'sid' ||
- $k eq 'type' || $k eq 'errors';
- print "\t$k $rec->{$k}\n";
- }
- if (my $errors = $rec->{errors}) {
- foreach my $p (keys %$errors) {
- warn "error: property '$p' - $errors->{$p}\n";
- }
- }
- print "\n";
- }}],
- groups => [ 'PVE::API2::HA::Groups', 'index', [], {}, sub {
- my $res = shift;
- foreach my $rec (sort { $a->{group} cmp $b->{group} } @$res) {
- print "group: $rec->{group}\n";
- foreach my $k (sort keys %$rec) {
- next if $k eq 'digest' || $k eq 'group' ||
- $k eq 'type';
- print "\t$k $rec->{$k}\n";
- }
- print "\n";
- }}],
- add => [ "PVE::API2::HA::Resources", 'create', ['sid'] ],
- remove => [ "PVE::API2::HA::Resources", 'delete', ['sid'] ],
- set => [ "PVE::API2::HA::Resources", 'update', ['sid'] ],
-
- migrate => [ "PVE::API2::HA::Resources", 'migrate', ['sid', 'node'] ],
- relocate => [ "PVE::API2::HA::Resources", 'relocate', ['sid', 'node'] ],
-
-};
-
-my $cmd = shift;
-
-if ($cmd && $cmd ne 'printmanpod' && $cmd ne 'verifyapi') {
- PVE::Cluster::check_cfs_is_mounted();
- PVE::Cluster::cfs_update();
-}
-
-PVE::CLIHandler::handle_cmd($cmddef, "ha-manager", $cmd, \@ARGV, undef, $0);
-
-exit 0;
-
-__END__
-
-=head1 NAME
-
-pvecm - Proxmox VE HA Command Line Interface
-
-=head1 SYNOPSIS
-
-=include synopsis
-
-=head1 DESCRIPTION
-
-ha-manager is a program to manage the HA configuration.
-
-=include pve_copyright
+use PVE::CLI::ha_manager;
+PVE::CLI::ha_manager->run_cli();
--
2.1.4
More information about the pve-devel
mailing list