Repository: kubernetes-sigs/node-feature-discovery
Pull request #1050 (2023-02-06 10:13:13)

Change nfd-worker to use Ticker instead of After.
This pull request changes the nfd-worker to use `time.Ticker` instead of `time.After` to implement  `core.sleepInterval`. An infinite interval is represented by stopping the Ticker.

Issue: https://github.com/kubernetes-sigs/node-feature-discovery/issues/899

k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/1050#" title="Author self-approved">VillePihlava</a>*
**Once this PR has been reviewed and has the lgtm label**, please assign marquiz for approval by writing `/assign @marquiz` in a comment. For more information see [the Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["marquiz"]} -->
linux-foundation-easycla[bot]:  <a href="https://api.easycla.lfx.linuxfoundation.org/v2/repository-provider/github/sign/20677499/63999998/1050/#/?version=2"><img src="https://s3.amazonaws.com/cla-project-logo-prod/cla-not-signed.svg" alt="CLA Not Signed" align="left" height="28" width="328"></a><br/><br /><ul><li><a href='https://api.easycla.lfx.linuxfoundation.org/v2/repository-provider/github/sign/20677499/63999998/1050/#/?version=2' target='_blank'>:x:</a> - login: @VillePihlava / name: Ville Pihlava . The commit (4d1fe19ac229b3f8a7efedc07b55efc368b72910) is not authorized under a signed CLA. <a href='https://api.easycla.lfx.linuxfoundation.org/v2/repository-provider/github/sign/20677499/63999998/1050/#/?version=2' target='_blank'>Please click here to be authorized</a>. For further assistance with EasyCLA, <a href='https://jira.linuxfoundation.org/servicedesk/customer/portal/4' target='_blank'>please submit a support request ticket</a>.</li></ul>
netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *kubernetes-sigs-nfd* processing.


