Repository: crossplane-contrib/provider-gitlab
Pull request #203 (2025-05-13 13:38:17)

chore: update gitlab client-go to v0.128.0
### Description of your changes

* update of the Gitlab client-go dependency to [v0.128.0](https://gitlab.com/gitlab-org/api/client-go/-/releases/v0.128.0)
* **Breaking Changes**
  * fields that are deprecated in the client-go have been removed from the api or renamed
  
I have:

- [x] Read and followed Crossplane's [contribution process].
- [x] Run `make reviewable test` to ensure this PR is ready for review.

### How has this code been tested



Patch:
diff --git a/apis/projects/v1alpha1/project_types.go b/apis/projects/v1alpha1/project_types.go
index f793b94..4ef1e67 100644
--- a/apis/projects/v1alpha1/project_types.go
+++ b/apis/projects/v1alpha1/project_types.go
@@ -153,11 +153,6 @@ type ProjectParameters struct {
 	// +optional
 	AllowMergeOnSkippedPipeline *bool `json:"allowMergeOnSkippedPipeline,omitempty"`
 
-	// How many approvers should approve merge request by default.
-	// To configure approval rules, see Merge request approvals API.
-	// +optional
-	ApprovalsBeforeMerge *int `json:"approvalsBeforeMerge,omitempty"`
-
 	// Auto-cancel pending pipelines. This isn’t a boolean, but enabled/disabled.
 	// +optional
 	AutoCancelPendingPipelines *string `json:"autoCancelPendingPipelines,omitempty"`
@@ -207,9 +202,9 @@ type ProjectParameters struct {
 	// +optional
 	ContainerExpirationPolicyAttributes *ContainerExpirationPolicyAttributes `json:"containerExpirationPolicyAttributes,omitempty"`
 
-	// Enable container registry for this project.
+	// Set visibility of container registry.
 	// +optional
-	ContainerRegistryEnabled *bool `json:"containerRegistryEnabled,omitempty"`
+	ContainerRegistryAccessLevel *AccessControlValue `json:"containerRegistryAccessLevel,omitempty"`
 
 	// The default branch name. Requires initializeWithReadme to be true.
 	// +optional
@@ -377,10 +372,9 @@ type ProjectParameters struct {
 	// +optional
 	SuggestionCommitMessage *string `json:"suggestionCommitMessage,omitempty"`
 
-	// The list of tags for a project; put array of tags,
-	// that should be finally assigned to a project. Use topics instead.
+	// The list of topics for the project;
 	// +optional
-	TagList []string `json:"tagList,omitempty"`
+	Topics []string `json:"topics,omitempty"`
 
 	// When used without useCustomTemplate, name of a built-in project template.
 	// When used with useCustomTemplate, name of a custom project template.
@@ -518,14 +512,14 @@ type ProjectObservation struct {
 	HTTPURLToRepo             string                     `json:"httpUrlToRepo,omitempty"`
 	ImportError               string                     `json:"importError,omitempty"`
 	ImportStatus              string                     `json:"importStatus,omitempty"`
-	IssuesEnabled             bool                       `json:"issuesEnabled,omitempty"`
-	JobsEnabled               bool                       `json:"jobsEnabled,omitempty"`
+	IssuesAccessLevel         AccessControlValue         `json:"issuesAccessLevel,omitempty"`
+	BuildsAccessLevel         AccessControlValue         `json:"buildsAccessLevel,omitempty"`
 	LastActivityAt            *metav1.Time               `json:"lastActivityAt,omitempty"`
 	License                   *ProjectLicense            `json:"license,omitempty"`
 	LicenseURL                string                     `json:"licenseUrl,omitempty"`
 	Links                     *Links                     `json:"links,omitempty"`
-	MarkedForDeletionAt       *metav1.Time               `json:"markedForDeletionAt,omitempty"`
-	MergeRequestsEnabled      bool                       `json:"mergeRequestsEnabled,omitempty"`
+	MarkedForDeletionOn       *metav1.Time               `json:"markedForDeletionOn,omitempty"`
+	MergeRequestsAccessLevel  AccessControlValue         `json:"mergeRequestsAccessLevel,omitempty"`
 	NameWithNamespace         string                     `json:"nameWithNamespace,omitempty"`
 	Namespace                 *ProjectNamespace          `json:"namespace,omitempty"`
 	OpenIssuesCount           int                        `json:"openIssuesCount,omitempty"`
@@ -537,11 +531,11 @@ type ProjectObservation struct {
 	SSHURLToRepo              string                     `json:"sshUrlToRepo,omitempty"`
 	ServiceDeskAddress        string                     `json:"serviceDeskAddress,omitempty"`
 	SharedWithGroups          []SharedWithGroups         `json:"sharedWithGroups,omitempty"`
-	SnippetsEnabled           bool                       `json:"snippetsEnabled,omitempty"`
+	SnippetsAccessLevel       AccessControlValue         `json:"snippetsAccessLevel,omitempty"`
 	StarCount                 int                        `json:"starCount,omitempty"`
 	Statistics                *ProjectStatistics         `json:"statistics,omitempty"`
 	WebURL                    string                     `json:"webUrl,omitempty"`
-	WikiEnabled               bool                       `json:"wikiEnabled,omitempty"`
+	WikiAccessLevel           AccessControlValue         `json:"wikiAccessLevel,omitempty"`
 }
 
 // A ProjectSpec defines the desired state of a Gitlab Project.
diff --git a/apis/projects/v1alpha1/zz_generated.deepcopy.go b/apis/projects/v1alpha1/zz_generated.deepcopy.go
index 19ad766..1b9b4f9 100644
--- a/apis/projects/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/projects/v1alpha1/zz_generated.deepcopy.go
@@ -1376,8 +1376,8 @@ func (in *ProjectObservation) DeepCopyInto(out *ProjectObservation) {
 		*out = new(Links)
 		**out = **in
 	}
-	if in.MarkedForDeletionAt != nil {
-		in, out := &in.MarkedForDeletionAt, &out.MarkedForDeletionAt
+	if in.MarkedForDeletionOn != nil {
+		in, out := &in.MarkedForDeletionOn, &out.MarkedForDeletionOn
 		*out = (*in).DeepCopy()
 	}
 	if in.Namespace != nil {
@@ -1425,11 +1425,6 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(bool)
 		**out = **in
 	}
-	if in.ApprovalsBeforeMerge != nil {
-		in, out := &in.ApprovalsBeforeMerge, &out.ApprovalsBeforeMerge
-		*out = new(int)
-		**out = **in
-	}
 	if in.AutoCancelPendingPipelines != nil {
 		in, out := &in.AutoCancelPendingPipelines, &out.AutoCancelPendingPipelines
 		*out = new(string)
@@ -1490,9 +1485,9 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(ContainerExpirationPolicyAttributes)
 		(*in).DeepCopyInto(*out)
 	}
-	if in.ContainerRegistryEnabled != nil {
-		in, out := &in.ContainerRegistryEnabled, &out.ContainerRegistryEnabled
-		*out = new(bool)
+	if in.ContainerRegistryAccessLevel != nil {
+		in, out := &in.ContainerRegistryAccessLevel, &out.ContainerRegistryAccessLevel
+		*out = new(AccessControlValue)
 		**out = **in
 	}
 	if in.DefaultBranch != nil {
@@ -1690,8 +1685,8 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(string)
 		**out = **in
 	}
-	if in.TagList != nil {
-		in, out := &in.TagList, &out.TagList
+	if in.Topics != nil {
+		in, out := &in.Topics, &out.Topics
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
diff --git a/go.mod b/go.mod
index ae3669a..eae3581 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ require (
 	github.com/crossplane/crossplane-tools v0.0.0-20250424174524-de0e5107ea45
 	github.com/google/go-cmp v0.7.0
 	github.com/pkg/errors v0.9.1
-	gitlab.com/gitlab-org/api/client-go v0.127.0
+	gitlab.com/gitlab-org/api/client-go v0.128.0
 	gopkg.in/alecthomas/kingpin.v2 v2.2.6
 	k8s.io/api v0.32.3
 	k8s.io/apimachinery v0.32.3
diff --git a/go.sum b/go.sum
index c04163d..38baaf9 100644
--- a/go.sum
+++ b/go.sum
@@ -155,8 +155,8 @@ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8
 github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-gitlab.com/gitlab-org/api/client-go v0.127.0 h1:8xnxcNKGF2gDazEoMs+hOZfOspSSw8D0vAoWhQk9U+U=
-gitlab.com/gitlab-org/api/client-go v0.127.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
+gitlab.com/gitlab-org/api/client-go v0.128.0 h1:Wvy1UIuluKemubao2k8EOqrl3gbgJ1PVifMIQmg2Da4=
+gitlab.com/gitlab-org/api/client-go v0.128.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
diff --git a/package/crds/projects.gitlab.crossplane.io_projects.yaml b/package/crds/projects.gitlab.crossplane.io_projects.yaml
index f8f9041..813ae79 100644
--- a/package/crds/projects.gitlab.crossplane.io_projects.yaml
+++ b/package/crds/projects.gitlab.crossplane.io_projects.yaml
@@ -78,11 +78,6 @@ spec:
                     description: Set whether or not merge requests can be merged with
                       skipped jobs.
                     type: boolean
-                  approvalsBeforeMerge:
-                    description: |-
-                      How many approvers should approve merge request by default.
-                      To configure approval rules, see Merge request approvals API.
-                    type: integer
                   autoCancelPendingPipelines:
                     description: Auto-cancel pending pipelines. This isn’t a boolean,
                       but enabled/disabled.
@@ -141,9 +136,9 @@ spec:
                       olderThan:
                         type: string
                     type: object
-                  containerRegistryEnabled:
-                    description: Enable container registry for this project.
-                    type: boolean
+                  containerRegistryAccessLevel:
+                    description: Set visibility of container registry.
+                    type: string
                   defaultBranch:
                     description: The default branch name. Requires initializeWithReadme
                       to be true.
@@ -355,13 +350,6 @@ spec:
                   suggestionCommitMessage:
                     description: The commit message used to apply merge request suggestions.
                     type: string
-                  tagList:
-                    description: |-
-                      The list of tags for a project; put array of tags,
-                      that should be finally assigned to a project. Use topics instead.
-                    items:
-                      type: string
-                    type: array
                   templateName:
                     description: |-
                       When used without useCustomTemplate, name of a built-in project template.
@@ -372,6 +360,11 @@ spec:
                       When used with useCustomTemplate, project ID of a custom project template.
                       This is preferable to using templateName since templateName may be ambiguous.
                     type: integer
+                  topics:
+                    description: The list of topics for the project;
+                    items:
+                      type: string
+                    type: array
                   useCustomTemplate:
                     description: Use either custom instance or group (with groupWithProjectTemplatesId)
                       project template.
@@ -561,6 +554,13 @@ spec:
                     type: boolean
                   avatarUrl:
                     type: string
+                  buildsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   complianceFrameworks:
                     items:
                       type: string
@@ -653,10 +653,13 @@ spec:
                     type: string
                   importStatus:
                     type: string
-                  issuesEnabled:
-                    type: boolean
-                  jobsEnabled:
-                    type: boolean
+                  issuesAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   lastActivityAt:
                     format: date-time
                     type: string
@@ -710,11 +713,16 @@ spec:
                     - repoBranches
                     - self
                     type: object
-                  markedForDeletionAt:
+                  markedForDeletionOn:
                     format: date-time
                     type: string
-                  mergeRequestsEnabled:
-                    type: boolean
+                  mergeRequestsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   nameWithNamespace:
                     type: string
                   namespace:
@@ -908,8 +916,13 @@ spec:
                           type: string
                       type: object
                     type: array
-                  snippetsEnabled:
-                    type: boolean
+                  snippetsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   sshUrlToRepo:
                     type: string
                   starCount:
@@ -941,8 +954,13 @@ spec:
                     type: object
                   webUrl:
                     type: string
-                  wikiEnabled:
-                    type: boolean
+                  wikiAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                 type: object
               conditions:
                 description: Conditions of the resource.
diff --git a/pkg/clients/projects/project.go b/pkg/clients/projects/project.go
index 2b8db13..d18c963 100644
--- a/pkg/clients/projects/project.go
+++ b/pkg/clients/projects/project.go
@@ -61,30 +61,30 @@ func GenerateObservation(prj *gitlab.Project) v1alpha1.ProjectObservation { //no
 	}
 
 	o := v1alpha1.ProjectObservation{
-		ID:                   prj.ID,
-		Public:               prj.PublicJobs,
-		SSHURLToRepo:         prj.SSHURLToRepo,
-		HTTPURLToRepo:        prj.HTTPURLToRepo,
-		WebURL:               prj.WebURL,
-		ReadmeURL:            prj.ReadmeURL,
-		NameWithNamespace:    prj.NameWithNamespace,
-		PathWithNamespace:    prj.PathWithNamespace,
-		IssuesEnabled:        prj.IssuesEnabled,
-		OpenIssuesCount:      prj.OpenIssuesCount,
-		MergeRequestsEnabled: prj.MergeRequestsEnabled,
-		JobsEnabled:          prj.JobsEnabled,
-		WikiEnabled:          prj.WikiEnabled,
-		SnippetsEnabled:      prj.SnippetsEnabled,
-		CreatorID:            prj.CreatorID,
-		ImportStatus:         prj.ImportStatus,
-		ImportError:          prj.ImportError,
-		Archived:             prj.Archived,
-		ForksCount:           prj.ForksCount,
-		StarCount:            prj.StarCount,
-		EmptyRepo:            prj.EmptyRepo,
-		AvatarURL:            prj.AvatarURL,
-		LicenseURL:           prj.LicenseURL,
-		ServiceDeskAddress:   prj.ServiceDeskAddress,
+		ID:                       prj.ID,
+		Public:                   prj.PublicJobs,
+		SSHURLToRepo:             prj.SSHURLToRepo,
+		HTTPURLToRepo:            prj.HTTPURLToRepo,
+		WebURL:                   prj.WebURL,
+		ReadmeURL:                prj.ReadmeURL,
+		NameWithNamespace:        prj.NameWithNamespace,
+		PathWithNamespace:        prj.PathWithNamespace,
+		IssuesAccessLevel:        v1alpha1.AccessControlValue(prj.IssuesAccessLevel),
+		OpenIssuesCount:          prj.OpenIssuesCount,
+		MergeRequestsAccessLevel: v1alpha1.AccessControlValue(prj.MergeRequestsAccessLevel),
+		BuildsAccessLevel:        v1alpha1.AccessControlValue(prj.BuildsAccessLevel),
+		WikiAccessLevel:          v1alpha1.AccessControlValue(prj.WikiAccessLevel),
+		SnippetsAccessLevel:      v1alpha1.AccessControlValue(prj.SnippetsAccessLevel),
+		CreatorID:                prj.CreatorID,
+		ImportStatus:             prj.ImportStatus,
+		ImportError:              prj.ImportError,
+		Archived:                 prj.Archived,
+		ForksCount:               prj.ForksCount,
+		StarCount:                prj.StarCount,
+		EmptyRepo:                prj.EmptyRepo,
+		AvatarURL:                prj.AvatarURL,
+		LicenseURL:               prj.LicenseURL,
+		ServiceDeskAddress:       prj.ServiceDeskAddress,
 	}
 
 	if prj.ContainerExpirationPolicy != nil {
@@ -115,8 +115,8 @@ func GenerateObservation(prj *gitlab.Project) v1alpha1.ProjectObservation { //no
 	if prj.LastActivityAt != nil {
 		o.LastActivityAt = &metav1.Time{Time: *prj.LastActivityAt}
 	}
-	if prj.MarkedForDeletionAt != nil {
-		o.MarkedForDeletionAt = &metav1.Time{Time: time.Time(*prj.MarkedForDeletionAt)}
+	if prj.MarkedForDeletionOn != nil {
+		o.MarkedForDeletionOn = &metav1.Time{Time: time.Time(*prj.MarkedForDeletionOn)}
 	}
 
 	if len(o.ComplianceFrameworks) == 0 && len(prj.ComplianceFrameworks) > 0 {
@@ -292,7 +292,7 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		EmailsDisabled:                      p.EmailsDisabled,
 		ResolveOutdatedDiffDiscussions:      p.ResolveOutdatedDiffDiscussions,
 		ContainerExpirationPolicyAttributes: clients.ContainerExpirationPolicyAttributesV1alpha1ToGitlab(p.ContainerExpirationPolicyAttributes),
-		ContainerRegistryEnabled:            p.ContainerRegistryEnabled,
+		ContainerRegistryAccessLevel:        clients.AccessControlValueV1alpha1ToGitlab(p.ContainerRegistryAccessLevel),
 		SharedRunnersEnabled:                p.SharedRunnersEnabled,
 		Visibility:                          clients.VisibilityValueV1alpha1ToGitlab(p.Visibility),
 		ImportURL:                           p.ImportURL,
@@ -304,7 +304,7 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		RemoveSourceBranchAfterMerge:             p.RemoveSourceBranchAfterMerge,
 		LFSEnabled:                               p.LFSEnabled,
 		RequestAccessEnabled:                     p.RequestAccessEnabled,
-		TagList:                                  &p.TagList,
+		Topics:                                   &p.Topics,
 		PrintingMergeRequestLinkEnabled:          p.PrintingMergeRequestLinkEnabled,
 		BuildGitStrategy:                         p.BuildGitStrategy,
 		BuildTimeout:                             p.BuildTimeout,
@@ -314,7 +314,6 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		CIForwardDeploymentEnabled:               p.CIForwardDeploymentEnabled,
 		AutoDevopsEnabled:                        p.AutoDevopsEnabled,
 		AutoDevopsDeployStrategy:                 p.AutoDevopsDeployStrategy,
-		ApprovalsBeforeMerge:                     p.ApprovalsBeforeMerge,
 		ExternalAuthorizationClassificationLabel: p.ExternalAuthorizationClassificationLabel,
 		Mirror:                                   p.Mirror,
 		MirrorTriggerBuilds:                      p.MirrorTriggerBuilds,
@@ -356,7 +355,7 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		EmailsDisabled:                      p.EmailsDisabled,
 		ResolveOutdatedDiffDiscussions:      p.ResolveOutdatedDiffDiscussions,
 		ContainerExpirationPolicyAttributes: clients.ContainerExpirationPolicyAttributesV1alpha1ToGitlab(p.ContainerExpirationPolicyAttributes),
-		ContainerRegistryEnabled:            p.ContainerRegistryEnabled,
+		ContainerRegistryAccessLevel:        clients.AccessControlValueV1alpha1ToGitlab(p.ContainerRegistryAccessLevel),
 		SharedRunnersEnabled:                p.SharedRunnersEnabled,
 		Visibility:                          clients.VisibilityValueV1alpha1ToGitlab(p.Visibility),
 		ImportURL:                           p.ImportURL,
@@ -368,7 +367,7 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		RemoveSourceBranchAfterMerge:             p.RemoveSourceBranchAfterMerge,
 		LFSEnabled:                               p.LFSEnabled,
 		RequestAccessEnabled:                     p.RequestAccessEnabled,
-		TagList:                                  &p.TagList,
+		Topics:                                   &p.Topics,
 		BuildGitStrategy:                         p.BuildGitStrategy,
 		BuildTimeout:                             p.BuildTimeout,
 		AutoCancelPendingPipelines:               p.AutoCancelPendingPipelines,
@@ -378,7 +377,6 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		CIDefaultGitDepth:                        p.CIDefaultGitDepth,
 		AutoDevopsEnabled:                        p.AutoDevopsEnabled,
 		AutoDevopsDeployStrategy:                 p.AutoDevopsDeployStrategy,
-		ApprovalsBeforeMerge:                     p.ApprovalsBeforeMerge,
 		ExternalAuthorizationClassificationLabel: p.ExternalAuthorizationClassificationLabel,
 		Mirror:                                   p.Mirror,
 		MirrorUserID:                             p.MirrorUserID,
diff --git a/pkg/controller/projects/projects/project.go b/pkg/controller/projects/projects/project.go
index 8ae81c9..a6b8776 100644
--- a/pkg/controller/projects/projects/project.go
+++ b/pkg/controller/projects/projects/project.go
@@ -218,9 +218,6 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	if in.AllowMergeOnSkippedPipeline == nil {
 		in.AllowMergeOnSkippedPipeline = &project.AllowMergeOnSkippedPipeline
 	}
-	if in.ApprovalsBeforeMerge == nil {
-		in.ApprovalsBeforeMerge = &project.ApprovalsBeforeMerge
-	}
 	if in.AutocloseReferencedIssues == nil {
 		in.AutocloseReferencedIssues = &project.AutocloseReferencedIssues
 	}
@@ -235,8 +232,8 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	if in.CIForwardDeploymentEnabled == nil {
 		in.CIForwardDeploymentEnabled = &project.CIForwardDeploymentEnabled
 	}
-	if in.ContainerRegistryEnabled == nil {
-		in.ContainerRegistryEnabled = &project.ContainerRegistryEnabled
+	if in.ContainerRegistryAccessLevel == nil {
+		in.ContainerRegistryAccessLevel = clients.LateInitializeAccessControlValue(in.ContainerRegistryAccessLevel, project.ContainerRegistryAccessLevel)
 	}
 
 	in.DefaultBranch = clients.LateInitializeStringPtr(in.DefaultBranch, project.DefaultBranch)
@@ -309,8 +306,8 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	in.SnippetsAccessLevel = clients.LateInitializeAccessControlValue(in.SnippetsAccessLevel, project.SnippetsAccessLevel)
 	in.SuggestionCommitMessage = clients.LateInitializeStringPtr(in.SuggestionCommitMessage, project.SuggestionCommitMessage)
 
-	if len(in.TagList) == 0 && len(project.TagList) > 0 {
-		in.TagList = project.TagList
+	if len(in.Topics) == 0 && len(project.Topics) > 0 {
+		in.Topics = project.Topics
 	}
 
 	in.Visibility = clients.LateInitializeVisibilityValue(in.Visibility, project.Visibility)
@@ -325,9 +322,6 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !clients.IsBoolEqualToBoolPtr(p.AllowMergeOnSkippedPipeline, g.AllowMergeOnSkippedPipeline) {
 		return false
 	}
-	if !clients.IsIntEqualToIntPtr(p.ApprovalsBeforeMerge, g.ApprovalsBeforeMerge) {
-		return false
-	}
 	if !clients.IsBoolEqualToBoolPtr(p.AutocloseReferencedIssues, g.AutocloseReferencedIssues) {
 		return false
 	}
@@ -346,7 +340,7 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !clients.IsBoolEqualToBoolPtr(p.CIForwardDeploymentEnabled, g.CIForwardDeploymentEnabled) {
 		return false
 	}
-	if !clients.IsBoolEqualToBoolPtr(p.ContainerRegistryEnabled, g.ContainerRegistryEnabled) {
+	if p.ContainerRegistryAccessLevel != nil && !cmp.Equal(string(*p.ContainerRegistryAccessLevel), string(g.ContainerRegistryAccessLevel)) {
 		return false
 	}
 	if !cmp.Equal(p.DefaultBranch, clients.StringToPtr(g.DefaultBranch)) {
@@ -436,7 +430,7 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !cmp.Equal(p.SuggestionCommitMessage, clients.StringToPtr(g.SuggestionCommitMessage)) {
 		return false
 	}
-	if !cmp.Equal(p.TagList, g.TagList, cmpopts.EquateEmpty()) {
+	if !cmp.Equal(p.Topics, g.Topics, cmpopts.EquateEmpty()) {
 		return false
 	}
 	if p.Visibility != nil && !cmp.Equal(string(*p.Visibility), string(g.Visibility)) {


Test patch:
diff --git a/pkg/clients/projects/project_test.go b/pkg/clients/projects/project_test.go
index 4faa80a..43d4ef0 100644
--- a/pkg/clients/projects/project_test.go
+++ b/pkg/clients/projects/project_test.go
@@ -21,7 +21,7 @@ import (
 	"time"
 
 	"github.com/google/go-cmp/cmp"
-	"gitlab.com/gitlab-org/api/client-go"
+	gitlab "gitlab.com/gitlab-org/api/client-go"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/crossplane-contrib/provider-gitlab/apis/projects/v1alpha1"
@@ -29,40 +29,42 @@ import (
 )
 
 var (
-	name                             = "my-project"
-	overrideName                     = "My Project"
-	path                             = "path/to/project"
-	namespaceID                      = 1
-	defaultBranch                    = "main"
-	description                      = "my awesome project"
-	issuesAccessLevel                = "enabled"
-	issuesAccessLevelv1alpha1        = v1alpha1.AccessControlValue(issuesAccessLevel)
-	repositoryAccessLevel            = "enabled"
-	repositoryAccessLevelv1alpha1    = v1alpha1.AccessControlValue(repositoryAccessLevel)
-	mergeRequestsAccessLevel         = "enabled"
-	mergeRequestsAccessLevelv1alpha1 = v1alpha1.AccessControlValue(mergeRequestsAccessLevel)
-	forkingAccessLevel               = "enabled"
-	forkingAccessLevelv1alpha1       = v1alpha1.AccessControlValue(forkingAccessLevel)
-	buildsAccessLevel                = "disabled"
-	buildsAccessLevelv1alpha1        = v1alpha1.AccessControlValue(buildsAccessLevel)
-	wikiAccessLevel                  = "private"
-	wikiAccessLevelv1alpha1          = v1alpha1.AccessControlValue(wikiAccessLevel)
-	snippetsAccessLevel              = "public"
-	snippetsAccessLevelv1alpha1      = v1alpha1.AccessControlValue(snippetsAccessLevel)
-	pagesAccessLevel                 = "enabled"
-	pagesAccessLevelv1alpha1         = v1alpha1.AccessControlValue(pagesAccessLevel)
-	operationsAccessLevel            = "public"
-	operationsAccessLevelv1alpha1    = v1alpha1.AccessControlValue(operationsAccessLevel)
-	emailsDisabled                   = true
-	resolveOutdatedDiffDiscussions   = true
-	cadence                          = "Cadence"
-	keepN                            = 1
-	olderThan                        = "OlderThan"
-	nameRegexDelete                  = "NameRegexDelete"
-	nameRegexKeep                    = "NameRegexKeep"
-	enabled                          = false
-	nextRunAt                        = time.Now()
-	gitlabContainerExpirationPolicy  = gitlab.ContainerExpirationPolicy{
+	name                                 = "my-project"
+	overrideName                         = "My Project"
+	path                                 = "path/to/project"
+	namespaceID                          = 1
+	defaultBranch                        = "main"
+	description                          = "my awesome project"
+	issuesAccessLevel                    = "enabled"
+	issuesAccessLevelv1alpha1            = v1alpha1.AccessControlValue(issuesAccessLevel)
+	repositoryAccessLevel                = "enabled"
+	repositoryAccessLevelv1alpha1        = v1alpha1.AccessControlValue(repositoryAccessLevel)
+	mergeRequestsAccessLevel             = "enabled"
+	mergeRequestsAccessLevelv1alpha1     = v1alpha1.AccessControlValue(mergeRequestsAccessLevel)
+	forkingAccessLevel                   = "enabled"
+	forkingAccessLevelv1alpha1           = v1alpha1.AccessControlValue(forkingAccessLevel)
+	buildsAccessLevel                    = "disabled"
+	buildsAccessLevelv1alpha1            = v1alpha1.AccessControlValue(buildsAccessLevel)
+	wikiAccessLevel                      = "private"
+	wikiAccessLevelv1alpha1              = v1alpha1.AccessControlValue(wikiAccessLevel)
+	snippetsAccessLevel                  = "public"
+	snippetsAccessLevelv1alpha1          = v1alpha1.AccessControlValue(snippetsAccessLevel)
+	pagesAccessLevel                     = "enabled"
+	pagesAccessLevelv1alpha1             = v1alpha1.AccessControlValue(pagesAccessLevel)
+	operationsAccessLevel                = "public"
+	operationsAccessLevelv1alpha1        = v1alpha1.AccessControlValue(operationsAccessLevel)
+	containerRegistryAccessLevel         = "enabled"
+	containerRegistryAccessLevelv1alpha1 = v1alpha1.AccessControlValue(pagesAccessLevel)
+	emailsDisabled                       = true
+	resolveOutdatedDiffDiscussions       = true
+	cadence                              = "Cadence"
+	keepN                                = 1
+	olderThan                            = "OlderThan"
+	nameRegexDelete                      = "NameRegexDelete"
+	nameRegexKeep                        = "NameRegexKeep"
+	enabled                              = false
+	nextRunAt                            = time.Now()
+	gitlabContainerExpirationPolicy      = gitlab.ContainerExpirationPolicy{
 		Cadence:         cadence,
 		KeepN:           keepN,
 		OlderThan:       olderThan,
@@ -96,7 +98,6 @@ var (
 		NameRegexKeep:   &nameRegexKeep,
 		Enabled:         &enabled,
 	}
-	containerRegistryEnabled                  = true
 	sharedRunnersEnabled                      = true
 	visibility                                = "private"
 	visibilityv1alpha1                        = v1alpha1.VisibilityValue(visibility)
@@ -110,7 +111,7 @@ var (
 	removeSourceBranchAfterMerge              = false
 	lfsEnabled                                = true
 	requestAccessEnabled                      = true
-	tagList                                   = []string{"tag1", "tag2"}
+	topics                                    = []string{"tag1", "tag2"}
 	printingMergeRequestLinkEnabled           = true
 	buildGitStategy                           = "strategy"
 	buildTimeout                              = 60
@@ -121,7 +122,6 @@ var (
 	ciDefaultGitDepth                         = 50
 	autoDevopsEnabled                         = true
 	autoDevopsDeployStrategy                  = "continuous"
-	approvalsBeforeMerge                      = 0
 	externalAuthorizationClassificationLabel  = "authz-label"
 	mirror                                    = false
 	mirrorUserID                              = 1
@@ -151,12 +151,8 @@ func TestGenerateObservation(t *testing.T) {
 	owner := "chief"
 	pathWithNamespace := "path/to/cool-project"
 	nameWithNamespace := "name/to/cool-project"
-	issuesEnabled := true
+	issuesAccessLevel := gitlab.EnabledAccessControl
 	openIssuesCount := 3
-	mergeRequestsEnabled := true
-	jobsEnabled := false
-	wikiEnabled := false
-	snippetsEnabled := true
 	now := time.Now()
 	creatorID := 1
 	namespaceID := 3
@@ -166,7 +162,7 @@ func TestGenerateObservation(t *testing.T) {
 	permissionsProjectAccessNotificationLevel := 2
 	permissionsGroupAccessAccessLevel := 3
 	permissionsGroupAccessNotificationLevel := 4
-	markedForDeletionAt := gitlab.ISOTime(now)
+	markedForDeletionOn := gitlab.ISOTime(now)
 	emptyRepo := false
 	archived := false
 	avatarURL := "https://AvatarURL"
@@ -245,12 +241,12 @@ func TestGenerateObservation(t *testing.T) {
 					},
 					PathWithNamespace:         pathWithNamespace,
 					NameWithNamespace:         nameWithNamespace,
-					IssuesEnabled:             issuesEnabled,
+					IssuesAccessLevel:         issuesAccessLevel,
 					OpenIssuesCount:           openIssuesCount,
-					MergeRequestsEnabled:      mergeRequestsEnabled,
-					JobsEnabled:               jobsEnabled,
-					WikiEnabled:               wikiEnabled,
-					SnippetsEnabled:           snippetsEnabled,
+					MergeRequestsAccessLevel:  gitlab.AccessControlValue(mergeRequestsAccessLevel),
+					BuildsAccessLevel:         gitlab.AccessControlValue(buildsAccessLevel),
+					WikiAccessLevel:           gitlab.AccessControlValue(wikiAccessLevel),
+					SnippetsAccessLevel:       gitlab.AccessControlValue(snippetsAccessLevel),
 					ContainerExpirationPolicy: &gitlabContainerExpirationPolicy,
 					CreatedAt:                 &now,
 					LastActivityAt:            &now,
@@ -270,7 +266,7 @@ func TestGenerateObservation(t *testing.T) {
 							NotificationLevel: gitlab.NotificationLevelValue(permissionsGroupAccessNotificationLevel),
 						},
 					},
-					MarkedForDeletionAt: &markedForDeletionAt,
+					MarkedForDeletionOn: &markedForDeletionOn,
 					EmptyRepo:           emptyRepo,
 					Archived:            archived,
 					AvatarURL:           avatarURL,
@@ -316,12 +312,12 @@ func TestGenerateObservation(t *testing.T) {
 				},
 				PathWithNamespace:         pathWithNamespace,
 				NameWithNamespace:         nameWithNamespace,
-				IssuesEnabled:             issuesEnabled,
+				IssuesAccessLevel:         issuesAccessLevelv1alpha1,
 				OpenIssuesCount:           openIssuesCount,
-				MergeRequestsEnabled:      mergeRequestsEnabled,
-				JobsEnabled:               jobsEnabled,
-				WikiEnabled:               wikiEnabled,
-				SnippetsEnabled:           snippetsEnabled,
+				MergeRequestsAccessLevel:  mergeRequestsAccessLevelv1alpha1,
+				BuildsAccessLevel:         buildsAccessLevelv1alpha1,
+				WikiAccessLevel:           wikiAccessLevelv1alpha1,
+				SnippetsAccessLevel:       snippetsAccessLevelv1alpha1,
 				ContainerExpirationPolicy: &v1alpha1ContainerExpirationPolicy,
 				CreatedAt:                 &metav1.Time{Time: now},
 				LastActivityAt:            &metav1.Time{Time: now},
@@ -341,7 +337,7 @@ func TestGenerateObservation(t *testing.T) {
 						NotificationLevel: v1alpha1.NotificationLevelValue(permissionsGroupAccessNotificationLevel),
 					},
 				},
-				MarkedForDeletionAt: &metav1.Time{Time: now},
+				MarkedForDeletionOn: &metav1.Time{Time: now},
 				EmptyRepo:           emptyRepo,
 				Archived:            archived,
 				AvatarURL:           avatarURL,
@@ -457,7 +453,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					EmailsDisabled:                            &emailsDisabled,
 					ResolveOutdatedDiffDiscussions:            &resolveOutdatedDiffDiscussions,
 					ContainerExpirationPolicyAttributes:       &v1alpha1ContainerExpirationPolicyAttributes,
-					ContainerRegistryEnabled:                  &containerRegistryEnabled,
+					ContainerRegistryAccessLevel:              &containerRegistryAccessLevelv1alpha1,
 					SharedRunnersEnabled:                      &sharedRunnersEnabled,
 					Visibility:                                &visibilityv1alpha1,
 					ImportURL:                                 &importURL,
@@ -469,7 +465,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					RemoveSourceBranchAfterMerge:              &removeSourceBranchAfterMerge,
 					LFSEnabled:                                &lfsEnabled,
 					RequestAccessEnabled:                      &requestAccessEnabled,
-					TagList:                                   tagList,
+					Topics:                                    topics,
 					PrintingMergeRequestLinkEnabled:           &printingMergeRequestLinkEnabled,
 					BuildGitStrategy:                          &buildGitStategy,
 					BuildTimeout:                              &buildTimeout,
@@ -480,7 +476,6 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					CIDefaultGitDepth:                         &ciDefaultGitDepth,
 					AutoDevopsEnabled:                         &autoDevopsEnabled,
 					AutoDevopsDeployStrategy:                  &autoDevopsDeployStrategy,
-					ApprovalsBeforeMerge:                      &approvalsBeforeMerge,
 					ExternalAuthorizationClassificationLabel:  &externalAuthorizationClassificationLabel,
 					Mirror:                                    &mirror,
 					MirrorTriggerBuilds:                       &mirrorTriggerBuilds,
@@ -515,7 +510,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				EmailsDisabled:                      &emailsDisabled,
 				ResolveOutdatedDiffDiscussions:      &resolveOutdatedDiffDiscussions,
 				ContainerExpirationPolicyAttributes: &gitlabContainerExpirationPolicyAttributes,
-				ContainerRegistryEnabled:            &containerRegistryEnabled,
+				ContainerRegistryAccessLevel:        clients.AccessControlValueStringToGitlab(containerRegistryAccessLevel),
 				SharedRunnersEnabled:                &sharedRunnersEnabled,
 				Visibility:                          clients.VisibilityValueStringToGitlab(visibility),
 				ImportURL:                           &importURL,
@@ -527,7 +522,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				RemoveSourceBranchAfterMerge:             &removeSourceBranchAfterMerge,
 				LFSEnabled:                               &lfsEnabled,
 				RequestAccessEnabled:                     &requestAccessEnabled,
-				TagList:                                  &tagList,
+				Topics:                                   &topics,
 				PrintingMergeRequestLinkEnabled:          &printingMergeRequestLinkEnabled,
 				BuildGitStrategy:                         &buildGitStategy,
 				BuildTimeout:                             &buildTimeout,
@@ -537,7 +532,6 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				CIForwardDeploymentEnabled:               &ciForwardDeploymentEnabled,
 				AutoDevopsEnabled:                        &autoDevopsEnabled,
 				AutoDevopsDeployStrategy:                 &autoDevopsDeployStrategy,
-				ApprovalsBeforeMerge:                     &approvalsBeforeMerge,
 				ExternalAuthorizationClassificationLabel: &externalAuthorizationClassificationLabel,
 				Mirror:                                   &mirror,
 				MirrorTriggerBuilds:                      &mirrorTriggerBuilds,
@@ -562,7 +556,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					IssuesAccessLevel:              &issuesAccessLevelv1alpha1,
 					ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 					MergeMethod:                    &mergeMethodv1alpha1,
-					TagList:                        tagList,
+					Topics:                         topics,
 					BuildTimeout:                   &buildTimeout,
 				},
 			},
@@ -572,7 +566,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				IssuesAccessLevel:              clients.AccessControlValueStringToGitlab(issuesAccessLevel),
 				ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 				MergeMethod:                    clients.MergeMethodStringToGitlab(mergeMethod),
-				TagList:                        &tagList,
+				Topics:                         &topics,
 				BuildTimeout:                   &buildTimeout,
 			},
 		},
@@ -583,12 +577,12 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					Name: &overrideName,
 					// TODO: TagList specified and wanted because otherwise
 					// test does not pass - (nil vs &nil - fix)
-					TagList: tagList,
+					Topics: topics,
 				},
 			},
 			want: &gitlab.CreateProjectOptions{
-				Name:    &overrideName,
-				TagList: &tagList,
+				Name:   &overrideName,
+				Topics: &topics,
 			},
 		},
 	}
@@ -631,7 +625,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					EmailsDisabled:                            &emailsDisabled,
 					ResolveOutdatedDiffDiscussions:            &resolveOutdatedDiffDiscussions,
 					ContainerExpirationPolicyAttributes:       &v1alpha1ContainerExpirationPolicyAttributes,
-					ContainerRegistryEnabled:                  &containerRegistryEnabled,
+					ContainerRegistryAccessLevel:              &containerRegistryAccessLevelv1alpha1,
 					SharedRunnersEnabled:                      &sharedRunnersEnabled,
 					Visibility:                                &visibilityv1alpha1,
 					ImportURL:                                 &importURL,
@@ -643,7 +637,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					RemoveSourceBranchAfterMerge:              &removeSourceBranchAfterMerge,
 					LFSEnabled:                                &lfsEnabled,
 					RequestAccessEnabled:                      &requestAccessEnabled,
-					TagList:                                   tagList,
+					Topics:                                    topics,
 					BuildGitStrategy:                          &buildGitStategy,
 					BuildTimeout:                              &buildTimeout,
 					AutoCancelPendingPipelines:                &autoCancelPendingPipelines,
@@ -653,7 +647,6 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					CIDefaultGitDepth:                         &ciDefaultGitDepth,
 					AutoDevopsEnabled:                         &autoDevopsEnabled,
 					AutoDevopsDeployStrategy:                  &autoDevopsDeployStrategy,
-					ApprovalsBeforeMerge:                      &approvalsBeforeMerge,
 					ExternalAuthorizationClassificationLabel:  &externalAuthorizationClassificationLabel,
 					Mirror:                                    &mirror,
 					MirrorUserID:                              &mirrorUserID,
@@ -685,7 +678,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				PagesAccessLevel:                    clients.AccessControlValueStringToGitlab(pagesAccessLevel),
 				ResolveOutdatedDiffDiscussions:      &resolveOutdatedDiffDiscussions,
 				ContainerExpirationPolicyAttributes: &gitlabContainerExpirationPolicyAttributes,
-				ContainerRegistryEnabled:            &containerRegistryEnabled,
+				ContainerRegistryAccessLevel:        clients.AccessControlValueStringToGitlab(containerRegistryAccessLevel),
 				SharedRunnersEnabled:                &sharedRunnersEnabled,
 				Visibility:                          clients.VisibilityValueStringToGitlab(visibility),
 				ImportURL:                           &importURL,
@@ -697,7 +690,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				RemoveSourceBranchAfterMerge:             &removeSourceBranchAfterMerge,
 				LFSEnabled:                               &lfsEnabled,
 				RequestAccessEnabled:                     &requestAccessEnabled,
-				TagList:                                  &tagList,
+				Topics:                                   &topics,
 				BuildGitStrategy:                         &buildGitStategy,
 				BuildTimeout:                             &buildTimeout,
 				AutoCancelPendingPipelines:               &autoCancelPendingPipelines,
@@ -707,7 +700,6 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				CIDefaultGitDepth:                        &ciDefaultGitDepth,
 				AutoDevopsEnabled:                        &autoDevopsEnabled,
 				AutoDevopsDeployStrategy:                 &autoDevopsDeployStrategy,
-				ApprovalsBeforeMerge:                     &approvalsBeforeMerge,
 				ExternalAuthorizationClassificationLabel: &externalAuthorizationClassificationLabel,
 				Mirror:                                   &mirror,
 				MirrorUserID:                             &mirrorUserID,
@@ -730,7 +722,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					IssuesAccessLevel:              &issuesAccessLevelv1alpha1,
 					ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 					MergeMethod:                    &mergeMethodv1alpha1,
-					TagList:                        tagList,
+					Topics:                         topics,
 					BuildTimeout:                   &buildTimeout,
 				},
 			},
@@ -740,7 +732,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				IssuesAccessLevel:              clients.AccessControlValueStringToGitlab(issuesAccessLevel),
 				ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 				MergeMethod:                    clients.MergeMethodStringToGitlab(mergeMethod),
-				TagList:                        &tagList,
+				Topics:                         &topics,
 				BuildTimeout:                   &buildTimeout,
 			},
 		},
@@ -751,12 +743,12 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					Name: &name,
 					// TODO: TagList specified and wanted because otherwise
 					// test does not pass - (nil vs &nil - fix)
-					TagList: tagList,
+					Topics: topics,
 				},
 			},
 			want: &gitlab.EditProjectOptions{
-				Name:    &name,
-				TagList: &tagList,
+				Name:   &name,
+				Topics: &topics,
 			},
 		},
 	}
diff --git a/pkg/controller/projects/projects/project_test.go b/pkg/controller/projects/projects/project_test.go
index e7bd041..b04e443 100644
--- a/pkg/controller/projects/projects/project_test.go
+++ b/pkg/controller/projects/projects/project_test.go
@@ -85,7 +85,6 @@ func withClientDefaultValues() projectModifier {
 			NamespaceID:                               &i,
 			EmailsDisabled:                            &f,
 			ResolveOutdatedDiffDiscussions:            &f,
-			ContainerRegistryEnabled:                  &f,
 			SharedRunnersEnabled:                      &f,
 			PublicBuilds:                              &f,
 			OnlyAllowMergeIfPipelineSucceeds:          &f,
@@ -97,7 +96,6 @@ func withClientDefaultValues() projectModifier {
 			BuildTimeout:                              &i,
 			CIDefaultGitDepth:                         &i,
 			AutoDevopsEnabled:                         &f,
-			ApprovalsBeforeMerge:                      &i,
 			Mirror:                                    &f,
 			MirrorUserID:                              &i,
 			MirrorTriggerBuilds:                       &f,
@@ -349,16 +347,16 @@ func TestObserve(t *testing.T) {
 		"Path":                                      "path",
 		"DefaultBranch":                             "Default branch",
 		"Description":                               "description",
-		"IssuesAccessLevel":                         gitlab.PrivateAccessControl,
-		"RepositoryAccessLevel":                     gitlab.PrivateAccessControl,
-		"MergeRequestsAccessLevel":                  gitlab.PrivateAccessControl,
-		"ForkingAccessLevel":                        gitlab.PrivateAccessControl,
-		"BuildsAccessLevel":                         gitlab.PrivateAccessControl,
-		"WikiAccessLevel":                           gitlab.PrivateAccessControl,
-		"SnippetsAccessLevel":                       gitlab.PrivateAccessControl,
-		"PagesAccessLevel":                          gitlab.PrivateAccessControl,
+		"IssuesAccessLevel":                         gitlab.PublicAccessControl,
+		"RepositoryAccessLevel":                     gitlab.PublicAccessControl,
+		"MergeRequestsAccessLevel":                  gitlab.PublicAccessControl,
+		"ForkingAccessLevel":                        gitlab.PublicAccessControl,
+		"BuildsAccessLevel":                         gitlab.PublicAccessControl,
+		"WikiAccessLevel":                           gitlab.PublicAccessControl,
+		"SnippetsAccessLevel":                       gitlab.PublicAccessControl,
+		"PagesAccessLevel":                          gitlab.PublicAccessControl,
 		"ResolveOutdatedDiffDiscussions":            true,
-		"ContainerRegistryEnabled":                  true,
+		"ContainerRegistryAccessLevel":              gitlab.EnabledAccessControl,
 		"SharedRunnersEnabled":                      true,
 		"Visibility":                                gitlab.PrivateVisibility,
 		"PublicBuilds":                              true,
@@ -368,10 +366,9 @@ func TestObserve(t *testing.T) {
 		"RemoveSourceBranchAfterMerge":              true,
 		"LFSEnabled":                                true,
 		"RequestAccessEnabled":                      true,
-		"TagList":                                   []string{"tag-1", "tag-2"},
+		"Topics":                                    []string{"tag-1", "tag-2"},
 		"CIConfigPath":                              "CI configPath",
 		"CIDefaultGitDepth":                         1,
-		"ApprovalsBeforeMerge":                      1,
 		"Mirror":                                    true,
 		"MirrorUserID":                              1,
 		"MirrorTriggerBuilds":                       true,
@@ -387,7 +384,7 @@ func TestObserve(t *testing.T) {
 	f := false
 	i := 0
 	al := v1alpha1.PublicAccessControl
-	tags := []string{"tag-1 new", "tag-2 new"}
+	topics := []string{"tag-1 new", "tag-2 new"}
 	mergeMethod := v1alpha1.FastForwardMerge
 	s := "default string"
 	visibility := v1alpha1.PublicVisibility
@@ -406,7 +403,7 @@ func TestObserve(t *testing.T) {
 		SnippetsAccessLevel:              &al,
 		PagesAccessLevel:                 &al,
 		ResolveOutdatedDiffDiscussions:   &f,
-		ContainerRegistryEnabled:         &f,
+		ContainerRegistryAccessLevel:     &al,
 		SharedRunnersEnabled:             &f,
 		Visibility:                       &visibility,
 		PublicBuilds:                     &f,
@@ -416,10 +413,9 @@ func TestObserve(t *testing.T) {
 		RemoveSourceBranchAfterMerge:     &f,
 		LFSEnabled:                       &f,
 		RequestAccessEnabled:             &f,
-		TagList:                          tags,
+		Topics:                           topics,
 		CIConfigPath:                     &s,
 		CIDefaultGitDepth:                &i,
-		ApprovalsBeforeMerge:             &i,
 		Mirror:                           &f,
 		MirrorUserID:                     &i,
 		MirrorTriggerBuilds:              &f,
@@ -441,6 +437,13 @@ func TestObserve(t *testing.T) {
 			withSpec(projectParameters),
 			withExternalName("0"),
 			withConditions(xpv1.Available()),
+			withStatus(v1alpha1.ProjectObservation{
+				IssuesAccessLevel:        al,
+				BuildsAccessLevel:        al,
+				MergeRequestsAccessLevel: al,
+				SnippetsAccessLevel:      al,
+				WikiAccessLevel:          al,
+			}),
 		}
 		gitlabProject := &gitlab.Project{
 			Name:                             s,
@@ -466,10 +469,9 @@ func TestObserve(t *testing.T) {
 			RemoveSourceBranchAfterMerge:     f,
 			LFSEnabled:                       f,
 			RequestAccessEnabled:             f,
-			TagList:                          tags,
+			Topics:                           topics,
 			CIConfigPath:                     s,
 			CIDefaultGitDepth:                i,
-			ApprovalsBeforeMerge:             i,
 			Mirror:                           f,
 			MirrorUserID:                     i,
 			MirrorTriggerBuilds:              f,