File: clients.py

package info (click to toggle)
python-freezerclient 6.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 672 kB
  • sloc: python: 4,550; makefile: 25; sh: 2
file content (137 lines) | stat: -rw-r--r-- 4,389 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# (c) Copyright 2014-2016 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import logging

from cliff import command
from cliff import lister
from cliff import show

from freezerclient import exceptions
from freezerclient import utils


logging = logging.getLogger(__name__)


class ClientShow(show.ShowOne):
    """Show a single client"""
    def get_parser(self, prog_name):
        parser = super(ClientShow, self).get_parser(prog_name)
        parser.add_argument(dest='client_id',
                            help='ID of the client')
        return parser

    def take_action(self, parsed_args):
        client = self.app.client.clients.get(parsed_args.client_id)

        if not client:
            raise exceptions.ApiClientException('Client not found')

        column = (
            'Client ID',
            'Client UUID',
            'hostname',
            'description'
        )
        data = (
            client.get('client', {}).get('client_id'),
            client.get('client', {}).get('uuid'),
            client.get('client', {}).get('hostname'),
            client.get('client', {}).get('description', '')
        )

        return column, data


class ClientList(lister.Lister):
    """List of clients registered in the api"""
    def get_parser(self, prog_name):
        parser = super(ClientList, self).get_parser(prog_name)

        parser.add_argument(
            '--limit',
            dest='limit',
            default=100,
            help='Specify a limit for search query',
        )

        parser.add_argument(
            '--offset',
            dest='offset',
            default=0,
            help='',
        )

        parser.add_argument(
            '--search',
            dest='search',
            default='',
            help='Define a filter for the query',
        )
        return parser

    def take_action(self, parsed_args):
        search = utils.prepare_search(parsed_args.search)

        clients = self.app.client.clients.list(limit=parsed_args.limit,
                                               offset=parsed_args.offset,
                                               search=search)

        # Print empty table if no clients found
        if not clients:
            clients = [{}]

        columns = ('Client ID', 'uuid', 'hostname', 'description')
        data = ((
            client.get('client', {}).get('client_id', ''),
            client.get('client', {}).get('uuid', ''),
            client.get('client', {}).get('hostname', ''),
            client.get('client', {}).get('description', '')
        ) for client in clients)

        return columns, data


class ClientDelete(command.Command):
    """Delete a client from the api"""
    def get_parser(self, prog_name):
        parser = super(ClientDelete, self).get_parser(prog_name)
        parser.add_argument(dest='client_id',
                            help='ID of the client')
        return parser

    def take_action(self, parsed_args):
        self.app.client.clients.delete(parsed_args.client_id)
        logging.info('Client {0} deleted'.format(parsed_args.client_id))


class ClientRegister(command.Command):
    """Register a new client"""
    def get_parser(self, prog_name):
        parser = super(ClientRegister, self).get_parser(prog_name)
        parser.add_argument('--file',
                            dest='file',
                            required=True,
                            help='Path to json file with the client')
        return parser

    def take_action(self, parsed_args):
        client = utils.doc_from_json_file(parsed_args.file)
        try:
            client_id = self.app.client.clients.create(client)
        except Exception as err:
            raise exceptions.ApiClientException(err.message)
        else:
            logging.info("Client {0} registered".format(client_id))