file.proto

Defines gNOI protocol for file.

Table 1. File remote procedure calls
RPC Purpose
TransferToRemote Transfers the contents of a file from the target to a remote location.
Remove Removes the specified file from the target.
Put Streams data into a file on the target.
Stat Returns metadata about a file on the target.
GET Retrieves a snapshot of data from the target.
//
// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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 gnoi.file;

import "github.com/openconfig/gnoi/common/common.proto";
import "github.com/openconfig/gnoi/types/types.proto";

option go_package = "github.com/openconfig/gnoi/file";

option (types.gnoi_version) = "0.1.0";

service File {
  // Get reads and streams the contents of a file from the target.
  // The file is streamed by sequential messages, each containing up to
  // 64KB of data. A final message is sent prior to closing the stream
  // that contains the hash of the data sent. An error is returned
  // if the file does not exist or there was an error reading the file.
  rpc Get(GetRequest) returns (stream GetResponse) {}

  // TransferToRemote transfers the contents of a file from the target to a
  // specified remote location. The response contains the hash of the data
  // transferred. An error is returned if the file does not exist, the file
  // transfer fails, or if there was an error reading the file. This is a
  // blocking call until the file transfer is complete.
  rpc TransferToRemote(TransferToRemoteRequest)
    returns (TransferToRemoteResponse) {}

  // Put streams data into a file on the target. The file is sent in
  // sequential messages, each message containing up to 64KB of data. A final
  // message must be sent that includes the hash of the data sent. An
  // error is returned if the location does not exist or there is an error
  // writing the data. If no checksum is received, the target must assume the
  // operation is incomplete and remove the partially transmitted file. The
  // target should initially write the file to a temporary location so a failure
  // does not destroy the original file.
  rpc Put(stream PutRequest) returns (PutResponse) {}


  // Stat returns metadata about a file on the target. An error is returned
  // if the file does not exist of there is an error in accessing the metadata.
  rpc Stat(StatRequest) returns (StatResponse) {}

  // Remove removes the specified file from the target. An error is
  // returned if the file does not exist, is a directory, or the remove
  // operation encounters an error (e.g., permission denied).
  rpc Remove(RemoveRequest) returns (RemoveResponse) {}
}

// A PutRequest is used to send data to be written on a file on the target.
//
// The initial message contains an Open message. The Open message contains
// information name of the file and the file's permisssions.
//
// The remote_file must be an absolute path. If remote_file already exists on
// the target, it is overwritten, otherwise it is created. If the path to
// remote_file doesn't exist it will be created.
//
// The contents to be written are streamed through multiple messages using the
// contents field. Each message may contain up to 64KB of data.
//
// The final message of the RPC contains the hash of the file contents.
message PutRequest {
  message Details {
    string remote_file = 1;
    // Permissions are represented as the octal format of standard UNIX
    // file permissions.
    // ex. 775: user read/write/execute, group read/write/execute,
    // global read/execute.
    uint32 permissions = 2;
  }
  oneof request {
    Details open = 1;
    bytes contents = 2;
    types.HashType hash = 3; // hash of the file.
  }
}

message PutResponse {
}

// A GetRequest specifies the remote_file to be streamed back
// to the caller. The remote_file must be an absolute path to an
// existing file.
message GetRequest {
  string remote_file = 1;
}

// A GetResponse either contains the next set of bytes read from the
// file or, as the last message, the hash of the data.
message GetResponse {
  oneof response {
    bytes contents = 1;
    types.HashType hash = 2; // hash of the file.
  }
}

// A TransferToRemoteRequest specifies the local path to transfer to and the
// details on where to transfer the data from. The local_path must be an
// absolute path to the file.
message TransferToRemoteRequest {
  string local_path = 1;

  // Details to download the remote_file being requested to a remote location.
  common.RemoteDownload remote_download = 2;
}

// A TransferToRemoteResponse contains the hash of the data transferred.
message TransferToRemoteResponse {
  types.HashType hash = 1; // hash of the file.
}

// StatRequest will list files at the provided path.
message StatRequest {
  string path = 1;
}

// StatResponse contains list of stat info of the provided path.
message StatResponse {
  repeated StatInfo stats = 1;
}

// StatInfo provides a file system information about a particular path.
message StatInfo {
  string path = 1;
  uint64 last_modified = 2; // Nanoseconds since epoch.
  // Permissions are represented as the octal format of standard UNIX
  // file permissions.
  // ex. 775: user read/write/execute, group read/write/execute,
  // global read/execute.
  uint32 permissions = 3;
  uint64 size = 4;
  // Default file creation mask. Represented as the octal format of
  // standard UNIX mask.
  uint32 umask = 5;
}

// A RemoveRequest specifies a file to be removed from the target.
message RemoveRequest {
  string remote_file = 1;
}

message RemoveResponse {
}