Revision 0db22eac image_creator/disk.py

b/image_creator/disk.py
10 10
import re
11 11
import sys
12 12
import guestfs
13
import time
13 14

  
14 15

  
15 16
class DiskError(Exception):
......
78 79
        # Take a snapshot and return it to the user
79 80
        size = blockdev('--getsize', sourcedev)
80 81
        cowfd, cow = tempfile.mkstemp()
82
        os.close(cowfd)
81 83
        self._add_cleanup(os.unlink, cow)
82 84
        # Create 1G cow sparse file
83 85
        dd('if=/dev/null', 'of=%s' % cow, 'bs=1k', 'seek=%d' % (1024 * 1024))
......
92 94
            self._add_cleanup(dmsetup, 'remove', snapshot)
93 95
        finally:
94 96
            os.unlink(table)
95

  
96 97
        new_device = DiskDevice("/dev/mapper/%s" % snapshot)
97 98
        self._devices.append(new_device)
99
        new_device.enable()
98 100
        return new_device
99 101

  
100 102
    def destroy_device(self, device):
......
105 107
        device.destroy()
106 108

  
107 109

  
108
def progress_generator(total):
110
def progress_generator(label=''):
109 111
    position = 0;
110
    for i in progress.bar(range(total)):
112
    for i in progress.bar(range(100),''):
111 113
        if i < position:
112 114
            continue
113 115
        position = yield
......
121 123

  
122 124
    def __init__(self, device, bootable=True):
123 125
        """Create a new DiskDevice."""
126

  
124 127
        self.device = device
125 128
        self.bootable = bootable
126 129
        self.progress_bar = None
127 130

  
128 131
        self.g = guestfs.GuestFS()
129
        self.g.add_drive_opts(device, readonly=0)
132
        self.g.add_drive_opts(self.device, readonly=0)
130 133

  
131 134
        #self.g.set_trace(1)
132 135
        #self.g.set_verbose(1)
133 136

  
137
        self.guestfs_enabled = False
138
    
139
    def enable(self):
140
        """Enable a newly created DiskDevice"""
141

  
142
        self.progressbar = progress_generator()
143
        self.progressbar.next()
134 144
        eh = self.g.set_event_callback(self.progress_callback, guestfs.EVENT_PROGRESS)
135 145
        self.g.launch()
146
        self.guestfs_enabled = True
136 147
        self.g.delete_event_callback(eh)
148
        if self.progressbar is not None:
149
            self.progressbar.send(100)
150
            self.progressbar = None
137 151
        
138 152
        roots = self.g.inspect_os()
139 153
        if len(roots) == 0:
......
147 161

  
148 162
    def destroy(self):
149 163
        """Destroy this DiskDevice instance."""
150
        self.g.umount_all()
151
        self.g.sync()
152
        # Close the guestfs handler
164

  
165
        if self.guestfs_enabled:
166
            self.g.umount_all()
167
            self.g.sync()
168

  
169
        # Close the guestfs handler if open
153 170
        self.g.close()
154 171

  
155 172
    def progress_callback(self, ev, eh, buf, array):
156 173
        position = array[2]
157 174
        total = array[3]
158
        
159
        if self.progress_bar is None:
160
            self.progress_bar = progress_generator(total)
161
            self.progress_bar.next()
162 175

  
163
        self.progress_bar.send(position)
176
        assert self.progress_bar is not None
177

  
178
        self.progress_bar.send((position * 100)//total)
164 179

  
165 180
        if position == total:
166 181
            self.progress_bar = None

Also available in: Unified diff