Statistics
| Branch: | Tag: | Revision:

root / image_creator / kamaki_wrapper.py @ 1d413d1e

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 40e7a487 Nikos Skalkotos
41 e77e66a9 Nikos Skalkotos
from image_creator.util import FatalError
42 40e7a487 Nikos Skalkotos
43 40e7a487 Nikos Skalkotos
CONTAINER = "images"
44 40e7a487 Nikos Skalkotos
45 40e7a487 Nikos Skalkotos
46 e77e66a9 Nikos Skalkotos
class Kamaki(object):
47 cf4f52b6 Nikos Skalkotos
48 cf4f52b6 Nikos Skalkotos
    @staticmethod
49 24684bbb Nikos Skalkotos
    def get_account():
50 cf4f52b6 Nikos Skalkotos
        config = Config()
51 24684bbb Nikos Skalkotos
        return config.get('storage', 'account')
52 cf4f52b6 Nikos Skalkotos
53 24684bbb Nikos Skalkotos
    @staticmethod
54 24684bbb Nikos Skalkotos
    def get_token():
55 24684bbb Nikos Skalkotos
        config = Config()
56 24684bbb Nikos Skalkotos
        return config.get('global', 'token')
57 cf4f52b6 Nikos Skalkotos
58 cf4f52b6 Nikos Skalkotos
    @staticmethod
59 cf4f52b6 Nikos Skalkotos
    def save_account(account):
60 cf4f52b6 Nikos Skalkotos
        config = Config()
61 cf4f52b6 Nikos Skalkotos
        config.set('storage', 'account', account)
62 cf4f52b6 Nikos Skalkotos
        config.write()
63 cf4f52b6 Nikos Skalkotos
64 cf4f52b6 Nikos Skalkotos
    @staticmethod
65 cf4f52b6 Nikos Skalkotos
    def save_token(token):
66 cf4f52b6 Nikos Skalkotos
        config = Config()
67 cf4f52b6 Nikos Skalkotos
        config.set('global', 'token', token)
68 cf4f52b6 Nikos Skalkotos
        config.write()
69 cf4f52b6 Nikos Skalkotos
70 e77e66a9 Nikos Skalkotos
    def __init__(self, account, token, output):
71 997ac76a Nikos Skalkotos
        self.account = account
72 40e7a487 Nikos Skalkotos
        self.token = token
73 e77e66a9 Nikos Skalkotos
        self.out = output
74 40e7a487 Nikos Skalkotos
75 40e7a487 Nikos Skalkotos
        config = Config()
76 40e7a487 Nikos Skalkotos
77 40e7a487 Nikos Skalkotos
        pithos_url = config.get('storage', 'url')
78 40e7a487 Nikos Skalkotos
        self.container = CONTAINER
79 cf4f52b6 Nikos Skalkotos
        self.pithos_client = PithosClient(pithos_url, self.token, self.account,
80 f99fe99d Nikos Skalkotos
                                          self.container)
81 40e7a487 Nikos Skalkotos
82 40e7a487 Nikos Skalkotos
        image_url = config.get('image', 'url')
83 cf4f52b6 Nikos Skalkotos
        self.image_client = ImageClient(image_url, self.token)
84 40e7a487 Nikos Skalkotos
85 b1395967 Nikos Skalkotos
    def upload(self, file_obj, size=None, remote_path=None, hp=None, up=None):
86 b1aea98e Nikos Skalkotos
        """Upload a file to pithos"""
87 3b7d3fc7 Nikos Skalkotos
88 3b7d3fc7 Nikos Skalkotos
        path = basename(file_obj.name) if remote_path is None else remote_path
89 40e7a487 Nikos Skalkotos
90 b1395967 Nikos Skalkotos
        try:
91 b1395967 Nikos Skalkotos
            self.pithos_client.create_container(self.container)
92 b1395967 Nikos Skalkotos
        except ClientError as e:
93 b1395967 Nikos Skalkotos
            if e.status != 202:  # Ignore container already exists errors
94 3b7d3fc7 Nikos Skalkotos
                raise e
95 3b7d3fc7 Nikos Skalkotos
96 3b7d3fc7 Nikos Skalkotos
        hash_cb = self.out.progress_generator(hp) if hp is not None else None
97 3b7d3fc7 Nikos Skalkotos
        upload_cb = self.out.progress_generator(up) if up is not None else None
98 3b7d3fc7 Nikos Skalkotos
99 3b7d3fc7 Nikos Skalkotos
        self.pithos_client.create_object(path, file_obj, size, hash_cb,
100 3b7d3fc7 Nikos Skalkotos
                                         upload_cb)
101 3b7d3fc7 Nikos Skalkotos
102 3b7d3fc7 Nikos Skalkotos
        return "pithos://%s/%s/%s" % (self.account, self.container, path)
103 997ac76a Nikos Skalkotos
104 b1395967 Nikos Skalkotos
    def register(self, name, location, metadata):
105 b1aea98e Nikos Skalkotos
        """Register an image to ~okeanos"""
106 3b7d3fc7 Nikos Skalkotos
107 d3445122 Nikos Skalkotos
        # Convert all metadata to strings
108 d3445122 Nikos Skalkotos
        str_metadata = {}
109 d3445122 Nikos Skalkotos
        for (key, value) in metadata.iteritems():
110 f99fe99d Nikos Skalkotos
            str_metadata[str(key)] = str(value)
111 d3445122 Nikos Skalkotos
112 42ace959 Nikos Skalkotos
        params = {'is_public': 'true', 'disk_format': 'diskdump'}
113 d3445122 Nikos Skalkotos
        self.image_client.register(name, location, params, str_metadata)
114 40e7a487 Nikos Skalkotos
115 6152a559 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :