syntax = "proto3";

package controller.api.resources.targets.v1;

option go_package = "github.com/hashicorp/boundary/internal/gen/controller/api/resources/targets;targets";

import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/struct.proto";
import "controller/api/resources/scopes/v1/scope.proto";
import "controller/custom_options/v1/options.proto";

message HostSet{
	// Output only. The ID of the Host Set.
	string id = 10;

	// Output only. The Host Catalog to which this Host Set belongs.
	string host_catalog_id = 20 [json_name="host_catalog_id"];
}

// Target contains all fields related to a Target resource
message Target {
	// Output only. The ID of the resource.
	string id = 10;

	// The Scope of of this resource. This must be defined for creation of this resource, but is otherwise output only.
	string scope_id = 20 [json_name="scope_id"];

	// Output only. Scope information for this resource.
	resources.scopes.v1.ScopeInfo scope = 30;
	
	// Required name for identification purposes.
	google.protobuf.StringValue name = 40 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = {this:"name" that: "name"}];

	// Optional user-set description for identification purposes.
	google.protobuf.StringValue description = 50 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = {this:"description" that: "description"}];

	// Output only. The time this resource was created.
	google.protobuf.Timestamp created_time = 60 [json_name="created_time"];

	// Output only. The time this resource was last updated.
	google.protobuf.Timestamp updated_time = 70 [json_name="updated_time"];

	// Version is used in mutation requests, after the initial creation, to ensure this resource has not changed.
  // The mutation will fail if the version does not match the latest known good version.
	uint32 version = 80;

	// The type of the Target.
	string type = 90;

	// The IDs of the Host Sets associated with this Target.
	repeated string host_set_ids = 100 [json_name="host_set_ids"];

	// Output only. The Host Sets associated with this Target.
	repeated HostSet host_sets = 110 [json_name="host_sets"];

	// Maximum total lifetime of a created Session, in seconds.
	google.protobuf.UInt32Value session_max_seconds = 120 [json_name="session_max_seconds", (custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = {this:"session_max_seconds" that: "SessionMaxSeconds"}];

	// Maximum number of connections allowed in a Session.  Unlimited is indicated by the value -1.
	google.protobuf.Int32Value session_connection_limit = 130 [json_name="session_connection_limit", (custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = {this:"session_connection_limit" that: "SessionConnectionLimit"}];

	// The attributes that are applicable for the specific Target.
	google.protobuf.Struct attributes = 200 [(custom_options.v1.generate_sdk_option) = true];
}

// TcpTargetAttributes contains attributes relevant to Targets of type "tcp"
message TcpTargetAttributes {
	// The default TCP port that will be used when connecting to the endpoint unless overridden by a Host Set or Host.
	google.protobuf.UInt32Value default_port = 10 [json_name="default_port", (custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = {this:"attributes.default_port" that: "DefaultPort"}];
}

// WorkerInfo contains information about workers, returned in to the client in SessionAuthorization
message WorkerInfo {
	// Output only. The address of the worker.
	string address = 10;
}

// SessionAuthorizationData contains the fields needed by the proxy command to connect to a worker. It is marshaled inside the SessionAuthorization message.
message SessionAuthorizationData {
	// Output only. The ID of the session.
	string session_id = 10 [json_name="session_id"];

	// Output only. The ID of the Target authorizing this session.
	string target_id = 20 [json_name="target_id"];

	// Output only. Scope information for this the Target that authorized this session.
	resources.scopes.v1.ScopeInfo scope = 30;

	// Output only. The time this resource was created.
	google.protobuf.Timestamp created_time = 40 [json_name="created_time"];

	// Output only. Type of the session (e.g. tcp, ssh, etc.).
	string type = 80;

	// Output only. The connection limit being applied to this session. -1 means unlimited. This is not actually enforced on the client side but it provides for better listener handling by including it.
	int32 connection_limit = 90 [json_name="connection_limit"];

	// Output only. The certificate to use when connecting. Raw DER bytes.
	bytes certificate = 120;

	// Output only. The private key to use when connecting. We are using Ed25519, so this is purely raw bytes, no marshaling.
	bytes private_key = 130 [json_name="private_key"];

	// Output only. Worker information. The first worker in the array should be prioritized.
	repeated WorkerInfo worker_info = 150 [json_name="worker_info"];
}

// SessionAuthorization contains all fields related to authorization for a Session. It's in the Targets package because it's returned by a Target's authorize action.
message SessionAuthorization {
	// Output only. The ID of the Session.
	string session_id = 10 [json_name="session_id"];

	// Output only. The ID of the Target authorizing this Session.
	string target_id = 20 [json_name="target_id"];

	// Output only. Scope information for this resource.
	resources.scopes.v1.ScopeInfo scope = 30;

	// Output only. The time this resource was created.
	google.protobuf.Timestamp created_time = 40 [json_name="created_time"];

	// Output only. The User for which this Session was authorized.
	string user_id = 50 [json_name="user_id"];

	// Output only. The Host Set containing the Host being used for this Session.
	string host_set_id = 60 [json_name="host_set_id"];

	// Output only. The Host whose address is being used as the endpoint for this Session.
	string host_id = 70 [json_name="host_id"];

	// Output only. Type of the Session (e.g. tcp, ssh, etc.).
	string type = 80;

	// Output only. The marshaled SessionAuthorizationData message containing all information that the proxy needs.
	string authorization_token = 90 [json_name="authorization_token"];
}