Statistics
| Branch: | Tag: | Revision:

root / doc / examples / ganeti-master-role.ocf.in @ aa75500a

History | View | Annotate | Download (2.9 kB)

1
#!/bin/bash
2
# ganeti master role OCF resource
3
# See http://linux-ha.org/wiki/OCF_Resource_Agents
4

    
5
set -e -u
6

    
7
@SHELL_ENV_INIT@
8

    
9
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
10

    
11
SCRIPTNAME="@LIBDIR@/ocf/resource.d/ganeti/ganeti-master-role"
12

    
13
# Master candidates list file
14
MCFILE="$DATA_DIR/ssconf_master_candidates"
15

    
16
# We'll need the hostname in a few places, so we'll get it once, now.
17
MYHOSTNAME=$(hostname --fqdn)
18

    
19
is_master() {
20
  local -r master=$(gnt-cluster getmaster)
21
  [[ "$MYHOSTNAME" == "$master" ]]
22
}
23

    
24
is_candidate() {
25
  grep -Fx $MYHOSTNAME $MCFILE
26
}
27

    
28
start_action() {
29
  if is_master; then
30
    exit 0
31
  elif is_candidate; then
32
    gnt-cluster master-failover || exit 1 # OCF_ERR_GENERIC
33
  else
34
    exit 5 # OCF_ERR_INSTALLED (vital component missing)
35
  fi
36
}
37

    
38
stop_action() {
39
  # We can't really "stop" being a master.
40
  # TODO: investigate whether a fake approach will do.
41
  exit 1 # OCF_ERR_GENERIC
42
}
43

    
44
recover_action() {
45
  if is_master; then
46
    gnt-cluster redist-conf || exit 1 # OCF_ERR_GENERIC
47
  elif is_candidate; then
48
    gnt-cluster master-failover || exit 1 # OCF_ERR_GENERIC
49
  else
50
    exit 5 # OCF_ERR_INSTALLED (vital component missing)
51
  fi
52
}
53

    
54
monitor_action() {
55
  # monitor should exit:
56
  #    7 if the resource is not running
57
  #    1 if it failed
58
  #    0 if it's running
59
  if is_master; then
60
    exit 0
61
  elif is_candidate; then
62
    exit 7 # OCF_NOT_RUNNING
63
  else
64
    exit 5 # OCF_ERR_INSTALLED (vital component missing)
65
  fi
66
}
67

    
68
return_meta() {
69
cat <<END
70
<?xml version="1.0"?>
71
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
72
<resource-agent name="ganeti-master-role" version="0.1">
73
<version>0.1</version>
74
<longdesc lang="en">
75
OCF script to manage the ganeti master role in a cluster.
76

    
77
Can be used to failover the ganeti master between master candidate nodes.
78
</longdesc>
79
<shortdesc lang="en">Manages the ganeti cluster master</shortdesc>
80

    
81
<parameters/>
82
<actions>
83
<action name="start" timeout="300s" />
84
<action name="stop" timeout="50s" />
85
<action name="monitor" depth="0" timeout="10s" interval="30s" />
86
<action name="meta-data" timeout="5s" />
87
<action name="recover" timeout="20s" />
88
<action name="reload" timeout="5s" />
89
</actions>
90
</resource-agent>
91
END
92
exit 0
93
}
94

    
95
case "$1" in
96
  # Mandatory OCF commands
97
  start)
98
    start_action
99
    ;;
100
  stop)
101
    stop_action
102
    ;;
103
  monitor)
104
    monitor_action
105
    ;;
106
  meta-data)
107
    return_meta
108
    ;;
109
  # Optional OCF commands
110
  recover)
111
    recover_action
112
    ;;
113
  reload)
114
    # The ganeti master role has no "configuration" that is reloadable on
115
    # the pacemaker side. We declare the operation anyway to make sure
116
    # pacemaker doesn't decide to stop and start the service needlessly.
117
    exit 0
118
    ;;
119
  promote|demote|migrate_to|migrate_from|validate-all)
120
    # Not implemented (nor declared by meta-data)
121
    exit 3 # OCF_ERR_UNIMPLEMENTED
122
    ;;
123
  *)
124
    log_success_msg "Usage: $SCRIPTNAME {start|stop|monitor|meta-data|recover|reload}"
125
    exit 1
126
    ;;
127
esac
128

    
129
exit 0