Initial commit
[ta/distributed-state-server.git] / src / dss / client / dss_client.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 from dss.api import dss_error
17 from dss.api import dss_msg
18 from dss.api import dss_get_rpc
19 from dss.api import dss_set_rpc
20 from dss.api import dss_get_domain_rpc
21 from dss.api import dss_get_domains_rpc
22 from dss.api import dss_delete_rpc
23 from dss.api import dss_delete_domain_rpc
24
25 import socket
26
27 class Client(object):
28     def __init__(self, uds):
29         self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
30
31         self.server_address = uds
32         self.connect = True
33         self.fd = None
34         self.id = 0
35
36     def _connect(self):
37         if self.connect:
38             self.sock.connect(self.server_address)
39             self.fd = self.sock.makefile('rw')
40             self.connect = False
41
42     def _call_rpc(self, msg):
43         self.id += 1
44         repmsg = dss_msg.Msg()
45         try:
46             self._connect()
47             req = msg.serialize()
48             self.sock.sendall(req+'\n')
49             rep = self.fd.readline()
50         except Exception as exp:
51             try:
52                 self.sock.close()
53             except:
54                 pass
55             self.connect = True
56             raise dss_error.Error(str(exp))
57         repmsg.deserialize(rep)
58         return repmsg
59
60     def get(self, domain, name):
61         reqpayload = dss_get_rpc.GetRPC.create_req_payload(domain, name)
62         reqmsg = dss_msg.Msg(dss_get_rpc.GetRPC.get_name(), self.id, reqpayload)
63         repmsg = self._call_rpc(reqmsg)
64         reppayload = repmsg.get_payload()
65         value = dss_get_rpc.GetRPC.get_value_from_rep_payload(reppayload)
66         return value
67         
68     def get_domain(self, domain):
69         reqpayload = dss_get_domain_rpc.GetDomainRPC.create_req_payload(domain)
70         reqmsg = dss_msg.Msg(dss_get_domain_rpc.GetDomainRPC.get_name(), self.id, reqpayload)
71         repmsg = self._call_rpc(reqmsg)
72         reppayload = repmsg.get_payload()
73         attrs = dss_get_domain_rpc.GetDomainRPC.get_data_from_rep_payload(reppayload)
74         return attrs
75
76
77     def set(self, domain, name, value):
78         reqpayload = dss_set_rpc.SetRPC.create_req_payload(domain, name, value)
79         reqmsg = dss_msg.Msg(dss_set_rpc.SetRPC.get_name(), self.id, reqpayload)
80         repmsg = self._call_rpc(reqmsg)
81
82     def get_domains(self):
83         reqmsg = dss_msg.Msg(dss_get_domains_rpc.GetDomainsRPC.get_name(), self.id, None)
84         repmsg = self._call_rpc(reqmsg)
85         reppayload = repmsg.get_payload()
86         domains = dss_get_domains_rpc.GetDomainsRPC.get_data_from_rep_payload(reppayload)
87         return domains
88
89     def delete(self, domain, name):
90         reqpayload = dss_delete_rpc.DeleteRPC.create_req_payload(domain, name)
91         reqmsg = dss_msg.Msg(dss_delete_rpc.DeleteRPC.get_name(), self.id, reqpayload)
92         repmsg = self._call_rpc(reqmsg)
93
94     def delete_domain(self, domain):
95         reqpayload = dss_delete_domain_rpc.DeleteDomainRPC.create_req_payload(domain)
96         reqmsg = dss_msg.Msg(dss_delete_domain_rpc.DeleteDomainRPC.get_name(), self.id, reqpayload)
97         repmsg = self._call_rpc(reqmsg)