syntax = "proto3";

package v1beta1;

service Filesystem {
    // PathExists checks if the requested path exists in the host's filesystem
    rpc PathExists(PathExistsRequest) returns (PathExistsResponse) {}

    // Mkdir creates a directory at the requested path in the host's filesystem
    rpc Mkdir(MkdirRequest) returns (MkdirResponse) {}

    // Rmdir removes the directory at the requested path in the host's filesystem.
    // This may be used for unlinking a symlink created through LinkPath
    rpc Rmdir(RmdirRequest) returns (RmdirResponse) {}

    // LinkPath creates a local directory symbolic link between a source path 
    // and target path in the host's filesystem
    rpc LinkPath(LinkPathRequest) returns (LinkPathResponse) {}

    //IsMountPoint checks if a given path is mount or not
    rpc IsMountPoint(IsMountPointRequest) returns (IsMountPointResponse) {}
}

// Context of the paths used for path prefix validation
enum PathContext {
    // Indicates the kubelet-csi-plugins-path parameter of csi-proxy be used as
    // the path context. This may be used while handling NodeStageVolume where
    // a volume may need to be mounted at a plugin-specific path like:
    // kubelet\plugins\kubernetes.io\csi\pv\<pv-name>\globalmount
    PLUGIN = 0;
    // Indicates the kubelet-pod-path parameter of csi-proxy be used as the path
    // context. This may be used while handling NodePublishVolume where a staged
    // volume may be need to be symlinked to a pod-specific path like:
    // kubelet\pods\<pod-uuid>\volumes\kubernetes.io~csi\<pvc-name>\mount
    POD = 1;
}

message PathExistsRequest {
    // The path whose existence we want to check in the host's filesystem
    string path = 1;

    // Context of the path parameter.
    // This is used to validate prefix for absolute paths passed
    PathContext context = 2;
}

message PathExistsResponse {
    // Error message if any. Empty string indicates success
    string error = 1;

    // Indicates whether the path in PathExistsRequest exists in the host's filesystem
    bool exists = 2;
}

message MkdirRequest {
    // The path to create in the host's filesystem.
    // All special characters allowed by Windows in path names will be allowed
    // except for restrictions noted below. For details, please check:
    // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
    // Non-existent parent directories in the path will be automatically created.
    // Directories will be created with Read and Write privileges of the Windows
    // User account under which csi-proxy is started (typically LocalSystem).
    //
    // Restrictions:
    // Only absolute path (indicated by a drive letter prefix: e.g. "C:\") is accepted.
    // Depending on the context parameter of this function, the path prefix needs 
    // to match the paths specified either as kubelet-csi-plugins-path
    // or as kubelet-pod-path parameters of csi-proxy.
    // The path parameter cannot already exist in the host's filesystem.
    // UNC paths of the form "\\server\share\path\file" are not allowed.
    // All directory separators need to be backslash character: "\".
    // Characters: .. / : | ? * in the path are not allowed.
    // Maximum path length will be capped to 260 characters.
    string path = 1;

    // Context of the path parameter.
    // This is used to validate prefix for absolute paths passed
    PathContext context = 2;
}

message MkdirResponse {
    // Error message if any. Empty string indicates success
    string error = 1;
}

message RmdirRequest {
    // The path to remove in the host's filesystem.
    // All special characters allowed by Windows in path names will be allowed
    // except for restrictions noted below. For details, please check:
    // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
    //
    // Restrictions:
    // Only absolute path (indicated by a drive letter prefix: e.g. "C:\") is accepted.
    // Depending on the context parameter of this function, the path prefix needs 
    // to match the paths specified either as kubelet-csi-plugins-path
    // or as kubelet-pod-path parameters of csi-proxy.
    // UNC paths of the form "\\server\share\path\file" are not allowed.
    // All directory separators need to be backslash character: "\".
    // Characters: .. / : | ? * in the path are not allowed.
    // Path cannot be a file of type symlink.
    // Maximum path length will be capped to 260 characters.
    string path = 1;

    // Context of the path parameter.
    // This is used to validate prefix for absolute paths passed
    PathContext context = 2;

    // Force remove all contents under path (if any).
    bool force = 3;
}

message RmdirResponse {
    // Error message if any. Empty string indicates success
    string error = 1;
}

message LinkPathRequest {
    // The path where the symlink is created in the host's filesystem.
    // All special characters allowed by Windows in path names will be allowed
    // except for restrictions noted below. For details, please check:
    // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
    //
    // Restrictions:
    // Only absolute path (indicated by a drive letter prefix: e.g. "C:\") is accepted.
    // The path prefix needs needs to match the paths specified as 
    // kubelet-csi-plugins-path parameter of csi-proxy.
    // UNC paths of the form "\\server\share\path\file" are not allowed.
    // All directory separators need to be backslash character: "\".
    // Characters: .. / : | ? * in the path are not allowed.
    // source_path cannot already exist in the host filesystem.
    // Maximum path length will be capped to 260 characters.
    string source_path = 1;

    // Target path in the host's filesystem used for the symlink creation.
    // All special characters allowed by Windows in path names will be allowed
    // except for restrictions noted below. For details, please check:
    // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
    //
    // Restrictions:
    // Only absolute path (indicated by a drive letter prefix: e.g. "C:\") is accepted.
    // The path prefix needs to match the paths specified as
    // kubelet-pod-path parameter of csi-proxy.
    // UNC paths of the form "\\server\share\path\file" are not allowed.
    // All directory separators need to be backslash character: "\".
    // Characters: .. / : | ? * in the path are not allowed.
    // target_path needs to exist as a directory in the host that is empty.
    // target_path cannot be a symbolic link.
    // Maximum path length will be capped to 260 characters.
    string target_path = 2;
}

message LinkPathResponse {
    // Error message if any. Empty string indicates success
    string error = 1;
}
 
message IsMountPointRequest {
    // The path whose existence we want to check in the host's filesystem
    string path = 1;
}

message IsMountPointResponse {
    // Error message if any. Empty string indicates success
    string error = 1;

    // Indicates whether the path in PathExistsRequest exists in the host's filesystem
    bool is_mount_point = 2;
}
