326 lines
14 KiB
Go
326 lines
14 KiB
Go
package k8s
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// TypeMeta describes an individual object in an API response or request
|
|
// with strings representing the type of the object and its API schema version.
|
|
// Structures that are versioned or persisted should inline TypeMeta.
|
|
type TypeMeta struct {
|
|
// Kind is a string value representing the REST resource this object represents.
|
|
// Servers may infer this from the endpoint the client submits requests to.
|
|
// Cannot be updated.
|
|
// In CamelCase.
|
|
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds
|
|
Kind string `json:"kind,omitempty"`
|
|
|
|
// APIVersion defines the versioned schema of this representation of an object.
|
|
// Servers should convert recognized schemas to the latest internal value, and
|
|
// may reject unrecognized values.
|
|
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources
|
|
APIVersion string `json:"apiVersion,omitempty"`
|
|
}
|
|
|
|
// ObjectMeta is metadata that all persisted resources must have, which includes all objects
|
|
// users must create.
|
|
type ObjectMeta struct {
|
|
// Name is unique within a namespace. Name is required when creating resources, although
|
|
// some resources may allow a client to request the generation of an appropriate name
|
|
// automatically. Name is primarily intended for creation idempotence and configuration
|
|
// definition.
|
|
Name string `json:"name,omitempty"`
|
|
|
|
// GenerateName indicates that the name should be made unique by the server prior to persisting
|
|
// it. A non-empty value for the field indicates the name will be made unique (and the name
|
|
// returned to the client will be different than the name passed). The value of this field will
|
|
// be combined with a unique suffix on the server if the Name field has not been provided.
|
|
// The provided value must be valid within the rules for Name, and may be truncated by the length
|
|
// of the suffix required to make the value unique on the server.
|
|
//
|
|
// If this field is specified, and Name is not present, the server will NOT return a 409 if the
|
|
// generated name exists - instead, it will either return 201 Created or 500 with Reason
|
|
// ServerTimeout indicating a unique name could not be found in the time allotted, and the client
|
|
// should retry (optionally after the time indicated in the Retry-After header).
|
|
GenerateName string `json:"generateName,omitempty"`
|
|
|
|
// Namespace defines the space within which name must be unique. An empty namespace is
|
|
// equivalent to the "default" namespace, but "default" is the canonical representation.
|
|
// Not all objects are required to be scoped to a namespace - the value of this field for
|
|
// those objects will be empty.
|
|
Namespace string `json:"namespace,omitempty"`
|
|
|
|
// SelfLink is a URL representing this object.
|
|
SelfLink string `json:"selfLink,omitempty"`
|
|
|
|
// UID is the unique in time and space value for this object. It is typically generated by
|
|
// the server on successful creation of a resource and is not allowed to change on PUT
|
|
// operations.
|
|
UID UID `json:"uid,omitempty"`
|
|
|
|
// An opaque value that represents the version of this resource. May be used for optimistic
|
|
// concurrency, change detection, and the watch operation on a resource or set of resources.
|
|
// Clients must treat these values as opaque and values may only be valid for a particular
|
|
// resource or set of resources. Only servers will generate resource versions.
|
|
ResourceVersion string `json:"resourceVersion,omitempty"`
|
|
|
|
// A sequence number representing a specific generation of the desired state.
|
|
// Populated by the system. Read-only.
|
|
Generation int64 `json:"generation,omitempty"`
|
|
|
|
// CreationTimestamp is a timestamp representing the server time when this object was
|
|
// created. It is not guaranteed to be set in happens-before order across separate operations.
|
|
// Clients may not set this value. It is represented in RFC3339 form and is in UTC.
|
|
CreationTimestamp Time `json:"creationTimestamp,omitempty"`
|
|
|
|
// DeletionTimestamp is the time after which this resource will be deleted. This
|
|
// field is set by the server when a graceful deletion is requested by the user, and is not
|
|
// directly settable by a client. The resource will be deleted (no longer visible from
|
|
// resource lists, and not reachable by name) after the time in this field. Once set, this
|
|
// value may not be unset or be set further into the future, although it may be shortened
|
|
// or the resource may be deleted prior to this time. For example, a user may request that
|
|
// a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination
|
|
// signal to the containers in the pod. Once the resource is deleted in the API, the Kubelet
|
|
// will send a hard termination signal to the container.
|
|
DeletionTimestamp *Time `json:"deletionTimestamp,omitempty"`
|
|
|
|
// DeletionGracePeriodSeconds records the graceful deletion value set when graceful deletion
|
|
// was requested. Represents the most recent grace period, and may only be shortened once set.
|
|
DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty"`
|
|
|
|
// Labels are key value pairs that may be used to scope and select individual resources.
|
|
// Label keys are of the form:
|
|
// label-key ::= prefixed-name | name
|
|
// prefixed-name ::= prefix '/' name
|
|
// prefix ::= DNS_SUBDOMAIN
|
|
// name ::= DNS_LABEL
|
|
// The prefix is optional. If the prefix is not specified, the key is assumed to be private
|
|
// to the user. Other system components that wish to use labels must specify a prefix. The
|
|
// "kubernetes.io/" prefix is reserved for use by kubernetes components.
|
|
// TODO: replace map[string]string with labels.LabelSet type
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
|
|
// Annotations are unstructured key value data stored with a resource that may be set by
|
|
// external tooling. They are not queryable and should be preserved when modifying
|
|
// objects. Annotation keys have the same formatting restrictions as Label keys. See the
|
|
// comments on Labels for details.
|
|
Annotations map[string]string `json:"annotations,omitempty"`
|
|
}
|
|
|
|
// UID is a type that holds unique ID values, including UUIDs. Because we
|
|
// don't ONLY use UUIDs, this is an alias to string. Being a type captures
|
|
// intent and helps make sure that UIDs and names do not get conflated.
|
|
type UID string
|
|
|
|
// Time is a wrapper around time.Time which supports correct
|
|
// marshaling to YAML and JSON. Wrappers are provided for many
|
|
// of the factory methods that the time package offers.
|
|
//
|
|
// +protobuf.options.marshal=false
|
|
// +protobuf.as=Timestamp
|
|
type Time struct {
|
|
time.Time `protobuf:"-"`
|
|
}
|
|
|
|
// Service is a named abstraction of software service (for example, mysql) consisting of local port
|
|
// (for example 3306) that the proxy listens on, and the selector that determines which pods
|
|
// will answer requests sent through the proxy.
|
|
type Service struct {
|
|
TypeMeta `json:",inline"`
|
|
ObjectMeta `json:"metadata,omitempty"`
|
|
|
|
// Spec defines the behavior of a service.
|
|
Spec ServiceSpec `json:"spec,omitempty"`
|
|
|
|
// Status represents the current status of a service.
|
|
Status ServiceStatus `json:"status,omitempty"`
|
|
}
|
|
|
|
// ServiceSpec describes the attributes that a user creates on a service
|
|
type ServiceSpec struct {
|
|
// Type determines how the service will be exposed. Valid options: ClusterIP, NodePort, LoadBalancer
|
|
Type ServiceType `json:"type,omitempty"`
|
|
|
|
// Required: The list of ports that are exposed by this service.
|
|
Ports []ServicePort `json:"ports"`
|
|
|
|
// This service will route traffic to pods having labels matching this selector. If empty or not present,
|
|
// the service is assumed to have endpoints set by an external process and Kubernetes will not modify
|
|
// those endpoints.
|
|
Selector map[string]string `json:"selector"`
|
|
|
|
// ClusterIP is usually assigned by the master. If specified by the user
|
|
// we will try to respect it or else fail the request. This field can
|
|
// not be changed by updates.
|
|
// Valid values are None, empty string (""), or a valid IP address
|
|
// None can be specified for headless services when proxying is not required
|
|
ClusterIP string `json:"clusterIP,omitempty"`
|
|
|
|
// ExternalIPs are used by external load balancers, or can be set by
|
|
// users to handle external traffic that arrives at a node.
|
|
ExternalIPs []string `json:"externalIPs,omitempty"`
|
|
|
|
// Only applies to Service Type: LoadBalancer
|
|
// LoadBalancer will get created with the IP specified in this field.
|
|
// This feature depends on whether the underlying cloud-provider supports specifying
|
|
// the loadBalancerIP when a load balancer is created.
|
|
// This field will be ignored if the cloud-provider does not support the feature.
|
|
LoadBalancerIP string `json:"loadBalancerIP,omitempty"`
|
|
|
|
// Required: Supports "ClientIP" and "None". Used to maintain session affinity.
|
|
SessionAffinity ServiceAffinity `json:"sessionAffinity,omitempty"`
|
|
}
|
|
|
|
// ServicePort service port
|
|
type ServicePort struct {
|
|
// Optional if only one ServicePort is defined on this service: The
|
|
// name of this port within the service. This must be a DNS_LABEL.
|
|
// All ports within a ServiceSpec must have unique names. This maps to
|
|
// the 'Name' field in EndpointPort objects.
|
|
Name string `json:"name"`
|
|
|
|
// The IP protocol for this port. Supports "TCP" and "UDP".
|
|
Protocol Protocol `json:"protocol"`
|
|
|
|
// The port that will be exposed on the service.
|
|
Port int `json:"port"`
|
|
|
|
// Optional: The target port on pods selected by this service. If this
|
|
// is a string, it will be looked up as a named port in the target
|
|
// Pod's container ports. If this is not specified, the value
|
|
// of the 'port' field is used (an identity map).
|
|
// This field is ignored for services with clusterIP=None, and should be
|
|
// omitted or set equal to the 'port' field.
|
|
TargetPort IntOrString `json:"targetPort"`
|
|
|
|
// The port on each node on which this service is exposed.
|
|
// Default is to auto-allocate a port if the ServiceType of this Service requires one.
|
|
NodePort int `json:"nodePort"`
|
|
}
|
|
|
|
// ServiceStatus represents the current status of a service
|
|
type ServiceStatus struct {
|
|
// LoadBalancer contains the current status of the load-balancer,
|
|
// if one is present.
|
|
LoadBalancer LoadBalancerStatus `json:"loadBalancer,omitempty"`
|
|
}
|
|
|
|
// LoadBalancerStatus represents the status of a load-balancer
|
|
type LoadBalancerStatus struct {
|
|
// Ingress is a list containing ingress points for the load-balancer;
|
|
// traffic intended for the service should be sent to these ingress points.
|
|
Ingress []LoadBalancerIngress `json:"ingress,omitempty"`
|
|
}
|
|
|
|
// LoadBalancerIngress represents the status of a load-balancer ingress point:
|
|
// traffic intended for the service should be sent to an ingress point.
|
|
type LoadBalancerIngress struct {
|
|
// IP is set for load-balancer ingress points that are IP based
|
|
// (typically GCE or OpenStack load-balancers)
|
|
IP string `json:"ip,omitempty"`
|
|
|
|
// Hostname is set for load-balancer ingress points that are DNS based
|
|
// (typically AWS load-balancers)
|
|
Hostname string `json:"hostname,omitempty"`
|
|
}
|
|
|
|
// ServiceAffinity Session Affinity Type string
|
|
type ServiceAffinity string
|
|
|
|
// ServiceType Service Type string describes ingress methods for a service
|
|
type ServiceType string
|
|
|
|
// Protocol defines network protocols supported for things like container ports.
|
|
type Protocol string
|
|
|
|
// IntOrString is a type that can hold an int32 or a string. When used in
|
|
// JSON or YAML marshalling and unmarshalling, it produces or consumes the
|
|
// inner type. This allows you to have, for example, a JSON field that can
|
|
// accept a name or number.
|
|
// TODO: Rename to Int32OrString
|
|
//
|
|
// +protobuf=true
|
|
// +protobuf.options.(gogoproto.goproto_stringer)=false
|
|
type IntOrString struct {
|
|
Type Type
|
|
IntVal int32
|
|
StrVal string
|
|
}
|
|
|
|
// FromInt creates an IntOrString object with an int32 value. It is
|
|
// your responsibility not to call this method with a value greater
|
|
// than int32.
|
|
// TODO: convert to (val int32)
|
|
func FromInt(val int) IntOrString {
|
|
return IntOrString{Type: Int, IntVal: int32(val)}
|
|
}
|
|
|
|
// FromString creates an IntOrString object with a string value.
|
|
func FromString(val string) IntOrString {
|
|
return IntOrString{Type: String, StrVal: val}
|
|
}
|
|
|
|
// String returns the string value, or the Itoa of the int value.
|
|
func (intstr *IntOrString) String() string {
|
|
if intstr.Type == String {
|
|
return intstr.StrVal
|
|
}
|
|
return strconv.Itoa(intstr.IntValue())
|
|
}
|
|
|
|
// IntValue returns the IntVal if type Int, or if
|
|
// it is a String, will attempt a conversion to int.
|
|
func (intstr *IntOrString) IntValue() int {
|
|
if intstr.Type == String {
|
|
i, _ := strconv.Atoi(intstr.StrVal)
|
|
return i
|
|
}
|
|
return int(intstr.IntVal)
|
|
}
|
|
|
|
// UnmarshalJSON implements the json.Unmarshaller interface.
|
|
func (intstr *IntOrString) UnmarshalJSON(value []byte) error {
|
|
if value[0] == '"' {
|
|
intstr.Type = String
|
|
return json.Unmarshal(value, &intstr.StrVal)
|
|
}
|
|
intstr.Type = Int
|
|
return json.Unmarshal(value, &intstr.IntVal)
|
|
}
|
|
|
|
// Type represents the stored type of IntOrString.
|
|
type Type int
|
|
|
|
const (
|
|
// Int int
|
|
Int Type = iota // The IntOrString holds an int.
|
|
//String string
|
|
String // The IntOrString holds a string.
|
|
)
|
|
|
|
// ServiceList holds a list of services.
|
|
type ServiceList struct {
|
|
TypeMeta `json:",inline"`
|
|
ListMeta `json:"metadata,omitempty"`
|
|
|
|
Items []Service `json:"items"`
|
|
}
|
|
|
|
// ListMeta describes metadata that synthetic resources must have, including lists and
|
|
// various status objects. A resource may have only one of {ObjectMeta, ListMeta}.
|
|
type ListMeta struct {
|
|
// SelfLink is a URL representing this object.
|
|
// Populated by the system.
|
|
// Read-only.
|
|
SelfLink string `json:"selfLink,omitempty"`
|
|
|
|
// String that identifies the server's internal version of this object that
|
|
// can be used by clients to determine when objects have changed.
|
|
// Value must be treated as opaque by clients and passed unmodified back to the server.
|
|
// Populated by the system.
|
|
// Read-only.
|
|
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency
|
|
ResourceVersion string `json:"resourceVersion,omitempty"`
|
|
}
|