Statistics
| Branch: | Tag: | Revision:

root / image_creator / kamaki_wrapper.py @ b1395967

History | View | Annotate | Download (4 kB)

1 40e7a487 Nikos Skalkotos
# Copyright 2012 GRNET S.A. All rights reserved.
2 40e7a487 Nikos Skalkotos
#
3 40e7a487 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or
4 40e7a487 Nikos Skalkotos
# without modification, are permitted provided that the following
5 40e7a487 Nikos Skalkotos
# conditions are met:
6 40e7a487 Nikos Skalkotos
#
7 40e7a487 Nikos Skalkotos
#   1. Redistributions of source code must retain the above
8 40e7a487 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
9 40e7a487 Nikos Skalkotos
#      disclaimer.
10 40e7a487 Nikos Skalkotos
#
11 40e7a487 Nikos Skalkotos
#   2. Redistributions in binary form must reproduce the above
12 40e7a487 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
13 40e7a487 Nikos Skalkotos
#      disclaimer in the documentation and/or other materials
14 40e7a487 Nikos Skalkotos
#      provided with the distribution.
15 40e7a487 Nikos Skalkotos
#
16 40e7a487 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 40e7a487 Nikos Skalkotos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 40e7a487 Nikos Skalkotos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 40e7a487 Nikos Skalkotos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 40e7a487 Nikos Skalkotos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 40e7a487 Nikos Skalkotos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 40e7a487 Nikos Skalkotos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 40e7a487 Nikos Skalkotos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 40e7a487 Nikos Skalkotos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 40e7a487 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 40e7a487 Nikos Skalkotos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 40e7a487 Nikos Skalkotos
# POSSIBILITY OF SUCH DAMAGE.
28 40e7a487 Nikos Skalkotos
#
29 40e7a487 Nikos Skalkotos
# The views and conclusions contained in the software and
30 40e7a487 Nikos Skalkotos
# documentation are those of the authors and should not be
31 40e7a487 Nikos Skalkotos
# interpreted as representing official policies, either expressed
32 40e7a487 Nikos Skalkotos
# or implied, of GRNET S.A.
33 40e7a487 Nikos Skalkotos
34 40e7a487 Nikos Skalkotos
from os.path import basename
35 40e7a487 Nikos Skalkotos
36 40e7a487 Nikos Skalkotos
from kamaki.config import Config
37 997ac76a Nikos Skalkotos
from kamaki.clients import ClientError
38 40e7a487 Nikos Skalkotos
from kamaki.clients.image import ImageClient
39 997ac76a Nikos Skalkotos
from kamaki.clients.pithos import PithosClient
40 b1395967 Nikos Skalkotos
from progress.bar import Bar
41 40e7a487 Nikos Skalkotos
42 b1395967 Nikos Skalkotos
from image_creator.util import FatalError, output, success
43 40e7a487 Nikos Skalkotos
44 40e7a487 Nikos Skalkotos
CONTAINER = "images"
45 40e7a487 Nikos Skalkotos
46 40e7a487 Nikos Skalkotos
47 b1395967 Nikos Skalkotos
def progress(message):
48 b1395967 Nikos Skalkotos
49 b1395967 Nikos Skalkotos
    MSG_LENGTH = 30
50 b1395967 Nikos Skalkotos
51 b1395967 Nikos Skalkotos
    def progress_gen(n):
52 b1395967 Nikos Skalkotos
        msg = "%s:" % message
53 b1395967 Nikos Skalkotos
54 b1395967 Nikos Skalkotos
        progressbar = Bar(msg.ljust(MSG_LENGTH))
55 b1395967 Nikos Skalkotos
        progressbar.max = n
56 b1395967 Nikos Skalkotos
        for _ in range(n):
57 b1395967 Nikos Skalkotos
            yield
58 b1395967 Nikos Skalkotos
            progressbar.next()
59 b1395967 Nikos Skalkotos
        output("\r%s...\033[K" % message, False)
60 b1395967 Nikos Skalkotos
        success("done")
61 b1395967 Nikos Skalkotos
        yield
62 b1395967 Nikos Skalkotos
    return progress_gen
63 b1395967 Nikos Skalkotos
64 40e7a487 Nikos Skalkotos
class Kamaki:
65 997ac76a Nikos Skalkotos
    def __init__(self, account, token):
66 997ac76a Nikos Skalkotos
        self.account = account
67 40e7a487 Nikos Skalkotos
        self.token = token
68 40e7a487 Nikos Skalkotos
69 40e7a487 Nikos Skalkotos
        config = Config()
70 40e7a487 Nikos Skalkotos
71 40e7a487 Nikos Skalkotos
        pithos_url = config.get('storage', 'url')
72 40e7a487 Nikos Skalkotos
        self.container = CONTAINER
73 40e7a487 Nikos Skalkotos
        self.pithos_client = PithosClient(pithos_url, token, self.account,
74 40e7a487 Nikos Skalkotos
                                                                self.container)
75 40e7a487 Nikos Skalkotos
76 40e7a487 Nikos Skalkotos
        image_url = config.get('image', 'url')
77 40e7a487 Nikos Skalkotos
        self.image_client = ImageClient(image_url, token)
78 40e7a487 Nikos Skalkotos
79 40e7a487 Nikos Skalkotos
        self.uploaded_object = None
80 40e7a487 Nikos Skalkotos
81 b1395967 Nikos Skalkotos
    def upload(self, file_obj, size=None, remote_path=None, hp=None, up=None):
82 40e7a487 Nikos Skalkotos
83 40e7a487 Nikos Skalkotos
        if remote_path is None:
84 40e7a487 Nikos Skalkotos
            remote_path = basename(filename)
85 40e7a487 Nikos Skalkotos
86 b1395967 Nikos Skalkotos
        try:
87 b1395967 Nikos Skalkotos
            self.pithos_client.create_container(self.container)
88 b1395967 Nikos Skalkotos
        except ClientError as e:
89 b1395967 Nikos Skalkotos
            if e.status != 202:  # Ignore container already exists errors
90 997ac76a Nikos Skalkotos
                raise FatalError("Pithos client: %d %s" % \
91 b1395967 Nikos Skalkotos
                                                    (e.status, e.message))
92 b1395967 Nikos Skalkotos
        try:
93 b1395967 Nikos Skalkotos
            hash_cb = progress(hp) if hp is not None else None
94 b1395967 Nikos Skalkotos
            upload_cb = progress(up) if up is not None else None
95 b1395967 Nikos Skalkotos
            self.pithos_client.create_object(remote_path, file_obj, size,
96 b1395967 Nikos Skalkotos
                                                            hash_cb, upload_cb)
97 b1395967 Nikos Skalkotos
            return "pithos://%s/%s/%s" % \
98 b1395967 Nikos Skalkotos
                            (self.account, self.container, remote_path)
99 b1395967 Nikos Skalkotos
        except ClientError as e:
100 b1395967 Nikos Skalkotos
            raise FatalError("Pithos client: %d %s" % (e.status, e.message))
101 997ac76a Nikos Skalkotos
102 b1395967 Nikos Skalkotos
    def register(self, name, location, metadata):
103 b1395967 Nikos Skalkotos
        params = {'is_public':'true', 'disk_format':'diskdump'}
104 b1395967 Nikos Skalkotos
        try:
105 b1395967 Nikos Skalkotos
            self.image_client.register(name, location, params, metadata)
106 b1395967 Nikos Skalkotos
        except ClientError as e:
107 b1395967 Nikos Skalkotos
            raise FatalError("Image client: %d %s" % (e.status, e.message))
108 40e7a487 Nikos Skalkotos
109 6152a559 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :