// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package metropolis.node.build.fsspec;
option go_package = "source.monogon.dev/metropolis/node/build/fsspec";

// FSSpec is the spec from which a filesystem is generated. It consists of files, directories and symbolic
// links. Directories are also automatically inferred when required for the placement of files or symbolic
// links. Inferred directories always have uid 0, gid 0 and permissions 0555. This can be overridden by
// explicitly specifying a directory at a given path.
message FSSpec {
  repeated File file = 1;
  repeated Directory directory = 2;
  repeated SymbolicLink symbolic_link = 3;
  repeated SpecialFile special_file = 4;
}

// For internal use only. Represents all supported inodes in a oneof.
message Inode {
  oneof type {
    File file = 1;
    Directory directory = 2;
    SymbolicLink symbolic_link = 3;
    SpecialFile special_file = 4;
  }
}

message File {
  // The path where the file ends up in the filesystem.
  string path = 1;
  // The path on the host filesystem where the file contents should be taken from.
  string source_path = 2;
  // Unix permission bits
  uint32 mode = 3;
  // Owner uid
  uint32 uid = 4;
  // Owner gid
  uint32 gid = 5;
}

message Directory {
  // The path where the directory ends up in the filesystem.
  string path = 1;
  // Unix permission bits
  uint32 mode = 2;
  // Owner uid
  uint32 uid = 3;
  // Owner gid
  uint32 gid = 4;
}

message SymbolicLink {
  // The path where the symbolic link ends up in the filesystem.
  string path = 1;
  // The path to which the symbolic link resolves to.
  string target_path = 2;
}

message SpecialFile {
  // The path where the special file ends up in the filesystem.
  string path = 1;

  enum Type {
    CHARACTER_DEV = 0;
    BLOCK_DEV = 1;
    FIFO = 2;
  }

  // Type of special file.
  Type type = 2;

  // The major device number of the special file.
  uint32 major = 3;
  // The minor number of the special file. Ignored for FIFO-type special files.
  uint32 minor = 4;

  // Unix permission bits
  uint32 mode = 5;
  // Owner uid
  uint32 uid = 6;
  // Owner gid
  uint32 gid = 7;
}