Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / config.py @ 5576a4eb

History | View | Annotate | Download (6.2 kB)

1 e3f01d64 Stavros Sachtouris
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 7493ccb6 Stavros Sachtouris
#      disclaimer.
10 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 7493ccb6 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7493ccb6 Stavros Sachtouris
#      provided with the distribution.
15 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 43ee6ae1 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERaUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 7493ccb6 Stavros Sachtouris
# or implied, of GRNET S.A.
33 7493ccb6 Stavros Sachtouris
34 844a6bdb Stavros Sachtouris
from sys import stdout
35 844a6bdb Stavros Sachtouris
36 234954d1 Stavros Sachtouris
from kamaki.cli import command
37 3fe56be4 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument
38 436bd910 Stavros Sachtouris
from kamaki.cli.commands import _command_init, errors
39 d486baec Stavros Sachtouris
from kamaki.cli.command_tree import CommandTree
40 844a6bdb Stavros Sachtouris
from kamaki.cli.errors import CLIError, CLISyntaxError
41 234954d1 Stavros Sachtouris
42 a29d2f88 Stavros Sachtouris
config_cmds = CommandTree('config', 'Kamaki configurations')
43 e9a92550 Stavros Sachtouris
_commands = [config_cmds]
44 234954d1 Stavros Sachtouris
45 3fe56be4 Stavros Sachtouris
about_options = '\nAbout options:\
46 439826ec Stavros Sachtouris
    \n. syntax: [group.]option\
47 c626151a Stavros Sachtouris
    \n. example: global.log_file\
48 439826ec Stavros Sachtouris
    \n. special case: <option> is equivalent to global.<option>\
49 439826ec Stavros Sachtouris
    \n. configuration file syntax:\
50 439826ec Stavros Sachtouris
    \n.   [group]\
51 439826ec Stavros Sachtouris
    \n.   option=value\
52 c626151a Stavros Sachtouris
    \n.   (more options can be set per group)\
53 144b3551 Stavros Sachtouris
    \n. special case: named clouds.\
54 c626151a Stavros Sachtouris
    \n. E.g. for a cloud "demo":\
55 144b3551 Stavros Sachtouris
    \n.   [cloud "demo"]\
56 c626151a Stavros Sachtouris
    \n.   url = <http://single/authentication/url/for/demo/site>\
57 c626151a Stavros Sachtouris
    \n.   token = <auth_token_from_demo_site>\
58 144b3551 Stavros Sachtouris
    \n. which are referenced as cloud.demo.url , cloud.demo.token'
59 3fe56be4 Stavros Sachtouris
60 234954d1 Stavros Sachtouris
61 d486baec Stavros Sachtouris
@command(config_cmds)
62 5eae854d Stavros Sachtouris
class config_list(_command_init):
63 3fe56be4 Stavros Sachtouris
    """List all configuration options
64 3fe56be4 Stavros Sachtouris
    FAQ:
65 3fe56be4 Stavros Sachtouris
    Q: I haven't set any options!
66 3fe56be4 Stavros Sachtouris
    A: Defaults are used (override with /config set )
67 3fe56be4 Stavros Sachtouris
    Q: There are more options than I have set
68 3fe56be4 Stavros Sachtouris
    A: Default options remain if not explicitly replaced or deleted
69 3fe56be4 Stavros Sachtouris
    """
70 7493ccb6 Stavros Sachtouris
71 436bd910 Stavros Sachtouris
    @errors.generic.all
72 436bd910 Stavros Sachtouris
    def _run(self):
73 7493ccb6 Stavros Sachtouris
        for section in sorted(self.config.sections()):
74 57ecec97 Stavros Sachtouris
            items = self.config.items(section)
75 7493ccb6 Stavros Sachtouris
            for key, val in sorted(items):
76 144b3551 Stavros Sachtouris
                if section in ('cloud',):
77 844a6bdb Stavros Sachtouris
                    prefix = '%s.%s' % (section, key)
78 844a6bdb Stavros Sachtouris
                    for k, v in val.items():
79 fa382f9e Stavros Sachtouris
                        print('%s.%s = %s' % (prefix, k, v))
80 844a6bdb Stavros Sachtouris
                else:
81 844a6bdb Stavros Sachtouris
                    print('%s.%s = %s' % (section, key, val))
82 7493ccb6 Stavros Sachtouris
83 436bd910 Stavros Sachtouris
    def main(self):
84 436bd910 Stavros Sachtouris
        self._run()
85 436bd910 Stavros Sachtouris
86 234954d1 Stavros Sachtouris
87 d486baec Stavros Sachtouris
@command(config_cmds)
88 5eae854d Stavros Sachtouris
class config_get(_command_init):
89 436bd910 Stavros Sachtouris
    """Show a configuration option"""
90 3fe56be4 Stavros Sachtouris
91 3fe56be4 Stavros Sachtouris
    __doc__ += about_options
92 7493ccb6 Stavros Sachtouris
93 436bd910 Stavros Sachtouris
    @errors.generic.all
94 436bd910 Stavros Sachtouris
    def _run(self, option):
95 7493ccb6 Stavros Sachtouris
        section, sep, key = option.rpartition('.')
96 844a6bdb Stavros Sachtouris
        if not sep:
97 844a6bdb Stavros Sachtouris
            match = False
98 844a6bdb Stavros Sachtouris
            for k in self.config.keys(key):
99 844a6bdb Stavros Sachtouris
                match = True
100 144b3551 Stavros Sachtouris
                if option != 'cloud':
101 844a6bdb Stavros Sachtouris
                    stdout.write('%s.%s =' % (option, k))
102 844a6bdb Stavros Sachtouris
                self._run('%s.%s' % (option, k))
