// 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.mkerofs.fsspec;
option go_package = "source.monogon.dev/metropolis/node/build/mkerofs/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;
}

// 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;
  }
}

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;
}