Initial commit
[ta/distributed-state-server.git] / src / dss / cli / dss_clihandlers.py
1 # Copyright 2019 Nokia
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 #
15
16 import socket
17 import sys
18 import json
19
20 from dss.api import dss_error
21 from dss.client import dss_client
22
23 class VerboseLogger:
24     def __call__(self, msg):
25         print(msg)
26
27 class CLIHandler:
28     def __init__(self):
29         self.sock = None
30         self.verbose_logger = VerboseLogger()
31
32     def _init_api(self, server, verbose):
33         logger = None
34         if verbose:
35             logger = self.verbose_logger
36
37         self.client = dss_client.Client(server)
38
39     def set_handler(self, subparser):
40         subparser.set_defaults(handler=self)
41
42     def init_subparser(self, subparsers):
43         raise dss_error.Error('Not implemented')
44
45     def __call__(self, args):
46         raise dss_error.Error('Not implemented')
47     
48
49 class CLIGetHandler(CLIHandler):
50     def init_subparser(self, subparsers):
51         subparser = subparsers.add_parser('get', help='Get the value of an attribute')
52         subparser.add_argument('--domain',
53                 required=True,
54                 dest='domain',
55                 metavar='DOMAIN',
56                 action='store')
57
58         subparser.add_argument('--name',
59                 required=True,
60                 dest='name',
61                 metavar='NAME',
62                 action='store')
63
64         self.set_handler(subparser)
65     
66     def __call__(self, args):
67         self._init_api(args.server, args.verbose)
68         value = self.client.get(args.domain, args.name)
69         print('%s' % value)
70
71 class CLIGetDomainHandler(CLIHandler):
72     def init_subparser(self, subparsers):
73         subparser = subparsers.add_parser('get-domain', help='Get the domain attributes')
74         subparser.add_argument('--domain',
75                 required=True,
76                 dest='domain',
77                 metavar='DOMAIN',
78                 action='store')
79
80         self.set_handler(subparser)
81
82     def __call__(self, args):
83         self._init_api(args.server, args.verbose)
84         attrs = self.client.get_domain(args.domain)
85         for name, value in attrs.iteritems():
86             print('%s = %s' % (name, value))
87
88 class CLIGetDomainsHandler(CLIHandler):
89     def init_subparser(self, subparsers):
90         subparser = subparsers.add_parser('get-domains', help='Get the domains')
91         self.set_handler(subparser)
92
93     def __call__(self, args):
94         self._init_api(args.server, args.verbose)
95         domains = self.client.get_domains()
96         for domain in domains:
97             print('%s' % domain)
98
99 class CLISetHandler(CLIHandler):
100     def init_subparser(self, subparsers):
101         subparser = subparsers.add_parser('set', help='Set an attribute to some value')
102         subparser.add_argument('--domain',
103                 required=True,
104                 dest='domain',
105                 metavar='DOMAIN',
106                 action='store')
107         subparser.add_argument('--name',
108                 required=True,
109                 dest='name',
110                 metavar='NAME',
111                 action='store')
112         subparser.add_argument('--value',
113                 required=True,
114                 dest='value',
115                 metavar='VALUE',
116                 action='store')
117
118         self.set_handler(subparser)
119
120     def __call__(self, args):
121         self._init_api(args.server, args.verbose)
122         self.client.set(args.domain, args.name, args.value)
123
124 class CLIDeleteHandler(CLIHandler):
125     def init_subparser(self, subparsers):
126         subparser = subparsers.add_parser('delete', help='Delete an attribute')
127         subparser.add_argument('--domain',
128                 required=True,
129                 dest='domain',
130                 metavar='DOMAIN',
131                 action='store')
132         subparser.add_argument('--name',
133                 required=True,
134                 dest='name',
135                 metavar='NAME',
136                 action='store')
137
138         self.set_handler(subparser)
139
140     def __call__(self, args):
141         self._init_api(args.server, args.verbose)
142         self.client.delete(args.domain, args.name)
143
144 class CLIDeleteDomainHandler(CLIHandler):
145     def init_subparser(self, subparsers):
146         subparser = subparsers.add_parser('delete-domain', help='Delete a domain')
147         subparser.add_argument('--domain',
148                 required=True,
149                 dest='domain',
150                 metavar='DOMAIN',
151                 action='store')
152
153         self.set_handler(subparser)
154
155     def __call__(self, args):
156         self._init_api(args.server, args.verbose)
157         self.client.delete_domain(args.domain)
158
159 import sys
160 import inspect
161
162 def get_handlers_list():
163     handlers = []
164     for name, obj in inspect.getmembers(sys.modules[__name__]):
165         if inspect.isclass(obj):
166             if name is not 'CLIHandler':
167                 if issubclass(obj, CLIHandler):
168                     handlers.append(obj())
169     return handlers
170
171 if __name__ == '__main__':
172     handlers = get_handlers_list()
173     for handler in handlers:
174         print('handler is ', handler)