/
direct_server.py
executable file
·118 lines (92 loc) · 3.47 KB
/
direct_server.py
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
from concurrent import futures
import json
import logging as python_logging
import sys
import time
import grpc
import csi_pb2
import csi_pb2_grpc
from cinder import context as cinder_context
from cinder import objects
from oslo_config import cfg
from cinder.common import config
from cinder import rpc
from cinder import service
from cinder import utils
from cinder import version
from cinder import volume as cinder_volume
CONF = cfg.CONF
VOLUME_API = None
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class CinderServicer(csi_pb2_grpc.ControllerServicer):
"""Implements the ControllerServicer."""
def __init__(self):
self.volume_api = cinder_volume.API()
self.cctxt = cinder_context.get_admin_context()
def CreateVolume(self, req, context):
"""CreateVolume implements csi CreateVolume."""
volume_name = req.name
if len(req.name) < 1:
volume_name = str(uuid.uuid4())
# FIXME(jdg): Figure out sizing, should be able to just
# use a similar pattern as above with name, but there are
# some details around using "range" etc and the conversion
# from bytes to GiB
volume_size_gig = 1
volume_type_name = req.parameters.get('type', None)
volume_az = req.parameters.get('availability', None)
vref = self.volume_api.create(self.cctxt,
volume_size_gig,
volume_name,
None)
# FIXME(jdg): This is still wrong, it doesn't serialize correctly for a grpc response, but
# I haven't figured out what's wrong yet
csi_create_response = csi_pb2.CreateVolumeResponse()
csi_create_response.volume.id = vref.id
csi_create_response.volume.capacity_bytes = 1
return csi_create_response
def DeleteVolume(self, req, context):
"""DeleteVolume implements csi DeleteVolume."""
# Delete requires a Cinder Volume Object, so do a get
# first, we're using volume_id here
vref = self.volume_api.get(self.cctxt, req.volume_id)
self.volume_api.delete(self.cctxt, vref)
return csi_pb2.CreateVolumeResponse()
def ControllerPublishVolume(self, req, context):
pass
def ControllerUnpublishVolume(self, req, context):
pass
def ValidateVolumeCapabilities(self, req, context):
pass
def ListVolumes(self, req, context):
list_response = csi_pb2.ListVolumesResponse()
# FIXME(jdg): This is a train wreck down here,
# I can't figure out how the heck to get the
# volume elements added to the response.entries
c_vols = self.volume_api.get_all(self.cctxt)
# For now we're just returning nada
return list_response
def GetCapacity(self, req, context):
pass
def ControllerGetCapabilities(self, req, context):
pass
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
csi_pb2_grpc.add_ControllerServicer_to_server(
CinderServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
print("now serving...")
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
objects.register_all()
CONF(sys.argv[1:], project='cinder',
version=version.version_string())
config.set_middleware_defaults()
#utils.monkey_patch()
rpc.init(CONF)
serve()