github.com/grahambrereton-form3/tilt@v0.10.18/internal/k8s/pod.go (about) 1 package k8s 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "time" 8 9 v1 "k8s.io/api/core/v1" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/watch" 12 13 "github.com/windmilleng/tilt/internal/container" 14 ) 15 16 func (k K8sClient) WatchPod(ctx context.Context, pod *v1.Pod) (watch.Interface, error) { 17 podAPI := k.core.Pods(NamespaceFromPod(pod).String()) 18 podID := PodIDFromPod(pod) 19 fieldSelector := fmt.Sprintf("metadata.name=%s", podID) 20 watchOptions := metav1.ListOptions{ 21 FieldSelector: fieldSelector, 22 Watch: true, 23 ResourceVersion: pod.ObjectMeta.ResourceVersion, 24 } 25 return podAPI.Watch(watchOptions) 26 } 27 28 func (k K8sClient) ContainerLogs(ctx context.Context, pID PodID, cName container.Name, n Namespace, startWatchTime time.Time) (io.ReadCloser, error) { 29 options := &v1.PodLogOptions{ 30 Container: cName.String(), 31 Follow: true, 32 SinceTime: &metav1.Time{ 33 Time: startWatchTime, 34 }, 35 } 36 req := k.core.Pods(n.String()).GetLogs(pID.String(), options) 37 return req.Stream() 38 } 39 40 func (k K8sClient) PodByID(ctx context.Context, pID PodID, n Namespace) (*v1.Pod, error) { 41 pod, err := k.core.Pods(n.String()).Get(pID.String(), metav1.GetOptions{}) 42 if pod != nil { 43 FixContainerStatusImages(pod) 44 } 45 return pod, err 46 } 47 48 func PodIDFromPod(pod *v1.Pod) PodID { 49 return PodID(pod.ObjectMeta.Name) 50 } 51 52 func NamespaceFromPod(pod *v1.Pod) Namespace { 53 return Namespace(pod.ObjectMeta.Namespace) 54 } 55 56 func NodeIDFromPod(pod *v1.Pod) NodeID { 57 return NodeID(pod.Spec.NodeName) 58 }