-
Notifications
You must be signed in to change notification settings - Fork 10
/
freenas.py
120 lines (104 loc) · 3.93 KB
/
freenas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from __future__ import print_function
import core.exceptions as ex
from utilities.lazy import lazy
from drivers.array.freenas import Freenass
from core.pool import BasePool
LOCK_NAME = "freenas_update_disk"
LOCK_TIMEOUT = 120
class Pool(BasePool):
type = "freenas"
capabilities = ["roo", "rwo", "rox", "rwx", "shared", "blk", "iscsi"]
@lazy
def insecure_tpc(self):
return self.oget("insecure_tpc")
@lazy
def compression(self):
return self.oget("compression")
@lazy
def sparse(self):
return self.oget("sparse")
@lazy
def blocksize(self):
return self.oget("blocksize")
def delete_disk(self, name=None, disk_id=None):
lock_id = None
result = {}
try:
lock_id = self.node._daemon_lock(LOCK_NAME, timeout=LOCK_TIMEOUT, on_error="raise")
self.log.info("lock acquired: name=%s id=%s", LOCK_NAME, lock_id)
result = self.array.del_iscsi_zvol(name=name, volume=self.diskgroup)
finally:
self.node._daemon_unlock(LOCK_NAME, lock_id)
self.log.info("lock released: name=%s id=%s", LOCK_NAME, lock_id)
return result
def create_disk(self, name, size, nodes=None):
mappings = self.get_mappings(nodes)
if not mappings:
raise ex.Error("refuse to create a disk with no mappings")
lock_id = None
result = {}
try:
lock_id = self.node._daemon_lock(LOCK_NAME, timeout=LOCK_TIMEOUT, on_error="raise")
self.log.info("lock acquired: name=%s id=%s", LOCK_NAME, lock_id)
result = self.array.add_iscsi_zvol(name=name, size=size,
volume=self.diskgroup,
mappings=mappings,
insecure_tpc=self.insecure_tpc,
compression=self.compression,
sparse=self.sparse,
blocksize=self.blocksize)
finally:
self.node._daemon_unlock(LOCK_NAME, lock_id)
self.log.info("lock released: name=%s id=%s", LOCK_NAME, lock_id)
return result
def translate(self, name=None, size=None, fmt=True, shared=False):
data = []
disk = {
"rtype": "disk",
"type": "disk",
"name": name,
"scsireserv": True,
"shared": shared,
"size": size,
}
data.append(disk)
if fmt:
data += self.add_fs(name, shared)
return data
@lazy
def array_name(self):
return self.oget("array")
@lazy
def diskgroup(self):
return self.oget("diskgroup")
@lazy
def array(self):
o = Freenass()
array = o.get_freenas(self.array_name)
if array is None:
raise ex.Error("array %s not found" % self.array_name)
array.node = self.node
return array
def pool_status(self, usage=True):
from utilities.converters import convert_size
data = {
"type": self.type,
"name": self.name,
"head": "array://%s/%s" % (self.array_name, self.diskgroup),
"capabilities": self.capabilities,
}
if not usage:
return data
try:
dg = [dg for dg in self.array.list_pools() if dg["name"] == self.diskgroup][0]
except Exception as exc:
data["error"] = str(exc)
return data
data["free"] = convert_size(dg["avail"], _to="KB")
data["used"] = convert_size(dg["used"], _to="KB")
data["size"] = convert_size(dg["avail"] + dg["used"], _to="KB")
return data
def get_targets(self):
return [tgt["name"] for tgt in self.array.list_iscsi_target()]
def get_mappings(self, nodes):
return self._get_mappings(nodes, transport="iscsi")