Statistics
| Branch: | Revision:

root / rbd / attach @ master

History | View | Annotate | Download (4 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
"""Map an existing rbd Image to a block device
21 35acd6c9 Dimitris Aragiorgis
22 35acd6c9 Dimitris Aragiorgis
This program maps an existing rbd Image to a block device
23 35acd6c9 Dimitris Aragiorgis
e.g. /dev/rbd{X} and returns the device path. If the mapping
24 35acd6c9 Dimitris Aragiorgis
already exists, it returns the corresponding device path.
25 35acd6c9 Dimitris Aragiorgis
26 35acd6c9 Dimitris Aragiorgis
It takes it's input from environment variables. Specifically the
27 35acd6c9 Dimitris Aragiorgis
following variables should be present:
28 35acd6c9 Dimitris Aragiorgis
29 35acd6c9 Dimitris Aragiorgis
 - VOL_NAME: The name of the Image to map
30 35acd6c9 Dimitris Aragiorgis
 - POOL:     The RADOS pool in which the Image resides
31 35acd6c9 Dimitris Aragiorgis
32 35acd6c9 Dimitris Aragiorgis
Returns the block device path (which maps the Image) as a string
33 35acd6c9 Dimitris Aragiorgis
upon success, or 1 upon failure
34 35acd6c9 Dimitris Aragiorgis
35 35acd6c9 Dimitris Aragiorgis
"""
36 35acd6c9 Dimitris Aragiorgis
37 35acd6c9 Dimitris Aragiorgis
import os
38 35acd6c9 Dimitris Aragiorgis
import sys
39 35acd6c9 Dimitris Aragiorgis
import re
40 35acd6c9 Dimitris Aragiorgis
41 68abdf0d Dimitris Aragiorgis
sys.path.insert(0, "/etc/ganeti/share")
42 35acd6c9 Dimitris Aragiorgis
43 35acd6c9 Dimitris Aragiorgis
from ganeti import utils
44 35acd6c9 Dimitris Aragiorgis
45 35acd6c9 Dimitris Aragiorgis
46 35acd6c9 Dimitris Aragiorgis
def ReadEnv():
47 35acd6c9 Dimitris Aragiorgis
  """Read the mandatory enviromental variables
48 35acd6c9 Dimitris Aragiorgis
49 35acd6c9 Dimitris Aragiorgis
  """
50 35acd6c9 Dimitris Aragiorgis
  name = os.getenv("VOL_NAME")
51 35acd6c9 Dimitris Aragiorgis
  if name is None:
52 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('The environment variable VOL_NAME is missing.\n')
53 35acd6c9 Dimitris Aragiorgis
    return None
54 35acd6c9 Dimitris Aragiorgis
#  pool = os.getenv("POOL")
55 35acd6c9 Dimitris Aragiorgis
  pool = "rbd"
56 35acd6c9 Dimitris Aragiorgis
  if pool is None:
57 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('The environment variable POOL is missing.\n')
58 35acd6c9 Dimitris Aragiorgis
    return None
59 35acd6c9 Dimitris Aragiorgis
60 35acd6c9 Dimitris Aragiorgis
  return (name, pool)
61 35acd6c9 Dimitris Aragiorgis
62 35acd6c9 Dimitris Aragiorgis
63 35acd6c9 Dimitris Aragiorgis
def main():
64 35acd6c9 Dimitris Aragiorgis
  env = ReadEnv()
65 35acd6c9 Dimitris Aragiorgis
  if env is None:
66 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write('Wrong environment. Aborting...\n')
67 35acd6c9 Dimitris Aragiorgis
    return 1
68 35acd6c9 Dimitris Aragiorgis
69 35acd6c9 Dimitris Aragiorgis
  name, pool = env
70 35acd6c9 Dimitris Aragiorgis
71 35acd6c9 Dimitris Aragiorgis
  # Check if the mapping already exists
72 35acd6c9 Dimitris Aragiorgis
  cmd1 = ["rbd", "showmapped"]
73 35acd6c9 Dimitris Aragiorgis
  result = utils.RunCmd(cmd1)
74 35acd6c9 Dimitris Aragiorgis
  if result.failed:
75 35acd6c9 Dimitris Aragiorgis
    sys.stderr.write("rbd showmapped failed (%s): %s" %
76 35acd6c9 Dimitris Aragiorgis
                     (result.fail_reason, result.output))
77 35acd6c9 Dimitris Aragiorgis
    return 1
78 35acd6c9 Dimitris Aragiorgis
  else:
79 35acd6c9 Dimitris Aragiorgis
    cmd2 = "echo '%s' | grep %s | grep %s" % (result.output, pool, name)
80 35acd6c9 Dimitris Aragiorgis
    result = utils.RunCmd(cmd2)
81 35acd6c9 Dimitris Aragiorgis
    if not result.failed:
82 35acd6c9 Dimitris Aragiorgis
      # The mapping already exists.
83 35acd6c9 Dimitris Aragiorgis
      # Parse the result and return the rbd device
84 35acd6c9 Dimitris Aragiorgis
      try:
85 35acd6c9 Dimitris Aragiorgis
        rbd_dev = re.search("(/dev/rbd\d+)", result.output).group(1)
86 35acd6c9 Dimitris Aragiorgis
      except:
87 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("The rbd mapping exists but couldn't parse "
88 35acd6c9 Dimitris Aragiorgis
                         "the result of rbd showmapped to find the "
89 35acd6c9 Dimitris Aragiorgis
                         "corresponding rbd block device (/dev/rbd*)")
90 35acd6c9 Dimitris Aragiorgis
        return 1
91 35acd6c9 Dimitris Aragiorgis
92 35acd6c9 Dimitris Aragiorgis
      #return str(rbd_dev)
93 35acd6c9 Dimitris Aragiorgis
      sys.stdout.write("%s" % str(rbd_dev))
94 35acd6c9 Dimitris Aragiorgis
      sys.exit(0)
95 35acd6c9 Dimitris Aragiorgis
96 35acd6c9 Dimitris Aragiorgis
    else:
97 35acd6c9 Dimitris Aragiorgis
      # The mapping doesn't exist. Create it
98 35acd6c9 Dimitris Aragiorgis
      cmd = ["rbd", "map", "-p", "%s" % pool, "%s" % name]
99 35acd6c9 Dimitris Aragiorgis
      result = utils.RunCmd(cmd)
100 35acd6c9 Dimitris Aragiorgis
      if result.failed:
101 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("rbd map failed (%s): %s" % 
102 35acd6c9 Dimitris Aragiorgis
                         (result.fail_reason, result.output))
103 35acd6c9 Dimitris Aragiorgis
        return 1
104 35acd6c9 Dimitris Aragiorgis
      # Use rbd showmapped again to find the rbd device
105 35acd6c9 Dimitris Aragiorgis
      # the image was mapped to
106 35acd6c9 Dimitris Aragiorgis
      cmd3 = "rbd showmapped | grep %s | grep %s" % (pool, name)
107 35acd6c9 Dimitris Aragiorgis
      result = utils.RunCmd(cmd3)
108 35acd6c9 Dimitris Aragiorgis
      if result.failed:
109 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("Can't find mapped device. "
110 35acd6c9 Dimitris Aragiorgis
                         "rbd showmapped failed (%s): %s" %
111 35acd6c9 Dimitris Aragiorgis
                         (result.fail_reason, result.output))
112 35acd6c9 Dimitris Aragiorgis
        return 1
113 35acd6c9 Dimitris Aragiorgis
      try:
114 35acd6c9 Dimitris Aragiorgis
        rbd_dev = re.search("(/dev/rbd\d+)", result.output).group(1)
115 35acd6c9 Dimitris Aragiorgis
      except:
116 35acd6c9 Dimitris Aragiorgis
        sys.stderr.write("The rbd mapping was created succesfully, but "
117 35acd6c9 Dimitris Aragiorgis
                         "couldn't parse the result of rbd showmapped to "
118 35acd6c9 Dimitris Aragiorgis
                         "find the corresponding rbd block device "
119 35acd6c9 Dimitris Aragiorgis
                         "(/dev/rbd*)")
120 35acd6c9 Dimitris Aragiorgis
        return 1
121 35acd6c9 Dimitris Aragiorgis
122 35acd6c9 Dimitris Aragiorgis
      # The device was successfully mapped. Return it
123 35acd6c9 Dimitris Aragiorgis
      #return str(rbd_dev)
124 35acd6c9 Dimitris Aragiorgis
      sys.stdout.write("%s" % str(rbd_dev))
125 35acd6c9 Dimitris Aragiorgis
      sys.exit(0)
126 35acd6c9 Dimitris Aragiorgis
127 35acd6c9 Dimitris Aragiorgis
if __name__ == "__main__":
128 35acd6c9 Dimitris Aragiorgis
    sys.exit(main())