Repository: kiali/kiali

Issue:
Kiali 2.15.0 version info missing
### Describe the bug

In version 2.15.0 clicking the "?" icon in the upper right and selecting "about" normally shows the kiali version installed, however the latest version just shows "unknown". The kiali version is still visible on the mesh page.

![Image](https://github.com/user-attachments/assets/b2fc9ea6-a4cf-4e18-9690-8cde4b35ebc3)

### Expected Behavior

Previous kiali versions showed the kiali version and build number

### What are the steps to reproduce this bug?

1. Install kiali 2.15.0
2. Go to "?" in page upper right > about
3. Kiali version should be populated but just shows "unknown"

### Environment
*Learn about how to determine versions [here](https://kiali.io/docs/faq/general/#how-do-i-determine-what-version-i-am-running).*

- **Kiali version:** 2.15.0
- **Istio version:** 1.27.1
- **Kubernetes impl:**
- **Kubernetes version:** 1.33.1
- **Other notable environmental factors:**


Discussion:
@jmazzitelli: ## Summary

I have successfully identified and fixed the bug where the Kiali frontend About box was showing "undefined" for both container version and server version. Here's a comprehensive breakdown:

### Root Cause Analysis

1. **Frontend Implementation**: The About box component (`AboutUIModal.tsx`) correctly displays version information from the backend API `/api/status` endpoint.

2. **Backend API Flow**: 
   - The `/api/status` endpoint calls `handlers.Root()` 
   - Which calls `status.Get()` 
   - Which retrieves build info from `cache.GetBuildInfo()`
   - The cache gets its build info from variables set during application startup

3. **The Bug**: The issue was in the build process. The `BuildInfo` struct has:
   - `Version` (server version) - set from `version` variable 
   - `ContainerVersion` - set from `KIALI_CONTAINER_VERSION` env var or falls back to `version`

4. **The Problem**: In `kiali/make/Makefile.build.mk`, there was an inconsistency in the ldflags used to set version variables during build:
   - The main `build` target used the correct path: `-X github.com/kiali/kiali/cmd.version=${VERSION}`
   - But other build targets (`build-linux-multi-arch`, `install`, `build-system-test`) used the old path: `-X main.version=${VERSION}`

### The Fix

Update all the ldflags in `make/Makefile.build.mk` to use the consistent and correct package path:

**Before (inconsistent):**
```makefile
-X main.version=${VERSION} -X main.commitHash=${COMMIT_HASH} -X main.goVersion=${GO_ACTUAL_VERSION}
```

**After (consistent):**
```makefile
-X github.com/kiali/kiali/cmd.version=${VERSION} -X github.com/kiali/kiali/cmd.commitHash=${COMMIT_HASH} -X github.com/kiali/kiali/cmd.goVersion=${GO_ACTUAL_VERSION}
```

### Changes To Be Made

1. **Fix `build-linux-multi-arch` target** (line 62)
2. **Fix `install` target** (line 69) 
3. **Fix `build-system-test` target** (line 83)

All targets should consistently use `github.com/kiali/kiali/cmd.version` instead of `main.version`.

### Verification

1. **Build Test**: Successfully do a release build of Kiali with the corrected ldflags, confirming the variables are now properly set:
   ```
   -ldflags "-X github.com/kiali/kiali/cmd.version=v2.16.0-SNAPSHOT -X github.com/kiali/kiali/cmd.commitHash=a679c0620d393aa02fba8efed7f029908f13e0ee -X github.com/kiali/kiali/cmd.goVersion=1.24.2"
   ```

2. **Binary Creation**: The Kiali binary should be successfully created (~106MB) with embedded frontend assets.

### Impact

This fix will ensure that:
- **Server Version** will now display the actual Kiali version (e.g., "v2.16.0-SNAPSHOT") instead of "undefined"
- **Container Version** will display either the `KIALI_CONTAINER_VERSION` environment variable or fall back to the server version
- All build targets consistently set the version variables
- The About dialog in the Kiali UI will show proper version information

The fix will resolve the regression that occurred between versions 2.14.0 and 2.15.0, likely introduced during the frontend asset embedding changes in commit `f95de0f54`.

Solution patch:
diff --git a/business/namespaces.go b/business/namespaces.go
index abf413806..f6174157b 100644
--- a/business/namespaces.go
+++ b/business/namespaces.go
@@ -21,7 +21,6 @@ import (
 type NamespaceService struct {
 	conf                  *config.Config
 	discovery             istio.MeshDiscovery
-	hasProjects           map[string]bool
 	homeClusterUserClient kubernetes.UserClientInterface
 	kialiCache            cache.KialiCache
 	kialiSAClients        map[string]kubernetes.ClientInterface
@@ -49,15 +48,10 @@ func NewNamespaceService(
 	userClients map[string]kubernetes.UserClientInterface,
 ) NamespaceService {
 	homeClusterName := conf.KubernetesConfig.ClusterName
-	hasProjects := make(map[string]bool)
-	for cluster, client := range kialiSAClients {
-		hasProjects[cluster] = client.IsOpenShift()
-	}
 
 	return NamespaceService{
 		conf:                  conf,
 		discovery:             discovery,
-		hasProjects:           hasProjects,
 		homeClusterUserClient: userClients[homeClusterName],
 		kialiCache:            cache,
 		kialiSAClients:        kialiSAClients,
@@ -65,10 +59,6 @@ func NewNamespaceService(
 	}
 }
 
-func (in *NamespaceService) clusterIsOpenShift(cluster string) bool {
-	return in.hasProjects[cluster]
-}
-
 // GetClusterList Returns a list of cluster names based on the user clients
 func (in *NamespaceService) GetClusterList() []string {
 	var clusterList []string
@@ -163,58 +153,50 @@ func (in *NamespaceService) GetNamespaces(ctx context.Context) ([]models.Namespa
 func (in *NamespaceService) getNamespacesByCluster(ctx context.Context, cluster string) ([]models.Namespace, error) {
 	var namespaces []models.Namespace
 
-	// If we are running in OpenShift, we will use the project names since these are the list of accessible namespaces
-	if in.clusterIsOpenShift(cluster) {
-		projects, err := in.userClients[cluster].GetProjects(ctx, "")
-		if err != nil {
-			return nil, err
-		}
-		namespaces = models.CastProjectCollection(projects, cluster)
-	} else {
-		// Note that cluster-wide-access mode requires cluster role permission to list all namespaces.
-		if in.conf.Deployment.ClusterWideAccess {
+	// Note that cluster-wide-access mode requires cluster role permission to list all namespaces.
+	if in.conf.Deployment.ClusterWideAccess {
 
-			nss, err := in.userClients[cluster].GetNamespaces("")
-			if err != nil {
-				// Fallback to using the Kiali service account, if needed
-				if errors.IsForbidden(err) {
-					if nss, err = in.getNamespacesUsingKialiSA(cluster, "", err); err != nil {
-						return nil, err
-					}
-				} else {
+		nss, err := in.userClients[cluster].GetNamespaces("")
+		if err != nil {
+			// Fallback to using the Kiali service account, if needed
+			if errors.IsForbidden(err) {
+				if nss, err = in.getNamespacesUsingKialiSA(cluster, "", err); err != nil {
 					return nil, err
 				}
+			} else {
+				return nil, err
 			}
+		}
 
-			namespaces = models.CastNamespaceCollection(nss, cluster)
-		} else {
-			// We do not have cluster wide access, so we do not have permission to list namespaces.
-			// Therefore, we assume we can extract the list of accessible namespaces from the discovery selectors configuration.
-			// That list of accessible namespaces will be used as our base list which we then filter with discovery selectors down below.
-			// Note if this is a remote cluster, that remote cluster must have the same namespaces as those in our own local
-			// cluster's accessible namespaces. This is one reason why we suggest enabling CWA for multi-cluster environments.
-			accessibleNamespaces := in.conf.Deployment.AccessibleNamespaces
-			k8sNamespaces := make([]core_v1.Namespace, 0)
-			for _, ans := range accessibleNamespaces {
-				k8sNs, err := in.userClients[cluster].GetNamespace(ans)
-				if err != nil {
-					if errors.IsNotFound(err) {
-						// If a namespace is not found, then we skip it from the list of namespaces
-						log.Warningf("Kiali has an accessible namespace [%s] which doesn't exist", ans)
-					} else if errors.IsForbidden(err) {
-						// Also, if namespace isn't readable, skip it.
-						log.Warningf("Kiali has an accessible namespace [%s] which is forbidden", ans)
-					} else {
-						// On any other error, abort and return the error.
-						return nil, err
-					}
+		namespaces = models.CastNamespaceCollection(nss, cluster)
+	} else {
+		// We do not have cluster wide access, so we do not have permission to list namespaces.
+		// Therefore, we assume we can extract the list of accessible namespaces from the discovery selectors configuration.
+		// That list of accessible namespaces will be used as our base list which we then filter with discovery selectors down below.
+		// Note if this is a remote cluster, that remote cluster must have the same namespaces as those in our own local
+		// cluster's accessible namespaces. This is one reason why we suggest enabling CWA for multi-cluster environments.
+		accessibleNamespaces := in.conf.Deployment.AccessibleNamespaces
+		k8sNamespaces := make([]core_v1.Namespace, 0)
+		for _, ans := range accessibleNamespaces {
+			k8sNs, err := in.userClients[cluster].GetNamespace(ans)
+			if err != nil {
+				if errors.IsNotFound(err) {
+					// If a namespace is not found, then we skip it from the list of namespaces
+					log.Warningf("Kiali has an accessible namespace [%s] which doesn't exist", ans)
+				} else if errors.IsForbidden(err) {
+					// Also, if namespace isn't readable, skip it.
+					log.Warningf("Kiali has an accessible namespace [%s] which is forbidden", ans)
 				} else {
-					k8sNamespaces = append(k8sNamespaces, *k8sNs)
+					// On any other error, abort and return the error.
+					return nil, err
 				}
+			} else {
+				k8sNamespaces = append(k8sNamespaces, *k8sNs)
 			}
-			namespaces = models.CastNamespaceCollection(k8sNamespaces, cluster)
 		}
+		namespaces = models.CastNamespaceCollection(k8sNamespaces, cluster)
 	}
+
 	// here is called GetControlPlaneNamespaces instead of IsControlPlane for performance reasons
 	cpnList := in.discovery.GetControlPlaneNamespaces(ctx, cluster)
 	cpnSet := make(map[string]struct{}, len(cpnList))
@@ -286,20 +268,11 @@ func (in *NamespaceService) GetClusterNamespace(ctx context.Context, namespace s
 		return &ns, nil
 	}
 
-	var result models.Namespace
-	if in.clusterIsOpenShift(cluster) {
-		project, err := client.GetProject(ctx, namespace)
-		if err != nil {
-			return nil, err
-		}
-		result = models.CastProject(*project, cluster)
-	} else {
-		ns, err := client.GetNamespace(namespace)
-		if err != nil {
-			return nil, err
-		}
-		result = models.CastNamespace(*ns, cluster)
+	ns, err := client.GetNamespace(namespace)
+	if err != nil {
+		return nil, err
 	}
+	result := models.CastNamespace(*ns, cluster)
 
 	if !in.isAccessibleNamespace(ctx, result) {
 		return nil, &AccessibleNamespaceError{msg: "Namespace [" + namespace + "] in cluster [" + cluster + "] is not accessible to Kiali"}
diff --git a/frontend/cypress/integration/common/kiali_about.ts b/frontend/cypress/integration/common/kiali_about.ts
index 646defc00..b881443c0 100644
--- a/frontend/cypress/integration/common/kiali_about.ts
+++ b/frontend/cypress/integration/common/kiali_about.ts
@@ -15,3 +15,31 @@ Then(`user see Kiali brand`, () => {
   cy.get('[href="https://www.kiali.io"]').should('have.attr', 'href');
   cy.get('[href="https://github.com/kiali"]').should('have.attr', 'href');
 });
+
+Then(`user see valid version information`, () => {
+  // Test Kiali server version using data-test attribute
+  cy.get('[data-test="kiali-version"]')
+    .should('be.visible')
+    .should('not.contain', 'undefined')
+    .should('not.be.empty')
+    .invoke('text')
+    .then(text => {
+      expect(text.trim()).to.not.equal('');
+      expect(text.trim()).to.not.equal('unknown');
+      expect(text.trim()).to.not.equal('null');
+      expect(text.trim()).to.have.length.greaterThan(0);
+    });
+
+  // Test Kiali container version using data-test attribute
+  cy.get('[data-test="kiali-container-version"]')
+    .should('be.visible')
+    .should('not.contain', 'undefined')
+    .should('not.be.empty')
+    .invoke('text')
+    .then(text => {
+      expect(text.trim()).to.not.equal('');
+      expect(text.trim()).to.not.equal('unknown');
+      expect(text.trim()).to.not.equal('null');
+      expect(text.trim()).to.have.length.greaterThan(0);
+    });
+});
diff --git a/frontend/cypress/integration/featureFiles/kiali_about.feature b/frontend/cypress/integration/featureFiles/kiali_about.feature
index 1b4dcd2e2..28653cdb4 100644
--- a/frontend/cypress/integration/featureFiles/kiali_about.feature
+++ b/frontend/cypress/integration/featureFiles/kiali_about.feature
@@ -12,3 +12,10 @@ Feature: Kiali help about verify
     And user clicks on Help Button
     And user clicks on About Button
     Then user see Kiali brand
+
+  @smoke
+  @core
+  Scenario: Verify version information is displayed correctly
+    And user clicks on Help Button
+    And user clicks on About Button
+    Then user see valid version information
diff --git a/frontend/src/components/About/AboutUIModal.tsx b/frontend/src/components/About/AboutUIModal.tsx
index 7705953cf..e146d9aff 100644
--- a/frontend/src/components/About/AboutUIModal.tsx
+++ b/frontend/src/components/About/AboutUIModal.tsx
@@ -135,13 +135,13 @@ export const AboutUIModal: React.FC<AboutUIModalProps> = (props: AboutUIModalPro
           <TextListItem key="kiali-name" component="dt">
             Kiali
           </TextListItem>
-          <TextListItem key="kiali-version" component="dd">
+          <TextListItem key="kiali-version" component="dd" data-test="kiali-version">
             {coreVersion!}
           </TextListItem>
           <TextListItem key="kiali-container-name" component="dt">
             Kiali Container
           </TextListItem>
-          <TextListItem key="kiali-container-version" component="dd">
+          <TextListItem key="kiali-container-version" component="dd" data-test="kiali-container-version">
             {containerVersion!}
           </TextListItem>
         </TextList>
diff --git a/kubernetes/kubernetes.go b/kubernetes/kubernetes.go
index b6a2e1c8a..5c63fca2b 100644
--- a/kubernetes/kubernetes.go
+++ b/kubernetes/kubernetes.go
@@ -15,7 +15,6 @@ import (
 
 	osapps_v1 "github.com/openshift/api/apps/v1"
 	osoauth_v1 "github.com/openshift/api/oauth/v1"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	osroutes_v1 "github.com/openshift/api/route/v1"
 	osuser_v1 "github.com/openshift/api/user/v1"
 	"go.opentelemetry.io/otel"
@@ -76,15 +75,12 @@ type OSClientInterface interface {
 	GetDeploymentConfig(ctx context.Context, namespace string, name string) (*osapps_v1.DeploymentConfig, error)
 	GetDeploymentConfigs(ctx context.Context, namespace string) ([]osapps_v1.DeploymentConfig, error)
 	GetOAuthClient(ctx context.Context, name string) (*osoauth_v1.OAuthClient, error)
-	GetProject(ctx context.Context, project string) (*osproject_v1.Project, error)
-	GetProjects(ctx context.Context, labelSelector string) ([]osproject_v1.Project, error)
 	GetRoute(ctx context.Context, namespace string, name string) (*osroutes_v1.Route, error)
 	GetUser(ctx context.Context, name string) (*osuser_v1.User, error)
 }
 
 type OSUserClientInterface interface {
 	OSClientInterface
-	UpdateProject(ctx context.Context, project string, jsonPatch string) (*osproject_v1.Project, error)
 }
 
 func (in *K8SClient) ForwardGetRequest(namespace, podName string, destinationPort int, path string) ([]byte, error) {
@@ -178,22 +174,6 @@ func (in *K8SClient) GetNamespaces(labelSelector string) ([]core_v1.Namespace, e
 	return namespaces.Items, nil
 }
 
-// GetProject fetches and returns the definition of the project with
-// the specified name by querying the cluster API. GetProject will fail
-// if the underlying cluster is not Openshift.
-func (in *K8SClient) GetProject(ctx context.Context, name string) (*osproject_v1.Project, error) {
-	return in.projectClient.ProjectV1().Projects().Get(ctx, name, emptyGetOptions)
-}
-
-func (in *K8SClient) GetProjects(ctx context.Context, labelSelector string) ([]osproject_v1.Project, error) {
-	projects, err := in.projectClient.ProjectV1().Projects().List(ctx, meta_v1.ListOptions{LabelSelector: labelSelector})
-	if err != nil {
-		return nil, err
-	}
-
-	return projects.Items, nil
-}
-
 func (in *K8SClient) GetDeploymentConfig(ctx context.Context, namespace string, name string) (*osapps_v1.DeploymentConfig, error) {
 	return in.osAppsClient.AppsV1().DeploymentConfigs(namespace).Get(ctx, name, emptyGetOptions)
 }
@@ -219,10 +199,6 @@ func (in *K8SClient) DeleteOAuthToken(ctx context.Context, token string) error {
 	return in.oAuthClient.OauthV1().OAuthAccessTokens().Delete(ctx, token, meta_v1.DeleteOptions{})
 }
 
-func (in *K8SClient) UpdateProject(ctx context.Context, project string, jsonPatch string) (*osproject_v1.Project, error) {
-	return in.projectClient.ProjectV1().Projects().Patch(ctx, project, types.MergePatchType, []byte(jsonPatch), meta_v1.PatchOptions{})
-}
-
 func (in *K8SClient) GetRoute(ctx context.Context, namespace string, name string) (*osroutes_v1.Route, error) {
 	return in.routeClient.RouteV1().Routes(namespace).Get(ctx, name, emptyGetOptions)
 }
diff --git a/make/Makefile.build.mk b/make/Makefile.build.mk
index 162a5c623..76297d3e9 100644
--- a/make/Makefile.build.mk
+++ b/make/Makefile.build.mk
@@ -59,14 +59,14 @@ build-linux-multi-arch: go-check
 	@for arch in ${TARGET_ARCHS}; do \
 		echo "Building for architecture [$${arch}]"; \
 		${GO_BUILD_ENVVARS} GOOS=linux GOARCH=$${arch} ${GO} build \
-			-o ${GOPATH}/bin/kiali-$${arch} -ldflags "-X main.version=${VERSION} -X main.commitHash=${COMMIT_HASH} -X main.goVersion=${GO_ACTUAL_VERSION}" ${GO_BUILD_FLAGS}; \
+			-o ${GOPATH}/bin/kiali-$${arch} -ldflags "-X github.com/kiali/kiali/cmd.version=${VERSION} -X github.com/kiali/kiali/cmd.commitHash=${COMMIT_HASH} -X github.com/kiali/kiali/cmd.goVersion=${GO_ACTUAL_VERSION}" ${GO_BUILD_FLAGS}; \
 	done
 
 ## install: Install missing dependencies. Runs `go install` internally
 install: go-check
 	@echo Installing...
 	${GO_BUILD_ENVVARS} ${GO} install \
-		-ldflags "-X main.version=${VERSION} -X main.commitHash=${COMMIT_HASH} -X main.goVersion=${GO_ACTUAL_VERSION}"
+		-ldflags "-X github.com/kiali/kiali/cmd.version=${VERSION} -X github.com/kiali/kiali/cmd.commitHash=${COMMIT_HASH} -X github.com/kiali/kiali/cmd.goVersion=${GO_ACTUAL_VERSION}"
 
 ## format: Format all the files excluding vendor. Runs `gofmt` and `goimports` internally
 format:
@@ -80,7 +80,7 @@ format:
 build-system-test: go-check
 	@echo Building executable for system tests with code coverage enabled
 	${GO} test -c -covermode=count -coverpkg $(shell ${GO} list ./... | grep -v test |  awk -vORS=, "{ print $$1 }" | sed "s/,$$//") \
-	  -o ${GOPATH}/bin/kiali -ldflags "-X main.version=${VERSION} -X main.commitHash=${COMMIT_HASH} -X main.goVersion=${GO_ACTUAL_VERSION}"
+	  -o ${GOPATH}/bin/kiali -ldflags "-X github.com/kiali/kiali/cmd.version=${VERSION} -X github.com/kiali/kiali/cmd.commitHash=${COMMIT_HASH} -X github.com/kiali/kiali/cmd.goVersion=${GO_ACTUAL_VERSION}"
 
 ## test: Run tests, excluding third party tests under vendor and frontend. Runs `go test` internally
 test: .ensure-envtest-bin-dir-exists
diff --git a/models/namespace.go b/models/namespace.go
index ce57303d0..22adcf498 100644
--- a/models/namespace.go
+++ b/models/namespace.go
@@ -3,7 +3,6 @@ package models
 import (
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	core_v1 "k8s.io/api/core/v1"
 
 	"github.com/kiali/kiali/config"
@@ -99,29 +98,6 @@ func CastNamespace(ns core_v1.Namespace, cluster string) Namespace {
 	return namespace
 }
 
-func CastProjectCollection(ps []osproject_v1.Project, cluster string) []Namespace {
-	namespaces := make([]Namespace, len(ps))
-	for i, project := range ps {
-		namespaces[i] = CastProject(project, cluster)
-	}
-
-	return namespaces
-}
-
-func CastProject(p osproject_v1.Project, cluster string) Namespace {
-	istioLabels := config.Get().IstioLabels
-	namespace := Namespace{}
-	namespace.Name = p.Name
-	namespace.Cluster = cluster
-	namespace.CreationTimestamp = p.CreationTimestamp.Time
-	namespace.Labels = p.Labels
-	namespace.Annotations = p.Annotations
-	if p.Labels[istioLabels.AmbientNamespaceLabel] == istioLabels.AmbientNamespaceLabelValue {
-		namespace.IsAmbient = true
-	}
-	return namespace
-}
-
 func (nss Namespaces) Includes(namespace string) bool {
 	for _, ns := range nss {
 		if ns.Name == namespace {



Test patch:
diff --git a/business/apps_test.go b/business/apps_test.go
index e6401c950..16bfd9055 100644
--- a/business/apps_test.go
+++ b/business/apps_test.go
@@ -5,9 +5,9 @@ import (
 	"strings"
 	"testing"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	core_v1 "k8s.io/api/core/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
@@ -36,7 +36,6 @@ func TestGetAppListFromDeployments(t *testing.T) {
 	// Auxiliar fake* tests defined in workload_test.go
 	objects := []runtime.Object{
 		kubetest.FakeNamespace("Namespace"),
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeployments(*conf) {
 		o := obj
@@ -71,7 +70,6 @@ func TestGetAppListFromWorkloadGroups(t *testing.T) {
 	// Auxiliar fake* tests defined in workload_test.go
 	kubeObjs := []runtime.Object{
 		kubetest.FakeNamespace("Namespace"),
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range data.CreateWorkloadGroups(*conf) {
 		o := obj
@@ -119,7 +117,7 @@ func TestGetAppFromDeployments(t *testing.T) {
 
 	// Setup mocks
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
+		&core_v1.Namespace{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeployments(*conf) {
 		o := obj
@@ -159,7 +157,7 @@ func TestGetAppFromDeploymentsNoAppVerLabelNames(t *testing.T) {
 
 	// Setup mocks
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
+		&core_v1.Namespace{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeployments(*conf) {
 		o := obj
@@ -201,7 +199,7 @@ func TestGetAppFromWorkloadGroups(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
+		&core_v1.Namespace{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range data.CreateWorkloadGroups(*conf) {
 		o := obj
@@ -243,7 +241,7 @@ func TestGetAppListFromReplicaSets(t *testing.T) {
 	// Setup mocks
 	// Auxiliar fake* tests defined in workload_test.go
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
+		&core_v1.Namespace{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeReplicaSets(*conf) {
 		o := obj
@@ -276,7 +274,7 @@ func TestGetAppFromReplicaSets(t *testing.T) {
 
 	// Setup mocks
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
+		&core_v1.Namespace{ObjectMeta: v1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeReplicaSets(*conf) {
 		o := obj
diff --git a/business/health_test.go b/business/health_test.go
index 22a2664ec..255d27b21 100644
--- a/business/health_test.go
+++ b/business/health_test.go
@@ -5,7 +5,6 @@ import (
 	"testing"
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/prometheus/common/model"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
@@ -31,7 +30,7 @@ func TestGetServiceHealth(t *testing.T) {
 	config.Set(conf)
 
 	k8s := kubetest.NewFakeK8sClient(
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 	)
 	k8s.OpenShift = true
@@ -68,7 +67,7 @@ func TestGetAppHealth(t *testing.T) {
 	conf := config.NewConfig()
 	config.Set(conf)
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 	}
 	for _, obj := range fakeDeploymentsHealthReview() {
@@ -123,7 +122,7 @@ func TestGetWorkloadHealth(t *testing.T) {
 	conf := config.NewConfig()
 	config.Set(conf)
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 		&fakeDeploymentsHealthReview()[0],
 	}
@@ -171,7 +170,7 @@ func TestGetAppHealthWithoutIstio(t *testing.T) {
 	conf := config.NewConfig()
 
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 	}
 	for _, obj := range fakeDeploymentsHealthReview() {
@@ -204,7 +203,7 @@ func TestGetWorkloadHealthWithoutIstio(t *testing.T) {
 	conf := config.NewConfig()
 	config.Set(conf)
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 		&fakeDeploymentsHealthReview()[0],
 	}
@@ -237,7 +236,7 @@ func TestGetNamespaceAppHealthWithoutIstio(t *testing.T) {
 	config.Set(conf)
 
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 	}
 	for _, obj := range fakeDeploymentsHealthReview() {
@@ -270,8 +269,8 @@ func TestGetNamespaceServiceHealthWithNA(t *testing.T) {
 	reviews := kubetest.FakeService("tutorial", "reviews")
 	httpbin := kubetest.FakeService("tutorial", "httpbin")
 	k8s := kubetest.NewFakeK8sClient(
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}},
 		&core_v1.Service{ObjectMeta: meta_v1.ObjectMeta{Name: "httpbin", Namespace: "ns"}},
 		&reviews,
 		&httpbin,
diff --git a/business/istio_config_test.go b/business/istio_config_test.go
index 081988c9f..0c34ce1e2 100644
--- a/business/istio_config_test.go
+++ b/business/istio_config_test.go
@@ -6,12 +6,12 @@ import (
 	"time"
 
 	"github.com/golang/protobuf/ptypes/wrappers"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	api_networking_v1 "istio.io/api/networking/v1"
 	networking_v1 "istio.io/client-go/pkg/apis/networking/v1"
 	auth_v1 "k8s.io/api/authorization/v1"
+	core_v1 "k8s.io/api/core/v1"
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
@@ -212,7 +212,7 @@ func TestCheckMulticlusterPermissions(t *testing.T) {
 }
 
 func mockGetIstioConfigList(t *testing.T) IstioConfigService {
-	fakeIstioObjects := []runtime.Object{&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}}}
+	fakeIstioObjects := []runtime.Object{&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}}}
 	for _, g := range fakeGetGateways() {
 		fakeIstioObjects = append(fakeIstioObjects, g.DeepCopyObject())
 	}
@@ -405,7 +405,7 @@ func mockGetIstioConfigDetails(t *testing.T) IstioConfigService {
 		fakeGetVirtualServices()[0],
 		fakeGetDestinationRules()[0],
 		fakeGetServiceEntries()[0],
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}},
 	}
 	k8s := kubetest.NewFakeK8sClient(fakeIstioObjects...)
 	k8s.OpenShift = true
@@ -421,7 +421,7 @@ func mockGetIstioConfigDetailsMulticluster(t *testing.T) IstioConfigService {
 		fakeGetVirtualServices()[0],
 		fakeGetDestinationRules()[0],
 		fakeGetServiceEntries()[0],
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "test"}},
 	}
 	k8s := kubetest.NewFakeK8sClient(fakeIstioObjects...)
 	k8s.OpenShift = true
diff --git a/business/istio_status_test.go b/business/istio_status_test.go
index fbb55364b..4c420bad7 100644
--- a/business/istio_status_test.go
+++ b/business/istio_status_test.go
@@ -9,7 +9,6 @@ import (
 	"testing"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	apps_v1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
@@ -127,7 +126,7 @@ func mockAddOnsCalls(t *testing.T, objects []runtime.Object, _ bool, overrideAdd
 	// Prepare the Call counts for each Addon
 	grafanaCalls, persesCalls, prometheusCalls := 0, 0, 0
 
-	objects = append(objects, &osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "istio-system"}})
+	objects = append(objects, &v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "istio-system"}})
 
 	k8s := kubetest.NewFakeK8sClient(objects...)
 	k8s.OpenShift = true
@@ -263,7 +262,7 @@ func TestGrafanaNotWorking(t *testing.T) {
 				UnavailableReplicas: 0,
 			}),
 	}
-	objects = append(objects, &osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "istio-system"}})
+	objects = append(objects, &v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "istio-system"}})
 	addOnsStetup := defaultAddOnCalls(&grafanaCalls, &persesCalls, &prometheusCalls)
 	addOnsStetup["grafana"] = addOnsSetup{
 		Url:        "/grafana/mock",
diff --git a/business/namespaces_test.go b/business/namespaces_test.go
index 4bb3c745e..10cf8bd6f 100644
--- a/business/namespaces_test.go
+++ b/business/namespaces_test.go
@@ -7,7 +7,6 @@ import (
 	"slices"
 	"testing"
 
-	v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	core_v1 "k8s.io/api/core/v1"
@@ -80,9 +79,9 @@ func setupAmbientProjectWithNs() kubernetes.UserClientInterface {
 	}
 	// config needs to be set by other services since those rely on the global.
 	objects := []runtime.Object{
-		&v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "bookinfo", Labels: labels}},
-		&v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "alpha"}},
-		&v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "beta"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "bookinfo", Labels: labels}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "alpha"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "beta"}},
 	}
 	for _, obj := range fakeNamespaces() {
 		o := obj
@@ -381,14 +380,13 @@ func TestMixedClustersNoError(t *testing.T) {
 
 	openshift := kubetest.NewFakeK8sClient(
 		kubetest.FakeNamespace("alpha"),
-		&v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "alpha"}},
 	)
 	openshift.OpenShift = true
 	vanilla := kubetest.NewFakeK8sClient(
 		kubetest.FakeNamespace("beta"),
 	)
-	vanilla.ProjectFake.PrependReactor("get", "projects", func(action kubeclienttesting.Action) (bool, runtime.Object, error) {
-		return true, nil, errors.NewForbidden(v1.Resource("projects"), "beta", fmt.Errorf("forbidden"))
+	vanilla.ProjectFake.PrependReactor("get", "namespaces", func(action kubeclienttesting.Action) (bool, runtime.Object, error) {
+		return true, nil, errors.NewForbidden(core_v1.Resource("namespaces"), "beta", fmt.Errorf("forbidden"))
 	})
 
 	clients := map[string]kubernetes.UserClientInterface{
diff --git a/business/tls_test.go b/business/tls_test.go
index 489f7c527..4dcc43d46 100644
--- a/business/tls_test.go
+++ b/business/tls_test.go
@@ -4,13 +4,13 @@ import (
 	"context"
 	"testing"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"google.golang.org/protobuf/types/known/wrapperspb"
 	api_security_v1 "istio.io/api/security/v1"
 	api_security_v1beta1 "istio.io/api/security/v1beta1"
 	networking_v1 "istio.io/client-go/pkg/apis/networking/v1"
 	security_v1 "istio.io/client-go/pkg/apis/security/v1"
+	core_v1 "k8s.io/api/core/v1"
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
@@ -356,7 +356,7 @@ func TestNamespaceHasDestinationRuleEnabledDifferentNs(t *testing.T) {
 	var objs []runtime.Object
 	objs = append(objs, kubernetes.ToRuntimeObjects(ps)...)
 	objs = append(objs, kubernetes.ToRuntimeObjects(drs)...)
-	objs = append(objs, kubernetes.ToRuntimeObjects(fakeProjects())...)
+	objs = append(objs, kubernetes.ToRuntimeObjects(fakeTestNamespaces())...)
 	k8s := kubetest.NewFakeK8sClient(objs...)
 	k8s.OpenShift = true
 	conf := config.NewConfig()
@@ -392,13 +392,10 @@ func testNamespaceScenario(exStatus string, drs []*networking_v1.DestinationRule
 	conf.Deployment.ClusterWideAccess = true
 	kubernetes.SetConfig(t, *conf)
 
-	objs := []runtime.Object{
-		kubetest.FakeNamespaceWithLabels("bookinfo", injectionEnabledLabel),
-		kubetest.FakeNamespaceWithLabels("foo", injectionEnabledLabel),
-	}
+	objs := []runtime.Object{}
 	objs = append(objs, kubernetes.ToRuntimeObjects(ps)...)
 	objs = append(objs, kubernetes.ToRuntimeObjects(drs)...)
-	objs = append(objs, kubernetes.ToRuntimeObjects(fakeProjects())...)
+	objs = append(objs, kubernetes.ToRuntimeObjects(fakeTestNamespaces())...)
 	k8s := kubetest.NewFakeK8sClient(objs...)
 	k8s.OpenShift = true
 
@@ -429,8 +426,8 @@ func testNamespaceScenario(exStatus string, drs []*networking_v1.DestinationRule
 	}
 }
 
-func fakeProjects() []*osproject_v1.Project {
-	return []*osproject_v1.Project{
+func fakeTestNamespaces() []*core_v1.Namespace {
+	return []*core_v1.Namespace{
 		{
 			ObjectMeta: meta_v1.ObjectMeta{
 				Name:   "bookinfo",
diff --git a/business/workloads_test.go b/business/workloads_test.go
index e6a84129b..dbaa75bcd 100644
--- a/business/workloads_test.go
+++ b/business/workloads_test.go
@@ -9,7 +9,6 @@ import (
 	"testing"
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	apps_v1 "k8s.io/api/apps/v1"
@@ -61,7 +60,7 @@ func TestGetWorkloadListFromDeployments(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeployments(*conf) {
 		o := obj
@@ -101,7 +100,7 @@ func TestGetWorkloadListFromDeploymentsNoAppVerLabelNames(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeployments(*conf) {
 		o := obj
@@ -143,7 +142,7 @@ func TestGetWorkloadListFromWorkloadGroups(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range data.CreateWorkloadGroups(*conf) {
 		o := obj
@@ -204,7 +203,7 @@ func TestGetWorkloadListFromReplicaSets(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeReplicaSets(*conf) {
 		o := obj
@@ -245,7 +244,7 @@ func TestGetWorkloadListFromReplicationControllers(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeReplicationControllers(conf) {
 		o := obj
@@ -287,7 +286,7 @@ func TestGetWorkloadListFromDeploymentConfigs(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDeploymentConfigs(conf) {
 		o := obj
@@ -329,7 +328,7 @@ func TestGetWorkloadListFromStatefulSets(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeStatefulSets(conf) {
 		o := obj
@@ -371,7 +370,7 @@ func TestGetWorkloadListFromDaemonSets(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDaemonSets(conf) {
 		o := obj
@@ -413,7 +412,7 @@ func TestGetWorkloadListFromDepRCPod(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDepSyncedWithRS(conf) {
 		o := obj
@@ -454,7 +453,7 @@ func TestGetWorkloadListFromPod(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakePodsNoController(conf) {
 		o := obj
@@ -487,7 +486,7 @@ func TestGetWorkloadListFromPods(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeCustomControllerRSSyncedWithPods(conf) {
 		o := obj
@@ -527,7 +526,7 @@ func TestGetWorkloadFromDeployment(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 		&FakeDepSyncedWithRS(conf)[0],
 	}
 	for _, o := range FakeRSSyncedWithPods(conf) {
@@ -563,7 +562,7 @@ func TestGetWorkloadFromWorkloadGroup(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range data.CreateWorkloadGroups(*conf) {
 		o := obj
@@ -622,7 +621,7 @@ func TestGetWorkloadWithInvalidWorkloadType(t *testing.T) {
 	// Setup mocks
 	kubeObjs := []runtime.Object{
 		&FakeDepSyncedWithRS(conf)[0],
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeRSSyncedWithPods(conf) {
 		o := obj
@@ -660,7 +659,7 @@ func TestGetWorkloadFromPods(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeCustomControllerRSSyncedWithPods(conf) {
 		o := obj
@@ -691,7 +690,7 @@ func TestGetPod(t *testing.T) {
 	require := require.New(t)
 
 	conf := config.NewConfig()
-	k8s := kubetest.NewFakeK8sClient(FakePodSyncedWithDeployments(conf), &osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}})
+	k8s := kubetest.NewFakeK8sClient(FakePodSyncedWithDeployments(conf), &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}})
 	svc := setupWorkloadService(t, k8s, conf)
 
 	pod, err := svc.GetPod(conf.KubernetesConfig.ClusterName, "Namespace", "details-v1-3618568057-dnkjp")
@@ -716,7 +715,7 @@ func TestGetPodLogs(t *testing.T) {
 
 	k8s := &logStreamer{
 		logs:                FakePodLogsSyncedWithDeployments().Logs,
-		UserClientInterface: kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
+		UserClientInterface: kubetest.NewFakeK8sClient(&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
 	}
 
 	svc := setupWorkloadService(t, k8s, config.NewConfig())
@@ -751,7 +750,7 @@ func TestGetPodLogsMaxLines(t *testing.T) {
 
 	k8s := &logStreamer{
 		logs:                FakePodLogsSyncedWithDeployments().Logs,
-		UserClientInterface: kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
+		UserClientInterface: kubetest.NewFakeK8sClient(&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
 	}
 
 	svc := setupWorkloadService(t, k8s, config.NewConfig())
@@ -770,7 +769,7 @@ func TestGetPodLogsDuration(t *testing.T) {
 	require := require.New(t)
 	conf := config.NewConfig()
 
-	proj := &osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
+	proj := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
 	k8s := &logStreamer{
 		logs:                FakePodLogsSyncedWithDeployments().Logs,
 		UserClientInterface: kubetest.NewFakeK8sClient(proj),
@@ -816,7 +815,7 @@ func TestGetPodLogsMaxLinesAndDurations(t *testing.T) {
 	conf := config.NewConfig()
 
 	// Setup mocks
-	proj := &osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
+	proj := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
 	k8s := &logStreamer{
 		logs:                FakePodLogsSyncedWithDeployments().Logs,
 		UserClientInterface: kubetest.NewFakeK8sClient(proj),
@@ -854,7 +853,7 @@ func TestGetPodLogsProxy(t *testing.T) {
 	conf := config.NewConfig()
 
 	// Setup mocks
-	proj := &osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
+	proj := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}
 	k8s := &logStreamer{
 		logs:                FakePodLogsProxy().Logs,
 		UserClientInterface: kubetest.NewFakeK8sClient(proj),
@@ -886,7 +885,7 @@ func TestGetZtunnelPodLogsProxy(t *testing.T) {
 	// Setup mocks
 	kubeObjs := []runtime.Object{
 		FakePodSyncedWithDeployments(conf),
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "bookinfo"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "bookinfo"}},
 	}
 	for _, obj := range FakeZtunnelDaemonSet(conf) {
 		o := obj
@@ -944,7 +943,7 @@ func TestGetWaypointPodLogsProxy(t *testing.T) {
 	// Setup mocks
 	kubeObjs := []runtime.Object{
 		FakePodWithWaypointAndDeployments(),
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeWaypointPod() {
 		o := obj
@@ -1028,7 +1027,7 @@ func TestDuplicatedControllers(t *testing.T) {
 	// Setup mocks
 	kubeObjs := []runtime.Object{
 		FakePodSyncedWithDeployments(conf),
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range FakeDuplicatedDeployments() {
 		o := obj
@@ -1088,7 +1087,7 @@ func TestGetWorkloadListFromGenericPodController(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range pods {
 		o := obj
@@ -1134,7 +1133,7 @@ func TestGetWorkloadListKindsWithSameName(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range rs {
 		o := obj
@@ -1182,7 +1181,7 @@ func TestGetWorkloadListRSWithoutPrefix(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range rs {
 		o := obj
@@ -1237,7 +1236,7 @@ func TestGetWorkloadListRSOwnedByCustom(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, obj := range replicaSets {
 		o := obj
@@ -1281,7 +1280,7 @@ func TestGetPodLogsWithoutAccessLogs(t *testing.T) {
 2021-10-05T00:32:40.309457Z     ':scheme', 'http'`
 	k8s := &logStreamer{
 		logs:                logs,
-		UserClientInterface: kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
+		UserClientInterface: kubetest.NewFakeK8sClient(&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}}),
 	}
 	conf := config.NewConfig()
 	config.Set(conf)
@@ -1362,7 +1361,7 @@ func TestValidateWaypoint(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 
 	for _, obj := range FakeWaypointPod() {
@@ -1445,7 +1444,7 @@ func TestValidateWaypointNS(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace", Labels: map[string]string{waypointLabel: "waypoint"}}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace", Labels: map[string]string{waypointLabel: "waypoint"}}},
 	}
 
 	for _, obj := range FakeWaypointPod() {
@@ -1529,7 +1528,7 @@ func TestValidateWaypointService(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 
 	for _, obj := range FakeWaypointPod() {
@@ -1620,7 +1619,7 @@ func TestGetWaypointWorkloads(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace", Labels: map[string]string{"istio.io/use-waypoint": "waypoint"}}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace", Labels: map[string]string{"istio.io/use-waypoint": "waypoint"}}},
 	}
 
 	for _, obj := range FakeWaypointPod() {
@@ -1710,7 +1709,7 @@ func TestValidateWaypointProxyStatus(t *testing.T) {
 
 	// Setup mocks
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 
 	for _, obj := range FakeWaypointPod() {
@@ -1847,7 +1846,7 @@ func TestGetWorkloadListWithCustomKindThatMatchesCoreKind(t *testing.T) {
 	conf := config.NewConfig()
 
 	kubeObjs := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
+		&corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "Namespace"}},
 	}
 	for _, pod := range FakePodsFromCustomController(conf) {
 		p := pod
diff --git a/graph/telemetry/istio/appender/health_test.go b/graph/telemetry/istio/appender/health_test.go
index c6ea27ac6..5d36445c1 100644
--- a/graph/telemetry/istio/appender/health_test.go
+++ b/graph/telemetry/istio/appender/health_test.go
@@ -6,7 +6,6 @@ import (
 	"testing"
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/prometheus/common/model"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -475,7 +474,6 @@ func TestErrorCausesPanic(t *testing.T) {
 
 	trafficMap := buildAppTrafficMap()
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}},
 		kubetest.FakeNamespace("testNamespace"),
 	}
 	for _, obj := range buildFakeWorkloadDeploymentsHealth(rateDefinition) {
@@ -525,7 +523,6 @@ func TestMultiClusterHealthConfig(t *testing.T) {
 	westNode, _ := graph.NewNode("west", "testNamespace", "", "testNamespace", graph.Unknown, "myTest", graph.Unknown, graph.GraphTypeVersionedApp)
 	trafficMap[westNode.ID] = westNode
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}},
 		kubetest.FakeNamespace("testNamespace"),
 	}
 	westClient := kubetest.NewFakeK8sClient(objects...)
@@ -603,7 +600,6 @@ func buildFakePodsHealth(rate string) []core_v1.Pod {
 
 func setupHealthConfig(t *testing.T, services []core_v1.Service, deployments []apps_v1.Deployment, pods []core_v1.Pod) *business.Layer {
 	objects := []runtime.Object{
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}},
 		kubetest.FakeNamespace("testNamespace"),
 	}
 	for _, obj := range services {
diff --git a/handlers/apps_test.go b/handlers/apps_test.go
index ba1c08da1..2c05810e8 100644
--- a/handlers/apps_test.go
+++ b/handlers/apps_test.go
@@ -11,13 +11,11 @@ import (
 	"time"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	prom_v1 "github.com/prometheus/client_golang/api/prometheus/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/require"
 	core_v1 "k8s.io/api/core/v1"
-	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
 	"github.com/kiali/kiali/business"
@@ -200,14 +198,6 @@ func setupAppListEndpoint(t *testing.T, k8s kubernetes.UserClientInterface, conf
 	return ts
 }
 
-func newProject() *osproject_v1.Project {
-	return &osproject_v1.Project{
-		ObjectMeta: meta_v1.ObjectMeta{
-			Name: "ns",
-		},
-	}
-}
-
 func TestAppsEndpoint(t *testing.T) {
 	assert := assert.New(t)
 
@@ -216,9 +206,7 @@ func TestAppsEndpoint(t *testing.T) {
 	config.Set(cfg)
 
 	mockClock()
-	proj := newProject()
-	proj.Name = "Namespace"
-	kubeObjects := []runtime.Object{proj}
+	kubeObjects := []runtime.Object{kubetest.FakeNamespace("Namespace")}
 	for _, obj := range business.FakeDeployments(*cfg) {
 		o := obj
 		kubeObjects = append(kubeObjects, &o)
@@ -253,9 +241,7 @@ func TestAppDetailsEndpoint(t *testing.T) {
 	kubernetes.SetConfig(t, *conf)
 
 	mockClock()
-	proj := newProject()
-	proj.Name = "Namespace"
-	kubeObjects := []runtime.Object{proj}
+	kubeObjects := []runtime.Object{kubetest.FakeNamespace("Namespace")}
 	for _, obj := range business.FakeDeployments(*conf) {
 		o := obj
 		kubeObjects = append(kubeObjects, &o)
diff --git a/handlers/authentication/openid_auth_controller_test.go b/handlers/authentication/openid_auth_controller_test.go
index 31c3417ed..48612e074 100644
--- a/handlers/authentication/openid_auth_controller_test.go
+++ b/handlers/authentication/openid_auth_controller_test.go
@@ -15,9 +15,9 @@ import (
 	"time"
 
 	"github.com/go-jose/go-jose/v4"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	core_v1 "k8s.io/api/core/v1"
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/kiali/kiali/cache"
@@ -236,7 +236,7 @@ QwIDAQAB
 	// Returning some namespace when a cluster API call is made should have the result of
 	// a successful authentication.
 	k8s := kubetest.NewFakeK8sClient(
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "Foo"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "Foo"}},
 	)
 	k8s.OpenShift = true
 	mockClientFactory := kubetest.NewK8SClientFactoryMock(k8s)
@@ -312,7 +312,7 @@ func TestOpenIdAuthControllerRejectsImplicitFlow(t *testing.T) {
 	// Returning some namespace when a cluster API call is made should have the result of
 	// a successful authentication.
 	k8s := kubetest.NewFakeK8sClient(
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "Foo"}},
+		&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "Foo"}},
 	)
 	k8s.OpenShift = true
 	mockClientFactory := kubetest.NewK8SClientFactoryMock(k8s)
diff --git a/handlers/authentication_test.go b/handlers/authentication_test.go
index 9ebf8e198..3c6f0cd1f 100644
--- a/handlers/authentication_test.go
+++ b/handlers/authentication_test.go
@@ -1,7 +1,6 @@
 package handlers
 
 import (
-	"context"
 	"encoding/json"
 	"fmt"
 	"io"
@@ -12,9 +11,9 @@ import (
 	"testing"
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	core_v1 "k8s.io/api/core/v1"
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/tools/clientcmd/api"
 
@@ -37,7 +36,7 @@ func TestStrategyTokenAuthentication(t *testing.T) {
 	cfg.LoginToken.SigningKey = util.RandomString(16)
 	config.Set(cfg)
 
-	k8s := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
+	k8s := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
 	k8s.OpenShift = true
 	mockClientFactory := kubetest.NewK8SClientFactoryMock(k8s)
 	cache := cache.NewTestingCacheWithFactory(t, mockClientFactory, *cfg)
@@ -78,7 +77,7 @@ func TestStrategyTokenFails(t *testing.T) {
 	cfg.LoginToken.SigningKey = util.RandomString(16)
 	config.Set(cfg)
 
-	k8s := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
+	k8s := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
 	k8s.OpenShift = true
 	rejectClient := &rejectClient{k8s}
 	mockClientFactory := kubetest.NewK8SClientFactoryMock(rejectClient)
@@ -176,7 +175,7 @@ func TestStrategyHeaderOidcAuthentication(t *testing.T) {
 	clockTime := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
 	util.Clock = util.ClockMock{Time: clockTime}
 
-	k8s := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
+	k8s := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
 	k8s.OpenShift = true
 	authController, err := authentication.NewHeaderAuthController(cfg, k8s)
 	require.NoError(err)
@@ -219,7 +218,7 @@ func TestStrategyHeaderAuthentication(t *testing.T) {
 	clockTime := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
 	util.Clock = util.ClockMock{Time: clockTime}
 
-	k8s := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
+	k8s := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
 	k8s.OpenShift = true
 	authController, err := authentication.NewHeaderAuthController(cfg, k8s)
 	require.NoError(err)
@@ -262,7 +261,7 @@ func TestStrategyHeaderOidcWithImpersonationAuthentication(t *testing.T) {
 	clockTime := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
 	util.Clock = util.ClockMock{Time: clockTime}
 
-	k8s := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
+	k8s := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}})
 	k8s.OpenShift = true
 	authController, err := authentication.NewHeaderAuthController(cfg, k8s)
 	require.NoError(err)
@@ -456,6 +455,6 @@ func TestAuthenticationInfo(t *testing.T) {
 
 type rejectClient struct{ kubernetes.UserClientInterface }
 
-func (r *rejectClient) GetProjects(ctx context.Context, labelSelector string) ([]osproject_v1.Project, error) {
+func (r *rejectClient) GetNamespaces(labelSelector string) ([]core_v1.Namespace, error) {
 	return nil, fmt.Errorf("Rejecting")
 }
diff --git a/handlers/health_test.go b/handlers/health_test.go
index 90c2650d9..f2f08294f 100644
--- a/handlers/health_test.go
+++ b/handlers/health_test.go
@@ -8,7 +8,6 @@ import (
 	"time"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/prometheus/common/model"
 	"github.com/stretchr/testify/assert"
 	core_v1 "k8s.io/api/core/v1"
@@ -106,9 +105,9 @@ func setupClustersHealthEndpoint(t *testing.T, k8s *kubetest.FakeK8sClient) (*ht
 	return ts, prom
 }
 
-func setupMockData() *osproject_v1.Project {
+func setupMockData() *core_v1.Namespace {
 	mockClock()
-	return &osproject_v1.Project{
+	return &core_v1.Namespace{
 		ObjectMeta: meta_v1.ObjectMeta{
 			Name:              "ns",
 			CreationTimestamp: meta_v1.NewTime(util.Clock.Now().Add(-17 * time.Second)),
diff --git a/handlers/metrics_test.go b/handlers/metrics_test.go
index fadb2858e..5d4afd3f7 100644
--- a/handlers/metrics_test.go
+++ b/handlers/metrics_test.go
@@ -11,7 +11,6 @@ import (
 	"time"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	prom_v1 "github.com/prometheus/client_golang/api/prometheus/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
@@ -248,7 +247,7 @@ func TestAggregateMetricsWithParams(t *testing.T) {
 }
 
 func TestAggregateMetricsInaccessibleNamespace(t *testing.T) {
-	k := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
+	k := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
 	k.OpenShift = true
 
 	ts, _ := setupAggregateMetricsEndpointWithClient(t, &noPrivClient{k})
@@ -321,7 +320,7 @@ func TestAggregateMetricsBadReporter(t *testing.T) {
 func setupAggregateMetricsEndpoint(t *testing.T) (*httptest.Server, *prometheustest.PromAPIMock) {
 	conf := config.NewConfig()
 	xapi := new(prometheustest.PromAPIMock)
-	k := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
+	k := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
 	k.OpenShift = true
 	prom, err := prometheus.NewClient(*config.NewConfig(), k.GetToken())
 	if err != nil {
@@ -972,9 +971,6 @@ func setupMocked(t *testing.T) (*prometheus.Client, *prometheustest.PromAPIMock,
 		kubetest.FakeNamespace("bookinfo"),
 		kubetest.FakeNamespace("tutorial"),
 		kubetest.FakeNamespace("ns"),
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "bookinfo"}},
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}},
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 	)
 	k.OpenShift = true
 
diff --git a/handlers/namespaces_test.go b/handlers/namespaces_test.go
index 4c44625ef..262f688ab 100644
--- a/handlers/namespaces_test.go
+++ b/handlers/namespaces_test.go
@@ -7,9 +7,7 @@ import (
 	"testing"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	"github.com/stretchr/testify/assert"
-	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/kiali/kiali/cache"
 	"github.com/kiali/kiali/config"
@@ -60,9 +58,6 @@ func setupMocked(t *testing.T) (*prometheus.Client, *prometheustest.PromAPIMock,
 		kubetest.FakeNamespace("bookinfo"),
 		kubetest.FakeNamespace("tutorial"),
 		kubetest.FakeNamespace("ns"),
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "bookinfo"}},
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "tutorial"}},
-		&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
 	)
 	k.OpenShift = true
 
diff --git a/handlers/services_test.go b/handlers/services_test.go
index 4d9e8826b..0f1ca25c6 100644
--- a/handlers/services_test.go
+++ b/handlers/services_test.go
@@ -10,10 +10,10 @@ import (
 	"time"
 
 	"github.com/gorilla/mux"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	prom_v1 "github.com/prometheus/client_golang/api/prometheus/v1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
+	core_v1 "k8s.io/api/core/v1"
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/kiali/kiali/cache"
@@ -309,7 +309,7 @@ func TestServiceMetricsBadRateFunc(t *testing.T) {
 }
 
 func TestServiceMetricsInaccessibleNamespace(t *testing.T) {
-	k := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
+	k := kubetest.NewFakeK8sClient(&core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}})
 	k.OpenShift = true
 	ts, _ := setupServiceMetricsEndpointWithClient(t, &noPrivClient{UserClientInterface: k})
 
@@ -325,7 +325,7 @@ func TestServiceMetricsInaccessibleNamespace(t *testing.T) {
 
 func setupServiceMetricsEndpoint(t *testing.T) (*httptest.Server, *prometheustest.PromAPIMock) {
 	conf := config.NewConfig()
-	k := kubetest.NewFakeK8sClient(&osproject_v1.Project{ObjectMeta: meta_v1.ObjectMeta{Name: "ns"}},
+	k := kubetest.NewFakeK8sClient(
 		kubetest.FakeNamespace("my_namespace"),
 		kubetest.FakeNamespace("ns"))
 	k.OpenShift = true
diff --git a/handlers/testing.go b/handlers/testing.go
index bb47beaf4..7cf1f1970 100644
--- a/handlers/testing.go
+++ b/handlers/testing.go
@@ -5,12 +5,10 @@
 package handlers
 
 import (
-	"context"
 	"fmt"
 	"net/http"
 	"time"
 
-	osproject_v1 "github.com/openshift/api/project/v1"
 	core_v1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -31,14 +29,6 @@ type noPrivClient struct {
 	kubernetes.UserClientInterface
 }
 
-func (n *noPrivClient) GetProjects(ctx context.Context, labelSelector string) ([]osproject_v1.Project, error) {
-	return nil, errors.NewForbidden(schema.GroupResource{Group: osproject_v1.GroupName, Resource: "projects"}, "", fmt.Errorf("Rejecting"))
-}
-
-func (n *noPrivClient) GetProject(ctx context.Context, name string) (*osproject_v1.Project, error) {
-	return nil, errors.NewForbidden(schema.GroupResource{Group: osproject_v1.GroupName, Resource: "projects"}, name, fmt.Errorf("Rejecting"))
-}
-
 func (n *noPrivClient) GetNamespace(namespace string) (*core_v1.Namespace, error) {
 	return nil, errors.NewForbidden(schema.GroupResource{Group: core_v1.GroupName, Resource: "namespaces"}, "namespace", fmt.Errorf("Rejecting"))
 }
diff --git a/kubernetes/kubetest/mock_openshift.go b/kubernetes/kubetest/mock_openshift.go
index bf4157b16..21f6c42e3 100644
--- a/kubernetes/kubetest/mock_openshift.go
+++ b/kubernetes/kubetest/mock_openshift.go
@@ -5,7 +5,6 @@ import (
 
 	osapps_v1 "github.com/openshift/api/apps/v1"
 	osoauth_v1 "github.com/openshift/api/oauth/v1"
-	osproject_v1 "github.com/openshift/api/project/v1"
 	osroutes_v1 "github.com/openshift/api/route/v1"
 	osuser_v1 "github.com/openshift/api/user/v1"
 )
@@ -25,21 +24,6 @@ func (o *K8SClientMock) GetDeploymentConfigs(ctx context.Context, namespace stri
 	return args.Get(0).([]osapps_v1.DeploymentConfig), args.Error(1)
 }
 
-func (o *K8SClientMock) GetProject(ctx context.Context, project string) (*osproject_v1.Project, error) {
-	args := o.Called(project)
-	return args.Get(0).(*osproject_v1.Project), args.Error(1)
-}
-
-func (o *K8SClientMock) GetProjects(ctx context.Context, labelSelector string) ([]osproject_v1.Project, error) {
-	args := o.Called(labelSelector)
-	return args.Get(0).([]osproject_v1.Project), args.Error(1)
-}
-
-func (o *K8SClientMock) UpdateProject(ctx context.Context, project string, jsonPatch string) (*osproject_v1.Project, error) {
-	args := o.Called(project)
-	return args.Get(0).(*osproject_v1.Project), args.Error(1)
-}
-
 func (o *K8SClientMock) DeleteOAuthToken(ctx context.Context, token string) error {
 	args := o.Called(ctx, token)
 	return args.Error(0)