Beispiel #1
0
    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})
            ],
        ))
Beispiel #2
0
    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})
            ],
        ))
Beispiel #3
0
 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}),
     )