// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

syntax = "proto3";

package hashicorp.consul.catalog.v2beta1;

import "pbcatalog/v2beta1/protocol.proto";
import "pbcatalog/v2beta1/selector.proto";
import "pbresource/annotations.proto";

message Service {
  option (hashicorp.consul.resource.spec) = {scope: SCOPE_NAMESPACE};

  // workloads is a selector for the workloads this service should represent.
  WorkloadSelector workloads = 1;
  // ports is the list of mappings of workload ports that this service
  // represents.
  repeated ServicePort ports = 2;

  // virtual_ips is a list of virtual IPs for this service. This is useful when you need to set
  // an IP from an external system (like Kubernetes). This can be an IPv4 or IPv6 string.
  repeated string virtual_ips = 3;
}

// ServicePort declares a port exposed by the service that can be used in config and xRoute
// references.
//
// For outside references to a service port by string identifier (e.g. in xRoutes and xPolicies),
// there are two forms supported:
// - A numeric value exclusively indicates a ServicePort.VirtualPort
// - A non-numeric value exclusively indicates a ServicePort.TargetPort
message ServicePort {
  // virtual_port is the port that could only be used when transparent
  // proxy is used alongside a virtual IP or a virtual DNS address.
  // This value is ignored in other cases. Whether or not using transparent
  // proxy, this value is optional.
  uint32 virtual_port = 1;

  // target_port is the name of the workload port.
  string target_port = 2;

  // protocol is the port's protocol. This should be set to "mesh"
  // if the target port is the proxy's inbound port.
  Protocol protocol = 3;
}
