syntax = "proto3";

import "gogoproto/gogo.proto";

package libnetwork;

option (gogoproto.marshaler_all) = true;
option (gogoproto.unmarshaler_all) = true;
option (gogoproto.stringer_all) = true;
option (gogoproto.gostring_all) = true;
option (gogoproto.sizer_all) = true;
option (gogoproto.goproto_stringer_all) = false;

// EndpointRecord specifies all the endpoint specific information that
// needs to gossiped to nodes participating in the network.
message EndpointRecord {
	// Name of the container
	string name = 1;

	// Service name of the service to which this endpoint belongs.
	string service_name = 2;

	// Service ID of the service to which this endpoint belongs.
	string service_id = 3 [(gogoproto.customname) = "ServiceID"];

	// Virtual IP of the service to which this endpoint belongs.
	string virtual_ip = 4 [(gogoproto.customname) = "VirtualIP"];

	// IP assigned to this endpoint.
	string endpoint_ip = 5 [(gogoproto.customname) = "EndpointIP"];

	// IngressPorts exposed by the service to which this endpoint belongs.
	repeated PortConfig ingress_ports = 6;

	// A list of aliases which are alternate names for the service
	repeated string aliases = 7;

	// List of aliases task specific aliases
	repeated string task_aliases = 8;

	// Whether this enpoint's service has been disabled
	bool service_disabled = 9;
}

// PortConfig specifies an exposed port which can be
// addressed using the given name. This can be later queried
// using a service discovery api or a DNS SRV query. The node
// port specifies a port that can be used to address this
// service external to the cluster by sending a connection
// request to this port to any node on the cluster.
message PortConfig {
	enum Protocol {
		option (gogoproto.goproto_enum_prefix) = false;

		TCP = 0 [(gogoproto.enumvalue_customname) = "ProtocolTCP"];
		UDP = 1 [(gogoproto.enumvalue_customname) = "ProtocolUDP"];
		SCTP = 2 [(gogoproto.enumvalue_customname) = "ProtocolSCTP"];
	}

	// Name for the port. If provided the port information can
	// be queried using the name as in a DNS SRV query.
	string name = 1;

	// Protocol for the port which is exposed.
	Protocol protocol = 2;

	// The port which the application is exposing and is bound to.
	uint32 target_port = 3;

	// PublishedPort specifies the port on which the service is
	// exposed on all nodes on the cluster. If not specified an
	// arbitrary port in the node port range is allocated by the
	// system. If specified it should be within the node port
	// range and it should be available.
	uint32 published_port = 4;
}
