xref: /onnv-gate/usr/src/cmd/beadm/BootEnvironment.py (revision 13013:3c7681e3e323)
1*13013Sglenn.lagasse@oracle.com# CDDL HEADER START
2*13013Sglenn.lagasse@oracle.com#
3*13013Sglenn.lagasse@oracle.com# The contents of this file are subject to the terms of the
4*13013Sglenn.lagasse@oracle.com# Common Development and Distribution License (the "License").
5*13013Sglenn.lagasse@oracle.com# You may not use this file except in compliance with the License.
6*13013Sglenn.lagasse@oracle.com#
7*13013Sglenn.lagasse@oracle.com# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8*13013Sglenn.lagasse@oracle.com# or http://www.opensolaris.org/os/licensing.
9*13013Sglenn.lagasse@oracle.com# See the License for the specific language governing permissions
10*13013Sglenn.lagasse@oracle.com# and limitations under the License.
11*13013Sglenn.lagasse@oracle.com#
12*13013Sglenn.lagasse@oracle.com# When distributing Covered Code, include this CDDL HEADER in each
13*13013Sglenn.lagasse@oracle.com# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
14*13013Sglenn.lagasse@oracle.com# If applicable, add the following below this CDDL HEADER, with the
15*13013Sglenn.lagasse@oracle.com# fields enclosed by brackets "[]" replaced with your own identifying
16*13013Sglenn.lagasse@oracle.com# information: Portions Copyright [yyyy] [name of copyright owner]
17*13013Sglenn.lagasse@oracle.com#
18*13013Sglenn.lagasse@oracle.com# CDDL HEADER END
19*13013Sglenn.lagasse@oracle.com#
20*13013Sglenn.lagasse@oracle.com
21*13013Sglenn.lagasse@oracle.com#
22*13013Sglenn.lagasse@oracle.com# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
23*13013Sglenn.lagasse@oracle.com#
24*13013Sglenn.lagasse@oracle.com
25*13013Sglenn.lagasse@oracle.com"""Boot Environment classes used by beadm."""
26*13013Sglenn.lagasse@oracle.com
27*13013Sglenn.lagasse@oracle.comimport datetime
28*13013Sglenn.lagasse@oracle.com
29*13013Sglenn.lagasse@oracle.comclass BootEnvironment:
30*13013Sglenn.lagasse@oracle.com    """Boot Environment object that is used by beadm to manage command line
31*13013Sglenn.lagasse@oracle.com    options, arguments and the log."""
32*13013Sglenn.lagasse@oracle.com
33*13013Sglenn.lagasse@oracle.com    def __init__(self):
34*13013Sglenn.lagasse@oracle.com        self.trgt_rpool = None
35*13013Sglenn.lagasse@oracle.com        self.trgt_be_name_or_snapshot = None
36*13013Sglenn.lagasse@oracle.com        self.src_be_name_or_snapshot = None
37*13013Sglenn.lagasse@oracle.com        self.properties = {}
38*13013Sglenn.lagasse@oracle.com        self.log_id = None
39*13013Sglenn.lagasse@oracle.com        self.log = None
40*13013Sglenn.lagasse@oracle.com        self.msg_buf = {}
41*13013Sglenn.lagasse@oracle.com        self.description = None
42*13013Sglenn.lagasse@oracle.com
43*13013Sglenn.lagasse@oracle.comclass listBootEnvironment:
44*13013Sglenn.lagasse@oracle.com    """Base class for beadm list
45*13013Sglenn.lagasse@oracle.com    Determine the BE's to display. Prints command output according to option:
46*13013Sglenn.lagasse@oracle.com    -d - dataset
47*13013Sglenn.lagasse@oracle.com    -s - snapshot
48*13013Sglenn.lagasse@oracle.com    -a - all (both dataset and snapshot)
49*13013Sglenn.lagasse@oracle.com    <none> - only BE information
50*13013Sglenn.lagasse@oracle.com    The -H option produces condensed, parseable output
51*13013Sglenn.lagasse@oracle.com        The ';' delimits each field in the output.  BEs with multiple
52*13013Sglenn.lagasse@oracle.com        datasets will have multiple lines in the output.
53*13013Sglenn.lagasse@oracle.com    """
54*13013Sglenn.lagasse@oracle.com
55*13013Sglenn.lagasse@oracle.com    def list(self, be_list, ddh, be_name):
56*13013Sglenn.lagasse@oracle.com        """ print all output for beadm list command
57*13013Sglenn.lagasse@oracle.com        be_list - list of all BEs
58*13013Sglenn.lagasse@oracle.com        ddh - if True, Do not Display Headers - just parseable data
59*13013Sglenn.lagasse@oracle.com        be_name - user-specified BE, if any
60*13013Sglenn.lagasse@oracle.com
61*13013Sglenn.lagasse@oracle.com        returns 0 for success
62*13013Sglenn.lagasse@oracle.com        side effect: beadm list output printed to stdout
63*13013Sglenn.lagasse@oracle.com        """
64*13013Sglenn.lagasse@oracle.com
65*13013Sglenn.lagasse@oracle.com        #If we're listing Headers, initialize the array holding the
66*13013Sglenn.lagasse@oracle.com        #column widths with the header widths themselves.  Later on,
67*13013Sglenn.lagasse@oracle.com        #the data in this array will get adjusted as we process actual
68*13013Sglenn.lagasse@oracle.com        #row data and find that a piece of data is wider than its
69*13013Sglenn.lagasse@oracle.com        #column header.
70*13013Sglenn.lagasse@oracle.com        bemaxout = [0 for i in range(len(self.hdr[0]))]
71*13013Sglenn.lagasse@oracle.com        if not ddh:
72*13013Sglenn.lagasse@oracle.com            #iterate all header rows since their fields may not
73*13013Sglenn.lagasse@oracle.com            #be of equal length.
74*13013Sglenn.lagasse@oracle.com            for header in self.hdr:
75*13013Sglenn.lagasse@oracle.com                icol = 0
76*13013Sglenn.lagasse@oracle.com                for hc in header:
77*13013Sglenn.lagasse@oracle.com                    if len(hc) + 1 > bemaxout[icol]:
78*13013Sglenn.lagasse@oracle.com                        bemaxout[icol] = len(hc) + 1
79*13013Sglenn.lagasse@oracle.com                    icol += 1
80*13013Sglenn.lagasse@oracle.com
81*13013Sglenn.lagasse@oracle.com        #collect BEs
82*13013Sglenn.lagasse@oracle.com        beout = {}     #matrix of output text [row][attribute]
83*13013Sglenn.lagasse@oracle.com        beoutname = {} #list of BE names [row]
84*13013Sglenn.lagasse@oracle.com        be_space = {}  #space used totals for BE [BE name]['space_used','ibei']
85*13013Sglenn.lagasse@oracle.com        ibe = 0        #BE index
86*13013Sglenn.lagasse@oracle.com        spacecol = -1  #to contain column where space used is displayed
87*13013Sglenn.lagasse@oracle.com        for be in be_list:
88*13013Sglenn.lagasse@oracle.com            if 'orig_be_name' in be:
89*13013Sglenn.lagasse@oracle.com                cur_be = be['orig_be_name']
90*13013Sglenn.lagasse@oracle.com                cur_be_obj = be
91*13013Sglenn.lagasse@oracle.com
92*13013Sglenn.lagasse@oracle.com            #if BE name specified, collect matching BEs
93*13013Sglenn.lagasse@oracle.com            if be_name is not None and not self.beMatch(be, be_name):
94*13013Sglenn.lagasse@oracle.com                continue
95*13013Sglenn.lagasse@oracle.com            attrs = ()
96*13013Sglenn.lagasse@oracle.com            #identify BE|dataset|snapshot attributes
97*13013Sglenn.lagasse@oracle.com            att = ''
98*13013Sglenn.lagasse@oracle.com            for att in ('orig_be_name', 'dataset', 'snap_name'):
99*13013Sglenn.lagasse@oracle.com                if att in be and att in self.lattrs:
100*13013Sglenn.lagasse@oracle.com                    attrs = self.lattrs[att]
101*13013Sglenn.lagasse@oracle.com                    if att == 'orig_be_name':
102*13013Sglenn.lagasse@oracle.com                        be_space[cur_be] = {}
103*13013Sglenn.lagasse@oracle.com                        be_space[cur_be]['space_used'] = 0
104*13013Sglenn.lagasse@oracle.com                        be_space[cur_be]['ibe'] = ibe
105*13013Sglenn.lagasse@oracle.com                        if not ddh and len(cur_be) + 1 > bemaxout[0]:
106*13013Sglenn.lagasse@oracle.com                            bemaxout[0] = len(cur_be) + 1
107*13013Sglenn.lagasse@oracle.com                    break
108*13013Sglenn.lagasse@oracle.com            beout[ibe] = {}
109*13013Sglenn.lagasse@oracle.com            beoutname[ibe] = cur_be
110*13013Sglenn.lagasse@oracle.com
111*13013Sglenn.lagasse@oracle.com            icol = 0 #first column
112*13013Sglenn.lagasse@oracle.com            for at in attrs:
113*13013Sglenn.lagasse@oracle.com                #for option -s, withhold subordinate datasets
114*13013Sglenn.lagasse@oracle.com                if self.__class__.__name__ == 'SnapshotList' and \
115*13013Sglenn.lagasse@oracle.com                    att == 'snap_name' and  'snap_name' in be and \
116*13013Sglenn.lagasse@oracle.com                    '/' in be[att]:
117*13013Sglenn.lagasse@oracle.com                    break
118*13013Sglenn.lagasse@oracle.com                #convert output to readable format and save
119*13013Sglenn.lagasse@oracle.com                save = self.getAttr(at, be, ddh, cur_be_obj)
120*13013Sglenn.lagasse@oracle.com                beout[ibe][at] = save
121*13013Sglenn.lagasse@oracle.com                #maintain maximum column widths
122*13013Sglenn.lagasse@oracle.com                if not ddh and len(save) + 1 > bemaxout[icol]:
123*13013Sglenn.lagasse@oracle.com                    bemaxout[icol] = len(save) + 1
124*13013Sglenn.lagasse@oracle.com                #sum all snapshots for BE
125*13013Sglenn.lagasse@oracle.com                if at == 'space_used' and 'space_used' in be:
126*13013Sglenn.lagasse@oracle.com                    spacecol = icol
127*13013Sglenn.lagasse@oracle.com                icol += 1 #next column
128*13013Sglenn.lagasse@oracle.com            ibe += 1
129*13013Sglenn.lagasse@oracle.com            if 'space_used' in be:
130*13013Sglenn.lagasse@oracle.com                #sum all snapshots and datasets for BE in 'beadm list'
131*13013Sglenn.lagasse@oracle.com                if isinstance(self, BEList):
132*13013Sglenn.lagasse@oracle.com                    be_space[cur_be]['space_used'] += be.get('space_used')
133*13013Sglenn.lagasse@oracle.com                elif cur_be in be_space and \
134*13013Sglenn.lagasse@oracle.com                    ('space_used' not in be_space[cur_be] or
135*13013Sglenn.lagasse@oracle.com                        be_space[cur_be]['space_used'] == 0):
136*13013Sglenn.lagasse@oracle.com                    #list space used separately for other options
137*13013Sglenn.lagasse@oracle.com                    be_space[cur_be]['space_used'] = be.get('space_used')
138*13013Sglenn.lagasse@oracle.com
139*13013Sglenn.lagasse@oracle.com        #output format total lengths for each BE with any snapshots
140*13013Sglenn.lagasse@oracle.com        for cur_be in be_space:
141*13013Sglenn.lagasse@oracle.com            save = self.getSpaceValue(be_space[cur_be]['space_used'], ddh)
142*13013Sglenn.lagasse@oracle.com            ibe = be_space[cur_be]['ibe']
143*13013Sglenn.lagasse@oracle.com            beout[ibe]['space_used'] = save
144*13013Sglenn.lagasse@oracle.com            #expand column if widest column entry
145*13013Sglenn.lagasse@oracle.com            if (spacecol != -1) and \
146*13013Sglenn.lagasse@oracle.com               (not ddh and len(save) + 1 > bemaxout[spacecol]):
147*13013Sglenn.lagasse@oracle.com                bemaxout[spacecol] = len(save) + 1
148*13013Sglenn.lagasse@oracle.com
149*13013Sglenn.lagasse@oracle.com        #print headers in columns
150*13013Sglenn.lagasse@oracle.com        if not ddh:
151*13013Sglenn.lagasse@oracle.com            for header in self.hdr:
152*13013Sglenn.lagasse@oracle.com                outstr = ''
153*13013Sglenn.lagasse@oracle.com                for icol in range(len(header)):
154*13013Sglenn.lagasse@oracle.com                    outstr += header[icol].ljust(bemaxout[icol])
155*13013Sglenn.lagasse@oracle.com                if outstr != '':
156*13013Sglenn.lagasse@oracle.com                    print outstr
157*13013Sglenn.lagasse@oracle.com
158*13013Sglenn.lagasse@oracle.com        #print collected output in columns
159*13013Sglenn.lagasse@oracle.com        outstr = ''
160*13013Sglenn.lagasse@oracle.com        prev_be = None
161*13013Sglenn.lagasse@oracle.com        cur_be = None
162*13013Sglenn.lagasse@oracle.com        for ibe in beout: #index output matrix
163*13013Sglenn.lagasse@oracle.com            if beoutname[ibe] != None:
164*13013Sglenn.lagasse@oracle.com                cur_be = beoutname[ibe]
165*13013Sglenn.lagasse@oracle.com            #find attributes for BE type
166*13013Sglenn.lagasse@oracle.com            curtype = None
167*13013Sglenn.lagasse@oracle.com            for att in ('orig_be_name', 'dataset', 'snap_name'):
168*13013Sglenn.lagasse@oracle.com                if att in beout[ibe]:
169*13013Sglenn.lagasse@oracle.com                    attrs = self.lattrs[att]
170*13013Sglenn.lagasse@oracle.com                    curtype = att
171*13013Sglenn.lagasse@oracle.com                    break
172*13013Sglenn.lagasse@oracle.com
173*13013Sglenn.lagasse@oracle.com            if curtype == None: #default to BE
174*13013Sglenn.lagasse@oracle.com                curtype = 'orig_be_name'
175*13013Sglenn.lagasse@oracle.com                if 'orig_be_name' in self.lattrs:
176*13013Sglenn.lagasse@oracle.com                    attrs = self.lattrs['orig_be_name']
177*13013Sglenn.lagasse@oracle.com                else: attrs = ()
178*13013Sglenn.lagasse@oracle.com
179*13013Sglenn.lagasse@oracle.com            if not ddh:
180*13013Sglenn.lagasse@oracle.com                if prev_be != cur_be and cur_be != None:
181*13013Sglenn.lagasse@oracle.com                    #for -d,-s,-a, print BE alone on line
182*13013Sglenn.lagasse@oracle.com                    if self.__class__.__name__ != 'BEList':
183*13013Sglenn.lagasse@oracle.com                        print cur_be
184*13013Sglenn.lagasse@oracle.com                    prev_be = cur_be
185*13013Sglenn.lagasse@oracle.com
186*13013Sglenn.lagasse@oracle.com            #print for one BE/snapshot/dataset
187*13013Sglenn.lagasse@oracle.com            icol = 0 #first column
188*13013Sglenn.lagasse@oracle.com
189*13013Sglenn.lagasse@oracle.com            #if this is a 'dataset' or 'snap_name', start line with BE
190*13013Sglenn.lagasse@oracle.com            #name token
191*13013Sglenn.lagasse@oracle.com            if ddh and curtype != 'orig_be_name':
192*13013Sglenn.lagasse@oracle.com                outstr = cur_be
193*13013Sglenn.lagasse@oracle.com
194*13013Sglenn.lagasse@oracle.com            for at in attrs: #for each attribute specified in table
195*13013Sglenn.lagasse@oracle.com                if ddh: #add separators for parsing
196*13013Sglenn.lagasse@oracle.com                    if outstr != '':
197*13013Sglenn.lagasse@oracle.com                        outstr += ';' #attribute separator
198*13013Sglenn.lagasse@oracle.com                    if at in beout[ibe] and beout[ibe][at] != '-' and \
199*13013Sglenn.lagasse@oracle.com                        beout[ibe][at] != '':
200*13013Sglenn.lagasse@oracle.com                        outstr += beout[ibe][at]
201*13013Sglenn.lagasse@oracle.com                else: #append text justified in column
202*13013Sglenn.lagasse@oracle.com                    if at in beout[ibe]:
203*13013Sglenn.lagasse@oracle.com                        outstr += beout[ibe][at].ljust(bemaxout[icol])
204*13013Sglenn.lagasse@oracle.com                icol += 1 #next column
205*13013Sglenn.lagasse@oracle.com
206*13013Sglenn.lagasse@oracle.com            if outstr != '':
207*13013Sglenn.lagasse@oracle.com                print outstr
208*13013Sglenn.lagasse@oracle.com            outstr = ''
209*13013Sglenn.lagasse@oracle.com
210*13013Sglenn.lagasse@oracle.com        return 0
211*13013Sglenn.lagasse@oracle.com
212*13013Sglenn.lagasse@oracle.com    def beMatch(self, be, be_name):
213*13013Sglenn.lagasse@oracle.com        """find match on user-specified BE."""
214*13013Sglenn.lagasse@oracle.com
215*13013Sglenn.lagasse@oracle.com        if 'orig_be_name' in be:
216*13013Sglenn.lagasse@oracle.com            return be.get('orig_be_name') == be_name
217*13013Sglenn.lagasse@oracle.com        if 'dataset' in be:
218*13013Sglenn.lagasse@oracle.com            if be.get('dataset') == be_name:
219*13013Sglenn.lagasse@oracle.com                return True
220*13013Sglenn.lagasse@oracle.com            out = be.get('dataset').split("/")
221*13013Sglenn.lagasse@oracle.com            return out[0] == be_name
222*13013Sglenn.lagasse@oracle.com        if 'snap_name' in be:
223*13013Sglenn.lagasse@oracle.com            if be.get('snap_name') == be_name:
224*13013Sglenn.lagasse@oracle.com                return True
225*13013Sglenn.lagasse@oracle.com            out = be.get('snap_name').split('@')
226*13013Sglenn.lagasse@oracle.com            if out[0] == be_name:
227*13013Sglenn.lagasse@oracle.com                return True
228*13013Sglenn.lagasse@oracle.com            out = be.get('snap_name').split('/')
229*13013Sglenn.lagasse@oracle.com            return out[0] == be_name
230*13013Sglenn.lagasse@oracle.com        return False
231*13013Sglenn.lagasse@oracle.com
232*13013Sglenn.lagasse@oracle.com    def getAttr(self, at, be, ddh, beobj):
233*13013Sglenn.lagasse@oracle.com        """
234*13013Sglenn.lagasse@oracle.com        Extract information by attribute and format for printing
235*13013Sglenn.lagasse@oracle.com        returns '?' if normally present attribute not found - error.
236*13013Sglenn.lagasse@oracle.com        """
237*13013Sglenn.lagasse@oracle.com        if at == 'blank':
238*13013Sglenn.lagasse@oracle.com            return ' '
239*13013Sglenn.lagasse@oracle.com        if at == 'dash':
240*13013Sglenn.lagasse@oracle.com            return '-'
241*13013Sglenn.lagasse@oracle.com        if at == 'orig_be_name':
242*13013Sglenn.lagasse@oracle.com            if at not in be:
243*13013Sglenn.lagasse@oracle.com                return '-'
244*13013Sglenn.lagasse@oracle.com            ret = be[at]
245*13013Sglenn.lagasse@oracle.com            if ddh or self.__class__.__name__ == 'BEList':
246*13013Sglenn.lagasse@oracle.com                return ret
247*13013Sglenn.lagasse@oracle.com            return '   ' + ret #indent
248*13013Sglenn.lagasse@oracle.com        if at == 'snap_name':
249*13013Sglenn.lagasse@oracle.com            if at not in be:
250*13013Sglenn.lagasse@oracle.com                return '-'
251*13013Sglenn.lagasse@oracle.com            if self.__class__.__name__ == 'CompleteList':
252*13013Sglenn.lagasse@oracle.com                ret = self.prependRootDS(be[at], beobj)
253*13013Sglenn.lagasse@oracle.com            else:
254*13013Sglenn.lagasse@oracle.com                ret = be[at]
255*13013Sglenn.lagasse@oracle.com            if ddh:
256*13013Sglenn.lagasse@oracle.com                return ret
257*13013Sglenn.lagasse@oracle.com            return '   ' + ret #indent
258*13013Sglenn.lagasse@oracle.com        if at == 'dataset':
259*13013Sglenn.lagasse@oracle.com            if at not in be:
260*13013Sglenn.lagasse@oracle.com                return '-'
261*13013Sglenn.lagasse@oracle.com            if self.__class__.__name__ == 'DatasetList' or \
262*13013Sglenn.lagasse@oracle.com               self.__class__.__name__ == 'CompleteList':
263*13013Sglenn.lagasse@oracle.com                ret = self.prependRootDS(be[at], beobj)
264*13013Sglenn.lagasse@oracle.com            else:
265*13013Sglenn.lagasse@oracle.com                ret = be[at]
266*13013Sglenn.lagasse@oracle.com            if ddh:
267*13013Sglenn.lagasse@oracle.com                return ret
268*13013Sglenn.lagasse@oracle.com            return '   ' + ret #indent
269*13013Sglenn.lagasse@oracle.com        if at == 'active':
270*13013Sglenn.lagasse@oracle.com            if at not in be:
271*13013Sglenn.lagasse@oracle.com                return '-'
272*13013Sglenn.lagasse@oracle.com            ret = ''
273*13013Sglenn.lagasse@oracle.com            if 'active' in be and be['active']:
274*13013Sglenn.lagasse@oracle.com                ret += 'N'
275*13013Sglenn.lagasse@oracle.com            if 'active_boot' in be and be['active_boot']:
276*13013Sglenn.lagasse@oracle.com                ret += 'R'
277*13013Sglenn.lagasse@oracle.com            if ret == '':
278*13013Sglenn.lagasse@oracle.com                return '-'
279*13013Sglenn.lagasse@oracle.com            return ret
280*13013Sglenn.lagasse@oracle.com        if at == 'mountpoint':
281*13013Sglenn.lagasse@oracle.com            if at not in be:
282*13013Sglenn.lagasse@oracle.com                return '-'
283*13013Sglenn.lagasse@oracle.com            if 'mounted' not in be or not be['mounted']:
284*13013Sglenn.lagasse@oracle.com                return '-'
285*13013Sglenn.lagasse@oracle.com            return be[at]
286*13013Sglenn.lagasse@oracle.com        if at == 'space_used':
287*13013Sglenn.lagasse@oracle.com            if at not in be:
288*13013Sglenn.lagasse@oracle.com                return '0'
289*13013Sglenn.lagasse@oracle.com            return self.getSpaceValue(be[at], ddh)
290*13013Sglenn.lagasse@oracle.com        if at == 'mounted':
291*13013Sglenn.lagasse@oracle.com            if at not in be:
292*13013Sglenn.lagasse@oracle.com                return '-'
293*13013Sglenn.lagasse@oracle.com            return be[at]
294*13013Sglenn.lagasse@oracle.com        if at == 'date':
295*13013Sglenn.lagasse@oracle.com            if at not in be:
296*13013Sglenn.lagasse@oracle.com                return '?'
297*13013Sglenn.lagasse@oracle.com            if ddh:
298*13013Sglenn.lagasse@oracle.com                return str(be[at]) #timestamp in seconds
299*13013Sglenn.lagasse@oracle.com            sec = str(datetime.datetime.fromtimestamp(be[at]))
300*13013Sglenn.lagasse@oracle.com            return sec[0:len(sec)-3] #trim seconds
301*13013Sglenn.lagasse@oracle.com        if at == 'policy':
302*13013Sglenn.lagasse@oracle.com            if at not in be:
303*13013Sglenn.lagasse@oracle.com                return '?'
304*13013Sglenn.lagasse@oracle.com            return be[at]
305*13013Sglenn.lagasse@oracle.com        if at == 'root_ds':
306*13013Sglenn.lagasse@oracle.com            if at not in be:
307*13013Sglenn.lagasse@oracle.com                return '?'
308*13013Sglenn.lagasse@oracle.com            if ddh or self.__class__.__name__ == 'BEList':
309*13013Sglenn.lagasse@oracle.com                return be[at]
310*13013Sglenn.lagasse@oracle.com            return '   ' + be[at]
311*13013Sglenn.lagasse@oracle.com        if at == 'uuid_str':
312*13013Sglenn.lagasse@oracle.com            if at not in be:
313*13013Sglenn.lagasse@oracle.com                return '-'
314*13013Sglenn.lagasse@oracle.com            return be[at]
315*13013Sglenn.lagasse@oracle.com        #default case - no match on attribute
316*13013Sglenn.lagasse@oracle.com        return be[at]
317*13013Sglenn.lagasse@oracle.com
318*13013Sglenn.lagasse@oracle.com    def getSpaceValue(self, num, ddh):
319*13013Sglenn.lagasse@oracle.com        """Readable formatting for disk space size."""
320*13013Sglenn.lagasse@oracle.com
321*13013Sglenn.lagasse@oracle.com        if ddh:
322*13013Sglenn.lagasse@oracle.com            return str(num) #return size in bytes as string
323*13013Sglenn.lagasse@oracle.com
324*13013Sglenn.lagasse@oracle.com        kilo = 1024.0
325*13013Sglenn.lagasse@oracle.com        mega = 1048576.0
326*13013Sglenn.lagasse@oracle.com        giga = 1073741824.0
327*13013Sglenn.lagasse@oracle.com        tera = 1099511627776.0
328*13013Sglenn.lagasse@oracle.com
329*13013Sglenn.lagasse@oracle.com        if num == None:
330*13013Sglenn.lagasse@oracle.com            return '0'
331*13013Sglenn.lagasse@oracle.com        if num < kilo:
332*13013Sglenn.lagasse@oracle.com            return str(num) + 'B'
333*13013Sglenn.lagasse@oracle.com        if num < mega:
334*13013Sglenn.lagasse@oracle.com            return str('%.1f' % (num / kilo)) + 'K'
335*13013Sglenn.lagasse@oracle.com        if num < giga:
336*13013Sglenn.lagasse@oracle.com            return str('%.2f' % (num / mega)) + 'M'
337*13013Sglenn.lagasse@oracle.com        if num < tera:
338*13013Sglenn.lagasse@oracle.com            return str('%.2f' % (num / giga)) + 'G'
339*13013Sglenn.lagasse@oracle.com        return str('%.2f' % (num / tera)) + 'T'
340*13013Sglenn.lagasse@oracle.com
341*13013Sglenn.lagasse@oracle.com    def prependRootDS(self, val, beobj):
342*13013Sglenn.lagasse@oracle.com        """Prepend root dataset name with BE name stripped."""
343*13013Sglenn.lagasse@oracle.com
344*13013Sglenn.lagasse@oracle.com        root_ds = beobj.get('root_ds')
345*13013Sglenn.lagasse@oracle.com        return root_ds[0:root_ds.rfind('/')+1] + val
346*13013Sglenn.lagasse@oracle.com
347*13013Sglenn.lagasse@oracle.com
348*13013Sglenn.lagasse@oracle.com"""Top level "beadm list" derived classes defined here.
349*13013Sglenn.lagasse@oracle.com        Only table definition is done here - all methods are in the base class.
350*13013Sglenn.lagasse@oracle.com        Tables driving list:
351*13013Sglenn.lagasse@oracle.com                hdr - list of text to output for each column
352*13013Sglenn.lagasse@oracle.com                lattrs - dictionary of attributes
353*13013Sglenn.lagasse@oracle.com                        Each entry specifies either BE, dataset, snapshot with
354*13013Sglenn.lagasse@oracle.com                        an attribute key:
355*13013Sglenn.lagasse@oracle.com                                orig_be_name - for BEs
356*13013Sglenn.lagasse@oracle.com                                dataset - for datasets
357*13013Sglenn.lagasse@oracle.com                                snap_name - for snapshots
358*13013Sglenn.lagasse@oracle.com                        Each list item in entry indicates specific datum for
359*13013Sglenn.lagasse@oracle.com                        column
360*13013Sglenn.lagasse@oracle.com                Number of hdr columns must equal number of lattrs entries
361*13013Sglenn.lagasse@oracle.com                        unless ddh (dontDisplayHeaders) is true.
362*13013Sglenn.lagasse@oracle.com"""
363*13013Sglenn.lagasse@oracle.comclass BEList(listBootEnvironment):
364*13013Sglenn.lagasse@oracle.com    """specify header and attribute information for BE-only output"""
365*13013Sglenn.lagasse@oracle.com
366*13013Sglenn.lagasse@oracle.com    def __init__(self, ddh):
367*13013Sglenn.lagasse@oracle.com        """Init function for the class."""
368*13013Sglenn.lagasse@oracle.com        self.hdr = \
369*13013Sglenn.lagasse@oracle.com            ('BE','Active','Mountpoint','Space','Policy','Created'), \
370*13013Sglenn.lagasse@oracle.com            ('--','------','----------','-----','------','-------')
371*13013Sglenn.lagasse@oracle.com        if ddh:
372*13013Sglenn.lagasse@oracle.com            self.lattrs = {'orig_be_name':('orig_be_name', 'uuid_str',
373*13013Sglenn.lagasse@oracle.com                           'active', 'mountpoint', 'space_used', 'policy',
374*13013Sglenn.lagasse@oracle.com                           'date')}
375*13013Sglenn.lagasse@oracle.com        else:
376*13013Sglenn.lagasse@oracle.com            self.lattrs = {'orig_be_name':('orig_be_name', 'active',
377*13013Sglenn.lagasse@oracle.com                           'mountpoint', 'space_used', 'policy', 'date')}
378*13013Sglenn.lagasse@oracle.com
379*13013Sglenn.lagasse@oracle.comclass DatasetList(listBootEnvironment):
380*13013Sglenn.lagasse@oracle.com    """
381*13013Sglenn.lagasse@oracle.com    specify header and attribute information for dataset output,
382*13013Sglenn.lagasse@oracle.com    -d option
383*13013Sglenn.lagasse@oracle.com    """
384*13013Sglenn.lagasse@oracle.com    def __init__(self, ddh):
385*13013Sglenn.lagasse@oracle.com        """Init function for the class."""
386*13013Sglenn.lagasse@oracle.com
387*13013Sglenn.lagasse@oracle.com        self.hdr = \
388*13013Sglenn.lagasse@oracle.com            ('BE/Dataset','Active','Mountpoint','Space','Policy','Created'), \
389*13013Sglenn.lagasse@oracle.com            ('----------','------','----------','-----','------','-------')
390*13013Sglenn.lagasse@oracle.com        if ddh:
391*13013Sglenn.lagasse@oracle.com            self.lattrs = { \
392*13013Sglenn.lagasse@oracle.com                'orig_be_name':('orig_be_name', 'root_ds', 'active',
393*13013Sglenn.lagasse@oracle.com                'mountpoint', 'space_used', 'policy', 'date'), \
394*13013Sglenn.lagasse@oracle.com                'dataset':('dataset', 'dash', 'mountpoint', 'space_used',
395*13013Sglenn.lagasse@oracle.com                'policy', 'date')}
396*13013Sglenn.lagasse@oracle.com        else:
397*13013Sglenn.lagasse@oracle.com            self.lattrs = { \
398*13013Sglenn.lagasse@oracle.com                'orig_be_name':('root_ds', 'active', 'mountpoint',
399*13013Sglenn.lagasse@oracle.com                'space_used', 'policy', 'date'), \
400*13013Sglenn.lagasse@oracle.com                'dataset':('dataset', 'dash', 'mountpoint', 'space_used',
401*13013Sglenn.lagasse@oracle.com                'policy', 'date')}
402*13013Sglenn.lagasse@oracle.com
403*13013Sglenn.lagasse@oracle.comclass SnapshotList(listBootEnvironment):
404*13013Sglenn.lagasse@oracle.com    """
405*13013Sglenn.lagasse@oracle.com    specify header and attribute information for snapshot output,
406*13013Sglenn.lagasse@oracle.com    -s option
407*13013Sglenn.lagasse@oracle.com    """
408*13013Sglenn.lagasse@oracle.com    def __init__(self, ddh):
409*13013Sglenn.lagasse@oracle.com        """Init function for the class."""
410*13013Sglenn.lagasse@oracle.com
411*13013Sglenn.lagasse@oracle.com        self.hdr = \
412*13013Sglenn.lagasse@oracle.com            ('BE/Snapshot','Space','Policy','Created'), \
413*13013Sglenn.lagasse@oracle.com            ('-----------','-----','------','-------')
414*13013Sglenn.lagasse@oracle.com        self.lattrs = {'snap_name':('snap_name', 'space_used', 'policy',
415*13013Sglenn.lagasse@oracle.com                                    'date')}
416*13013Sglenn.lagasse@oracle.com
417*13013Sglenn.lagasse@oracle.comclass CompleteList(listBootEnvironment):
418*13013Sglenn.lagasse@oracle.com    """
419*13013Sglenn.lagasse@oracle.com    specify header and attribute information for BE and/or dataset and/or
420*13013Sglenn.lagasse@oracle.com    snapshot output,
421*13013Sglenn.lagasse@oracle.com    -a or -ds options
422*13013Sglenn.lagasse@oracle.com    """
423*13013Sglenn.lagasse@oracle.com    def __init__(self, ddh):
424*13013Sglenn.lagasse@oracle.com        """Init function for the class."""
425*13013Sglenn.lagasse@oracle.com
426*13013Sglenn.lagasse@oracle.com        self.hdr = \
427*13013Sglenn.lagasse@oracle.com    ('BE/Dataset/Snapshot','Active','Mountpoint','Space','Policy','Created'), \
428*13013Sglenn.lagasse@oracle.com    ('-------------------','------','----------','-----','------','-------')
429*13013Sglenn.lagasse@oracle.com        if ddh:
430*13013Sglenn.lagasse@oracle.com            self.lattrs = { \
431*13013Sglenn.lagasse@oracle.com                'orig_be_name':('orig_be_name', 'root_ds', 'active',
432*13013Sglenn.lagasse@oracle.com                'mountpoint', 'space_used', 'policy', 'date'),
433*13013Sglenn.lagasse@oracle.com                'dataset':('dataset', 'dash', 'mountpoint', 'space_used',
434*13013Sglenn.lagasse@oracle.com                'policy', 'date'),
435*13013Sglenn.lagasse@oracle.com                'snap_name':('snap_name', 'dash', 'dash', 'space_used',
436*13013Sglenn.lagasse@oracle.com                'policy', 'date')}
437*13013Sglenn.lagasse@oracle.com        else:
438*13013Sglenn.lagasse@oracle.com            self.lattrs = { \
439*13013Sglenn.lagasse@oracle.com                'orig_be_name':('root_ds', 'active', 'mountpoint',
440*13013Sglenn.lagasse@oracle.com                                'space_used', 'policy', 'date'), \
441*13013Sglenn.lagasse@oracle.com                'dataset':('dataset', 'dash', 'mountpoint', 'space_used',
442*13013Sglenn.lagasse@oracle.com                'policy', 'date'),
443*13013Sglenn.lagasse@oracle.com                'snap_name':('snap_name', 'dash', 'dash', 'space_used',
444*13013Sglenn.lagasse@oracle.com                'policy', 'date')}
445