103 844a6bdb Stavros Sachtouris
            if match:
104 844a6bdb Stavros Sachtouris
                return
105 844a6bdb Stavros Sachtouris
            section = 'global'
106 144b3551 Stavros Sachtouris
        prefix = 'cloud.'
107 844a6bdb Stavros Sachtouris
        get, section = (
108 144b3551 Stavros Sachtouris
            self.config.get_cloud, section[len(prefix):]) if (
109 844a6bdb Stavros Sachtouris
                section.startswith(prefix)) else (self.config.get, section)
110 844a6bdb Stavros Sachtouris
        value = get(section, key)
111 844a6bdb Stavros Sachtouris
        if isinstance(value, dict):
112 844a6bdb Stavros Sachtouris
            for k, v in value.items():
113 844a6bdb Stavros Sachtouris
                print('%s.%s.%s = %s' % (section, key, k, v))
114 844a6bdb Stavros Sachtouris
        elif value:
115 7493ccb6 Stavros Sachtouris
            print(value)
116 7493ccb6 Stavros Sachtouris
117 436bd910 Stavros Sachtouris
    def main(self, option):
118 436bd910 Stavros Sachtouris
        self._run(option)
119 436bd910 Stavros Sachtouris
120 234954d1 Stavros Sachtouris
121 d486baec Stavros Sachtouris
@command(config_cmds)
122 5eae854d Stavros Sachtouris
class config_set(_command_init):
123 7493ccb6 Stavros Sachtouris
    """Set a configuration option"""
124 7493ccb6 Stavros Sachtouris
125 3fe56be4 Stavros Sachtouris
    __doc__ += about_options
126 3fe56be4 Stavros Sachtouris
127 436bd910 Stavros Sachtouris
    @errors.generic.all
128 436bd910 Stavros Sachtouris
    def _run(self, option, value):
129 7493ccb6 Stavros Sachtouris
        section, sep, key = option.rpartition('.')
130 144b3551 Stavros Sachtouris
        prefix = 'cloud.'
131 844a6bdb Stavros Sachtouris
        if section.startswith(prefix):
132 144b3551 Stavros Sachtouris
            self.config.set_cloud(section[len(prefix):], key, value)
133 144b3551 Stavros Sachtouris
        elif section in ('cloud',):
134 844a6bdb Stavros Sachtouris
            raise CLISyntaxError(
135 844a6bdb Stavros Sachtouris
                'Invalid syntax for cloud definition', importance=2, details=[
136 144b3551 Stavros Sachtouris
                    'To define a cloud "%s"' % key,
137 844a6bdb Stavros Sachtouris
                    'set the cloud\'s authentication url and token:',
138 144b3551 Stavros Sachtouris
                    '  /config set cloud.%s.url <URL>' % key,
139 144b3551 Stavros Sachtouris
                    '  /config set cloud.%s.token <t0k3n>' % key])
140 844a6bdb Stavros Sachtouris
        else:
141 844a6bdb Stavros Sachtouris
            section = section or 'global'
142 844a6bdb Stavros Sachtouris
            self.config.set(section, key, value)
143 7493ccb6 Stavros Sachtouris
        self.config.write()
144 8eb8c540 Stavros Sachtouris
        self.config.reload()
145 7493ccb6 Stavros Sachtouris
146 436bd910 Stavros Sachtouris
    def main(self, option, value):
147 436bd910 Stavros Sachtouris
        self._run(option, value)
148 436bd910 Stavros Sachtouris
149 234954d1 Stavros Sachtouris
150 d486baec Stavros Sachtouris
@command(config_cmds)
151 5eae854d Stavros Sachtouris
class config_delete(_command_init):
152 3fe56be4 Stavros Sachtouris
    """Delete a configuration option
153 3fe56be4 Stavros Sachtouris
    Default values are not removed by default. To alter this behavior in a
154 3fe56be4 Stavros Sachtouris
    session, use --default.
155 3fe56be4 Stavros Sachtouris
    """
156 3fe56be4 Stavros Sachtouris
157 3fe56be4 Stavros Sachtouris
    arguments = dict(
158 3fe56be4 Stavros Sachtouris
        default=FlagArgument(
159 436bd910 Stavros Sachtouris
            'Remove default value as well (persists until end of session)',
160 3fe56be4 Stavros Sachtouris
            '--default')
161 3fe56be4 Stavros Sachtouris
    )
162 7493ccb6 Stavros Sachtouris
163 436bd910 Stavros Sachtouris
    @errors.generic.all
164 436bd910 Stavros Sachtouris
    def _run(self, option):
165 7493ccb6 Stavros Sachtouris
        section, sep, key = option.rpartition('.')
166 7493ccb6 Stavros Sachtouris
        section = section or 'global'
167 144b3551 Stavros Sachtouris
        prefix = 'cloud.'
168 844a6bdb Stavros Sachtouris
        if section.startswith(prefix):
169 144b3551 Stavros Sachtouris
            cloud = section[len(prefix):]
170 844a6bdb Stavros Sachtouris
            try:
171 144b3551 Stavros Sachtouris
                self.config.remove_from_cloud(cloud, key)
172 844a6bdb Stavros Sachtouris
            except KeyError:
173 844a6bdb Stavros Sachtouris
                raise CLIError('Field %s does not exist' % option)
174 844a6bdb Stavros Sachtouris
        else:
175 844a6bdb Stavros Sachtouris
            self.config.remove_option(section, key, self['default'])
176 7493ccb6 Stavros Sachtouris
        self.config.write()
177 8eb8c540 Stavros Sachtouris
        self.config.reload()
178 436bd910 Stavros Sachtouris
179 436bd910 Stavros Sachtouris
    def main(self, option):
180 436bd910 Stavros Sachtouris
        self._run(option)