k8s

package
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 24, 2018 License: Apache-2.0 Imports: 35 Imported by: 0

Documentation

Index

Constants

View Source
const (
	EnvUnknown       Env = "unknown"
	EnvGKE               = "gke"
	EnvMinikube          = "minikube"
	EnvDockerDesktop     = "docker-for-desktop"
)
View Source
const ContainerIDPrefix = "docker://"
View Source
const DefaultNamespace = Namespace("default")
View Source
const MagicTestContainerID = "tilt-testcontainer"

A magic constant. If the docker client returns this constant, we always match even if the container doesn't have the correct image name.

Variables

This section is empty.

Functions

func ContainerMatching

func ContainerMatching(pod *v1.Pod, ref reference.Named) (v1.ContainerStatus, error)

func ContainerSpecOf

func ContainerSpecOf(pod *v1.Pod, status v1.ContainerStatus) v1.Container

func ExtractPods

func ExtractPods(obj interface{}) ([]*v1.PodSpec, error)

func FakePodSpec

func FakePodSpec(image reference.NamedTagged) v1.PodSpec

func FakePodStatus

func FakePodStatus(image reference.NamedTagged, phase string) v1.PodStatus

func IsContainerExited

func IsContainerExited(pod v1.PodStatus, container v1.ContainerStatus) bool

If true, this means the container is gone and will never recover.

func IsUnschedulable

func IsUnschedulable(pod v1.PodStatus) (bool, string)

Returns the error message if the pod is unschedulable

func MustParseNamed

func MustParseNamed(s string) reference.Named

func MustParseNamedTagged

func MustParseNamedTagged(s string) reference.NamedTagged

func OpenService

func OpenService(ctx context.Context, client Client, lbSpec LoadBalancerSpec) error

func ParseNamedTagged

func ParseNamedTagged(s string) (reference.NamedTagged, error)

func PodContainsRef

func PodContainsRef(pod *v1.PodSpec, ref reference.Named) (bool, error)

func ProvideCoreInterface

func ProvideCoreInterface(cfg *rest.Config) (apiv1.CoreV1Interface, error)

func ProvideRESTClient

func ProvideRESTClient(cfg *rest.Config) (apiv1.CoreV1Interface, error)

func ProvideRESTConfig

func ProvideRESTConfig() (*rest.Config, error)

func SerializeYAML

func SerializeYAML(decoded []K8sEntity) (string, error)

func ServiceURL

func ServiceURL(service *v1.Service) (*url.URL, error)

func WaitForContainerReady

func WaitForContainerReady(ctx context.Context, client Client, pod *v1.Pod, ref reference.Named) (v1.ContainerStatus, error)

Types

type BufferCloser

type BufferCloser struct {
	*bytes.Buffer
}

func (BufferCloser) Close

func (b BufferCloser) Close() error

type Client

type Client interface {
	// Updates the entities, creating them if necessary.
	//
	// Tries to update them in-place if possible. But for certain resource types,
	// we might need to fallback to deleting and re-creating them.
	Upsert(ctx context.Context, entities []K8sEntity) error

	// Deletes all given entities
	Delete(ctx context.Context, entities []K8sEntity) error

	// Find all the pods that match the given image, namespace, and labels.
	PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair) ([]v1.Pod, error)

	// Find all the pods matching the given parameters, stopping on timeout or
	// when we have at least one pod.
	PollForPodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair, timeout time.Duration) ([]v1.Pod, error)

	PodByID(ctx context.Context, podID PodID, n Namespace) (*v1.Pod, error)

	// Creates a channel where all changes to the pod are brodcast.
	// Takes a pod as input, to indicate the version of the pod where we start watching.
	WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error)

	// Streams the container logs
	ContainerLogs(ctx context.Context, podID PodID, cName ContainerName, n Namespace) (io.ReadCloser, error)

	// Gets the ID for the Node on which the specified Pod is running
	GetNodeForPod(ctx context.Context, podID PodID) (NodeID, error)

	// Finds the PodID for the instance of appName running on the same node as podID
	FindAppByNode(ctx context.Context, nodeID NodeID, appName string, options FindAppByNodeOptions) (PodID, error)

	// Waits for the LoadBalancerSpec to get a publicly available URL.
	ResolveLoadBalancer(ctx context.Context, lb LoadBalancerSpec) (LoadBalancer, error)

	// Opens a tunnel to the specified pod+port. Returns the tunnel's local port and a function that closes the tunnel
	ForwardPort(ctx context.Context, namespace Namespace, podID PodID, optionalLocalPort, remotePort int) (localPort int, closer func(), err error)

	WatchPods(ctx context.Context, lps []LabelPair) (<-chan *v1.Pod, error)

	WatchServices(ctx context.Context, lps []LabelPair) (<-chan *v1.Service, error)
}

type ContainerID

type ContainerID string

func ContainerIDFromContainerStatus

