syntax = "proto3";

package resource;

option go_package = "github.com/talos-systems/talos/pkg/machinery/api/resource";

import "common/common.proto";
import "google/protobuf/timestamp.proto";

// The resource service definition.
//
// ResourceService provides user-facing API for the Talos resources.
service ResourceService {
  rpc Get(GetRequest) returns (GetResponse);
  rpc List(ListRequest) returns (stream ListResponse);
  rpc Watch(WatchRequest) returns (stream WatchResponse);
}

// common resource definition

message Resource {
    Metadata metadata = 1;
    Spec spec = 2;
}

message Metadata {
    string namespace = 1;
    string type = 2;
    string id = 3;
    string version = 4;
    string owner = 7;
    string phase = 5;
    google.protobuf.Timestamp created = 8;
    google.protobuf.Timestamp updated = 9;
    repeated string finalizers = 6;
}

message Spec {
    bytes yaml = 1;
}

// rpc Get
message GetRequest {
    string namespace = 1;
    string type = 2;
    string id = 3;
}

// The GetResponse message contains the Resource returned.
message Get {
    common.Metadata metadata = 1;
    Resource definition = 2;
    Resource resource = 3;
}

message GetResponse { repeated Get messages = 1; }

// rpc List
// The ListResponse message contains the Resource returned.
message ListRequest {
    string namespace = 1;
    string type = 2;
}

message ListResponse {
    common.Metadata metadata = 1;
    Resource definition = 2;
    Resource resource = 3;
}

// rpc Watch
// The WatchResponse message contains the Resource returned.
message WatchRequest {
    string namespace = 1;
    string type = 2;
    string id = 3;
    uint32 tail_events = 4;
}

enum EventType {
    CREATED = 0;
    UPDATED = 1;
    DESTROYED = 2;
}

message WatchResponse {
    common.Metadata metadata = 1;
    EventType event_type = 2;
    Resource definition = 3;
    Resource resource = 4;
}
