def CreateVolume(self, request, context): # TODO: volume_capabilities if len(request.volume_capabilities) != 1: context.abort(grpc.StatusCode.INVALID_ARGUMENT, "Exactly one cap is supported") volume_capability = request.volume_capabilities[0] AccessModeEnum = csi_pb2.VolumeCapability.AccessMode.Mode if volume_capability.access_mode.mode not in [ AccessModeEnum.SINGLE_NODE_WRITER ]: context.abort( grpc.StatusCode.INVALID_ARGUMENT, f"Unsupported access mode: {AccessModeEnum.Name(volume_capability.access_mode.mode)}", ) # FIXME: re-enable access_type after bd2fs is fixed # access_type = volume_capability.WhichOneof("access_type") # if access_type == "block": # pass # else: # context.abort( # grpc.StatusCode.INVALID_ARGUMENT, # "PANIC! This should be handled by bd2fs!", # ) MIN_SIZE = 16 * 1024 * 1024 # 16MiB: can't format xfs with smaller volumes size = max(MIN_SIZE, request.capacity_range.required_bytes) try: node_name = request.accessibility_requirements.preferred[ 0].segments[NODE_NAME_TOPOLOGY_KEY] except IndexError: context.abort( grpc.StatusCode.INVALID_ARGUMENT, "No preferred topology set. Is external-provisioner running in strict-topology mode?", ) except KeyError: context.abort(grpc.StatusCode.INVALID_ARGUMENT, "Topology key not found... why?") try: init_rawfile(volume_id=request.name, size=size), except CalledProcessError as exc: if exc.returncode == RESOURCE_EXHAUSTED_EXIT_CODE: context.abort(grpc.StatusCode.RESOURCE_EXHAUSTED, "Not enough disk space") else: raise exc return csi_pb2.CreateVolumeResponse(volume=csi_pb2.Volume( volume_id=request.name, capacity_bytes=size, accessible_topology=[ csi_pb2.Topology(segments={NODE_NAME_TOPOLOGY_KEY: node_name}) ], ))
def CreateVolume(self, request, context): # TODO: volume_capabilities if len(request.volume_capabilities) != 1: context.abort(grpc.StatusCode.INVALID_ARGUMENT, "Exactly one cap is supported") volume_capability = request.volume_capabilities[0] AccessModeEnum = csi_pb2.VolumeCapability.AccessMode.Mode if volume_capability.access_mode.mode not in [ AccessModeEnum.SINGLE_NODE_WRITER ]: context.abort( grpc.StatusCode.INVALID_ARGUMENT, f"Unsupported access mode: {AccessModeEnum.Name(volume_capability.access_mode.mode)}", ) access_type = volume_capability.WhichOneof("access_type") if access_type == "mount": fs_type = volume_capability.mount.fs_type if fs_type == "": fs_type = "ext4" elif access_type == "block": context.abort(grpc.StatusCode.INVALID_ARGUMENT, "Block mode not supported (yet)") else: context.abort(grpc.StatusCode.INVALID_ARGUMENT, f"Unknown access type: {access_type}") size = request.capacity_range.required_bytes size = max(size, 10 * 1024 * 1024) # At least 10MB try: node_name = request.accessibility_requirements.preferred[ 0].segments[NODE_NAME_TOPOLOGY_KEY] except IndexError: context.abort( grpc.StatusCode.INVALID_ARGUMENT, "No preferred topology set. Is external-provisioner running in strict-topology mode?", ) except KeyError: context.abort(grpc.StatusCode.INVALID_ARGUMENT, "Topology key not found... why?") run_on_node( init_rawfile.as_cmd(volume_id=request.name, size=size, fs_type=fs_type), node=node_name, ) return csi_pb2.CreateVolumeResponse(volume=csi_pb2.Volume( volume_id=request.name, capacity_bytes=size, accessible_topology=[ csi_pb2.Topology(segments={NODE_NAME_TOPOLOGY_KEY: node_name}) ], ))
def NodeGetInfo(self, request, context): return csi_pb2.NodeGetInfoResponse( node_id=self.node_name, accessible_topology=csi_pb2.Topology( segments={NODE_NAME_TOPOLOGY_KEY: self.node_name}), )