func ContainerIDFromContainerStatus(status v1.ContainerStatus) (ContainerID, error)

func (ContainerID) Empty

func (cID ContainerID) Empty() bool

func (ContainerID) ShortStr

func (cID ContainerID) ShortStr() string

func (ContainerID) String

func (cID ContainerID) String() string

type ContainerName

type ContainerName string

func ContainerNameFromContainerStatus

func ContainerNameFromContainerStatus(status v1.ContainerStatus) ContainerName

func (ContainerName) String

func (n ContainerName) String() string

type Env

type Env string

func DetectEnv

func DetectEnv() (Env, error)

func EnvFromString

func EnvFromString(s string) Env

func (Env) IsLocalCluster

func (e Env) IsLocalCluster() bool

type FakeK8sClient

type FakeK8sClient struct {
	Yaml        string
	DeletedYaml string
	Lb          LoadBalancerSpec

	PodsWithImageResp         PodID
	PodsWithImageError        error
	PollForPodsWithImageDelay time.Duration

	LastPodQueryNamespace Namespace
	LastPodQueryImage     reference.NamedTagged

	PodLogs            string
	ContainerLogsError error

	LastForwardPortPodID      PodID
	LastForwardPortRemotePort int
}

func NewFakeK8sClient

func NewFakeK8sClient() *FakeK8sClient

func (*FakeK8sClient) ContainerLogs

func (c *FakeK8sClient) ContainerLogs(ctx context.Context, pID PodID, cName ContainerName, n Namespace) (io.ReadCloser, error)

func (*FakeK8sClient) Delete

func (c *FakeK8sClient) Delete(ctx context.Context, entities []K8sEntity) error

func (*FakeK8sClient) FindAppByNode

func (c *FakeK8sClient) FindAppByNode(ctx context.Context, nodeID NodeID, appName string, options FindAppByNodeOptions) (PodID, error)

func (*FakeK8sClient) ForwardPort

func (c *FakeK8sClient) ForwardPort(ctx context.Context, namespace Namespace, podID PodID, optionalLocalPort, remotePort int) (int, func(), error)

func (*FakeK8sClient) GetNodeForPod

func (c *FakeK8sClient) GetNodeForPod(ctx context.Context, podID PodID) (NodeID, error)

func (*FakeK8sClient) PodByID

func (c *FakeK8sClient) PodByID(ctx context.Context, pID PodID, n Namespace) (*v1.Pod, error)

func (*FakeK8sClient) PodsWithImage

func (c *FakeK8sClient) PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair) ([]v1.Pod, error)

func (*FakeK8sClient) PollForPodsWithImage

func (c *FakeK8sClient) PollForPodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair, timeout time.Duration) ([]v1.Pod, error)

func (*FakeK8sClient) ResolveLoadBalancer

func (c *FakeK8sClient) ResolveLoadBalancer(ctx context.Context, lb LoadBalancerSpec) (LoadBalancer, error)

func (*FakeK8sClient) SetPodsWithImageResp

func (c *FakeK8sClient) SetPodsWithImageResp(pID PodID)

func (*FakeK8sClient) SetPollForPodsWithImageDelay

func (c *FakeK8sClient) SetPollForPodsWithImageDelay(dur time.Duration)

func (*FakeK8sClient) Upsert

func (c *FakeK8sClient) Upsert(ctx context.Context, entities []K8sEntity) error

func (*FakeK8sClient) WatchPod

func (c *FakeK8sClient) WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error)

func (*FakeK8sClient) WatchPods

func (c *FakeK8sClient) WatchPods(ctx context.Context, lps []LabelPair) (<-chan *v1.Pod, error)

func (*FakeK8sClient) WatchServices

func (c *FakeK8sClient) WatchServices(ctx context.Context, lps []LabelPair) (<-chan *v1.Service, error)

type FindAppByNodeOptions

type FindAppByNodeOptions struct {
	Namespace string
	Owner     string
}

type K8sClient

type K8sClient struct {
	// contains filtered or unexported fields
}

func NewK8sClient

func NewK8sClient(
	ctx context.Context,
	env Env,
	core apiv1.CoreV1Interface,
	restConfig *rest.Config,
	pf PortForwarder) K8sClient

func (K8sClient) ContainerLogs

func (k K8sClient) ContainerLogs(ctx context.Context, pID PodID, cName ContainerName, n Namespace) (io.ReadCloser, error)

func (K8sClient) Delete

func (k K8sClient) Delete(ctx context.Context, entities []K8sEntity) error

func (K8sClient) FindAppByNode

func (k K8sClient) FindAppByNode(ctx context.Context, nodeID NodeID, appName string, options FindAppByNodeOptions) (PodID, error)

func (K8sClient) ForwardPort

func (k K8sClient) ForwardPort(ctx context.Context, namespace Namespace, podID PodID, optionalLocalPort, remotePort int) (localPort int, closer func(), err error)

func (K8sClient) GetNodeForPod

