In part 4, we looked in some detail at the
struct, in isolation, which turns logical “add this object, please” requests into “add an event representing an object addition” operation. That concluded our structural walkthrough of the
tools/cache package. There’s obviously a lot more to look at in terms of behavior, but it’s worth pausing at this point to show the big picture.
In the following diagram, you’ll see an unapologetically rough-and-ready mix of plain-Jane, vanilla UML, some Java concepts, some Go type names—in short, a hodgepodge of notation that should prove helpful in displaying the overall package at a high level. Again, this is not a one-for-one representation of Go structures, or Java classes, or anything else, but a mix of helpful nouns and boxes and lines that sketches out the general shape of the
tools/cache package and hopefully gives a serviceable structural overview of the whole thing:
In general, and I’ve probably been inconsistent, orange boxes represent concepts or structures that comprise the
tools/cache framework which users are expected to understand or use directly. Pink boxes represent implementation concerns. Light blue boxes represent things directly related to Kubernetes. I’ve tried to use UML properly for everything else. Most, but not all, names are close enough to the Go code that searching for them in one fashion or another should help you navigate all the
To process this big picture, you can print it out and read the previous posts in this series starting with part 0. Start pictorially with the SharedIndexInformer concept/class and follow the arrows.
Textually, a SharedIndexInformer “is a” SharedInformer, which manages a Controller, and, indirectly a Reflector, that uses a Kubernetes client and a ListerWatcher implementation to update a particular kind of Store, namely a DeltaFIFO, with logical events representing modifications, additions and deletions made to listed and watched Kubernetes resources. The Store it returns from its
getStore() method, is actually an Indexer, implemented via the
cache type in the Go code. (Note in particular that its
getStore() method returns the return value of its
getIndexer() method, which means notably that the Store that the caller has access to is not the DeltaFIFO that it updates internally as an implementation concern. Also remember that at any given point if you have a Store of any kind in your hands there may be only certain functions you are allowed to call.)