1 module neton.rpcservice.LeaseService;
2 
3 import neton.protocol.neton;
4 import neton.protocol.neton;
5 import neton.protocol.netonrpc;
6 import grpc;
7 import hunt.logging;
8 import neton.server.NetonRpcServer;
9 import neton.util.Future;
10 import neton.rpcservice.Command;
11 import std.stdio;
12 
13 class LeaseService : LeaseBase
14 {
15     override Status LeaseGrant(LeaseGrantRequest req, ref LeaseGrantResponse response)
16     {
17         auto f = new Future!(LeaseGrantRequest, LeaseGrantResponse)(req);
18 
19         if(req.TTL == 0)
20         {
21             logError("grant lease ttl is null");
22             return new Status(StatusCode.INVALID_ARGUMENT); 
23         }
24 
25         RpcRequest rreq;
26         if (req.ID == 0)
27             rreq.CMD = RpcReqCommand.LeaseGenIDRequest;
28         else
29             rreq.CMD = RpcReqCommand.LeaseGrantRequest;
30         rreq.LeaseID = req.ID;
31         rreq.TTL = req.TTL;
32         rreq.Hash = f.toHash();
33         NetonRpcServer.instance().Propose(rreq, f);
34         logDebug("waiting ..... : ", rreq);
35         response = f.get();
36         logDebug("waiting done.....");
37 
38         return Status.OK;
39     }
40 
41     override Status LeaseRevoke(LeaseRevokeRequest req, ref LeaseRevokeResponse response)
42     {
43         auto f = new Future!(LeaseRevokeRequest, LeaseRevokeResponse)(req);
44 
45         if(req.ID == 0)
46         {
47             logError("revoke lease id is null");
48             return new Status(StatusCode.INVALID_ARGUMENT); 
49         }
50 
51         RpcRequest rreq;
52         rreq.CMD = RpcReqCommand.LeaseRevokeRequest;
53         rreq.LeaseID = req.ID;
54         rreq.Hash = f.toHash();
55         NetonRpcServer.instance().Propose(rreq, f);
56         logDebug("waiting ..... : ", rreq);
57         response = f.get();
58         logDebug("waiting done.....");
59 
60         return Status.OK;
61     }
62 
63     override Status LeaseKeepAlive(ServerReaderWriter!(LeaseKeepAliveRequest,
64             LeaseKeepAliveResponse) rw)
65     {
66         LeaseKeepAliveRequest req;
67         while (rw.read(req))
68         {
69             logDebug("LeaseKeepAlive ----->  ID : ", req.ID);
70             if(req.ID == 0)
71                 return new Status(StatusCode.INVALID_ARGUMENT); 
72 
73             auto f = new Future!(ServerReaderWriter!(LeaseKeepAliveRequest, LeaseKeepAliveResponse), LeaseKeepAliveResponse)(rw);
74 
75             RpcRequest rreq;
76             rreq.CMD = RpcReqCommand.LeaseKeepAliveRequest;
77             rreq.LeaseID = req.ID;
78             rreq.Hash = f.toHash();
79             NetonRpcServer.instance().Propose(rreq, f);
80         }
81         logWarning("LeaseKeepAlive service end : ", this.toHash());
82 
83         return Status.OK;
84     }
85 
86     override Status LeaseTimeToLive(LeaseTimeToLiveRequest req, ref LeaseTimeToLiveResponse response)
87     {
88         if(req.ID == 0)
89         {
90             logError("lease timetolive id is null");
91             return new Status(StatusCode.INVALID_ARGUMENT); 
92         }
93 
94         auto f = new Future!(LeaseTimeToLiveRequest, LeaseTimeToLiveResponse)(req);
95 
96         RpcRequest rreq;
97         rreq.CMD = RpcReqCommand.LeaseTimeToLiveRequest;
98         rreq.LeaseID = req.ID;
99         rreq.Hash = f.toHash();
100         NetonRpcServer.instance().Propose(rreq, f);
101         logDebug("waiting ..... : ", rreq);
102         response = f.get();
103         logDebug("waiting done.....");
104 
105         return Status.OK;
106     }
107 
108     override Status LeaseLeases(LeaseLeasesRequest req, ref LeaseLeasesResponse response)
109     {
110         auto f = new Future!(LeaseLeasesRequest, LeaseLeasesResponse)(req);
111 
112         RpcRequest rreq;
113         rreq.CMD = RpcReqCommand.LeaseLeasesRequest;
114         rreq.Hash = f.toHash();
115         NetonRpcServer.instance().Propose(rreq, f);
116         logDebug("waiting ..... : ", rreq);
117         response = f.get();
118         logDebug("waiting done.....");
119 
120         return Status.OK;
121     }
122 
123 }