in cmd/aks-node-viewer/main.go [110:184]
func startMonitor(ctx context.Context, settings *monitorSettings) {
podWatchList := cache.NewListWatchFromClient(settings.clientset.CoreV1().RESTClient(), "pods",
v1.NamespaceAll, fields.Everything())
cluster := settings.model.Cluster()
_, podController := cache.NewInformer(
podWatchList,
&v1.Pod{},
time.Second*0,
cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
p := obj.(*v1.Pod)
if !isTerminalPod(p) {
cluster.AddPod(model.NewPod(p), settings.pricing)
}
},
DeleteFunc: func(obj interface{}) {
p := obj.(*v1.Pod)
cluster.DeletePod(p.Namespace, p.Name)
},
UpdateFunc: func(oldObj, newObj interface{}) {
p := newObj.(*v1.Pod)
if isTerminalPod(p) {
cluster.DeletePod(p.Namespace, p.Name)
} else {
pod, ok := cluster.GetPod(p.Namespace, p.Name)
if !ok {
cluster.AddPod(model.NewPod(p), settings.pricing)
} else {
pod.Update(p)
cluster.AddPod(pod, settings.pricing)
}
}
},
},
)
go podController.Run(ctx.Done())
nodeWatchList := cache.NewFilteredListWatchFromClient(settings.clientset.CoreV1().RESTClient(), "nodes",
v1.NamespaceAll, func(options *metav1.ListOptions) {
options.LabelSelector = settings.nodeSelector.String()
})
_, controller := cache.NewInformer(
nodeWatchList,
&v1.Node{},
time.Second*0,
cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
node := model.NewNode(obj.(*v1.Node))
node.UpdatePrice(settings.pricing)
n := cluster.AddNode(node)
n.Show()
},
DeleteFunc: func(obj interface{}) {
cluster.DeleteNode(obj.(*v1.Node).Name)
},
UpdateFunc: func(oldObj, newObj interface{}) {
n := newObj.(*v1.Node)
if !n.DeletionTimestamp.IsZero() && len(n.Finalizers) == 0 {
cluster.DeleteNode(n.Name)
} else {
node, ok := cluster.GetNode(n.Name)
if !ok {
log.Println("unable to find node", n.Name)
} else {
node.Update(n)
}
node.Show()
}
},
},
)
go controller.Run(ctx.Done())
}