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