|  Name | Link |
|---------------------------------|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 4d1fe19ac229b3f8a7efedc07b55efc368b72910 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/kubernetes-sigs-nfd/deploys/63e0d2bb2c095800089b1054 |
k8s-ci-robot: Welcome @VillePihlava! <br><br>It looks like this is your first PR to <a href='https://github.com/kubernetes-sigs/node-feature-discovery'>kubernetes-sigs/node-feature-discovery</a> 🎉. Please refer to our [pull request process documentation](https://git.k8s.io/community/contributors/guide/pull-requests.md) to help your PR have a smooth ride to approval. <br><br>You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. [Here is the bot commands documentation](https://go.k8s.io/bot-commands). <br><br>You can also check if kubernetes-sigs/node-feature-discovery has [its own contribution guidelines](https://github.com/kubernetes-sigs/node-feature-discovery/tree/master/CONTRIBUTING.md). <br><br>You may want to refer to our [testing guide](https://git.k8s.io/community/contributors/devel/sig-testing/testing.md) if you run into trouble with your tests not passing. <br><br>If you are having difficulty getting your pull request seen, please follow the [recommended escalation practices](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#why-is-my-pull-request-not-getting-reviewed). Also, for tips and tricks in the contribution process you may want to read the [Kubernetes contributor cheat sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet/README.md). We want to make sure your contribution gets all the attention it needs! <br><br>Thank you, and welcome to Kubernetes. :smiley:
k8s-ci-robot: Hi @VillePihlava. Thanks for your PR.

I'm waiting for a [kubernetes-sigs](https://github.com/orgs/kubernetes-sigs/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://git.k8s.io/community/community-membership.md#member) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/1050#" title="Author self-approved">VillePihlava</a>*
**Once this PR has been reviewed and has the lgtm label**, please ask for approval from marquiz by writing `/assign @marquiz` in a comment. For more information see [the Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["marquiz"]} -->
ArangoGutierrez: /assign @marquiz
VillePihlava: > Looks good. Can you perhaps squash the commits?

Done
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/1050#" title="Author self-approved">VillePihlava</a>*
**Once this PR has been reviewed and has the lgtm label**, please ask for approval from marquiz. For more information see [the Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["marquiz"]} -->
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/1050#pullrequestreview-1290634884" title="Approved">marquiz</a>*, *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/1050#" title="Author self-approved">VillePihlava</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/OWNERS)~~ [marquiz]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
marquiz: /assign @ArangoGutierrez 

Patch:
diff --git a/deployment/base/master-worker-combined/master-worker-daemonset.yaml b/deployment/base/master-worker-combined/master-worker-daemonset.yaml
index ac9ff8e78..e05faf5d3 100644
--- a/deployment/base/master-worker-combined/master-worker-daemonset.yaml
+++ b/deployment/base/master-worker-combined/master-worker-daemonset.yaml
@@ -14,7 +14,6 @@ spec:
         app: nfd
     spec:
       serviceAccount: nfd-master
-      enableServiceLinks: false
       tolerations: []
       containers:
       - name: nfd-master
diff --git a/deployment/base/master/master-deployment.yaml b/deployment/base/master/master-deployment.yaml
index bb0e9979f..aa88f66f0 100644
--- a/deployment/base/master/master-deployment.yaml
+++ b/deployment/base/master/master-deployment.yaml
@@ -15,7 +15,6 @@ spec:
         app: nfd-master
     spec:
       serviceAccount: nfd-master
-      enableServiceLinks: false
       tolerations: []
       containers:
         - name: nfd-master
diff --git a/deployment/base/noderesourcetopologies-crd/noderesourcetopologies.yaml b/deployment/base/noderesourcetopologies-crd/noderesourcetopologies.yaml
index 2f3a9c11b..b8f81214f 100644
--- a/deployment/base/noderesourcetopologies-crd/noderesourcetopologies.yaml
+++ b/deployment/base/noderesourcetopologies-crd/noderesourcetopologies.yaml
@@ -3,7 +3,7 @@ kind: CustomResourceDefinition
 metadata:
   annotations:
     api-approved.kubernetes.io: https://github.com/kubernetes/enhancements/pull/1870
-    controller-gen.kubebuilder.io/version: v0.11.2
+    controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
   name: noderesourcetopologies.topology.node.k8s.io
 spec:
@@ -134,137 +134,10 @@ spec:
         - zones
         type: object
     served: true
-    storage: false
-  - name: v1alpha2
-    schema:
-      openAPIV3Schema:
-        description: NodeResourceTopology describes node resources and their topology.
-        properties:
-          apiVersion:
-            description: 'APIVersion defines the versioned schema of this representation
-              of an object. Servers should convert recognized schemas to the latest
-              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
-            type: string
-          attributes:
-            description: AttributeList contains an array of AttributeInfo objects.
-            items:
-              description: AttributeInfo contains one attribute of a Zone.
-              properties:
-                name:
-                  type: string
-                value:
-                  type: string
-              required:
-              - name
-              - value
-              type: object
-            type: array
-          kind:
-            description: 'Kind is a string value representing the REST resource this
-              object represents. Servers may infer this from the endpoint the client
-              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-            type: string
-          metadata:
-            type: object
-          topologyPolicies:
-            description: 'DEPRECATED (to be removed in v1beta1): use top level attributes
-              if needed'
-            items:
-              type: string
-            type: array
-          zones:
-            description: ZoneList contains an array of Zone objects.
-            items:
-              description: Zone represents a resource topology zone, e.g. socket,
-                node, die or core.
-              properties:
-                attributes:
-                  description: AttributeList contains an array of AttributeInfo objects.
-                  items:
-                    description: AttributeInfo contains one attribute of a Zone.
-                    properties:
-                      name:
-                        type: string
-                      value:
-                        type: string
-                    required:
-                    - name
-                    - value
-                    type: object
-                  type: array
-                costs:
-                  description: CostList contains an array of CostInfo objects.
-                  items:
-                    description: CostInfo describes the cost (or distance) between
-                      two Zones.
-                    properties:
-                      name:
-                        type: string
-                      value:
-                        format: int64
-                        type: integer
-                    required:
-                    - name
-                    - value
-                    type: object
-                  type: array
-                name:
-                  type: string
-                parent:
-                  type: string
-                resources:
-                  description: ResourceInfoList contains an array of ResourceInfo
-                    objects.
-                  items:
-                    description: ResourceInfo contains information about one resource
-                      type.
-                    properties:
-                      allocatable:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Allocatable quantity of the resource, corresponding
-                          to allocatable in node status, i.e. total amount of this
-                          resource available to be used by pods.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      available:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Available is the amount of this resource currently
-                          available for new (to be scheduled) pods, i.e. Allocatable
-                          minus the resources reserved by currently running pods.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      capacity:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Capacity of the resource, corresponding to capacity
-                          in node status, i.e. total amount of this resource that
-                          the node has.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      name:
-                        description: Name of the resource.
-                        type: string
-                    required:
-                    - allocatable
-                    - available
-                    - capacity
-                    - name
-                    type: object
-                  type: array
-                type:
-                  type: string
-              required:
-              - name
-              - type
-              type: object
-            type: array
-        required:
-        - zones
-        type: object
-    served: true
-    storage: true
\ No newline at end of file
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
diff --git a/deployment/helm/node-feature-discovery/templates/master.yaml b/deployment/helm/node-feature-discovery/templates/master.yaml
index 8c66a7955..7636c910d 100644
--- a/deployment/helm/node-feature-discovery/templates/master.yaml
+++ b/deployment/helm/node-feature-discovery/templates/master.yaml
@@ -27,7 +27,6 @@ spec:
         {{- toYaml . | nindent 8 }}
     {{- end }}
       serviceAccountName: {{ include "node-feature-discovery.master.serviceAccountName" . }}
-      enableServiceLinks: false
       securityContext:
         {{- toYaml .Values.master.podSecurityContext | nindent 8 }}
       containers:
diff --git a/deployment/helm/node-feature-discovery/templates/topologyupdater-crds.yaml b/deployment/helm/node-feature-discovery/templates/topologyupdater-crds.yaml
index b6b919689..cf5daf27b 100644
--- a/deployment/helm/node-feature-discovery/templates/topologyupdater-crds.yaml
+++ b/deployment/helm/node-feature-discovery/templates/topologyupdater-crds.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
 metadata:
   annotations:
     api-approved.kubernetes.io: https://github.com/kubernetes/enhancements/pull/1870
-    controller-gen.kubebuilder.io/version: v0.11.2
+    controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
   name: noderesourcetopologies.topology.node.k8s.io
 spec:
@@ -135,139 +135,6 @@ spec:
         - zones
         type: object
     served: true
-    storage: false
-  - name: v1alpha2
-    schema:
-      openAPIV3Schema:
-        description: NodeResourceTopology describes node resources and their topology.
-        properties:
-          apiVersion:
-            description: 'APIVersion defines the versioned schema of this representation
-              of an object. Servers should convert recognized schemas to the latest
-              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
-            type: string
-          attributes:
-            description: AttributeList contains an array of AttributeInfo objects.
-            items:
-              description: AttributeInfo contains one attribute of a Zone.
-              properties:
-                name:
-                  type: string
-                value:
-                  type: string
-              required:
-              - name
-              - value
-              type: object
-            type: array
-          kind:
-            description: 'Kind is a string value representing the REST resource this
-              object represents. Servers may infer this from the endpoint the client
-              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-            type: string
-          metadata:
-            type: object
-          topologyPolicies:
-            description: 'DEPRECATED (to be removed in v1beta1): use top level attributes
-              if needed'
-            items:
-              type: string
-            type: array
-          zones:
-            description: ZoneList contains an array of Zone objects.
-            items:
-              description: Zone represents a resource topology zone, e.g. socket,
-                node, die or core.
-              properties:
-                attributes:
-                  description: AttributeList contains an array of AttributeInfo objects.
-                  items:
-                    description: AttributeInfo contains one attribute of a Zone.
-                    properties:
-                      name:
-                        type: string
-                      value:
-                        type: string
-                    required:
-                    - name
-                    - value
-                    type: object
-                  type: array
-                costs:
-                  description: CostList contains an array of CostInfo objects.
-                  items:
-                    description: CostInfo describes the cost (or distance) between
-                      two Zones.
-                    properties:
-                      name:
-                        type: string
-                      value:
-                        format: int64
-                        type: integer
-                    required:
-                    - name
-                    - value
-                    type: object
-                  type: array
-                name:
-                  type: string
-                parent:
-                  type: string
-                resources:
-                  description: ResourceInfoList contains an array of ResourceInfo
-                    objects.
-                  items:
-                    description: ResourceInfo contains information about one resource
-                      type.
-                    properties:
-                      allocatable:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Allocatable quantity of the resource, corresponding
-                          to allocatable in node status, i.e. total amount of this
-                          resource available to be used by pods.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      available:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Available is the amount of this resource currently
-                          available for new (to be scheduled) pods, i.e. Allocatable
-                          minus the resources reserved by currently running pods.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      capacity:
-                        anyOf:
-                        - type: integer
-                        - type: string
-                        description: Capacity of the resource, corresponding to capacity
-                          in node status, i.e. total amount of this resource that
-                          the node has.
-                        pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                        x-kubernetes-int-or-string: true
-                      name:
-                        description: Name of the resource.
-                        type: string
-                    required:
-                    - allocatable
-                    - available
-                    - capacity
-                    - name
-                    type: object
-                  type: array
-                type:
-                  type: string
-              required:
-              - name
-              - type
-              type: object
-            type: array
-        required:
-        - zones
-        type: object
-    served: true
     storage: true
 status:
   acceptedNames:
diff --git a/go.mod b/go.mod
index 0c4de8477..d9a714f8b 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
 	github.com/golang/protobuf v1.5.2
 	github.com/google/go-cmp v0.5.9
 	github.com/jaypipes/ghw v0.8.1-0.20210827132705-c7224150a17e
-	github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.1.0
+	github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.0.13
 	github.com/klauspost/cpuid/v2 v2.2.3
 	github.com/onsi/ginkgo/v2 v2.4.0
 	github.com/onsi/gomega v1.23.0
diff --git a/go.sum b/go.sum
index f399d7957..928bf981c 100644
--- a/go.sum
+++ b/go.sum
@@ -420,8 +420,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.1.0 h1:2uCRJbv+A+fmaUaO0wLZ8oYd6cLE1dRzBQcFNxggH3s=
-github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.1.0/go.mod h1:AkACMQGiTgCt0lQw3m7TTU8PLH9lYKNK5e9DqFf5VuM=
+github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.0.13 h1:Y1RjPskyGMkVtNL8lq75bEdjqgq8gi+JJ1oWaz/mIJE=
+github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.0.13/go.mod h1:AkACMQGiTgCt0lQw3m7TTU8PLH9lYKNK5e9DqFf5VuM=
 github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI=
 github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
diff --git a/pkg/nfd-topology-gc/nfd-nrt-gc.go b/pkg/nfd-topology-gc/nfd-nrt-gc.go
index 744d141d0..e59f597bd 100644
--- a/pkg/nfd-topology-gc/nfd-nrt-gc.go
+++ b/pkg/nfd-topology-gc/nfd-nrt-gc.go
@@ -83,7 +83,7 @@ func newTopologyGC(config *restclient.Config, stop chan struct{}, gcPeriod time.
 }
 
 func (n *topologyGC) deleteNRT(nodeName string) {
-	if err := n.topoClient.TopologyV1alpha2().NodeResourceTopologies().Delete(context.TODO(), nodeName, metav1.DeleteOptions{}); err != nil {
+	if err := n.topoClient.TopologyV1alpha1().NodeResourceTopologies().Delete(context.TODO(), nodeName, metav1.DeleteOptions{}); err != nil {
 		if errors.IsNotFound(err) {
 			klog.V(2).Infof("NodeResourceTopology for node %s not found, omitting deletion", nodeName)
 			return
@@ -125,7 +125,7 @@ func (n *topologyGC) runGC() {
 		nodes.Insert(key)
 	}
 
-	nrts, err := n.topoClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+	nrts, err := n.topoClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 	if err != nil {
 		klog.Warningf("cannot list NRTs %s", err.Error())
 		return
diff --git a/pkg/nfd-topology-updater/nfd-topology-updater.go b/pkg/nfd-topology-updater/nfd-topology-updater.go
index 7826a514e..a5b3e2639 100644
--- a/pkg/nfd-topology-updater/nfd-topology-updater.go
+++ b/pkg/nfd-topology-updater/nfd-topology-updater.go
@@ -25,7 +25,7 @@ import (
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/klog/v2"
 
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	v1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 	"golang.org/x/net/context"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -123,7 +123,7 @@ func (w *nfdTopologyUpdater) Run() error {
 	// So we are intentionally do this once during the process lifecycle.
 	// TODO: Obtain node resources dynamically from the podresource API
 	// zonesChannel := make(chan v1alpha1.ZoneList)
-	var zones v1alpha2.ZoneList
+	var zones v1alpha1.ZoneList
 
 	excludeList := resourcemonitor.NewExcludeResourceList(w.config.ExcludeList, w.nodeInfo.nodeName)
 	resAggr, err := resourcemonitor.NewResourcesAggregator(podResClient, excludeList)
@@ -172,15 +172,15 @@ func (w *nfdTopologyUpdater) Stop() {
 	}
 }
 
-func (w *nfdTopologyUpdater) updateNodeResourceTopology(zoneInfo v1alpha2.ZoneList) error {
+func (w *nfdTopologyUpdater) updateNodeResourceTopology(zoneInfo v1alpha1.ZoneList) error {
 	cli, err := w.apihelper.GetTopologyClient()
 	if err != nil {
 		return err
 	}
 
-	nrt, err := cli.TopologyV1alpha2().NodeResourceTopologies().Get(context.TODO(), w.nodeInfo.nodeName, metav1.GetOptions{})
+	nrt, err := cli.TopologyV1alpha1().NodeResourceTopologies().Get(context.TODO(), w.nodeInfo.nodeName, metav1.GetOptions{})
 	if errors.IsNotFound(err) {
-		nrtNew := v1alpha2.NodeResourceTopology{
+		nrtNew := v1alpha1.NodeResourceTopology{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: w.nodeInfo.nodeName,
 			},
@@ -188,7 +188,7 @@ func (w *nfdTopologyUpdater) updateNodeResourceTopology(zoneInfo v1alpha2.ZoneLi
 			TopologyPolicies: []string{w.nodeInfo.tmPolicy},
 		}
 
-		_, err := cli.TopologyV1alpha2().NodeResourceTopologies().Create(context.TODO(), &nrtNew, metav1.CreateOptions{})
+		_, err := cli.TopologyV1alpha1().NodeResourceTopologies().Create(context.TODO(), &nrtNew, metav1.CreateOptions{})
 		if err != nil {
 			return fmt.Errorf("failed to create NodeResourceTopology: %w", err)
 		}
@@ -200,7 +200,7 @@ func (w *nfdTopologyUpdater) updateNodeResourceTopology(zoneInfo v1alpha2.ZoneLi
 	nrtMutated := nrt.DeepCopy()
 	nrtMutated.Zones = zoneInfo
 
-	nrtUpdated, err := cli.TopologyV1alpha2().NodeResourceTopologies().Update(context.TODO(), nrtMutated, metav1.UpdateOptions{})
+	nrtUpdated, err := cli.TopologyV1alpha1().NodeResourceTopologies().Update(context.TODO(), nrtMutated, metav1.UpdateOptions{})
 	if err != nil {
 		return fmt.Errorf("failed to update NodeResourceTopology: %w", err)
 	}
diff --git a/pkg/nfd-worker/nfd-worker.go b/pkg/nfd-worker/nfd-worker.go
index 304eeb698..0a5bb26ee 100644
--- a/pkg/nfd-worker/nfd-worker.go
+++ b/pkg/nfd-worker/nfd-worker.go
@@ -131,6 +131,11 @@ type duration struct {
 	time.Duration
 }
 
+// This ticker can represent infinite and normal intervals.
+type infiniteTicker struct {
+	*time.Ticker
+}
+
 // NewNfdWorker creates new NfdWorker instance.
 func NewNfdWorker(args *Args) (NfdWorker, error) {
 	nfd := &nfdWorker{
@@ -172,6 +177,37 @@ func newDefaultConfig() *NFDConfig {
 	}
 }
 
+func (i *infiniteTicker) Reset(d time.Duration) {
+	switch {
+	case d > 0:
+		i.Ticker.Reset(d)
+	default:
+		// If the sleep interval is not a positive number the ticker will act
+		// as if it was set to an infinite duration by not ticking.
+		i.Ticker.Stop()
+	}
+}
+
+// Run feature discovery.
+func (w *nfdWorker) runFeatureDiscovery() error {
+	for _, s := range w.featureSources {
+		klog.V(2).Infof("running discovery for %q source", s.Name())
+		if err := s.Discover(); err != nil {
+			klog.Errorf("feature discovery of %q source failed: %v", s.Name(), err)
+		}
+	}
+
+	// Get the set of feature labels.
+	labels := createFeatureLabels(w.labelSources, w.config.Core.LabelWhiteList.Regexp)
+
+	// Update the node with the feature labels.
+	if !w.config.Core.NoPublish {
+		return w.advertiseFeatures(labels)
+	}
+
+	return nil
+}
+
 // Run NfdWorker client. Returns if a fatal error is encountered, or, after
 // one request if OneShot is set to 'true' in the worker args.
 func (w *nfdWorker) Run() error {
@@ -196,34 +232,27 @@ func (w *nfdWorker) Run() error {
 
 	defer w.grpcDisconnect()
 
-	labelTrigger := time.After(0)
-	for {
-		select {
-		case <-labelTrigger:
-			// Run feature discovery
-			for _, s := range w.featureSources {
-				klog.V(2).Infof("running discovery for %q source", s.Name())
-				if err := s.Discover(); err != nil {
-					klog.Errorf("feature discovery of %q source failed: %v", s.Name(), err)
-				}
-			}
-
-			// Get the set of feature labels.
-			labels := createFeatureLabels(w.labelSources, w.config.Core.LabelWhiteList.Regexp)
+	// Create ticker for feature discovery and run feature discovery once before the loop.
+	labelTrigger := infiniteTicker{Ticker: time.NewTicker(1)}
+	labelTrigger.Reset(w.config.Core.SleepInterval.Duration)
+	defer labelTrigger.Stop()
 
-			// Update the node with the feature labels.
-			if !w.config.Core.NoPublish {
-				if err := w.advertiseFeatures(labels); err != nil {
-					return err
-				}
-			}
+	err = w.runFeatureDiscovery()
+	if err != nil {
+		return err
+	}
 
-			if w.args.Oneshot {
-				return nil
-			}
+	// Only run feature disovery once if Oneshot is set to 'true'.
+	if w.args.Oneshot {
+		return nil
+	}
 
-			if w.config.Core.SleepInterval.Duration > 0 {
-				labelTrigger = time.After(w.config.Core.SleepInterval.Duration)
+	for {
+		select {
+		case <-labelTrigger.C:
+			err = w.runFeatureDiscovery()
+			if err != nil {
+				return err
 			}
 
 		case <-configWatch.Events:
@@ -238,7 +267,11 @@ func (w *nfdWorker) Run() error {
 
 			// Always re-label after a re-config event. This way the new config
 			// comes into effect even if the sleep interval is long (or infinite)
-			labelTrigger = time.After(0)
+			labelTrigger.Reset(w.config.Core.SleepInterval.Duration)
+			err = w.runFeatureDiscovery()
+			if err != nil {
+				return err
+			}
 
 		case <-w.certWatch.Events:
 			klog.Infof("TLS certificate update, renewing connection to nfd-master")
diff --git a/pkg/resourcemonitor/noderesourcesaggregator.go b/pkg/resourcemonitor/noderesourcesaggregator.go
index be3865a03..12d4676f2 100644
--- a/pkg/resourcemonitor/noderesourcesaggregator.go
+++ b/pkg/resourcemonitor/noderesourcesaggregator.go
@@ -24,7 +24,7 @@ import (
 	"time"
 
 	"github.com/jaypipes/ghw"
-	topologyv1alpha2 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	topologyv1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 	"k8s.io/klog/v2"
@@ -103,7 +103,7 @@ func NewResourcesAggregatorFromData(topo *ghw.TopologyInfo, resp *podresourcesap
 }
 
 // Aggregate provides the mapping (numa zone name) -> Zone from the given PodResources.
-func (noderesourceData *nodeResources) Aggregate(podResData []PodResources) topologyv1alpha2.ZoneList {
+func (noderesourceData *nodeResources) Aggregate(podResData []PodResources) topologyv1alpha1.ZoneList {
 	perNuma := make(map[int]map[corev1.ResourceName]*resourceData)
 	for nodeID := range noderesourceData.topo.Nodes {
 		nodeRes, ok := noderesourceData.perNUMAAllocatable[nodeID]
@@ -168,12 +168,12 @@ func (noderesourceData *nodeResources) Aggregate(podResData []PodResources) topo
 		}
 	}
 
-	zones := make(topologyv1alpha2.ZoneList, 0)
+	zones := make(topologyv1alpha1.ZoneList, 0)
 	for nodeID, resList := range perNuma {
-		zone := topologyv1alpha2.Zone{
+		zone := topologyv1alpha1.Zone{
 			Name:      makeZoneName(nodeID),
 			Type:      "Node",
-			Resources: make(topologyv1alpha2.ResourceInfoList, 0),
+			Resources: make(topologyv1alpha1.ResourceInfoList, 0),
 		}
 
 		costs, err := makeCostsPerNumaNode(noderesourceData.topo.Nodes, nodeID)
@@ -187,7 +187,7 @@ func (noderesourceData *nodeResources) Aggregate(podResData []PodResources) topo
 			allocatableQty := *resource.NewQuantity(resData.allocatable, resource.DecimalSI)
 			capacityQty := *resource.NewQuantity(resData.capacity, resource.DecimalSI)
 			availableQty := *resource.NewQuantity(resData.available, resource.DecimalSI)
-			zone.Resources = append(zone.Resources, topologyv1alpha2.ResourceInfo{
+			zone.Resources = append(zone.Resources, topologyv1alpha1.ResourceInfo{
 				Name:        name.String(),
 				Available:   availableQty,
 				Allocatable: allocatableQty,
@@ -345,15 +345,15 @@ func makeResourceMap(numaNodes int, devices []*podresourcesapi.ContainerDevices)
 }
 
 // makeCostsPerNumaNode builds the cost map to reach all the known NUMA zones (mapping (numa zone) -> cost) starting from the given NUMA zone.
-func makeCostsPerNumaNode(nodes []*ghw.TopologyNode, nodeIDSrc int) ([]topologyv1alpha2.CostInfo, error) {
+func makeCostsPerNumaNode(nodes []*ghw.TopologyNode, nodeIDSrc int) ([]topologyv1alpha1.CostInfo, error) {
 	nodeSrc := findNodeByID(nodes, nodeIDSrc)
 	if nodeSrc == nil {
 		return nil, fmt.Errorf("unknown node: %d", nodeIDSrc)
 	}
-	nodeCosts := make([]topologyv1alpha2.CostInfo, 0)
+	nodeCosts := make([]topologyv1alpha1.CostInfo, 0)
 	for nodeIDDst, dist := range nodeSrc.Distances {
 		// TODO: this assumes there are no holes (= no offline node) in the distance vector
-		nodeCosts = append(nodeCosts, topologyv1alpha2.CostInfo{
+		nodeCosts = append(nodeCosts, topologyv1alpha1.CostInfo{
 			Name:  makeZoneName(nodeIDDst),
 			Value: int64(dist),
 		})
diff --git a/pkg/resourcemonitor/types.go b/pkg/resourcemonitor/types.go
index e079bb612..5b0a4c5fe 100644
--- a/pkg/resourcemonitor/types.go
+++ b/pkg/resourcemonitor/types.go
@@ -21,7 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	topologyv1alpha2 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	topologyv1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 )
 
 // Args stores commandline arguments used for resource monitoring
@@ -60,5 +60,5 @@ type ResourcesScanner interface {
 
 // ResourcesAggregator aggregates resource information based on the received data from underlying hardware and podresource API
 type ResourcesAggregator interface {
-	Aggregate(podResData []PodResources) topologyv1alpha2.ZoneList
+	Aggregate(podResData []PodResources) topologyv1alpha1.ZoneList
 }
diff --git a/pkg/topologypolicy/topology-policy.go b/pkg/topologypolicy/topology-policy.go
index aa723d831..75331f24e 100644
--- a/pkg/topologypolicy/topology-policy.go
+++ b/pkg/topologypolicy/topology-policy.go
@@ -17,49 +17,49 @@ limitations under the License.
 package topologypolicy
 
 import (
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	v1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 	"k8s.io/kubernetes/pkg/kubelet/apis/config"
 )
 
 // DetectTopologyPolicy returns string type which present
 // both Topology manager policy and scope
-func DetectTopologyPolicy(policy string, scope string) v1alpha2.TopologyManagerPolicy {
+func DetectTopologyPolicy(policy string, scope string) v1alpha1.TopologyManagerPolicy {
 	switch scope {
 	case config.PodTopologyManagerScope:
 		return detectPolicyPodScope(policy)
 	case config.ContainerTopologyManagerScope:
 		return detectPolicyContainerScope(policy)
 	default:
-		return v1alpha2.None
+		return v1alpha1.None
 	}
 }
 
-func detectPolicyPodScope(policy string) v1alpha2.TopologyManagerPolicy {
+func detectPolicyPodScope(policy string) v1alpha1.TopologyManagerPolicy {
 	switch policy {
 	case config.SingleNumaNodeTopologyManagerPolicy:
-		return v1alpha2.SingleNUMANodePodLevel
+		return v1alpha1.SingleNUMANodePodLevel
 	case config.RestrictedTopologyManagerPolicy:
-		return v1alpha2.RestrictedPodLevel
+		return v1alpha1.RestrictedPodLevel
 	case config.BestEffortTopologyManagerPolicy:
-		return v1alpha2.BestEffortPodLevel
+		return v1alpha1.BestEffortPodLevel
 	case config.NoneTopologyManagerPolicy:
-		return v1alpha2.None
+		return v1alpha1.None
 	default:
-		return v1alpha2.None
+		return v1alpha1.None
 	}
 }
 
-func detectPolicyContainerScope(policy string) v1alpha2.TopologyManagerPolicy {
+func detectPolicyContainerScope(policy string) v1alpha1.TopologyManagerPolicy {
 	switch policy {
 	case config.SingleNumaNodeTopologyManagerPolicy:
-		return v1alpha2.SingleNUMANodeContainerLevel
+		return v1alpha1.SingleNUMANodeContainerLevel
 	case config.RestrictedTopologyManagerPolicy:
-		return v1alpha2.RestrictedContainerLevel
+		return v1alpha1.RestrictedContainerLevel
 	case config.BestEffortTopologyManagerPolicy:
-		return v1alpha2.BestEffortContainerLevel
+		return v1alpha1.BestEffortContainerLevel
 	case config.NoneTopologyManagerPolicy:
-		return v1alpha2.None
+		return v1alpha1.None
 	default:
-		return v1alpha2.None
+		return v1alpha1.None
 	}
 }


Test patch:
diff --git a/pkg/nfd-topology-gc/nfd-nrt-gc_test.go b/pkg/nfd-topology-gc/nfd-nrt-gc_test.go
index 6d9611bc7..c343fab37 100644
--- a/pkg/nfd-topology-gc/nfd-nrt-gc_test.go
+++ b/pkg/nfd-topology-gc/nfd-nrt-gc_test.go
@@ -21,8 +21,9 @@ import (
 	"testing"
 	"time"
 
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
-	faketopologyv1alpha2 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/generated/clientset/versioned/fake"
+	nrtapi "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
+	v1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
+	faketopologyv1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/generated/clientset/versioned/fake"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/informers"
@@ -35,7 +36,7 @@ func TestNRTGC(t *testing.T) {
 	Convey("When theres is old NRT ", t, func() {
 		k8sClient := fakek8sclientset.NewSimpleClientset()
 
-		fakeClient := faketopologyv1alpha2.NewSimpleClientset(&v1alpha2.NodeResourceTopology{
+		fakeClient := faketopologyv1alpha1.NewSimpleClientset(&nrtapi.NodeResourceTopology{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: "node1",
 			},
@@ -54,7 +55,7 @@ func TestNRTGC(t *testing.T) {
 		err := gc.run()
 		So(err, ShouldBeNil)
 
-		nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+		nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 		So(err, ShouldBeNil)
 		So(nrts.Items, ShouldHaveLength, 0)
 
@@ -67,12 +68,12 @@ func TestNRTGC(t *testing.T) {
 			},
 		})
 
-		fakeClient := faketopologyv1alpha2.NewSimpleClientset(&v1alpha2.NodeResourceTopology{
+		fakeClient := faketopologyv1alpha1.NewSimpleClientset(&nrtapi.NodeResourceTopology{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: "node1",
 			},
 		},
-			&v1alpha2.NodeResourceTopology{
+			&nrtapi.NodeResourceTopology{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "node2",
 				},
@@ -93,7 +94,7 @@ func TestNRTGC(t *testing.T) {
 		err := gc.run()
 		So(err, ShouldBeNil)
 
-		nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+		nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 		So(err, ShouldBeNil)
 		So(nrts.Items, ShouldHaveLength, 1)
 		So(nrts.Items[0].GetName(), ShouldEqual, "node1")
@@ -113,13 +114,13 @@ func TestNRTGC(t *testing.T) {
 			},
 		)
 
-		fakeClient := faketopologyv1alpha2.NewSimpleClientset(
-			&v1alpha2.NodeResourceTopology{
+		fakeClient := faketopologyv1alpha1.NewSimpleClientset(
+			&nrtapi.NodeResourceTopology{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "node1",
 				},
 			},
-			&v1alpha2.NodeResourceTopology{
+			&nrtapi.NodeResourceTopology{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "node2",
 				},
@@ -139,7 +140,7 @@ func TestNRTGC(t *testing.T) {
 		err := gc.run()
 		So(err, ShouldBeNil)
 
-		nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+		nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 		So(err, ShouldBeNil)
 
 		So(nrts.Items, ShouldHaveLength, 2)
@@ -149,7 +150,7 @@ func TestNRTGC(t *testing.T) {
 		// simple sleep with retry loop to make sure indexer will pick up event and trigger deleteNode Function
 		deleted := false
 		for i := 0; i < 5; i++ {
-			nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+			nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 			So(err, ShouldBeNil)
 
 			if len(nrts.Items) == 1 {
@@ -174,13 +175,13 @@ func TestNRTGC(t *testing.T) {
 			},
 		)
 
-		fakeClient := faketopologyv1alpha2.NewSimpleClientset(
-			&v1alpha2.NodeResourceTopology{
+		fakeClient := faketopologyv1alpha1.NewSimpleClientset(
+			&nrtapi.NodeResourceTopology{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "node1",
 				},
 			},
-			&v1alpha2.NodeResourceTopology{
+			&nrtapi.NodeResourceTopology{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "node2",
 				},
@@ -200,12 +201,12 @@ func TestNRTGC(t *testing.T) {
 		err := gc.run()
 		So(err, ShouldBeNil)
 
-		nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+		nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 		So(err, ShouldBeNil)
 
 		So(nrts.Items, ShouldHaveLength, 2)
 
-		nrt := v1alpha2.NodeResourceTopology{
+		nrt := v1alpha1.NodeResourceTopology{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: "not-existing",
 			},
@@ -213,12 +214,12 @@ func TestNRTGC(t *testing.T) {
 
 		go gc.periodicGC(time.Second)
 
-		_, err = fakeClient.TopologyV1alpha2().NodeResourceTopologies().Create(context.TODO(), &nrt, metav1.CreateOptions{})
+		_, err = fakeClient.TopologyV1alpha1().NodeResourceTopologies().Create(context.TODO(), &nrt, metav1.CreateOptions{})
 		So(err, ShouldBeNil)
 		// simple sleep with retry loop to make sure GC was triggered
 		deleted := false
 		for i := 0; i < 5; i++ {
-			nrts, err := fakeClient.TopologyV1alpha2().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
+			nrts, err := fakeClient.TopologyV1alpha1().NodeResourceTopologies().List(context.TODO(), metav1.ListOptions{})
 			So(err, ShouldBeNil)
 
 			if len(nrts.Items) == 2 {
diff --git a/pkg/resourcemonitor/noderesourcesaggregator_test.go b/pkg/resourcemonitor/noderesourcesaggregator_test.go
index 6d0b488f8..011c14de9 100644
--- a/pkg/resourcemonitor/noderesourcesaggregator_test.go
+++ b/pkg/resourcemonitor/noderesourcesaggregator_test.go
@@ -30,7 +30,7 @@ import (
 	"k8s.io/apimachinery/pkg/api/resource"
 	v1 "k8s.io/kubelet/pkg/apis/podresources/v1"
 
-	topologyv1alpha2 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	topologyv1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 
 	"sigs.k8s.io/node-feature-discovery/pkg/utils"
 )
@@ -181,34 +181,34 @@ func TestResourcesAggregator(t *testing.T) {
 		resAggr = NewResourcesAggregatorFromData(&fakeTopo, availRes, memoryResourcesCapacity, NewExcludeResourceList(map[string][]string{}, ""))
 
 		Convey("When aggregating resources", func() {
-			expected := topologyv1alpha2.ZoneList{
-				topologyv1alpha2.Zone{
+			expected := topologyv1alpha1.ZoneList{
+				topologyv1alpha1.Zone{
 					Name: "node-0",
 					Type: "Node",
-					Costs: topologyv1alpha2.CostList{
-						topologyv1alpha2.CostInfo{
+					Costs: topologyv1alpha1.CostList{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-0",
 							Value: 10,
 						},
-						topologyv1alpha2.CostInfo{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-1",
 							Value: 20,
 						},
 					},
-					Resources: topologyv1alpha2.ResourceInfoList{
-						topologyv1alpha2.ResourceInfo{
+					Resources: topologyv1alpha1.ResourceInfoList{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "cpu",
 							Available:   *resource.NewQuantity(11, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(11, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(12, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/net",
 							Available:   *resource.NewQuantity(4, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(4, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(4, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "memory",
 							Available:   *resource.NewQuantity(1024, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
@@ -216,45 +216,45 @@ func TestResourcesAggregator(t *testing.T) {
 						},
 					},
 				},
-				topologyv1alpha2.Zone{
+				topologyv1alpha1.Zone{
 					Name: "node-1",
 					Type: "Node",
-					Costs: topologyv1alpha2.CostList{
-						topologyv1alpha2.CostInfo{
+					Costs: topologyv1alpha1.CostList{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-0",
 							Value: 20,
 						},
-						topologyv1alpha2.CostInfo{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-1",
 							Value: 10,
 						},
 					},
-					Resources: topologyv1alpha2.ResourceInfoList{
-						topologyv1alpha2.ResourceInfo{
+					Resources: topologyv1alpha1.ResourceInfoList{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "cpu",
 							Available:   *resource.NewQuantity(11, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(11, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(12, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/gpu",
 							Available:   *resource.NewQuantity(1, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(1, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/net",
 							Available:   *resource.NewQuantity(2, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(2, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(2, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "hugepages-2Mi",
 							Available:   *resource.NewQuantity(1024, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(2048, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "memory",
 							Available:   *resource.NewQuantity(1024, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
@@ -411,34 +411,34 @@ func TestResourcesAggregator(t *testing.T) {
 				},
 			}
 
-			expected := topologyv1alpha2.ZoneList{
-				topologyv1alpha2.Zone{
+			expected := topologyv1alpha1.ZoneList{
+				topologyv1alpha1.Zone{
 					Name: "node-0",
 					Type: "Node",
-					Costs: topologyv1alpha2.CostList{
-						topologyv1alpha2.CostInfo{
+					Costs: topologyv1alpha1.CostList{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-0",
 							Value: 10,
 						},
-						topologyv1alpha2.CostInfo{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-1",
 							Value: 20,
 						},
 					},
-					Resources: topologyv1alpha2.ResourceInfoList{
-						topologyv1alpha2.ResourceInfo{
+					Resources: topologyv1alpha1.ResourceInfoList{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "cpu",
 							Available:   *resource.NewQuantity(11, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(11, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(12, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/net",
 							Available:   *resource.NewQuantity(1, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(1, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "memory",
 							Available:   *resource.NewQuantity(1024, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
@@ -446,45 +446,45 @@ func TestResourcesAggregator(t *testing.T) {
 						},
 					},
 				},
-				topologyv1alpha2.Zone{
+				topologyv1alpha1.Zone{
 					Name: "node-1",
 					Type: "Node",
-					Costs: topologyv1alpha2.CostList{
-						topologyv1alpha2.CostInfo{
+					Costs: topologyv1alpha1.CostList{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-0",
 							Value: 20,
 						},
-						topologyv1alpha2.CostInfo{
+						topologyv1alpha1.CostInfo{
 							Name:  "node-1",
 							Value: 10,
 						},
 					},
-					Resources: topologyv1alpha2.ResourceInfoList{
-						topologyv1alpha2.ResourceInfo{
+					Resources: topologyv1alpha1.ResourceInfoList{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "cpu",
 							Available:   resource.MustParse("10"),
 							Allocatable: *resource.NewQuantity(12, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(12, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/gpu",
 							Available:   *resource.NewQuantity(1, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(1, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "fake.io/net",
 							Available:   *resource.NewQuantity(0, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(1, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "hugepages-2Mi",
 							Available:   *resource.NewQuantity(512, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
 							Capacity:    *resource.NewQuantity(2048, resource.DecimalSI),
 						},
-						topologyv1alpha2.ResourceInfo{
+						topologyv1alpha1.ResourceInfo{
 							Name:        "memory",
 							Available:   *resource.NewQuantity(512, resource.DecimalSI),
 							Allocatable: *resource.NewQuantity(1024, resource.DecimalSI),
diff --git a/pkg/topologypolicy/topology-policy_test.go b/pkg/topologypolicy/topology-policy_test.go
index 5ae109b6b..b766814a8 100644
--- a/pkg/topologypolicy/topology-policy_test.go
+++ b/pkg/topologypolicy/topology-policy_test.go
@@ -19,74 +19,74 @@ package topologypolicy
 import (
 	"testing"
 
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	v1alpha1 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 )
 
 func TestDetectTopologyPolicy(t *testing.T) {
 	testCases := []struct {
 		scope    string
 		policy   string
-		expected v1alpha2.TopologyManagerPolicy
+		expected v1alpha1.TopologyManagerPolicy
 	}{
 		{
 			policy:   "best-effort",
 			scope:    "pod",
-			expected: v1alpha2.BestEffortPodLevel,
+			expected: v1alpha1.BestEffortPodLevel,
 		},
 		{
 			policy:   "best-effort",
 			scope:    "container",
-			expected: v1alpha2.BestEffortContainerLevel,
+			expected: v1alpha1.BestEffortContainerLevel,
 		},
 		{
 			policy:   "restricted",
 			scope:    "container",
-			expected: v1alpha2.RestrictedContainerLevel,
+			expected: v1alpha1.RestrictedContainerLevel,
 		},
 		{
 			policy:   "restricted",
 			scope:    "pod",
-			expected: v1alpha2.RestrictedPodLevel,
+			expected: v1alpha1.RestrictedPodLevel,
 		},
 		{
 			policy:   "single-numa-node",
 			scope:    "pod",
-			expected: v1alpha2.SingleNUMANodePodLevel,
+			expected: v1alpha1.SingleNUMANodePodLevel,
 		},
 		{
 			policy:   "single-numa-node",
 			scope:    "container",
-			expected: v1alpha2.SingleNUMANodeContainerLevel,
+			expected: v1alpha1.SingleNUMANodeContainerLevel,
 		},
 		{
 			policy:   "none",
 			scope:    "container",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 		{
 			policy:   "none",
 			scope:    "pod",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 		{
 			policy:   "non-existent",
 			scope:    "pod",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 		{
 			policy:   "non-existent",
 			scope:    "container",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 		{
 			policy:   "single-numa-node",
 			scope:    "non-existent",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 		{
 			policy:   "single-numa-node",
 			scope:    "non-existent",
-			expected: v1alpha2.None,
+			expected: v1alpha1.None,
 		},
 	}
 
diff --git a/test/e2e/topology_updater_test.go b/test/e2e/topology_updater_test.go
index 53fc83ebf..d63bca073 100644
--- a/test/e2e/topology_updater_test.go
+++ b/test/e2e/topology_updater_test.go
@@ -27,7 +27,7 @@ import (
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 	topologyclientset "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/generated/clientset/versioned"
 
 	appsv1 "k8s.io/api/apps/v1"
@@ -237,9 +237,9 @@ var _ = SIGDescribe("Node Feature Discovery topology updater", func() {
 			defer testpod.DeleteAsync(f, podMap)
 
 			By("checking the changes in the updated topology")
-			var finalNodeTopo *v1alpha2.NodeResourceTopology
+			var finalNodeTopo *v1alpha1.NodeResourceTopology
 			Eventually(func() bool {
-				finalNodeTopo, err = topologyClient.TopologyV1alpha2().NodeResourceTopologies().Get(context.TODO(), topologyUpdaterNode.Name, metav1.GetOptions{})
+				finalNodeTopo, err = topologyClient.TopologyV1alpha1().NodeResourceTopologies().Get(context.TODO(), topologyUpdaterNode.Name, metav1.GetOptions{})
 				if err != nil {
 					framework.Logf("failed to get the node topology resource: %v", err)
 					return false
diff --git a/test/e2e/utils/noderesourcetopology.go b/test/e2e/utils/noderesourcetopology.go
index 6b24d3e0c..a68568006 100644
--- a/test/e2e/utils/noderesourcetopology.go
+++ b/test/e2e/utils/noderesourcetopology.go
@@ -25,7 +25,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2"
+	"github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha1"
 	topologyclientset "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/generated/clientset/versioned"
 	"github.com/onsi/gomega"
 	"sigs.k8s.io/node-feature-discovery/pkg/topologypolicy"
@@ -106,11 +106,11 @@ func CreateNodeResourceTopologies(extClient extclient.Interface) (*apiextensions
 }
 
 // GetNodeTopology returns the NodeResourceTopology data for the node identified by `nodeName`.
-func GetNodeTopology(topologyClient *topologyclientset.Clientset, nodeName string) *v1alpha2.NodeResourceTopology {
-	var nodeTopology *v1alpha2.NodeResourceTopology
+func GetNodeTopology(topologyClient *topologyclientset.Clientset, nodeName string) *v1alpha1.NodeResourceTopology {
+	var nodeTopology *v1alpha1.NodeResourceTopology
 	var err error
 	gomega.EventuallyWithOffset(1, func() bool {
-		nodeTopology, err = topologyClient.TopologyV1alpha2().NodeResourceTopologies().Get(context.TODO(), nodeName, metav1.GetOptions{})
+		nodeTopology, err = topologyClient.TopologyV1alpha1().NodeResourceTopologies().Get(context.TODO(), nodeName, metav1.GetOptions{})
 		if err != nil {
 			framework.Logf("failed to get the node topology resource: %v", err)
 			return false
@@ -121,7 +121,7 @@ func GetNodeTopology(topologyClient *topologyclientset.Clientset, nodeName strin
 }
 
 // AllocatableResourceListFromNodeResourceTopology extract the map zone:allocatableResources from the given NodeResourceTopology instance.
-func AllocatableResourceListFromNodeResourceTopology(nodeTopo *v1alpha2.NodeResourceTopology) map[string]corev1.ResourceList {
+func AllocatableResourceListFromNodeResourceTopology(nodeTopo *v1alpha1.NodeResourceTopology) map[string]corev1.ResourceList {
 	allocRes := make(map[string]corev1.ResourceList)
 	for _, zone := range nodeTopo.Zones {
 		if zone.Type != "Node" {
@@ -186,7 +186,7 @@ func CompareResourceList(expected, got corev1.ResourceList) (string, int, bool)
 // IsValidNodeTopology checks the provided NodeResourceTopology object if it is well-formad, internally consistent and
 // consistent with the given kubelet config object. Returns true if the NodeResourceTopology object is consistent and well
 // formet, false otherwise; if return false, logs the failure reason.
-func IsValidNodeTopology(nodeTopology *v1alpha2.NodeResourceTopology, kubeletConfig *kubeletconfig.KubeletConfiguration) bool {
+func IsValidNodeTopology(nodeTopology *v1alpha1.NodeResourceTopology, kubeletConfig *kubeletconfig.KubeletConfiguration) bool {
 	if nodeTopology == nil || len(nodeTopology.TopologyPolicies) == 0 {
 		framework.Logf("failed to get topology policy from the node topology resource")
 		return false
@@ -224,7 +224,7 @@ func IsValidNodeTopology(nodeTopology *v1alpha2.NodeResourceTopology, kubeletCon
 	return foundNodes > 0
 }
 
-func isValidCostList(zoneName string, costs v1alpha2.CostList) bool {
+func isValidCostList(zoneName string, costs v1alpha1.CostList) bool {
 	if len(costs) == 0 {
 		framework.Logf("failed to get topology costs for zone %q from the node topology resource", zoneName)
 		return false
@@ -239,7 +239,7 @@ func isValidCostList(zoneName string, costs v1alpha2.CostList) bool {
 	return true
 }
 
-func isValidResourceList(zoneName string, resources v1alpha2.ResourceInfoList) bool {
+func isValidResourceList(zoneName string, resources v1alpha1.ResourceInfoList) bool {
 	if len(resources) == 0 {
 		framework.Logf("failed to get topology resources for zone %q from the node topology resource", zoneName)
 		return false