Repository: argoproj-labs/argocd-operator
Pull request #777 (2022-09-07 18:49:13)

add docs for contributing and enhancement proposals
**What type of PR is this?**
 /kind documentation

**What does this PR do / why we need it**:
In the spirit of making this project more open-source and friendly to new contributors, we need better documentation on contributing and more open process for submitting enhancement proposals. The decision to move enhancement proposals here was a result of a discussion during the team GitOps cabal on 09/05/22. 

**Have you updated the necessary documentation?**
* [x] Documentation has been updated.



**How to test changes / Special notes to the reviewer**:
* check out to PR branch
* follow directions in https://argocd-operator.readthedocs.io/en/latest/contribute/development/#build-and-verify-argo-cd-operator-docs 



Patch:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index bbcbbe7d..fdfd1ff4 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -7,6 +7,9 @@ assignees: ''
 
 ---
 
+> if your feature request is a large change and requires a formal proposal or design doc, please read the docs for [contributing](https://github.com/argoproj-labs/argocd-operator/blob/master/docs/developer-guide/contributing.md) first. You may need to submit an additional Pull Request using the [enhancement proposal template](https://github.com/argoproj-labs/argocd-operator/blob/master/docs/proposals/001-proposal-template.md).
+
+
 **Is your feature request related to a problem? Please describe.**
 A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
 
diff --git a/common/defaults.go b/common/defaults.go
index 69bda900..0f5e6755 100644
--- a/common/defaults.go
+++ b/common/defaults.go
@@ -164,10 +164,10 @@ const (
 	ArgoCDDefaultGrafanaVersion = "sha256:afef23a1b4cf159ec3180aac3ad693c10e560657313bfe3ec81f344ace6d2f05" // 6.7.2
 
 	// ArgoCDDefaultHelpChatURL is the default help chat URL.
-	ArgoCDDefaultHelpChatURL = "https://mycorp.slack.com/argo-cd"
+	ArgoCDDefaultHelpChatURL = ""
 
 	// ArgoCDDefaultHelpChatText is the default help chat text.
-	ArgoCDDefaultHelpChatText = "Chat now!"
+	ArgoCDDefaultHelpChatText = ""
 
 	// ArgoCDDefaultIngressPath is the path to use for the Ingress when not specified.
 	ArgoCDDefaultIngressPath = "/"
diff --git a/controllers/argocd/argocd_controller.go b/controllers/argocd/argocd_controller.go
index 5f282d87..ffe7952d 100644
--- a/controllers/argocd/argocd_controller.go
+++ b/controllers/argocd/argocd_controller.go
@@ -103,6 +103,12 @@ func (r *ReconcileArgoCD) Reconcile(ctx context.Context, request ctrl.Request) (
 			if err := r.removeDeletionFinalizer(argocd); err != nil {
 				return reconcile.Result{}, err
 			}
+
+			// remove namespace of deleted Argo CD instance from deprecationEventEmissionTracker (if exists) so that if another instance
+			// is created in the same namespace in the future, that instance is appropriately tracked
+			if _, ok := DeprecationEventEmissionTracker[argocd.Namespace]; ok {
+				delete(DeprecationEventEmissionTracker, argocd.Namespace)
+			}
 		}
 		return reconcile.Result{}, nil
 	}
diff --git a/controllers/argocd/sso.go b/controllers/argocd/sso.go
index 0bd965b0..961c8318 100644
--- a/controllers/argocd/sso.go
+++ b/controllers/argocd/sso.go
@@ -36,11 +36,24 @@ const (
 	multipleSSOConfiguration string = "multiple SSO configuration: "
 )
 
+// DeprecationEventEmissionStatus is meant to track which deprecation events have been emitted already. This is temporary and can be removed in v0.0.6 once we have provided enough
+// deprecation notice
+type DeprecationEventEmissionStatus struct {
+	SSOSpecDeprecationWarningEmitted    bool
+	DexSpecDeprecationWarningEmitted    bool
+	DisableDexDeprecationWarningEmitted bool
+}
+
 var (
 	templateAPIFound     = false
 	ssoConfigLegalStatus string
 )
 
+// DeprecationEventEmissionTracker map stores the namespace containing ArgoCD instance as key and DeprecationEventEmissionStatus as value,
+// where DeprecationEventEmissionStatus tracks the events that have been emitted for the instance in the particular namespace.
+// This is temporary and can be removed in v0.0.6 when we remove the deprecated fields.
+var DeprecationEventEmissionTracker = make(map[string]DeprecationEventEmissionStatus)
+
 // IsTemplateAPIAvailable returns true if the template API is present.
 func IsTemplateAPIAvailable() bool {
 	return templateAPIFound
@@ -66,32 +79,61 @@ func (r *ReconcileArgoCD) reconcileSSO(cr *argoprojv1a1.ArgoCD) error {
 	// reset ssoConfigLegalStatus at the beginning of each SSO reconciliation round
 	ssoConfigLegalStatus = ssoLegalUnknown
 
-	// Emit events warning users about deprecation notice for soon-to-be-deprecated fields in the CR
+	// Emit events warning users about deprecation notice for soon-to-be-removed fields in the CR if being used
+
 	if env := os.Getenv("DISABLE_DEX"); env != "" {
+		// Emit event for each instance providing users with deprecation notice for `DISABLE_DEX` if not emitted already
+		if currentInstanceEventEmissionStatus, ok := DeprecationEventEmissionTracker[cr.Namespace]; !ok || !currentInstanceEventEmissionStatus.DisableDexDeprecationWarningEmitted {
+			err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`DISABLE_DEX` is deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Dex can be enabled/disabled through `.spec.sso`", "DeprecationNotice", cr.ObjectMeta, cr.TypeMeta)
+			if err != nil {
+				return err
+			}
 
-		// Emit event warning users about deprecation notice for `DISABLE_DEX` users
-		err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`DISABLE_DEX` is deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Dex can be enabled/disabled through `.spec.sso`", "DeprecationNotice", cr.ObjectMeta)
-		if err != nil {
-			return err
+			if !ok {
+				currentInstanceEventEmissionStatus = DeprecationEventEmissionStatus{DisableDexDeprecationWarningEmitted: true}
+			} else {
+				currentInstanceEventEmissionStatus.DisableDexDeprecationWarningEmitted = true
+			}
+			DeprecationEventEmissionTracker[cr.Namespace] = currentInstanceEventEmissionStatus
 		}
+
 	}
 
 	if cr.Spec.Dex != nil && !reflect.DeepEqual(cr.Spec.Dex, &v1alpha1.ArgoCDDexSpec{}) {
 
-		// Emit event warning users about deprecation notice for `.spec.dex` users
-		err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`.spec.dex` is deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Dex configuration can be managed through `.spec.sso.dex`", "DeprecationNotice", cr.ObjectMeta)
-		if err != nil {
-			return err
+		// Emit event for each instance providing users with deprecation notice for `.spec.dex` if not emitted already
+		if currentInstanceEventEmissionStatus, ok := DeprecationEventEmissionTracker[cr.Namespace]; !ok || !currentInstanceEventEmissionStatus.DexSpecDeprecationWarningEmitted {
+			err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`.spec.dex` is deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Dex configuration can be managed through `.spec.sso.dex`", "DeprecationNotice", cr.ObjectMeta, cr.TypeMeta)
+			if err != nil {
+				return err
+			}
+
+			if !ok {
+				currentInstanceEventEmissionStatus = DeprecationEventEmissionStatus{DexSpecDeprecationWarningEmitted: true}
+			} else {
+				currentInstanceEventEmissionStatus.DexSpecDeprecationWarningEmitted = true
+			}
+			DeprecationEventEmissionTracker[cr.Namespace] = currentInstanceEventEmissionStatus
 		}
+
 	}
 
 	if cr.Spec.SSO != nil && (cr.Spec.SSO.Image != "" || cr.Spec.SSO.Version != "" ||
 		cr.Spec.SSO.VerifyTLS != nil || cr.Spec.SSO.Resources != nil) {
 
-		// Emit event warning users about deprecation notice for `.spec.SSO` field users
-		err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`.spec.SSO.Image`, `.spec.SSO.Version`, `.spec.SSO.Resources` and `.spec.SSO.VerifyTLS` are deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Keycloak configuration can be managed through `.spec.sso.keycloak`", "DeprecationNotice", cr.ObjectMeta)
-		if err != nil {
-			return err
+		// Emit event for each instance providing users with deprecation notice for `.spec.SSO` subfields if not emitted already
+		if currentInstanceEventEmissionStatus, ok := DeprecationEventEmissionTracker[cr.Namespace]; !ok || !currentInstanceEventEmissionStatus.SSOSpecDeprecationWarningEmitted {
+			err := argoutil.CreateEvent(r.Client, "Warning", "Deprecated", "`.spec.SSO.Image`, `.spec.SSO.Version`, `.spec.SSO.Resources` and `.spec.SSO.VerifyTLS` are deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Keycloak configuration can be managed through `.spec.sso.keycloak`", "DeprecationNotice", cr.ObjectMeta, cr.TypeMeta)
+			if err != nil {
+				return err
+			}
+
+			if !ok {
+				currentInstanceEventEmissionStatus = DeprecationEventEmissionStatus{SSOSpecDeprecationWarningEmitted: true}
+			} else {
+				currentInstanceEventEmissionStatus.SSOSpecDeprecationWarningEmitted = true
+			}
+			DeprecationEventEmissionTracker[cr.Namespace] = currentInstanceEventEmissionStatus
 		}
 	}
 
diff --git a/controllers/argocd/util.go b/controllers/argocd/util.go
index b49a434e..36eb9a2c 100644
--- a/controllers/argocd/util.go
+++ b/controllers/argocd/util.go
@@ -1219,6 +1219,13 @@ func namespaceFilterPredicate() predicate.Predicate {
 					log.Info(fmt.Sprintf("Successfully deleted namespace %s from cluster secret", e.Object.GetName()))
 				}
 			}
+
+			// if a namespace is deleted, remove it from deprecationEventEmissionTracker (if exists) so that if a namespace with the same name
+			// is created in the future and contains an Argo CD instance, it will be tracked appropriately
+			if _, ok := DeprecationEventEmissionTracker[e.Object.GetName()]; ok {
+				delete(DeprecationEventEmissionTracker, e.Object.GetName())
+			}
+
 			return false
 		},
 	}
diff --git a/controllers/argocdexport/local.go b/controllers/argocdexport/local.go
index e59eca3c..35c91ffd 100644
--- a/controllers/argocdexport/local.go
+++ b/controllers/argocdexport/local.go
@@ -71,5 +71,5 @@ func (r *ReconcileArgoCDExport) reconcilePVC(cr *argoprojv1a1.ArgoCDExport) erro
 
 	// Create event
 	log.Info("creating new event")
-	return argoutil.CreateEvent(r.Client, "Normal", "Exporting", "Created claim for export process.", "PersistentVolumeClaimCreated", cr.ObjectMeta)
+	return argoutil.CreateEvent(r.Client, "Normal", "Exporting", "Created claim for export process.", "PersistentVolumeClaimCreated", cr.ObjectMeta, cr.TypeMeta)
 }
diff --git a/controllers/argoutil/resource.go b/controllers/argoutil/resource.go
index cbff0fdc..6d23ddca 100644
--- a/controllers/argoutil/resource.go
+++ b/controllers/argoutil/resource.go
@@ -52,17 +52,23 @@ func CombineImageTag(img string, tag string) string {
 }
 
 // CreateEvent will create a new Kubernetes Event with the given action, message, reason and involved uid.
-func CreateEvent(client client.Client, eventType, action, message, reason string, meta metav1.ObjectMeta) error {
-	event := newEvent(meta)
+func CreateEvent(client client.Client, eventType, action, message, reason string, objectMeta metav1.ObjectMeta, typeMeta metav1.TypeMeta) error {
+	event := newEvent(objectMeta)
 	event.Action = action
 	event.Type = eventType
 	event.InvolvedObject = corev1.ObjectReference{
-		Name:      meta.Name,
-		Namespace: meta.Namespace,
-		UID:       meta.UID,
+		Name:            objectMeta.Name,
+		Namespace:       objectMeta.Namespace,
+		UID:             objectMeta.UID,
+		ResourceVersion: objectMeta.ResourceVersion,
+		Kind:            typeMeta.Kind,
+		APIVersion:      typeMeta.APIVersion,
 	}
 	event.Message = message
 	event.Reason = reason
+	event.CreationTimestamp = metav1.Now()
+	event.FirstTimestamp = event.CreationTimestamp
+	event.LastTimestamp = event.CreationTimestamp
 	return client.Create(context.TODO(), event)
 }
 
diff --git a/docs/developer-guide/contributing.md b/docs/developer-guide/contributing.md
new file mode 100644
index 00000000..062f1813
--- /dev/null
+++ b/docs/developer-guide/contributing.md
@@ -0,0 +1,43 @@
+# Submitting code contributions to Argo CD Operator
+
+## Preface
+
+The Argo CD Operator project continuously grows, both in terms of features and community size. Thus, we need to take great care with any changes that affect compatibility, performance, scalability, stability and security of the Argo CD Operator. For this reason, every new feature or larger enhancement must be properly designed and discussed before it gets accepted into the code base.
+
+We do welcome and encourage everyone to participate in the Argo CD Operator project, but please understand that we can't accept each and every contribution from the community, for various reasons.
+
+If you want to submit code for a great new feature or enhancement, we kindly ask you to take a look at the
+enhancement process outlined below before you start to write code or submit a PR. This will ensure that your idea is well aligned with the project's strategy and technical requirements, and it will help greatly in getting your code merged into our code base.
+
+Before submitting code for a new feature (and also, to some extent, for more complex bug fixes) please
+[raise a Feature Request (enhancement proposal) or Bug Issue](https://github.com/argoproj-labs/argocd-operator/issues/new/choose)
+first.
+
+_Please_ do not spend too much time on larger features or refactorings before the corresponding enhancement has been triaged. This may save everyone some amount of frustration and time, as the enhancement proposal might be rejected, and the code would never get merged. However, sometimes it's helpful to have some PoC code along with a proposal. 
+
+We will do our best to triage incoming enhancement proposals quickly, with one of the following outcomes:
+
+* Accepted
+* Declined
+* Needs Discussion
+
+Depending on how many enhancement proposals we receive at given times, it may take some time until we can look at yours.
+
+## Quick start
+
+If you want a quick start contributing to Argo CD Operator, take a look at issues that are labeled with
+[help wanted](https://github.com/argoproj-labs/argocd-operator/labels/help%20wanted) or [good first issue](https://github.com/argoproj-labs/argocd-operator/labels/good%20first%20issue). These are issues that were already triaged and accepted.
+
+## Proposal states
+
+**Accepted Proposals:** When a proposal is considered _Accepted_, it was decided that this enhancement would be valuable to the community at large and fits into the overall strategic roadmap of the project. Implementation of the issue may be started, either by the proposal's creator or another community member (including maintainers of the project). The issue should be refined enough by now to contain any concerns and guidelines to be taken into consideration during implementation.
+
+**Declined proposals:** We don't decline proposals lightly, and we will do our best to give a proper reasoning why we think that the proposal does not fit with the future of the project. Reasons for declining proposals may be (amongst others) that the change would be breaking for many, or that it does not meet the strategic direction of the project. Usually, discussion will be facilitated with the enhancement's creator before declining a proposal. Once a proposal is in _Declined_ state it's unlikely that we will accept code contributions for its implementation.
+
+**Needs discussion:** Sometimes, we can't completely understand a proposal from its GitHub issue and thus require more information on the original intent or more details about the implementation. If we are confronted with such an issue during the triage we expect the issue's creator to supply more information on their idea.
+
+## Design documents
+
+For some enhancement proposals (especially those that will change behavior of Argo CD Operator substantially, are attached with some caveats, or where upgrade/downgrade paths are not clear), a more formal design document will be required in order to fully discuss and understand the enhancement in the broader community. This requirement is usually determined during triage. If you submitted an enhancement proposal, we may ask you to provide this more formal write down, along with some concerns or topics that need to be addressed. Please consider adding visuals wherever possible to increase understanding of complex issues; we recommend using [Miro](https://miro.com/) as a visual aid tool. 
+
+Design documents are usually submitted as a PR and use [this template](https://github.com/argoproj-labs/argocd-operator/blob/master/docs/proposals/001-proposal-template.md) as a guide what kind of information we're looking for. Discussion will take place in the review process. When a design document gets merged, we consider it as approved and code can be written and submitted to implement this specific design.
\ No newline at end of file
diff --git a/docs/contribute/development.md b/docs/developer-guide/development.md
similarity index 100%
rename from docs/contribute/development.md
rename to docs/developer-guide/development.md
diff --git a/docs/contribute/olm-env.md b/docs/developer-guide/olm-env.md
similarity index 100%
rename from docs/contribute/olm-env.md
rename to docs/developer-guide/olm-env.md
diff --git a/docs/contribute/openapi.md b/docs/developer-guide/openapi.md
similarity index 100%
rename from docs/contribute/openapi.md
rename to docs/developer-guide/openapi.md
diff --git a/docs/index.md b/docs/index.md
index a852fa8b..95b55622 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -4,7 +4,7 @@ A Kubernetes operator for managing Argo CD clusters.
 
 ## Overview
 
-The Argo CD Operator manages the full lifecycle for [Argo CD](https://argoproj.github.io/argo-cd/) and it's
+The Argo CD Operator manages the full lifecycle for [Argo CD](https://argoproj.github.io/argo-cd/) and its
 components. The operator's goal is to automate the tasks required when operating an Argo CD cluster.
 
 Beyond installation, the operator helps to automate the process of upgrading, backing up and restoring as needed and
diff --git a/docs/install/olm.md b/docs/install/olm.md
index fcced08d..84ea6a74 100644
--- a/docs/install/olm.md
+++ b/docs/install/olm.md
@@ -183,6 +183,6 @@ kubectl delete -n olm -f deploy/catalog_source.yaml
 kubectl delete namespace argocd
 ```
 
-[docs_dev]:../contribute/development.md
+[docs_dev]:../developer-guide/development.md
 [docs_usage]:../usage/basics.md
 [olm_home]:https://github.com/operator-framework/operator-lifecycle-manager
diff --git a/docs/proposals/001-proposal-template.md b/docs/proposals/001-proposal-template.md
new file mode 100644
index 00000000..6a934cdf
--- /dev/null
+++ b/docs/proposals/001-proposal-template.md
@@ -0,0 +1,92 @@
+# [Proposal Title]
+
+This is the title of the enhancement. Keep it simple and descriptive. A good title can help
+communicate what the enhancement is and should be considered as part of any review.
+
+
+## Open Questions [optional]
+
+This is where to call out areas of the design that require closure before deciding to implement the design.
+
+
+## Summary
+
+The `Summary` is required for producing accurate user-focused documentation
+such as release notes or a development roadmap. It should be possible to collect this information
+before implementation begins in order to avoid requiring implementers to split their attention
+between writing release notes and implementing the feature itself. Before you get started with this document,
+please feel free to have a conversation on this with the maintainers/community on Github that would help
+drive a more organized thought process for the formal proposal here.
+
+## Motivation
+
+This section is for explicitly listing the motivation, goals and non-goals of this proposal.
+Describe why the change is important and the benefits to users.
+
+### Goals
+
+List the specific goals of the proposal and their measurable results. How will we know that this has succeeded?
+
+### Non-Goals
+
+What is out of scope for this proposal? Listing non-goals helps to focus discussion and make
+progress.
+
+## Proposal
+
+This is where we get down to details of what the proposal is about.
+
+### Use cases
+
+Add a list of detailed use cases this enhancement intends to take care of.
+
+#### Use case 1:
+(Example) As a user, I would like to understand...
+
+#### Use case 2:
+(Example) As a user, I would like to take an action on... 
+
+### Implementation Details/Notes/Constraints [optional]
+
+What are the downsides to the implementation? What are some important details that didn't come across
+above? Try to go into as much detail as necessary here. This might be a good place to talk about core
+concepts and how they relate.
+
+You may have a work-in-progress Pull Request to demonstrate the functioning of the enhancement you are proposing.
+
+### Detailed examples
+
+### Security Considerations
+
+* How does this proposal impact the security aspects of argocd-operator?
+* Are there any unresolved follow-ups that need to be done to make the enhancement more robust?
+
+### Risks and Mitigations
+
+What are the risks of this proposal and how do we mitigate them?
+
+For example, consider both security and how this will impact the larger argocd-operator ecosystem.
+
+Consider including folks that also work outside your immediate sub-project.
+
+
+### Upgrade / Downgrade Strategy
+
+If applicable, how will the component be upgraded and downgraded? Make sure this is in the test
+plan.
+
+Consider the following in developing an upgrade/downgrade strategy for this enhancement:
+
+- What changes (in invocations, configurations, API use, etc.) is an existing cluster required to
+  make upon upgrade in order to keep previous behavior?
+- What changes (in invocations, configurations, API use, etc.) is an existing cluster required to
+  make upon upgrade in order to make use of the enhancement?
+
+## Drawbacks
+
+The idea is to find the best form of an argument why this enhancement should _not_ be implemented.
+
+## Alternatives
+
+Similar to the `Drawbacks` section, the `Alternatives` section is used to highlight and record other
+possible approaches to delivering the value proposed by an enhancement.
\ No newline at end of file
diff --git a/docs/reference/argocd.md b/docs/reference/argocd.md
index acdf38df..0fbd9a11 100644
--- a/docs/reference/argocd.md
+++ b/docs/reference/argocd.md
@@ -156,6 +156,22 @@ spec:
     resources: {}
 ```
 
+The following example shows how to set command line parameters using the env variable 
+
+``` yaml
+apiVersion: argoproj.io/v1alpha1
+kind: ArgoCD
+metadata:
+  name: example-argocd
+  labels:
+    example: controller
+spec:
+  controller:
+    env:
+    - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS
+      value: '120'    
+```
+
 ## Dex Options
 
 !!! warning 
@@ -945,7 +961,7 @@ The configuration to customize resource behavior. This property maps directly to
 
 ### Resource Customizations Example
 
-The following example defines a custom PV health check in the `argocd-cm` ConfigMap using the `ResourceCustomizations` property on the `ArgoCD` resource.
+The following example defines a custom PVC health check in the `argocd-cm` ConfigMap using the `ResourceCustomizations` property on the `ArgoCD` resource.
 
 ``` yaml
 apiVersion: argoproj.io/v1alpha1
diff --git a/docs/usage/export.md b/docs/usage/export.md
index 847feaf3..249733d4 100644
--- a/docs/usage/export.md
+++ b/docs/usage/export.md
@@ -319,7 +319,7 @@ The ID for the Service Principal that will be used to access Azure Storage.
 
 **azure.service.cert**
 
-The certificate for authenticating the Service Principal that will be used to access Azure Storage.
+The combination of certificate and private key for authenticating the Service Principal that will be used to access Azure Storage.
 
 **azure.storage.account**
 
diff --git a/examples/argocdexport-azure.yaml b/examples/argocdexport-azure.yaml
index 109d2577..37910c59 100644
--- a/examples/argocdexport-azure.yaml
+++ b/examples/argocdexport-azure.yaml
@@ -8,7 +8,8 @@ type: Opaque
 data:
   azure.container.name: ZXhhbXBsZS1hcmdvY2RleHBvcnQ=
   azure.service.id: c2VydmljZV9pZA==
-  azure.service.cert: c2VydmljZV9jZXJ0
+  azure.service.cert: |
+    # base64 encrypted combination of the client.crt and client.key of your generated certificate.
   azure.storage.account: c3RvcmFnZV9hY2NvdW50
   azure.tenant.id: dGVuYW50X2lk
 ---
diff --git a/mkdocs.yml b/mkdocs.yml
index 06459672..e7157c4c 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -48,9 +48,10 @@ nav:
     - ArgoCDExport: reference/argocdexport.md
     - API Docs: reference/api.html.md
   - Contributing: 
+      - Contributing: developer-guide/contributing.md
       - Development: 
-          - Setup: contribute/development.md
-          - OLM Environment: contribute/olm-env.md
-          - OpenAPI: contribute/openapi.md
+          - Setup: developer-guide/development.md
+          - OLM Environment: developer-guide/olm-env.md
+          - OpenAPI: developer-guide/openapi.md
   - Releases ⧉: https://github.com/argoproj-labs/argocd-operator/releases
   - Roadmap ⧉: https://github.com/argoproj-labs/argocd-operator/milestones


Test patch:
diff --git a/controllers/argocd/configmap_test.go b/controllers/argocd/configmap_test.go
index 996b01df..6d71b099 100644
--- a/controllers/argocd/configmap_test.go
+++ b/controllers/argocd/configmap_test.go
@@ -133,8 +133,8 @@ func TestReconcileArgoCD_reconcileArgoConfigMap(t *testing.T) {
 		"dex.config":                         "",
 		"ga.anonymizeusers":                  "false",
 		"ga.trackingid":                      "",
-		"help.chatText":                      "Chat now!",
-		"help.chatUrl":                       "https://mycorp.slack.com/argo-cd",
+		"help.chatText":                      "",
+		"help.chatUrl":                       "",
 		"kustomize.buildOptions":             "",
 		"oidc.config":                        "",
 		"repositories":                       "",
diff --git a/controllers/argocd/ingress_test.go b/controllers/argocd/ingress_test.go
index bc32ca75..ddf8e4f0 100644
--- a/controllers/argocd/ingress_test.go
+++ b/controllers/argocd/ingress_test.go
@@ -4,13 +4,14 @@ import (
 	"context"
 	"testing"
 
-	"github.com/argoproj-labs/argocd-operator/api/v1alpha1"
-	argoprojv1alpha1 "github.com/argoproj-labs/argocd-operator/api/v1alpha1"
-	"github.com/argoproj-labs/argocd-operator/common"
 	"github.com/stretchr/testify/assert"
 	networkingv1 "k8s.io/api/networking/v1"
 	"k8s.io/apimachinery/pkg/types"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
+
+	"github.com/argoproj-labs/argocd-operator/api/v1alpha1"
+	argoprojv1alpha1 "github.com/argoproj-labs/argocd-operator/api/v1alpha1"
+	"github.com/argoproj-labs/argocd-operator/common"
 )
 
 func TestReconcileArgoCD_reconcile_ServerIngress_ingressClassName(t *testing.T) {
diff --git a/controllers/argocd/sso_test.go b/controllers/argocd/sso_test.go
index 1bc36d30..776e9336 100644
--- a/controllers/argocd/sso_test.go
+++ b/controllers/argocd/sso_test.go
@@ -343,6 +343,8 @@ func TestReconcile_illegalSSOConfiguration(t *testing.T) {
 func TestReconcile_emitEventOnDetectingDeprecatedFields(t *testing.T) {
 	logf.SetLogger(ZapLogger(true))
 
+	DeprecationEventEmissionTracker = make(map[string]DeprecationEventEmissionStatus)
+
 	disableDexEvent := &corev1.Event{
 		Reason:  "DeprecationNotice",
 		Message: "`DISABLE_DEX` is deprecated, and support will be removed in Argo CD Operator v0.6.0/OpenShift GitOps v1.9.0. Dex can be enabled/disabled through `.spec.sso`",
diff --git a/tests/auxiliary/smtplistener/cmd/listener/serve.go b/tests/auxiliary/smtplistener/cmd/listener/serve.go
index b952c164..1a623479 100644
--- a/tests/auxiliary/smtplistener/cmd/listener/serve.go
+++ b/tests/auxiliary/smtplistener/cmd/listener/serve.go
@@ -7,6 +7,7 @@ import (
 	"os/exec"
 	"os/signal"
 	"runtime"
+
 	//filelog "smtplistener/internal/log"
 	"smtplistener/internal/processor"
 	"smtplistener/internal/util"