mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2024-12-14 11:57:51 +00:00
Rename nfd-topology-gc to nfd-gc
This is preparation for making it a generic garbage collector for all nfd-managed api objects.
This commit is contained in:
parent
e0c477090b
commit
01c08d67b6
5 changed files with 26 additions and 26 deletions
|
@ -24,13 +24,13 @@ import (
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
nfdtopologygarbagecollector "sigs.k8s.io/node-feature-discovery/pkg/nfd-topology-gc"
|
nfdgarbagecollector "sigs.k8s.io/node-feature-discovery/pkg/nfd-gc"
|
||||||
"sigs.k8s.io/node-feature-discovery/pkg/version"
|
"sigs.k8s.io/node-feature-discovery/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// ProgramName is the canonical name of this program
|
// ProgramName is the canonical name of this program
|
||||||
ProgramName = "nfd-topology-gc"
|
ProgramName = "nfd-gc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -50,10 +50,10 @@ func main() {
|
||||||
klog.InfoS("version not set! Set -ldflags \"-X sigs.k8s.io/node-feature-discovery/pkg/version.version=`git describe --tags --dirty --always`\" during build or run.")
|
klog.InfoS("version not set! Set -ldflags \"-X sigs.k8s.io/node-feature-discovery/pkg/version.version=`git describe --tags --dirty --always`\" during build or run.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get new TopologyGC instance
|
// Get new garbage collector instance
|
||||||
gc, err := nfdtopologygarbagecollector.New(args)
|
gc, err := nfdgarbagecollector.New(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.ErrorS(err, "failed to initialize topology garbage collector instance")
|
klog.ErrorS(err, "failed to initialize nfd garbage collector instance")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseArgs(flags *flag.FlagSet, osArgs ...string) *nfdtopologygarbagecollector.Args {
|
func parseArgs(flags *flag.FlagSet, osArgs ...string) *nfdgarbagecollector.Args {
|
||||||
args := initFlags(flags)
|
args := initFlags(flags)
|
||||||
|
|
||||||
_ = flags.Parse(osArgs)
|
_ = flags.Parse(osArgs)
|
||||||
|
@ -76,11 +76,11 @@ func parseArgs(flags *flag.FlagSet, osArgs ...string) *nfdtopologygarbagecollect
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
func initFlags(flagset *flag.FlagSet) *nfdtopologygarbagecollector.Args {
|
func initFlags(flagset *flag.FlagSet) *nfdgarbagecollector.Args {
|
||||||
args := &nfdtopologygarbagecollector.Args{}
|
args := &nfdgarbagecollector.Args{}
|
||||||
|
|
||||||
flagset.DurationVar(&args.GCPeriod, "gc-interval", time.Duration(1)*time.Hour,
|
flagset.DurationVar(&args.GCPeriod, "gc-interval", time.Duration(1)*time.Hour,
|
||||||
"Interval between which Garbage Collector will try to cleanup any missed but already obsolete NodeResourceTopology. [Default: 1h]")
|
"interval between cleanup of obsolete api objects")
|
||||||
flagset.StringVar(&args.Kubeconfig, "kubeconfig", "",
|
flagset.StringVar(&args.Kubeconfig, "kubeconfig", "",
|
||||||
"Kubeconfig to use")
|
"Kubeconfig to use")
|
||||||
|
|
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package nfdtopologygarbagecollector
|
package nfdgarbagecollector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -42,19 +42,19 @@ type Args struct {
|
||||||
Kubeconfig string
|
Kubeconfig string
|
||||||
}
|
}
|
||||||
|
|
||||||
type TopologyGC interface {
|
type NfdGarbageCollector interface {
|
||||||
Run() error
|
Run() error
|
||||||
Stop()
|
Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
type topologyGC struct {
|
type nfdGarbageCollector struct {
|
||||||
stopChan chan struct{}
|
stopChan chan struct{}
|
||||||
topoClient topologyclientset.Interface
|
topoClient topologyclientset.Interface
|
||||||
gcPeriod time.Duration
|
gcPeriod time.Duration
|
||||||
factory informers.SharedInformerFactory
|
factory informers.SharedInformerFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(args *Args) (TopologyGC, error) {
|
func New(args *Args) (NfdGarbageCollector, error) {
|
||||||
kubeconfig, err := apihelper.GetKubeconfig(args.Kubeconfig)
|
kubeconfig, err := apihelper.GetKubeconfig(args.Kubeconfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -62,10 +62,10 @@ func New(args *Args) (TopologyGC, error) {
|
||||||
|
|
||||||
stop := make(chan struct{})
|
stop := make(chan struct{})
|
||||||
|
|
||||||
return newTopologyGC(kubeconfig, stop, args.GCPeriod)
|
return newNfdGarbageCollector(kubeconfig, stop, args.GCPeriod)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTopologyGC(config *restclient.Config, stop chan struct{}, gcPeriod time.Duration) (*topologyGC, error) {
|
func newNfdGarbageCollector(config *restclient.Config, stop chan struct{}, gcPeriod time.Duration) (*nfdGarbageCollector, error) {
|
||||||
helper := apihelper.K8sHelpers{Kubeconfig: config}
|
helper := apihelper.K8sHelpers{Kubeconfig: config}
|
||||||
cli, err := helper.GetTopologyClient()
|
cli, err := helper.GetTopologyClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -75,7 +75,7 @@ func newTopologyGC(config *restclient.Config, stop chan struct{}, gcPeriod time.
|
||||||
clientset := kubernetes.NewForConfigOrDie(config)
|
clientset := kubernetes.NewForConfigOrDie(config)
|
||||||
factory := informers.NewSharedInformerFactory(clientset, 5*time.Minute)
|
factory := informers.NewSharedInformerFactory(clientset, 5*time.Minute)
|
||||||
|
|
||||||
return &topologyGC{
|
return &nfdGarbageCollector{
|
||||||
topoClient: cli,
|
topoClient: cli,
|
||||||
stopChan: stop,
|
stopChan: stop,
|
||||||
gcPeriod: gcPeriod,
|
gcPeriod: gcPeriod,
|
||||||
|
@ -83,7 +83,7 @@ func newTopologyGC(config *restclient.Config, stop chan struct{}, gcPeriod time.
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *topologyGC) deleteNRT(nodeName string) {
|
func (n *nfdGarbageCollector) deleteNRT(nodeName string) {
|
||||||
if err := n.topoClient.TopologyV1alpha2().NodeResourceTopologies().Delete(context.TODO(), nodeName, metav1.DeleteOptions{}); err != nil {
|
if err := n.topoClient.TopologyV1alpha2().NodeResourceTopologies().Delete(context.TODO(), nodeName, metav1.DeleteOptions{}); err != nil {
|
||||||
if errors.IsNotFound(err) {
|
if errors.IsNotFound(err) {
|
||||||
klog.V(2).InfoS("NodeResourceTopology not found, omitting deletion", "nodeName", nodeName)
|
klog.V(2).InfoS("NodeResourceTopology not found, omitting deletion", "nodeName", nodeName)
|
||||||
|
@ -96,7 +96,7 @@ func (n *topologyGC) deleteNRT(nodeName string) {
|
||||||
klog.InfoS("NodeResourceTopology object has been deleted", "nodeName", nodeName)
|
klog.InfoS("NodeResourceTopology object has been deleted", "nodeName", nodeName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *topologyGC) deleteNodeHandler(object interface{}) {
|
func (n *nfdGarbageCollector) deleteNodeHandler(object interface{}) {
|
||||||
// handle a case when we are starting up and need to clear stale NRT resources
|
// handle a case when we are starting up and need to clear stale NRT resources
|
||||||
obj := object
|
obj := object
|
||||||
if deletedFinalStateUnknown, ok := object.(cache.DeletedFinalStateUnknown); ok {
|
if deletedFinalStateUnknown, ok := object.(cache.DeletedFinalStateUnknown); ok {
|
||||||
|
@ -114,7 +114,7 @@ func (n *topologyGC) deleteNodeHandler(object interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// garbageCollect removes all stale API objects
|
// garbageCollect removes all stale API objects
|
||||||
func (n *topologyGC) garbageCollect() {
|
func (n *nfdGarbageCollector) garbageCollect() {
|
||||||
klog.InfoS("performing garbage collection")
|
klog.InfoS("performing garbage collection")
|
||||||
nodes, err := n.factory.Core().V1().Nodes().Lister().List(labels.Everything())
|
nodes, err := n.factory.Core().V1().Nodes().Lister().List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -145,7 +145,7 @@ func (n *topologyGC) garbageCollect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// periodicGC runs garbage collector at every gcPeriod to make sure we haven't missed any node
|
// periodicGC runs garbage collector at every gcPeriod to make sure we haven't missed any node
|
||||||
func (n *topologyGC) periodicGC(gcPeriod time.Duration) {
|
func (n *nfdGarbageCollector) periodicGC(gcPeriod time.Duration) {
|
||||||
// Do initial round of garbage collection at startup time
|
// Do initial round of garbage collection at startup time
|
||||||
n.garbageCollect()
|
n.garbageCollect()
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ func (n *topologyGC) periodicGC(gcPeriod time.Duration) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *topologyGC) startNodeInformer() error {
|
func (n *nfdGarbageCollector) startNodeInformer() error {
|
||||||
nodeInformer := n.factory.Core().V1().Nodes().Informer()
|
nodeInformer := n.factory.Core().V1().Nodes().Informer()
|
||||||
|
|
||||||
if _, err := nodeInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
|
if _, err := nodeInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
@ -179,7 +179,7 @@ func (n *topologyGC) startNodeInformer() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run is a blocking function that removes stale NRT objects when Node is deleted and runs periodic GC to make sure any obsolete objects are removed
|
// Run is a blocking function that removes stale NRT objects when Node is deleted and runs periodic GC to make sure any obsolete objects are removed
|
||||||
func (n *topologyGC) Run() error {
|
func (n *nfdGarbageCollector) Run() error {
|
||||||
if err := n.startNodeInformer(); err != nil {
|
if err := n.startNodeInformer(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -189,6 +189,6 @@ func (n *topologyGC) Run() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *topologyGC) Stop() {
|
func (n *nfdGarbageCollector) Stop() {
|
||||||
close(n.stopChan)
|
close(n.stopChan)
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package nfdtopologygarbagecollector
|
package nfdgarbagecollector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -93,7 +93,7 @@ func TestNRTGC(t *testing.T) {
|
||||||
func newMockGC(nodes, nrts []string) *mockGC {
|
func newMockGC(nodes, nrts []string) *mockGC {
|
||||||
k8sClient := fakek8sclientset.NewSimpleClientset(createFakeNodes(nodes...)...)
|
k8sClient := fakek8sclientset.NewSimpleClientset(createFakeNodes(nodes...)...)
|
||||||
return &mockGC{
|
return &mockGC{
|
||||||
topologyGC: topologyGC{
|
nfdGarbageCollector: nfdGarbageCollector{
|
||||||
factory: informers.NewSharedInformerFactory(k8sClient, 5*time.Minute),
|
factory: informers.NewSharedInformerFactory(k8sClient, 5*time.Minute),
|
||||||
topoClient: faketopologyv1alpha2.NewSimpleClientset(createFakeNRTs(nrts...)...),
|
topoClient: faketopologyv1alpha2.NewSimpleClientset(createFakeNRTs(nrts...)...),
|
||||||
stopChan: make(chan struct{}, 1),
|
stopChan: make(chan struct{}, 1),
|
||||||
|
@ -126,7 +126,7 @@ func createFakeNRTs(names ...string) []runtime.Object {
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockGC struct {
|
type mockGC struct {
|
||||||
topologyGC
|
nfdGarbageCollector
|
||||||
|
|
||||||
k8sClient k8sclientset.Interface
|
k8sClient k8sclientset.Interface
|
||||||
}
|
}
|
Loading…
Reference in a new issue