func (k K8sClient) GetNodeForPod(ctx context.Context, podID PodID) (NodeID, error)

func (K8sClient) PodByID

func (k K8sClient) PodByID(ctx context.Context, pID PodID, n Namespace) (*v1.Pod, error)

func (K8sClient) PodsWithImage

func (k K8sClient) PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair) ([]v1.Pod, error)

PodsWithImage returns the ID of the pod running the given image. If too many matches, throw an error. If no matches, return nil -- nothing is wrong, we just didn't find a result.

func (K8sClient) PollForPodsWithImage

func (k K8sClient) PollForPodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair, timeout time.Duration) ([]v1.Pod, error)

func (K8sClient) ResolveLoadBalancer

func (k K8sClient) ResolveLoadBalancer(ctx context.Context, lb LoadBalancerSpec) (LoadBalancer, error)

func (K8sClient) Upsert

func (k K8sClient) Upsert(ctx context.Context, entities []K8sEntity) error

func (K8sClient) WatchPod

func (k K8sClient) WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error)

func (K8sClient) WatchPods

func (kCli K8sClient) WatchPods(ctx context.Context, lps []LabelPair) (<-chan *v1.Pod, error)

func (K8sClient) WatchServices

func (kCli K8sClient) WatchServices(ctx context.Context, lps []LabelPair) (<-chan *v1.Service, error)

type K8sEntity

type K8sEntity struct {
	Obj  runtime.Object
	Kind *schema.GroupVersionKind
}

func ImmutableEntities

func ImmutableEntities(entities []K8sEntity) []K8sEntity

func InjectImageDigest

func InjectImageDigest(entity K8sEntity, injectRef reference.Named, policy v1.PullPolicy) (K8sEntity, bool, error)

Iterate through the fields of a k8s entity and replace a image name with its digest.

policy: The pull policy to set on the replaced image.

When working with a local k8s cluster, we want to set this to Never,
to ensure that k8s fails hard if the image is missing from docker.

Returns: the new entity, whether the image was replaced, and an error.

func InjectImagePullPolicy

func InjectImagePullPolicy(entity K8sEntity, policy v1.PullPolicy) (K8sEntity, error)

Iterate through the fields of a k8s entity and replace the image pull policy on all images.

func InjectLabels

func InjectLabels(entity K8sEntity, labels []LabelPair) (K8sEntity, error)

func MutableEntities

func MutableEntities(entities []K8sEntity) []K8sEntity

func ParseYAML

func ParseYAML(k8sYaml io.Reader) ([]K8sEntity, error)

func ParseYAMLFromString

func ParseYAMLFromString(yaml string) ([]K8sEntity, error)

func (K8sEntity) DeepCopy

func (e K8sEntity) DeepCopy() K8sEntity

func (K8sEntity) ImmutableOnceCreated

func (e K8sEntity) ImmutableOnceCreated() bool

Most entities can be updated once running, but a few cannot.

func (K8sEntity) Meta

func (e K8sEntity) Meta() metav1.ObjectMeta

func (K8sEntity) Name

func (e K8sEntity) Name() string

func (K8sEntity) Namespace

func (e K8sEntity) Namespace() Namespace

type LabelPair

type LabelPair struct {
	Key   string
	Value string
}

type LoadBalancer

type LoadBalancer struct {
	Spec LoadBalancerSpec
	URL  *url.URL
}

type LoadBalancerSpec

type LoadBalancerSpec struct {
	Name      string
	Namespace Namespace
	Ports     []int32
}

func ToLoadBalancerSpec

func ToLoadBalancerSpec(entity K8sEntity) (LoadBalancerSpec, bool)

Try to convert the current entity to a LoadBalancerSpec service

func ToLoadBalancerSpecs

func ToLoadBalancerSpecs(entities []K8sEntity) []LoadBalancerSpec

type MultipleAppsFoundError

type MultipleAppsFoundError struct {
	// contains filtered or unexported fields
}

func (MultipleAppsFoundError) Error

func (m MultipleAppsFoundError) Error() string

type Namespace

type Namespace string

func NamespaceFromPod

func NamespaceFromPod(pod *v1.Pod) Namespace

func (Namespace) String

func (n Namespace) String() string

type NodeID

type NodeID string

func NodeIDFromPod

func NodeIDFromPod(pod *v1.Pod) NodeID

func (NodeID) String

func (nID NodeID) String() string

type PodID

type PodID string

func PodIDFromPod

func PodIDFromPod(pod *v1.Pod) PodID

func (PodID) Empty

func (pID PodID) Empty() bool

func (PodID) String

func (pID PodID) String() string

type PortForwarder

type PortForwarder func(ctx context.Context, restConfig *rest.Config, core apiv1.CoreV1Interface, namespace string, podID PodID, localPort int, remotePort int) (closer func(), err error)

func ProvidePortForwarder

func ProvidePortForwarder() PortForwarder

type ServiceName

type ServiceName string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL