Documentation ¶
Index ¶
- Constants
- func ContainerIDFromContainerStatus(status v1.ContainerStatus) (container.ID, error)
- func ContainerMatching(pod *v1.Pod, ref reference.Named) (v1.ContainerStatus, error)
- func ContainerNameFromContainerStatus(status v1.ContainerStatus) container.Name
- func ContainerSpecOf(pod *v1.Pod, status v1.ContainerStatus) v1.Container
- func ExtractPodTemplateSpec(obj interface{}) ([]*v1.PodTemplateSpec, error)
- func ExtractPods(obj interface{}) ([]*v1.PodSpec, error)
- func FakePodSpec(image reference.NamedTagged) v1.PodSpec
- func FakePodStatus(image reference.NamedTagged, phase string) v1.PodStatus
- func FindImageNamedTaggedMatching(pod v1.PodSpec, ref reference.Named) (reference.NamedTagged, error)
- func FindImageRefMatching(pod v1.PodSpec, ref reference.Named) (reference.Named, error)
- func IsContainerExited(pod v1.PodStatus, container v1.ContainerStatus) bool
- func IsUnschedulable(pod v1.PodStatus) (bool, string)
- func PodContainsRef(pod v1.PodSpec, ref reference.Named) (bool, error)
- func ProvideCoreInterface(cfg *rest.Config) (apiv1.CoreV1Interface, error)
- func ProvideRESTClient(cfg *rest.Config) (apiv1.CoreV1Interface, error)
- func ProvideRESTConfig() (*rest.Config, error)
- func SerializeYAML(decoded []K8sEntity) (string, error)
- func ServiceURL(service *v1.Service, ip NodeIP) (*url.URL, error)
- func WaitForContainerReady(ctx context.Context, client Client, pod *v1.Pod, ref reference.Named) (v1.ContainerStatus, error)
- type BufferCloser
- type Client
- type Env
- type FakeK8sClient
- func (c *FakeK8sClient) ConnectedToCluster(ctx context.Context) error
- func (c *FakeK8sClient) ContainerLogs(ctx context.Context, pID PodID, cName container.Name, n Namespace, ...) (io.ReadCloser, error)
- func (c *FakeK8sClient) Delete(ctx context.Context, entities []K8sEntity) error
- func (c *FakeK8sClient) FindAppByNode(ctx context.Context, nodeID NodeID, appName string, ...) (PodID, error)
- func (c *FakeK8sClient) ForwardPort(ctx context.Context, namespace Namespace, podID PodID, ...) (int, func(), error)
- func (c *FakeK8sClient) GetNodeForPod(ctx context.Context, podID PodID) (NodeID, error)
- func (c *FakeK8sClient) PodByID(ctx context.Context, pID PodID, n Namespace) (*v1.Pod, error)
- func (c *FakeK8sClient) PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, ...) ([]v1.Pod, error)
- func (c *FakeK8sClient) PollForPodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, ...) ([]v1.Pod, error)
- func (c *FakeK8sClient) SetLogs(logs string)
- func (c *FakeK8sClient) SetPodsWithImageResp(pID PodID)
- func (c *FakeK8sClient) SetPollForPodsWithImageDelay(dur time.Duration)
- func (c *FakeK8sClient) Upsert(ctx context.Context, entities []K8sEntity) error
- func (c *FakeK8sClient) WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error)
- func (c *FakeK8sClient) WatchPods(ctx context.Context, lps []LabelPair) (<-chan *v1.Pod, error)
- func (c *FakeK8sClient) WatchServices(ctx context.Context, lps []LabelPair) (<-chan *v1.Service, error)
- type FindAppByNodeOptions
- type K8sClient
- func (k K8sClient) ConnectedToCluster(ctx context.Context) error
- func (k K8sClient) ContainerLogs(ctx context.Context, pID PodID, cName container.Name, n Namespace, ...) (io.ReadCloser, error)
- func (k K8sClient) Delete(ctx context.Context, entities []K8sEntity) error
- func (k K8sClient) FindAppByNode(ctx context.Context, nodeID NodeID, appName string, ...) (PodID, error)
- func (k K8sClient) ForwardPort(ctx context.Context, namespace Namespace, podID PodID, ...) (localPort int, closer func(), err error)
- func (k K8sClient) GetNodeForPod(ctx context.Context, podID PodID) (NodeID, error)
- func (k K8sClient) PodByID(ctx context.Context, pID PodID, n Namespace) (*v1.Pod, error)
- func (k K8sClient) PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, ...) ([]v1.Pod, error)
- func (k K8sClient) PollForPodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, ...) ([]v1.Pod, error)
- func (k K8sClient) Upsert(ctx context.Context, entities []K8sEntity) error
- func (k K8sClient) WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error)
- func (kCli K8sClient) WatchPods(ctx context.Context, lps []LabelPair) (<-chan *v1.Pod, error)
- func (kCli K8sClient) WatchServices(ctx context.Context, lps []LabelPair) (<-chan *v1.Service, error)
- type K8sEntity
- func Filter(entities []K8sEntity, test func(e K8sEntity) (bool, error)) (passing, rest []K8sEntity, err error)
- func FilterByImage(entities []K8sEntity, img reference.Named) (passing, rest []K8sEntity, err error)
- func FilterByLabels(entities []K8sEntity, labels map[string]string) (passing, rest []K8sEntity, err error)
- func ImmutableEntities(entities []K8sEntity) []K8sEntity
- func InjectImageDigest(entity K8sEntity, injectRef reference.Named, policy v1.PullPolicy) (K8sEntity, bool, error)
- func InjectImagePullPolicy(entity K8sEntity, policy v1.PullPolicy) (K8sEntity, error)
- func InjectLabels(entity K8sEntity, labels []LabelPair) (K8sEntity, error)
- func MutableEntities(entities []K8sEntity) []K8sEntity
- func ParseYAML(k8sYaml io.Reader) ([]K8sEntity, error)
- func ParseYAMLFromString(yaml string) ([]K8sEntity, error)
- func (e K8sEntity) DeepCopy() K8sEntity
- func (e K8sEntity) FindImages() ([]reference.Named, error)
- func (e K8sEntity) HasImage(image reference.Named) (bool, error)
- func (e K8sEntity) ImmutableOnceCreated() bool
- func (e K8sEntity) MatchesLabels(labels map[string]string) bool
- func (e K8sEntity) Name() string
- func (e K8sEntity) Namespace() Namespace
- type LabelPair
- type LoadBalancer
- type LoadBalancerSpec
- type MultipleAppsFoundError
- type Namespace
- type NodeID
- type NodeIP
- type PodID
- type PortForwarder
- type ServiceName
Constants ¶
const ( EnvUnknown Env = "unknown" EnvGKE = "gke" EnvMinikube = "minikube" EnvDockerDesktop = "docker-for-desktop" EnvMicroK8s = "microk8s" )
const ContainerIDPrefix = "docker://"
const DefaultNamespace = Namespace("default")
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 ContainerIDFromContainerStatus ¶
func ContainerIDFromContainerStatus(status v1.ContainerStatus) (container.ID, error)
func ContainerMatching ¶
func ContainerNameFromContainerStatus ¶
func ContainerNameFromContainerStatus(status v1.ContainerStatus) container.Name
func ContainerSpecOf ¶
func ExtractPodTemplateSpec ¶ added in v0.1.0
func ExtractPodTemplateSpec(obj interface{}) ([]*v1.PodTemplateSpec, error)
func ExtractPods ¶
func FakePodSpec ¶
func FakePodSpec(image reference.NamedTagged) v1.PodSpec
func FakePodStatus ¶
func FakePodStatus(image reference.NamedTagged, phase string) v1.PodStatus
func FindImageNamedTaggedMatching ¶ added in v0.2.0
func FindImageRefMatching ¶ added in v0.2.0
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 ¶
Returns the error message if the pod is unschedulable
func ProvideCoreInterface ¶
func ProvideCoreInterface(cfg *rest.Config) (apiv1.CoreV1Interface, error)
func ProvideRESTClient ¶
func ProvideRESTClient(cfg *rest.Config) (apiv1.CoreV1Interface, error)
func ProvideRESTConfig ¶
func SerializeYAML ¶
Types ¶
type BufferCloser ¶
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. // // Currently ignores any "not found" errors, because that seems like the correct // behavior for our use cases. 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 container.Name, n Namespace, startTime time.Time) (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) // 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) ConnectedToCluster(ctx context.Context) error }
type FakeK8sClient ¶
type FakeK8sClient struct { Yaml string DeletedYaml string Lb LoadBalancerSpec PodsWithImageResp PodID PodsWithImageError error PollForPodsWithImageDelay time.Duration LastPodQueryNamespace Namespace LastPodQueryImage reference.NamedTagged PodLogs BufferCloser ContainerLogsError error LastForwardPortPodID PodID LastForwardPortRemotePort int UpsertError error }
func NewFakeK8sClient ¶
func NewFakeK8sClient() *FakeK8sClient
func (*FakeK8sClient) ConnectedToCluster ¶ added in v0.2.0
func (c *FakeK8sClient) ConnectedToCluster(ctx context.Context) error
func (*FakeK8sClient) ContainerLogs ¶
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 (*FakeK8sClient) GetNodeForPod ¶
func (*FakeK8sClient) PodsWithImage ¶
func (c *FakeK8sClient) PodsWithImage(ctx context.Context, image reference.NamedTagged, n Namespace, labels []LabelPair) ([]v1.Pod, error)
func (*FakeK8sClient) PollForPodsWithImage ¶
func (*FakeK8sClient) SetLogs ¶ added in v0.2.0
func (c *FakeK8sClient) SetLogs(logs string)
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) WatchServices ¶
type FindAppByNodeOptions ¶
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) ConnectedToCluster ¶ added in v0.2.0
func (K8sClient) ContainerLogs ¶
func (K8sClient) Delete ¶
Deletes all given entities.
Currently ignores any "not found" errors, because that seems like the correct behavior for our use cases.
func (K8sClient) FindAppByNode ¶
func (K8sClient) ForwardPort ¶
func (K8sClient) GetNodeForPod ¶
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 ¶
type K8sEntity ¶
type K8sEntity struct { Obj runtime.Object Kind *schema.GroupVersionKind }
func Filter ¶ added in v0.1.0
func Filter(entities []K8sEntity, test func(e K8sEntity) (bool, error)) (passing, rest []K8sEntity, err error)
Filter returns two slices of entities: those passing the given test, and the remainder of the input.
func FilterByImage ¶ added in v0.1.0
func FilterByLabels ¶ added in v0.1.0
func ImmutableEntities ¶
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 MutableEntities ¶
func ParseYAML ¶
Parse the YAML into entities. Loosely based on https://github.com/kubernetes/cli-runtime/blob/d6a36215b15f83b94578f2ffce5d00447972e8ae/pkg/genericclioptions/resource/visitor.go#L583
func ParseYAMLFromString ¶
func (K8sEntity) FindImages ¶ added in v0.4.1
func (K8sEntity) HasImage ¶ added in v0.1.0
HasImage indicates whether the given entity is tagged with the given image.
func (K8sEntity) ImmutableOnceCreated ¶
Most entities can be updated once running, but a few cannot.
func (K8sEntity) MatchesLabels ¶ added in v0.1.0
MatchesLevel indicates whether the selector of the given entity matches the given label(s). Currently only supports Services, but may be expanded to support other types that match pods via selectors.
type LoadBalancer ¶
type LoadBalancer struct { Spec LoadBalancerSpec URL *url.URL }
type LoadBalancerSpec ¶
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 NodeIP ¶ added in v0.1.0
type NodeIP string
Some K8s environments expose a single IP for the whole cluster.
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