Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
storagedriver
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
2
Merge Requests
4
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
b171f0a4
authored
5 years ago
by
Bálint Máhonfai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix indentation errors
parent
63579fd2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
137 additions
and
144 deletions
+137
-144
disk.py
+137
-144
No files found.
disk.py
View file @
b171f0a4
...
...
@@ -299,121 +299,74 @@ class Disk(object):
finally
:
os
.
unlink
(
exported_path
)
def
extract_iso_from_zip
(
self
,
disk_path
):
with
ZipFile
(
disk_path
,
'r'
)
as
z
:
isos
=
z
.
namelist
()
if
len
(
isos
)
!=
1
:
isos
=
[
i
for
i
in
isos
if
i
.
lower
()
.
endswith
(
'.iso'
)]
if
len
(
isos
)
==
1
:
logger
.
info
(
'Unzipping
%
s started.'
,
disk_path
)
f
=
open
(
disk_path
+
'~'
,
'wb'
)
zf
=
z
.
open
(
isos
[
0
])
with
zf
,
f
:
copyfileobj
(
zf
,
f
)
f
.
flush
()
move
(
disk_path
+
'~'
,
disk_path
)
def
extract_iso_from_zip
(
self
,
disk_path
):
with
ZipFile
(
disk_path
,
'r'
)
as
z
:
isos
=
z
.
namelist
()
if
len
(
isos
)
!=
1
:
isos
=
[
i
for
i
in
isos
if
i
.
lower
()
.
endswith
(
'.iso'
)]
if
len
(
isos
)
==
1
:
logger
.
info
(
'Unzipping
%
s started.'
,
disk_path
)
f
=
open
(
disk_path
+
'~'
,
'wb'
)
zf
=
z
.
open
(
isos
[
0
])
with
zf
,
f
:
copyfileobj
(
zf
,
f
)
f
.
flush
()
move
(
disk_path
+
'~'
,
disk_path
)
else
:
logger
.
info
(
"Extracting
%
s failed, keeping original."
,
disk_path
)
def
snapshot
(
self
):
""" Creating qcow2 snapshot with base image.
"""
# Check if snapshot type and qcow2 format matchmatch
if
self
.
type
!=
'snapshot'
:
raise
Exception
(
'Invalid type:
%
s'
%
self
.
type
)
# Check if file already exists
if
os
.
path
.
isfile
(
self
.
get_path
()):
raise
Exception
(
'File already exists:
%
s'
%
self
.
get_path
())
# Check if base file exist
if
not
os
.
path
.
isfile
(
self
.
get_base
()):
raise
Exception
(
'Image Base does not exists:
%
s'
%
self
.
get_base
())
# Build list of Strings as command parameters
if
self
.
format
==
'iso'
:
os
.
symlink
(
self
.
get_base
(),
self
.
get_path
())
elif
self
.
format
==
'raw'
:
raise
NotImplemented
()
else
:
logger
.
info
(
"Extracting
%
s failed, keeping original."
,
disk_path
)
def
snapshot
(
self
):
""" Creating qcow2 snapshot with base image.
"""
# Check if snapshot type and qcow2 format matchmatch
if
self
.
type
!=
'snapshot'
:
raise
Exception
(
'Invalid type:
%
s'
%
self
.
type
)
# Check if file already exists
if
os
.
path
.
isfile
(
self
.
get_path
()):
raise
Exception
(
'File already exists:
%
s'
%
self
.
get_path
())
# Check if base file exist
if
not
os
.
path
.
isfile
(
self
.
get_base
()):
raise
Exception
(
'Image Base does not exists:
%
s'
%
self
.
get_base
())
# Build list of Strings as command parameters
if
self
.
format
==
'iso'
:
os
.
symlink
(
self
.
get_base
(),
self
.
get_path
())
elif
self
.
format
==
'raw'
:
raise
NotImplemented
()
else
:
cmdline
=
[
'qemu-img'
,
'create'
,
'-b'
,
self
.
get_base
(),
'-f'
,
self
.
format
,
self
.
get_path
()]
# Call subprocess
subprocess
.
check_output
(
cmdline
)
def
merge_disk_with_base
(
self
,
task
,
new_disk
,
parent_id
=
None
):
proc
=
None
try
:
cmdline
=
[
'qemu-img'
,
'convert'
,
self
.
get_path
(),
'-O'
,
new_disk
.
format
,
new_disk
.
get_path
()]
# Call subprocess
logger
.
debug
(
"Merging
%
s into
%
s."
,
self
.
get_path
(),
new_disk
.
get_path
())
percent
=
0
diff_disk
=
Disk
.
get
(
self
.
dir
,
self
.
name
)
base_disk
=
Disk
.
get
(
self
.
dir
,
self
.
base_name
)
clen
=
min
(
base_disk
.
actual_size
+
diff_disk
.
actual_size
,
diff_disk
.
size
)
output
=
new_disk
.
get_path
()
proc
=
subprocess
.
Popen
(
cmdline
)
while
True
:
if
proc
.
poll
()
is
not
None
:
break
try
:
actsize
=
os
.
path
.
getsize
(
output
)
except
OSError
:
actsize
=
0
new_percent
=
min
(
100
,
round
(
actsize
*
100.0
/
clen
))
if
new_percent
>
percent
:
percent
=
new_percent
if
not
task
.
is_aborted
():
task
.
update_state
(
task_id
=
parent_id
,
state
=
task
.
AsyncResult
(
parent_id
)
.
state
,
meta
=
{
'size'
:
actsize
,
'percent'
:
percent
})
else
:
logger
.
warning
(
"Merging new disk
%
s is aborted by user."
,
new_disk
.
get_path
())
raise
AbortException
()
sleep
(
1
)
except
AbortException
:
proc
.
terminate
()
logger
.
warning
(
"Aborted merge job, removing
%
s"
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
except
:
if
proc
:
proc
.
terminate
()
logger
.
exception
(
"Unknown error occured, removing
%
s "
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
raise
def
merge_disk_without_base
(
self
,
task
,
new_disk
,
parent_id
=
None
,
length
=
1024
*
1024
):
try
:
fsrc
=
open
(
self
.
get_path
(),
'rb'
)
fdst
=
open
(
new_disk
.
get_path
(),
'wb'
)
clen
=
self
.
size
actsize
=
0
percent
=
0
with
fsrc
,
fdst
:
cmdline
=
[
'qemu-img'
,
'create'
,
'-b'
,
self
.
get_base
(),
'-f'
,
self
.
format
,
self
.
get_path
()]
# Call subprocess
subprocess
.
check_output
(
cmdline
)
def
merge_disk_with_base
(
self
,
task
,
new_disk
,
parent_id
=
None
):
proc
=
None
try
:
cmdline
=
[
'qemu-img'
,
'convert'
,
self
.
get_path
(),
'-O'
,
new_disk
.
format
,
new_disk
.
get_path
()]
# Call subprocess
logger
.
debug
(
"Merging
%
s into
%
s."
,
self
.
get_path
(),
new_disk
.
get_path
())
percent
=
0
diff_disk
=
Disk
.
get
(
self
.
dir
,
self
.
name
)
base_disk
=
Disk
.
get
(
self
.
dir
,
self
.
base_name
)
clen
=
min
(
base_disk
.
actual_size
+
diff_disk
.
actual_size
,
diff_disk
.
size
)
output
=
new_disk
.
get_path
()
proc
=
subprocess
.
Popen
(
cmdline
)
while
True
:
buf
=
fsrc
.
read
(
length
)
if
not
buf
:
if
proc
.
poll
()
is
not
None
:
break
fdst
.
write
(
buf
)
actsize
+=
len
(
buf
)
try
:
actsize
=
os
.
path
.
getsize
(
output
)
except
OSError
:
actsize
=
0
new_percent
=
min
(
100
,
round
(
actsize
*
100.0
/
clen
))
if
new_percent
>
percent
:
percent
=
new_percent
...
...
@@ -427,42 +380,82 @@ def merge_disk_without_base(self, task, new_disk, parent_id=None,
"Merging new disk
%
s is aborted by user."
,
new_disk
.
get_path
())
raise
AbortException
()
except
AbortException
:
logger
.
warning
(
"Aborted remove
%
s"
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
except
:
logger
.
exception
(
"Unknown error occured removing
%
s "
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
raise
def
merge
(
self
,
task
,
new_disk
,
parent_id
=
None
):
""" Merging a new_disk from the actual disk and its base.
"""
sleep
(
1
)
except
AbortException
:
proc
.
terminate
()
logger
.
warning
(
"Aborted merge job, removing
%
s"
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
if
task
.
is_aborted
():
raise
AbortException
()
except
:
if
proc
:
proc
.
terminate
()
logger
.
exception
(
"Unknown error occured, removing
%
s "
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
raise
def
merge_disk_without_base
(
self
,
task
,
new_disk
,
parent_id
=
None
,
length
=
1024
*
1024
):
try
:
fsrc
=
open
(
self
.
get_path
(),
'rb'
)
fdst
=
open
(
new_disk
.
get_path
(),
'wb'
)
clen
=
self
.
size
actsize
=
0
percent
=
0
with
fsrc
,
fdst
:
while
True
:
buf
=
fsrc
.
read
(
length
)
if
not
buf
:
break
fdst
.
write
(
buf
)
actsize
+=
len
(
buf
)
new_percent
=
min
(
100
,
round
(
actsize
*
100.0
/
clen
))
if
new_percent
>
percent
:
percent
=
new_percent
if
not
task
.
is_aborted
():
task
.
update_state
(
task_id
=
parent_id
,
state
=
task
.
AsyncResult
(
parent_id
)
.
state
,
meta
=
{
'size'
:
actsize
,
'percent'
:
percent
})
else
:
logger
.
warning
(
"Merging new disk
%
s is aborted by user."
,
new_disk
.
get_path
())
raise
AbortException
()
except
AbortException
:
logger
.
warning
(
"Aborted remove
%
s"
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
except
:
logger
.
exception
(
"Unknown error occured removing
%
s "
,
new_disk
.
get_path
())
os
.
unlink
(
new_disk
.
get_path
())
raise
# Check if file already exists
if
os
.
path
.
isfile
(
new_disk
.
get_path
()):
raise
Exception
(
'File already exists:
%
s'
%
self
.
get_path
())
def
merge
(
self
,
task
,
new_disk
,
parent_id
=
None
):
""" Merging a new_disk from the actual disk and its base.
"""
if
self
.
format
==
"iso"
:
os
.
symlink
(
self
.
get_path
(),
new_disk
.
get_path
())
elif
self
.
base_name
:
self
.
merge_disk_with_base
(
task
,
new_disk
,
parent_id
)
else
:
self
.
merge_disk_without_base
(
task
,
new_disk
,
parent_id
)
if
task
.
is_aborted
():
raise
AbortException
()
# Check if file already exists
if
os
.
path
.
isfile
(
new_disk
.
get_path
()):
raise
Exception
(
'File already exists:
%
s'
%
self
.
get_path
())
def
delete
(
self
):
""" Delete file. """
if
os
.
path
.
isfile
(
self
.
get_path
()):
os
.
unlink
(
self
.
get_path
())
if
self
.
format
==
"iso"
:
os
.
symlink
(
self
.
get_path
(),
new_disk
.
get_path
())
elif
self
.
base_name
:
self
.
merge_disk_with_base
(
task
,
new_disk
,
parent_id
)
else
:
self
.
merge_disk_without_base
(
task
,
new_disk
,
parent_id
)
def
delete
(
self
):
""" Delete file. """
if
os
.
path
.
isfile
(
self
.
get_path
()):
os
.
unlink
(
self
.
get_path
())
@classmethod
def
list
(
cls
,
dir
):
""" List all files in <dir> directory."""
return
[
cls
.
get
(
dir
,
file
)
for
file
in
os
.
listdir
(
dir
)]
@classmethod
def
list
(
cls
,
dir
):
""" List all files in <dir> directory."""
return
[
cls
.
get
(
dir
,
file
)
for
file
in
os
.
listdir
(
dir
)]
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment