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()) |