Statistics
| Branch: | Revision:

root / rbd / detach @ master

History | View | Annotate | Download (3.1 kB)

1 35acd6c9 Dimitris Aragiorgis
#!/usr/bin/env python
2 35acd6c9 Dimitris Aragiorgis
#
3 35acd6c9 Dimitris Aragiorgis
# Copyright (C) 2011 Greek Research and Technology Network
4 35acd6c9 Dimitris Aragiorgis
#
5 35acd6c9 Dimitris Aragiorgis
# This program is free software; you can redistribute it and/or modify
6 35acd6c9 Dimitris Aragiorgis
# it under the terms of the GNU General Public License as published by
7 35acd6c9 Dimitris Aragiorgis
# the Free Software Foundation; either version 2 of the License, or
8 35acd6c9 Dimitris Aragiorgis
# (at your option) any later version.
9 35acd6c9 Dimitris Aragiorgis
#
10 35acd6c9 Dimitris Aragiorgis
# This program is distributed in the hope that it will be useful, but
11 35acd6c9 Dimitris Aragiorgis
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 35acd6c9 Dimitris Aragiorgis
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 35acd6c9 Dimitris Aragiorgis
# General Public License for more details.
14 35acd6c9 Dimitris Aragiorgis
#
15 35acd6c9 Dimitris Aragiorgis
# You should have received a copy of the GNU General Public License
16 35acd6c9 Dimitris Aragiorgis
# along with this program; if not, write to the Free Software
17 35acd6c9 Dimitris Aragiorgis
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 35acd6c9 Dimitris Aragiorgis
# 02110-1301, USA.
19 35acd6c9 Dimitris Aragiorgis
20 35acd6c9 Dimitris Aragiorgis
"""Unmap an rbd device from the Image it is mapped to
21 35acd6c9 Dimitris Aragiorgis
22 35acd6c9 Dimitris Aragiorgis
This program unmaps an rbd device from the Image it is mapped to.
23 35acd6c9 Dimitris Aragiorgis
It is idempotent if the mapping doesn't exist at all.
24 35acd6c9 Dimitris Aragiorgis
25 35acd6c9 Dimitris Aragiorgis
It takes it's input from environment variables. Specifically the
26 35acd6c9 Dimitris Aragiorgis
following variables should be present:
27 35acd6c9 Dimitris Aragiorgis
28 35acd6c9 Dimitris Aragiorgis
 - VOL_NAME: The name of the Image file to which the device points
29 35acd6c9 Dimitris Aragiorgis
 - POOL:     The RADOS pool in which the Image resides
30 35acd6c9 Dimitris Aragiorgis
31 35acd6c9 Dimitris Aragiorgis
Returns O upon successfull unmapping, 1 upon failure
32 35acd6c9 Dimitris Aragiorgis
33 35acd6c9 Dimitris Aragiorgis
"""
34 35acd6c9 Dimitris Aragiorgis
35 35acd6c9 Dimitris Aragiorgis
import os
36 35acd6c9 Dimitris Aragiorgis
import sys
37 35acd6c9 Dimitris Aragiorgis
import re
38 35acd6c9 Dimitris Aragiorgis
39 68abdf0d Dimitris Aragiorgis
sys.path.insert(0, "/etc/ganeti/share")
40 35acd6c9 Dimitris Aragiorgis
41 35acd6c9 Dimitris Aragiorgis
from ganeti import utils
42 35acd6c9 Dimitris Aragiorgis
43 35acd6c9 Dimitris Aragiorgis
44 35acd6c9 Dimitris Aragiorgis
def ReadEnv():
45 35acd6c9 Dimitris Aragiorgis
  """Read the mandatory enviromental variables
46 35acd6c9 Dimitris Aragiorgis
47 35acd6c9 Dimitris Aragiorgis
  """
48 35acd6c9 Dimitris Aragiorgis
  name = os.getenv("VOL_NAME")
49 35acd6c9 Dimitris Aragiorgis
  if name is None:
50 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('The environment variable VOL_NAME is missing.\n')
51 35acd6c9 Dimitris Aragiorgis
    return None
52 35acd6c9 Dimitris Aragiorgis
#  pool = os.getenv("POOL")
53 35acd6c9 Dimitris Aragiorgis
  pool = "rbd"
54 35acd6c9 Dimitris Aragiorgis
  if pool is None:
55 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('The environment variable POOL is missing.\n')
56 35acd6c9 Dimitris Aragiorgis
    return None
57 35acd6c9 Dimitris Aragiorgis
58 35acd6c9 Dimitris Aragiorgis
  return (name, pool)
59 35acd6c9 Dimitris Aragiorgis
60 35acd6c9 Dimitris Aragiorgis
61 35acd6c9 Dimitris Aragiorgis
def main():
62 35acd6c9 Dimitris Aragiorgis
  env = ReadEnv()
63 35acd6c9 Dimitris Aragiorgis
  if env is None:
64 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('Wrong environment. Aborting...\n')
65 35acd6c9 Dimitris Aragiorgis
    return 1
66 35acd6c9 Dimitris Aragiorgis
67 35acd6c9 Dimitris Aragiorgis
  name, pool = env
68 35acd6c9 Dimitris Aragiorgis
69 35acd6c9 Dimitris Aragiorgis
  # Check if the mapping already exists
70 35acd6c9 Dimitris Aragiorgis
  cmd1 = ["rbd", "showmapped"]
71 35acd6c9 Dimitris Aragiorgis
  result = utils.RunCmd(cmd1)
72 35acd6c9 Dimitris Aragiorgis
  if result.failed:
73 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write("rbd showmapped failed (%s): %s" %
74 35acd6c9 Dimitris Aragiorgis
                     (result.fail_reason, result.output))
75 35acd6c9 Dimitris Aragiorgis
    return 1
76 35acd6c9 Dimitris Aragiorgis
  else:
77 35acd6c9 Dimitris Aragiorgis
    cmd2 = "echo '%s' | grep %s | grep %s" % (result.output, pool, name)
78 35acd6c9 Dimitris Aragiorgis
    result = utils.RunCmd(cmd2)
79 35acd6c9 Dimitris Aragiorgis
    if not result.failed:
80 35acd6c9 Dimitris Aragiorgis
      # The mapping already exists.
81 35acd6c9 Dimitris Aragiorgis
      # Parse the result to find the rbd device
82 35acd6c9 Dimitris Aragiorgis
      try:
83 35acd6c9 Dimitris Aragiorgis
        rbd_dev = re.search("(/dev/rbd\d+)", result.output).group(1)
84 35acd6c9 Dimitris Aragiorgis
      except:
85 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("The rbd mapping exists but couldn't parse "
86 35acd6c9 Dimitris Aragiorgis
                         "the result of rbd showmapped to find the "
87 35acd6c9 Dimitris Aragiorgis
                         "corresponding rbd block device (/dev/rbd*)")
88 35acd6c9 Dimitris Aragiorgis
        return 1
89 35acd6c9 Dimitris Aragiorgis
90 35acd6c9 Dimitris Aragiorgis
      # Unmap the rbd device
91 35acd6c9 Dimitris Aragiorgis
      cmd = ["rbd", "unmap", "%s" % rbd_dev]
92 35acd6c9 Dimitris Aragiorgis
      result = utils.RunCmd(cmd)
93 35acd6c9 Dimitris Aragiorgis
      if result.failed:
94 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("rbd unmap failed (%s): %s" %
95 35acd6c9 Dimitris Aragiorgis
                         (result.fail_reason, result.output))
96 35acd6c9 Dimitris Aragiorgis
        return 1
97 35acd6c9 Dimitris Aragiorgis
     
98 35acd6c9 Dimitris Aragiorgis
      # Succesfull unmapping
99 35acd6c9 Dimitris Aragiorgis
      return 0
100 35acd6c9 Dimitris Aragiorgis
101 35acd6c9 Dimitris Aragiorgis
    else:
102 35acd6c9 Dimitris Aragiorgis
      # The mapping doesn't exist. Do nothing
103 35acd6c9 Dimitris Aragiorgis
      # ! Here there is a chance that echo or grep actually failed.
104 35acd6c9 Dimitris Aragiorgis
      # TODO: Zero that chance 
105 35acd6c9 Dimitris Aragiorgis
      return 0
106 35acd6c9 Dimitris Aragiorgis
107 35acd6c9 Dimitris Aragiorgis
108 35acd6c9 Dimitris Aragiorgis
if __name__ == "__main__":
109 35acd6c9 Dimitris Aragiorgis
    sys.exit(main())