]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | import json |
2 | import sys | |
3 | from uuid import UUID | |
4 | from subprocess import check_output, CalledProcessError | |
5 | ||
6 | ||
7 | class Spdk_Rpc(object): | |
8 | def __init__(self, rpc_py): | |
9 | self.rpc_py = rpc_py | |
10 | ||
11 | def __getattr__(self, name): | |
12 | def call(*args): | |
13 | cmd = "{} {} {}".format(sys.executable, self.rpc_py, name) | |
14 | for arg in args: | |
15 | cmd += " {}".format(arg) | |
16 | try: | |
17 | output = check_output(cmd, shell=True) | |
18 | return output.decode('ascii').rstrip('\n'), 0 | |
19 | except CalledProcessError as e: | |
20 | print("ERROR: RPC Command {cmd} " | |
21 | "execution failed:". format(cmd=cmd)) | |
22 | print("Failed command output:") | |
23 | print(e.output) | |
24 | return e.output.decode('ascii'), e.returncode | |
25 | return call | |
26 | ||
27 | ||
28 | class Commands_Rpc(object): | |
29 | def __init__(self, rpc_py): | |
30 | self.rpc = Spdk_Rpc(rpc_py) | |
31 | ||
32 | def check_get_bdevs_methods(self, uuid_bdev, bdev_size_mb, bdev_alias=""): | |
33 | print("INFO: Check RPC COMMAND get_bdevs") | |
34 | output = self.rpc.get_bdevs()[0] | |
35 | json_value = json.loads(output) | |
36 | for i in range(len(json_value)): | |
37 | uuid_json = json_value[i]['name'] | |
38 | aliases = json_value[i]['aliases'] | |
39 | ||
40 | if uuid_bdev in [uuid_json]: | |
41 | print("Info: UUID:{uuid} is found in RPC Command: " | |
42 | "gets_bdevs response".format(uuid=uuid_bdev)) | |
43 | # Check if human-friendly alias is as expected | |
44 | if bdev_alias and aliases: | |
45 | if bdev_alias not in aliases: | |
46 | print("ERROR: Expected bdev alias not found") | |
47 | print("Expected: {name}".format(name=bdev_alias)) | |
48 | print("Actual: {aliases}".format(aliases=aliases)) | |
49 | return 1 | |
50 | # num_block and block_size have values in bytes | |
51 | num_blocks = json_value[i]['num_blocks'] | |
52 | block_size = json_value[i]['block_size'] | |
53 | if num_blocks * block_size == bdev_size_mb * 1024 * 1024: | |
54 | print("Info: Response get_bdevs command is " | |
55 | "correct. Params: uuid_bdevs: {uuid}, bdev_size " | |
56 | "{size}".format(uuid=uuid_bdev, | |
57 | size=bdev_size_mb)) | |
58 | return 0 | |
59 | print("INFO: UUID:{uuid} or bdev_size:{bdev_size_mb} not found in " | |
60 | "RPC COMMAND get_bdevs: " | |
61 | "{json_value}".format(uuid=uuid_bdev, bdev_size_mb=bdev_size_mb, | |
62 | json_value=json_value)) | |
63 | return 1 | |
64 | ||
65 | def check_get_lvol_stores(self, base_name, uuid, cluster_size=None, lvs_name=""): | |
66 | print("INFO: RPC COMMAND get_lvol_stores") | |
67 | json_value = self.get_lvol_stores() | |
68 | if json_value: | |
69 | for i in range(len(json_value)): | |
70 | json_uuid = json_value[i]['uuid'] | |
71 | json_cluster = json_value[i]['cluster_size'] | |
72 | json_base_name = json_value[i]['base_bdev'] | |
73 | json_name = json_value[i]['name'] | |
74 | ||
75 | if base_name in json_base_name \ | |
76 | and uuid in json_uuid: | |
77 | print("INFO: base_name:{base_name} is found in RPC " | |
78 | "Command: get_lvol_stores " | |
79 | "response".format(base_name=base_name)) | |
80 | print("INFO: UUID:{uuid} is found in RPC Command: " | |
81 | "get_lvol_stores response".format(uuid=uuid)) | |
82 | if cluster_size: | |
83 | if str(cluster_size) in str(json_cluster): | |
84 | print("Info: Cluster size :{cluster_size} is found in RPC " | |
85 | "Command: get_lvol_stores " | |
86 | "response".format(cluster_size=cluster_size)) | |
87 | else: | |
88 | print("ERROR: Wrong cluster size in lvol store") | |
89 | print("Expected:".format(cluster_size)) | |
90 | print("Actual:".format(json_cluster)) | |
91 | return 1 | |
92 | ||
93 | # Also check name if param is provided: | |
94 | if lvs_name: | |
95 | if lvs_name not in json_name: | |
96 | print("ERROR: Lvol store human-friendly name does not match") | |
97 | print("Expected: {lvs_name}".format(lvs_name=lvs_name)) | |
98 | print("Actual: {name}".format(name=json_name)) | |
99 | return 1 | |
100 | return 0 | |
101 | print("FAILED: UUID: lvol store {uuid} on base_bdev: " | |
102 | "{base_name} not found in get_lvol_stores()".format(uuid=uuid, | |
103 | base_name=base_name)) | |
104 | return 1 | |
105 | else: | |
106 | print("INFO: Lvol store not exist") | |
107 | return 2 | |
108 | return 0 | |
109 | ||
110 | def construct_malloc_bdev(self, total_size, block_size): | |
111 | print("INFO: RPC COMMAND construct_malloc_bdev") | |
112 | output = self.rpc.construct_malloc_bdev(total_size, block_size)[0] | |
113 | return output.rstrip('\n') | |
114 | ||
9f95a23c | 115 | def construct_lvol_store(self, base_name, lvs_name, cluster_size=None, clear_method=None): |
11fdf7f2 TL |
116 | print("INFO: RPC COMMAND construct_lvol_store") |
117 | if cluster_size: | |
118 | output = self.rpc.construct_lvol_store(base_name, | |
119 | lvs_name, | |
120 | "-c {cluster_sz}".format(cluster_sz=cluster_size))[0] | |
9f95a23c TL |
121 | elif clear_method: |
122 | output = self.rpc.construct_lvol_store(base_name, | |
123 | lvs_name, | |
124 | "--clear-method {clear_m}".format(clear_m=clear_method))[0] | |
11fdf7f2 TL |
125 | else: |
126 | output = self.rpc.construct_lvol_store(base_name, lvs_name)[0] | |
127 | return output.rstrip('\n') | |
128 | ||
129 | def construct_lvol_bdev(self, uuid, lbd_name, size, thin=False): | |
130 | print("INFO: RPC COMMAND construct_lvol_bdev") | |
131 | try: | |
132 | uuid_obj = UUID(uuid) | |
133 | name_opt = "-u" | |
134 | except ValueError: | |
135 | name_opt = "-l" | |
136 | thin_provisioned = "" | |
137 | if thin: | |
138 | thin_provisioned = "-t" | |
139 | output = self.rpc.construct_lvol_bdev(name_opt, uuid, lbd_name, size, thin_provisioned)[0] | |
140 | return output.rstrip('\n') | |
141 | ||
142 | def destroy_lvol_store(self, uuid): | |
143 | print("INFO: RPC COMMAND destroy_lvol_store") | |
144 | try: | |
145 | uuid_obj = UUID(uuid) | |
146 | name_opt = "-u" | |
147 | except ValueError: | |
148 | name_opt = "-l" | |
149 | output, rc = self.rpc.destroy_lvol_store(name_opt, uuid) | |
150 | return rc | |
151 | ||
11fdf7f2 TL |
152 | def delete_malloc_bdev(self, base_name): |
153 | print("INFO: RPC COMMAND delete_malloc_bdev") | |
154 | output, rc = self.rpc.delete_malloc_bdev(base_name) | |
155 | return rc | |
156 | ||
157 | def destroy_lvol_bdev(self, bdev_name): | |
158 | print("INFO: RPC COMMAND destroy_lvol_bdev") | |
159 | output, rc = self.rpc.destroy_lvol_bdev(bdev_name) | |
160 | return rc | |
161 | ||
162 | def resize_lvol_bdev(self, uuid, new_size): | |
163 | print("INFO: RPC COMMAND resize_lvol_bdev") | |
164 | output, rc = self.rpc.resize_lvol_bdev(uuid, new_size) | |
165 | return rc | |
166 | ||
9f95a23c TL |
167 | def set_read_only_lvol_bdev(self, uuid): |
168 | print("INFO: RPC COMMAND set_read_only_lvol_bdev") | |
169 | output, rc = self.rpc.set_read_only_lvol_bdev(uuid) | |
170 | return rc | |
171 | ||
11fdf7f2 TL |
172 | def start_nbd_disk(self, bdev_name, nbd_name): |
173 | print("INFO: RPC COMMAND start_nbd_disk") | |
174 | output, rc = self.rpc.start_nbd_disk(bdev_name, nbd_name) | |
175 | return rc | |
176 | ||
177 | def stop_nbd_disk(self, nbd_name): | |
178 | print("INFO: RPC COMMAND stop_nbd_disk") | |
179 | output, rc = self.rpc.stop_nbd_disk(nbd_name) | |
180 | return rc | |
181 | ||
182 | def get_lvol_stores(self, name=None): | |
183 | print("INFO: RPC COMMAND get_lvol_stores") | |
184 | if name: | |
185 | output = json.loads(self.rpc.get_lvol_stores("-l", name)[0]) | |
186 | else: | |
187 | output = json.loads(self.rpc.get_lvol_stores()[0]) | |
188 | return output | |
189 | ||
190 | def get_lvol_bdevs(self): | |
191 | print("INFO: RPC COMMAND get_bdevs; lvol bdevs only") | |
192 | output = [] | |
193 | rpc_output = json.loads(self.rpc.get_bdevs()[0]) | |
194 | for bdev in rpc_output: | |
195 | if bdev["product_name"] == "Logical Volume": | |
196 | output.append(bdev) | |
197 | return output | |
198 | ||
199 | def get_lvol_bdev_with_name(self, name): | |
200 | print("INFO: RPC COMMAND get_bdevs; lvol bdevs only") | |
201 | rpc_output = json.loads(self.rpc.get_bdevs("-b", name)[0]) | |
202 | if len(rpc_output) > 0: | |
203 | return rpc_output[0] | |
204 | ||
205 | return None | |
206 | ||
207 | def rename_lvol_store(self, old_name, new_name): | |
208 | print("INFO: Renaming lvol store from {old} to {new}".format(old=old_name, new=new_name)) | |
209 | output, rc = self.rpc.rename_lvol_store(old_name, new_name) | |
210 | return rc | |
211 | ||
212 | def rename_lvol_bdev(self, old_name, new_name): | |
213 | print("INFO: Renaming lvol bdev from {old} to {new}".format(old=old_name, new=new_name)) | |
214 | output, rc = self.rpc.rename_lvol_bdev(old_name, new_name) | |
215 | return rc | |
216 | ||
217 | def snapshot_lvol_bdev(self, bdev_name, snapshot_name): | |
218 | print("INFO: RPC COMMAND snapshot_lvol_bdev") | |
219 | output, rc = self.rpc.snapshot_lvol_bdev(bdev_name, snapshot_name) | |
220 | return rc | |
221 | ||
222 | def clone_lvol_bdev(self, snapshot_name, clone_name): | |
223 | print("INFO: RPC COMMAND clone_lvol_bdev") | |
224 | output, rc = self.rpc.clone_lvol_bdev(snapshot_name, clone_name) | |
225 | return rc | |
226 | ||
227 | def inflate_lvol_bdev(self, clone_name): | |
228 | print("INFO: RPC COMMAND inflate_lvol_bdev") | |
229 | output, rc = self.rpc.inflate_lvol_bdev(clone_name) | |
230 | return rc | |
231 | ||
232 | def decouple_parent_lvol_bdev(self, clone_name): | |
233 | print("INFO: RPC COMMAND decouple_parent_lvol_bdev") | |
234 | output, rc = self.rpc.decouple_parent_lvol_bdev(clone_name) | |
235 | return rc | |
236 | ||
237 | def construct_aio_bdev(self, aio_path, aio_name, aio_bs=""): | |
238 | print("INFO: RPC COMMAND construct_aio_bdev") | |
239 | output, rc = self.rpc.construct_aio_bdev(aio_path, aio_name, aio_bs) | |
240 | return rc | |
241 | ||
242 | def delete_aio_bdev(self, aio_name): | |
243 | print("INFO: RPC COMMAND delete_aio_bdev") | |
244 | output, rc = self.rpc.delete_aio_bdev(aio_name) | |
245 | return rc |