Skip to content

Instantly share code, notes, and snippets.

@91pavan
Last active August 25, 2020 20:42
Show Gist options
  • Save 91pavan/55f3c04e29a910da08479ae1d56c4e58 to your computer and use it in GitHub Desktop.
Save 91pavan/55f3c04e29a910da08479ae1d56c4e58 to your computer and use it in GitHub Desktop.
Watching for any Istio CRD updates (add,delete,update) in Go
package main
import (
"fmt"
"flag"
"time"
"istio.io/client-go/pkg/apis/networking/v1alpha3"
"sigs.k8s.io/controller-runtime/pkg/client/config"
versionedclient "istio.io/client-go/pkg/clientset/versioned"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/util/workqueue"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// initialize config
config, err := clientcmd.BuildConfigFromFlags("", "")
if err != nil {
panic(err.Error())
}
// k8s clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// istio clientset
resourceClientSet, err := versionedclient.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// initialize a workqueue
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter())
// watch for all service entry events
watchlist := cache.NewListWatchFromClient(
resourceClientSet.NetworkingV1alpha3().RESTClient(),
string("serviceentries"),
v1.NamespaceAll,
fields.Everything(),
)
_, controller := cache.NewInformer(
watchlist,
&v1.Service{},
0, //Duration is int64
cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
o, ok := obj.(*v1alpha3.ServiceEntry)
if ok {
// do stuff
// add it to a queue for later processing
queue.Add(o)
}
fmt.Printf("service added: %v \n", obj)
},
DeleteFunc: func(obj interface{}) {
o, ok := obj.(*v1alpha3.ServiceEntry)
if ok {
// do stuff
fmt.Printf("service deleted: %v", obj)
}
},
UpdateFunc: func(oldObj, newObj interface{}) {
o, ok := obj.(*v1alpha3.ServiceEntry)
if ok {
// do stuff
fmt.Printf("service changed %v", obj)
}
},
},
)
// create a stop channel
stop := make(chan struct{})
defer close(stop)
go controller.Run(stop)
// run forever
for {
time.Sleep(time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment