Statistics
| Branch: | Tag: | Revision:

root / image_creator / kamaki_wrapper.py @ 56884b64

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