@@ -58,7 +58,7 @@ class Ndctl:
58
58
"""ndctl CLI handle"""
59
59
def __init__ (self ):
60
60
self .version = self ._get_ndctl_version ()
61
- self .ndctl_list_output = self ._get_ndctl_list_output ()
61
+ self .ndctl_list_output = self ._get_ndctl_list_output ('list' )
62
62
63
63
def _get_ndctl_version (self ):
64
64
proc = sp .run (['ndctl' , '--version' ], stdout = sp .PIPE , stderr = sp .STDOUT )
@@ -69,8 +69,8 @@ def _get_ndctl_version(self):
69
69
version = proc .stdout .strip ()
70
70
return version
71
71
72
- def _get_ndctl_list_output (self ):
73
- proc = sp .run (['ndctl' , 'list' ], stdout = sp .PIPE , stderr = sp .STDOUT )
72
+ def _get_ndctl_list_output (self , * args ):
73
+ proc = sp .run (['ndctl' , * args ], stdout = sp .PIPE , stderr = sp .STDOUT )
74
74
if proc .returncode != 0 :
75
75
raise futils .Fail ('ndctl list failed:{}{}' .format (os .linesep ,
76
76
proc .stdout ))
@@ -85,7 +85,7 @@ def _get_dev_info(self, dev_path):
85
85
dev = None
86
86
devtypes = ('blockdev' , 'chardev' )
87
87
88
- for d in self .ndctl_list_output :
88
+ for d in self ._get_ndctl_list_output ( 'list' ) :
89
89
for dt in devtypes :
90
90
if dt in d and os .path .join ('/dev' , d [dt ]) == dev_path :
91
91
dev = d
@@ -95,9 +95,39 @@ def _get_dev_info(self, dev_path):
95
95
.format (dev_path ))
96
96
return dev
97
97
98
+ # for ndctl v63 we need to parse ndctl list in a different way than for v64
99
+ def _get_dev_info_63 (self , dev_path ):
100
+ dev = None
101
+ devtype = 'chardev'
102
+ daxreg = 'daxregion'
103
+
104
+ for d in self ._get_ndctl_list_output ('list' , '-v' ):
105
+ if daxreg in d :
106
+ devices = d [daxreg ]['devices' ]
107
+ for device in devices :
108
+ if devtype in device and \
109
+ os .path .join ('/dev' , device [devtype ]) == dev_path :
110
+ # only params from daxreg are intrested at this point,
111
+ # other values are read by _get_dev_info() earlier
112
+ dev = d [daxreg ]
113
+
114
+ if not dev :
115
+ raise futils .Fail ('ndctl does not recognize the device: "{}"'
116
+ .format (dev_path ))
117
+
118
+ return dev
119
+
98
120
def _get_dev_param (self , dev_path , param ):
121
+ p = None
99
122
dev = self ._get_dev_info (dev_path )
100
- return dev [param ]
123
+
124
+ try :
125
+ p = dev [param ]
126
+ except KeyError :
127
+ dev = self ._get_dev_info_63 (dev_path )
128
+ p = dev [param ]
129
+
130
+ return p
101
131
102
132
def get_dev_size (self , dev_path ):
103
133
return int (self ._get_dev_param (dev_path , 'size' ))
0 commit comments